;------------------------------------------------------------------------------ ; @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