Message ID | 5a8130462e4f0057ee1184509cd056eedd78742b.1621273353.git.thomas.lendacky@amd.com |
---|---|
State | Accepted |
Commit | a50c5bebc99c525e7fbc059988c6a5ab8680cb76 |
Headers | show |
Series | None | expand |
On Mon, May 17, 2021 at 12:42:33PM -0500, Tom Lendacky wrote: > Since the VMGEXIT instruction can be issued from userspace, invalidate > the GHCB after performing VMGEXIT processing in the kernel. > > Invalidation is only required after userspace is available, so call > vc_ghcb_invalidate() from sev_es_put_ghcb(). Update vc_ghcb_invalidate() > to additionally clear the GHCB exit code, so that a value of 0 is always > present outside VMGEXIT processing in the kernel. > > Fixes: 0786138c78e79 ("x86/sev-es: Add a Runtime #VC Exception Handler") > Cc: stable@vger.kernel.org > Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Joerg Roedel <jroedel@suse.de>
diff --git a/arch/x86/kernel/sev-shared.c b/arch/x86/kernel/sev-shared.c index 6ec8b3bfd76e..9f90f460a28c 100644 --- a/arch/x86/kernel/sev-shared.c +++ b/arch/x86/kernel/sev-shared.c @@ -63,6 +63,7 @@ static bool sev_es_negotiate_protocol(void) static __always_inline void vc_ghcb_invalidate(struct ghcb *ghcb) { + ghcb->save.sw_exit_code = 0; memset(ghcb->save.valid_bitmap, 0, sizeof(ghcb->save.valid_bitmap)); } diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index 45e212675811..4fa111becc93 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -457,6 +457,11 @@ static __always_inline void sev_es_put_ghcb(struct ghcb_state *state) data->backup_ghcb_active = false; state->ghcb = NULL; } else { + /* + * Invalidate the GHCB so a VMGEXIT instruction issued + * from userspace won't appear to be valid. + */ + vc_ghcb_invalidate(ghcb); data->ghcb_active = false; } }
Since the VMGEXIT instruction can be issued from userspace, invalidate the GHCB after performing VMGEXIT processing in the kernel. Invalidation is only required after userspace is available, so call vc_ghcb_invalidate() from sev_es_put_ghcb(). Update vc_ghcb_invalidate() to additionally clear the GHCB exit code, so that a value of 0 is always present outside VMGEXIT processing in the kernel. Fixes: 0786138c78e79 ("x86/sev-es: Add a Runtime #VC Exception Handler") Cc: stable@vger.kernel.org Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> --- arch/x86/kernel/sev-shared.c | 1 + arch/x86/kernel/sev.c | 5 +++++ 2 files changed, 6 insertions(+)