37typedef PACKED
struct {
47} SEV_SNP_CPUID_FUNCTION;
52typedef PACKED
struct {
56 SEV_SNP_CPUID_FUNCTION function[0];
82 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_UNSUPPORTED, Regs->ExceptionData, 0);
87 Event.Elements.Vector = GP_EXCEPTION;
88 Event.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION;
89 Event.Elements.Valid = 1;
91 Status = Event.Uint64;
119 MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE State;
127 if (State == MemEncryptSevAddressRangeUnencrypted) {
136 "MMIO using encrypted memory: %lx\n",
137 (UINT64)MemoryAddress
140 GpEvent.Elements.Vector = GP_EXCEPTION;
141 GpEvent.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION;
142 GpEvent.Elements.Valid = 1;
144 return GpEvent.Uint64;
169 UINT64 ExitInfo1, ExitInfo2, Status;
172 UINT8 OpCode, SignByte;
177 OpCode = *(InstructionData->OpCodes);
178 if (OpCode == TWO_BYTE_OPCODE_ESCAPE) {
179 OpCode = *(InstructionData->OpCodes + 1);
193 Bytes = ((Bytes != 0) ? Bytes :
194 (InstructionData->DataSize == Size16Bits) ? 2 :
195 (InstructionData->DataSize == Size32Bits) ? 4 :
196 (InstructionData->DataSize == Size64Bits) ? 8 :
199 if (InstructionData->Ext.ModRm.Mod == 3) {
211 ExitInfo1 = InstructionData->Ext.RmData;
213 CopyMem (Ghcb->SharedBuffer, &InstructionData->Ext.RegData, Bytes);
215 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
217 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);
233 Bytes = ((Bytes != 0) ? Bytes :
234 (InstructionData->DataSize == Size16Bits) ? 2 :
235 (InstructionData->DataSize == Size32Bits) ? 4 :
236 (InstructionData->DataSize == Size64Bits) ? 8 :
239 InstructionData->ImmediateSize = (
UINTN)(1 << InstructionData->AddrSize);
240 InstructionData->End += InstructionData->ImmediateSize;
247 sizeof (
UINTN) ==
sizeof (UINT64),
248 "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"
254 InstructionData->Immediate,
255 InstructionData->ImmediateSize
265 CopyMem (Ghcb->SharedBuffer, &Regs->Rax, Bytes);
267 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
269 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);
286 Bytes = ((Bytes != 0) ? Bytes :
287 (InstructionData->DataSize == Size16Bits) ? 2 :
288 (InstructionData->DataSize == Size32Bits) ? 4 :
291 InstructionData->ImmediateSize = Bytes;
292 InstructionData->End += Bytes;
299 ExitInfo1 = InstructionData->Ext.RmData;
301 CopyMem (Ghcb->SharedBuffer, InstructionData->Immediate, Bytes);
303 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
305 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);
322 Bytes = ((Bytes != 0) ? Bytes :
323 (InstructionData->DataSize == Size16Bits) ? 2 :
324 (InstructionData->DataSize == Size32Bits) ? 4 :
325 (InstructionData->DataSize == Size64Bits) ? 8 :
327 if (InstructionData->Ext.ModRm.Mod == 3) {
339 ExitInfo1 = InstructionData->Ext.RmData;
342 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
344 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);
369 Bytes = ((Bytes != 0) ? Bytes :
370 (InstructionData->DataSize == Size16Bits) ? 2 :
371 (InstructionData->DataSize == Size32Bits) ? 4 :
372 (InstructionData->DataSize == Size64Bits) ? 8 :
375 InstructionData->ImmediateSize = (
UINTN)(1 << InstructionData->AddrSize);
376 InstructionData->End += InstructionData->ImmediateSize;
383 sizeof (
UINTN) ==
sizeof (UINT64),
384 "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"
390 InstructionData->Immediate,
391 InstructionData->ImmediateSize
402 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
404 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);
416 CopyMem (&Regs->Rax, Ghcb->SharedBuffer, Bytes);
429 Bytes = (Bytes != 0) ? Bytes : 2;
436 ExitInfo1 = InstructionData->Ext.RmData;
439 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
441 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);
461 Bytes = (Bytes != 0) ? Bytes : 2;
468 ExitInfo1 = InstructionData->Ext.RmData;
471 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
473 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);
481 Data = (UINT8 *)Ghcb->SharedBuffer;
482 SignByte = ((*Data & BIT7) != 0) ? 0xFF : 0x00;
486 Data = (UINT16 *)Ghcb->SharedBuffer;
487 SignByte = ((*Data & BIT15) != 0) ? 0xFF : 0x00;
496 DEBUG ((DEBUG_ERROR,
"Invalid MMIO opcode (%x)\n", OpCode));
497 Status = GP_EXCEPTION;
526 Ghcb->SaveArea.Rax = Regs->Rax;
528 Ghcb->SaveArea.Rcx = Regs->Rcx;
556 Ghcb->SaveArea.Rax = Regs->Rax;
558 Ghcb->SaveArea.Rcx = Regs->Rcx;
560 Ghcb->SaveArea.Rdx = Regs->Rdx;
629 Regs->Rax = Ghcb->SaveArea.Rax;
630 Regs->Rcx = Ghcb->SaveArea.Rcx;
631 Regs->Rdx = Ghcb->SaveArea.Rdx;
660 Ghcb->SaveArea.Rax = Regs->Rax;
662 Ghcb->SaveArea.Cpl = (UINT8)(Regs->Cs & 0x3);
674 Regs->Rax = Ghcb->SaveArea.Rax;
712 EcxIn = (UINT32)(
UINTN)Regs->Rcx;
715 if (*(InstructionData->OpCodes + 1) == 0x30) {
720 Regs->Rax = Msr.Bits.Lower32Bits;
721 Regs->Rdx = Msr.Bits.Upper32Bits;
726 switch (*(InstructionData->OpCodes + 1)) {
729 Ghcb->SaveArea.Rax = Regs->Rax;
731 Ghcb->SaveArea.Rdx = Regs->Rdx;
737 Ghcb->SaveArea.Rcx = Regs->Rcx;
749 if (ExitInfo1 == 0) {
756 Regs->Rax = Ghcb->SaveArea.Rax;
757 Regs->Rdx = Ghcb->SaveArea.Rdx;
786 switch (*(InstructionData->OpCodes)) {
792 ExitInfo |= IOIO_TYPE_INS;
793 ExitInfo |= IOIO_SEG_ES;
794 ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
802 ExitInfo |= IOIO_TYPE_OUTS;
803 ExitInfo |= IOIO_SEG_DS;
804 ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
812 InstructionData->ImmediateSize = 1;
813 InstructionData->End++;
814 ExitInfo |= IOIO_TYPE_IN;
815 ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16);
823 InstructionData->ImmediateSize = 1;
824 InstructionData->End++;
825 ExitInfo |= IOIO_TYPE_OUT;
826 ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16) | IOIO_TYPE_OUT;
834 ExitInfo |= IOIO_TYPE_IN;
835 ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
843 ExitInfo |= IOIO_TYPE_OUT;
844 ExitInfo |= ((Regs->Rdx & 0xffff) << 16);
851 switch (*(InstructionData->OpCodes)) {
861 ExitInfo |= IOIO_DATA_8;
868 ExitInfo |= (InstructionData->DataSize == Size16Bits) ? IOIO_DATA_16
872 switch (InstructionData->AddrSize) {
874 ExitInfo |= IOIO_ADDR_16;
878 ExitInfo |= IOIO_ADDR_32;
882 ExitInfo |= IOIO_ADDR_64;
889 if (InstructionData->RepMode != 0) {
890 ExitInfo |= IOIO_REP;
918 UINT64 ExitInfo1, ExitInfo2, Status;
922 if (ExitInfo1 == 0) {
926 IsString = ((ExitInfo1 & IOIO_TYPE_STR) != 0) ?
TRUE :
FALSE;
928 UINTN IoBytes, VmgExitBytes;
929 UINTN GhcbCount, OpCount;
933 IoBytes = IOIO_DATA_BYTES (ExitInfo1);
934 GhcbCount =
sizeof (Ghcb->SharedBuffer) / IoBytes;
936 OpCount = ((ExitInfo1 & IOIO_REP) != 0) ? Regs->Rcx : 1;
937 while (OpCount != 0) {
938 ExitInfo2 =
MIN (OpCount, GhcbCount);
939 VmgExitBytes = ExitInfo2 * IoBytes;
941 if ((ExitInfo1 & IOIO_TYPE_IN) == 0) {
942 CopyMem (Ghcb->SharedBuffer, (
VOID *)Regs->Rsi, VmgExitBytes);
943 Regs->Rsi += VmgExitBytes;
946 Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;
948 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, ExitInfo2);
953 if ((ExitInfo1 & IOIO_TYPE_IN) != 0) {
954 CopyMem ((
VOID *)Regs->Rdi, Ghcb->SharedBuffer, VmgExitBytes);
955 Regs->Rdi += VmgExitBytes;
958 if ((ExitInfo1 & IOIO_REP) != 0) {
959 Regs->Rcx -= ExitInfo2;
962 OpCount -= ExitInfo2;
965 if ((ExitInfo1 & IOIO_TYPE_IN) != 0) {
966 Ghcb->SaveArea.Rax = 0;
968 CopyMem (&Ghcb->SaveArea.Rax, &Regs->Rax, IOIO_DATA_BYTES (ExitInfo1));
973 Status =
CcExitVmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, 0);
978 if ((ExitInfo1 & IOIO_TYPE_IN) != 0) {
983 CopyMem (&Regs->Rax, &Ghcb->SaveArea.Rax, IOIO_DATA_BYTES (ExitInfo1));
1051 IN OUT UINT64 *Status,
1056 Ghcb->SaveArea.Rax = EaxIn;
1058 Ghcb->SaveArea.Rcx = EcxIn;
1061 Ghcb->SaveArea.XCr0 = XCr0;
1080 *Eax = (UINT32)(
UINTN)Ghcb->SaveArea.Rax;
1084 *Ebx = (UINT32)(
UINTN)Ghcb->SaveArea.Rbx;
1088 *Ecx = (UINT32)(
UINTN)Ghcb->SaveArea.Rcx;
1092 *Edx = (UINT32)(
UINTN)Ghcb->SaveArea.Rdx;
1115 return !!Msr.Bits.SevSnpBit;
1136 IN UINT64 XFeaturesEnabled,
1137 IN OUT UINT32 *XSaveSize,
1138 IN BOOLEAN Compacted
1141 SEV_SNP_CPUID_INFO *CpuidInfo;
1142 UINT64 XFeaturesFound = 0;
1149 CpuidInfo = (SEV_SNP_CPUID_INFO *)(UINT64)
PcdGet32 (PcdOvmfCpuidBase);
1151 for (Idx = 0; Idx < CpuidInfo->Count; Idx++) {
1152 SEV_SNP_CPUID_FUNCTION *CpuidFn = &CpuidInfo->function[Idx];
1154 if (!((CpuidFn->EaxIn == 0xD) && (CpuidFn->EcxIn > 1))) {
1158 if (XFeaturesFound & (1ULL << CpuidFn->EcxIn) ||
1159 !(XFeaturesEnabled & (1ULL << CpuidFn->EcxIn)))
1164 XFeaturesFound |= (1ULL << CpuidFn->EcxIn);
1166 *XSaveSize += CpuidFn->Eax;
1168 *XSaveSize =
MAX (*XSaveSize, CpuidFn->Eax + CpuidFn->Ebx);
1176 if (XFeaturesFound != (XFeaturesEnabled & ~3UL)) {
1252 IN OUT UINT64 *Status,
1253 IN OUT BOOLEAN *Unsupported
1256 SEV_SNP_CPUID_INFO *CpuidInfo;
1260 CpuidInfo = (SEV_SNP_CPUID_INFO *)(UINT64)
PcdGet32 (PcdOvmfCpuidBase);
1263 for (Idx = 0; Idx < CpuidInfo->Count; Idx++) {
1264 SEV_SNP_CPUID_FUNCTION *CpuidFn = &CpuidInfo->function[Idx];
1266 if (CpuidFn->EaxIn != EaxIn) {
1274 *Eax = CpuidFn->Eax;
1275 *Ebx = CpuidFn->Ebx;
1276 *Ecx = CpuidFn->Ecx;
1277 *Edx = CpuidFn->Edx;
1284 *Eax = *Ebx = *Ecx = *Edx = 0;
1310 *Ebx = (*Ebx & 0x00FFFFFF) | (Ebx2 & 0xFF000000);
1312 *Edx = (*Edx & ~BIT9) | (Edx2 & BIT9);
1315 *Ecx = (Cr4.Bits.OSXSAVE) ? (*Ecx & ~BIT27) | (*Ecx & BIT27)
1322 *Ecx = (Cr4.Bits.PKE) ? (*Ecx | BIT4) : (*Ecx & ~BIT4);
1353 if (!(*Eax & (BIT3 | BIT1))) {
1372 }
else if (EaxIn == 0x8000001E) {
1394 *Ebx = (*Ebx & 0xFFFFFF00) | (Ebx2 & 0x000000FF);
1396 *Ecx = (*Ecx & 0xFFFFFF00) | (Ecx2 & 0x000000FF);
1397 }
else if (EaxIn == 0x8000001F) {
1406 *Unsupported =
FALSE;
1432 BOOLEAN Unsupported;
1442 EaxIn = (UINT32)(
UINTN)Regs->Rax;
1443 EcxIn = (UINT32)(
UINTN)Regs->Rcx;
1449 Ghcb->SaveArea.XCr0 = (Cr4.Bits.OSXSAVE == 1) ? AsmXGetBv (0) : 1;
1450 XCr0 = (Cr4.Bits.OSXSAVE == 1) ? AsmXGetBv (0) : 1;
1526 Ghcb->SaveArea.Rcx = Regs->Rcx;
1540 Regs->Rax = Ghcb->SaveArea.Rax;
1541 Regs->Rdx = Ghcb->SaveArea.Rdx;
1581 Regs->Rax = Ghcb->SaveArea.Rax;
1582 Regs->Rdx = Ghcb->SaveArea.Rdx;
1618 Ext = &InstructionData->Ext;
1638 SevEsData->Dr7Cached = 1;
1672 Ext = &InstructionData->Ext;
1684 *
Register = (SevEsData->Dr7Cached == 1) ? SevEsData->Dr7 : 0x400;
1725 OpCode = *(InstructionData->OpCodes);
1726 if (OpCode == TWO_BYTE_OPCODE_ESCAPE) {
1727 OpCode = *(InstructionData->OpCodes + 1);
1731 case SVM_EXIT_IOIO_PROT:
1736 case SVM_EXIT_CPUID:
1737 if (OpCode == 0xa2) {
1744 if (OpCode == 0x08) {
1750 case SVM_EXIT_MONITOR:
1753 if ((OpCode == 0x01) &&
1754 ( (InstructionData->ModRm.Uint8 == 0xc8)
1755 || (InstructionData->ModRm.Uint8 == 0xfa)))
1762 case SVM_EXIT_MWAIT:
1765 if ((OpCode == 0x01) &&
1766 ( (InstructionData->ModRm.Uint8 == 0xc9)
1767 || (InstructionData->ModRm.Uint8 == 0xfb)))
1776 if ((OpCode == 0x32) ||
1785 case SVM_EXIT_RDPMC:
1786 if (OpCode == 0x33) {
1792 case SVM_EXIT_RDTSC:
1793 if (OpCode == 0x31) {
1799 case SVM_EXIT_RDTSCP:
1802 if ((OpCode == 0x01) && (InstructionData->ModRm.Uint8 == 0xf9)) {
1808 case SVM_EXIT_DR7_READ:
1811 if ((OpCode == 0x21) &&
1812 (InstructionData->Ext.ModRm.Reg == 7))
1819 case SVM_EXIT_VMMCALL:
1822 if ((OpCode == 0x01) && (InstructionData->ModRm.Uint8 == 0xd9)) {
1828 case SVM_EXIT_DR7_WRITE:
1831 if ((OpCode == 0x23) &&
1832 (InstructionData->Ext.ModRm.Reg == 7))
1839 case SVM_EXIT_WBINVD:
1840 if (OpCode == 0x9) {
1881 UINT64 ExitCode, Status;
1883 BOOLEAN InterruptState;
1887 Regs = SystemContext.SystemContextX64;
1891 ExitCode = Regs->ExceptionData;
1893 case SVM_EXIT_DR7_READ:
1897 case SVM_EXIT_DR7_WRITE:
1901 case SVM_EXIT_RDTSC:
1905 case SVM_EXIT_RDPMC:
1909 case SVM_EXIT_CPUID:
1917 case SVM_EXIT_IOIO_PROT:
1925 case SVM_EXIT_VMMCALL:
1929 case SVM_EXIT_RDTSCP:
1933 case SVM_EXIT_WBINVD:
1937 case SVM_EXIT_MONITOR:
1941 case SVM_EXIT_MWAIT:
1961 Status = NaeExit (Ghcb, Regs, &InstructionData);
1969 Event.Uint64 = Status;
1970 if (Event.Elements.ErrorCodeValid != 0) {
1971 Regs->ExceptionData = Event.Elements.ErrorCode;
1973 Regs->ExceptionData = 0;
1976 *ExceptionType = Event.Elements.Vector;
1978 VcRet = EFI_PROTOCOL_ERROR;
2002 SevEsData->VcCount = 0;
BOOLEAN EFIAPI AmdSvsmIsSvsmPresent(VOID)
UINT64 EFIAPI AmdSvsmSnpGetCaa(VOID)
VOID EFIAPI CpuDeadLoop(VOID)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
UINT64 EFIAPI CcExitVmgExit(IN OUT GHCB *Ghcb, IN UINT64 ExitCode, IN UINT64 ExitInfo1, IN UINT64 ExitInfo2)
BOOLEAN EFIAPI CcExitVmgIsOffsetValid(IN GHCB *Ghcb, IN GHCB_REGISTER Offset)
VOID EFIAPI CcExitVmgSetOffsetValid(IN OUT GHCB *Ghcb, IN GHCB_REGISTER Offset)
VOID EFIAPI CcExitVmgInit(IN OUT GHCB *Ghcb, IN OUT BOOLEAN *InterruptState)
VOID EFIAPI CcExitVmgDone(IN OUT GHCB *Ghcb, IN BOOLEAN InterruptState)
STATIC UINT64 ValidateMmioMemory(IN GHCB *Ghcb, IN UINTN MemoryAddress, IN UINTN MemoryLength)
STATIC UINT64 MmioExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN OUT CC_INSTRUCTION_DATA *InstructionData)
STATIC BOOLEAN SnpEnabled(VOID)
STATIC UINT64 VmmCallExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC BOOLEAN GetCpuidXSaveSize(IN UINT64 XFeaturesEnabled, IN OUT UINT32 *XSaveSize, IN BOOLEAN Compacted)
STATIC UINT64 Dr7ReadExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 InvdExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 Dr7WriteExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC BOOLEAN GetCpuidHyp(IN OUT GHCB *Ghcb, IN UINT32 EaxIn, IN UINT32 EcxIn, IN UINT64 XCr0, IN OUT UINT32 *Eax, IN OUT UINT32 *Ebx, IN OUT UINT32 *Ecx, IN OUT UINT32 *Edx, IN OUT UINT64 *Status, IN OUT BOOLEAN *UnsupportedExit)
STATIC UINT64 IoioExitInfo(IN EFI_SYSTEM_CONTEXT_X64 *Regs, IN OUT CC_INSTRUCTION_DATA *InstructionData)
EFI_STATUS EFIAPI InternalVmgExitHandleVc(IN OUT GHCB *Ghcb, IN OUT EFI_EXCEPTION_TYPE *ExceptionType, IN OUT EFI_SYSTEM_CONTEXT SystemContext)
STATIC UINT64 VcCheckOpcodeBytes(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN OUT CC_INSTRUCTION_DATA *InstructionData, IN UINT64 ExitCode)
STATIC UINT64 IoioExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 RdtscExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 MwaitExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 RdtscpExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
VOID EFIAPI VmgExitIssueAssert(IN OUT SEV_ES_PER_CPU_DATA *SevEsData)
STATIC UINT64 WbinvdExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 MonitorExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 UnsupportedExit(IN GHCB *Ghcb, IN EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC BOOLEAN IsFunctionIndexed(IN UINT32 EaxIn)
STATIC BOOLEAN GetCpuidFw(IN OUT GHCB *Ghcb, IN UINT32 EaxIn, IN UINT32 EcxIn, IN UINT64 XCr0, IN OUT UINT32 *Eax, IN OUT UINT32 *Ebx, IN OUT UINT32 *Ecx, IN OUT UINT32 *Edx, IN OUT UINT64 *Status, IN OUT BOOLEAN *Unsupported)
STATIC UINT64 RdpmcExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 CpuidExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
STATIC UINT64 MsrExit(IN OUT GHCB *Ghcb, IN OUT EFI_SYSTEM_CONTEXT_X64 *Regs, IN CC_INSTRUCTION_DATA *InstructionData)
UINT64 * CcGetRegisterPointer(IN EFI_SYSTEM_CONTEXT_X64 *Regs, IN UINT8 Register)
VOID CcDecodeModRm(IN EFI_SYSTEM_CONTEXT_X64 *Regs, IN OUT CC_INSTRUCTION_DATA *InstructionData)
EFI_STATUS CcInitInstructionData(IN OUT CC_INSTRUCTION_DATA *InstructionData, IN GHCB *Ghcb, IN EFI_SYSTEM_CONTEXT_X64 *Regs)
UINT64 CcInstructionLength(IN CC_INSTRUCTION_DATA *InstructionData)
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
UINTN EFIAPI AsmReadCr4(VOID)
#define DEBUG(Expression)
#define CPUID_INTEL_PROCESSOR_TRACE
#define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS
#define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS
#define CPUID_CACHE_PARAMS
#define CPUID_INTEL_RDT_MONITORING
#define CPUID_VERSION_INFO
#define CPUID_EXTENDED_STATE
#define CPUID_EXTENDED_TOPOLOGY
#define CPUID_V2_EXTENDED_TOPOLOGY
#define CPUID_INTEL_RDT_ALLOCATION
BOOLEAN EFIAPI MemEncryptSevEsDebugVirtualizationIsEnabled(VOID)
MEM_ENCRYPT_SEV_ADDRESS_RANGE_STATE EFIAPI MemEncryptSevGetAddressRangeState(IN PHYSICAL_ADDRESS Cr3BaseAddress, IN PHYSICAL_ADDRESS BaseAddress, IN UINTN Length)
#define PcdGet32(TokenName)
EFI_STATUS EFIAPI Register(IN EFI_PEI_RSC_HANDLER_CALLBACK Callback)
UINT32 EFIAPI AsmReadMsr32(IN UINT32 Index)