git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1541
6f19259b-4bc3-4df7-8a09-
765794883524
\r
m16Size DW InternalAsmThunk16 - m16Start\r
mThunk16Attr DW _ThunkAttr - m16Start\r
\r
m16Size DW InternalAsmThunk16 - m16Start\r
mThunk16Attr DW _ThunkAttr - m16Start\r
-m16Gdt DW _NullSegDesc - m16Start\r
+m16Gdt DW _NullSeg - m16Start\r
m16GdtrBase DW _16GdtrBase - m16Start\r
mTransition DW _EntryPoint - m16Start\r
\r
m16GdtrBase DW _16GdtrBase - m16Start\r
mTransition DW _EntryPoint - m16Start\r
\r
_BackFromUserCode ENDP\r
\r
_EntryPoint DD _ToUserCode - m16Start\r
_BackFromUserCode ENDP\r
\r
_EntryPoint DD _ToUserCode - m16Start\r
- DW GdtEnd - _NullSegDesc - 1\r
-_16GdtrBase DQ _NullSegDesc\r
+ DW GDT_SIZE - 1\r
+_16GdtrBase DQ _NullSeg\r
_16Idtr FWORD (1 SHL 10) - 1\r
\r
;------------------------------------------------------------------------------\r
_16Idtr FWORD (1 SHL 10) - 1\r
\r
;------------------------------------------------------------------------------\r
; It will be shadowed to somewhere in memory below 1MB.\r
;------------------------------------------------------------------------------\r
_ToUserCode PROC\r
; It will be shadowed to somewhere in memory below 1MB.\r
;------------------------------------------------------------------------------\r
_ToUserCode PROC\r
mov ss, edx ; set new segment selectors\r
mov ds, edx\r
mov es, edx\r
mov ss, edx ; set new segment selectors\r
mov ds, edx\r
mov es, edx\r
push rax\r
retf\r
@RealMode:\r
push rax\r
retf\r
@RealMode:\r
- mov [rsi + (SavedSs - @Base)], edi\r
+ pop [rsi + (SavedSs - @Base)]\r
DB 2eh ; cs:\r
mov [rsi + (SavedEsp - @Base)], bx\r
DB 66h, 2eh ; CS and operand size override\r
DB 2eh ; cs:\r
mov [rsi + (SavedEsp - @Base)], bx\r
DB 66h, 2eh ; CS and operand size override\r
retf ; transfer control to user code\r
_ToUserCode ENDP\r
\r
retf ; transfer control to user code\r
_ToUserCode ENDP\r
\r
-_NullSegDesc DQ 0\r
-_16CsDesc LABEL QWORD\r
- DW -1\r
- DW 0\r
- DB 0\r
- DB 9bh\r
- DB 8fh ; 16-bit segment, 4GB limit\r
- DB 0\r
-_16DsDesc LABEL QWORD\r
- DW -1\r
- DW 0\r
- DB 0\r
- DB 93h\r
- DB 8fh ; 16-bit segment, 4GB limit\r
- DB 0\r
-GdtEnd LABEL QWORD\r
+CODE16 = _16Code - $\r
+DATA16 = _16Data - $\r
+DATA32 = _32Data - $\r
+\r
+_NullSeg DQ 0\r
+_16Code LABEL QWORD\r
+ DW -1\r
+ DW 0\r
+ DB 0\r
+ DB 9bh\r
+ DB 8fh ; 16-bit segment, 4GB limit\r
+ DB 0\r
+_16Data LABEL QWORD\r
+ DW -1\r
+ DW 0\r
+ DB 0\r
+ DB 93h\r
+ DB 8fh ; 16-bit segment, 4GB limit\r
+ DB 0\r
+_32Data LABEL QWORD\r
+ DW -1\r
+ DW 0\r
+ DB 0\r
+ DB 93h\r
+ DB 0cfh ; 16-bit segment, 4GB limit\r
+ DB 0\r
+\r
+GDT_SIZE = $ - _NullSeg\r
\r
;------------------------------------------------------------------------------\r
; IA32_REGISTER_SET *\r
\r
;------------------------------------------------------------------------------\r
; IA32_REGISTER_SET *\r
InternalAsmThunk16 PROC USES rbp rbx rsi rdi\r
mov r10d, ds\r
mov r11d, es\r
InternalAsmThunk16 PROC USES rbp rbx rsi rdi\r
mov r10d, ds\r
mov r11d, es\r
push fs\r
push gs\r
mov rsi, rcx\r
push fs\r
push gs\r
mov rsi, rcx\r
mov [rcx], ebp ; save CR4 in SavedCr4\r
and ebp, 300h ; clear all but PCE and OSFXSR bits\r
mov esi, r8d ; esi <- 16-bit stack segment\r
mov [rcx], ebp ; save CR4 in SavedCr4\r
and ebp, 300h ; clear all but PCE and OSFXSR bits\r
mov esi, r8d ; esi <- 16-bit stack segment\r
- push 10h\r
- pop rdx ; rdx <- selector for data segments\r
+ DB 6ah, DATA32 ; push DATA32\r
+ pop rdx ; rdx <- 32-bit data segment selector\r
lgdt fword ptr [rcx + (_16Gdtr - SavedCr4)]\r
lgdt fword ptr [rcx + (_16Gdtr - SavedCr4)]\r
+ lea edx, [rdx + DATA16 - DATA32]\r
call fword ptr [rcx + (_EntryPoint - SavedCr4)]\r
popfq\r
lidt fword ptr [rsp + 38h] ; restore protected mode IDTR\r
lea eax, [rbp - sizeof (IA32_REGS)]\r
pop gs\r
pop fs\r
call fword ptr [rcx + (_EntryPoint - SavedCr4)]\r
popfq\r
lidt fword ptr [rsp + 38h] ; restore protected mode IDTR\r
lea eax, [rbp - sizeof (IA32_REGS)]\r
pop gs\r
pop fs\r
mov es, r11d\r
mov ds, r10d\r
ret\r
mov es, r11d\r
mov ds, r10d\r
ret\r