This call allows to get the list of unprivileged processor ports
belonging to a processor set.
---
 include/mach/mach_host.defs |  7 +++++++
 kern/host.c                 | 40 +++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/include/mach/mach_host.defs b/include/mach/mach_host.defs
index 372f3859..e9aa1603 100644
--- a/include/mach/mach_host.defs
+++ b/include/mach/mach_host.defs
@@ -393,3 +393,10 @@ routine    host_get_kernel_version(
 routine        host_get_uptime64(
                host            : host_t;
        out     uptime          : time_value64_t);
+
+/*
+ *     Get list of processors in processor set
+ */
+routine processor_set_processors(
+               set_name        : processor_set_name_t;
+       out     processors_list : processor_name_array_t);
diff --git a/kern/host.c b/kern/host.c
index e7219e1c..c9ebd069 100644
--- a/kern/host.c
+++ b/kern/host.c
@@ -387,3 +387,43 @@ host_processor_set_priv(
        pset_reference(*pset);
        return KERN_SUCCESS;
 }
+
+kern_return_t processor_set_processors(
+       const processor_set_t   pset,
+       processor_name_array_t  *processor_list,
+       natural_t               *countp)
+{
+       unsigned                count, i = 0;
+       vm_offset_t             addr;
+       processor_t             p;
+       processor_t             *tp;
+
+       if (pset == PROCESSOR_SET_NULL)
+               return KERN_INVALID_ARGUMENT;
+
+       simple_lock(&pset->lock);
+
+       count = pset->processor_count;
+
+       addr = kalloc((vm_size_t) (count * sizeof(mach_port_t)));
+       if (addr == 0) {
+               simple_unlock(&pset->lock);
+               return KERN_RESOURCE_SHORTAGE;
+       }
+
+       tp = (processor_t *) addr;
+       queue_iterate(&pset->processors, p, processor_t, processors) {
+               tp[i++] = p;
+       }
+
+       *countp = count;
+       *processor_list = (mach_port_t *) addr;
+
+       /* do the conversion that Mig should handle */
+       for (i = 0; i < count; i++)
+               ((mach_port_t *) tp)[i] =
+                       (mach_port_t)convert_processor_name_to_port(tp[i]);
+
+       simple_unlock(&pset->lock);
+       return KERN_SUCCESS;
+}
-- 
2.53.0


Reply via email to