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                 | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/include/mach/mach_host.defs b/include/mach/mach_host.defs
index 936e2bde..70a2e866 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..035ef05f 100644
--- a/kern/host.c
+++ b/kern/host.c
@@ -387,3 +387,36 @@ 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 int            count, i = 0;
+       processor_t             p;
+       ipc_port_t              *tp;
+
+       if (pset == PROCESSOR_SET_NULL)
+               return KERN_INVALID_ARGUMENT;
+
+       simple_lock(&pset->lock);
+
+       count = pset->processor_count;
+
+       tp = (ipc_port_t *)kalloc(count * sizeof(ipc_port_t));
+       if (tp == NULL) {
+               simple_unlock(&pset->lock);
+               return KERN_RESOURCE_SHORTAGE;
+       }
+
+       queue_iterate(&pset->processors, p, processor_t, processors) {
+               tp[i++] = convert_processor_name_to_port(p);
+       }
+
+       *countp = count;
+       *processor_list = (mach_port_t *)tp;
+
+       simple_unlock(&pset->lock);
+       return KERN_SUCCESS;
+}
-- 
2.53.0


Reply via email to