@@ -119,6 +119,11 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
/* Include code for early handlers */
#include "../../kernel/sev-shared.c"
+static u64 sev_get_ghcb_proto_ver(void)
+{
+ return GHCB_PROTOCOL_MAX;
+}
+
static bool early_setup_sev_es(void)
{
if (!sev_es_negotiate_protocol(NULL))
@@ -28,6 +28,9 @@ struct sev_ghcb_protocol_info {
unsigned int vm_proto;
};
+/* Returns the negotiated GHCB Protocol version */
+static u64 sev_get_ghcb_proto_ver(void);
+
static bool __init sev_es_check_cpu_features(void)
{
if (!has_cpuflag(X86_FEATURE_RDRAND)) {
@@ -122,7 +125,7 @@ static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb,
enum es_result ret;
/* Fill in protocol and format specifiers */
- ghcb->protocol_version = GHCB_PROTOCOL_MAX;
+ ghcb->protocol_version = sev_get_ghcb_proto_ver();
ghcb->ghcb_usage = GHCB_DEFAULT_USAGE;
ghcb_set_sw_exit_code(ghcb, exit_code);
@@ -498,6 +498,11 @@ static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt
/* Negotiated GHCB protocol version */
static struct sev_ghcb_protocol_info ghcb_protocol_info __ro_after_init;
+static u64 sev_get_ghcb_proto_ver(void)
+{
+ return ghcb_protocol_info.vm_proto;
+}
+
static noinstr void __sev_put_ghcb(struct ghcb_state *state)
{
struct sev_es_runtime_data *data;