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

Re: [Xen-devel] [PATCH] libxc: create an initial FPU state for HVM guests



On 13/10/15 14:32, Roger Pau Monne wrote:
> Xen always set the FPU as initialized when loading a HVM context, so libxc
> has to provide a valid FPU context when setting the CPU registers.
>
> Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>

It should be noted that this is the root cause for the current issue
OSSTest has identified while booting windows.

Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

This will do until we fix the hvm save/load code properly.

> ---
>  tools/libxc/xc_dom_x86.c | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
>
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index dd331bf..f8d580c 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -841,6 +841,23 @@ static int vcpu_hvm(struct xc_dom_image *dom)
>          struct hvm_save_descriptor end_d;
>          HVM_SAVE_TYPE(END) end;
>      } bsp_ctx;
> +    struct {
> +        uint16_t fcw;
> +        uint16_t fsw;
> +        uint8_t ftw;
> +        uint8_t rsvd1;
> +        uint16_t fop;
> +        union {
> +            uint64_t addr;
> +            struct {
> +                uint32_t offs;
> +                uint16_t sel;
> +                uint16_t rsvd;
> +            };
> +        } fip, fdp;
> +        uint32_t mxcsr;
> +        uint32_t mxcsr_mask;
> +    } *fpu_ctxt;
>      uint8_t *full_ctx = NULL;
>      int rc;
>  
> @@ -908,6 +925,23 @@ static int vcpu_hvm(struct xc_dom_image *dom)
>      /* Set the control registers. */
>      bsp_ctx.cpu.cr0 = X86_CR0_PE | X86_CR0_ET;
>  
> +    /*
> +     * XXX: Set initial FPU state.
> +     *
> +     * This should be removed once Xen is able to know if the
> +     * FPU state saved is valid or not, now Xen always sets
> +     * fpu_initialised to true regardless of the FPU state.
> +     *
> +     * The code below mimics the FPU sate after executing
> +     * fninit
> +     * ldmxcsr 0x1f80
> +     */
> +    fpu_ctxt = (typeof(fpu_ctxt))bsp_ctx.cpu.fpu_regs;
> +
> +    fpu_ctxt->fcw = 0x37f;
> +    fpu_ctxt->ftw = 0xff;
> +    fpu_ctxt->mxcsr = 0x1f80;
> +
>      /* Set the IP. */
>      bsp_ctx.cpu.rip = dom->parms.phys_entry;
>  


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

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