@@ -886,6 +886,14 @@ typedef struct libxl__ctx libxl_ctx;
#define LIBXL_HAVE_DOMINFO_NEVER_STOP 1
/*
+ * LIBXL_HAVE_DOMINFO_GPADDR_BITS
+ *
+ * If this is defined, libxl_dominfo will contain an uint8 field called
+ * gpaddr_bits, containing the guest physical address space size.
+ */
+#define LIBXL_HAVE_DOMINFO_GPADDR_BITS 1
+
+/*
* LIBXL_HAVE_QXL
*
* If defined, then the libxl_vga_interface_type will contain another value:
@@ -462,6 +462,7 @@ typedef struct xc_dominfo {
unsigned int max_vcpu_id;
xen_domain_handle_t handle;
unsigned int cpupool;
+ uint8_t gpaddr_bits;
struct xen_arch_domainconfig arch_config;
} xc_dominfo_t;
@@ -396,6 +396,7 @@ int xc_domain_getinfo(xc_interface *xch,
info->nr_online_vcpus = domctl.u.getdomaininfo.nr_online_vcpus;
info->max_vcpu_id = domctl.u.getdomaininfo.max_vcpu_id;
info->cpupool = domctl.u.getdomaininfo.cpupool;
+ info->gpaddr_bits = domctl.u.getdomaininfo.gpaddr_bits;
info->arch_config = domctl.u.getdomaininfo.arch_config;
memcpy(info->handle, domctl.u.getdomaininfo.handle,
@@ -306,6 +306,7 @@ void libxl__xcinfo2xlinfo(libxl_ctx *ctx,
xlinfo->vcpu_max_id = xcinfo->max_vcpu_id;
xlinfo->vcpu_online = xcinfo->nr_online_vcpus;
xlinfo->cpupool = xcinfo->cpupool;
+ xlinfo->gpaddr_bits = xcinfo->gpaddr_bits;
xlinfo->domain_type = (xcinfo->flags & XEN_DOMINF_hvm_guest) ?
LIBXL_DOMAIN_TYPE_HVM : LIBXL_DOMAIN_TYPE_PV;
}
@@ -357,6 +357,7 @@ libxl_dominfo = Struct("dominfo",[
("vcpu_max_id", uint32),
("vcpu_online", uint32),
("cpupool", uint32),
+ ("gpaddr_bits", uint8),
("domain_type", libxl_domain_type),
], dir=DIR_OUT)
@@ -20,6 +20,8 @@ void arch_get_domain_info(const struct domain *d,
{
/* All ARM domains use hardware assisted paging. */
info->flags |= XEN_DOMINF_hap;
+
+ info->gpaddr_bits = p2m_ipa_bits;
}
static int handle_vuart_init(struct domain *d,
@@ -151,6 +151,7 @@ void arch_get_domain_info(const struct domain *d,
info->flags |= XEN_DOMINF_hap;
info->arch_config.emulation_flags = d->arch.emulation_flags;
+ info->gpaddr_bits = hap_paddr_bits;
}
static int do_vmtrace_op(struct domain *d, struct xen_domctl_vmtrace_op *op,
@@ -69,10 +69,10 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info)
int flags = XEN_DOMINF_blocked;
struct vcpu_runstate_info runstate;
+ memset(info, 0, sizeof(*info));
+
info->domain = d->domain_id;
info->max_vcpu_id = XEN_INVALID_MAX_VCPU_ID;
- info->nr_online_vcpus = 0;
- info->ssidref = 0;
/*
* - domain is marked as blocked only if all its vcpus are blocked
@@ -76,7 +76,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
case XEN_SYSCTL_getdomaininfolist:
{
struct domain *d;
- struct xen_domctl_getdomaininfo info = { 0 };
+ struct xen_domctl_getdomaininfo info;
u32 num_domains = 0;
rcu_read_lock(&domlist_read_lock);
@@ -108,6 +108,7 @@ struct xen_domctl_createdomain {
struct xen_domctl_getdomaininfo {
/* OUT variables. */
domid_t domain; /* Also echoed in domctl.domain */
+ uint16_t pad1;
/* Domain is scheduled to die. */
#define _XEN_DOMINF_dying 0
#define XEN_DOMINF_dying (1U<<_XEN_DOMINF_dying)
@@ -152,6 +153,8 @@ struct xen_domctl_getdomaininfo {
uint32_t ssidref;
xen_domain_handle_t handle;
uint32_t cpupool;
+ uint8_t gpaddr_bits; /* Guest physical address space size. */
+ uint8_t pad2[7];
struct xen_arch_domainconfig arch_config;
};
typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
@@ -35,7 +35,7 @@
#include "domctl.h"
#include "physdev.h"
-#define XEN_SYSCTL_INTERFACE_VERSION 0x00000013
+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000014
/*
* Read console content from Xen buffer ring.