; These are global constant to convey information to C code.\r
;\r
ASM_PFX(m16Size) DW InternalAsmThunk16 - ASM_PFX(m16Start)\r
-ASM_PFX(mThunk16Attr) DW _ThunkAttr - ASM_PFX(m16Start)\r
+ASM_PFX(mThunk16Attr) DW _BackFromUserCode.ThunkAttr - ASM_PFX(m16Start)\r
ASM_PFX(m16Gdt) DW _NullSeg - ASM_PFX(m16Start)\r
ASM_PFX(m16GdtrBase) DW _16GdtrBase - ASM_PFX(m16Start)\r
ASM_PFX(mTransition) DW _EntryPoint - ASM_PFX(m16Start)\r
DB 16h ; push ss\r
DB 0eh ; push cs\r
DB 66h\r
- call @Base ; push eip\r
-@Base:\r
+ call .Base ; push eip\r
+.Base:\r
DB 66h\r
push 0 ; reserved high order 32 bits of EFlags\r
pushfw ; pushfd actually\r
DB 1eh ; push ds\r
DB 66h, 60h ; pushad\r
DB 66h, 0bah ; mov edx, imm32\r
-_ThunkAttr: dd 0\r
+.ThunkAttr: dd 0\r
test dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15\r
- jz @1\r
+ jz .1\r
mov eax, 15cd2401h ; mov ax, 2401h & int 15h\r
cli ; disable interrupts\r
- jnc @2\r
-@1:\r
+ jnc .2\r
+.1:\r
test dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL\r
- jz @2\r
+ jz .2\r
in al, 92h\r
or al, 2\r
out 92h, al ; deactivate A20M#\r
-@2:\r
+.2:\r
xor ax, ax ; xor eax, eax\r
mov eax, ss ; mov ax, ss\r
lea bp, [esp + IA32_REGS.size]\r
add bp, ax ; add ebp, eax\r
mov ax, cs\r
shl ax, 4\r
- lea ax, [eax + ebx + (@64BitCode - @Base)]\r
- DB 66h, 2eh, 89h, 87h ; mov cs:[bx + (@64Eip - @Base)], eax\r
- DW @64Eip - @Base\r
+ lea ax, [eax + ebx + (.64BitCode - .Base)]\r
+ DB 66h, 2eh, 89h, 87h ; mov cs:[bx + (.64Eip - .Base)], eax\r
+ DW .64Eip - .Base\r
DB 66h, 0b8h ; mov eax, imm32\r
-SavedCr4: DD 0\r
+.SavedCr4: DD 0\r
mov cr4, rax\r
;\r
; rdi in the instruction below is indeed bx in 16-bit code\r
;\r
DB 66h, 2eh ; 2eh is "cs:" segment override\r
- lgdt [rdi + (SavedGdt - @Base)]\r
+ lgdt [rdi + (SavedGdt - .Base)]\r
DB 66h\r
mov ecx, 0c0000080h\r
rdmsr\r
or ah, 1\r
wrmsr\r
DB 66h, 0b8h ; mov eax, imm32\r
-SavedCr0: DD 0\r
+.SavedCr0: DD 0\r
mov cr0, rax\r
- DB 66h, 0eah ; jmp far cs:@64Bit\r
-@64Eip: DD 0\r
-SavedCs: DW 0\r
-@64BitCode:\r
+ DB 66h, 0eah ; jmp far cs:.64Bit\r
+.64Eip: DD 0\r
+.SavedCs: DW 0\r
+.64BitCode:\r
db 090h \r
db 048h, 0bch ; mov rsp, imm64\r
-SavedSp: DQ 0 ; restore stack\r
+.SavedSp: DQ 0 ; restore stack\r
nop\r
ret\r
\r
mov ss, esi ; set up 16-bit stack segment\r
mov sp, bx ; set up 16-bit stack pointer\r
DB 66h ; make the following call 32-bit\r
- call @ToUserCodeBase ; push eip\r
-@ToUserCodeBase:\r
- pop bp ; ebp <- address of @ToUserCodeBase\r
+ call .Base ; push eip\r
+.Base:\r
+ pop bp ; ebp <- address of .Base\r
push qword [esp + IA32_REGS.size + 2]\r
- lea eax, [rsi + (@RealMode - @ToUserCodeBase)] ; rsi is "bp" in 16-bit code\r
+ lea eax, [rsi + (.RealMode - .Base)] ; rsi is "bp" in 16-bit code\r
push rax\r
retf ; execution begins at next instruction\r
-@RealMode:\r
+.RealMode:\r
DB 66h, 2eh ; CS and operand size override\r
- lidt [rsi + (_16Idtr - @ToUserCodeBase)]\r
+ lidt [rsi + (_16Idtr - .Base)]\r
DB 66h, 61h ; popad\r
DB 1fh ; pop ds\r
DB 07h ; pop es\r
add edi, eax ; edi <- linear address of 16-bit stack\r
pop rcx\r
rep movsd ; copy RegSet\r
- lea ecx, [rdx + (SavedCr4 - ASM_PFX(m16Start))]\r
+ lea ecx, [rdx + (_BackFromUserCode.SavedCr4 - ASM_PFX(m16Start))]\r
mov eax, edx ; eax <- transition code address\r
and edx, 0fh\r
shl eax, 12 ; segment address in high order 16 bits\r
\r
sgdt [rsp + 60h] ; save GDT stack in argument space\r
movzx r10, word [rsp + 60h] ; r10 <- GDT limit \r
- lea r11, [rcx + (InternalAsmThunk16 - SavedCr4) + 0xf]\r
+ lea r11, [rcx + (InternalAsmThunk16 - _BackFromUserCode.SavedCr4) + 0xf]\r
and r11, ~0xf ; r11 <- 16-byte aligned shadowed GDT table in real mode buffer\r
\r
- mov [rcx + (SavedGdt - SavedCr4)], r10w ; save the limit of shadowed GDT table\r
- mov [rcx + (SavedGdt - SavedCr4) + 2], r11 ; save the base address of shadowed GDT table\r
+ mov [rcx + (SavedGdt - _BackFromUserCode.SavedCr4)], r10w ; save the limit of shadowed GDT table\r
+ mov [rcx + (SavedGdt - _BackFromUserCode.SavedCr4) + 2], r11 ; save the base address of shadowed GDT table\r
\r
mov rsi, [rsp + 62h] ; rsi <- the original GDT base address\r
xchg rcx, r10 ; save rcx to r10 and initialize rcx to be the limit of GDT table\r
\r
sidt [rsp + 50h] ; save IDT stack in argument space\r
mov rax, cr0\r
- mov [rcx + (SavedCr0 - SavedCr4)], eax\r
+ mov [rcx + (_BackFromUserCode.SavedCr0 - _BackFromUserCode.SavedCr4)], eax\r
and eax, 7ffffffeh ; clear PE, PG bits\r
mov rbp, cr4\r
- mov [rcx], ebp ; save CR4 in SavedCr4\r
+ mov [rcx], ebp ; save CR4 in _BackFromUserCode.SavedCr4\r
and ebp, ~30h ; clear PAE, PSE bits\r
mov esi, r8d ; esi <- 16-bit stack segment\r
DB 6ah, DATA32 ; push DATA32\r
pop rdx ; rdx <- 32-bit data segment selector\r
- lgdt [rcx + (_16Gdtr - SavedCr4)]\r
+ lgdt [rcx + (_16Gdtr - _BackFromUserCode.SavedCr4)]\r
mov ss, edx\r
pushfq\r
lea edx, [rdx + DATA16 - DATA32]\r
- lea r8, [REL @RetFromRealMode]\r
+ lea r8, [REL .RetFromRealMode]\r
push r8\r
mov r8d, cs\r
- mov [rcx + (SavedCs - SavedCr4)], r8w\r
- mov [rcx + (SavedSp - SavedCr4)], rsp\r
- jmp dword far [rcx + (_EntryPoint - SavedCr4)]\r
-@RetFromRealMode:\r
+ mov [rcx + (_BackFromUserCode.SavedCs - _BackFromUserCode.SavedCr4)], r8w\r
+ mov [rcx + (_BackFromUserCode.SavedSp - _BackFromUserCode.SavedCr4)], rsp\r
+ jmp dword far [rcx + (_EntryPoint - _BackFromUserCode.SavedCr4)]\r
+.RetFromRealMode:\r
popfq\r
lgdt [rsp + 60h] ; restore protected mode GDTR\r
lidt [rsp + 50h] ; restore protected mode IDTR\r