diff options
-rw-r--r-- | tools/include/xendevicemodel.h | 10 | ||||
-rw-r--r-- | tools/libs/devicemodel/core.c | 15 | ||||
-rw-r--r-- | tools/libs/devicemodel/libxendevicemodel.map | 1 | ||||
-rw-r--r-- | xen/arch/arm/dm.c | 10 | ||||
-rw-r--r-- | xen/arch/x86/hvm/dm.c | 11 | ||||
-rw-r--r-- | xen/include/public/hvm/dm_op.h | 16 | ||||
-rw-r--r-- | xen/include/xlat.lst | 1 |
7 files changed, 64 insertions, 0 deletions
diff --git a/tools/include/xendevicemodel.h b/tools/include/xendevicemodel.h index c06b3c84b9..33698d67f3 100644 --- a/tools/include/xendevicemodel.h +++ b/tools/include/xendevicemodel.h @@ -358,6 +358,16 @@ int xendevicemodel_pin_memory_cacheattr( uint32_t type); /** + * Query for the number of vCPUs that a domain has. + * @parm dmod a handle to an open devicemodel interface. + * @parm domid the domain id to be serviced. + * @parm vcpus Number of vcpus. + * @return 0 on success and fills @p vcpus, or -1 on failure. + */ +int xendevicemodel_nr_vcpus( + xendevicemodel_handle *dmod, domid_t domid, unsigned int *vcpus); + +/** * This function restricts the use of this handle to the specified * domain. * diff --git a/tools/libs/devicemodel/core.c b/tools/libs/devicemodel/core.c index 30bd79f8ba..8e619eeb0a 100644 --- a/tools/libs/devicemodel/core.c +++ b/tools/libs/devicemodel/core.c @@ -630,6 +630,21 @@ int xendevicemodel_pin_memory_cacheattr( return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); } +int xendevicemodel_nr_vcpus( + xendevicemodel_handle *dmod, domid_t domid, unsigned int *vcpus) +{ + struct xen_dm_op op = { + .op = XEN_DMOP_nr_vcpus, + }; + + int rc = xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); + if ( rc ) + return rc; + + *vcpus = op.u.nr_vcpus.vcpus; + return 0; +} + int xendevicemodel_restrict(xendevicemodel_handle *dmod, domid_t domid) { return osdep_xendevicemodel_restrict(dmod, domid); diff --git a/tools/libs/devicemodel/libxendevicemodel.map b/tools/libs/devicemodel/libxendevicemodel.map index 733549327b..f7f9e3d932 100644 --- a/tools/libs/devicemodel/libxendevicemodel.map +++ b/tools/libs/devicemodel/libxendevicemodel.map @@ -42,4 +42,5 @@ VERS_1.3 { VERS_1.4 { global: xendevicemodel_set_irq_level; + xendevicemodel_nr_vcpus; } VERS_1.3; diff --git a/xen/arch/arm/dm.c b/xen/arch/arm/dm.c index 785413372c..d689e336fd 100644 --- a/xen/arch/arm/dm.c +++ b/xen/arch/arm/dm.c @@ -38,6 +38,7 @@ int dm_op(const struct dmop_args *op_args) [XEN_DMOP_set_ioreq_server_state] = sizeof(struct xen_dm_op_set_ioreq_server_state), [XEN_DMOP_destroy_ioreq_server] = sizeof(struct xen_dm_op_destroy_ioreq_server), [XEN_DMOP_set_irq_level] = sizeof(struct xen_dm_op_set_irq_level), + [XEN_DMOP_nr_vcpus] = sizeof(struct xen_dm_op_nr_vcpus), }; rc = rcu_lock_remote_domain_by_id(op_args->domid, &d); @@ -122,6 +123,15 @@ int dm_op(const struct dmop_args *op_args) break; } + case XEN_DMOP_nr_vcpus: + { + struct xen_dm_op_nr_vcpus *data = &op.u.nr_vcpus; + + data->vcpus = d->max_vcpus; + rc = 0; + break; + } + default: rc = ioreq_server_dm_op(&op, d, &const_op); break; diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c index 612749442e..f4f0910463 100644 --- a/xen/arch/x86/hvm/dm.c +++ b/xen/arch/x86/hvm/dm.c @@ -359,6 +359,7 @@ int dm_op(const struct dmop_args *op_args) [XEN_DMOP_remote_shutdown] = sizeof(struct xen_dm_op_remote_shutdown), [XEN_DMOP_relocate_memory] = sizeof(struct xen_dm_op_relocate_memory), [XEN_DMOP_pin_memory_cacheattr] = sizeof(struct xen_dm_op_pin_memory_cacheattr), + [XEN_DMOP_nr_vcpus] = sizeof(struct xen_dm_op_nr_vcpus), }; rc = rcu_lock_remote_domain_by_id(op_args->domid, &d); @@ -606,6 +607,15 @@ int dm_op(const struct dmop_args *op_args) break; } + case XEN_DMOP_nr_vcpus: + { + struct xen_dm_op_nr_vcpus *data = &op.u.nr_vcpus; + + data->vcpus = d->max_vcpus; + rc = 0; + break; + } + default: rc = ioreq_server_dm_op(&op, d, &const_op); break; @@ -641,6 +651,7 @@ CHECK_dm_op_map_mem_type_to_ioreq_server; CHECK_dm_op_remote_shutdown; CHECK_dm_op_relocate_memory; CHECK_dm_op_pin_memory_cacheattr; +CHECK_dm_op_nr_vcpus; int compat_dm_op(domid_t domid, unsigned int nr_bufs, diff --git a/xen/include/public/hvm/dm_op.h b/xen/include/public/hvm/dm_op.h index 1f70d58caa..ef7fbc0d3d 100644 --- a/xen/include/public/hvm/dm_op.h +++ b/xen/include/public/hvm/dm_op.h @@ -449,6 +449,21 @@ struct xen_dm_op_set_irq_level { }; typedef struct xen_dm_op_set_irq_level xen_dm_op_set_irq_level_t; +/* + * XEN_DMOP_nr_vcpus: Query the number of vCPUs a domain has. + * + * This is the number of vcpu objects allocated in Xen for the domain, and is + * fixed from creation time. This bound is applicable to e.g. the vcpuid + * parameter of XEN_DMOP_inject_event, or number of struct ioreq objects + * mapped via XENMEM_acquire_resource. + */ +#define XEN_DMOP_nr_vcpus 20 + +struct xen_dm_op_nr_vcpus { + uint32_t vcpus; /* OUT */ +}; +typedef struct xen_dm_op_nr_vcpus xen_dm_op_nr_vcpus_t; + struct xen_dm_op { uint32_t op; uint32_t pad; @@ -472,6 +487,7 @@ struct xen_dm_op { xen_dm_op_remote_shutdown_t remote_shutdown; xen_dm_op_relocate_memory_t relocate_memory; xen_dm_op_pin_memory_cacheattr_t pin_memory_cacheattr; + xen_dm_op_nr_vcpus_t nr_vcpus; } u; }; diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst index 398993d5f4..65f7fe3811 100644 --- a/xen/include/xlat.lst +++ b/xen/include/xlat.lst @@ -98,6 +98,7 @@ ? dm_op_ioreq_server_range hvm/dm_op.h ? dm_op_map_mem_type_to_ioreq_server hvm/dm_op.h ? dm_op_modified_memory hvm/dm_op.h +? dm_op_nr_vcpus hvm/dm_op.h ? dm_op_pin_memory_cacheattr hvm/dm_op.h ? dm_op_relocate_memory hvm/dm_op.h ? dm_op_remote_shutdown hvm/dm_op.h |