call @Base ; push eip\r
@Base:\r
pop bp ; ebp <- offset @Base\r
+ DB 67h ; address size override\r
+ push [esp + sizeof (IA32_REGS) + 2]\r
+ lea eax, [esi + (offset @RealMode - offset @Base)]\r
+ push eax\r
+ retf\r
+@RealMode:\r
mov cs:[esi + (offset SavedSs - offset @Base)], edx\r
mov cs:[esi + (offset SavedEsp - offset @Base)], bx\r
DB 66h\r
push 10h\r
pop ecx ; ecx <- selector for data segments\r
lgdt fword ptr [edx + (offset _16Gdtr - offset SavedCr0)]\r
+ pushfd\r
call fword ptr [edx + (offset _EntryPoint - offset SavedCr0)]\r
+ popfd\r
lidt fword ptr [esp + 36] ; restore protected mode IDTR\r
lea eax, [ebp - sizeof (IA32_REGS)]\r
ret\r