@@ -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;
@@ -6027,6 +6027,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
@@ -6222,6 +6223,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 )
@@ -6258,6 +6267,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
@@ -6307,6 +6317,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__ */