]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/PiSmmCpu: Always set WP in CR0
authorYao, Jiewen <jiewen.yao@intel.com>
Mon, 30 Nov 2015 19:57:45 +0000 (19:57 +0000)
committerlersek <lersek@Edk2>
Mon, 30 Nov 2015 19:57:45 +0000 (19:57 +0000)
So that we can use write-protection for code later.

It is REPOST.
It includes suggestion from Michael Kinney <michael.d.kinney@intel.com>:
- "For IA32 assembly, can we combine into a single OR instruction that
  sets both page enable and WP?"
- "For X64, does it make sense to use single OR instruction instead of 2
  BTS instructions as well?"

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <jiewen.yao@intel.com>
Suggested-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Cc: "Fan, Jeff" <jeff.fan@intel.com>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "Laszlo Ersek" <lersek@redhat.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19068 6f19259b-4bc3-4df7-8a09-765794883524

UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.S
UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmiEntry.asm
UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.S
UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmiEntry.asm

index fbaa0725f0bc8baf3633fc2bc2e36ac6be66f9ee..ec5b9a0b04231affd66d7a04c661625199048343 100644 (file)
@@ -123,7 +123,7 @@ L11:
 L12:                                       # as cr4.PGE is not set here, refresh cr3\r
     movl    %eax, %cr4                     # in PreModifyMtrrs() to flush TLB.\r
     movl    %cr0, %ebx\r
 L12:                                       # as cr4.PGE is not set here, refresh cr3\r
     movl    %eax, %cr4                     # in PreModifyMtrrs() to flush TLB.\r
     movl    %cr0, %ebx\r
-    orl     $0x080000000, %ebx             # enable paging\r
+    orl     $0x080010000, %ebx             # enable paging + WP\r
     movl    %ebx, %cr0\r
     leal    DSC_OFFSET(%edi),%ebx\r
     movw    DSC_DS(%ebx),%ax\r
     movl    %ebx, %cr0\r
     leal    DSC_OFFSET(%edi),%ebx\r
     movw    DSC_DS(%ebx),%ax\r
index 8a12927300ca21e57cff0b08bca114b96c429fa5..ac1a9b48ddd0d89569a10417b3753bdf9725c5f2 100644 (file)
@@ -129,7 +129,7 @@ gSmiCr3     DD      ?
 @@:                                     ; as cr4.PGE is not set here, refresh cr3\r
     mov     cr4, eax                    ; in PreModifyMtrrs() to flush TLB.\r
     mov     ebx, cr0\r
 @@:                                     ; as cr4.PGE is not set here, refresh cr3\r
     mov     cr4, eax                    ; in PreModifyMtrrs() to flush TLB.\r
     mov     ebx, cr0\r
-    or      ebx, 080000000h             ; enable paging\r
+    or      ebx, 080010000h             ; enable paging + WP\r
     mov     cr0, ebx\r
     lea     ebx, [edi + DSC_OFFSET]\r
     mov     ax, [ebx + DSC_DS]\r
     mov     cr0, ebx\r
     lea     ebx, [edi + DSC_OFFSET]\r
     mov     ax, [ebx + DSC_DS]\r
index b488b74b70756af9d9f675fe9fb578e814a0d695..7e9ac58cb2c96f33b554654b40e23c624522a72c 100644 (file)
@@ -144,7 +144,7 @@ Base:
     orb     $1,%ah\r
     wrmsr\r
     movq    %cr0, %rbx\r
     orb     $1,%ah\r
     wrmsr\r
     movq    %cr0, %rbx\r
-    btsl    $31, %ebx\r
+    orl     $0x080010000, %ebx          # enable paging + WP\r
     movq    %rbx, %cr0\r
     retf\r
 LongMode:                               # long mode (64-bit code) starts here\r
     movq    %rbx, %cr0\r
     retf\r
 LongMode:                               # long mode (64-bit code) starts here\r
index 4f5c03c5cf5fe87a71b25d33be66d9e12531a163..094cf2c3da330820ef9056c57ff78aaf0cbfa6f4 100644 (file)
@@ -140,7 +140,7 @@ Base:
     or      ah, 1\r
     wrmsr\r
     mov     rbx, cr0\r
     or      ah, 1\r
     wrmsr\r
     mov     rbx, cr0\r
-    bts     ebx, 31\r
+    or      ebx, 080010000h            ; enable paging + WP\r
     mov     cr0, rbx\r
     retf\r
 @LongMode:                              ; long mode (64-bit code) starts here\r
     mov     cr0, rbx\r
     retf\r
 @LongMode:                              ; long mode (64-bit code) starts here\r