ipc_kobject.h
1 /* 2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 /* 29 * @OSF_COPYRIGHT@ 30 */ 31 /* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989 Carnegie Mellon University 34 * All Rights Reserved. 35 * 36 * Permission to use, copy, modify and distribute this software and its 37 * documentation is hereby granted, provided that both the copyright 38 * notice and this permission notice appear in all copies of the 39 * software, derivative works or modified versions, and any portions 40 * thereof, and that both notices appear in supporting documentation. 41 * 42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56 /* 57 * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce 58 * support for mandatory and extensible security protections. This notice 59 * is included in support of clause 2.2 (b) of the Apple Public License, 60 * Version 2.0. 61 */ 62 /* 63 */ 64 /* 65 * File: kern/ipc_kobject.h 66 * Author: Rich Draves 67 * Date: 1989 68 * 69 * Declarations for letting a port represent a kernel object. 70 */ 71 72 #ifdef MACH_KERNEL_PRIVATE 73 #include <ipc/ipc_kmsg.h> 74 #include <ipc/ipc_port.h> 75 #endif /* MACH_KERNEL_PRIVATE */ 76 77 #ifndef _KERN_IPC_KOBJECT_H_ 78 #define _KERN_IPC_KOBJECT_H_ 79 80 #ifdef KERNEL_PRIVATE 81 /* 82 * This is the legacy in-kernel ipc-object mechanism. Over the next 83 * several months, this will be phased out in favor of a mechanism that 84 * is less Mach IPC specific, and common across in-mach, in-kernel-component, 85 * and user-level-component (Plugin) models. 86 */ 87 #include <mach/machine/vm_types.h> 88 #include <mach/mach_types.h> 89 90 typedef natural_t ipc_kobject_type_t; 91 92 #define IKOT_NONE 0 93 #define IKOT_THREAD_CONTROL 1 94 #define IKOT_TASK_CONTROL 2 95 #define IKOT_HOST 3 96 #define IKOT_HOST_PRIV 4 97 #define IKOT_PROCESSOR 5 98 #define IKOT_PSET 6 99 #define IKOT_PSET_NAME 7 100 #define IKOT_TIMER 8 101 #define IKOT_PORT_SUBST_ONCE 9 102 #define IKOT_MIG 10 103 #define IKOT_MEMORY_OBJECT 11 104 #define IKOT_XMM_PAGER 12 105 #define IKOT_XMM_KERNEL 13 106 #define IKOT_XMM_REPLY 14 107 #define IKOT_UND_REPLY 15 108 #define IKOT_HOST_NOTIFY 16 109 #define IKOT_HOST_SECURITY 17 110 #define IKOT_LEDGER 18 111 #define IKOT_MASTER_DEVICE 19 112 #define IKOT_TASK_NAME 20 113 #define IKOT_SUBSYSTEM 21 114 #define IKOT_IO_DONE_QUEUE 22 115 #define IKOT_SEMAPHORE 23 116 #define IKOT_LOCK_SET 24 117 #define IKOT_CLOCK 25 118 #define IKOT_CLOCK_CTRL 26 119 #define IKOT_IOKIT_IDENT 27 120 #define IKOT_NAMED_ENTRY 28 121 #define IKOT_IOKIT_CONNECT 29 122 #define IKOT_IOKIT_OBJECT 30 123 #define IKOT_UPL 31 124 #define IKOT_MEM_OBJ_CONTROL 32 125 #define IKOT_AU_SESSIONPORT 33 126 #define IKOT_FILEPORT 34 127 #define IKOT_LABELH 35 128 #define IKOT_TASK_RESUME 36 129 #define IKOT_VOUCHER 37 130 #define IKOT_VOUCHER_ATTR_CONTROL 38 131 #define IKOT_WORK_INTERVAL 39 132 #define IKOT_UX_HANDLER 40 133 #define IKOT_UEXT_OBJECT 41 134 #define IKOT_ARCADE_REG 42 135 #define IKOT_EVENTLINK 43 136 #define IKOT_TASK_INSPECT 44 137 #define IKOT_TASK_READ 45 138 #define IKOT_THREAD_INSPECT 46 139 #define IKOT_THREAD_READ 47 140 #define IKOT_SUID_CRED 48 141 #define IKOT_HYPERVISOR 49 142 #define IKOT_TASK_ID_TOKEN 50 143 144 /* 145 * Add new entries here and adjust IKOT_UNKNOWN. 146 * Please keep ipc/ipc_object.c:ikot_print_array up to date. 147 */ 148 #define IKOT_UNKNOWN 51 /* magic catchall */ 149 #define IKOT_MAX_TYPE (IKOT_UNKNOWN+1) /* # of IKOT_ types */ 150 151 /* set the bitstring index for kobject */ 152 extern kern_return_t ipc_kobject_set_kobjidx( 153 int msgid, 154 int index); 155 156 #ifdef MACH_KERNEL_PRIVATE 157 158 struct ipc_kobject_label { 159 ipc_label_t ikol_label; /* [private] mandatory access label */ 160 ipc_kobject_t XNU_PTRAUTH_SIGNED_PTR("ipc_kobject_label.ikol_kobject") ikol_kobject; /* actual kobject address */ 161 }; 162 163 /* initialization of kobject subsystem */ 164 extern void ipc_kobject_init(void); 165 166 /* Dispatch a kernel server function */ 167 extern ipc_kmsg_t ipc_kobject_server( 168 ipc_kmsg_t request, 169 mach_msg_option_t option); 170 171 /* Make a port represent a kernel object of the given type */ 172 extern void ipc_kobject_set( 173 ipc_port_t port, 174 ipc_kobject_t kobject, 175 ipc_kobject_type_t type); 176 177 extern void ipc_kobject_set_atomically( 178 ipc_port_t port, 179 ipc_kobject_t kobject, 180 ipc_kobject_type_t type); 181 182 __options_decl(ipc_kobject_alloc_options_t, uint32_t, { 183 /* Just make the naked port */ 184 IPC_KOBJECT_ALLOC_NONE = 0x00000000, 185 /* Make a send right */ 186 IPC_KOBJECT_ALLOC_MAKE_SEND = 0x00000001, 187 /* Register for no-more-senders */ 188 IPC_KOBJECT_ALLOC_NSREQUEST = 0x00000002, 189 /* Make it no grant port */ 190 IPC_KOBJECT_ALLOC_NO_GRANT = 0x00000004, 191 /* Make all the send rights immovable */ 192 IPC_KOBJECT_ALLOC_IMMOVABLE_SEND = 0x00000008, 193 /* Add a label structure to the port */ 194 IPC_KOBJECT_ALLOC_LABEL = 0x00000010, 195 /* Make all rights pinned (non dealloc-able) in an ipc space*/ 196 IPC_KOBJECT_ALLOC_PINNED = 0x00000020, 197 }); 198 199 /* Allocates a kobject port, never fails */ 200 extern ipc_port_t ipc_kobject_alloc_port( 201 ipc_kobject_t kobject, 202 ipc_kobject_type_t type, 203 ipc_kobject_alloc_options_t options); 204 205 /* Allocates a kobject port, never fails */ 206 extern ipc_port_t ipc_kobject_alloc_labeled_port( 207 ipc_kobject_t kobject, 208 ipc_kobject_type_t type, 209 ipc_label_t label, 210 ipc_kobject_alloc_options_t options); 211 212 extern ipc_port_t ipc_kobject_alloc_subst_once( 213 ipc_port_t target); 214 215 /* Makes a send right, lazily allocating a kobject port, arming for no-senders, never fails */ 216 extern boolean_t ipc_kobject_make_send_lazy_alloc_port( 217 ipc_port_t *port_store, 218 ipc_kobject_t kobject, 219 ipc_kobject_type_t type, 220 ipc_kobject_alloc_options_t alloc_opts, 221 boolean_t should_ptrauth, 222 uint64_t ptrauth_discriminator) __result_use_check; 223 224 /* Makes a send right, lazily allocating a kobject port, arming for no-senders, never fails */ 225 extern boolean_t ipc_kobject_make_send_lazy_alloc_labeled_port( 226 ipc_port_t *port_store, 227 ipc_kobject_t kobject, 228 ipc_kobject_type_t type, 229 ipc_label_t label) __result_use_check; 230 231 /* Get the kobject address associated with a port */ 232 static inline ipc_kobject_t 233 ipc_kobject_get(ipc_port_t port) 234 { 235 if (ip_is_kobject(port)) { 236 if (ip_is_kolabeled(port)) { 237 return port->ip_kolabel->ikol_kobject; 238 } 239 return port->ip_kobject; 240 } 241 return 0; 242 } 243 244 /* Check if a kobject can be copied out to a given space */ 245 extern bool ipc_kobject_label_check( 246 ipc_space_t space, 247 ipc_port_t port, 248 mach_msg_type_name_t msgt_name, 249 ipc_object_copyout_flags_t *flags, 250 ipc_port_t *subst_portp) __result_use_check; 251 252 __result_use_check 253 static inline bool 254 ip_label_check( 255 ipc_space_t space, 256 ipc_port_t port, 257 mach_msg_type_name_t msgt_name, 258 ipc_object_copyout_flags_t *flags, 259 ipc_port_t *subst_portp) 260 { 261 if (!ip_is_kolabeled(port)) { 262 *subst_portp = IP_NULL; 263 return true; 264 } 265 return ipc_kobject_label_check(space, port, msgt_name, flags, subst_portp); 266 } 267 268 /* Release any kernel object resources associated with a port */ 269 extern void ipc_kobject_destroy( 270 ipc_port_t port); 271 272 #define null_conversion(port) (port) 273 274 extern kern_return_t 275 uext_server(ipc_kmsg_t request, ipc_kmsg_t * reply); 276 277 /* These boot-args decide if the pinned and immovable ports can be copied out to IPC space */ 278 __options_decl(ipc_control_port_options_t, uint32_t, { 279 IPC_CONTROL_PORT_OPTIONS_NONE = 0x00, 280 281 IPC_CONTROL_PORT_OPTIONS_PINNED_SOFT = 0x01, 282 IPC_CONTROL_PORT_OPTIONS_PINNED_HARD = 0x02, 283 284 IPC_CONTROL_PORT_OPTIONS_IMMOVABLE_SOFT = 0x10, 285 IPC_CONTROL_PORT_OPTIONS_IMMOVABLE_HARD = 0x20, 286 }); 287 288 extern ipc_control_port_options_t ipc_control_port_options; 289 extern bool pinned_control_port_enabled; 290 extern bool immovable_control_port_enabled; 291 292 #endif /* MACH_KERNEL_PRIVATE */ 293 294 #endif /* KERNEL_PRIVATE */ 295 296 #endif /* _KERN_IPC_KOBJECT_H_ */