mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: Merge struct msr_policy into struct cpu_policy
As with the cpuid side, use a temporary define to make struct msr_policy still
work.
Note, this means that domains now have two separate struct cpu_policy
allocations with disjoint information, and system policies are in a similar
position, as well as xc_cpu_policy objects in libxenguest. All of these
duplications will be addressed in the following patches.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit 03812da375)
This commit is contained in:
1 parent
2e54fb9fec
commit
63e4aa3d3b
5 files changed
+83
-108
No files matched your search
@@ -10,7 +10,6 @@
|
||||
|
||||
#include <xen-tools/libs.h>
|
||||
#include <xen/lib/x86/cpu-policy.h>
|
||||
#include <xen/lib/x86/msr.h>
|
||||
#include <xen/domctl.h>
|
||||
|
||||
static bool debug;
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
#include <xen/types.h>
|
||||
#include <xen/percpu.h>
|
||||
#include <xen/errno.h>
|
||||
#include <xen/kernel.h>
|
||||
|
||||
#include <xen/lib/x86/msr.h>
|
||||
#include <xen/lib/x86/cpu-policy.h>
|
||||
|
||||
#include <asm/asm_defns.h>
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#define XEN_LIB_X86_POLICIES_H
|
||||
|
||||
#include <xen/lib/x86/cpuid-autogen.h>
|
||||
#include <xen/lib/x86/msr.h>
|
||||
|
||||
#define FEATURESET_1d 0 /* 0x00000001.edx */
|
||||
#define FEATURESET_1c 1 /* 0x00000001.ecx */
|
||||
@@ -107,6 +106,9 @@ const char *x86_cpuid_vendor_to_str(unsigned int vendor);
|
||||
CPUID_GUEST_NR_XSTATE - !!CPUID_GUEST_NR_XSTATE + \
|
||||
CPUID_GUEST_NR_EXTD + 2 /* hv_limit and hv2_limit */ )
|
||||
|
||||
/* Maximum number of MSRs written when serialising a cpu_policy. */
|
||||
#define MSR_MAX_SERIALISED_ENTRIES 2
|
||||
|
||||
struct cpu_policy
|
||||
{
|
||||
#define DECL_BITFIELD(word) _DECL_BITFIELD(FEATURESET_ ## word)
|
||||
@@ -324,6 +326,44 @@ struct cpu_policy
|
||||
};
|
||||
} extd;
|
||||
|
||||
/*
|
||||
* 0x000000ce - MSR_INTEL_PLATFORM_INFO
|
||||
*
|
||||
* This MSR is non-architectural, but for simplicy we allow it to be read
|
||||
* unconditionally. CPUID Faulting support can be fully emulated for HVM
|
||||
* guests so can be offered unconditionally, while support for PV guests
|
||||
* is dependent on real hardware support.
|
||||
*/
|
||||
union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
uint32_t :31;
|
||||
bool cpuid_faulting:1;
|
||||
};
|
||||
} platform_info;
|
||||
|
||||
/*
|
||||
* 0x0000010a - MSR_ARCH_CAPABILITIES
|
||||
*
|
||||
* This is an Intel-only MSR, which provides miscellaneous enumeration,
|
||||
* including those which indicate that microarchitectrual sidechannels are
|
||||
* fixed in hardware.
|
||||
*/
|
||||
union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
bool rdcl_no:1;
|
||||
bool ibrs_all:1;
|
||||
bool rsba:1;
|
||||
bool skip_l1dfl:1;
|
||||
bool ssb_no:1;
|
||||
bool mds_no:1;
|
||||
bool if_pschange_mc_no:1;
|
||||
bool tsx_ctrl:1;
|
||||
bool taa_no:1;
|
||||
};
|
||||
} arch_caps;
|
||||
|
||||
#undef __DECL_BITFIELD
|
||||
#undef _DECL_BITFIELD
|
||||
#undef DECL_BITFIELD
|
||||
@@ -337,6 +377,7 @@ struct cpu_policy
|
||||
|
||||
/* Temporary */
|
||||
#define cpuid_policy cpu_policy
|
||||
#define msr_policy cpu_policy
|
||||
|
||||
struct old_cpu_policy
|
||||
{
|
||||
@@ -438,9 +479,11 @@ void x86_cpuid_policy_clear_out_of_range_leaves(struct cpuid_policy *p);
|
||||
#ifdef __XEN__
|
||||
#include <public/arch-x86/xen.h>
|
||||
typedef XEN_GUEST_HANDLE_64(xen_cpuid_leaf_t) cpuid_leaf_buffer_t;
|
||||
typedef XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_entry_buffer_t;
|
||||
#else
|
||||
#include <xen/arch-x86/xen.h>
|
||||
typedef xen_cpuid_leaf_t cpuid_leaf_buffer_t[];
|
||||
typedef xen_msr_entry_t msr_entry_buffer_t[];
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -480,6 +523,42 @@ int x86_cpuid_copy_from_buffer(struct cpuid_policy *policy,
|
||||
uint32_t nr_entries, uint32_t *err_leaf,
|
||||
uint32_t *err_subleaf);
|
||||
|
||||
/**
|
||||
* Serialise an msr_policy object into an array.
|
||||
*
|
||||
* @param policy The msr_policy to serialise.
|
||||
* @param msrs The array of msrs to serialise into.
|
||||
* @param nr_entries The number of entries in 'msrs'.
|
||||
* @returns -errno
|
||||
*
|
||||
* Writes at most MSR_MAX_SERIALISED_ENTRIES. May fail with -ENOBUFS if the
|
||||
* buffer array is too short. On success, nr_entries is updated with the
|
||||
* actual number of msrs written.
|
||||
*/
|
||||
int x86_msr_copy_to_buffer(const struct msr_policy *policy,
|
||||
msr_entry_buffer_t msrs, uint32_t *nr_entries);
|
||||
|
||||
/**
|
||||
* Unserialise an msr_policy object from an array of msrs.
|
||||
*
|
||||
* @param policy The msr_policy object to unserialise into.
|
||||
* @param msrs The array of msrs to unserialise from.
|
||||
* @param nr_entries The number of entries in 'msrs'.
|
||||
* @param err_msr Optional hint for error diagnostics.
|
||||
* @returns -errno
|
||||
*
|
||||
* Reads at most MSR_MAX_SERIALISED_ENTRIES. May fail for a number of reasons
|
||||
* based on the content in an individual 'msrs' entry, including the MSR index
|
||||
* not being valid in the policy, the flags field being nonzero, or if the
|
||||
* value provided would truncate when stored in the policy. In such cases,
|
||||
* the optional err_* pointer will identify the problematic MSR.
|
||||
*
|
||||
* No content validation is performed on the data stored in the policy object.
|
||||
*/
|
||||
int x86_msr_copy_from_buffer(struct msr_policy *policy,
|
||||
const msr_entry_buffer_t msrs, uint32_t nr_entries,
|
||||
uint32_t *err_msr);
|
||||
|
||||
/*
|
||||
* Calculate whether two policies are compatible.
|
||||
*
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
/* Common data structures and functions consumed by hypervisor and toolstack */
|
||||
#ifndef XEN_LIB_X86_MSR_H
|
||||
#define XEN_LIB_X86_MSR_H
|
||||
|
||||
/* Maximum number of MSRs written when serialising msr_policy. */
|
||||
#define MSR_MAX_SERIALISED_ENTRIES 2
|
||||
|
||||
/* MSR policy object for shared per-domain MSRs */
|
||||
struct msr_policy
|
||||
{
|
||||
/*
|
||||
* 0x000000ce - MSR_INTEL_PLATFORM_INFO
|
||||
*
|
||||
* This MSR is non-architectural, but for simplicy we allow it to be read
|
||||
* unconditionally. CPUID Faulting support can be fully emulated for HVM
|
||||
* guests so can be offered unconditionally, while support for PV guests
|
||||
* is dependent on real hardware support.
|
||||
*/
|
||||
union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
uint32_t :31;
|
||||
bool cpuid_faulting:1;
|
||||
};
|
||||
} platform_info;
|
||||
|
||||
/*
|
||||
* 0x0000010a - MSR_ARCH_CAPABILITIES
|
||||
*
|
||||
* This is an Intel-only MSR, which provides miscellaneous enumeration,
|
||||
* including those which indicate that microarchitectrual sidechannels are
|
||||
* fixed in hardware.
|
||||
*/
|
||||
union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
bool rdcl_no:1;
|
||||
bool ibrs_all:1;
|
||||
bool rsba:1;
|
||||
bool skip_l1dfl:1;
|
||||
bool ssb_no:1;
|
||||
bool mds_no:1;
|
||||
bool if_pschange_mc_no:1;
|
||||
bool tsx_ctrl:1;
|
||||
bool taa_no:1;
|
||||
};
|
||||
} arch_caps;
|
||||
};
|
||||
|
||||
#ifdef __XEN__
|
||||
#include <public/arch-x86/xen.h>
|
||||
typedef XEN_GUEST_HANDLE_64(xen_msr_entry_t) msr_entry_buffer_t;
|
||||
#else
|
||||
#include <xen/arch-x86/xen.h>
|
||||
typedef xen_msr_entry_t msr_entry_buffer_t[];
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Serialise an msr_policy object into an array.
|
||||
*
|
||||
* @param policy The msr_policy to serialise.
|
||||
* @param msrs The array of msrs to serialise into.
|
||||
* @param nr_entries The number of entries in 'msrs'.
|
||||
* @returns -errno
|
||||
*
|
||||
* Writes at most MSR_MAX_SERIALISED_ENTRIES. May fail with -ENOBUFS if the
|
||||
* buffer array is too short. On success, nr_entries is updated with the
|
||||
* actual number of msrs written.
|
||||
*/
|
||||
int x86_msr_copy_to_buffer(const struct msr_policy *policy,
|
||||
msr_entry_buffer_t msrs, uint32_t *nr_entries);
|
||||
|
||||
/**
|
||||
* Unserialise an msr_policy object from an array of msrs.
|
||||
*
|
||||
* @param policy The msr_policy object to unserialise into.
|
||||
* @param msrs The array of msrs to unserialise from.
|
||||
* @param nr_entries The number of entries in 'msrs'.
|
||||
* @param err_msr Optional hint for error diagnostics.
|
||||
* @returns -errno
|
||||
*
|
||||
* Reads at most MSR_MAX_SERIALISED_ENTRIES. May fail for a number of reasons
|
||||
* based on the content in an individual 'msrs' entry, including the MSR index
|
||||
* not being valid in the policy, the flags field being nonzero, or if the
|
||||
* value provided would truncate when stored in the policy. In such cases,
|
||||
* the optional err_* pointer will identify the problematic MSR.
|
||||
*
|
||||
* No content validation is performed on the data stored in the policy object.
|
||||
*/
|
||||
int x86_msr_copy_from_buffer(struct msr_policy *policy,
|
||||
const msr_entry_buffer_t msrs, uint32_t nr_entries,
|
||||
uint32_t *err_msr);
|
||||
|
||||
#endif /* !XEN_LIB_X86_MSR_H */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
* c-file-style: "BSD"
|
||||
* c-basic-offset: 4
|
||||
* tab-width: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
#include "private.h"
|
||||
|
||||
#include <xen/lib/x86/msr.h>
|
||||
#include <xen/lib/x86/cpu-policy.h>
|
||||
|
||||
/*
|
||||
* Copy a single MSR into the provided msr_entry_buffer_t buffer, performing a
|
||||
|
||||