mirror of https://github.com/acidanthera/audk.git
OvmfPkg/ResetVector: add the macro to invoke MSR protocol based VMGEXIT
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3275 The upcoming SEV-SNP support will need to make a few additional MSR protocol based VMGEXIT's. Add a macro that wraps the common setup and response validation logic in one place to keep the code readable. While at it, define SEV_STATUS_MSR that will be used to get the SEV STATUS MSR instead of open coding it. Cc: James Bottomley <jejb@linux.ibm.com> Cc: Min Xu <min.m.xu@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Erdem Aktas <erdemaktas@google.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Acked-by: Ard Biesheuvel <ardb+tianocore@kernel.org> Suggested-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
This commit is contained in:
parent
b461d67639
commit
7f05102f65
|
@ -35,6 +35,44 @@ BITS 32
|
||||||
%define CPUID_INSN_LEN 2
|
%define CPUID_INSN_LEN 2
|
||||||
|
|
||||||
|
|
||||||
|
%define SEV_GHCB_MSR 0xc0010130
|
||||||
|
%define SEV_STATUS_MSR 0xc0010131
|
||||||
|
|
||||||
|
; Macro is used to issue the MSR protocol based VMGEXIT. The caller is
|
||||||
|
; responsible to populate values in the EDX:EAX registers. After the vmmcall
|
||||||
|
; returns, it verifies that the response code matches with the expected
|
||||||
|
; code. If it does not match then terminate the guest. The result of request
|
||||||
|
; is returned in the EDX:EAX.
|
||||||
|
;
|
||||||
|
; args 1:Request code, 2: Response code
|
||||||
|
%macro VmgExit 2
|
||||||
|
;
|
||||||
|
; Add request code:
|
||||||
|
; GHCB_MSR[11:0] = Request code
|
||||||
|
or eax, %1
|
||||||
|
|
||||||
|
mov ecx, SEV_GHCB_MSR
|
||||||
|
wrmsr
|
||||||
|
|
||||||
|
; Issue VMGEXIT - NASM doesn't support the vmmcall instruction in 32-bit
|
||||||
|
; mode, so work around this by temporarily switching to 64-bit mode.
|
||||||
|
;
|
||||||
|
BITS 64
|
||||||
|
rep vmmcall
|
||||||
|
BITS 32
|
||||||
|
|
||||||
|
mov ecx, SEV_GHCB_MSR
|
||||||
|
rdmsr
|
||||||
|
|
||||||
|
;
|
||||||
|
; Verify the reponse code, if it does not match then request to terminate
|
||||||
|
; GHCB_MSR[11:0] = Response code
|
||||||
|
mov ecx, eax
|
||||||
|
and ecx, 0xfff
|
||||||
|
cmp ecx, %2
|
||||||
|
jne SevEsUnexpectedRespTerminate
|
||||||
|
%endmacro
|
||||||
|
|
||||||
; Check if Secure Encrypted Virtualization (SEV) features are enabled.
|
; Check if Secure Encrypted Virtualization (SEV) features are enabled.
|
||||||
;
|
;
|
||||||
; Register usage is tight in this routine, so multiple calls for the
|
; Register usage is tight in this routine, so multiple calls for the
|
||||||
|
@ -84,7 +122,7 @@ CheckSevFeatures:
|
||||||
|
|
||||||
; Check if SEV memory encryption is enabled
|
; Check if SEV memory encryption is enabled
|
||||||
; MSR_0xC0010131 - Bit 0 (SEV enabled)
|
; MSR_0xC0010131 - Bit 0 (SEV enabled)
|
||||||
mov ecx, 0xc0010131
|
mov ecx, SEV_STATUS_MSR
|
||||||
rdmsr
|
rdmsr
|
||||||
bt eax, 0
|
bt eax, 0
|
||||||
jnc NoSev
|
jnc NoSev
|
||||||
|
@ -99,7 +137,7 @@ CheckSevFeatures:
|
||||||
|
|
||||||
; Check if SEV-ES is enabled
|
; Check if SEV-ES is enabled
|
||||||
; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)
|
; MSR_0xC0010131 - Bit 1 (SEV-ES enabled)
|
||||||
mov ecx, 0xc0010131
|
mov ecx, SEV_STATUS_MSR
|
||||||
rdmsr
|
rdmsr
|
||||||
bt eax, 1
|
bt eax, 1
|
||||||
jnc GetSevEncBit
|
jnc GetSevEncBit
|
||||||
|
@ -196,10 +234,10 @@ SevEsIdtNotCpuid:
|
||||||
mov eax, 1
|
mov eax, 1
|
||||||
jmp SevEsIdtTerminate
|
jmp SevEsIdtTerminate
|
||||||
|
|
||||||
SevEsIdtNoCpuidResponse:
|
SevEsUnexpectedRespTerminate:
|
||||||
;
|
;
|
||||||
; Use VMGEXIT to request termination.
|
; Use VMGEXIT to request termination.
|
||||||
; 2 - GHCB_CPUID_RESPONSE not received
|
; 2 - Unexpected Response is received
|
||||||
;
|
;
|
||||||
mov eax, 2
|
mov eax, 2
|
||||||
|
|
||||||
|
@ -215,7 +253,7 @@ SevEsIdtTerminate:
|
||||||
shl eax, 16
|
shl eax, 16
|
||||||
or eax, 0x1100
|
or eax, 0x1100
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
mov ecx, 0xc0010130
|
mov ecx, SEV_GHCB_MSR
|
||||||
wrmsr
|
wrmsr
|
||||||
;
|
;
|
||||||
; Issue VMGEXIT - NASM doesn't support the vmmcall instruction in 32-bit
|
; Issue VMGEXIT - NASM doesn't support the vmmcall instruction in 32-bit
|
||||||
|
@ -275,7 +313,7 @@ SevEsIdtVmmComm:
|
||||||
mov [esp + VC_CPUID_REQUEST_REGISTER], eax
|
mov [esp + VC_CPUID_REQUEST_REGISTER], eax
|
||||||
|
|
||||||
; Save current GHCB MSR value
|
; Save current GHCB MSR value
|
||||||
mov ecx, 0xc0010130
|
mov ecx, SEV_GHCB_MSR
|
||||||
rdmsr
|
rdmsr
|
||||||
mov [esp + VC_GHCB_MSR_EAX], eax
|
mov [esp + VC_GHCB_MSR_EAX], eax
|
||||||
mov [esp + VC_GHCB_MSR_EDX], edx
|
mov [esp + VC_GHCB_MSR_EDX], edx
|
||||||
|
@ -292,31 +330,16 @@ NextReg:
|
||||||
jge VmmDone
|
jge VmmDone
|
||||||
|
|
||||||
shl eax, GHCB_CPUID_REGISTER_SHIFT
|
shl eax, GHCB_CPUID_REGISTER_SHIFT
|
||||||
or eax, GHCB_CPUID_REQUEST
|
|
||||||
mov edx, [esp + VC_CPUID_FUNCTION]
|
mov edx, [esp + VC_CPUID_FUNCTION]
|
||||||
mov ecx, 0xc0010130
|
|
||||||
wrmsr
|
VmgExit GHCB_CPUID_REQUEST, GHCB_CPUID_RESPONSE
|
||||||
|
|
||||||
;
|
;
|
||||||
; Issue VMGEXIT - NASM doesn't support the vmmcall instruction in 32-bit
|
; Response GHCB MSR
|
||||||
; mode, so work around this by temporarily switching to 64-bit mode.
|
|
||||||
;
|
|
||||||
BITS 64
|
|
||||||
rep vmmcall
|
|
||||||
BITS 32
|
|
||||||
|
|
||||||
;
|
|
||||||
; Read GHCB MSR
|
|
||||||
; GHCB_MSR[63:32] = CPUID register value
|
; GHCB_MSR[63:32] = CPUID register value
|
||||||
; GHCB_MSR[31:30] = CPUID register
|
; GHCB_MSR[31:30] = CPUID register
|
||||||
; GHCB_MSR[11:0] = CPUID response protocol
|
; GHCB_MSR[11:0] = CPUID response protocol
|
||||||
;
|
;
|
||||||
mov ecx, 0xc0010130
|
|
||||||
rdmsr
|
|
||||||
mov ecx, eax
|
|
||||||
and ecx, 0xfff
|
|
||||||
cmp ecx, GHCB_CPUID_RESPONSE
|
|
||||||
jne SevEsIdtNoCpuidResponse
|
|
||||||
|
|
||||||
; Save returned value
|
; Save returned value
|
||||||
shr eax, GHCB_CPUID_REGISTER_SHIFT
|
shr eax, GHCB_CPUID_REGISTER_SHIFT
|
||||||
|
@ -334,7 +357,7 @@ VmmDone:
|
||||||
;
|
;
|
||||||
mov eax, [esp + VC_GHCB_MSR_EAX]
|
mov eax, [esp + VC_GHCB_MSR_EAX]
|
||||||
mov edx, [esp + VC_GHCB_MSR_EDX]
|
mov edx, [esp + VC_GHCB_MSR_EDX]
|
||||||
mov ecx, 0xc0010130
|
mov ecx, SEV_GHCB_MSR
|
||||||
wrmsr
|
wrmsr
|
||||||
|
|
||||||
mov eax, [esp + VC_CPUID_RESULT_EAX]
|
mov eax, [esp + VC_CPUID_RESULT_EAX]
|
||||||
|
|
Loading…
Reference in New Issue