25 IA32_DESCRIPTOR GdtrDesc;
26 IA32_SEGMENT_DESCRIPTOR *GdtEntry;
32 GdtEntryCount = (GdtrDesc.Limit + 1) /
sizeof (IA32_SEGMENT_DESCRIPTOR);
33 GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
34 for (Index = 0; Index < GdtEntryCount; Index++) {
35 if ((GdtEntry->Bits.L == 0) &&
36 (GdtEntry->Bits.DB == 0) &&
37 (GdtEntry->Bits.Type > 8))
45 ASSERT (Index != GdtEntryCount);
61 IA32_DESCRIPTOR GdtrDesc;
62 IA32_SEGMENT_DESCRIPTOR *GdtEntry;
68 GdtEntryCount = (GdtrDesc.Limit + 1) /
sizeof (IA32_SEGMENT_DESCRIPTOR);
69 GdtEntry = (IA32_SEGMENT_DESCRIPTOR *)GdtrDesc.Base;
70 for (Index = 0; Index < GdtEntryCount; Index++) {
71 if ((GdtEntry->Bits.L == 0) &&
72 (GdtEntry->Bits.DB == 1) &&
73 (GdtEntry->Bits.Type > 8))
81 ASSERT (Index != GdtEntryCount);
101 UINTN ProcessorNumber;
102 UINT16 Code16, Code32;
113 APResetFn = (AP_RESET *)(CpuMpData->WakeupBufferHigh + CpuMpData->AddressMap.SwitchToRealNoNxOffset);
115 BufferStart = CpuMpData->MpCpuExchangeInfo->BufferStart;
116 StackStart = CpuMpData->SevEsAPResetStackStart -
117 (AP_RESET_STACK_SIZE * ProcessorNumber);
122 APResetFn (BufferStart, Code16, Code32, StackStart);
135 if (CpuMpData->SevEsAPBuffer == (
UINTN)-1) {
136 CpuMpData->SevEsAPBuffer =
152 UINT32 Offset, InsnByte;
164 Offset +=
sizeof (JmpFar->InsnBuffer);
165 LoNib = (UINT8)Offset;
166 HiNib = (UINT8)(Offset >> 8);
176 JmpFar->InsnBuffer[InsnByte++] = 0x2E;
177 JmpFar->InsnBuffer[InsnByte++] = 0xFF;
178 JmpFar->InsnBuffer[InsnByte++] = 0x2E;
179 JmpFar->InsnBuffer[InsnByte++] = LoNib;
180 JmpFar->InsnBuffer[InsnByte++] = HiNib;
187 JmpFar->Segment = (UINT16)(SipiVector >> 4);
204 BOOLEAN InterruptState;
206 DoDecrement = (BOOLEAN)(CpuMpData->InitFlag == ApInitConfig);
212 VmgInit (Ghcb, &InterruptState);
224 Status =
VmgExit (Ghcb, SVM_EXIT_AP_RESET_HOLD, 0, 0);
225 if ((Status == 0) && (Ghcb->SaveArea.SwExitInfo2 != 0)) {
226 VmgDone (Ghcb, InterruptState);
230 VmgDone (Ghcb, InterruptState);
236 if (CpuMpData->NewCpuMpData !=
NULL) {
237 CpuMpData = CpuMpData->NewCpuMpData;
#define ASSERT_EFI_ERROR(StatusParameter)
#define ASSERT(Expression)
UINTN GetSevEsAPMemory(VOID)
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
#define CPUID_EXTENDED_TOPOLOGY
UINT32 EFIAPI AsmCpuid(IN UINT32 Index, OUT UINT32 *RegisterEax OPTIONAL, OUT UINT32 *RegisterEbx OPTIONAL, OUT UINT32 *RegisterEcx OPTIONAL, OUT UINT32 *RegisterEdx OPTIONAL)
EFI_STATUS GetProcessorNumber(IN CPU_MP_DATA *CpuMpData, OUT UINTN *ProcessorNumber)
#define FixedPcdGet32(TokenName)
UINT32 EFIAPI InterlockedDecrement(IN volatile UINT32 *Value)
VOID AllocateSevEsAPMemory(IN OUT CPU_MP_DATA *CpuMpData)
VOID SetSevEsJumpTable(IN UINTN SipiVector)
VOID MpInitLibSevEsAPReset(IN GHCB *Ghcb, IN CPU_MP_DATA *CpuMpData)
VOID SevEsPlaceApHlt(CPU_MP_DATA *CpuMpData)
VOID FillExchangeInfoDataSevEs(IN volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo)
STATIC UINT16 GetProtectedMode16CS(VOID)
STATIC UINT16 GetProtectedMode32CS(VOID)
UINT64 EFIAPI VmgExit(IN OUT GHCB *Ghcb, IN UINT64 ExitCode, IN UINT64 ExitInfo1, IN UINT64 ExitInfo2)
VOID EFIAPI VmgInit(IN OUT GHCB *Ghcb, IN OUT BOOLEAN *InterruptState)
VOID EFIAPI VmgDone(IN OUT GHCB *Ghcb, IN BOOLEAN InterruptState)
VOID EFIAPI AsmReadGdtr(OUT IA32_DESCRIPTOR *Gdtr)
struct CPUID_EXTENDED_TOPOLOGY_EBX::@626 Bits