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:
Andrew Cooper committed 2023-08-03 19:14:19 +01:00
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;
+2 -1
View File
@@ -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>
+80 -1
View File
@@ -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.
*
-104
View File
@@ -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
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.