@@ -2613,12 +2613,6 @@ int xc_get_cpu_featureset(xc_interface *xch, uint32_t index,
int xc_cpu_policy_get_size(xc_interface *xch, uint32_t *nr_leaves,
uint32_t *nr_msrs);
-int xc_get_system_cpu_policy(xc_interface *xch, uint32_t index,
- uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
- uint32_t *nr_msrs, xen_msr_entry_t *msrs);
-int xc_get_domain_cpu_policy(xc_interface *xch, uint32_t domid,
- uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
- uint32_t *nr_msrs, xen_msr_entry_t *msrs);
int xc_set_domain_cpu_policy(xc_interface *xch, uint32_t domid,
uint32_t nr_leaves, xen_cpuid_leaf_t *leaves,
uint32_t nr_msrs, xen_msr_entry_t *msrs,
@@ -128,9 +128,9 @@ int xc_cpu_policy_get_size(xc_interface *xch, uint32_t *nr_leaves,
return ret;
}
-int xc_get_system_cpu_policy(xc_interface *xch, uint32_t index,
- uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
- uint32_t *nr_msrs, xen_msr_entry_t *msrs)
+static int get_system_cpu_policy(xc_interface *xch, uint32_t index,
+ uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
+ uint32_t *nr_msrs, xen_msr_entry_t *msrs)
{
struct xen_sysctl sysctl = {};
DECLARE_HYPERCALL_BOUNCE(leaves,
@@ -166,9 +166,9 @@ int xc_get_system_cpu_policy(xc_interface *xch, uint32_t index,
return ret;
}
-int xc_get_domain_cpu_policy(xc_interface *xch, uint32_t domid,
- uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
- uint32_t *nr_msrs, xen_msr_entry_t *msrs)
+static int get_domain_cpu_policy(xc_interface *xch, uint32_t domid,
+ uint32_t *nr_leaves, xen_cpuid_leaf_t *leaves,
+ uint32_t *nr_msrs, xen_msr_entry_t *msrs)
{
DECLARE_DOMCTL;
DECLARE_HYPERCALL_BOUNCE(leaves,
@@ -322,7 +322,7 @@ static int xc_cpuid_xend_policy(
/* Get the domain's current policy. */
nr_msrs = 0;
nr_cur = nr_leaves;
- rc = xc_get_domain_cpu_policy(xch, domid, &nr_cur, cur, &nr_msrs, NULL);
+ rc = get_domain_cpu_policy(xch, domid, &nr_cur, cur, &nr_msrs, NULL);
if ( rc )
{
PERROR("Failed to obtain d%d current policy", domid);
@@ -333,9 +333,9 @@ static int xc_cpuid_xend_policy(
/* Get the domain's max policy. */
nr_msrs = 0;
nr_max = nr_leaves;
- rc = xc_get_system_cpu_policy(xch, di.hvm ? XEN_SYSCTL_cpu_policy_hvm_max
- : XEN_SYSCTL_cpu_policy_pv_max,
- &nr_max, max, &nr_msrs, NULL);
+ rc = get_system_cpu_policy(xch, di.hvm ? XEN_SYSCTL_cpu_policy_hvm_max
+ : XEN_SYSCTL_cpu_policy_pv_max,
+ &nr_max, max, &nr_msrs, NULL);
if ( rc )
{
PERROR("Failed to obtain %s max policy", di.hvm ? "hvm" : "pv");
@@ -346,8 +346,8 @@ static int xc_cpuid_xend_policy(
/* Get the host policy. */
nr_msrs = 0;
nr_host = nr_leaves;
- rc = xc_get_system_cpu_policy(xch, XEN_SYSCTL_cpu_policy_host,
- &nr_host, host, &nr_msrs, NULL);
+ rc = get_system_cpu_policy(xch, XEN_SYSCTL_cpu_policy_host,
+ &nr_host, host, &nr_msrs, NULL);
if ( rc )
{
PERROR("Failed to obtain host policy");
@@ -478,9 +478,9 @@ int xc_cpuid_apply_policy(xc_interface *xch, uint32_t domid, bool restore,
/* Get the domain's default policy. */
nr_msrs = 0;
- rc = xc_get_system_cpu_policy(xch, di.hvm ? XEN_SYSCTL_cpu_policy_hvm_default
- : XEN_SYSCTL_cpu_policy_pv_default,
- &nr_leaves, leaves, &nr_msrs, NULL);
+ rc = get_system_cpu_policy(xch, di.hvm ? XEN_SYSCTL_cpu_policy_hvm_default
+ : XEN_SYSCTL_cpu_policy_pv_default,
+ &nr_leaves, leaves, &nr_msrs, NULL);
if ( rc )
{
PERROR("Failed to obtain %s default policy", di.hvm ? "hvm" : "pv");
@@ -760,7 +760,7 @@ int xc_cpu_policy_get_system(xc_interface *xch, unsigned int idx,
return -1;
}
- rc = xc_get_system_cpu_policy(xch, idx, &nr_leaves, leaves, &nr_msrs, msrs);
+ rc = get_system_cpu_policy(xch, idx, &nr_leaves, leaves, &nr_msrs, msrs);
if ( rc )
{
PERROR("Failed to obtain %u policy", idx);
@@ -793,8 +793,8 @@ int xc_cpu_policy_get_domain(xc_interface *xch, uint32_t domid,
return -1;
}
- rc = xc_get_domain_cpu_policy(xch, domid, &nr_leaves, leaves, &nr_msrs,
- msrs);
+ rc = get_domain_cpu_policy(xch, domid, &nr_leaves, leaves, &nr_msrs,
+ msrs);
if ( rc )
{
PERROR("Failed to obtain domain %u policy", domid);
@@ -48,6 +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;
int rc;
if ( xc_cpu_policy_get_size(xch, &nr_leaves, &nr_msrs) < 0 )
@@ -58,20 +59,27 @@ int write_x86_cpu_policy_records(struct xc_sr_context *ctx)
cpuid.data = malloc(nr_leaves * sizeof(xen_cpuid_leaf_t));
msrs.data = malloc(nr_msrs * sizeof(xen_msr_entry_t));
- if ( !cpuid.data || !msrs.data )
+ policy = xc_cpu_policy_init();
+ if ( !cpuid.data || !msrs.data || !policy )
{
ERROR("Cannot allocate memory for CPU Policy");
rc = -1;
goto out;
}
- if ( xc_get_domain_cpu_policy(xch, ctx->domid, &nr_leaves, cpuid.data,
- &nr_msrs, msrs.data) )
+ if ( xc_cpu_policy_get_domain(xch, ctx->domid, policy) )
{
PERROR("Unable to get d%d CPU Policy", ctx->domid);
rc = -1;
goto out;
}
+ if ( xc_cpu_policy_serialise(xch, policy, cpuid.data, &nr_leaves,
+ msrs.data, &nr_msrs) )
+ {
+ PERROR("Unable to serialize d%d CPU Policy", ctx->domid);
+ rc = -1;
+ goto out;
+ }
cpuid.length = nr_leaves * sizeof(xen_cpuid_leaf_t);
if ( cpuid.length )
@@ -94,6 +102,7 @@ int write_x86_cpu_policy_records(struct xc_sr_context *ctx)
out:
free(cpuid.data);
free(msrs.data);
+ xc_cpu_policy_destroy(policy);
return rc;
}
@@ -458,9 +458,12 @@ 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();
if ( !xch )
err(1, "xc_interface_open");
+ if ( !policy )
+ err(1, "xc_cpu_policy_init");
if ( xc_cpu_policy_get_size(xch, &max_leaves, &max_msrs) )
err(1, "xc_get_cpu_policy_size(...)");
@@ -481,10 +484,11 @@ int main(int argc, char **argv)
uint32_t nr_leaves = max_leaves;
uint32_t nr_msrs = max_msrs;
- if ( xc_get_domain_cpu_policy(xch, domid, &nr_leaves, leaves,
- &nr_msrs, msrs) )
- err(1, "xc_get_domain_cpu_policy(, %d, %d,, %d,)",
- domid, nr_leaves, nr_msrs);
+ if ( xc_cpu_policy_get_domain(xch, domid, policy) )
+ err(1, "xc_cpu_policy_get_domain(, %d, )", domid);
+ if ( xc_cpu_policy_serialise(xch, policy, leaves, &nr_leaves,
+ msrs, &nr_msrs) )
+ err(1, "xc_cpu_policy_serialise");
snprintf(name, sizeof(name), "Domain %d", domid);
print_policy(name, leaves, nr_leaves, msrs, nr_msrs);
@@ -497,8 +501,7 @@ int main(int argc, char **argv)
uint32_t nr_leaves = max_leaves;
uint32_t nr_msrs = max_msrs;
- if ( xc_get_system_cpu_policy(xch, i, &nr_leaves, leaves,
- &nr_msrs, msrs) )
+ if ( xc_cpu_policy_get_system(xch, i, policy) )
{
if ( errno == EOPNOTSUPP )
{
@@ -507,14 +510,18 @@ int main(int argc, char **argv)
continue;
}
- err(1, "xc_get_system_cpu_policy(, %s,,)", sys_policies[i]);
+ err(1, "xc_cpu_policy_get_system(, %s, )", sys_policies[i]);
}
+ if ( xc_cpu_policy_serialise(xch, policy, leaves, &nr_leaves,
+ msrs, &nr_msrs) )
+ err(1, "xc_cpu_policy_serialise");
print_policy(sys_policies[i], leaves, nr_leaves,
msrs, nr_msrs);
}
}
+ xc_cpu_policy_destroy(policy);
free(leaves);
free(msrs);
xc_interface_close(xch);
With the introduction of xc_cpu_policy_get_{system,domain} and xc_cpu_policy_serialise the current users of xc_get_{system,domain}_cpu_policy can be switched to the new interface. Note that xc_get_{system,domain}_cpu_policy is removed from the public interface and the functions are made static, since there are still internal consumers in xg_cpuid_x86.c Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> --- tools/include/xenctrl.h | 6 ----- tools/libs/guest/xg_cpuid_x86.c | 36 ++++++++++++++--------------- tools/libs/guest/xg_sr_common_x86.c | 15 +++++++++--- tools/misc/xen-cpuid.c | 21 +++++++++++------ 4 files changed, 44 insertions(+), 34 deletions(-)