mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
libs/guest: Don't hide the indirection on xc_cpu_policy_t
It is bad form in C, perhaps best demonstrated by trying to read xc_cpu_policy_destroy(), and causes const qualification to have less-than-obvious behaviour (the hidden pointer becomes const, not the thing it points at). xc_cpu_policy_set_domain() needs to drop its (now normal) const qualification, as the policy object is modified by the serialisation operation. This also shows up a problem with the x86_cpu_policies_are_compatible(), where the intermediate pointers are non-const. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
e921931fec
commit
e19b01c186
4 files changed
+24
-24
No files matched your search
+11
-11
@@ -2590,33 +2590,33 @@ int xc_psr_get_domain_data(xc_interface *xch, uint32_t domid,
|
||||
int xc_psr_get_hw_info(xc_interface *xch, uint32_t socket,
|
||||
xc_psr_feat_type type, xc_psr_hw_info *hw_info);
|
||||
|
||||
typedef struct xc_cpu_policy *xc_cpu_policy_t;
|
||||
typedef struct xc_cpu_policy xc_cpu_policy_t;
|
||||
|
||||
/* Create and free a xc_cpu_policy object. */
|
||||
xc_cpu_policy_t xc_cpu_policy_init(void);
|
||||
void xc_cpu_policy_destroy(xc_cpu_policy_t policy);
|
||||
xc_cpu_policy_t *xc_cpu_policy_init(void);
|
||||
void xc_cpu_policy_destroy(xc_cpu_policy_t *policy);
|
||||
|
||||
/* Retrieve a system policy, or get/set a domains policy. */
|
||||
int xc_cpu_policy_get_system(xc_interface *xch, unsigned int policy_idx,
|
||||
xc_cpu_policy_t policy);
|
||||
xc_cpu_policy_t *policy);
|
||||
int xc_cpu_policy_get_domain(xc_interface *xch, uint32_t domid,
|
||||
xc_cpu_policy_t policy);
|
||||
xc_cpu_policy_t *policy);
|
||||
int xc_cpu_policy_set_domain(xc_interface *xch, uint32_t domid,
|
||||
const xc_cpu_policy_t policy);
|
||||
xc_cpu_policy_t *policy);
|
||||
|
||||
/* Manipulate a policy via architectural representations. */
|
||||
int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t policy,
|
||||
int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t *policy,
|
||||
xen_cpuid_leaf_t *leaves, uint32_t *nr_leaves,
|
||||
xen_msr_entry_t *msrs, uint32_t *nr_msrs);
|
||||
int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t *policy,
|
||||
const xen_cpuid_leaf_t *leaves,
|
||||
uint32_t nr);
|
||||
int xc_cpu_policy_update_msrs(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
int xc_cpu_policy_update_msrs(xc_interface *xch, xc_cpu_policy_t *policy,
|
||||
const xen_msr_entry_t *msrs, uint32_t nr);
|
||||
|
||||
/* Compatibility calculations. */
|
||||
bool xc_cpu_policy_is_compatible(xc_interface *xch, const xc_cpu_policy_t host,
|
||||
const xc_cpu_policy_t guest);
|
||||
bool xc_cpu_policy_is_compatible(xc_interface *xch, xc_cpu_policy_t *host,
|
||||
xc_cpu_policy_t *guest);
|
||||
|
||||
int xc_get_cpu_levelling_caps(xc_interface *xch, uint32_t *caps);
|
||||
int xc_get_cpu_featureset(xc_interface *xch, uint32_t index,
|
||||
|
||||
@@ -672,18 +672,18 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
xc_cpu_policy_t xc_cpu_policy_init(void)
|
||||
xc_cpu_policy_t *xc_cpu_policy_init(void)
|
||||
{
|
||||
return calloc(1, sizeof(struct xc_cpu_policy));
|
||||
}
|
||||
|
||||
void xc_cpu_policy_destroy(xc_cpu_policy_t policy)
|
||||
void xc_cpu_policy_destroy(xc_cpu_policy_t *policy)
|
||||
{
|
||||
if ( policy )
|
||||
free(policy);
|
||||
}
|
||||
|
||||
static int deserialize_policy(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
static int deserialize_policy(xc_interface *xch, xc_cpu_policy_t *policy,
|
||||
unsigned int nr_leaves, unsigned int nr_entries)
|
||||
{
|
||||
uint32_t err_leaf = -1, err_subleaf = -1, err_msr = -1;
|
||||
@@ -713,7 +713,7 @@ static int deserialize_policy(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
}
|
||||
|
||||
int xc_cpu_policy_get_system(xc_interface *xch, unsigned int policy_idx,
|
||||
xc_cpu_policy_t policy)
|
||||
xc_cpu_policy_t *policy)
|
||||
{
|
||||
unsigned int nr_leaves = ARRAY_SIZE(policy->leaves);
|
||||
unsigned int nr_entries = ARRAY_SIZE(policy->entries);
|
||||
@@ -738,7 +738,7 @@ int xc_cpu_policy_get_system(xc_interface *xch, unsigned int policy_idx,
|
||||
}
|
||||
|
||||
int xc_cpu_policy_get_domain(xc_interface *xch, uint32_t domid,
|
||||
xc_cpu_policy_t policy)
|
||||
xc_cpu_policy_t *policy)
|
||||
{
|
||||
unsigned int nr_leaves = ARRAY_SIZE(policy->leaves);
|
||||
unsigned int nr_entries = ARRAY_SIZE(policy->entries);
|
||||
@@ -763,7 +763,7 @@ int xc_cpu_policy_get_domain(xc_interface *xch, uint32_t domid,
|
||||
}
|
||||
|
||||
int xc_cpu_policy_set_domain(xc_interface *xch, uint32_t domid,
|
||||
const xc_cpu_policy_t policy)
|
||||
xc_cpu_policy_t *policy)
|
||||
{
|
||||
uint32_t err_leaf = -1, err_subleaf = -1, err_msr = -1;
|
||||
unsigned int nr_leaves = ARRAY_SIZE(policy->leaves);
|
||||
@@ -791,7 +791,7 @@ int xc_cpu_policy_set_domain(xc_interface *xch, uint32_t domid,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t p,
|
||||
int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t *p,
|
||||
xen_cpuid_leaf_t *leaves, uint32_t *nr_leaves,
|
||||
xen_msr_entry_t *msrs, uint32_t *nr_msrs)
|
||||
{
|
||||
@@ -823,7 +823,7 @@ int xc_cpu_policy_serialise(xc_interface *xch, const xc_cpu_policy_t p,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t *policy,
|
||||
const xen_cpuid_leaf_t *leaves,
|
||||
uint32_t nr)
|
||||
{
|
||||
@@ -843,7 +843,7 @@ int xc_cpu_policy_update_cpuid(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
return rc;
|
||||
}
|
||||
|
||||
int xc_cpu_policy_update_msrs(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
int xc_cpu_policy_update_msrs(xc_interface *xch, xc_cpu_policy_t *policy,
|
||||
const xen_msr_entry_t *msrs, uint32_t nr)
|
||||
{
|
||||
unsigned int err_msr = -1;
|
||||
@@ -861,8 +861,8 @@ int xc_cpu_policy_update_msrs(xc_interface *xch, xc_cpu_policy_t policy,
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool xc_cpu_policy_is_compatible(xc_interface *xch, const xc_cpu_policy_t host,
|
||||
const xc_cpu_policy_t guest)
|
||||
bool xc_cpu_policy_is_compatible(xc_interface *xch, xc_cpu_policy_t *host,
|
||||
xc_cpu_policy_t *guest)
|
||||
{
|
||||
struct cpu_policy_errors err = INIT_CPU_POLICY_ERRORS;
|
||||
struct cpu_policy h = { &host->cpuid, &host->msr };
|
||||
|
||||
@@ -48,7 +48,7 @@ int write_x86_cpu_policy_records(struct xc_sr_context *ctx)
|
||||
struct xc_sr_record cpuid = { .type = REC_TYPE_X86_CPUID_POLICY, };
|
||||
struct xc_sr_record msrs = { .type = REC_TYPE_X86_MSR_POLICY, };
|
||||
uint32_t nr_leaves = 0, nr_msrs = 0;
|
||||
xc_cpu_policy_t policy = NULL;
|
||||
xc_cpu_policy_t *policy = NULL;
|
||||
int rc;
|
||||
|
||||
if ( xc_cpu_policy_get_size(xch, &nr_leaves, &nr_msrs) < 0 )
|
||||
|
||||
@@ -468,7 +468,7 @@ int main(int argc, char **argv)
|
||||
uint32_t i, max_leaves, max_msrs;
|
||||
|
||||
xc_interface *xch = xc_interface_open(0, 0, 0);
|
||||
xc_cpu_policy_t policy = xc_cpu_policy_init();
|
||||
xc_cpu_policy_t *policy = xc_cpu_policy_init();
|
||||
|
||||
if ( !xch )
|
||||
err(1, "xc_interface_open");
|
||||
|
||||