#ifdef MACH_KERNEL_PRIVATE
#include <ipc/ipc_kmsg.h>
#include <ipc/ipc_port.h>
#endif
#ifndef _KERN_IPC_KOBJECT_H_
#define _KERN_IPC_KOBJECT_H_
#ifdef KERNEL_PRIVATE
#include <mach/machine/vm_types.h>
#include <mach/mach_types.h>
typedef natural_t ipc_kobject_type_t;
#define IKOT_NONE 0
#define IKOT_THREAD_CONTROL 1
#define IKOT_TASK_CONTROL 2
#define IKOT_HOST 3
#define IKOT_HOST_PRIV 4
#define IKOT_PROCESSOR 5
#define IKOT_PSET 6
#define IKOT_PSET_NAME 7
#define IKOT_TIMER 8
#define IKOT_PORT_SUBST_ONCE 9
#define IKOT_MIG 10
#define IKOT_MEMORY_OBJECT 11
#define IKOT_XMM_PAGER 12
#define IKOT_XMM_KERNEL 13
#define IKOT_XMM_REPLY 14
#define IKOT_UND_REPLY 15
#define IKOT_HOST_NOTIFY 16
#define IKOT_HOST_SECURITY 17
#define IKOT_LEDGER 18
#define IKOT_MASTER_DEVICE 19
#define IKOT_TASK_NAME 20
#define IKOT_SUBSYSTEM 21
#define IKOT_IO_DONE_QUEUE 22
#define IKOT_SEMAPHORE 23
#define IKOT_LOCK_SET 24
#define IKOT_CLOCK 25
#define IKOT_CLOCK_CTRL 26
#define IKOT_IOKIT_IDENT 27
#define IKOT_NAMED_ENTRY 28
#define IKOT_IOKIT_CONNECT 29
#define IKOT_IOKIT_OBJECT 30
#define IKOT_UPL 31
#define IKOT_MEM_OBJ_CONTROL 32
#define IKOT_AU_SESSIONPORT 33
#define IKOT_FILEPORT 34
#define IKOT_LABELH 35
#define IKOT_TASK_RESUME 36
#define IKOT_VOUCHER 37
#define IKOT_VOUCHER_ATTR_CONTROL 38
#define IKOT_WORK_INTERVAL 39
#define IKOT_UX_HANDLER 40
#define IKOT_UEXT_OBJECT 41
#define IKOT_ARCADE_REG 42
#define IKOT_EVENTLINK 43
#define IKOT_TASK_INSPECT 44
#define IKOT_TASK_READ 45
#define IKOT_THREAD_INSPECT 46
#define IKOT_THREAD_READ 47
#define IKOT_SUID_CRED 48
#define IKOT_HYPERVISOR 49
#define IKOT_TASK_ID_TOKEN 50
#define IKOT_UNKNOWN 51
#define IKOT_MAX_TYPE (IKOT_UNKNOWN+1)
extern kern_return_t ipc_kobject_set_kobjidx(
int msgid,
int index);
#ifdef MACH_KERNEL_PRIVATE
struct ipc_kobject_label {
ipc_label_t ikol_label;
ipc_kobject_t XNU_PTRAUTH_SIGNED_PTR("ipc_kobject_label.ikol_kobject") ikol_kobject;
};
extern void ipc_kobject_init(void);
extern ipc_kmsg_t ipc_kobject_server(
ipc_kmsg_t request,
mach_msg_option_t option);
extern void ipc_kobject_set(
ipc_port_t port,
ipc_kobject_t kobject,
ipc_kobject_type_t type);
extern void ipc_kobject_set_atomically(
ipc_port_t port,
ipc_kobject_t kobject,
ipc_kobject_type_t type);
__options_decl(ipc_kobject_alloc_options_t, uint32_t, {
IPC_KOBJECT_ALLOC_NONE = 0x00000000,
IPC_KOBJECT_ALLOC_MAKE_SEND = 0x00000001,
IPC_KOBJECT_ALLOC_NSREQUEST = 0x00000002,
IPC_KOBJECT_ALLOC_NO_GRANT = 0x00000004,
IPC_KOBJECT_ALLOC_IMMOVABLE_SEND = 0x00000008,
IPC_KOBJECT_ALLOC_LABEL = 0x00000010,
IPC_KOBJECT_ALLOC_PINNED = 0x00000020,
});
extern ipc_port_t ipc_kobject_alloc_port(
ipc_kobject_t kobject,
ipc_kobject_type_t type,
ipc_kobject_alloc_options_t options);
extern ipc_port_t ipc_kobject_alloc_labeled_port(
ipc_kobject_t kobject,
ipc_kobject_type_t type,
ipc_label_t label,
ipc_kobject_alloc_options_t options);
extern ipc_port_t ipc_kobject_alloc_subst_once(
ipc_port_t target);
extern boolean_t ipc_kobject_make_send_lazy_alloc_port(
ipc_port_t *port_store,
ipc_kobject_t kobject,
ipc_kobject_type_t type,
ipc_kobject_alloc_options_t alloc_opts,
boolean_t should_ptrauth,
uint64_t ptrauth_discriminator) __result_use_check;
extern boolean_t ipc_kobject_make_send_lazy_alloc_labeled_port(
ipc_port_t *port_store,
ipc_kobject_t kobject,
ipc_kobject_type_t type,
ipc_label_t label) __result_use_check;
static inline ipc_kobject_t
ipc_kobject_get(ipc_port_t port)
{
if (ip_is_kobject(port)) {
if (ip_is_kolabeled(port)) {
return port->ip_kolabel->ikol_kobject;
}
return port->ip_kobject;
}
return 0;
}
extern bool ipc_kobject_label_check(
ipc_space_t space,
ipc_port_t port,
mach_msg_type_name_t msgt_name,
ipc_object_copyout_flags_t *flags,
ipc_port_t *subst_portp) __result_use_check;
__result_use_check
static inline bool
ip_label_check(
ipc_space_t space,
ipc_port_t port,
mach_msg_type_name_t msgt_name,
ipc_object_copyout_flags_t *flags,
ipc_port_t *subst_portp)
{
if (!ip_is_kolabeled(port)) {
*subst_portp = IP_NULL;
return true;
}
return ipc_kobject_label_check(space, port, msgt_name, flags, subst_portp);
}
extern void ipc_kobject_destroy(
ipc_port_t port);
#define null_conversion(port) (port)
extern kern_return_t
uext_server(ipc_kmsg_t request, ipc_kmsg_t * reply);
__options_decl(ipc_control_port_options_t, uint32_t, {
IPC_CONTROL_PORT_OPTIONS_NONE = 0x00,
IPC_CONTROL_PORT_OPTIONS_PINNED_SOFT = 0x01,
IPC_CONTROL_PORT_OPTIONS_PINNED_HARD = 0x02,
IPC_CONTROL_PORT_OPTIONS_IMMOVABLE_SOFT = 0x10,
IPC_CONTROL_PORT_OPTIONS_IMMOVABLE_HARD = 0x20,
});
extern ipc_control_port_options_t ipc_control_port_options;
extern bool pinned_control_port_enabled;
extern bool immovable_control_port_enabled;
#endif
#endif
#endif