Joerg Roedel
2021-Jul-21 14:20 UTC
[PATCH 04/12] x86/sev: Do not hardcode GHCB protocol version
From: Joerg Roedel <jroedel at suse.de> 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 at suse.de> --- 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
Tom Lendacky
2021-Jul-21 21:17 UTC
[PATCH 04/12] x86/sev: Do not hardcode GHCB protocol version
On 7/21/21 9:20 AM, Joerg Roedel wrote:> From: Joerg Roedel <jroedel at suse.de> > > 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 at suse.de> > --- > 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();So this probably needs better clarification in the spec, but the GHCB version field is for the GHCB structure layout. So if you don't plan to use the XSS field that was added for version 2 of the layout, then you should report the GHCB structure version as 1. Thanks, Tom> 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; >