Update Thunk16.S of X64 for BaseLib.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4620 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
xli24 2008-01-24 02:59:28 +00:00
parent 392d56cf4e
commit 57069be8fb
1 changed files with 18 additions and 10 deletions

View File

@ -21,6 +21,14 @@
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
.globl ASM_PFX(m16Start)
.globl ASM_PFX(m16Size)
.globl ASM_PFX(mThunk16Attr)
.globl ASM_PFX(m16Gdt)
.globl ASM_PFX(m16GdtrBase)
.globl ASM_PFX(mTransition)
.globl ASM_PFX(InternalAsmThunk16)
# define the structure of IA32_REGS # define the structure of IA32_REGS
.equ _EDI, 0 #size 4 .equ _EDI, 0 #size 4
.equ _ESI, 4 #size 4 .equ _ESI, 4 #size 4
@ -42,15 +50,15 @@
.data .data
m16Size: .word _InternalAsmThunk16 - m16Start ASM_PFX(m16Size): .word ASM_PFX(InternalAsmThunk16) - ASM_PFX(m16Start)
mThunk16Attr: .word _ThunkAttr - m16Start ASM_PFX(mThunk16Attr): .word _ThunkAttr - ASM_PFX(m16Start)
m16Gdt: .word _NullSeg - m16Start ASM_PFX(m16Gdt): .word _NullSeg - ASM_PFX(m16Start)
m16GdtrBase: .word _16GdtrBase - m16Start ASM_PFX(m16GdtrBase): .word _16GdtrBase - ASM_PFX(m16Start)
mTransition: .word _EntryPoint - m16Start ASM_PFX(mTransition): .word _EntryPoint - ASM_PFX(m16Start)
.text .text
m16Start: ASM_PFX(m16Start):
SavedGdt: .space 10 SavedGdt: .space 10
@ -134,10 +142,10 @@ SavedCs: .space 2
movq %r8, %rsp movq %r8, %rsp
ret ret
_EntryPoint: .long ASM_PFX(ToUserCode) - m16Start _EntryPoint: .long ASM_PFX(ToUserCode) - ASM_PFX(m16Start)
.word CODE16 .word CODE16
_16Gdtr: .word GDT_SIZE - 1 _16Gdtr: .word GDT_SIZE - 1
_16GdtrBase: .quad $_NullSeg _16GdtrBase: .quad _NullSeg
_16Idtr: .word 0x3ff _16Idtr: .word 0x3ff
.long 0 .long 0
@ -244,11 +252,11 @@ ASM_PFX(InternalAsmThunk16):
popq %rcx popq %rcx
rep rep
movsl # copy RegSet movsl # copy RegSet
lea (SavedCr4 - m16Start)(%rdx), %ecx lea (SavedCr4 - ASM_PFX(m16Start))(%rdx), %ecx
movl %edx,%eax # eax <- transition code address movl %edx,%eax # eax <- transition code address
andl $0xf,%edx andl $0xf,%edx
shll $12,%eax # segment address in high order 16 bits shll $12,%eax # segment address in high order 16 bits
lea (_BackFromUserCode - m16Start)(%rdx), %ax lea (_BackFromUserCode - ASM_PFX(m16Start))(%rdx), %ax
stosl # [edi] <- return address of user code stosl # [edi] <- return address of user code
sgdt (SavedGdt - SavedCr4)(%rcx) sgdt (SavedGdt - SavedCr4)(%rcx)
sidt 0x38(%rsp) sidt 0x38(%rsp)