Reviewed-by: Michael Kinney <michael.d.kin...@intel.com> > -----Original Message----- > From: Yao, Jiewen > Sent: Wednesday, November 25, 2015 4:35 AM > To: edk2-de...@ml01.01.org > Cc: Yao, Jiewen <jiewen....@intel.com>; Fan, Jeff <jeff....@intel.com>; > Kinney, Michael D <michael.d.kin...@intel.com> > Subject: [patch 1/2] UefiCpuPkg/PiSmmCpu: 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" <jiewen....@intel.com> > Cc: "Fan, Jeff" <jeff....@intel.com> > Cc: "Kinney, Michael D" <michael.d.kin...@intel.com> > --- > UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 10 +++++----- > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 4 ++++ > UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c | 12 ++++++------ > UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c | 6 +++--- > UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c | 12 ++++++------ > 5 files changed, 24 insertions(+), 20 deletions(-) > > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > index 26c9a0f..084d217 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > @@ -785,7 +785,7 @@ Gen4GPageTable ( > // 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 @@ Gen4GPageTable ( > // 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 @@ Gen4GPageTable ( > 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 @@ Gen4GPageTable ( > 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 @@ SetCacheability ( > 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); > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > index 9caccb5..cce2a09 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > @@ -71,15 +71,19 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER > EXPRESS OR IMPLIED. > /// > #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 > // > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > index ff4e28e..ec4ec9b 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c > @@ -557,9 +557,9 @@ InitPaging ( > > // 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 @@ InitPaging ( > // > // 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 @@ InitPaging ( > } > 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 @@ RestorePageTableBelow4G ( > // > 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 @@ RestorePageTableBelow4G ( > // 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; > } > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c > index a7d790f..d242e06 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c > @@ -127,7 +127,7 @@ SmmInitPageTable ( > // 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 @@ SmiDefaultPFHandler ( > // > // 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 @@ SmiDefaultPFHandler ( > // 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); > } > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c > index c4ec12d..b3cd629 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c > @@ -51,7 +51,7 @@ InitSmmS3Cr3 ( > // 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 @@ AcquirePage ( > // > // 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 @@ RestorePageTableAbove4G ( > // 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 @@ RestorePageTableAbove4G ( > // > // 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 @@ RestorePageTableAbove4G ( > // > // 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. > -- > 1.9.5.msysgit.0
_______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel