DEFAULT REL\r
SECTION .text\r
\r
+BITS 16\r
global ASM_PFX(RendezvousFunnelProc)\r
ASM_PFX(RendezvousFunnelProc):\r
RendezvousFunnelProcStart:\r
\r
; At this point CS = 0x(vv00) and ip= 0x0.\r
\r
- db 0x8c, 0xc8 ; mov ax, cs\r
- db 0x8e, 0xd8 ; mov ds, ax\r
- db 0x8e, 0xc0 ; mov es, ax\r
- db 0x8e, 0xd0 ; mov ss, ax\r
- db 0x33, 0xc0 ; xor ax, ax\r
- db 0x8e, 0xe0 ; mov fs, ax\r
- db 0x8e, 0xe8 ; mov gs, ax\r
+ mov ax, cs\r
+ mov ds, ax\r
+ mov es, ax\r
+ mov ss, ax\r
+ xor ax, ax\r
+ mov fs, ax\r
+ mov gs, ax\r
\r
flat32Start:\r
\r
- db 0xBE\r
- dw BufferStartLocation ; mov si, BufferStartLocation\r
- db 0x66, 0x8B, 0x14 ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer\r
+ mov si, BufferStartLocation\r
+ mov edx,dword [si] ; EDX is keeping the start address of wakeup buffer\r
\r
- db 0xBE\r
- dw Cr3OffsetLocation ; mov si, Cr3Location\r
- db 0x66, 0x8B, 0xC ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3\r
+ mov si, Cr3OffsetLocation\r
+ mov ecx,dword [si] ; ECX is keeping the value of CR3\r
\r
- db 0xBE\r
- dw GdtrLocation ; mov si, GdtrProfile\r
- db 0x66 ; db 66h\r
- db 0x2E, 0xF, 0x1, 0x14 ; lgdt fword ptr cs:[si]\r
+ mov si, GdtrLocation\r
+o32 lgdt [cs:si]\r
\r
- db 0xBE\r
- dw IdtrLocation ; mov si, IdtrProfile\r
- db 0x66 ; db 66h\r
- db 0x2E, 0xF, 0x1, 0x1C ; lidt fword ptr cs:[si]\r
+ mov si, IdtrLocation\r
+o32 lidt [cs:si]\r
\r
- db 0x33, 0xC0 ; xor ax, ax\r
- db 0x8E, 0xD8 ; mov ds, ax\r
+ xor ax, ax\r
+ mov ds, ax\r
\r
- db 0xF, 0x20, 0xC0 ; mov eax, cr0 ; Get control register 0\r
- db 0x66, 0x83, 0xC8, 0x1 ; or eax, 000000001h ; Set PE bit (bit #0)\r
- db 0xF, 0x22, 0xC0 ; mov cr0, eax\r
+ mov eax, cr0 ; Get control register 0\r
+ or eax, 0x000000001 ; Set PE bit (bit #0)\r
+ mov cr0, eax\r
\r
FLAT32_JUMP:\r
\r
- db 0x66, 0x67, 0xEA ; far jump\r
- dd 0x0 ; 32-bit offset\r
- dw 0x20 ; 16-bit selector\r
+a32 jmp dword 0x20:0x0\r
\r
+BITS 32\r
PMODE_ENTRY: ; protected mode entry point\r
\r
- db 0x66, 0xB8, 0x18, 0x0 ; mov ax, 18h\r
- db 0x66, 0x8E, 0xD8 ; mov ds, ax\r
- db 0x66, 0x8E, 0xC0 ; mov es, ax\r
- db 0x66, 0x8E, 0xE0 ; mov fs, ax\r
- db 0x66, 0x8E, 0xE8 ; mov gs, ax\r
- db 0x66, 0x8E, 0xD0 ; mov ss, ax ; Flat mode setup.\r
+ mov ax, 0x18\r
+o16 mov ds, ax\r
+o16 mov es, ax\r
+o16 mov fs, ax\r
+o16 mov gs, ax\r
+o16 mov ss, ax ; Flat mode setup.\r
\r
- db 0xF, 0x20, 0xE0 ; mov eax, cr4\r
- db 0xF, 0xBA, 0xE8, 0x5 ; bts eax, 5\r
- db 0xF, 0x22, 0xE0 ; mov cr4, eax\r
+ mov eax, cr4\r
+ bts eax, 5\r
+ mov cr4, eax\r
\r
- db 0xF, 0x22, 0xD9 ; mov cr3, ecx\r
+ mov cr3, ecx\r
\r
- db 0x8B, 0xF2 ; mov esi, edx ; Save wakeup buffer address\r
+ mov esi, edx ; Save wakeup buffer address\r
\r
- db 0xB9\r
- dd 0xC0000080 ; mov ecx, 0c0000080h ; EFER MSR number.\r
- db 0xF, 0x32 ; rdmsr ; Read EFER.\r
- db 0xF, 0xBA, 0xE8, 0x8 ; bts eax, 8 ; Set LME=1.\r
- db 0xF, 0x30 ; wrmsr ; Write EFER.\r
+ mov ecx, 0xc0000080 ; EFER MSR number.\r
+ rdmsr ; Read EFER.\r
+ bts eax, 8 ; Set LME=1.\r
+ wrmsr ; Write EFER.\r
\r
- db 0xF, 0x20, 0xC0 ; mov eax, cr0 ; Read CR0.\r
- db 0xF, 0xBA, 0xE8, 0x1F ; bts eax, 31 ; Set PG=1.\r
- db 0xF, 0x22, 0xC0 ; mov cr0, eax ; Write CR0.\r
+ mov eax, cr0 ; Read CR0.\r
+ bts eax, 31 ; Set PG=1.\r
+ mov cr0, eax ; Write CR0.\r
\r
LONG_JUMP:\r
\r
- db 0x67, 0xEA ; far jump\r
- dd 0x0 ; 32-bit offset\r
- dw 0x38 ; 16-bit selector\r
+a16 jmp dword 0x38:0x0\r
\r
+BITS 64\r
LongModeStart:\r
\r
mov ax, 0x30\r