X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=UefiCpuPkg%2FPiSmmCpuDxeSmm%2FIa32%2FPageTbl.c;fp=UefiCpuPkg%2FPiSmmCpuDxeSmm%2FIa32%2FPageTbl.c;h=8ec8790c05b690a06ad163e8b568d5a4d1c44c45;hp=9c8e2d15ac46a9d2bf3e153d959273682db53b34;hb=053e878bfb5c9d5eca779789b62891add30b14ba;hpb=91415a36ae7aaeabb2bbab3762f39544f9aed683 diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c index 9c8e2d15ac..8ec8790c05 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c @@ -36,13 +36,13 @@ EnableCet ( **/ VOID GetPageTable ( - OUT UINTN *Base, - OUT BOOLEAN *FiveLevels OPTIONAL + OUT UINTN *Base, + OUT BOOLEAN *FiveLevels OPTIONAL ) { *Base = ((mInternalCr3 == 0) ? - (AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64) : - mInternalCr3); + (AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64) : + mInternalCr3); if (FiveLevels != NULL) { *FiveLevels = FALSE; } @@ -59,9 +59,9 @@ SmmInitPageTable ( VOID ) { - UINTN PageFaultHandlerHookAddress; - IA32_IDT_GATE_DESCRIPTOR *IdtEntry; - EFI_STATUS Status; + UINTN PageFaultHandlerHookAddress; + IA32_IDT_GATE_DESCRIPTOR *IdtEntry; + EFI_STATUS Status; // // Initialize spin lock @@ -72,18 +72,19 @@ SmmInitPageTable ( if (FeaturePcdGet (PcdCpuSmmProfileEnable) || HEAP_GUARD_NONSTOP_MODE || - NULL_DETECTION_NONSTOP_MODE) { + NULL_DETECTION_NONSTOP_MODE) + { // // Set own Page Fault entry instead of the default one, because SMM Profile // feature depends on IRET instruction to do Single Step // PageFaultHandlerHookAddress = (UINTN)PageFaultIdtHandlerSmmProfile; - IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *) gcSmiIdtr.Base; - IdtEntry += EXCEPT_IA32_PAGE_FAULT; - IdtEntry->Bits.OffsetLow = (UINT16)PageFaultHandlerHookAddress; - IdtEntry->Bits.Reserved_0 = 0; - IdtEntry->Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32; - IdtEntry->Bits.OffsetHigh = (UINT16)(PageFaultHandlerHookAddress >> 16); + IdtEntry = (IA32_IDT_GATE_DESCRIPTOR *)gcSmiIdtr.Base; + IdtEntry += EXCEPT_IA32_PAGE_FAULT; + IdtEntry->Bits.OffsetLow = (UINT16)PageFaultHandlerHookAddress; + IdtEntry->Bits.Reserved_0 = 0; + IdtEntry->Bits.GateType = IA32_IDT_GATE_TYPE_INTERRUPT_32; + IdtEntry->Bits.OffsetHigh = (UINT16)(PageFaultHandlerHookAddress >> 16); } else { // // Register SMM Page Fault Handler @@ -98,6 +99,7 @@ SmmInitPageTable ( if (FeaturePcdGet (PcdCpuSmmStackGuard)) { InitializeIDTSmmStackGuard (); } + return Gen4GPageTable (TRUE); } @@ -124,13 +126,13 @@ SmiDefaultPFHandler ( VOID EFIAPI SmiPFHandler ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_SYSTEM_CONTEXT SystemContext + IN EFI_EXCEPTION_TYPE InterruptType, + IN EFI_SYSTEM_CONTEXT SystemContext ) { - UINTN PFAddress; - UINTN GuardPageAddress; - UINTN CpuIndex; + UINTN PFAddress; + UINTN GuardPageAddress; + UINTN CpuIndex; ASSERT (InterruptType == EXCEPT_IA32_PAGE_FAULT); @@ -143,25 +145,27 @@ SmiPFHandler ( // or SMM page protection violation. // if ((PFAddress >= mCpuHotPlugData.SmrrBase) && - (PFAddress < (mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize))) { + (PFAddress < (mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize))) + { DumpCpuContext (InterruptType, SystemContext); - CpuIndex = GetCpuIndex (); + CpuIndex = GetCpuIndex (); GuardPageAddress = (mSmmStackArrayBase + EFI_PAGE_SIZE + CpuIndex * mSmmStackSize); if ((FeaturePcdGet (PcdCpuSmmStackGuard)) && (PFAddress >= GuardPageAddress) && - (PFAddress < (GuardPageAddress + EFI_PAGE_SIZE))) { + (PFAddress < (GuardPageAddress + EFI_PAGE_SIZE))) + { DEBUG ((DEBUG_ERROR, "SMM stack overflow!\n")); } else { if ((SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_ID) != 0) { DEBUG ((DEBUG_ERROR, "SMM exception at execution (0x%x)\n", PFAddress)); DEBUG_CODE ( DumpModuleInfoByIp (*(UINTN *)(UINTN)SystemContext.SystemContextIa32->Esp); - ); + ); } else { DEBUG ((DEBUG_ERROR, "SMM exception at access (0x%x)\n", PFAddress)); DEBUG_CODE ( DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip); - ); + ); } if (HEAP_GUARD_NONSTOP_MODE) { @@ -169,6 +173,7 @@ SmiPFHandler ( goto Exit; } } + CpuDeadLoop (); goto Exit; } @@ -177,13 +182,14 @@ SmiPFHandler ( // If a page fault occurs in non-SMRAM range. // if ((PFAddress < mCpuHotPlugData.SmrrBase) || - (PFAddress >= mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize)) { + (PFAddress >= mCpuHotPlugData.SmrrBase + mCpuHotPlugData.SmrrSize)) + { if ((SystemContext.SystemContextIa32->ExceptionData & IA32_PF_EC_ID) != 0) { DumpCpuContext (InterruptType, SystemContext); DEBUG ((DEBUG_ERROR, "Code executed on IP(0x%x) out of SMM range after SMM is locked!\n", PFAddress)); DEBUG_CODE ( DumpModuleInfoByIp (*(UINTN *)(UINTN)SystemContext.SystemContextIa32->Esp); - ); + ); CpuDeadLoop (); goto Exit; } @@ -191,13 +197,14 @@ SmiPFHandler ( // // If NULL pointer was just accessed // - if ((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT1) != 0 && - (PFAddress < EFI_PAGE_SIZE)) { + if (((PcdGet8 (PcdNullPointerDetectionPropertyMask) & BIT1) != 0) && + (PFAddress < EFI_PAGE_SIZE)) + { DumpCpuContext (InterruptType, SystemContext); DEBUG ((DEBUG_ERROR, "!!! NULL pointer access !!!\n")); DEBUG_CODE ( DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip); - ); + ); if (NULL_DETECTION_NONSTOP_MODE) { GuardPagePFHandler (SystemContext.SystemContextIa32->ExceptionData); @@ -213,7 +220,7 @@ SmiPFHandler ( DEBUG ((DEBUG_ERROR, "Access SMM communication forbidden address (0x%x)!\n", PFAddress)); DEBUG_CODE ( DumpModuleInfoByIp ((UINTN)SystemContext.SystemContextIa32->Eip); - ); + ); CpuDeadLoop (); goto Exit; } @@ -241,15 +248,15 @@ SetPageTableAttributes ( VOID ) { - UINTN Index2; - UINTN Index3; - UINT64 *L1PageTable; - UINT64 *L2PageTable; - UINT64 *L3PageTable; - UINTN PageTableBase; - BOOLEAN IsSplitted; - BOOLEAN PageTableSplitted; - BOOLEAN CetEnabled; + UINTN Index2; + UINTN Index3; + UINT64 *L1PageTable; + UINT64 *L2PageTable; + UINT64 *L3PageTable; + UINTN PageTableBase; + BOOLEAN IsSplitted; + BOOLEAN PageTableSplitted; + BOOLEAN CetEnabled; // // Don't mark page table to read-only if heap guard is enabled. @@ -259,7 +266,7 @@ SetPageTableAttributes ( // if ((PcdGet8 (PcdHeapGuardPropertyMask) & (BIT3 | BIT2)) != 0) { DEBUG ((DEBUG_INFO, "Don't mark page table to read-only as heap guard is enabled\n")); - return ; + return; } // @@ -267,7 +274,7 @@ SetPageTableAttributes ( // if (FeaturePcdGet (PcdCpuSmmProfileEnable)) { DEBUG ((DEBUG_INFO, "Don't mark page table to read-only as SMM profile is enabled\n")); - return ; + return; } DEBUG ((DEBUG_INFO, "SetPageTableAttributes\n")); @@ -276,14 +283,15 @@ SetPageTableAttributes ( // Disable write protection, because we need mark page table to be write protected. // We need *write* page table memory, to mark itself to be *read only*. // - CetEnabled = ((AsmReadCr4() & CR4_CET_ENABLE) != 0) ? TRUE : FALSE; + CetEnabled = ((AsmReadCr4 () & CR4_CET_ENABLE) != 0) ? TRUE : FALSE; if (CetEnabled) { // // CET must be disabled if WP is disabled. // - DisableCet(); + DisableCet (); } - AsmWriteCr0 (AsmReadCr0() & ~CR0_WP); + + AsmWriteCr0 (AsmReadCr0 () & ~CR0_WP); do { DEBUG ((DEBUG_INFO, "Start...\n")); @@ -304,15 +312,17 @@ SetPageTableAttributes ( SmmSetMemoryAttributesEx ((EFI_PHYSICAL_ADDRESS)(UINTN)L2PageTable, SIZE_4KB, EFI_MEMORY_RO, &IsSplitted); PageTableSplitted = (PageTableSplitted || IsSplitted); - for (Index2 = 0; Index2 < SIZE_4KB/sizeof(UINT64); Index2++) { + for (Index2 = 0; Index2 < SIZE_4KB/sizeof (UINT64); Index2++) { if ((L2PageTable[Index2] & IA32_PG_PS) != 0) { // 2M continue; } + L1PageTable = (UINT64 *)(UINTN)(L2PageTable[Index2] & ~mAddressEncMask & PAGING_4K_ADDRESS_MASK_64); if (L1PageTable == NULL) { continue; } + SmmSetMemoryAttributesEx ((EFI_PHYSICAL_ADDRESS)(UINTN)L1PageTable, SIZE_4KB, EFI_MEMORY_RO, &IsSplitted); PageTableSplitted = (PageTableSplitted || IsSplitted); } @@ -322,15 +332,15 @@ SetPageTableAttributes ( // // Enable write protection, after page table updated. // - AsmWriteCr0 (AsmReadCr0() | CR0_WP); + AsmWriteCr0 (AsmReadCr0 () | CR0_WP); if (CetEnabled) { // // re-enable CET. // - EnableCet(); + EnableCet (); } - return ; + return; } /** @@ -343,7 +353,7 @@ SaveCr2 ( OUT UINTN *Cr2 ) { - return ; + return; } /** @@ -356,7 +366,7 @@ RestoreCr2 ( IN UINTN Cr2 ) { - return ; + return; } /**