;------------------------------------------------------------------------------ | |
; @file | |
; An entry point use by Xen when a guest is started in PVH mode. | |
; | |
; Copyright (c) 2019, Citrix Systems, Inc. | |
; | |
; SPDX-License-Identifier: BSD-2-Clause-Patent | |
; | |
;------------------------------------------------------------------------------ | |
BITS 32 | |
xenPVHMain: | |
; | |
; 'BP' to indicate boot-strap processor | |
; | |
mov di, 'BP' | |
; | |
; Store "Start of day" struct pointer for later use | |
; | |
mov dword[PVH_SPACE (0)], ebx | |
mov dword[PVH_SPACE (4)], 'XPVH' | |
; | |
; calculate delta between build-addr and run position | |
; | |
mov esp, PVH_SPACE(16) ; create a temporary stack | |
call .delta | |
.delta: | |
pop edx ; get addr of .delta | |
sub edx, ADDR_OF(.delta) ; calculate delta | |
; | |
; Find address of GDT and gdtr and fix the later | |
; | |
mov ebx, ADDR_OF(gdtr) | |
add ebx, edx ; add delta gdtr | |
mov eax, ADDR_OF(GDT_BASE) | |
add eax, edx ; add delta to GDT_BASE | |
mov dword[ebx + 2], eax ; fix GDT_BASE addr in gdtr | |
lgdt [ebx] | |
mov eax, SEC_DEFAULT_CR0 | |
mov cr0, eax | |
; | |
; push return addr to the stack, then return far | |
; | |
push dword LINEAR_CODE_SEL ; segment to select | |
mov eax, ADDR_OF(.jmpToNewCodeSeg) ; return addr | |
add eax, edx ; add delta to return addr | |
push eax | |
retf | |
.jmpToNewCodeSeg: | |
mov eax, SEC_DEFAULT_CR4 | |
mov cr4, eax | |
mov ax, LINEAR_SEL | |
mov ds, ax | |
mov es, ax | |
mov fs, ax | |
mov gs, ax | |
mov ss, ax | |
; | |
; ESP will be used as initial value of the EAX register | |
; in Main.asm | |
; | |
xor esp, esp | |
; | |
; parameter for Flat32SearchForBfvBase | |
; | |
mov eax, 0 ; ADDR_OF(fourGigabytes) | |
add eax, edx ; add delta | |
; | |
; Jump to the main routine of the pre-SEC code | |
; skiping the 16-bit part of the routine and | |
; into the 32-bit flat mode part | |
; | |
OneTimeCallRet TransitionFromReal16To32BitFlat |