]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
OvmfPkg/XenResetVector: Allow jumpstart from either hvmloader or PVH
[mirror_edk2.git] / OvmfPkg / XenResetVector / Ia32 / XenPVHMain.asm
index f42df3dba2c0f8acb1f967ee68acf89e3d32e303..2df0f12e18cb81e95b45e328c1e3875544e37e5e 100644 (file)
@@ -16,25 +16,42 @@ xenPVHMain:
     ;\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
@@ -47,6 +64,18 @@ xenPVHMain:
     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