diff --git a/kernel-include/sys/spawn_internal.h b/kernel-include/sys/spawn_internal.h index 42f4687f8..c96434f3a 100644 --- a/kernel-include/sys/spawn_internal.h +++ b/kernel-include/sys/spawn_internal.h @@ -54,6 +54,7 @@ typedef enum { PSPA_SPECIAL = 0, PSPA_EXCEPTION = 1, PSPA_AU_SESSION = 2, + PSPA_IMP_WATCHPORTS = 3, } pspa_t; /* @@ -87,6 +88,36 @@ typedef struct _posix_spawn_port_actions { #define NBINPREFS 4 +/* + * Mapping of opaque data pointer to a MAC policy (specified by name). + */ +typedef struct _ps_mac_policy_extension { + char policyname[128]; + union { + uint64_t data; + void *datap; /* pointer in kernel memory */ + }; + uint64_t datalen; +} _ps_mac_policy_extension_t; + +/* + * A collection of extra data passed to MAC policies for the newly spawned process. + */ +typedef struct _posix_spawn_mac_policy_extensions { + int psmx_alloc; + int psmx_count; + _ps_mac_policy_extension_t psmx_extensions[]; +} *_posix_spawn_mac_policy_extensions_t; + +/* + * Returns size in bytes of a _posix_spawn_mac_policy_extensions holding x elements. + */ +#define PS_MAC_EXTENSIONS_SIZE(x) \ + __offsetof(struct _posix_spawn_mac_policy_extensions, psmx_extensions[(x)]) + +#define PS_MAC_EXTENSIONS_INIT_COUNT 2 + + /* * A posix_spawnattr structure contains all of the attribute elements that * can be set, as well as any metadata whose validity is signalled by the @@ -95,6 +126,7 @@ typedef struct _posix_spawn_port_actions { */ typedef struct _posix_spawnattr { short psa_flags; /* spawn attribute flags */ + short flags_padding; /* get the flags to be int aligned */ sigset_t psa_sigdefault; /* signal set to default */ sigset_t psa_sigmask; /* signal set to mask */ pid_t psa_pgroup; /* pgroup to spawn into */ @@ -103,51 +135,78 @@ typedef struct _posix_spawnattr { int psa_apptype; /* app type and process spec behav */ uint64_t psa_cpumonitor_percent; /* CPU usage monitor percentage */ uint64_t psa_cpumonitor_interval; /* CPU usage monitor interval, in seconds */ - _posix_spawn_port_actions_t psa_ports; /* special/exception ports */ - /* XXX - k64/u32 unaligned below here */ -#if CONFIG_MEMORYSTATUS || CONFIG_EMBEDDED || TARGET_OS_EMBEDDED - /* Jetsam related */ - short psa_jetsam_flags; /* flags */ - int psa_priority; /* relative importance */ - int psa_high_water_mark; /* resident page count limit */ -#endif + /* + * TODO: cleanup - see . psa_ports is a pointer, + * meaning that the fields following differ in alignment between 32 and + * 64-bit architectures. All pointers (existing and new) should therefore + * be placed at the end; changing this now, however, would currently break + * some legacy dependencies. The radar will be used to track resolution when + * appropriate. + */ + + short psa_jetsam_flags; /* jetsam flags */ + short short_padding; /* Padding for alignment issues */ + int psa_priority; /* jetsam relative importance */ + int psa_high_water_mark; /* jetsam resident page count limit */ + int int_padding; /* Padding for alignment issues */ + /* MAC policy-specific extensions. */ + _posix_spawn_port_actions_t psa_ports; /* special/exception ports */ + _posix_spawn_mac_policy_extensions_t psa_mac_extensions; } *_posix_spawnattr_t; /* * Jetsam flags */ -#if CONFIG_MEMORYSTATUS || CONFIG_EMBEDDED || TARGET_OS_EMBEDDED -#define POSIX_SPAWN_JETSAM_USE_EFFECTIVE_PRIORITY 0x1 -#endif +#define POSIX_SPAWN_JETSAM_SET 0x8000 + +#define POSIX_SPAWN_JETSAM_USE_EFFECTIVE_PRIORITY 0x1 +#define POSIX_SPAWN_JETSAM_HIWATER_BACKGROUND 0x2 /* - * DEPRECATED: maintained for transition purposes only - * posix_spawn apptype settings. + * Deprecated posix_spawn psa_flags values + * + * POSIX_SPAWN_OSX_TALAPP_START 0x0400 + * POSIX_SPAWN_IOS_RESV1_APP_START 0x0400 + * POSIX_SPAWN_IOS_APPLE_DAEMON_START 0x0800 + * POSIX_SPAWN_IOS_APP_START 0x1000 + * POSIX_SPAWN_OSX_WIDGET_START 0x0800 + * POSIX_SPAWN_OSX_DBCLIENT_START 0x0800 + * POSIX_SPAWN_OSX_RESVAPP_START 0x1000 */ -#if TARGET_OS_EMBEDDED || CONFIG_EMBEDDED -/* for compat sake */ -#define POSIX_SPAWN_OSX_TALAPP_START 0x0400 -#define POSIX_SPAWN_IOS_RESV1_APP_START 0x0400 -#define POSIX_SPAWN_IOS_APPLE_DAEMON_START 0x0800 /* not a bug, same as widget just rename */ -#define POSIX_SPAWN_IOS_APP_START 0x1000 -#else /* TARGET_OS_EMBEDDED */ -#define POSIX_SPAWN_OSX_TALAPP_START 0x0400 -#define POSIX_SPAWN_OSX_WIDGET_START 0x0800 -#define POSIX_SPAWN_OSX_DBCLIENT_START 0x0800 /* not a bug, same as widget just rename */ -#define POSIX_SPAWN_OSX_RESVAPP_START 0x1000 /* reserved for app start usages */ -#endif /* TARGET_OS_EMBEDDED */ +/* + * Deprecated posix_spawn psa_apptype values + * + * POSIX_SPAWN_PROCESS_TYPE_APPLEDAEMON 0x00000001 + * POSIX_SPAWN_PROCESS_TYPE_UIAPP 0x00000002 + * POSIX_SPAWN_PROCESS_TYPE_ADAPTIVE 0x00000004 + * POSIX_SPAWN_PROCESS_TYPE_TAL 0x00000001 + * POSIX_SPAWN_PROCESS_TYPE_WIDGET 0x00000002 + * POSIX_SPAWN_PROCESS_TYPE_DELAYIDLESLEEP 0x10000000 + * + * POSIX_SPAWN_PROCESS_FLAG_IMPORTANCE_DONOR 0x00000010 + * POSIX_SPAWN_PROCESS_FLAG_ADAPTIVE 0x00000020 + * POSIX_SPAWN_PROCESS_FLAG_START_BACKGROUND 0x00000040 + * POSIX_SPAWN_PROCESS_FLAG_START_LIGHT_THROTTLE 0x00000080 + */ /* - * posix_spawn apptype and process attribute settings. + * posix_spawn psa_apptype process type settings. + * when POSIX_SPAWN_PROC_TYPE is set, old psa_apptype bits are ignored */ -#if TARGET_OS_EMBEDDED || CONFIG_EMBEDDED -#define POSIX_SPAWN_APPTYPE_IOS_APPLEDAEMON 0x0001 /* it is an iOS apple daemon */ -#else /* TARGET_OS_EMBEDDED */ -#define POSIX_SPAWN_APPTYPE_OSX_TAL 0x0001 /* it is a TAL app */ -#define POSIX_SPAWN_APPTYPE_OSX_WIDGET 0x0002 /* it is a widget */ -#define POSIX_SPAWN_APPTYPE_DELAYIDLESLEEP 0x10000000 /* Process is marked to delay idle sleep on disk IO */ -#endif /* TARGET_OS_EMBEDDED */ + +#define POSIX_SPAWN_PROCESS_TYPE_NORMAL 0x00000000 +#define POSIX_SPAWN_PROCESS_TYPE_DEFAULT POSIX_SPAWN_PROCESS_TYPE_NORMAL + +#define POSIX_SPAWN_PROC_TYPE_MASK 0x00000F00 + +#define POSIX_SPAWN_PROC_TYPE_APP_DEFAULT 0x00000100 +#define POSIX_SPAWN_PROC_TYPE_APP_TAL 0x00000200 + +#define POSIX_SPAWN_PROC_TYPE_DAEMON_STANDARD 0x00000300 +#define POSIX_SPAWN_PROC_TYPE_DAEMON_INTERACTIVE 0x00000400 +#define POSIX_SPAWN_PROC_TYPE_DAEMON_BACKGROUND 0x00000500 +#define POSIX_SPAWN_PROC_TYPE_DAEMON_ADAPTIVE 0x00000600 /* * Allowable posix_spawn() file actions @@ -238,6 +297,11 @@ struct _posix_spawn_args_desc { __darwin_size_t port_actions_size; /* size of port actions block */ _posix_spawn_port_actions_t port_actions; /* pointer to port block */ + __darwin_size_t mac_extensions_size; + _posix_spawn_mac_policy_extensions_t + mac_extensions; /* pointer to policy-specific + * attributes */ + }; #ifdef KERNEL @@ -255,6 +319,8 @@ struct user32__posix_spawn_args_desc { uint32_t file_actions; /* pointer to block */ uint32_t port_actions_size; /* size of port actions block */ uint32_t port_actions; /* pointer to block */ + uint32_t mac_extensions_size; + uint32_t mac_extensions; }; struct user__posix_spawn_args_desc { @@ -264,6 +330,8 @@ struct user__posix_spawn_args_desc { user_addr_t file_actions; /* pointer to block */ user_size_t port_actions_size; /* size of port actions block */ user_addr_t port_actions; /* pointer to block */ + user_size_t mac_extensions_size; /* size of MAC-specific attrs. */ + user_addr_t mac_extensions; /* pointer to block */ }; diff --git a/platform-include/os/assumes.h b/platform-include/os/assumes.h new file mode 100644 index 000000000..c04ee931c --- /dev/null +++ b/platform-include/os/assumes.h @@ -0,0 +1,12 @@ +#ifndef _OS_ASSUMES_H +#define _OS_ASSUMES_H + +#define posix_assumes_zero_ctx(a, b, c) (c) +#define os_assumes_zero_ctx(a, b, c) (c) +#define os_assumes_zero(a) (a); +#define os_assumes_ctx(a, b, c) (c) +#define posix_assumes_zero(a) (a) +#define __OS_COMPILETIME_ASSERT__(a) + +#endif + diff --git a/platform-include/sys/spawn.h b/platform-include/sys/spawn.h index 3b3e5b326..85377d5f0 100644 --- a/platform-include/sys/spawn.h +++ b/platform-include/sys/spawn.h @@ -58,6 +58,16 @@ */ #define POSIX_SPAWN_SETEXEC 0x0040 #define POSIX_SPAWN_START_SUSPENDED 0x0080 +#ifdef PRIVATE +#define _POSIX_SPAWN_DISABLE_ASLR 0x0100 +/* unused 0x0200 */ +/* for compat sake */ +#define POSIX_SPAWN_OSX_TALAPP_START 0x0400 +#define POSIX_SPAWN_OSX_WIDGET_START 0x0800 +#define POSIX_SPAWN_OSX_DBCLIENT_START 0x0800 /* not a bug, same as widget just rename */ +#define POSIX_SPAWN_OSX_RESVAPP_START 0x1000 /* reserved for app start usages */ +#define _POSIX_SPAWN_ALLOW_DATA_EXEC 0x2000 +#endif /* PRIVATE */ #define POSIX_SPAWN_CLOEXEC_DEFAULT 0x4000 /* diff --git a/platform-include/xpc/launchd.h b/platform-include/xpc/launchd.h new file mode 100644 index 000000000..e696110a7 --- /dev/null +++ b/platform-include/xpc/launchd.h @@ -0,0 +1,53 @@ +#ifndef XPC_LAUNCHD_H +#define XPC_LAUNCHD_H + +typedef int xpc_service_type_t; +typedef int xpc_jetsam_band_t; +typedef char event_name_t[100]; + +enum { + XPC_JETSAM_BAND_SUSPENDED, + XPC_JETSAM_BAND_BACKGROUND_OPPORTUNISTIC, + XPC_JETSAM_BAND_BACKGROUND, + XPC_JETSAM_BAND_MAIL, + XPC_JETSAM_BAND_PHONE, + XPC_JETSAM_BAND_UI_SUPPORT, + XPC_JETSAM_BAND_FOREGROUND_SUPPORT, + XPC_JETSAM_BAND_FOREGROUND, + XPC_JETSAM_BAND_AUDIO, + XPC_JETSAM_BAND_ACCESSORY, + XPC_JETSAM_BAND_CRITICAL, + XPC_JETSAM_BAND_TELEPHONY, +}; + +enum { + JETSAM_PRIORITY_IDLE, + JETSAM_PRIORITY_BACKGROUND_OPPORTUNISTIC, + JETSAM_PRIORITY_BACKGROUND, + JETSAM_PRIORITY_MAIL, + JETSAM_PRIORITY_PHONE, + JETSAM_PRIORITY_UI_SUPPORT, + JETSAM_PRIORITY_FOREGROUND_SUPPORT, + JETSAM_PRIORITY_FOREGROUND, + JETSAM_PRIORITY_AUDIO_AND_ACCESSORY, + JETSAM_PRIORITY_CRITICAL, + JETSAM_PRIORITY_TELEPHONY, +}; + +#define XPC_SERVICE_ENV_ATTACHED "XPC_SERVICE_ENV_ATTACHED" +#define XPC_SERVICE_RENDEZVOUS_TOKEN "XPC_SERVICE_RENDEZVOUS_TOKEN" + +#define XPC_EVENT_ROUTINE_KEY_STREAM "STREAM" +#define XPC_EVENT_ROUTINE_KEY_TOKEN "TOKEN" +#define XPC_EVENT_ROUTINE_KEY_NAME "NAME" +#define XPC_EVENT_ROUTINE_KEY_ENTITLEMENTS "ENTITLEMENTS" +#define XPC_EVENT_ROUTINE_KEY_EVENT "EVENT" +#define XPC_EVENT_ROUTINE_KEY_FLAGS "FLAGS" + +#define XPC_EVENT_FLAG_ENTITLEMENTS 1 + +#define EXNOMEM 12 +#define EXINVAL 22 + +#endif + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 36986cabe..80817c09e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -98,6 +98,7 @@ add_subdirectory(VideoDecodeAcceleration) add_subdirectory(DiskArbitration) add_subdirectory(xar) add_subdirectory(libedit) +#add_subdirectory(launchd/src) ###################### # libc++ & libc++abi # diff --git a/src/darling-config.h.in b/src/darling-config.h.in index 71e3a5e7e..ba3cf1e84 100644 --- a/src/darling-config.h.in +++ b/src/darling-config.h.in @@ -13,6 +13,8 @@ #cmakedefine FRAMEWORK_COREAUDIO #cmakedefine FRAMEWORK_APPKIT +#ifndef __APPLE__ + /* * Credit: * @@ -34,5 +36,6 @@ #define __uint64_t uint64_t /* #define __darwin_natural_t long */ +#endif #endif diff --git a/src/launchd/src/CMakeLists.txt b/src/launchd/src/CMakeLists.txt new file mode 100644 index 000000000..d12569e19 --- /dev/null +++ b/src/launchd/src/CMakeLists.txt @@ -0,0 +1,59 @@ +project(launchd) + +cmake_minimum_required(VERSION 2.4.0) + +if(COMMAND cmake_policy) + cmake_policy(SET CMP0003 NEW) +endif(COMMAND cmake_policy) + + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../external/libdispatch/) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../external/libdispatch/private) +include_directories(${DARLING_TOP_DIRECTORY}/platform-include) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../liblaunch/) +include_directories(${DARLING_TOP_DIRECTORY}/src/libc/darwin) +include_directories(${DARLING_TOP_DIRECTORY}/src/libc/gen) +include_directories(${DARLING_TOP_DIRECTORY}/src/libinfo/lookup.subproj) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fblocks -nostdinc -include ${DARLING_TOP_DIRECTORY}/kernel-include/sys/fileport.h -ggdb") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -nostdlib") + +mig(job.defs) +mig(helper.defs) +mig(internal.defs) +mig(job_forward.defs) +mig(job_reply.defs) +mig(mach_exc.defs) +#mig(job_types.defs) +#mig(protocol_jobmgr.defs) + +add_definitions(-DPRIVATE) + +set(launchd_sources + core.c + ipc.c + kill2.c + ktrace.c + launchd.c + log.c + runtime.c + ${CMAKE_CURRENT_BINARY_DIR}/jobServer.c + ${CMAKE_CURRENT_BINARY_DIR}/helperUser.c + ${CMAKE_CURRENT_BINARY_DIR}/internalUser.c + ${CMAKE_CURRENT_BINARY_DIR}/job_forwardUser.c + ${CMAKE_CURRENT_BINARY_DIR}/job_replyUser.c + ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c + #${CMAKE_CURRENT_BINARY_DIR}/job_typesUser.c +) + +SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib${SUFFIX}/darling") +SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + +add_executable(launchd ${launchd_sources}) +target_link_libraries(launchd system) + +install(TARGETS launchd DESTINATION bin) + diff --git a/src/launchd/src/core.c b/src/launchd/src/core.c index 41308426f..76687cba3 100644 --- a/src/launchd/src/core.c +++ b/src/launchd/src/core.c @@ -54,6 +54,8 @@ #include #include #include +#include +#include #include #include #include @@ -76,8 +78,6 @@ #include #include #include -#include -#include #include #include #include diff --git a/src/launchd/src/mach_exc.defs b/src/launchd/src/mach_exc.defs new file mode 120000 index 000000000..9758508b7 --- /dev/null +++ b/src/launchd/src/mach_exc.defs @@ -0,0 +1 @@ +../../kernel/mach/mach_exc.defs \ No newline at end of file diff --git a/src/libc/include/spawn_private.h b/src/libc/include/spawn_private.h index a0346980e..10a1b544c 100644 --- a/src/libc/include/spawn_private.h +++ b/src/libc/include/spawn_private.h @@ -32,15 +32,25 @@ int posix_spawnattr_getpcontrol_np(const posix_spawnattr_t * __restrict, int * __restrict) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); int posix_spawnattr_setpcontrol_np(posix_spawnattr_t *, const int) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); -int posix_spawnattr_getapptype_np(const posix_spawnattr_t * __restrict, int * __restrict) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); -int posix_spawnattr_setapptype_np(posix_spawnattr_t *, const int) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); +int posix_spawnattr_getprocesstype_np(const posix_spawnattr_t * __restrict, int * __restrict) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); +int posix_spawnattr_setprocesstype_np(posix_spawnattr_t *, const int) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); int posix_spawnattr_setcpumonitor(posix_spawnattr_t * __restrict, uint64_t, uint64_t) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); int posix_spawnattr_getcpumonitor(posix_spawnattr_t * __restrict, uint64_t *, uint64_t *) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); +int posix_spawnattr_setcpumonitor_default(posix_spawnattr_t * __restrict) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0); -#if TARGET_OS_EMBEDDED -int posix_spawnattr_setjetsam(posix_spawnattr_t * __restrict attr, - short flags, int priority, int high_water_mark) __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_5_0); -#endif + +#define POSIX_SPAWN_IMPORTANCE_PORT_COUNT 32 +int posix_spawnattr_set_importancewatch_port_np(posix_spawnattr_t * __restrict attr, + int count, mach_port_t portarray[]) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0); + +#define POSIX_SPAWN_MACPOLICYINFO_WITHSIZE 1 +int posix_spawnattr_getmacpolicyinfo_np(const posix_spawnattr_t * __restrict, const char *, void **, size_t *) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); +int posix_spawnattr_setmacpolicyinfo_np(posix_spawnattr_t * __restrict, const char *, void *, size_t) __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0); + +int posix_spawnattr_setcoalition_np(const posix_spawnattr_t * __restrict, uint64_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); + +int posix_spawnattr_set_qos_clamp_np(const posix_spawnattr_t * __restrict, uint64_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); +int posix_spawnattr_get_qos_clamp_np(const posix_spawnattr_t * __restrict, uint64_t * __restrict) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); #endif /* !defined _SPAWN_PRIVATE_H_*/