We don't expect unprivileged users to be able to start and stop
processors. As such, we need the unprivileged version of the
processor_t mach type.
---
include/mach/mach_types.defs | 10 +++++++
include/mach/mach_types.h | 2 ++
kern/ipc_host.c | 56 +++++++++++++++++++++++++++++++++++-
kern/ipc_host.h | 6 ++++
kern/ipc_kobject.h | 5 ++--
kern/processor.c | 1 +
kern/processor.h | 2 ++
7 files changed, 79 insertions(+), 3 deletions(-)
diff --git a/include/mach/mach_types.defs b/include/mach/mach_types.defs
index 74196018..466bf17f 100644
--- a/include/mach/mach_types.defs
+++ b/include/mach/mach_types.defs
@@ -231,6 +231,16 @@ type processor_t = mach_port_t
type processor_array_t = ^array[] of processor_t;
type processor_info_t = array[*:1024] of integer_t;
+type processor_name_t = mach_port_t
+ ctype: mach_port_t
+#if KERNEL_SERVER
+ intran: processor_t convert_port_to_processor_name(mach_port_t)
+ outtran: mach_port_t
convert_processor_name_to_port(processor_t)
+#endif /* KERNEL_SERVER */
+ ;
+
+type processor_name_array_t = ^array[] of processor_name_t;
+
type processor_set_t = mach_port_t
ctype: mach_port_t
#if KERNEL_SERVER
diff --git a/include/mach/mach_types.h b/include/mach/mach_types.h
index 5ecd686a..9e6f88ac 100644
--- a/include/mach/mach_types.h
+++ b/include/mach/mach_types.h
@@ -73,7 +73,9 @@ typedef thread_t *thread_array_t;
typedef mach_port_t host_t;
typedef mach_port_t host_priv_t;
typedef mach_port_t processor_t;
+typedef mach_port_t processor_name_t;
typedef mach_port_t *processor_array_t;
+typedef mach_port_t *processor_name_array_t;
typedef mach_port_t processor_set_t;
typedef mach_port_t processor_set_name_t;
typedef mach_port_t *processor_set_array_t;
diff --git a/kern/ipc_host.c b/kern/ipc_host.c
index d033b2ec..3c71af78 100644
--- a/kern/ipc_host.c
+++ b/kern/ipc_host.c
@@ -109,7 +109,7 @@ mach_host_self(void)
/*
* ipc_processor_init:
*
- * Initialize ipc access to processor by allocating port.
+ * Initialize ipc access to processor by allocating the ports.
* Enable ipc control of processor by setting port object.
*/
@@ -124,6 +124,12 @@ ipc_processor_init(
panic("ipc_processor_init");
processor->processor_self = port;
ipc_kobject_set(port, (ipc_kobject_t) processor, IKOT_PROCESSOR);
+
+ port = ipc_port_alloc_kernel();
+ if (port == IP_NULL)
+ panic("ipc_processor_init");
+ processor->processor_name_self = port;
+ ipc_kobject_set(port, (ipc_kobject_t) processor, IKOT_PROCESSOR_NAME);
}
@@ -299,6 +305,35 @@ convert_port_to_processor(
return processor;
}
+/*
+ * Routine: convert_port_to_processor_name
+ * Purpose:
+ * Convert from a port to a processor.
+ * Doesn't consume the port ref;
+ * the processor produced may be null.
+ * Conditions:
+ * Nothing locked.
+ */
+
+processor_t
+convert_port_to_processor_name(
+ ipc_port_t port)
+{
+ processor_t processor = PROCESSOR_NULL;
+
+ if (likely(IP_VALID(port))) {
+ ip_lock(port);
+ if (ip_active(port) &&
+ ((ip_kotype(port) == IKOT_PROCESSOR) ||
+ (ip_kotype(port) == IKOT_PROCESSOR_NAME))) {
+ processor = (processor_t) port->ip_kobject;
+ }
+ ip_unlock(port);
+ }
+
+ return processor;
+}
+
/*
* Routine: convert_port_to_pset
* Purpose:
@@ -397,6 +432,25 @@ convert_processor_to_port(processor_t processor)
return port;
}
+/*
+ * Routine: convert_processor_name_to_port
+ * Purpose:
+ * Convert from a processor to a port.
+ * Produces a naked send right which is always valid.
+ * Conditions:
+ * Nothing locked.
+ */
+
+ipc_port_t
+convert_processor_name_to_port(processor_t processor)
+{
+ ipc_port_t port;
+
+ port = ipc_port_make_send(processor->processor_name_self);
+
+ return port;
+}
+
/*
* Routine: convert_pset_to_port
* Purpose:
diff --git a/kern/ipc_host.h b/kern/ipc_host.h
index cd2ffaa2..ffaa85d9 100644
--- a/kern/ipc_host.h
+++ b/kern/ipc_host.h
@@ -54,9 +54,15 @@ convert_port_to_host_priv(struct ipc_port *);
extern processor_t
convert_port_to_processor(struct ipc_port *);
+extern processor_t
+convert_port_to_processor_name(struct ipc_port *);
+
extern struct ipc_port *
convert_processor_to_port(processor_t);
+extern struct ipc_port *
+convert_processor_name_to_port(processor_t);
+
extern processor_set_t
convert_port_to_pset(struct ipc_port *);
diff --git a/kern/ipc_kobject.h b/kern/ipc_kobject.h
index 649f8e61..9115c784 100644
--- a/kern/ipc_kobject.h
+++ b/kern/ipc_kobject.h
@@ -78,9 +78,10 @@ typedef unsigned int ipc_kobject_type_t;
#define IKOT_CLOCK_CTRL 26
#define IKOT_PAGER_PROXY 27
#define IKOT_USER_DEVICE 28
+#define IKOT_PROCESSOR_NAME 29
/* << new entries here */
-#define IKOT_UNKNOWN 29 /* magic catchall */
-#define IKOT_MAX_TYPE 30 /* # of IKOT_ types */
+#define IKOT_UNKNOWN 30 /* magic catchall */
+#define IKOT_MAX_TYPE 31 /* # of IKOT_ types */
/* Please keep ipc/ipc_object.c:ikot_print_array up to date */
#define is_ipc_kobject(ikot) (ikot != IKOT_NONE)
diff --git a/kern/processor.c b/kern/processor.c
index ba82ca2a..ee1f7694 100644
--- a/kern/processor.c
+++ b/kern/processor.c
@@ -207,6 +207,7 @@ void processor_init(
queue_init(&pr->processors);
simple_lock_init(&pr->lock);
pr->processor_self = IP_NULL;
+ pr->processor_name_self = IP_NULL;
pr->slot_num = slot_num;
}
diff --git a/kern/processor.h b/kern/processor.h
index 3bb4dfbf..810fa1ef 100644
--- a/kern/processor.h
+++ b/kern/processor.h
@@ -121,6 +121,7 @@ struct processor {
queue_chain_t processors; /* all processors in set */
decl_simple_lock_data(, lock)
struct ipc_port *processor_self; /* port for operations */
+ struct ipc_port *processor_name_self; /* unprivileged name port */
int slot_num; /* machine-indep slot number */
#if NCPUS > 1
ast_check_t ast_check_data; /* for remote ast_check invocation */
@@ -239,6 +240,7 @@ extern processor_t master_processor;
#define processor_unlock(pr) simple_unlock(&(pr)->lock)
typedef mach_port_t *processor_array_t;
+typedef mach_port_t *processor_name_array_t;
typedef mach_port_t *processor_set_array_t;
typedef mach_port_t *processor_set_name_array_t;
--
2.53.0