;\r
mov di, 'BP'\r
\r
- ;\r
- ; ESP will be used as initial value of the EAX register\r
- ; in Main.asm\r
- ;\r
- xor esp, esp\r
-\r
;\r
; Store "Start of day" struct pointer for later use\r
;\r
mov dword[PVH_SPACE (0)], ebx\r
mov dword[PVH_SPACE (4)], 'XPVH'\r
\r
+ ;\r
+ ; calculate delta between build-addr and run position\r
+ ;\r
+ mov esp, PVH_SPACE(16) ; create a temporary stack\r
+ call .delta\r
+.delta:\r
+ pop edx ; get addr of .delta\r
+ sub edx, ADDR_OF(.delta) ; calculate delta\r
+\r
+ ;\r
+ ; Find address of GDT and gdtr and fix the later\r
+ ;\r
mov ebx, ADDR_OF(gdtr)\r
+ add ebx, edx ; add delta gdtr\r
+ mov eax, ADDR_OF(GDT_BASE)\r
+ add eax, edx ; add delta to GDT_BASE\r
+ mov dword[ebx + 2], eax ; fix GDT_BASE addr in gdtr\r
lgdt [ebx]\r
\r
mov eax, SEC_DEFAULT_CR0\r
mov cr0, eax\r
\r
- jmp LINEAR_CODE_SEL:ADDR_OF(.jmpToNewCodeSeg)\r
+ ;\r
+ ; push return addr to the stack, then return far\r
+ ;\r
+ push dword LINEAR_CODE_SEL ; segment to select\r
+ mov eax, ADDR_OF(.jmpToNewCodeSeg) ; return addr\r
+ add eax, edx ; add delta to return addr\r
+ push eax\r
+ retf\r
.jmpToNewCodeSeg:\r
\r
mov eax, SEC_DEFAULT_CR4\r
mov gs, ax\r
mov ss, ax\r
\r
+ ;\r
+ ; ESP will be used as initial value of the EAX register\r
+ ; in Main.asm\r
+ ;\r
+ xor esp, esp\r
+\r
+ ;\r
+ ; parameter for Flat32SearchForBfvBase\r
+ ;\r
+ mov eax, ADDR_OF(fourGigabytes)\r
+ add eax, edx ; add delta\r
+\r
;\r
; Jump to the main routine of the pre-SEC code\r
; skiping the 16-bit part of the routine and\r