diff --git a/tools/libs/guest/xg_cpuid_x86.c b/tools/libs/guest/xg_cpuid_x86.c
index e2a2659953..cf07a69764 100644
--- a/tools/libs/guest/xg_cpuid_x86.c
+++ b/tools/libs/guest/xg_cpuid_x86.c
@@ -125,16 +125,17 @@ int xc_cpu_policy_get_size(xc_interface *xch, uint32_t *nr_leaves,
     return ret;
 }
 
-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)
+static int get_system_cpu_policy_serialised(xc_interface *xch, uint32_t index,
+                                            xc_cpu_policy_t *p)
 {
     struct xen_sysctl sysctl = {};
+    xen_cpuid_leaf_t *leaves = p->leaves.buf;
+    xen_msr_entry_t *msrs = p->msrs.buf;
     DECLARE_HYPERCALL_BOUNCE(leaves,
-                             *nr_leaves * sizeof(*leaves),
+                             p->leaves.allocated * sizeof(*leaves),
                              XC_HYPERCALL_BUFFER_BOUNCE_OUT);
     DECLARE_HYPERCALL_BOUNCE(msrs,
-                             *nr_msrs * sizeof(*msrs),
+                             p->msrs.allocated * sizeof(*msrs),
                              XC_HYPERCALL_BUFFER_BOUNCE_OUT);
     int ret;
 
@@ -144,9 +145,9 @@ static int get_system_cpu_policy(xc_interface *xch, uint32_t index,
 
     sysctl.cmd = XEN_SYSCTL_get_cpu_policy;
     sysctl.u.cpu_policy.index = index;
-    sysctl.u.cpu_policy.nr_leaves = *nr_leaves;
+    sysctl.u.cpu_policy.nr_leaves = p->leaves.allocated;
     set_xen_guest_handle(sysctl.u.cpu_policy.leaves, leaves);
-    sysctl.u.cpu_policy.nr_msrs = *nr_msrs;
+    sysctl.u.cpu_policy.nr_msrs = p->msrs.allocated;
     set_xen_guest_handle(sysctl.u.cpu_policy.msrs, msrs);
 
     ret = do_sysctl(xch, &sysctl);
@@ -156,23 +157,24 @@ static int get_system_cpu_policy(xc_interface *xch, uint32_t index,
 
     if ( !ret )
     {
-        *nr_leaves = sysctl.u.cpu_policy.nr_leaves;
-        *nr_msrs = sysctl.u.cpu_policy.nr_msrs;
+        p->leaves.len = sysctl.u.cpu_policy.nr_leaves;
+        p->msrs.len = sysctl.u.cpu_policy.nr_msrs;
     }
 
     return ret;
 }
 
-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)
+static int get_domain_cpu_policy_serialised(xc_interface *xch, uint32_t domid,
+                                            xc_cpu_policy_t *p)
 {
     DECLARE_DOMCTL;
+    xen_cpuid_leaf_t *leaves = p->leaves.buf;
+    xen_msr_entry_t *msrs = p->msrs.buf;
     DECLARE_HYPERCALL_BOUNCE(leaves,
-                             *nr_leaves * sizeof(*leaves),
+                             p->leaves.allocated * sizeof(*leaves),
                              XC_HYPERCALL_BUFFER_BOUNCE_OUT);
     DECLARE_HYPERCALL_BOUNCE(msrs,
-                             *nr_msrs * sizeof(*msrs),
+                             p->msrs.allocated * sizeof(*msrs),
                              XC_HYPERCALL_BUFFER_BOUNCE_OUT);
     int ret;
 
@@ -182,9 +184,9 @@ static int get_domain_cpu_policy(xc_interface *xch, uint32_t domid,
 
     domctl.cmd = XEN_DOMCTL_get_cpu_policy;
     domctl.domain = domid;
-    domctl.u.cpu_policy.nr_leaves = *nr_leaves;
+    domctl.u.cpu_policy.nr_leaves = p->leaves.allocated;
     set_xen_guest_handle(domctl.u.cpu_policy.leaves, leaves);
-    domctl.u.cpu_policy.nr_msrs = *nr_msrs;
+    domctl.u.cpu_policy.nr_msrs = p->msrs.allocated;
     set_xen_guest_handle(domctl.u.cpu_policy.msrs, msrs);
 
     ret = do_domctl(xch, &domctl);
@@ -194,8 +196,8 @@ static int get_domain_cpu_policy(xc_interface *xch, uint32_t domid,
 
     if ( !ret )
     {
-        *nr_leaves = domctl.u.cpu_policy.nr_leaves;
-        *nr_msrs = domctl.u.cpu_policy.nr_msrs;
+        p->leaves.len = domctl.u.cpu_policy.nr_leaves;
+        p->msrs.len = domctl.u.cpu_policy.nr_msrs;
     }
 
     return ret;
@@ -745,22 +747,14 @@ void xc_cpu_policy_destroy(xc_cpu_policy_t *policy)
 int xc_cpu_policy_get_system(xc_interface *xch, unsigned int policy_idx,
                              xc_cpu_policy_t *policy)
 {
-    unsigned int nr_leaves = policy->leaves.allocated;
-    unsigned int nr_msrs = policy->msrs.allocated;
     int rc;
 
-    rc = get_system_cpu_policy(xch, policy_idx,
-                               &nr_leaves, policy->leaves.buf,
-                               &nr_msrs, policy->msrs.buf);
-    if ( rc )
+    if ( (rc = get_system_cpu_policy_serialised(xch, policy_idx, policy)) )
     {
         PERROR("Failed to obtain %u policy", policy_idx);
         return rc;
     }
 
-    policy->leaves.len = nr_leaves;
-    policy->msrs.len = nr_msrs;
-
     rc = cpu_policy_deserialise_on_self(xch, policy);
     if ( rc )
     {
@@ -774,22 +768,13 @@ 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)
 {
-    unsigned int nr_leaves = policy->leaves.allocated;
-    unsigned int nr_msrs = policy->msrs.allocated;
-    int rc;
-
-    rc = get_domain_cpu_policy(xch, domid,
-                               &nr_leaves, policy->leaves.buf,
-                               &nr_msrs, policy->msrs.buf);
+    int rc = get_domain_cpu_policy_serialised(xch, domid, policy);
     if ( rc )
     {
         PERROR("Failed to obtain domain %u policy", domid);
         return rc;
     }
 
-    policy->leaves.len = nr_leaves;
-    policy->msrs.len = nr_msrs;
-
     rc = cpu_policy_deserialise_on_self(xch, policy);
     if ( rc )
     {
