Messages in this thread | | | Subject | Re: [PATCH] x86/sev-es: Expose __sev_es_ghcb_hv_call() to call ghcb hv call out of sev code | From | Tom Lendacky <> | Date | Wed, 20 Oct 2021 08:56:22 -0500 |
| |
On 10/20/21 8:39 AM, Borislav Petkov wrote: > On Wed, Oct 20, 2021 at 08:39:59PM +0800, Tianyu Lan wrote: >> Hyper-V runs paravisor in guest VMPL0 which emulates some functions >> (e.g, timer, tsc, serial console and so on) via handling VC exception. >> GHCB pages are allocated and set up by the paravisor and report to Linux >> guest via MSR register.Hyper-V SEV implementation is unenlightened guest >> case which doesn't Linux doesn't handle VC and paravisor in the VMPL0 >> handle it. > > Aha, unenlightened. > > So why don't you export the original function by doing this (only > partial diff to show intent only): > > --- > diff --git a/arch/x86/kernel/sev-shared.c b/arch/x86/kernel/sev-shared.c > index f1d513897baf..bfe82f58508f 100644 > --- a/arch/x86/kernel/sev-shared.c > +++ b/arch/x86/kernel/sev-shared.c > @@ -125,7 +125,7 @@ static enum es_result verify_exception_info(struct ghcb *ghcb, struct es_em_ctxt > return ES_VMM_ERROR; > } > > -static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, > +static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, bool set_ghcb_msr, > struct es_em_ctxt *ctxt, > u64 exit_code, u64 exit_info_1, > u64 exit_info_2) > @@ -138,7 +138,14 @@ static enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb, > ghcb_set_sw_exit_info_1(ghcb, exit_info_1); > ghcb_set_sw_exit_info_2(ghcb, exit_info_2); > > - sev_es_wr_ghcb_msr(__pa(ghcb)); > + /* > + * Hyper-V unenlightened guests use a paravisor for communicating and > + * GHCB pages are being allocated by that paravisor which uses a > + * different MSR and protocol.
Just to clarify the comment, the paravisor uses the same GHCB MSR and GHCB protocol, it just can't use __pa() to get the address of the GHCB. So I expect that the Hyper-V support sets the address properly before calling this function.
Thanks, Tom
> + */ > + if (set_ghcb_msr) > + sev_es_wr_ghcb_msr(__pa(ghcb)); > + > VMGEXIT(); > > return verify_exception_info(ghcb, ctxt); > >
| |