From: Joerg Roedel <jroedel@xxxxxxx> Introduce the sev_get_ghcb_proto_ver() which will return the negotiated GHCB protocol version and use it to set the version field in the GHCB. Signed-off-by: Joerg Roedel <jroedel@xxxxxxx> --- arch/x86/boot/compressed/sev.c | 5 +++++ arch/x86/kernel/sev-shared.c | 5 ++++- arch/x86/kernel/sev.c | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c index 1a2e49730f8b..101e08c67296 100644 --- a/arch/x86/boot/compressed/sev.c +++ b/arch/x86/boot/compressed/sev.c @@ -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)) diff --git a/arch/x86/kernel/sev-shared.c b/arch/x86/kernel/sev-shared.c index 73eeb5897d16..36eaac2773ed 100644 --- a/arch/x86/kernel/sev-shared.c +++ b/arch/x86/kernel/sev-shared.c @@ -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); diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index 8084bfd7cce1..5d3422e8b25e 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -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; -- 2.31.1