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