Revision: 18960
http://sourceforge.net/p/edk2/code/18960
Author: jyao1
Date: 2015-11-26 07:01:08 +0000 (Thu, 26 Nov 2015)
Log Message:
-----------
Always set WP in CR0.
Always set RW+P bit for page table by default.
So that we can use write-protection for code later.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <[email protected]>
Reviewed-by: "Kinney, Michael D" <[email protected]>
Modified Paths:
--------------
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm
trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S 2015-11-26
06:37:14 UTC (rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S 2015-11-26
07:01:08 UTC (rev 18960)
@@ -123,7 +123,7 @@
L12: # as cr4.PGE is not set here,
refresh cr3
movl %eax, %cr4 # in PreModifyMtrrs() to flush TLB.
movl %cr0, %ebx
- orl $0x080000000, %ebx # enable paging
+ orl $0x080010000, %ebx # enable paging + WP
movl %ebx, %cr0
leal DSC_OFFSET(%edi),%ebx
movw DSC_DS(%ebx),%ax
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm 2015-11-26
06:37:14 UTC (rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm 2015-11-26
07:01:08 UTC (rev 18960)
@@ -129,7 +129,7 @@
@@: ; as cr4.PGE is not set here, refresh
cr3
mov cr4, eax ; in PreModifyMtrrs() to flush TLB.
mov ebx, cr0
- or ebx, 080000000h ; enable paging
+ or ebx, 080010000h ; enable paging + WP
mov cr0, ebx
lea ebx, [edi + DSC_OFFSET]
mov ax, [ebx + DSC_DS]
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c 2015-11-26 06:37:14 UTC
(rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c 2015-11-26 07:01:08 UTC
(rev 18960)
@@ -785,7 +785,7 @@
// Set Page Directory Pointers
//
for (Index = 0; Index < 4; Index++) {
- Pte[Index] = (UINTN)PageTable + EFI_PAGE_SIZE * (Index + 1) + IA32_PG_P;
+ Pte[Index] = (UINTN)PageTable + EFI_PAGE_SIZE * (Index + 1) +
PAGE_ATTRIBUTE_BITS;
}
Pte += EFI_PAGE_SIZE / sizeof (*Pte);
@@ -793,7 +793,7 @@
// Fill in Page Directory Entries
//
for (Index = 0; Index < EFI_PAGE_SIZE * 4 / sizeof (*Pte); Index++) {
- Pte[Index] = (Index << 21) + IA32_PG_PS + IA32_PG_RW + IA32_PG_P;
+ Pte[Index] = (Index << 21) | IA32_PG_PS | PAGE_ATTRIBUTE_BITS;
}
if (FeaturePcdGet (PcdCpuSmmStackGuard)) {
@@ -802,7 +802,7 @@
Pdpte = (UINT64*)PageTable;
for (PageIndex = Low2MBoundary; PageIndex <= High2MBoundary; PageIndex +=
SIZE_2MB) {
Pte = (UINT64*)(UINTN)(Pdpte[BitFieldRead32 ((UINT32)PageIndex, 30, 31)]
& ~(EFI_PAGE_SIZE - 1));
- Pte[BitFieldRead32 ((UINT32)PageIndex, 21, 29)] = (UINT64)Pages +
IA32_PG_RW + IA32_PG_P;
+ Pte[BitFieldRead32 ((UINT32)PageIndex, 21, 29)] = (UINT64)Pages |
PAGE_ATTRIBUTE_BITS;
//
// Fill in Page Table Entries
//
@@ -819,7 +819,7 @@
GuardPage = 0;
}
} else {
- Pte[Index] = PageAddress + IA32_PG_RW + IA32_PG_P;
+ Pte[Index] = PageAddress | PAGE_ATTRIBUTE_BITS;
}
PageAddress+= EFI_PAGE_SIZE;
}
@@ -886,7 +886,7 @@
NewPageTable[Index] |= (UINT64)(Index << EFI_PAGE_SHIFT);
}
- PageTable[PTIndex] = ((UINTN)NewPageTableAddress & gPhyMask) | IA32_PG_P;
+ PageTable[PTIndex] = ((UINTN)NewPageTableAddress & gPhyMask) |
PAGE_ATTRIBUTE_BITS;
}
ASSERT (PageTable[PTIndex] & IA32_PG_P);
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h 2015-11-26
06:37:14 UTC (rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h 2015-11-26
07:01:08 UTC (rev 18960)
@@ -71,15 +71,19 @@
///
#define IA32_PG_P BIT0
#define IA32_PG_RW BIT1
+#define IA32_PG_U BIT2
#define IA32_PG_WT BIT3
#define IA32_PG_CD BIT4
#define IA32_PG_A BIT5
+#define IA32_PG_D BIT6
#define IA32_PG_PS BIT7
#define IA32_PG_PAT_2M BIT12
#define IA32_PG_PAT_4K IA32_PG_PS
#define IA32_PG_PMNT BIT62
#define IA32_PG_NX BIT63
+#define PAGE_ATTRIBUTE_BITS (IA32_PG_RW | IA32_PG_P)
+
//
// Size of Task-State Segment defined in IA32 Manual
//
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c 2015-11-26 06:37:14 UTC
(rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c 2015-11-26 07:01:08 UTC
(rev 18960)
@@ -557,9 +557,9 @@
// Split it
for (Level4 = 0; Level4 < SIZE_4KB / sizeof(*Pt); Level4++) {
- Pt[Level4] = Address + ((Level4 << 12) | IA32_PG_RW | IA32_PG_P);
+ Pt[Level4] = Address + ((Level4 << 12) | PAGE_ATTRIBUTE_BITS);
} // end for PT
- *Pte = (UINTN)Pt | IA32_PG_RW | IA32_PG_P;
+ *Pte = (UINTN)Pt | PAGE_ATTRIBUTE_BITS;
} // end if IsAddressSplit
} // end for PTE
} // end for PDE
@@ -608,7 +608,7 @@
//
// Patch to remove Present flag and RW flag
//
- *Pte = *Pte & (INTN)(INT32)(~(IA32_PG_RW | IA32_PG_P));
+ *Pte = *Pte & (INTN)(INT32)(~PAGE_ATTRIBUTE_BITS);
}
if (Nx && mXdSupported) {
*Pte = *Pte | IA32_PG_NX;
@@ -621,7 +621,7 @@
}
for (Level4 = 0; Level4 < SIZE_4KB / sizeof(*Pt); Level4++, Pt++) {
if (!IsAddressValid (Address, &Nx)) {
- *Pt = *Pt & (INTN)(INT32)(~(IA32_PG_RW | IA32_PG_P));
+ *Pt = *Pt & (INTN)(INT32)(~PAGE_ATTRIBUTE_BITS);
}
if (Nx && mXdSupported) {
*Pt = *Pt | IA32_PG_NX;
@@ -1244,7 +1244,7 @@
//
PageTable[PTIndex] = (PFAddress & ~((1ull << 21) - 1));
PageTable[PTIndex] |= (UINT64)IA32_PG_PS;
- PageTable[PTIndex] |= (UINT64)(IA32_PG_RW | IA32_PG_P);
+ PageTable[PTIndex] |= (UINT64)PAGE_ATTRIBUTE_BITS;
if ((ErrorCode & IA32_PF_EC_ID) != 0) {
PageTable[PTIndex] &= ~IA32_PG_NX;
}
@@ -1277,7 +1277,7 @@
// Set new entry
//
PageTable[PTIndex] = (PFAddress & ~((1ull << 12) - 1));
- PageTable[PTIndex] |= (UINT64)(IA32_PG_RW | IA32_PG_P);
+ PageTable[PTIndex] |= (UINT64)PAGE_ATTRIBUTE_BITS;
if ((ErrorCode & IA32_PF_EC_ID) != 0) {
PageTable[PTIndex] &= ~IA32_PG_NX;
}
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c 2015-11-26 06:37:14 UTC
(rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c 2015-11-26 07:01:08 UTC
(rev 18960)
@@ -127,7 +127,7 @@
// Fill Page-Table-Level4 (PML4) entry
//
PTEntry = (UINT64*)(UINTN)(Pages - EFI_PAGES_TO_SIZE (PAGE_TABLE_PAGES + 1));
- *PTEntry = Pages + IA32_PG_P;
+ *PTEntry = Pages + PAGE_ATTRIBUTE_BITS;
ZeroMem (PTEntry + 1, EFI_PAGE_SIZE - sizeof (*PTEntry));
//
// Set sub-entries number
@@ -591,7 +591,7 @@
//
// If the entry is not present, allocate one page from page pool for it
//
- PageTable[PTIndex] = AllocPage () | IA32_PG_RW | IA32_PG_P;
+ PageTable[PTIndex] = AllocPage () | PAGE_ATTRIBUTE_BITS;
} else {
//
// Save the upper entry address
@@ -621,7 +621,7 @@
// Fill the new entry
//
PageTable[PTIndex] = (PFAddress & gPhyMask & ~((1ull << EndBit) - 1)) |
- PageAttribute | IA32_PG_A | IA32_PG_RW | IA32_PG_P;
+ PageAttribute | IA32_PG_A | PAGE_ATTRIBUTE_BITS;
if (UpperEntry != NULL) {
SetSubEntriesNum (UpperEntry, GetSubEntriesNum (UpperEntry) + 1);
}
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S 2015-11-26 06:37:14 UTC
(rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S 2015-11-26 07:01:08 UTC
(rev 18960)
@@ -144,7 +144,7 @@
orb $1,%ah
wrmsr
movq %cr0, %rbx
- btsl $31, %ebx
+ orl $0x080010000, %ebx # enable paging + WP
movq %rbx, %cr0
retf
LongMode: # long mode (64-bit code) starts here
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm 2015-11-26
06:37:14 UTC (rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm 2015-11-26
07:01:08 UTC (rev 18960)
@@ -140,7 +140,7 @@
or ah, 1
wrmsr
mov rbx, cr0
- bts ebx, 31
+ or ebx, 080010000h ; enable paging + WP
mov cr0, rbx
retf
@LongMode: ; long mode (64-bit code) starts here
Modified: trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c
===================================================================
--- trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c 2015-11-26
06:37:14 UTC (rev 18959)
+++ trunk/edk2/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c 2015-11-26
07:01:08 UTC (rev 18960)
@@ -51,7 +51,7 @@
// Fill Page-Table-Level4 (PML4) entry
//
PTEntry = (UINT64*)(UINTN)(Pages - EFI_PAGES_TO_SIZE (1));
- *PTEntry = Pages + IA32_PG_P;
+ *PTEntry = Pages | PAGE_ATTRIBUTE_BITS;
ZeroMem (PTEntry + 1, EFI_PAGE_SIZE - sizeof (*PTEntry));
//
@@ -117,7 +117,7 @@
//
// Link & Record the current uplink
//
- *Uplink = Address | IA32_PG_P | IA32_PG_RW;
+ *Uplink = Address | PAGE_ATTRIBUTE_BITS;
mPFPageUplink[mPFPageIndex] = Uplink;
mPFPageIndex = (mPFPageIndex + 1) % MAX_PF_PAGE_COUNT;
@@ -242,9 +242,9 @@
// PTE
PageTable = (UINT64*)(UINTN)(PageTable[PTIndex] & PHYSICAL_ADDRESS_MASK);
for (Index = 0; Index < 512; Index++) {
- PageTable[Index] = Address | IA32_PG_RW | IA32_PG_P;
+ PageTable[Index] = Address | PAGE_ATTRIBUTE_BITS;
if (!IsAddressValid (Address, &Nx)) {
- PageTable[Index] = PageTable[Index] & (INTN)(INT32)(~(IA32_PG_RW |
IA32_PG_P));
+ PageTable[Index] = PageTable[Index] &
(INTN)(INT32)(~PAGE_ATTRIBUTE_BITS);
}
if (Nx && mXdSupported) {
PageTable[Index] = PageTable[Index] | IA32_PG_NX;
@@ -262,7 +262,7 @@
//
// Patch to remove present flag and rw flag.
//
- PageTable[PTIndex] = PageTable[PTIndex] & (INTN)(INT32)(~(IA32_PG_RW |
IA32_PG_P));
+ PageTable[PTIndex] = PageTable[PTIndex] &
(INTN)(INT32)(~PAGE_ATTRIBUTE_BITS);
}
//
// Set XD bit to 1
@@ -289,7 +289,7 @@
//
// Add present flag or clear XD flag to make page fault handler succeed.
//
- PageTable[PTIndex] |= (UINT64)(IA32_PG_RW | IA32_PG_P);
+ PageTable[PTIndex] |= (UINT64)(PAGE_ATTRIBUTE_BITS);
if ((ErrorCode & IA32_PF_EC_ID) != 0) {
//
// If page fault is caused by instruction fetch, clear XD bit in the entry.
------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741551&iu=/4140
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits