summaryrefslogtreecommitdiff
path: root/MdePkg
diff options
context:
space:
mode:
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2009-06-05 11:50:39 +0000
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2009-06-05 11:50:39 +0000
commit2e56bb155b83686a15b24bffb104396902d75877 (patch)
treee0e33173869a60fb35b48b3a96f3919b603086f9 /MdePkg
parentce4c0e31b039cc9948ba06bbaca9d240d70aa7ee (diff)
downloadedk2-2e56bb155b83686a15b24bffb104396902d75877.zip
edk2-2e56bb155b83686a15b24bffb104396902d75877.tar.gz
edk2-2e56bb155b83686a15b24bffb104396902d75877.tar.bz2
Fix the bug that if code is run above 4G, AsmDisablePaging64 will be failed
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8479 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg')
-rw-r--r--MdePkg/Library/BaseLib/X64/DisablePaging64.S17
1 files changed, 14 insertions, 3 deletions
diff --git a/MdePkg/Library/BaseLib/X64/DisablePaging64.S b/MdePkg/Library/BaseLib/X64/DisablePaging64.S
index 038af71..242c0a0 100644
--- a/MdePkg/Library/BaseLib/X64/DisablePaging64.S
+++ b/MdePkg/Library/BaseLib/X64/DisablePaging64.S
@@ -37,8 +37,19 @@
ASM_GLOBAL ASM_PFX(InternalX86DisablePaging64)
ASM_PFX(InternalX86DisablePaging64):
- cli
- lea L1(%rip), %r10
+ cli
+ lea L1(%rip), %rsi # rsi <- The start address of transition code
+ mov 0x28(%rsp), %rdi # rdi <- New stack
+ sub $64, %rdi # rdi <- use 64 byte in stack to hold transition code
+ mov %rdi, %r10 # r10 <- The start address of transicition code below 4G
+ lea _mTransitionEnd(%rip), %rax # rax <- end of transition code
+ sub %rsi, %rax # rax <- The size of transition piece code
+ push %rcx # save rcx to stack
+ mov %rax, %rcx # rcx <- The size of transition piece code
+ rep
+ movsb # copy transition code to (new stack - 64byte) below 4G
+ pop %rcx # restore rcx
+
mov %r8d, %esi
mov %r9d, %edi
mov 0x28(%rsp), %eax # eax <- New Stack
@@ -64,4 +75,4 @@ L1:
push %rsi # push Context1
callq *%rbx # transfer control to EntryPoint
jmp . # no one should get here
-
+ _mTransitionEnd :