mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/hvm: add HVM_PARAM_X87_FIP_WIDTH
The HVM parameter HVM_PARAM_X87_FIP_WIDTH to allow tools and the guest to adjust the width of the FIP/FDP registers to be saved/restored by the hypervisor. This is in case the hypervisor hueristics do not do the right thing. Add this parameter to the set saved during domain save/migrate. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
879b44b041
commit
5d768fb1f3
3 files changed
+37
-1
No files matched your search
@@ -76,6 +76,7 @@ static int write_hvm_params(struct xc_sr_context *ctx)
|
||||
HVM_PARAM_VM_GENERATION_ID_ADDR,
|
||||
HVM_PARAM_IOREQ_SERVER_PFN,
|
||||
HVM_PARAM_NR_IOREQ_SERVER_PAGES,
|
||||
HVM_PARAM_X87_FIP_WIDTH,
|
||||
};
|
||||
|
||||
xc_interface *xch = ctx->xch;
|
||||
|
||||
@@ -6025,6 +6025,7 @@ static int hvm_allow_set_param(struct domain *d,
|
||||
case HVM_PARAM_VM_GENERATION_ID_ADDR:
|
||||
case HVM_PARAM_STORE_EVTCHN:
|
||||
case HVM_PARAM_CONSOLE_EVTCHN:
|
||||
case HVM_PARAM_X87_FIP_WIDTH:
|
||||
break;
|
||||
/*
|
||||
* The following parameters must not be set by the guest
|
||||
@@ -6220,6 +6221,14 @@ static int hvmop_set_param(
|
||||
|
||||
break;
|
||||
}
|
||||
case HVM_PARAM_X87_FIP_WIDTH:
|
||||
if ( a.value != 0 && a.value != 4 && a.value != 8 )
|
||||
{
|
||||
rc = -EINVAL;
|
||||
break;
|
||||
}
|
||||
d->arch.x87_fip_width = a.value;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( rc != 0 )
|
||||
@@ -6256,6 +6265,7 @@ static int hvm_allow_get_param(struct domain *d,
|
||||
case HVM_PARAM_CONSOLE_PFN:
|
||||
case HVM_PARAM_CONSOLE_EVTCHN:
|
||||
case HVM_PARAM_ALTP2M:
|
||||
case HVM_PARAM_X87_FIP_WIDTH:
|
||||
break;
|
||||
/*
|
||||
* The following parameters must not be read by the guest
|
||||
@@ -6305,6 +6315,9 @@ static int hvmop_get_param(
|
||||
case HVM_PARAM_ACPI_S_STATE:
|
||||
a.value = d->arch.hvm_domain.is_s3_suspended ? 3 : 0;
|
||||
break;
|
||||
case HVM_PARAM_X87_FIP_WIDTH:
|
||||
a.value = d->arch.x87_fip_width;
|
||||
break;
|
||||
case HVM_PARAM_IOREQ_PFN:
|
||||
case HVM_PARAM_BUFIOREQ_PFN:
|
||||
case HVM_PARAM_BUFIOREQ_EVTCHN:
|
||||
|
||||
@@ -210,6 +210,28 @@
|
||||
/* Boolean: Enable altp2m */
|
||||
#define HVM_PARAM_ALTP2M 35
|
||||
|
||||
#define HVM_NR_PARAMS 36
|
||||
/*
|
||||
* Size of the x87 FPU FIP/FDP registers that the hypervisor needs to
|
||||
* save/restore. This is a workaround for a hardware limitation that
|
||||
* does not allow the full FIP/FDP and FCS/FDS to be restored.
|
||||
*
|
||||
* Valid values are:
|
||||
*
|
||||
* 8: save/restore 64-bit FIP/FDP and clear FCS/FDS (default if CPU
|
||||
* has FPCSDS feature).
|
||||
*
|
||||
* 4: save/restore 32-bit FIP/FDP, FCS/FDS, and clear upper 32-bits of
|
||||
* FIP/FDP.
|
||||
*
|
||||
* 0: allow hypervisor to choose based on the value of FIP/FDP
|
||||
* (default if CPU does not have FPCSDS).
|
||||
*
|
||||
* If FPCSDS (bit 13 in CPUID leaf 0x7, subleaf 0x0) is set, the CPU
|
||||
* never saves FCS/FDS and this parameter should be left at the
|
||||
* default of 8.
|
||||
*/
|
||||
#define HVM_PARAM_X87_FIP_WIDTH 36
|
||||
|
||||
#define HVM_NR_PARAMS 37
|
||||
|
||||
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
|
||||