[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 06/31] OvmfPkg/XenResetVector: Add new entry point for Xen PVH



On Thu, Apr 11, 2019 at 01:52:27PM +0100, Andrew Cooper wrote:
> On 09/04/2019 12:08, Anthony PERARD wrote:
> > diff --git a/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm 
> > b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
> > new file mode 100644
> > index 0000000000..c4802bf4d1
> > --- /dev/null
> > +++ b/OvmfPkg/XenResetVector/Ia32/XenPVHMain.asm
> > @@ -0,0 +1,47 @@
> > +;------------------------------------------------------------------------------
> > +; @file
> > +; An entry point use by Xen when a guest is started in PVH mode.
> > +;
> > +; Copyright (c) 2019, Citrix Systems, Inc.
> > +;
> > +; This program and the accompanying materials are licensed and made 
> > available
> > +; under the terms and conditions of the BSD License which accompanies this
> > +; distribution.  The full text of the license may be found at
> > +; http://opensource.org/licenses/bsd-license.php
> > +;
> > +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
> > WITHOUT
> > +; WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> > +;
> > +;------------------------------------------------------------------------------
> > +
> > +BITS    32
> > +
> > +xenPVHMain:
> > +    mov     di, 'BP'
> > +
> > +    ; ESP -  Initial value of the EAX register (BIST: Built-in Self Test)
> > +    mov     esp, eax
> 
> Where is the ABI described?  Xen has no BIST, so this will always have
> the value 0. Stashing it in the stack pointer seems like a weird choice,
> and a recipe for subtle bugs.

I've just copied over what was done in the HVM case. I'll change that
and ignore the value in `eax'.

> > +
> > +    cli
> 
> Interrupts are guaranteed to be off at this point.

OK, I'll remove the instruction.

> > +
> > +    mov     ebx, ADDR_OF(gdtr)
> > +    lgdt    [ebx]
> 
> lgdt ADDR_OF(gdtr), presumably?
> 
> This is 32bit code - there is no need for any indirection through
> registers for memory operands.

I'll change this, if it works.

> > +
> > +    mov     eax, SEC_DEFAULT_CR0
> > +    mov     cr0, eax
> > +
> > +    jmp     LINEAR_CODE_SEL:ADDR_OF(.jmpToNewCodeSeg)
> > +.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
> > +
> > +    ; return to the Main16
> > +    OneTimeCallRet TransitionFromReal16To32BitFlat
> 
> Is there any description of what OneTimeCallRet is, and why a simple jmp
> wont do?

That's is used to return to where the `OneTimeCall' macro has been
used. In this assembly, they don't use `call' and `ret', instead there
is a set of two macros:

%macro  OneTimeCall 1
    jmp     %1
%1 %+ OneTimerCallReturn:
%endmacro

%macro  OneTimeCallRet 1
    jmp     %1 %+ OneTimerCallReturn
%endmacro


> Irrespective of that, you're moving to a function whose name suggests it
> is in 16bit mode, while you are currently in 32bit flat mode. 
> (SEC_DEFAULT_CR0 has PE set, and LINEAR_SEL is 32bit flat.  This clearly
> isn't correct, but surely we want to skip all the 16bit setup, as well.

I think I need to change the comment. Main16 is just a label name for
something that makes several "calls" and transition from 16bits to 32 or
64 before calling the next module in the firmware.

That return simply jmp to the part of the main where we are supposed to
be in 32bit flat mode.

Thanks for the review,

-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.