Enabled 4G+ memory in thunk.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1957 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bxing 2006-11-15 09:31:03 +00:00
parent adf6ff605f
commit 38b5365e39

View File

@ -100,6 +100,11 @@ _ThunkAttr DD ?
mov ebx, (IA32_REGS ptr [rsi - sizeof (IA32_REGS)])._EIP mov ebx, (IA32_REGS ptr [rsi - sizeof (IA32_REGS)])._EIP
shl ax, 4 ; shl eax, 4 shl ax, 4 ; shl eax, 4
add bp, ax ; add ebp, eax add bp, ax ; add ebp, eax
mov ax, cs
shl ax, 4
lea ax, [eax + ebx + (@64BitCode - @Base)]
DB 2eh ; cs:
mov [rdi + (@64Eip - @Base)], ax
DB 66h, 0b8h ; mov eax, imm32 DB 66h, 0b8h ; mov eax, imm32
SavedCr4 DD ? SavedCr4 DD ?
mov cr4, rax mov cr4, rax
@ -113,13 +118,13 @@ SavedCr4 DD ?
DB 66h, 0b8h ; mov eax, imm32 DB 66h, 0b8h ; mov eax, imm32
SavedCr0 DD ? SavedCr0 DD ?
mov cr0, rax mov cr0, rax
DB 0b8h ; mov ax, imm16 DB 66h, 0eah ; jmp far cs:@64Bit
SavedSs DW ? @64Eip DD ?
mov ss, eax SavedCs DW ?
DB 66h, 0bch ; mov esp, imm32 @64BitCode:
SavedEsp DD ? DB 48h, 0b8h ; mov rax, imm64
DB 66h SavedRip DQ ?
retf ; return to protected mode jmp rax ; return to caller
_BackFromUserCode ENDP _BackFromUserCode ENDP
_EntryPoint DD _ToUserCode - m16Start _EntryPoint DD _ToUserCode - m16Start
@ -147,7 +152,7 @@ _ToUserCode PROC
wrmsr wrmsr
mov cr4, rbp mov cr4, rbp
mov ss, esi ; set up 16-bit stack segment mov ss, esi ; set up 16-bit stack segment
xchg sp, bx ; set up 16-bit stack pointer mov sp, bx ; set up 16-bit stack pointer
DB 66h DB 66h
call @Base ; push eip call @Base ; push eip
@Base: @Base:
@ -157,11 +162,6 @@ _ToUserCode PROC
push rax push rax
retf retf
@RealMode: @RealMode:
DB 6ah, DATA32
DB 2eh ; cs:
pop [rsi + (SavedSs - @Base)]
DB 2eh ; cs:
mov [rsi + (SavedEsp - @Base)], bx
DB 66h, 2eh ; CS and operand size override DB 66h, 2eh ; CS and operand size override
lidt fword ptr [rsi + (_16Idtr - @Base)] lidt fword ptr [rsi + (_16Idtr - @Base)]
DB 66h, 61h ; popad DB 66h, 61h ; popad
@ -232,8 +232,7 @@ InternalAsmThunk16 PROC USES rbp rbx rsi rdi
mov eax, edx ; eax <- transition code address mov eax, edx ; eax <- transition code address
and edx, 0fh and edx, 0fh
shl eax, 12 shl eax, 12
lea edx, [rdx + (_BackFromUserCode - m16Start)] lea ax, [rdx + (_BackFromUserCode - m16Start)]
mov ax, dx
stosd ; [edi] <- return address of user code stosd ; [edi] <- return address of user code
sgdt fword ptr [rcx + (SavedGdt - SavedCr4)] sgdt fword ptr [rcx + (SavedGdt - SavedCr4)]
sidt fword ptr [rsp + 38h] ; save IDT stack in argument space sidt fword ptr [rsp + 38h] ; save IDT stack in argument space
@ -250,7 +249,14 @@ InternalAsmThunk16 PROC USES rbp rbx rsi rdi
mov ss, edx mov ss, edx
pushfq pushfq
lea edx, [rdx + DATA16 - DATA32] lea edx, [rdx + DATA16 - DATA32]
call fword ptr [rcx + (_EntryPoint - SavedCr4)] lea r8, @RetFromRealMode
mov [rcx + (SavedRip - SavedCr4)], r8
mov r8d, cs
mov [rcx + (SavedCs - SavedCr4)], r8w
mov r8, rsp
jmp fword ptr [rcx + (_EntryPoint - SavedCr4)]
@RetFromRealMode:
mov rsp, r8
popfq popfq
lidt fword ptr [rsp + 38h] ; restore protected mode IDTR lidt fword ptr [rsp + 38h] ; restore protected mode IDTR
lea eax, [rbp - sizeof (IA32_REGS)] lea eax, [rbp - sizeof (IA32_REGS)]