aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/include
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2025-09-17 15:35:48 +0200
committerGitHub <noreply@github.com>2025-09-17 15:35:48 +0200
commitae00a2a84d34417c1fb6229db5919abcdced0ea0 (patch)
tree4ad139042d72adb805b81df3026ec561b3f943c0 /lib/libc/include
parent8e8a143d62b6176d94289a2a1e52295b46dfd319 (diff)
parent93218eacaada52eb028e5569b48b47ac38b1df70 (diff)
downloadzig-ae00a2a84d34417c1fb6229db5919abcdced0ea0.tar.gz
zig-ae00a2a84d34417c1fb6229db5919abcdced0ea0.zip
Merge pull request #25257 from linusg/bump-macos-headers
libc: Update macOS headers to SDK 26.0
Diffstat (limited to 'lib/libc/include')
-rw-r--r--lib/libc/include/any-macos-any/Availability.h19
-rw-r--r--lib/libc/include/any-macos-any/AvailabilityInternal.h120
-rw-r--r--lib/libc/include/any-macos-any/AvailabilityVersions.h27
-rw-r--r--lib/libc/include/any-macos-any/_bounds.h4
-rw-r--r--lib/libc/include/any-macos-any/_ctermid.h8
-rw-r--r--lib/libc/include/any-macos-any/_locale.h29
-rw-r--r--lib/libc/include/any-macos-any/_locale_posix2008.h65
-rw-r--r--lib/libc/include/any-macos-any/_stdio.h4
-rw-r--r--lib/libc/include/any-macos-any/_stdlib.h15
-rw-r--r--lib/libc/include/any-macos-any/_string.h4
-rw-r--r--lib/libc/include/any-macos-any/_xlocale.h1
-rw-r--r--lib/libc/include/any-macos-any/assert.h3
-rw-r--r--lib/libc/include/any-macos-any/mach/host_info.h9
-rw-r--r--lib/libc/include/any-macos-any/mach/mach_port.h8
-rw-r--r--lib/libc/include/any-macos-any/mach/mach_traps.h5
-rw-r--r--lib/libc/include/any-macos-any/mach/machine.h5
-rw-r--r--lib/libc/include/any-macos-any/mach/message.h3
-rw-r--r--lib/libc/include/any-macos-any/mach/port.h182
-rw-r--r--lib/libc/include/any-macos-any/mach/task_info.h10
-rw-r--r--lib/libc/include/any-macos-any/mach/task_policy.h1
-rw-r--r--lib/libc/include/any-macos-any/mach/thread_info.h1
-rw-r--r--lib/libc/include/any-macos-any/mach/vm_region.h18
-rw-r--r--lib/libc/include/any-macos-any/mach/vm_statistics.h73
-rw-r--r--lib/libc/include/any-macos-any/mach_debug/ipc_info.h75
-rw-r--r--lib/libc/include/any-macos-any/malloc/_malloc.h71
-rw-r--r--lib/libc/include/any-macos-any/malloc/_malloc_type.h101
-rw-r--r--lib/libc/include/any-macos-any/malloc/malloc.h175
-rw-r--r--lib/libc/include/any-macos-any/math.h28
-rw-r--r--lib/libc/include/any-macos-any/net/if.h11
-rw-r--r--lib/libc/include/any-macos-any/netinet/tcp.h7
-rw-r--r--lib/libc/include/any-macos-any/netinet6/in6.h1
-rw-r--r--lib/libc/include/any-macos-any/os/availability.h22
-rw-r--r--lib/libc/include/any-macos-any/os/base.h5
-rw-r--r--lib/libc/include/any-macos-any/os/workgroup_base.h6
-rw-r--r--lib/libc/include/any-macos-any/secure/_common.h2
-rw-r--r--lib/libc/include/any-macos-any/secure/_stdio.h103
-rw-r--r--lib/libc/include/any-macos-any/secure/_string.h295
-rw-r--r--lib/libc/include/any-macos-any/secure/_strings.h49
-rw-r--r--lib/libc/include/any-macos-any/setjmp.h3
-rw-r--r--lib/libc/include/any-macos-any/spawn.h10
-rw-r--r--lib/libc/include/any-macos-any/sys/_symbol_aliasing.h54
-rw-r--r--lib/libc/include/any-macos-any/sys/_types/_graftdmg_un.h3
-rw-r--r--lib/libc/include/any-macos-any/sys/attr.h7
-rw-r--r--lib/libc/include/any-macos-any/sys/cdefs.h54
-rw-r--r--lib/libc/include/any-macos-any/sys/clonefile.h9
-rw-r--r--lib/libc/include/any-macos-any/sys/errno.h7
-rw-r--r--lib/libc/include/any-macos-any/sys/fcntl.h18
-rw-r--r--lib/libc/include/any-macos-any/sys/kern_control.h2
-rw-r--r--lib/libc/include/any-macos-any/sys/mount.h6
-rw-r--r--lib/libc/include/any-macos-any/sys/paths.h11
-rw-r--r--lib/libc/include/any-macos-any/sys/proc.h1
-rw-r--r--lib/libc/include/any-macos-any/sys/proc_info.h8
-rw-r--r--lib/libc/include/any-macos-any/sys/resource.h4
-rw-r--r--lib/libc/include/any-macos-any/sys/signal.h1
-rw-r--r--lib/libc/include/any-macos-any/sys/stdio.h1
-rw-r--r--lib/libc/include/any-macos-any/sys/sysctl.h3
-rw-r--r--lib/libc/include/any-macos-any/unistd.h18
-rw-r--r--lib/libc/include/any-macos-any/xpc/base.h4
-rw-r--r--lib/libc/include/any-macos-any/xpc/connection.h50
-rw-r--r--lib/libc/include/any-macos-any/xpc/listener.h43
-rw-r--r--lib/libc/include/any-macos-any/xpc/peer_requirement.h242
-rw-r--r--lib/libc/include/any-macos-any/xpc/session.h62
-rw-r--r--lib/libc/include/any-macos-any/xpc/xpc.h3
63 files changed, 1748 insertions, 441 deletions
diff --git a/lib/libc/include/any-macos-any/Availability.h b/lib/libc/include/any-macos-any/Availability.h
index 71db7d4dc4..a0fc52aa61 100644
--- a/lib/libc/include/any-macos-any/Availability.h
+++ b/lib/libc/include/any-macos-any/Availability.h
@@ -469,6 +469,9 @@
* ios, iOSApplicationExtension, tvos, tvOSApplicationExtension, watchos,
* watchOSApplicationExtension, driverkit, visionos, visionOSApplicationExtension
*
+ * Within each platform a tuple of versions will represent the version the API was
+ * introduced in, followed by the version it was deperecated in.
+ *
* Examples:
*
* __API_DEPRECATED("Deprecated", macos(10.4, 10.8))
@@ -487,6 +490,7 @@
#define __API_DEPRECATED_WITH_REPLACEMENT_END _Pragma("clang attribute pop")
+
#define __API_OBSOLETED(...) __API_OBSOLETED_MSG_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_MSG15,__API_OBSOLETED_MSG14,__API_OBSOLETED_MSG13,__API_OBSOLETED_MSG12,__API_OBSOLETED_MSG11,__API_OBSOLETED_MSG10,__API_OBSOLETED_MSG9,__API_OBSOLETED_MSG8,__API_OBSOLETED_MSG7,__API_OBSOLETED_MSG6,__API_OBSOLETED_MSG5,__API_OBSOLETED_MSG4,__API_OBSOLETED_MSG3,__API_OBSOLETED_MSG2,__API_OBSOLETED_MSG1,__API_OBSOLETED_MSG0,0,0)(__VA_ARGS__)
#define __API_OBSOLETED_WITH_REPLACEMENT(...) __API_OBSOLETED_REP_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_REP15,__API_OBSOLETED_REP14,__API_OBSOLETED_REP13,__API_OBSOLETED_REP12,__API_OBSOLETED_REP11,__API_OBSOLETED_REP10,__API_OBSOLETED_REP9,__API_OBSOLETED_REP8,__API_OBSOLETED_REP7,__API_OBSOLETED_REP6,__API_OBSOLETED_REP5,__API_OBSOLETED_REP4,__API_OBSOLETED_REP3,__API_OBSOLETED_REP2,__API_OBSOLETED_REP1,__API_OBSOLETED_REP0,0,0)(__VA_ARGS__)
@@ -496,6 +500,7 @@
#define __API_OBSOLETED_WITH_REPLACEMENT_BEGIN(...) _Pragma("clang attribute push") __API_OBSOLETED_WITH_REPLACEMENT_BEGIN_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN15,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN14,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN13,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN12,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN11,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN10,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN9,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN8,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN7,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN6,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN5,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN4,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN3,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN2,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN1,__API_OBSOLETED_WITH_REPLACEMENT_BEGIN0,0,0)(__VA_ARGS__)
#define __API_OBSOLETED_WITH_REPLACEMENT_END _Pragma("clang attribute pop")
+
/*
* API Unavailability
* Use to specify that an API is unavailable for a particular platform.
@@ -524,7 +529,7 @@
#endif
#ifndef __API_AVAILABLE_END
- #define __API_AVAILABLE_END(...)
+ #define __API_AVAILABLE_END
#endif
#ifndef __API_DEPRECATED
@@ -536,7 +541,7 @@
#endif
#ifndef __API_DEPRECATED_END
- #define __API_DEPRECATED_END(...)
+ #define __API_DEPRECATED_END
#endif
#ifndef __API_DEPRECATED_WITH_REPLACEMENT
@@ -548,7 +553,7 @@
#endif
#ifndef __API_DEPRECATED_WITH_REPLACEMENT_END
- #define __API_DEPRECATED_WITH_REPLACEMENT_END(...)
+ #define __API_DEPRECATED_WITH_REPLACEMENT_END
#endif
#ifndef __API_OBSOLETED
@@ -560,7 +565,7 @@
#endif
#ifndef __API_OBSOLETED_END
- #define __API_OBSOLETED_END(...)
+ #define __API_OBSOLETED_END
#endif
#ifndef __API_OBSOLETED_WITH_REPLACEMENT
@@ -572,7 +577,7 @@
#endif
#ifndef __API_OBSOLETED_WITH_REPLACEMENT_END
- #define __API_OBSOLETED_WITH_REPLACEMENT_END(...)
+ #define __API_OBSOLETED_WITH_REPLACEMENT_END
#endif
#ifndef __API_UNAVAILABLE
@@ -584,7 +589,7 @@
#endif
#ifndef __API_UNAVAILABLE_END
- #define __API_UNAVAILABLE_END(...)
+ #define __API_UNAVAILABLE_END
#endif
/*
@@ -600,7 +605,7 @@
#endif
#ifndef __SPI_AVAILABLE_END
- #define __SPI_AVAILABLE_END(...)
+ #define __SPI_AVAILABLE_END
#endif
#ifndef __SPI_DEPRECATED
diff --git a/lib/libc/include/any-macos-any/AvailabilityInternal.h b/lib/libc/include/any-macos-any/AvailabilityInternal.h
index 736852841b..318c2f9033 100644
--- a/lib/libc/include/any-macos-any/AvailabilityInternal.h
+++ b/lib/libc/include/any-macos-any/AvailabilityInternal.h
@@ -33,81 +33,93 @@
#include <AvailabilityVersions.h>
#ifndef __MAC_OS_X_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(macos)
- #define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_15_5
- #endif
- #elif __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
- #define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
- #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_15_5
- #endif /* __has_builtin(__is_target_os) && __is_target_os(macos) */
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(macos)
+ #define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_26_0
+ #endif
+ #elif __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+ #define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+ #define __MAC_OS_X_VERSION_MAX_ALLOWED __MAC_26_0
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __MAC_OS_X_VERSION_MIN_REQUIRED */
#ifndef __IPHONE_OS_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(ios)
- #define __IPHONE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_18_5
- #endif
- #elif __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
- #define __IPHONE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
- #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_18_5
- #endif /* __has_builtin(__is_target_os) && __is_target_os(ios) */
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(ios)
+ #define __IPHONE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_26_0
+ #endif
+ #elif __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
+ #define __IPHONE_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__
+ #define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_26_0
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED */
#ifndef __WATCH_OS_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(watchos)
- #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __WATCH_OS_VERSION_MAX_ALLOWED __WATCHOS_11_5
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(watchos)
+ #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __WATCH_OS_VERSION_MAX_ALLOWED __WATCHOS_26_0
+ /* for compatibility with existing code. New code should use platform specific checks */
+ #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
+ #endif
+ #elif __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
+ #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
+ #define __WATCH_OS_VERSION_MAX_ALLOWED __WATCHOS_26_0
/* for compatibility with existing code. New code should use platform specific checks */
#define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
- #endif
- #elif __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
- #define __WATCH_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__
- #define __WATCH_OS_VERSION_MAX_ALLOWED __WATCHOS_11_5
- /* for compatibility with existing code. New code should use platform specific checks */
- #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
- #endif /* __has_builtin(__is_target_os) && __is_target_os(watchos) */
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __WATCH_OS_VERSION_MIN_REQUIRED */
#ifndef __TV_OS_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(tvos)
- #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_18_5
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(tvos)
+ #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_26_0
+ /* for compatibility with existing code. New code should use platform specific checks */
+ #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
+ #endif
+ #elif __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
+ #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
+ #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_26_0
/* for compatibility with existing code. New code should use platform specific checks */
#define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
- #endif
- #elif __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
- #define __TV_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__
- #define __TV_OS_VERSION_MAX_ALLOWED __TVOS_18_5
- /* for compatibility with existing code. New code should use platform specific checks */
- #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_9_0
- #endif /* __has_builtin(__is_target_os) && __is_target_os(tvos) */
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __TV_OS_VERSION_MIN_REQUIRED */
#ifndef __DRIVERKIT_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(driverkit)
- #define __DRIVERKIT_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __DRIVERKIT_VERSION_MAX_ALLOWED __DRIVERKIT_24_5
- #endif
- #endif /* __has_builtin(__is_target_os) && __is_target_os(driverkit) */
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(driverkit)
+ #define __DRIVERKIT_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __DRIVERKIT_VERSION_MAX_ALLOWED __DRIVERKIT_25_0
+ #endif
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __DRIVERKIT_VERSION_MIN_REQUIRED */
#ifndef __VISION_OS_VERSION_MIN_REQUIRED
- #if defined(__has_builtin) && __has_builtin(__is_target_os)
- #if __is_target_os(visionos)
- #define __VISION_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
- #define __VISION_OS_VERSION_MAX_ALLOWED __VISIONOS_2_5
- /* for compatibility with existing code. New code should use platform specific checks */
- #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_17_1
- #endif
- #endif /* __has_builtin(__is_target_os) && __is_target_os(visionos) */
+ #if defined(__has_builtin)
+ #if __has_builtin(__is_target_os)
+ #if __is_target_os(visionos)
+ #define __VISION_OS_VERSION_MIN_REQUIRED __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__
+ #define __VISION_OS_VERSION_MAX_ALLOWED __VISIONOS_26_0
+ /* for compatibility with existing code. New code should use platform specific checks */
+ #define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_17_1
+ #endif
+ #endif /* __has_builtin(__is_target_os) */
+ #endif /* defined(__has_builtin) */
#endif /* __VISION_OS_VERSION_MIN_REQUIRED */
diff --git a/lib/libc/include/any-macos-any/AvailabilityVersions.h b/lib/libc/include/any-macos-any/AvailabilityVersions.h
index b93b1d05b2..79ad3f6737 100644
--- a/lib/libc/include/any-macos-any/AvailabilityVersions.h
+++ b/lib/libc/include/any-macos-any/AvailabilityVersions.h
@@ -74,7 +74,6 @@
#define __MAC_12_7 120700
#define __MAC_13_0 130000
#define __MAC_13_1 130100
-#define __MAC_13_1 130100
#define __MAC_13_2 130200
#define __MAC_13_3 130300
#define __MAC_13_4 130400
@@ -95,6 +94,9 @@
#define __MAC_15_3 150300
#define __MAC_15_4 150400
#define __MAC_15_5 150500
+#define __MAC_15_6 150600
+#define __MAC_16_0 160000
+#define __MAC_26_0 260000
/* __MAC__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
#define __IPHONE_2_0 20000
@@ -149,8 +151,6 @@
#define __IPHONE_14_2 140200
#define __IPHONE_14_3 140300
#define __IPHONE_14_5 140500
-#define __IPHONE_14_4 140400
-#define __IPHONE_14_5 140500
#define __IPHONE_14_6 140600
#define __IPHONE_14_7 140700
#define __IPHONE_14_8 140800
@@ -185,6 +185,9 @@
#define __IPHONE_18_3 180300
#define __IPHONE_18_4 180400
#define __IPHONE_18_5 180500
+#define __IPHONE_18_6 180600
+#define __IPHONE_19_0 190000
+#define __IPHONE_26_0 260000
/* __IPHONE__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
#define __WATCHOS_1_0 10000
@@ -242,6 +245,9 @@
#define __WATCHOS_11_3 110300
#define __WATCHOS_11_4 110400
#define __WATCHOS_11_5 110500
+#define __WATCHOS_11_6 110600
+#define __WATCHOS_12_0 120000
+#define __WATCHOS_26_0 260000
/* __WATCHOS__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
#define __TVOS_9_0 90000
@@ -299,6 +305,9 @@
#define __TVOS_18_3 180300
#define __TVOS_18_4 180400
#define __TVOS_18_5 180500
+#define __TVOS_18_6 180600
+#define __TVOS_19_0 190000
+#define __TVOS_26_0 260000
/* __TVOS__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
#define __BRIDGEOS_2_0 20000
@@ -317,7 +326,6 @@
#define __BRIDGEOS_6_6 60600
#define __BRIDGEOS_7_0 70000
#define __BRIDGEOS_7_1 70100
-#define __BRIDGEOS_7_1 70100
#define __BRIDGEOS_7_2 70200
#define __BRIDGEOS_7_3 70300
#define __BRIDGEOS_7_4 70400
@@ -335,6 +343,8 @@
#define __BRIDGEOS_9_3 90300
#define __BRIDGEOS_9_4 90400
#define __BRIDGEOS_9_5 90500
+#define __BRIDGEOS_9_6 90600
+#define __BRIDGEOS_10_0 100000
#define __DRIVERKIT_19_0 190000
@@ -357,6 +367,8 @@
#define __DRIVERKIT_24_3 240300
#define __DRIVERKIT_24_4 240400
#define __DRIVERKIT_24_5 240500
+#define __DRIVERKIT_24_6 240600
+#define __DRIVERKIT_25_0 250000
/* __DRIVERKIT__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
#define __VISIONOS_1_0 10000
@@ -369,6 +381,9 @@
#define __VISIONOS_2_3 20300
#define __VISIONOS_2_4 20400
#define __VISIONOS_2_5 20500
+#define __VISIONOS_2_6 20600
+#define __VISIONOS_3_0 30000
+#define __VISIONOS_26_0 260000
/* __VISIONOS__NA is not defined to a value but is used as a token by macros to indicate that the API is unavailable */
@@ -436,7 +451,6 @@
#define MAC_OS_VERSION_12_7 __MAC_12_7
#define MAC_OS_VERSION_13_0 __MAC_13_0
#define MAC_OS_VERSION_13_1 __MAC_13_1
-#define MAC_OS_VERSION_13_1 __MAC_13_1
#define MAC_OS_VERSION_13_2 __MAC_13_2
#define MAC_OS_VERSION_13_3 __MAC_13_3
#define MAC_OS_VERSION_13_4 __MAC_13_4
@@ -457,6 +471,9 @@
#define MAC_OS_VERSION_15_3 __MAC_15_3
#define MAC_OS_VERSION_15_4 __MAC_15_4
#define MAC_OS_VERSION_15_5 __MAC_15_5
+#define MAC_OS_VERSION_15_6 __MAC_15_6
+#define MAC_OS_VERSION_16_0 __MAC_16_0
+#define MAC_OS_VERSION_26_0 __MAC_26_0
#endif /* #if (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) || defined(_DARWIN_C_SOURCE) */
diff --git a/lib/libc/include/any-macos-any/_bounds.h b/lib/libc/include/any-macos-any/_bounds.h
index eb3f70a68a..71440b05a2 100644
--- a/lib/libc/include/any-macos-any/_bounds.h
+++ b/lib/libc/include/any-macos-any/_bounds.h
@@ -42,6 +42,8 @@
#define _LIBC_SINGLE_BY_DEFAULT() __ptrcheck_abi_assume_single()
#define _LIBC_PTRCHECK_REPLACED(R) __ptrcheck_unavailable_r(R)
+#define _LIBC_FORGE_PTR(P, S) __unsafe_forge_bidi_indexable(__typeof__(*P) *, P, S)
+
#else /* _LIBC_ANNOTATE_BOUNDS */
#define _LIBC_COUNT(x)
@@ -58,6 +60,8 @@
#define _LIBC_SINGLE_BY_DEFAULT()
#define _LIBC_PTRCHECK_REPLACED(R)
+#define _LIBC_FORGE_PTR(P, S) (P)
+
#endif /* _LIBC_ANNOTATE_BOUNDS */
#endif /* _LIBC_BOUNDS_H_ */
diff --git a/lib/libc/include/any-macos-any/_ctermid.h b/lib/libc/include/any-macos-any/_ctermid.h
index fc0ec073b2..b21734e6fb 100644
--- a/lib/libc/include/any-macos-any/_ctermid.h
+++ b/lib/libc/include/any-macos-any/_ctermid.h
@@ -27,13 +27,15 @@
#include <sys/cdefs.h>
#include <_bounds.h>
+#ifndef _LIBC_COUNT__L_CTERMID
+#define _LIBC_COUNT__L_CTERMID _LIBC_UNSAFE_INDEXABLE
+#endif /* _LIBC_COUNT__L_CTERMID */
+
_LIBC_SINGLE_BY_DEFAULT()
__BEGIN_DECLS
-#define L_ctermid 1024 /* size for ctermid(); PATH_MAX */
-
-char *_LIBC_CSTR ctermid(char *_LIBC_COUNT_OR_NULL(L_ctermid));
+char *_LIBC_CSTR ctermid(char *_LIBC_COUNT__L_CTERMID);
__END_DECLS
diff --git a/lib/libc/include/any-macos-any/_locale.h b/lib/libc/include/any-macos-any/_locale.h
index 540d16b070..2b18a91701 100644
--- a/lib/libc/include/any-macos-any/_locale.h
+++ b/lib/libc/include/any-macos-any/_locale.h
@@ -41,6 +41,10 @@
#include <_bounds.h>
#include <_types.h>
+#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE >= 200809L
+#include <_locale_posix2008.h>
+#endif
+
_LIBC_SINGLE_BY_DEFAULT()
struct lconv {
@@ -72,33 +76,8 @@ struct lconv {
#include <sys/_types/_null.h>
-#define LC_ALL_MASK ( LC_COLLATE_MASK \
- | LC_CTYPE_MASK \
- | LC_MESSAGES_MASK \
- | LC_MONETARY_MASK \
- | LC_NUMERIC_MASK \
- | LC_TIME_MASK )
-#define LC_COLLATE_MASK (1 << 0)
-#define LC_CTYPE_MASK (1 << 1)
-#define LC_MESSAGES_MASK (1 << 2)
-#define LC_MONETARY_MASK (1 << 3)
-#define LC_NUMERIC_MASK (1 << 4)
-#define LC_TIME_MASK (1 << 5)
-
-#define _LC_NUM_MASK 6
-#define _LC_LAST_MASK (1 << (_LC_NUM_MASK - 1))
-
-#define LC_GLOBAL_LOCALE ((locale_t)-1)
-#define LC_C_LOCALE ((locale_t)NULL)
-
-#include <_types/_locale_t.h>
-
__BEGIN_DECLS
-locale_t duplocale(locale_t);
-int freelocale(locale_t);
struct lconv *localeconv(void);
-locale_t newlocale(int, __const char *, locale_t);
-locale_t uselocale(locale_t);
__END_DECLS
#endif /* __LOCALE_H_ */
diff --git a/lib/libc/include/any-macos-any/_locale_posix2008.h b/lib/libc/include/any-macos-any/_locale_posix2008.h
new file mode 100644
index 0000000000..bc22722a5a
--- /dev/null
+++ b/lib/libc/include/any-macos-any/_locale_posix2008.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2005 - 2025 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#ifndef __LOCALE_POSIX2008_H_
+#define __LOCALE_POSIX2008_H_
+
+#include <sys/cdefs.h>
+#include <_types.h>
+
+_LIBC_SINGLE_BY_DEFAULT()
+
+/*
+ * These definitions were all historically provided by <xlocale.h>, but they
+ * became standardized in POSIX.1-2008. We make them available via either
+ * <xlocale.h> or <locale.h> at the appropriate conformance level.
+ */
+#define LC_ALL_MASK ( LC_COLLATE_MASK \
+ | LC_CTYPE_MASK \
+ | LC_MESSAGES_MASK \
+ | LC_MONETARY_MASK \
+ | LC_NUMERIC_MASK \
+ | LC_TIME_MASK )
+#define LC_COLLATE_MASK (1 << 0)
+#define LC_CTYPE_MASK (1 << 1)
+#define LC_MESSAGES_MASK (1 << 2)
+#define LC_MONETARY_MASK (1 << 3)
+#define LC_NUMERIC_MASK (1 << 4)
+#define LC_TIME_MASK (1 << 5)
+
+#define _LC_NUM_MASK 6
+#define _LC_LAST_MASK (1 << (_LC_NUM_MASK - 1))
+
+#define LC_GLOBAL_LOCALE ((locale_t)-1)
+#define LC_C_LOCALE ((locale_t)NULL)
+
+#include <_types/_locale_t.h>
+
+__BEGIN_DECLS
+locale_t duplocale(locale_t);
+int freelocale(locale_t);
+locale_t newlocale(int, __const char *, locale_t);
+locale_t uselocale(locale_t);
+__END_DECLS
+
+#endif /* __LOCALE_POSIX2008_H_ */
diff --git a/lib/libc/include/any-macos-any/_stdio.h b/lib/libc/include/any-macos-any/_stdio.h
index e8b463566e..b2234bd7cf 100644
--- a/lib/libc/include/any-macos-any/_stdio.h
+++ b/lib/libc/include/any-macos-any/_stdio.h
@@ -308,6 +308,10 @@ __END_DECLS
#if __DARWIN_C_LEVEL >= 198808L
+#define L_ctermid 1024 /* size for ctermid(); PATH_MAX */
+#undef _LIBC_COUNT__L_CTERMID
+#define _LIBC_COUNT__L_CTERMID _LIBC_COUNT_OR_NULL(L_ctermid)
+
#include <_ctermid.h>
__BEGIN_DECLS
diff --git a/lib/libc/include/any-macos-any/_stdlib.h b/lib/libc/include/any-macos-any/_stdlib.h
index cfe404386b..15ad16a132 100644
--- a/lib/libc/include/any-macos-any/_stdlib.h
+++ b/lib/libc/include/any-macos-any/_stdlib.h
@@ -123,18 +123,23 @@ typedef struct {
#define RAND_MAX 0x7fffffff
-// When _USE_EXTENDED_LOCALES_ is enabled (by including xlocale.h),
-// MB_CUR_MAX is defined by xlocale.h.
-#if !defined(MB_CUR_MAX) && !defined(_USE_EXTENDED_LOCALES_)
#if __has_feature(modules)
// When clang modules are enabled, there can only be one definition of
// MB_CUR_MAX, and that needs to be the same one used by xlocale.h.
#include <_mb_cur_max.h>
-#else
+#else /* !__has_feature(modules) */
+#ifndef MB_CUR_MAX
+#ifdef _USE_EXTENDED_LOCALES_
+#define MB_CUR_MAX (___mb_cur_max())
+#ifndef MB_CUR_MAX_L
+#define MB_CUR_MAX_L(x) (___mb_cur_max_l(x))
+#endif /* !MB_CUR_MAX_L */
+#else /* !_USE_EXTENDED_LOCALES_ */
extern int __mb_cur_max;
#define MB_CUR_MAX __mb_cur_max
+#endif /* _USE_EXTENDED_LOCALES_ */
+#endif /* MB_CUR_MAX */
#endif /* __has_feature(modules) */
-#endif /* !MB_CUR_MAX && !_USE_EXTENDED_LOCALES_ */
#include <malloc/_malloc.h>
#include <_abort.h>
diff --git a/lib/libc/include/any-macos-any/_string.h b/lib/libc/include/any-macos-any/_string.h
index f06e5fef16..a07a835d3e 100644
--- a/lib/libc/include/any-macos-any/_string.h
+++ b/lib/libc/include/any-macos-any/_string.h
@@ -100,7 +100,7 @@ char *_LIBC_CSTR
_LIBC_PTRCHECK_REPLACED(strlcat);
int strncmp(const char *_LIBC_UNSAFE_INDEXABLE __s1,
const char *_LIBC_UNSAFE_INDEXABLE __s2, size_t __n);
-char *_LIBC_UNSAFE_INDEXABLE
+char *_LIBC_COUNT(__n)
strncpy(char *_LIBC_COUNT(__n) __dst,
const char *_LIBC_UNSAFE_INDEXABLE __src, size_t __n)
_LIBC_PTRCHECK_REPLACED(strlcpy);
@@ -155,7 +155,7 @@ __END_DECLS
__BEGIN_DECLS
char *_LIBC_CSTR
stpcpy(char *_LIBC_UNSAFE_INDEXABLE __dst, const char *__src) _LIBC_PTRCHECK_REPLACED(strlcpy);
-char *_LIBC_CSTR
+char *_LIBC_COUNT(__n)
stpncpy(char *_LIBC_UNSAFE_INDEXABLE __dst,
const char *_LIBC_UNSAFE_INDEXABLE __src, size_t __n)
__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3)
diff --git a/lib/libc/include/any-macos-any/_xlocale.h b/lib/libc/include/any-macos-any/_xlocale.h
index 6f290567eb..fd797e58e6 100644
--- a/lib/libc/include/any-macos-any/_xlocale.h
+++ b/lib/libc/include/any-macos-any/_xlocale.h
@@ -32,6 +32,7 @@
#endif /* _USE_EXTENDED_LOCALES_ */
#include <_locale.h>
+#include <_locale_posix2008.h>
#include <__xlocale.h>
_LIBC_SINGLE_BY_DEFAULT()
diff --git a/lib/libc/include/any-macos-any/assert.h b/lib/libc/include/any-macos-any/assert.h
index 8a87524ae4..6b84985a96 100644
--- a/lib/libc/include/any-macos-any/assert.h
+++ b/lib/libc/include/any-macos-any/assert.h
@@ -40,9 +40,6 @@
*/
#include <sys/cdefs.h>
-#ifdef __cplusplus
-#include <stdlib.h>
-#endif /* __cplusplus */
/*
* Unlike other ANSI header files, <assert.h> may usefully be included
diff --git a/lib/libc/include/any-macos-any/mach/host_info.h b/lib/libc/include/any-macos-any/mach/host_info.h
index 63b99bef18..6d8df42de6 100644
--- a/lib/libc/include/any-macos-any/mach/host_info.h
+++ b/lib/libc/include/any-macos-any/mach/host_info.h
@@ -207,11 +207,12 @@ typedef struct vm_purgeable_info *host_purgable_info_t;
/* size of the latest version of the structure */
#define HOST_VM_INFO64_LATEST_COUNT HOST_VM_INFO64_COUNT
-#define HOST_VM_INFO64_REV1_COUNT HOST_VM_INFO64_LATEST_COUNT
+#define HOST_VM_INFO64_REV2_COUNT HOST_VM_INFO64_COUNT
+#define HOST_VM_INFO64_REV1_COUNT ((mach_msg_type_number_t) \
+ (offsetof(vm_statistics64_data_t, swapped_count) / sizeof(integer_t)))
/* previous versions: adjust the size according to what was added each time */
-#define HOST_VM_INFO64_REV0_COUNT /* added compression and swapper info (14 ints) */ \
- ((mach_msg_type_number_t) \
- (HOST_VM_INFO64_REV1_COUNT - 14))
+#define HOST_VM_INFO64_REV0_COUNT ((mach_msg_type_number_t) \
+ (offsetof(vm_statistics64_data_t, decompressions) / sizeof(integer_t)))
/* in <mach/vm_statistics.h> */
/* vm_extmod_statistics */
diff --git a/lib/libc/include/any-macos-any/mach/mach_port.h b/lib/libc/include/any-macos-any/mach/mach_port.h
index e19136b410..1bb406737c 100644
--- a/lib/libc/include/any-macos-any/mach/mach_port.h
+++ b/lib/libc/include/any-macos-any/mach/mach_port.h
@@ -501,7 +501,7 @@ kern_return_t mach_port_kobject
(
ipc_space_read_t task,
mach_port_name_t name,
- natural_t *object_type,
+ ipc_info_object_type_t *object_type,
mach_vm_address_t *object_addr
);
@@ -610,7 +610,7 @@ kern_return_t mach_port_kobject_description
(
ipc_space_read_t task,
mach_port_name_t name,
- natural_t *object_type,
+ ipc_info_object_type_t *object_type,
mach_vm_address_t *object_addr,
kobject_description_t description
);
@@ -1690,7 +1690,7 @@ union __RequestUnion__mach_port_subsystem {
mach_msg_header_t Head;
NDR_record_t NDR;
kern_return_t RetCode;
- natural_t object_type;
+ ipc_info_object_type_t object_type;
mach_vm_address_t object_addr;
} __Reply__mach_port_kobject_t __attribute__((unused));
#ifdef __MigPackStructs
@@ -1790,7 +1790,7 @@ union __RequestUnion__mach_port_subsystem {
mach_msg_header_t Head;
NDR_record_t NDR;
kern_return_t RetCode;
- natural_t object_type;
+ ipc_info_object_type_t object_type;
mach_vm_address_t object_addr;
mach_msg_type_number_t descriptionOffset; /* MiG doesn't use it */
mach_msg_type_number_t descriptionCnt;
diff --git a/lib/libc/include/any-macos-any/mach/mach_traps.h b/lib/libc/include/any-macos-any/mach/mach_traps.h
index ed17b20bb4..6bd4a8ec7a 100644
--- a/lib/libc/include/any-macos-any/mach/mach_traps.h
+++ b/lib/libc/include/any-macos-any/mach/mach_traps.h
@@ -68,6 +68,7 @@
#include <stdint.h>
+#include <mach/error.h>
#include <mach/std_types.h>
#include <mach/mach_types.h>
#include <mach/kern_return.h>
@@ -296,6 +297,10 @@ extern kern_return_t debug_control_port_for_pid(
int pid,
mach_port_name_t *t);
+extern mach_error_t mach_vm_reclaim_update_kernel_accounting_trap(
+ mach_port_name_t target_tport,
+ uint64_t *bytes_reclaimed);
+
__END_DECLS
diff --git a/lib/libc/include/any-macos-any/mach/machine.h b/lib/libc/include/any-macos-any/mach/machine.h
index 8c496f9222..d43f632065 100644
--- a/lib/libc/include/any-macos-any/mach/machine.h
+++ b/lib/libc/include/any-macos-any/mach/machine.h
@@ -332,6 +332,9 @@ typedef integer_t cpu_threadtype_t;
#define CPU_SUBTYPE_ARM_V7M ((cpu_subtype_t) 15) /* Not meant to be run under xnu */
#define CPU_SUBTYPE_ARM_V7EM ((cpu_subtype_t) 16) /* Not meant to be run under xnu */
#define CPU_SUBTYPE_ARM_V8M ((cpu_subtype_t) 17) /* Not meant to be run under xnu */
+#define CPU_SUBTYPE_ARM_V8M_MAIN CPU_SUBTYPE_ARM_V8M /* Not meant to be run under xnu */
+#define CPU_SUBTYPE_ARM_V8M_BASE ((cpu_subtype_t) 18) /* Not meant to be run under xnu */
+#define CPU_SUBTYPE_ARM_V8_1M_MAIN ((cpu_subtype_t) 19) /* Not meant to be run under xnu */
/*
* ARM64 subtypes
@@ -406,6 +409,8 @@ typedef integer_t cpu_threadtype_t;
#define CPUFAMILY_ARM_BRAVA 0x17d5b93a
#define CPUFAMILY_ARM_TAHITI 0x75d4acb9
#define CPUFAMILY_ARM_TUPAI 0x204526d0
+#define CPUFAMILY_ARM_THERA 0xab345f09
+#define CPUFAMILY_ARM_TILOS 0x01d7a72b
/* Described in rdar://64125549 */
#define CPUSUBFAMILY_UNKNOWN 0
diff --git a/lib/libc/include/any-macos-any/mach/message.h b/lib/libc/include/any-macos-any/mach/message.h
index 78d98c0d8b..dcf6eba833 100644
--- a/lib/libc/include/any-macos-any/mach/message.h
+++ b/lib/libc/include/any-macos-any/mach/message.h
@@ -839,7 +839,7 @@ typedef kern_return_t mach_msg_return_t;
#define MACH_SEND_INVALID_RT_OOL_SIZE 0x10000015
/* compatibility: no longer a returned error */
#define MACH_SEND_NO_GRANT_DEST 0x10000016
-/* The destination port doesn't accept ports in body */
+/* compatibility: no longer a returned error */
#define MACH_SEND_MSG_FILTERED 0x10000017
/* Message send was rejected by message filter */
#define MACH_SEND_AUX_TOO_SMALL 0x10000018
@@ -885,7 +885,6 @@ typedef kern_return_t mach_msg_return_t;
/* invalid receive arguments, receive has not started */
-
__BEGIN_DECLS
/*
diff --git a/lib/libc/include/any-macos-any/mach/port.h b/lib/libc/include/any-macos-any/mach/port.h
index bb9a2bc69e..3e225dd0da 100644
--- a/lib/libc/include/any-macos-any/mach/port.h
+++ b/lib/libc/include/any-macos-any/mach/port.h
@@ -152,28 +152,12 @@ typedef mach_port_t *mach_port_array_t;
* and reused too quickly [to catch right/reference counting bugs].
* The dividing line between the constituent parts is exposed so
* that efficient "mach_port_name_t to data structure pointer"
- * conversion implementation can be made. But it is possible
- * for user-level code to assign their own names to Mach ports.
- * These are not required to participate in this algorithm. So
- * care should be taken before "assuming" this model.
- *
+ * conversion implementation can be made.
*/
-#ifndef NO_PORT_GEN
-
#define MACH_PORT_INDEX(name) ((name) >> 8)
#define MACH_PORT_GEN(name) (((name) & 0xff) << 24)
-#define MACH_PORT_MAKE(index, gen) \
- (((index) << 8) | (gen) >> 24)
-
-#else /* NO_PORT_GEN */
-
-#define MACH_PORT_INDEX(name) (name)
-#define MACH_PORT_GEN(name) (0)
-#define MACH_PORT_MAKE(index, gen) (index)
-
-#endif /* NO_PORT_GEN */
-
+#define MACH_PORT_MAKE(index, gen) (((index) << 8) | ((gen) >> 24))
/*
* These are the different rights a task may have for a port.
@@ -281,7 +265,7 @@ typedef struct mach_port_limits {
#define MACH_PORT_STATUS_FLAG_REVIVE 0x10
#define MACH_PORT_STATUS_FLAG_TASKPTR 0x20
#define MACH_PORT_STATUS_FLAG_GUARD_IMMOVABLE_RECEIVE 0x40
-#define MACH_PORT_STATUS_FLAG_NO_GRANT 0x80
+#define MACH_PORT_STATUS_FLAG_NO_GRANT 0x80 /* Obsolete */
typedef struct mach_port_info_ext {
mach_port_status_t mpie_status;
@@ -345,35 +329,94 @@ typedef struct mach_service_port_info {
typedef struct mach_service_port_info * mach_service_port_info_t;
/*
+ * Platform binaries are not allowed to send OOL port array to any port.
+ *
+ * MACH_MSG_OOL_PORTS_DESCRIPTOR are allowed to be sent ONLY to receive
+ * rights that are explicitly allow to receive that descriptor.
+ *
+ * Such ports have a dedicated port type, and are created using the
+ * MPO_CONNECTION_PORT_WITH_PORT_ARRAY flag.
+ *
+ * Creation of such ports requires the binary to have the following entitlement.
+ */
+#define MACH_PORT_CONNECTION_PORT_WITH_PORT_ARRAY "com.apple.developer.allow-connection-port-with-port-array"
+
+/* Allows 1p process to create provisional reply port (to be rename to weak reply port) */
+#define MACH_PORT_PROVISIONAL_REPLY_ENTITLEMENT "com.apple.private.allow-weak-reply-port"
+
+/*
* Flags for mach_port_options (used for
* invocation of mach_port_construct).
* Indicates attributes to be set for the newly
* allocated port.
*/
-#define MPO_CONTEXT_AS_GUARD 0x01 /* Add guard to the port */
-#define MPO_QLIMIT 0x02 /* Set qlimit for the port msg queue */
-#define MPO_TEMPOWNER 0x04 /* Set the tempowner bit of the port */
-#define MPO_IMPORTANCE_RECEIVER 0x08 /* Mark the port as importance receiver */
-#define MPO_INSERT_SEND_RIGHT 0x10 /* Insert a send right for the port */
-#define MPO_STRICT 0x20 /* Apply strict guarding for port */
-#define MPO_DENAP_RECEIVER 0x40 /* Mark the port as App de-nap receiver */
-#define MPO_IMMOVABLE_RECEIVE 0x80 /* Mark the port as immovable; protected by the guard context */
-#define MPO_FILTER_MSG 0x100 /* Allow message filtering */
-#define MPO_TG_BLOCK_TRACKING 0x200 /* Track blocking relationship for thread group during sync IPC */
-#define MPO_SERVICE_PORT 0x400 /* Create a service port with the given name; should be used only by launchd */
-#define MPO_CONNECTION_PORT 0x800 /* Derive new peer connection port from a given service port */
-#define MPO_REPLY_PORT 0x1000 /* Designate port as a reply port. */
-#define MPO_ENFORCE_REPLY_PORT_SEMANTICS 0x2000 /* When talking to this port, local port of mach msg needs to follow reply port semantics.*/
-#define MPO_PROVISIONAL_REPLY_PORT 0x4000 /* Designate port as a provisional reply port. */
-#define MPO_EXCEPTION_PORT 0x8000 /* Used for hardened exceptions - immovable */
+/* MPO options flags */
+#define MPO_CONTEXT_AS_GUARD 0x01 /* Add guard to the port */
+#define MPO_QLIMIT 0x02 /* Set qlimit for the port msg queue */
+#define MPO_TEMPOWNER 0x04 /* Set the tempowner bit of the port */
+#define MPO_IMPORTANCE_RECEIVER 0x08 /* Mark the port as importance receiver */
+#define MPO_INSERT_SEND_RIGHT 0x10 /* Insert a send right for the port */
+#define MPO_STRICT 0x20 /* Apply strict guarding for port */
+#define MPO_DENAP_RECEIVER 0x40 /* Mark the port as App de-nap receiver */
+#define MPO_IMMOVABLE_RECEIVE 0x80 /* Mark the port as immovable; protected by the guard context */
+#define MPO_FILTER_MSG 0x100 /* Allow message filtering */
+#define MPO_TG_BLOCK_TRACKING 0x200 /* Track blocking relationship for thread group during sync IPC */
+#define MPO_ENFORCE_REPLY_PORT_SEMANTICS 0x2000 /* When talking to this port, local port of mach msg needs to follow reply port semantics.*/
+/* This service port has requested security hardening */
+#define MPO_STRICT_SERVICE_PORT (MPO_SERVICE_PORT | MPO_ENFORCE_REPLY_PORT_SEMANTICS)
+
+#define MPO_OPTIONS_MASK \
+ (MPO_CONTEXT_AS_GUARD | \
+ MPO_QLIMIT | \
+ MPO_TEMPOWNER | \
+ MPO_IMPORTANCE_RECEIVER | \
+ MPO_INSERT_SEND_RIGHT | \
+ MPO_STRICT | \
+ MPO_DENAP_RECEIVER | \
+ MPO_IMMOVABLE_RECEIVE | \
+ MPO_FILTER_MSG | \
+ MPO_TG_BLOCK_TRACKING | \
+ MPO_ENFORCE_REPLY_PORT_SEMANTICS)
+
+/* MPO port type flags */
+#define MPO_MAKE_PORT_TYPE(a, b) (((a & 0x7) << 14) | ((b & 0x7) << 10))
+#define MPO_PORT_TYPE_MASK MPO_MAKE_PORT_TYPE(0x7, 0x7) /* 0x1dc00 */
+/* These need to be defined for libxpc and other clients who `#ifdef` */
+ #define MPO_PORT MPO_PORT
+ #define MPO_SERVICE_PORT MPO_SERVICE_PORT
+ #define MPO_CONNECTION_PORT MPO_CONNECTION_PORT
+ #define MPO_REPLY_PORT MPO_REPLY_PORT
+ #define MPO_PROVISIONAL_REPLY_PORT MPO_PROVISIONAL_REPLY_PORT
+ #define MPO_EXCEPTION_PORT MPO_EXCEPTION_PORT
+ #define MPO_CONNECTION_PORT_WITH_PORT_ARRAY MPO_CONNECTION_PORT_WITH_PORT_ARRAY
+__options_decl(mpo_flags_t, uint32_t, {
+ /* Your classic IOT_PORT, an uninteresting message queue */
+ MPO_PORT = MPO_MAKE_PORT_TYPE(0, 0), /* 0x0 */
+ /* Create a service port with the given name; should be used only by launchd */
+ MPO_SERVICE_PORT = MPO_MAKE_PORT_TYPE(0, 1), /* 0x400 */
+ /* Derive new peer connection port from a given service port */
+ MPO_CONNECTION_PORT = MPO_MAKE_PORT_TYPE(0, 2), /* 0x800 */
+ /* Designate port as a reply port */
+ MPO_REPLY_PORT = MPO_MAKE_PORT_TYPE(0, 4), /* 0x1000 */
+ /* Designate port as a provisional (fake) reply port */
+ MPO_PROVISIONAL_REPLY_PORT = MPO_MAKE_PORT_TYPE(1, 0), /* 0x4000 */
+ /* Used for hardened exceptions - immovable */
+ MPO_EXCEPTION_PORT = MPO_MAKE_PORT_TYPE(2, 0), /* 0x8000 */
+ /* Can receive OOL port array descriptors */
+ MPO_CONNECTION_PORT_WITH_PORT_ARRAY = MPO_MAKE_PORT_TYPE(4, 0), /* 0x10000 */
+});
+#define MPO_UNUSED_BITS ~(MPO_OPTIONS_MASK | MPO_PORT_TYPE_MASK)
+
+/* Denotes an anonymous service */
+#define MPO_ANONYMOUS_SERVICE (MACH_PORT_DEAD - 1)
/*
* Structure to define optional attributes for a newly
* constructed port.
*/
typedef struct mach_port_options {
- uint32_t flags; /* Flags defining attributes for port */
+ uint32_t flags;
mach_port_limits_t mpl; /* Message queue limit for port */
union {
uint64_t reserved[2]; /* Reserved */
@@ -405,6 +448,7 @@ typedef mach_port_options_t *mach_port_options_ptr_t;
* but are truly an enum, please add new values in the "holes".
*/
enum mach_port_guard_exception_codes {
+ kGUARD_EXC_NONE = 0, /* never sent */
kGUARD_EXC_DESTROY = 1,
kGUARD_EXC_MOD_REFS = 2,
kGUARD_EXC_INVALID_OPTIONS = 3,
@@ -413,9 +457,14 @@ enum mach_port_guard_exception_codes {
kGUARD_EXC_EXCEPTION_BEHAVIOR_ENFORCE = 6,
kGUARD_EXC_SERVICE_PORT_VIOLATION_FATAL = 7, /* unused, for future sp defense enablement */
kGUARD_EXC_UNGUARDED = 8,
+ kGUARD_EXC_KOBJECT_REPLY_PORT_SEMANTICS = 9,
+ kGUARD_EXC_REQUIRE_REPLY_PORT_SEMANTICS = 10,
kGUARD_EXC_INCORRECT_GUARD = 16,
kGUARD_EXC_IMMOVABLE = 32,
kGUARD_EXC_STRICT_REPLY = 64,
+ kGUARD_EXC_INVALID_NOTIFICATION_REQ = 65,
+ kGUARD_EXC_INVALID_MPO_ENTITLEMENT = 66,
+ kGUARD_EXC_DESCRIPTOR_VIOLATION = 67,
kGUARD_EXC_MSG_FILTERED = 128,
/* start of [optionally] non-fatal guards */
kGUARD_EXC_INVALID_RIGHT = 256,
@@ -434,40 +483,75 @@ enum mach_port_guard_exception_codes {
kGUARD_EXC_RCV_GUARDED_DESC = 0x00100000, /* for development only */
kGUARD_EXC_SERVICE_PORT_VIOLATION_NON_FATAL = 0x00100001, /* unused, for future sp defense enablement */
kGUARD_EXC_PROVISIONAL_REPLY_PORT = 0x00100002,
+ kGUARD_EXC_OOL_PORT_ARRAY_CREATION = 0x00100003, /* unused */
+ kGUARD_EXC_MOVE_PROVISIONAL_REPLY_PORT = 0x00100004,
+ kGUARD_EXC_REPLY_PORT_SINGLE_SO_RIGHT = 0x00100005,
kGUARD_EXC_MOD_REFS_NON_FATAL = 1u << 21,
kGUARD_EXC_IMMOVABLE_NON_FATAL = 1u << 22,
- kGUARD_EXC_REQUIRE_REPLY_PORT_SEMANTICS = 1u << 23,
};
#define MAX_FATAL_kGUARD_EXC_CODE kGUARD_EXC_MSG_FILTERED
#define MAX_OPTIONAL_kGUARD_EXC_CODE kGUARD_EXC_RCV_INVALID_NAME
+
/*
* Mach port guard flags.
*/
-#define MPG_FLAGS_NONE (0x00ull)
+#define MPG_FLAGS_NONE 0x00
/*
* These flags are used as bits in the subcode of kGUARD_EXC_STRICT_REPLY exceptions.
*/
-#define MPG_FLAGS_STRICT_REPLY_INVALID_REPLY_DISP (0x01ull << 56)
-#define MPG_FLAGS_STRICT_REPLY_INVALID_REPLY_PORT (0x02ull << 56)
-#define MPG_FLAGS_STRICT_REPLY_INVALID_VOUCHER (0x04ull << 56)
-#define MPG_FLAGS_STRICT_REPLY_NO_BANK_ATTR (0x08ull << 56)
-#define MPG_FLAGS_STRICT_REPLY_MISMATCHED_PERSONA (0x10ull << 56)
-#define MPG_FLAGS_STRICT_REPLY_MASK (0xffull << 56)
+#define MPG_FLAGS_STRICT_REPLY_INVALID_VOUCHER 0x04
+#define MPG_FLAGS_STRICT_REPLY_MISMATCHED_PERSONA 0x10
/*
* These flags are used as bits in the subcode of kGUARD_EXC_MOD_REFS exceptions.
*/
-#define MPG_FLAGS_MOD_REFS_PINNED_DEALLOC (0x01ull << 56)
-#define MPG_FLAGS_MOD_REFS_PINNED_DESTROY (0x02ull << 56)
-#define MPG_FLAGS_MOD_REFS_PINNED_COPYIN (0x04ull << 56)
+#define MPG_FLAGS_MOD_REFS_PINNED_DEALLOC 0x01
+#define MPG_FLAGS_MOD_REFS_PINNED_DESTROY 0x02
+#define MPG_FLAGS_MOD_REFS_PINNED_COPYIN 0x03
+
+/*
+ * These flags are used as bits in the subcode of kGUARD_EXC_INVALID_RIGHT exceptions.
+ */
+#define MPG_FLAGS_INVALID_RIGHT_RECV 0x01 /* does not have receive right */
+#define MPG_FLAGS_INVALID_RIGHT_DELTA 0x02 /* ipc_right_delta() */
+#define MPG_FLAGS_INVALID_RIGHT_DESTRUCT 0x03 /* ipc_right_destruct() */
+#define MPG_FLAGS_INVALID_RIGHT_COPYIN 0x04 /* ipc_right_copyin() */
+#define MPG_FLAGS_INVALID_RIGHT_DEALLOC 0x05 /* ipc_right_dealloc() */
+#define MPG_FLAGS_INVALID_RIGHT_DEALLOC_KERNEL 0x06 /* mach_port_deallocate_kernel() */
+#define MPG_FLAGS_INVALID_RIGHT_TRANSLATE_PORT 0x07 /* port in ipc_object_translate_port_pset() */
+#define MPG_FLAGS_INVALID_RIGHT_TRANSLATE_PSET 0x08 /* pset in ipc_object_translate_port_pset() */
+
+/*
+ * These flags are used as bits in the subcode of kGUARD_EXC_INVALID_VALUE exceptions.
+ */
+#define MPG_FLAGS_INVALID_VALUE_PEEK 0x01 /* mach_port_peek() */
+#define MPG_FLAGS_INVALID_VALUE_DELTA 0x02 /* ipc_right_delta() */
+#define MPG_FLAGS_INVALID_VALUE_DESTRUCT 0x03 /* ipc_right_destruct() */
+
+/*
+ * These flags are used as bits in the subcode of kGUARD_EXC_KERN_FAILURE exceptions.
+ */
+#define MPG_FLAGS_KERN_FAILURE_TASK 0x01 /* task other than launchd arm pd on service ports */
+#define MPG_FLAGS_KERN_FAILURE_NOTIFY_TYPE 0x02 /* not using IOT_NOTIFICATION_PORT for pd notification */
+#define MPG_FLAGS_KERN_FAILURE_NOTIFY_RECV 0x03 /* notification port not owned by launchd */
+#define MPG_FLAGS_KERN_FAILURE_MULTI_NOTI 0x04 /* register multiple pd notification */
+
+/*
+ * These flags are used as bits in the subcode of kGUARD_EXC_SEND_INVALID_RIGHT exceptions.
+ */
+#define MPG_FLAGS_SEND_INVALID_RIGHT_PORT 0x01 /* ipc_kmsg_copyin_port_descriptor() */
+#define MPG_FLAGS_SEND_INVALID_RIGHT_OOL_PORT 0x02 /* ipc_kmsg_copyin_ool_ports_descriptor() */
+#define MPG_FLAGS_SEND_INVALID_RIGHT_GUARDED 0x03 /* ipc_kmsg_copyin_guarded_port_descriptor */
/*
- * These flags are used as bits in the subcode of kGUARD_EXC_IMMOVABLE exceptions.
+ * These flags are used as bits in the subcode of kGUARD_EXC_INVALID_OPTIONS exceptions.
*/
-#define MPG_FLAGS_IMMOVABLE_PINNED (0x01ull << 56)
+#define MPG_FLAGS_INVALID_OPTIONS_OOL_DISP 0x01 /* ipc_kmsg_copyin_ool_ports_descriptor() */
+#define MPG_FLAGS_INVALID_OPTIONS_OOL_ARRAYS 0x02 /* ipc_validate_kmsg_header_from_user() */
+#define MPG_FLAGS_INVALID_OPTIONS_OOL_RIGHT 0x03 /* ipc_validate_kmsg_header_from_user() */
/*
* Flags for mach_port_guard_with_flags. These flags extend
diff --git a/lib/libc/include/any-macos-any/mach/task_info.h b/lib/libc/include/any-macos-any/mach/task_info.h
index e9e9645fbe..b7118305b1 100644
--- a/lib/libc/include/any-macos-any/mach/task_info.h
+++ b/lib/libc/include/any-macos-any/mach/task_info.h
@@ -511,6 +511,16 @@ typedef struct task_security_config_info * task_security_config_info_t;
#define TASK_SECURITY_CONFIG_INFO_COUNT ((mach_msg_type_number_t) \
(sizeof(struct task_security_config_info) / sizeof(natural_t)))
+
+#define TASK_IPC_SPACE_POLICY_INFO 33 /* Runtime security mitigations configuration for the task */
+struct task_ipc_space_policy_info {
+ uint32_t space_policy; /* Configuration bitmask */
+};
+
+typedef struct task_ipc_space_policy_info * task_ipc_space_policy_info_t;
+#define TASK_IPC_SPACE_POLICY_INFO_COUNT ((mach_msg_type_number_t) \
+ (sizeof(struct task_ipc_space_policy_info) / sizeof(natural_t)))
+
/*
* Type to control EXC_GUARD delivery options for a task
* via task_get/set_exc_guard_behavior interface(s).
diff --git a/lib/libc/include/any-macos-any/mach/task_policy.h b/lib/libc/include/any-macos-any/mach/task_policy.h
index c1bb833820..8ca7f641cf 100644
--- a/lib/libc/include/any-macos-any/mach/task_policy.h
+++ b/lib/libc/include/any-macos-any/mach/task_policy.h
@@ -121,6 +121,7 @@ typedef enum task_role {
TASK_NONUI_APPLICATION = 6,
TASK_DEFAULT_APPLICATION = 7,
TASK_DARWINBG_APPLICATION = 8,
+ TASK_USER_INIT_APPLICATION = 9,
} task_role_t;
struct task_category_policy {
diff --git a/lib/libc/include/any-macos-any/mach/thread_info.h b/lib/libc/include/any-macos-any/mach/thread_info.h
index c31a27b024..1fad20e5a9 100644
--- a/lib/libc/include/any-macos-any/mach/thread_info.h
+++ b/lib/libc/include/any-macos-any/mach/thread_info.h
@@ -74,7 +74,6 @@
#include <mach/time_value.h>
#include <mach/message.h>
#include <mach/machine/vm_types.h>
-
/*
* Generic information structure to allow for expansion.
*/
diff --git a/lib/libc/include/any-macos-any/mach/vm_region.h b/lib/libc/include/any-macos-any/mach/vm_region.h
index db21484456..61f49cd82c 100644
--- a/lib/libc/include/any-macos-any/mach/vm_region.h
+++ b/lib/libc/include/any-macos-any/mach/vm_region.h
@@ -228,6 +228,7 @@ typedef struct vm_region_submap_info vm_region_submap_info_data_t;
(sizeof(vm_region_submap_info_data_t) / sizeof(natural_t)))
struct vm_region_submap_info_64 {
+ /* v0 fields */
vm_prot_t protection; /* present access protection */
vm_prot_t max_protection; /* max avail through vm_prot */
vm_inherit_t inheritance;/* behavior of map/obj on fork */
@@ -245,18 +246,30 @@ struct vm_region_submap_info_64 {
vm_behavior_t behavior; /* access behavior hint */
vm32_object_id_t object_id; /* obj/map name, not a handle */
unsigned short user_wired_count;
+ unsigned short flags;
+ /* v1 fields */
unsigned int pages_reusable;
+ /* v2 fields */
vm_object_id_t object_id_full;
};
typedef struct vm_region_submap_info_64 *vm_region_submap_info_64_t;
typedef struct vm_region_submap_info_64 vm_region_submap_info_data_64_t;
+/*
+ * Note that this size is hard-coded at the MIG boundary in mach_types.defs
+ * so if we ever increase this you'll need to also bump the definition of
+ * vm_region_recurse_info_t.
+ */
#define VM_REGION_SUBMAP_INFO_V2_SIZE \
(sizeof (vm_region_submap_info_data_64_t))
+
+/* v1 size is v2 size minus v2's new fields */
#define VM_REGION_SUBMAP_INFO_V1_SIZE \
(VM_REGION_SUBMAP_INFO_V2_SIZE - \
sizeof (vm_object_id_t) /* object_id_full */ )
+
+/* v0 size is v1 size minus v1's new fields */
#define VM_REGION_SUBMAP_INFO_V0_SIZE \
(VM_REGION_SUBMAP_INFO_V1_SIZE - \
sizeof (unsigned int) /* pages_reusable */ )
@@ -274,6 +287,10 @@ typedef struct vm_region_submap_info_64 vm_region_submap_info_data_64_t
/* set this to the latest version */
#define VM_REGION_SUBMAP_INFO_COUNT_64 VM_REGION_SUBMAP_INFO_V2_COUNT_64
+#define VM_REGION_FLAG_JIT_ENABLED 0x1
+#define VM_REGION_FLAG_TPRO_ENABLED 0x2
+
+
struct vm_region_submap_short_info_64 {
vm_prot_t protection; /* present access protection */
vm_prot_t max_protection; /* max avail through vm_prot */
@@ -288,6 +305,7 @@ struct vm_region_submap_short_info_64 {
vm_behavior_t behavior; /* access behavior hint */
vm32_object_id_t object_id; /* obj/map name, not a handle */
unsigned short user_wired_count;
+ unsigned short flags;
};
typedef struct vm_region_submap_short_info_64 *vm_region_submap_short_info_64_t;
diff --git a/lib/libc/include/any-macos-any/mach/vm_statistics.h b/lib/libc/include/any-macos-any/mach/vm_statistics.h
index be49304820..801325eb19 100644
--- a/lib/libc/include/any-macos-any/mach/vm_statistics.h
+++ b/lib/libc/include/any-macos-any/mach/vm_statistics.h
@@ -66,6 +66,9 @@
#ifndef _MACH_VM_STATISTICS_H_
#define _MACH_VM_STATISTICS_H_
+
+#include <Availability.h>
+#include <os/base.h>
#include <stdbool.h>
#include <sys/cdefs.h>
@@ -74,6 +77,8 @@
__BEGIN_DECLS
+#pragma mark VM Statistics
+
/*
* vm_statistics
*
@@ -141,7 +146,7 @@ struct vm_statistics64 {
natural_t wire_count; /* # of pages wired down */
uint64_t zero_fill_count; /* # of zero fill pages */
uint64_t reactivations; /* # of pages reactivated */
- uint64_t pageins; /* # of pageins */
+ uint64_t pageins; /* # of pageins (lifetime) */
uint64_t pageouts; /* # of pageouts */
uint64_t faults; /* # of faults */
uint64_t cow_faults; /* # of copy-on-writes */
@@ -158,15 +163,17 @@ struct vm_statistics64 {
natural_t speculative_count; /* # of pages speculative */
/* added for rev1 */
- uint64_t decompressions; /* # of pages decompressed */
- uint64_t compressions; /* # of pages compressed */
- uint64_t swapins; /* # of pages swapped in (via compression segments) */
- uint64_t swapouts; /* # of pages swapped out (via compression segments) */
+ uint64_t decompressions; /* # of pages decompressed (lifetime) */
+ uint64_t compressions; /* # of pages compressed (lifetime) */
+ uint64_t swapins; /* # of pages swapped in via compressor segments (lifetime) */
+ uint64_t swapouts; /* # of pages swapped out via compressor segments (lifetime) */
natural_t compressor_page_count; /* # of pages used by the compressed pager to hold all the compressed data */
natural_t throttled_count; /* # of pages throttled */
natural_t external_page_count; /* # of pages that are file-backed (non-swap) */
natural_t internal_page_count; /* # of pages that are anonymous */
uint64_t total_uncompressed_pages_in_compressor; /* # of pages (uncompressed) held within the compressor. */
+ /* added for rev2 */
+ uint64_t swapped_count; /* # of compressor-stored pages currently stored in swap */
} __attribute__((aligned(8)));
typedef struct vm_statistics64 *vm_statistics64_t;
@@ -232,6 +239,8 @@ typedef struct vm_purgeable_info *vm_purgeable_info_t;
#define VM_PAGE_QUERY_PAGE_CS_NX 0x400
#define VM_PAGE_QUERY_PAGE_REUSABLE 0x800
+#pragma mark User Flags
+
/*
* VM allocation flags:
*
@@ -334,17 +343,27 @@ typedef struct vm_purgeable_info *vm_purgeable_info_t;
__enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
kGUARD_EXC_DEALLOC_GAP = 1,
kGUARD_EXC_RECLAIM_COPYIO_FAILURE = 2,
- kGUARD_EXC_SEC_LOOKUP_DENIED = 3,
kGUARD_EXC_RECLAIM_INDEX_FAILURE = 4,
- kGUARD_EXC_SEC_RANGE_DENIED = 6,
- kGUARD_EXC_SEC_ACCESS_FAULT = 7,
kGUARD_EXC_RECLAIM_DEALLOCATE_FAILURE = 8,
- kGUARD_EXC_SEC_COPY_DENIED = 16,
- kGUARD_EXC_SEC_SHARING_DENIED = 32,
- kGUARD_EXC_SEC_ASYNC_ACCESS_FAULT = 64,
+ kGUARD_EXC_RECLAIM_ACCOUNTING_FAILURE = 9,
+ kGUARD_EXC_SEC_IOPL_ON_EXEC_PAGE = 10,
+ kGUARD_EXC_SEC_EXEC_ON_IOPL_PAGE = 11,
+ kGUARD_EXC_SEC_UPL_WRITE_ON_EXEC_REGION = 12,
+ /*
+ * rdar://151450801 (Remove spurious kGUARD_EXC_SEC_ACCESS_FAULT and kGUARD_EXC_SEC_ASYNC_ACCESS_FAULT once CrashReporter is aligned)
+ */
+ kGUARD_EXC_SEC_ACCESS_FAULT = 98,
+ kGUARD_EXC_SEC_ASYNC_ACCESS_FAULT = 99,
+ /* VM policy decisions */
+ kGUARD_EXC_SEC_COPY_DENIED = 100,
+ kGUARD_EXC_SEC_SHARING_DENIED = 101,
+
});
+
+#pragma mark Ledger Tags
+
/* current accounting postmark */
#define __VM_LEDGER_ACCOUNTING_POSTMARK 2019032600
@@ -372,6 +391,14 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
#define VM_LEDGER_FLAGS_USER (VM_LEDGER_FLAG_NO_FOOTPRINT | VM_LEDGER_FLAG_NO_FOOTPRINT_FOR_DEBUG)
#define VM_LEDGER_FLAGS_ALL (VM_LEDGER_FLAGS_USER | VM_LEDGER_FLAG_FROM_KERNEL)
+#pragma mark User Memory Tags
+
+/*
+ * These tags may be used to identify memory regions created with
+ * `mach_vm_map()` or `mach_vm_allocate()` via the top 8 bits of the `flags`
+ * parameter. Users should pass `VM_MAKE_TAG(tag) | flags` (see section
+ * "User Flags").
+ */
#define VM_MEMORY_MALLOC 1
#define VM_MEMORY_MALLOC_SMALL 2
#define VM_MEMORY_MALLOC_LARGE 3
@@ -400,6 +427,8 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
/* Was a nested pmap (VM_MEMORY_SHARED_PMAP) which has now been unnested */
#define VM_MEMORY_UNSHARED_PMAP 35
+/* for libchannel memory, mostly used on visionOS for communication with realtime threads */
+#define VM_MEMORY_LIBCHANNEL 36
// Placeholders for now -- as we analyze the libraries and find how they
// use memory, we can make these labels more specific.
@@ -411,6 +440,7 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
#define VM_MEMORY_JAVA 44
#define VM_MEMORY_COREDATA 45
#define VM_MEMORY_COREDATA_OBJECTIDS 46
+
#define VM_MEMORY_ATS 50
#define VM_MEMORY_LAYERKIT 51
#define VM_MEMORY_CGIMAGE 52
@@ -506,6 +536,8 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
/* DHMM data */
#define VM_MEMORY_DHMM 84
+/* memory needed for DFR related actions */
+#define VM_MEMORY_DFR 85
/* memory allocated by SceneKit.framework */
#define VM_MEMORY_SCENEKIT 86
@@ -562,6 +594,9 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
/* memory allocated by CoreMedia */
#define VM_MEMORY_CM_HLS 106
+/* memory allocated for CompositorServices */
+#define VM_MEMORY_COMPOSITOR_SERVICES 107
+
/* Reserve 230-239 for Rosetta */
#define VM_MEMORY_ROSETTA 230
#define VM_MEMORY_ROSETTA_THREAD_CONTEXT 231
@@ -573,7 +608,21 @@ __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
#define VM_MEMORY_ROSETTA_10 239
/* Reserve 240-255 for application */
-#define VM_MEMORY_APPLICATION_SPECIFIC_1 240
+#define VM_MEMORY_APPLICATION_SPECIFIC_1 240
+#define VM_MEMORY_APPLICATION_SPECIFIC_2 241
+#define VM_MEMORY_APPLICATION_SPECIFIC_3 242
+#define VM_MEMORY_APPLICATION_SPECIFIC_4 243
+#define VM_MEMORY_APPLICATION_SPECIFIC_5 244
+#define VM_MEMORY_APPLICATION_SPECIFIC_6 245
+#define VM_MEMORY_APPLICATION_SPECIFIC_7 246
+#define VM_MEMORY_APPLICATION_SPECIFIC_8 247
+#define VM_MEMORY_APPLICATION_SPECIFIC_9 248
+#define VM_MEMORY_APPLICATION_SPECIFIC_10 249
+#define VM_MEMORY_APPLICATION_SPECIFIC_11 250
+#define VM_MEMORY_APPLICATION_SPECIFIC_12 251
+#define VM_MEMORY_APPLICATION_SPECIFIC_13 252
+#define VM_MEMORY_APPLICATION_SPECIFIC_14 253
+#define VM_MEMORY_APPLICATION_SPECIFIC_15 254
#define VM_MEMORY_APPLICATION_SPECIFIC_16 255
#define VM_MEMORY_COUNT 256
diff --git a/lib/libc/include/any-macos-any/mach_debug/ipc_info.h b/lib/libc/include/any-macos-any/mach_debug/ipc_info.h
index 01e9965c1f..69219b5cd8 100644
--- a/lib/libc/include/any-macos-any/mach_debug/ipc_info.h
+++ b/lib/libc/include/any-macos-any/mach_debug/ipc_info.h
@@ -70,6 +70,81 @@
#include <mach/port.h>
#include <mach/machine/vm_types.h>
+/*!
+ * @brief
+ * Type for mach_port_kobject_description() only.
+ *
+ * @discussion
+ * This type preserved the `IOT_*` values that @c ipc_kobject_type_t used
+ * to carry, whose ABI of this type was known to debugging tools of userspace,
+ * by copying XNU's source.
+ *
+ * This provides a guaranteed stable interface now (however no guarantee
+ * is made that values are still in use).
+ *
+ * Values should never be removed to that list, merely abandonned with
+ * a comment.
+ */
+__enum_decl(ipc_info_object_type_t, natural_t, {
+ IPC_OTYPE_NONE = 0,
+ IPC_OTYPE_THREAD_CONTROL = 1,
+ IPC_OTYPE_TASK_CONTROL = 2,
+ IPC_OTYPE_HOST = 3,
+ IPC_OTYPE_HOST_PRIV = 4,
+ IPC_OTYPE_PROCESSOR = 5,
+ IPC_OTYPE_PROCESSOR_SET = 6,
+ IPC_OTYPE_PROCESSOR_SET_NAME = 7,
+ IPC_OTYPE_TIMER = 8,
+ IPC_OTYPE_PORT_SUBST_ONCE = 9, /* obsolete: no instances */
+ IPC_OTYPE_MIG = 10, /* obsolete: no instances */
+ IPC_OTYPE_MEMORY_OBJECT = 11, /* no port instances */
+ IPC_OTYPE_XMM_PAGER = 12, /* obsolete: no instances */
+ IPC_OTYPE_XMM_KERNEL = 13, /* obsolete: no instances */
+ IPC_OTYPE_XMM_REPLY = 14, /* obsolete: no instances */
+ IPC_OTYPE_UND_REPLY = 15,
+ IPC_OTYPE_HOST_NOTIFY = 16, /* obsolete: no instances */
+ IPC_OTYPE_HOST_SECURITY = 17, /* obsolete: no instances */
+ IPC_OTYPE_LEDGER = 18, /* obsolete: no instances */
+ IPC_OTYPE_MAIN_DEVICE = 19,
+ IPC_OTYPE_TASK_NAME = 20,
+ IPC_OTYPE_SUBSYSTEM = 21, /* obsolete: no instances */
+ IPC_OTYPE_IO_DONE_QUEUE = 22, /* obsolete: no instances */
+ IPC_OTYPE_SEMAPHORE = 23,
+ IPC_OTYPE_LOCK_SET = 24, /* obsolete: no instances */
+ IPC_OTYPE_CLOCK = 25,
+ IPC_OTYPE_CLOCK_CTRL = 26, /* obsolete: no instances */
+ IPC_OTYPE_IOKIT_IDENT = 27,
+ IPC_OTYPE_NAMED_ENTRY = 28,
+ IPC_OTYPE_IOKIT_CONNECT = 29,
+ IPC_OTYPE_IOKIT_OBJECT = 30,
+ IPC_OTYPE_UPL = 31, /* obsolete: no instances */
+ IPC_OTYPE_MEM_OBJ_CONTROL = 32, /* obsolete: no instances */
+ IPC_OTYPE_AU_SESSIONPORT = 33,
+ IPC_OTYPE_FILEPORT = 34,
+ IPC_OTYPE_LABELH = 35, /* obsolete: no instances */
+ IPC_OTYPE_TASK_RESUME = 36,
+ IPC_OTYPE_VOUCHER = 37,
+ IPC_OTYPE_VOUCHER_ATTR_CONTROL = 38, /* obsolete: no instances */
+ IPC_OTYPE_WORK_INTERVAL = 39,
+ IPC_OTYPE_UX_HANDLER = 40,
+ IPC_OTYPE_UEXT_OBJECT = 41,
+ IPC_OTYPE_ARCADE_REG = 42,
+ IPC_OTYPE_EVENTLINK = 43,
+ IPC_OTYPE_TASK_INSPECT = 44,
+ IPC_OTYPE_TASK_READ = 45,
+ IPC_OTYPE_THREAD_INSPECT = 46,
+ IPC_OTYPE_THREAD_READ = 47,
+ IPC_OTYPE_SUID_CRED = 48, /* obsolete: no instances */
+ IPC_OTYPE_HYPERVISOR = 49,
+ IPC_OTYPE_TASK_ID_TOKEN = 50,
+ IPC_OTYPE_TASK_FATAL = 51,
+ IPC_OTYPE_KCDATA = 52,
+ IPC_OTYPE_EXCLAVES_RESOURCE = 53,
+
+ /* catchall */
+ IPC_OTYPE_UNKNOWN = ~0u,
+});
+
/*
* Remember to update the mig type definitions
* in mach_debug_types.defs when adding/removing fields.
diff --git a/lib/libc/include/any-macos-any/malloc/_malloc.h b/lib/libc/include/any-macos-any/malloc/_malloc.h
index 4389be04d1..cbd5253d50 100644
--- a/lib/libc/include/any-macos-any/malloc/_malloc.h
+++ b/lib/libc/include/any-macos-any/malloc/_malloc.h
@@ -55,8 +55,8 @@ void * __sized_by_or_null(__size) malloc(size_t __size) __result_use_check __all
void * __sized_by_or_null(__count * __size) calloc(size_t __count, size_t __size) __result_use_check __alloc_size(1,2) _MALLOC_TYPED(malloc_type_calloc, 2);
void free(void * __unsafe_indexable);
void * __sized_by_or_null(__size) realloc(void * __unsafe_indexable __ptr, size_t __size) __result_use_check __alloc_size(2) _MALLOC_TYPED(malloc_type_realloc, 2);
-void * __sized_by_or_null(__size) reallocf(void * __unsafe_indexable __ptr, size_t __size) __result_use_check __alloc_size(2);
#if !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
+void * __sized_by_or_null(__size) reallocf(void * __unsafe_indexable __ptr, size_t __size) __result_use_check __alloc_size(2);
void * __sized_by_or_null(__size) valloc(size_t __size) __result_use_check __alloc_size(1) _MALLOC_TYPED(malloc_type_valloc, 1);
#endif /* !defined(_ANSI_SOURCE) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)) */
#if (defined(__DARWIN_C_LEVEL) && defined(__DARWIN_C_FULL) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL) || \
@@ -67,6 +67,75 @@ void * __sized_by_or_null(__size) aligned_alloc(size_t __alignment, size_t __siz
/* rdar://120689514 */
int posix_memalign(void * __unsafe_indexable *__memptr, size_t __alignment, size_t __size) _MALLOC_TYPED(malloc_type_posix_memalign, 3) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_0);
+#if defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING) && _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_malloc_backdeploy(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1) {
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_malloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+ __auto_type func = malloc;
+ if (malloc_type_malloc) {
+ return malloc_type_malloc(size, type_id);
+ }
+ return func(size);
+}
+
+static void * __sized_by_or_null(count * size) __attribute__((always_inline)) malloc_type_calloc_backdeploy(size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1,2) {
+ __attribute__((weak_import)) void * __sized_by_or_null(count * size) malloc_type_calloc(size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1,2);
+ __auto_type func = calloc;
+ if (malloc_type_calloc) {
+ return malloc_type_calloc(count, size, type_id);
+ }
+ return func(count, size);
+}
+
+static void __attribute__((always_inline)) malloc_type_free_backdeploy(void * __unsafe_indexable ptr, malloc_type_id_t type_id) {
+ __attribute__((weak_import)) void malloc_type_free(void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+ __auto_type func = free;
+ if (malloc_type_free) {
+ malloc_type_free(ptr, type_id);
+ } else {
+ func(ptr);
+ }
+}
+
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_realloc_backdeploy(void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2) {
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_realloc(void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+ __auto_type func = realloc;
+ if (malloc_type_realloc) {
+ return malloc_type_realloc(ptr, size, type_id);
+ }
+ return func(ptr, size);
+}
+
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_valloc_backdeploy(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1) {
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_valloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+ __auto_type func = valloc;
+ if (malloc_type_valloc) {
+ return malloc_type_valloc(size, type_id);
+ }
+ return func(size);
+}
+
+#if (defined(__DARWIN_C_LEVEL) && defined(__DARWIN_C_FULL) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
+ (defined(__cplusplus) && __cplusplus >= 201703L)
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_aligned_alloc_backdeploy(size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(1) __alloc_size(2) {
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_aligned_alloc(size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(1) __alloc_size(2);
+ __auto_type func = aligned_alloc;
+ if (malloc_type_aligned_alloc) {
+ return malloc_type_aligned_alloc(alignment, size, type_id);
+ }
+ return func(alignment, size);
+}
+#endif
+
+static int __attribute__((always_inline)) malloc_type_posix_memalign_backdeploy(void * __unsafe_indexable *memptr, size_t alignment, size_t size, malloc_type_id_t type_id) {
+ __attribute__((weak_import)) int malloc_type_posix_memalign(void * __unsafe_indexable *memptr, size_t alignment, size_t size, malloc_type_id_t type_id);
+ __auto_type func = posix_memalign;
+ if (malloc_type_posix_memalign) {
+ return malloc_type_posix_memalign(memptr, alignment, size, type_id);
+ }
+ return func(memptr, alignment, size);
+}
+#endif
__END_DECLS
#endif /* _MALLOC_UNDERSCORE_MALLOC_H_ */
diff --git a/lib/libc/include/any-macos-any/malloc/_malloc_type.h b/lib/libc/include/any-macos-any/malloc/_malloc_type.h
index 44474cbb91..81713b125c 100644
--- a/lib/libc/include/any-macos-any/malloc/_malloc_type.h
+++ b/lib/libc/include/any-macos-any/malloc/_malloc_type.h
@@ -39,44 +39,107 @@ typedef unsigned long long malloc_type_id_t;
#define __need_size_t
#include <stddef.h>
#undef __need_size_t
-#endif
+#endif /* size_t */
#include <sys/cdefs.h> /* __BEGIN_DECLS */
-#define _MALLOC_TYPE_AVAILABILITY __API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
-
__BEGIN_DECLS
+#define _MALLOC_TYPE_MALLOC_BACKDEPLOY_PUBLIC 1
+
+
+#if _MALLOC_TYPE_MALLOC_BACKDEPLOY_PUBLIC && defined(__has_feature) && __has_feature(typed_memory_operations) && __has_builtin(__is_target_os) && defined(__LP64__) && !defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING)
+#if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 140000) || \
+ (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 170000) || \
+ (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 170000) || \
+ (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 100000)
+ #define _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING 1
+#endif
+#endif
+
+/** If we are in a TMO backdeployment configuration we do not globally declare the
+ * real TMO entry points, so that we error out if someone is trying to use them
+ * when their presence is not guaranteed
+ */
+#if defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING) && _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING
+
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_malloc_backdeploy(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+static void * __sized_by_or_null(count * size) __attribute__((always_inline)) malloc_type_calloc_backdeploy(size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1,2);
+static void __attribute__((always_inline)) malloc_type_free_backdeploy(void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_realloc_backdeploy(void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_valloc_backdeploy(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+#if (defined(__DARWIN_C_LEVEL) && defined(__DARWIN_C_FULL) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL) || \
+ (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \
+ (defined(__cplusplus) && __cplusplus >= 201703L)
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_aligned_alloc_backdeploy(size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(1) __alloc_size(2);
+#endif
+static int __attribute__((always_inline)) malloc_type_posix_memalign_backdeploy(void * __unsafe_indexable *memptr, size_t alignment, size_t size, malloc_type_id_t type_id) /*__alloc_align(2) __alloc_size(3)*/;
+
+/* <malloc/malloc.h> */
+
+typedef struct _malloc_zone_t malloc_zone_t;
+
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_malloc_backdeploy(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+static void * __sized_by_or_null(count * size) __attribute__((always_inline)) malloc_type_zone_calloc_backdeploy(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2,3);
+static void __attribute__((always_inline)) malloc_type_zone_free_backdeploy(malloc_zone_t *zone, void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_realloc_backdeploy(malloc_zone_t *zone, void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3);
+static void *__sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_valloc_backdeploy(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+static void *__sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_memalign_backdeploy(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(2) __alloc_size(3);
+
+#else
+
/* <malloc/_malloc.h> */
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_malloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(count * size) malloc_type_calloc(size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1,2);
-_MALLOC_TYPE_AVAILABILITY void malloc_type_free(void * __unsafe_indexable ptr, malloc_type_id_t type_id);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_realloc(void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_valloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_aligned_alloc(size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_malloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(count * size) malloc_type_calloc(size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1,2);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void malloc_type_free(void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_realloc(void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_valloc(size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(1);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_aligned_alloc(size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(1) __alloc_size(2);
/* rdar://120689514 */
-_MALLOC_TYPE_AVAILABILITY int malloc_type_posix_memalign(void * __unsafe_indexable *memptr, size_t alignment, size_t size, malloc_type_id_t type_id) /*__alloc_size(3)*/;
-
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+int malloc_type_posix_memalign(void * __unsafe_indexable *memptr, size_t alignment, size_t size, malloc_type_id_t type_id) /*__alloc_align(2) __alloc_size(3)*/;
/* <malloc/malloc.h> */
typedef struct _malloc_zone_t malloc_zone_t;
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_zone_malloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(count * size) malloc_type_zone_calloc(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2,3);
-_MALLOC_TYPE_AVAILABILITY void malloc_type_zone_free(malloc_zone_t *zone, void * __unsafe_indexable ptr, malloc_type_id_t type_id);
-_MALLOC_TYPE_AVAILABILITY void * __sized_by_or_null(size) malloc_type_zone_realloc(malloc_zone_t *zone, void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3);
-_MALLOC_TYPE_AVAILABILITY void *__sized_by_or_null(size) malloc_type_zone_valloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
-_MALLOC_TYPE_AVAILABILITY void *__sized_by_or_null(size) malloc_type_zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_zone_malloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(count * size) malloc_type_zone_calloc(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2,3);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void malloc_type_zone_free(malloc_zone_t *zone, void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void * __sized_by_or_null(size) malloc_type_zone_realloc(malloc_zone_t *zone, void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void *__sized_by_or_null(size) malloc_type_zone_valloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+__API_AVAILABLE(macos(14.0), ios(17.0), tvos(17.0), watchos(10.0), visionos(1.0), driverkit(23.0))
+void *__sized_by_or_null(size) malloc_type_zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(2) __alloc_size(3);
+
+#endif
__END_DECLS
/* Rewrite enablement */
+
#if defined(__has_feature) && __has_feature(typed_memory_operations)
-#if __has_builtin(__is_target_os) && (__is_target_os(ios) || __is_target_os(driverkit) || __is_target_os(macos) || __is_target_os(xros) || __is_target_os(watchos) || __is_target_os(tvos) || (__has_builtin(__is_target_environment) && (__is_target_environment(exclavekit) || __is_target_environment(exclavecore))))
+
+#if (__has_builtin(__is_target_os) && __is_target_os(darwin) && !__is_target_os(bridgeos)) ||\
+ (__has_builtin(__is_target_environment) && (__is_target_environment(exclavekit) || __is_target_environment(exclavecore)))
+#if defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING) && _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING
+#define _MALLOC_TYPE_ENABLED 1
+#define _MALLOC_TYPED(override, type_param_pos) __attribute__((typed_memory_operation(override##_backdeploy, type_param_pos)))
+#else
#define _MALLOC_TYPED(override, type_param_pos) __attribute__((typed_memory_operation(override, type_param_pos)))
#define _MALLOC_TYPE_ENABLED 1
-#endif
+#endif
+#endif
#endif /* defined(__has_feature) && __has_feature(typed_memory_operations) */
#endif /* MALLOC_TARGET_64BIT */
diff --git a/lib/libc/include/any-macos-any/malloc/malloc.h b/lib/libc/include/any-macos-any/malloc/malloc.h
index 477a0022ba..d65d15642a 100644
--- a/lib/libc/include/any-macos-any/malloc/malloc.h
+++ b/lib/libc/include/any-macos-any/malloc/malloc.h
@@ -2,14 +2,14 @@
* Copyright (c) 1999-2023 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
- *
+ *
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
- *
+ *
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
@@ -17,7 +17,7 @@
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
- *
+ *
* @APPLE_LICENSE_HEADER_END@
*/
@@ -62,6 +62,57 @@ __ptrcheck_abi_assume_single()
#endif // MALLOC_ZONE_FN_PTR
__BEGIN_DECLS
+
+/********* Typed zone functions ************/
+
+#if defined(__has_attribute) && __has_attribute(swift_name)
+#define MALLOC_SWIFT_NAME(x) __attribute__((swift_name(#x)))
+#else
+#define MALLOC_SWIFT_NAME(x)
+#endif // defined(__has_attribute) && __has_attribute(swift_name)
+
+/*!
+ * @constant MALLOC_ZONE_MALLOC_DEFAULT_ALIGN
+ * Default alignment for malloc_type_zone_malloc_with_options
+ */
+#define MALLOC_ZONE_MALLOC_DEFAULT_ALIGN __SIZEOF_POINTER__
+
+/*!
+ * @enum malloc_zone_malloc_options_t
+ *
+ * @constant MALLOC_ZONE_MALLOC_OPTION_NONE
+ * Empty placeholder option.
+ *
+ * @constant MALLOC_ZONE_MALLOC_OPTION_CLEAR
+ * Zero out the allocated memory, similar to calloc().
+ *
+ */
+/*!
+ * @constant MALLOC_ZONE_MALLOC_OPTION_CANONICAL_TAG
+ * Under MTE, use a tag of zero (canonical) instead of a random value.
+ */
+typedef enum __enum_options : uint64_t {
+ MALLOC_ZONE_MALLOC_OPTION_NONE = 0u,
+ MALLOC_ZONE_MALLOC_OPTION_CLEAR MALLOC_SWIFT_NAME(clear) = 1u << 0,
+ MALLOC_ZONE_MALLOC_OPTION_CANONICAL_TAG MALLOC_SWIFT_NAME(canonicalTag) = 1u << 1,
+} malloc_zone_malloc_options_t;
+
+/*!
+ * @function malloc_type_zone_malloc_with_options
+ *
+ * Like the other functions declared in malloc/_malloc_type.h, this function
+ * is not intended to be called directly, but is rather the rewrite target for
+ * calls to malloc_zone_malloc_with_options when typed memory operations are
+ * enabled.
+ */
+#if defined(__LP64__)
+__API_AVAILABLE(macos(26.0), ios(26.0), tvos(26.0), watchos(26.0), visionos(26.0), driverkit(25.0))
+void * __sized_by_or_null(size) malloc_type_zone_malloc_with_options(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id, malloc_zone_malloc_options_t opts) __result_use_check __alloc_align(2) __alloc_size(3);
+#endif /* __LP64__ */
+
+// The remainder of these functions are declared in malloc/_malloc_type.h, and
+// the backdeployment variant definitions are at the bottom of this file.
+
/********* Type definitions ************/
/*
@@ -160,8 +211,7 @@ typedef struct _malloc_zone_t {
void * __unsafe_indexable ptr);
/*
- * Memory allocation with an extensible binary flags option. Currently for
- * libmalloc-internal zone implementations only - should be NULL otherwise.
+ * Memory allocation with an extensible binary flags option.
* Added in version >= 15.
*/
void * __sized_by_or_null(size) (* MALLOC_ZONE_FN_PTR(malloc_with_options))(
@@ -188,10 +238,9 @@ typedef struct _malloc_zone_t {
struct _malloc_zone_t *zone, size_t alignment, size_t size,
malloc_type_id_t type_id);
- /* Must be NULL for non-libmalloc zone implementations */
void * __sized_by_or_null(size) (* MALLOC_ZONE_FN_PTR(malloc_type_malloc_with_options))(
- struct _malloc_zone_t *zone, size_t align, size_t size, uint64_t options,
- malloc_type_id_t type_id);
+ struct _malloc_zone_t *zone, size_t align, size_t size,
+ uint64_t options, malloc_type_id_t type_id);
} malloc_zone_t;
/*!
@@ -352,6 +401,38 @@ extern void malloc_destroy_zone(malloc_zone_t *zone);
extern void * __sized_by_or_null(size) malloc_zone_malloc(malloc_zone_t *zone, size_t size) __alloc_size(2) _MALLOC_TYPED(malloc_type_zone_malloc, 2);
/* Allocates a new pointer of size size; zone must be non-NULL */
+/*!
+ * @function malloc_zone_malloc_with_options
+ *
+ * @param zone
+ * The malloc zone that should be used to used to serve the allocation. This
+ * parameter may be NULL, in which case the default zone will be used.
+ *
+ * @param align
+ * The minimum alignment of the requested allocation. This parameter must be
+ * MALLOC_ZONE_MALLOC_DEFAULT_ALIGN to request default alignment, or a power
+ * of 2 >= sizeof(void *).
+ *
+ * @param size
+ * The size, in bytes, of the requested allocation. Must be an integral
+ * multiple of align if align is non-zero.
+ *
+ * @param options
+ * A bitmask of options defining how the memory should be allocated. See the
+ * available bit values in the malloc_zone_malloc_options_t enum definition.
+ *
+ * @result
+ * A pointer to the newly allocated block of memory, or NULL if the allocation
+ * failed.
+ *
+ * @discussion
+ * This API does not use errno to signal information about the reason for its
+ * success or failure, and makes no guarantees about preserving or settings its
+ * value in any case.
+ */
+__API_AVAILABLE(macos(26.0), ios(26.0), tvos(26.0), watchos(26.0), visionos(26.0), driverkit(25.0))
+extern void * __sized_by_or_null(size) malloc_zone_malloc_with_options(malloc_zone_t *zone, size_t align, size_t size, malloc_zone_malloc_options_t opts) __alloc_align(2) __alloc_size(3) _MALLOC_TYPED(malloc_type_zone_malloc_with_options, 3);
+
extern void * __sized_by_or_null(num_items * size) malloc_zone_calloc(malloc_zone_t *zone, size_t num_items, size_t size) __alloc_size(2,3) _MALLOC_TYPED(malloc_type_zone_calloc, 3);
/* Allocates a new pointer of size num_items * size; block is cleared; zone must be non-NULL */
@@ -590,22 +671,80 @@ extern void malloc_zone_enumerate_discharged_pointers(malloc_zone_t *zone, void
// Version 13:
// - malloc_zone_t::malloc and malloc_zone_t::calloc assume responsibility for
// setting errno to ENOMEM on failure
-// - malloc_zone_t::try_free_default
+// - malloc_zone_t::try_free_default (libmalloc only, NULL otherwise)
// Version 14:
-// malloc_introspection_t::zone_type
+// malloc_introspection_t::zone_type (mandatory, should be 0)
// Version 15:
-// malloc_zone_t::malloc_with_options
+// malloc_zone_t::malloc_with_options (optional)
// Version 16:
-// malloc_zone_t::malloc_type_malloc
-// malloc_zone_t::malloc_type_calloc
-// malloc_zone_t::malloc_type_realloc
-// malloc_zone_t::malloc_type_memalign
-// malloc_zone_t::malloc_type_malloc_with_options
-
-// These functions are optional and calling them requires two checks:
+// malloc_zone_t::malloc_type_malloc (mandatory)
+// malloc_zone_t::malloc_type_calloc (mandatory)
+// malloc_zone_t::malloc_type_realloc (mandatory)
+// malloc_zone_t::malloc_type_memalign (mandatory)
+// malloc_zone_t::malloc_type_malloc_with_options (optional)
+
+// Zone functions are optional unless specified otherwise above. Calling a zone
+// function requires two checks:
// * Check zone version to ensure zone struct is large enough to include the member.
// * Check that the function pointer is not null.
+#if defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING) && _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_malloc_backdeploy(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2) {
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_zone_malloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+ __auto_type func = malloc_zone_malloc;
+ if (malloc_type_zone_malloc) {
+ return malloc_type_zone_malloc(zone, size, type_id);
+ }
+ return func(zone, size);
+}
+
+static void * __sized_by_or_null(count * size) __attribute__((always_inline)) malloc_type_zone_calloc_backdeploy(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2,3) {
+ __attribute__((weak_import)) void * __sized_by_or_null(count * size) malloc_type_zone_calloc(malloc_zone_t *zone, size_t count, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2,3);
+ __auto_type func = malloc_zone_calloc;
+ if (malloc_type_zone_calloc) {
+ return malloc_type_zone_calloc(zone, count, size, type_id);
+ }
+ return func(zone, count, size);
+}
+
+static void __attribute__((always_inline)) malloc_type_zone_free_backdeploy(malloc_zone_t *zone, void * __unsafe_indexable ptr, malloc_type_id_t type_id) {
+ __attribute__((weak_import)) void malloc_type_zone_free(malloc_zone_t *zone, void * __unsafe_indexable ptr, malloc_type_id_t type_id);
+ __auto_type func = malloc_zone_free;
+ if (malloc_type_zone_free) {
+ malloc_type_zone_free(zone, ptr, type_id);
+ } else {
+ func(zone, ptr);
+ }
+}
+
+static void * __sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_realloc_backdeploy(malloc_zone_t *zone, void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3) {
+ __auto_type func = malloc_zone_realloc;
+ __attribute__((weak_import)) void * __sized_by_or_null(size) malloc_type_zone_realloc(malloc_zone_t *zone, void * __unsafe_indexable ptr, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(3);
+ if (malloc_type_zone_realloc) {
+ return malloc_type_zone_realloc(zone, ptr, size, type_id);
+ }
+ return func(zone, ptr, size);
+}
+
+static void *__sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_valloc_backdeploy(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2) {
+ __attribute__((weak_import)) void *__sized_by_or_null(size) malloc_type_zone_valloc(malloc_zone_t *zone, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_size(2);
+ __auto_type func = malloc_zone_valloc;
+ if (malloc_type_zone_valloc) {
+ return malloc_type_zone_valloc(zone, size, type_id);
+ }
+ return func(zone, size);
+}
+
+static void *__sized_by_or_null(size) __attribute__((always_inline)) malloc_type_zone_memalign_backdeploy(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(2) __alloc_size(3) {
+ __attribute__((weak_import)) void *__sized_by_or_null(size) malloc_type_zone_memalign(malloc_zone_t *zone, size_t alignment, size_t size, malloc_type_id_t type_id) __result_use_check __alloc_align(2) __alloc_size(3);
+ __auto_type func = malloc_zone_memalign;
+ if (malloc_type_zone_memalign) {
+ return malloc_type_zone_memalign(zone, alignment, size, type_id);
+ }
+ return func(zone, alignment, size);
+}
+#endif // defined(_MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING) && _MALLOC_TYPE_MALLOC_IS_BACKDEPLOYING
+
__END_DECLS
#endif /* _MALLOC_MALLOC_H_ */
diff --git a/lib/libc/include/any-macos-any/math.h b/lib/libc/include/any-macos-any/math.h
index d5b7ccf2a5..513d798d95 100644
--- a/lib/libc/include/any-macos-any/math.h
+++ b/lib/libc/include/any-macos-any/math.h
@@ -129,10 +129,18 @@ extern int __math_errhandling(void);
* *
******************************************************************************/
+#if !defined(__cplusplus) || !defined(__has_feature) || !__has_feature(modules)
+/* libc++'s math.h comes before this header in the search order. It
+ * will include this header first and then undef several of these
+ * macros. That doesn't work when the two headers are in different
+ * clang modules. The only way to make that work is to not declare
+ * the macros here, and let libc++ handle the declarations.
+ */
#define fpclassify(x) \
( sizeof(x) == sizeof(float) ? __fpclassifyf((float)(x)) \
: sizeof(x) == sizeof(double) ? __fpclassifyd((double)(x)) \
: __fpclassifyl((long double)(x)))
+#endif /* !defined(__cplusplus) && !__has_feature(modules) */
extern int __fpclassifyf(float);
extern int __fpclassifyd(double);
@@ -152,6 +160,7 @@ extern int __fpclassifyl(long double);
Thus, if you compile with -ffast-math, actual function calls are
generated for these utilities. */
+#if !defined(__cplusplus) || !defined(__has_feature) || !__has_feature(modules)
#define isnormal(x) \
( sizeof(x) == sizeof(float) ? __inline_isnormalf((float)(x)) \
: sizeof(x) == sizeof(double) ? __inline_isnormald((double)(x)) \
@@ -176,6 +185,7 @@ extern int __fpclassifyl(long double);
( sizeof(x) == sizeof(float) ? __inline_signbitf((float)(x)) \
: sizeof(x) == sizeof(double) ? __inline_signbitd((double)(x)) \
: __inline_signbitl((long double)(x)))
+#endif /* !defined(__cplusplus) && !__has_feature(modules) */
__header_always_inline int __inline_isfinitef(float);
__header_always_inline int __inline_isfinited(double);
@@ -262,6 +272,13 @@ __header_always_inline int __inline_isnormall(long double __x) {
or similar is specified. These are not available in iOS versions prior
to 6.0. If you need them, you must target that version or later. */
+#if !defined(__cplusplus) || !defined(__has_feature) || !__has_feature(modules)
+/* libc++'s math.h comes before this header in the search order. It
+ * will include this header first and then undef several of these
+ * macros. That doesn't work when the two headers are in different
+ * clang modules. The only way to make that work is to not declare
+ * the macros here, and let libc++ handle the declarations.
+ */
#define isnormal(x) \
( sizeof(x) == sizeof(float) ? __isnormalf((float)(x)) \
: sizeof(x) == sizeof(double) ? __isnormald((double)(x)) \
@@ -286,7 +303,8 @@ __header_always_inline int __inline_isnormall(long double __x) {
( sizeof(x) == sizeof(float) ? __signbitf((float)(x)) \
: sizeof(x) == sizeof(double) ? __signbitd((double)(x)) \
: __signbitl((long double)(x)))
-
+#endif /* !defined(__cplusplus) && !__has_feature(modules) */
+
extern int __isnormalf(float);
extern int __isnormald(double);
extern int __isnormall(long double);
@@ -546,12 +564,20 @@ extern float fmaf(float, float, float);
extern double fma(double, double, double);
extern long double fmal(long double, long double, long double);
+#if !defined(__cplusplus) || !defined(__has_feature) || !__has_feature(modules)
+/* libc++'s math.h comes before this header in the search order. It
+ * will include this header first and then undef several of these
+ * macros. That doesn't work when the two headers are in different
+ * clang modules. The only way to make that work is to not declare
+ * the macros here, and let libc++ handle the declarations.
+ */
#define isgreater(x, y) __builtin_isgreater((x),(y))
#define isgreaterequal(x, y) __builtin_isgreaterequal((x),(y))
#define isless(x, y) __builtin_isless((x),(y))
#define islessequal(x, y) __builtin_islessequal((x),(y))
#define islessgreater(x, y) __builtin_islessgreater((x),(y))
#define isunordered(x, y) __builtin_isunordered((x),(y))
+#endif /* !defined(__cplusplus) && !__has_feature(modules) */
#if defined __i386__ || defined __x86_64__
/* Deprecated functions; use the INFINITY and NAN macros instead. */
diff --git a/lib/libc/include/any-macos-any/net/if.h b/lib/libc/include/any-macos-any/net/if.h
index 7bb7c3874d..f562eb76d8 100644
--- a/lib/libc/include/any-macos-any/net/if.h
+++ b/lib/libc/include/any-macos-any/net/if.h
@@ -154,16 +154,6 @@ struct if_clonereq {
#define IFQ_MAXLEN 128
#define IFNET_SLOWHZ 1 /* granularity is 1 second */
-#define IFQ_DEF_C_TARGET_DELAY (10ULL * 1000 * 1000) /* 10 ms */
-#define IFQ_DEF_C_UPDATE_INTERVAL (100ULL * 1000 * 1000) /* 100 ms */
-#define IFQ_DEF_L4S_TARGET_DELAY (2ULL * 1000 * 1000) /* 2 ms */
-#define IFQ_DEF_L4S_WIRELESS_TARGET_DELAY (15ULL * 1000 * 1000) /* 15 ms */
-#define IFQ_DEF_L4S_UPDATE_INTERVAL (100ULL * 1000 * 1000) /* 100 ms */
-#define IFQ_LL_C_TARGET_DELAY (10ULL * 1000 * 1000) /* 10 ms */
-#define IFQ_LL_C_UPDATE_INTERVAL (100ULL * 1000 * 1000) /* 100 ms */
-#define IFQ_LL_L4S_TARGET_DELAY (2ULL * 1000 * 1000) /* 2 ms */
-#define IFQ_LL_L4S_WIRELESS_TARGET_DELAY (15ULL * 1000 * 1000) /* 15 ms */
-#define IFQ_LL_L4S_UPDATE_INTERVAL (100ULL * 1000 * 1000) /* 100 ms */
/*
* Message format for use in obtaining information about interfaces
* from sysctl and the routing socket
@@ -332,6 +322,7 @@ struct ifreq {
#define IFRTYPE_FUNCTIONAL_LAST 8
u_int8_t ifru_is_directlink;
u_int8_t ifru_is_vpn;
+ u_int8_t ifru_is_companionlink;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
diff --git a/lib/libc/include/any-macos-any/netinet/tcp.h b/lib/libc/include/any-macos-any/netinet/tcp.h
index 8aab372e1b..6c865fdaee 100644
--- a/lib/libc/include/any-macos-any/netinet/tcp.h
+++ b/lib/libc/include/any-macos-any/netinet/tcp.h
@@ -118,14 +118,17 @@ struct tcphdr {
};
#define TCPOPT_EOL 0
+#define TCPOLEN_EOL 1
#define TCPOPT_NOP 1
+#define TCPOLEN_NOP 1
#define TCPOPT_MAXSEG 2
#define TCPOLEN_MAXSEG 4
#define TCPOPT_WINDOW 3
#define TCPOLEN_WINDOW 3
-#define TCPOPT_SACK_PERMITTED 4 /* Experimental */
+#define TCPOPT_SACK_PERMITTED 4 /* SACK capability in SYN */
#define TCPOLEN_SACK_PERMITTED 2
-#define TCPOPT_SACK 5 /* Experimental */
+#define TCPOPT_SACK 5
+#define TCPOLEN_SACKHDR 2
#define TCPOLEN_SACK 8 /* len of sack block */
#define TCPOPT_TIMESTAMP 8
#define TCPOLEN_TIMESTAMP 10
diff --git a/lib/libc/include/any-macos-any/netinet6/in6.h b/lib/libc/include/any-macos-any/netinet6/in6.h
index f77a7bb6a1..70d84d8b89 100644
--- a/lib/libc/include/any-macos-any/netinet6/in6.h
+++ b/lib/libc/include/any-macos-any/netinet6/in6.h
@@ -101,6 +101,7 @@
#include <sys/_types.h>
#include <sys/_types/_sa_family_t.h>
+#include <sys/_types/_in_port_t.h>
/*
* Identification of the network protocol stack
diff --git a/lib/libc/include/any-macos-any/os/availability.h b/lib/libc/include/any-macos-any/os/availability.h
index 453633c646..8f3d112fa2 100644
--- a/lib/libc/include/any-macos-any/os/availability.h
+++ b/lib/libc/include/any-macos-any/os/availability.h
@@ -115,6 +115,9 @@
* ios, iOSApplicationExtension, tvos, tvOSApplicationExtension, watchos,
* watchOSApplicationExtension, driverkit, visionos, visionOSApplicationExtension
*
+ * Within each platform a tuple of versions will represent the version the API was
+ * introduced in, followed by the version it was deperecated in.
+ *
* Examples:
*
* API_DEPRECATED("Deprecated", macos(10.4, 10.8))
@@ -143,6 +146,10 @@
* ios, iOSApplicationExtension, tvos, tvOSApplicationExtension, watchos,
* watchOSApplicationExtension, driverkit, visionos, visionOSApplicationExtension
*
+ * Within each platform a tuple of versions will represent the version the API was
+ * introduced in, followed by the version it was deperecated in, and finally the version it
+ * was removed in.
+ *
* Examples:
*
* API_OBSOLETED("No longer supported", macos(10.4, 10.8, 11.0))
@@ -151,6 +158,7 @@
* API_OBSOLETED_WITH_REPLACEMENT("-setName:", tvos(10.0, 10.4, 12.0), ios(9.0, 10.0, 11.0))
* API_OBSOLETED_WITH_REPLACEMENT("SomeClassName", macos(10.4, 10.6, 11.0), watchos(2.0, 3.0, 4.0))
*/
+
#define API_OBSOLETED(...) __API_OBSOLETED_MSG_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_MSG15,__API_OBSOLETED_MSG14,__API_OBSOLETED_MSG13,__API_OBSOLETED_MSG12,__API_OBSOLETED_MSG11,__API_OBSOLETED_MSG10,__API_OBSOLETED_MSG9,__API_OBSOLETED_MSG8,__API_OBSOLETED_MSG7,__API_OBSOLETED_MSG6,__API_OBSOLETED_MSG5,__API_OBSOLETED_MSG4,__API_OBSOLETED_MSG3,__API_OBSOLETED_MSG2,__API_OBSOLETED_MSG1,__API_OBSOLETED_MSG0,0,0)(__VA_ARGS__)
#define API_OBSOLETED_WITH_REPLACEMENT(...) __API_OBSOLETED_REP_GET_MACRO_93585900(__VA_ARGS__,__API_OBSOLETED_REP15,__API_OBSOLETED_REP14,__API_OBSOLETED_REP13,__API_OBSOLETED_REP12,__API_OBSOLETED_REP11,__API_OBSOLETED_REP10,__API_OBSOLETED_REP9,__API_OBSOLETED_REP8,__API_OBSOLETED_REP7,__API_OBSOLETED_REP6,__API_OBSOLETED_REP5,__API_OBSOLETED_REP4,__API_OBSOLETED_REP3,__API_OBSOLETED_REP2,__API_OBSOLETED_REP1,__API_OBSOLETED_REP0,0,0)(__VA_ARGS__)
@@ -189,7 +197,7 @@
#endif
#ifndef API_AVAILABLE_END
- #define API_AVAILABLE_END(...)
+ #define API_AVAILABLE_END
#endif
#ifndef API_DEPRECATED
@@ -201,7 +209,7 @@
#endif
#ifndef API_DEPRECATED_END
- #define API_DEPRECATED_END(...)
+ #define API_DEPRECATED_END
#endif
#ifndef API_DEPRECATED_WITH_REPLACEMENT
@@ -213,7 +221,7 @@
#endif
#ifndef API_DEPRECATED_WITH_REPLACEMENT_END
- #define API_DEPRECATED_WITH_REPLACEMENT_END(...)
+ #define API_DEPRECATED_WITH_REPLACEMENT_END
#endif
#ifndef API_OBSOLETED
@@ -225,7 +233,7 @@
#endif
#ifndef API_OBSOLETED_END
- #define API_OBSOLETED_END(...)
+ #define API_OBSOLETED_END
#endif
#ifndef API_OBSOLETED_WITH_REPLACEMENT
@@ -237,7 +245,7 @@
#endif
#ifndef API_OBSOLETED_WITH_REPLACEMENT_END
- #define API_OBSOLETED_WITH_REPLACEMENT_END(...)
+ #define API_OBSOLETED_WITH_REPLACEMENT_END
#endif
#ifndef API_UNAVAILABLE
@@ -249,7 +257,7 @@
#endif
#ifndef API_UNAVAILABLE_END
- #define API_UNAVAILABLE_END(...)
+ #define API_UNAVAILABLE_END
#endif
#if __has_include(<AvailabilityProhibitedInternal.h>)
@@ -269,7 +277,7 @@
#endif
#ifndef SPI_AVAILABLE_END
- #define SPI_AVAILABLE_END(...)
+ #define SPI_AVAILABLE_END
#endif
#ifndef SPI_DEPRECATED
diff --git a/lib/libc/include/any-macos-any/os/base.h b/lib/libc/include/any-macos-any/os/base.h
index ee47074b7a..7382897b4e 100644
--- a/lib/libc/include/any-macos-any/os/base.h
+++ b/lib/libc/include/any-macos-any/os/base.h
@@ -71,7 +71,11 @@
#define OS_WEAK __attribute__((__weak__))
#define OS_WEAK_IMPORT __attribute__((__weak_import__))
#define OS_NOINLINE __attribute__((__noinline__))
+#ifndef __BUILDING_XNU_LIBRARY__
#define OS_ALWAYS_INLINE __attribute__((__always_inline__))
+#else /* __BUILDING_XNU_LIBRARY__ */
+#define OS_ALWAYS_INLINE
+#endif /* __BUILDING_XNU_LIBRARY__ */
#define OS_TRANSPARENT_UNION __attribute__((__transparent_union__))
#define OS_ALIGNED(n) __attribute__((__aligned__((n))))
#define OS_FORMAT_PRINTF(x, y) __attribute__((__format__(printf,x,y)))
@@ -343,4 +347,5 @@ typedef void (^os_block_t)(void);
#define OS_COUNTED_BY(N) __counted_by(N)
#define OS_SIZED_BY(N) __sized_by(N)
+
#endif // __OS_BASE__
diff --git a/lib/libc/include/any-macos-any/os/workgroup_base.h b/lib/libc/include/any-macos-any/os/workgroup_base.h
index c9b06590e7..633883b043 100644
--- a/lib/libc/include/any-macos-any/os/workgroup_base.h
+++ b/lib/libc/include/any-macos-any/os/workgroup_base.h
@@ -26,6 +26,12 @@
#define OS_WORKGROUP_ASSUME_NONNULL_BEGIN
#define OS_WORKGROUP_ASSUME_NONNULL_END
#endif
+#if __has_feature(enumerator_attributes)
+#define OS_WORKGROUP_ENUM_API_DEPRECATED_WITH_REPLACEMENT(...) \
+ API_DEPRECATED_WITH_REPLACEMENT(__VA_ARGS__)
+#else
+#define OS_WORKGROUP_ENUM_API_DEPRECATED_WITH_REPLACEMENT(...)
+#endif
#define OS_WORKGROUP_WARN_RESULT __attribute__((__warn_unused_result__))
#define OS_WORKGROUP_EXPORT OS_EXPORT
#define OS_WORKGROUP_RETURNS_RETAINED OS_OBJECT_RETURNS_RETAINED
diff --git a/lib/libc/include/any-macos-any/secure/_common.h b/lib/libc/include/any-macos-any/secure/_common.h
index 03181dd30c..6a7a508b28 100644
--- a/lib/libc/include/any-macos-any/secure/_common.h
+++ b/lib/libc/include/any-macos-any/secure/_common.h
@@ -39,5 +39,7 @@
#define __darwin_obsz0(object) __builtin_object_size (object, 0)
#define __darwin_obsz(object) __builtin_object_size (object, _USE_FORTIFY_LEVEL > 1 ? 1 : 0)
+#define __darwin_pass_obsz0 __attribute__((__pass_object_size__(0)))
+#define __darwin_pass_obsz __attribute__((__pass_object_size__(_USE_FORTIFY_LEVEL > 1 ? 1 : 0)))
#endif
diff --git a/lib/libc/include/any-macos-any/secure/_stdio.h b/lib/libc/include/any-macos-any/secure/_stdio.h
index 9046dac920..cc678f318a 100644
--- a/lib/libc/include/any-macos-any/secure/_stdio.h
+++ b/lib/libc/include/any-macos-any/secure/_stdio.h
@@ -35,54 +35,95 @@ _LIBC_SINGLE_BY_DEFAULT()
#if _USE_FORTIFY_LEVEL > 0
-#ifndef __has_builtin
-#define _undef__has_builtin
-#define __has_builtin(x) 0
-#endif
+extern int __snprintf_chk (char * __restrict _LIBC_COUNT(__maxlen), size_t __maxlen, int, size_t,
+ const char * __restrict, ...);
+extern int __vsnprintf_chk (char * __restrict _LIBC_COUNT(__maxlen), size_t __maxlen, int, size_t,
+ const char * __restrict, va_list);
-/* sprintf, vsprintf, snprintf, vsnprintf */
-#if __has_builtin(__builtin___sprintf_chk) || defined(__GNUC__)
extern int __sprintf_chk (char * __restrict _LIBC_UNSAFE_INDEXABLE, int, size_t,
const char * __restrict, ...);
+extern int __vsprintf_chk (char * __restrict _LIBC_UNSAFE_INDEXABLE, int, size_t,
+ const char * __restrict, va_list);
-#undef sprintf
-#define sprintf(str, ...) \
- __builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
+#ifdef __LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES
+
+/* verify that there are at least __n characters at __str */
+static inline char *_LIBC_COUNT(__n)
+__libc_ptrchk_strbuf_chk(char *_LIBC_COUNT(__n) __str, size_t __n) { return __str; }
+
+#undef __sprintf_chk_func /* sprintf is unavailable */
+#undef __vsprintf_chk_func /* vsprintf is unavailable */
+
+#define __vsnprintf_chk_func(str, len, flag, format, ap) ({ \
+ size_t __len = (len); \
+ __builtin___vsnprintf_chk (__libc_ptrchk_strbuf_chk(str, __len), __len, flag, __darwin_obsz(str), format, ap); \
+})
+
+#define __snprintf_chk_func(str, len, flag, ...) ({ \
+ size_t __len = (len); \
+ __builtin___snprintf_chk (__libc_ptrchk_strbuf_chk(str, __len), __len, flag, __darwin_obsz(str), __VA_ARGS__); \
+})
+
+#else
+
+#ifndef __has_builtin
+#define __undef__has_builtin
+#define __has_builtin(x) defined(__GNUC__)
#endif
-#if __DARWIN_C_LEVEL >= 200112L
-#if __has_builtin(__builtin___snprintf_chk) || defined(__GNUC__)
-extern int __snprintf_chk (char * __restrict _LIBC_COUNT(__maxlen), size_t __maxlen, int, size_t,
- const char * __restrict, ...);
+#if __has_builtin(__builtin___snprintf_chk)
+#define __snprintf_chk_func(str, len, flag, ...) \
+ __builtin___snprintf_chk (str, len, flag, __darwin_obsz(str), __VA_ARGS__)
+#endif
-#undef snprintf
-#define snprintf(str, len, ...) \
- __builtin___snprintf_chk (str, len, 0, __darwin_obsz(str), __VA_ARGS__)
+#if __has_builtin(__builtin___vsnprintf_chk)
+#define __vsnprintf_chk_func(str, len, flag, format, ap) \
+ __builtin___vsnprintf_chk (str, len, flag, __darwin_obsz(str), format, ap)
#endif
-#if __has_builtin(__builtin___vsprintf_chk) || defined(__GNUC__)
-extern int __vsprintf_chk (char * __restrict _LIBC_UNSAFE_INDEXABLE, int, size_t,
- const char * __restrict, va_list);
+#if __has_builtin(__builtin___sprintf_chk)
+#define __sprintf_chk_func(str, flag, ...) \
+ __builtin___sprintf_chk (str, flag, __darwin_obsz(str), __VA_ARGS__)
+#endif
+
+#if __has_builtin(__builtin___vsprintf_chk)
+#define __vsprintf_chk_func(str, flag, format, ap) \
+ __builtin___vsprintf_chk (str, flag, __darwin_obsz(str), format, ap)
+#endif
+
+
+#ifdef __undef__has_builtin
+#undef __undef__has_builtin
+#undef __has_builtin
+#endif
+
+#endif
+
+/* sprintf, vsprintf, snprintf, vsnprintf */
+
+#ifdef __sprintf_chk_func
+#undef sprintf
+#define sprintf(str, ...) __sprintf_chk_func (str, 0, __VA_ARGS__)
+#endif
+
+#if __DARWIN_C_LEVEL >= 200112L
+
+#ifdef __vsprintf_chk_func
#undef vsprintf
-#define vsprintf(str, format, ap) \
- __builtin___vsprintf_chk (str, 0, __darwin_obsz(str), format, ap)
+#define vsprintf(str, ...) __vsprintf_chk_func (str, 0, __VA_ARGS__)
#endif
-#if __has_builtin(__builtin___vsnprintf_chk) || defined(__GNUC__)
-extern int __vsnprintf_chk (char * __restrict _LIBC_COUNT(__maxlen), size_t __maxlen, int, size_t,
- const char * __restrict, va_list);
+#ifdef __snprintf_chk_func
+#undef snprintf
+#define snprintf(str, len, ...) __snprintf_chk_func (str, len, 0, __VA_ARGS__)
+#endif
+#ifdef __vsnprintf_chk_func
#undef vsnprintf
-#define vsnprintf(str, len, format, ap) \
- __builtin___vsnprintf_chk (str, len, 0, __darwin_obsz(str), format, ap)
+#define vsnprintf(str, len, ...) __vsnprintf_chk_func (str, len, 0, __VA_ARGS__)
#endif
-#endif /* __DARWIN_C_LEVEL >= 200112L */
-
-#ifdef _undef__has_builtin
-#undef _undef__has_builtin
-#undef __has_builtin
#endif
#endif /* _USE_FORTIFY_LEVEL > 0 */
diff --git a/lib/libc/include/any-macos-any/secure/_string.h b/lib/libc/include/any-macos-any/secure/_string.h
index f023af32a1..d16ecd165c 100644
--- a/lib/libc/include/any-macos-any/secure/_string.h
+++ b/lib/libc/include/any-macos-any/secure/_string.h
@@ -34,117 +34,262 @@
#if _USE_FORTIFY_LEVEL > 0
-/* <rdar://problem/12622659> */
-#if defined(__clang__) && \
- ((defined(__apple_build_version__) && __apple_build_version__ >= 4260006) || \
- (!defined(__apple_build_version__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 3))))
-#define __HAS_FIXED_CHK_PROTOTYPES 1
-#else
-#define __HAS_FIXED_CHK_PROTOTYPES 0
+#ifdef __LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES
+
+#if __has_builtin(__builtin___memcpy_chk)
+static inline void *_LIBC_SIZE(__n)
+__memcpy_ptrchk(void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, const void *_LIBC_SIZE(__n) __src, size_t __n) {
+ return _LIBC_FORGE_PTR(__builtin___memcpy_chk(__dst, __src, __n, __darwin_obsz0(__dst)), __n);
+}
+#define __memcpy_chk_func __memcpy_ptrchk
#endif
-/* memccpy, memcpy, mempcpy, memmove, memset, strcpy, strlcpy, stpcpy,
- strncpy, stpncpy, strcat, strlcat, and strncat */
+#if __has_builtin(__builtin___memmove_chk)
+static inline void *_LIBC_SIZE(__n)
+__memmove_ptrchk(void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, const void *_LIBC_SIZE(__n) __src, size_t __n) {
+ return _LIBC_FORGE_PTR(__builtin___memmove_chk(__dst, __src, __n, __darwin_obsz0(__dst)), __n);
+}
+#define __memmove_chk_func __memmove_ptrchk
+#endif
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 || \
- defined(__DRIVERKIT_VERSION_MIN_REQUIRED)
-#if __has_builtin(__builtin___memccpy_chk) && __HAS_FIXED_CHK_PROTOTYPES
-#undef memccpy
-/* void *memccpy(void *dst, const void *src, int c, size_t n) */
-#define memccpy(dest, ...) \
- __builtin___memccpy_chk (dest, __VA_ARGS__, __darwin_obsz0 (dest))
+#if __has_builtin(__builtin___memset_chk)
+static inline void *_LIBC_SIZE(__n)
+__memset_ptrchk(void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, int __c, size_t __n) {
+ return _LIBC_FORGE_PTR(__builtin___memset_chk(__dst, __c, __n, __darwin_obsz0(__dst)), __n);
+}
+#define __memset_chk_func __memset_ptrchk
#endif
+
+#undef __stpncpy_chk_func /* stpncpy unavailable */
+#undef __strncpy_chk_func /* strncpy unavailable */
+
+#if __has_builtin(__builtin___strlcpy_chk)
+static inline size_t
+__strlcpy_ptrchk(char *const _LIBC_SIZE(__n) __darwin_pass_obsz __dst, const char *__src, size_t __n) {
+ return __builtin___strlcpy_chk(__dst, __src, __n, __darwin_obsz(__dst));
+}
+#define __strlcpy_chk_func __strlcpy_ptrchk
#endif
-#if __has_builtin(__builtin___memcpy_chk) || defined(__GNUC__)
-#undef memcpy
-/* void *memcpy(void *dst, const void *src, size_t n) */
-#define memcpy(dest, ...) \
+#if __has_builtin(__builtin___strlcat_chk)
+static inline size_t
+__strlcat_ptrchk(char *const _LIBC_SIZE(__n) __darwin_pass_obsz __dst, const char *__src, size_t __n) {
+ return __builtin___strlcat_chk(__dst, __src, __n, __darwin_obsz(__dst));
+}
+#define __strlcat_chk_func __strlcat_ptrchk
+#endif
+
+#if __has_builtin(__builtin___memccpy_chk)
+static inline void *_LIBC_SIZE(__n)
+__memccpy_ptrchk(void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, const void *_LIBC_SIZE(__n) __src, int __c, size_t __n) {
+ return _LIBC_FORGE_PTR(__builtin___memccpy_chk(__dst, __src, __c, __n, __darwin_obsz0(__dst)), __n);
+}
+#define __memccpy_chk_func __memccpy_ptrchk
+#endif
+
+#undef __strcpy_chk_func /* strcpy unavailable */
+#undef __stpcpy_chk_func /* stpcpy unavailable */
+#undef __strcat_chk_func /* strcat unavailable */
+#undef __strncat_chk_func /* strncat unavailable */
+
+#else /* __LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES */
+
+#define __is_modern_darwin(ios, macos) \
+ (__IPHONE_OS_VERSION_MIN_REQUIRED >= (ios) || \
+ __MAC_OS_X_VERSION_MIN_REQUIRED >= (macos) || \
+ defined(__DRIVERKIT_VERSION_MIN_REQUIRED))
+
+/* __is_gcc(gcc_major, gcc_minor)
+ * Special values:
+ * 10.0 means "test should always fail when __has_builtin isn't supported"
+ (because gcc got __has_builtin in version 10.0); this is used for builtins
+ that gcc did not support yet at the time __has_builtin was introduced, so
+ there is no point checking the compiler version.
+ * 0.0 means that we did not research when gcc started supporting this builtin,
+ but it's believed to have been the case at least since gcc 4.0, which came
+ out in 2005. (Hello from 2025! What year is it now? Can't believe we're still
+ using C!)
+ */
+#define __is_gcc(major, minor) \
+ (__GNUC__ > (gcc_major) || \
+ (__GNUC__ == (gcc_major) && __GNUC_MINOR__ >= (gcc_minor)))
+
+#ifdef __has_builtin
+#define __supports_builtin(builtin, gcc_major, gcc_minor) \
+ __has_builtin(builtin)
+#else
+#define __supports_builtin(builtin, gcc_major, gcc_minor) __is_gcc(gcc_major, gcc_minor)
+#endif
+
+
+#if __supports_builtin(__builtin___memcpy_chk, 0, 0)
+#define __memcpy_chk_func(dest, ...) \
__builtin___memcpy_chk (dest, __VA_ARGS__, __darwin_obsz0 (dest))
#endif
-#if __has_builtin(__builtin___memmove_chk) || defined(__GNUC__)
-#undef memmove
-/* void *memmove(void *dst, const void *src, size_t len) */
-#define memmove(dest, ...) \
+#if __supports_builtin(__builtin___memmove_chk, 0, 0)
+#define __memmove_chk_func(dest, ...) \
__builtin___memmove_chk (dest, __VA_ARGS__, __darwin_obsz0 (dest))
#endif
-#if __has_builtin(__builtin___memset_chk) || defined(__GNUC__)
-#undef memset
-/* void *memset(void *b, int c, size_t len) */
-#define memset(dest, ...) \
+#if __supports_builtin(__builtin___memset_chk, 0, 0)
+#define __memset_chk_func(dest, ...) \
__builtin___memset_chk (dest, __VA_ARGS__, __darwin_obsz0 (dest))
#endif
-#if __has_builtin(__builtin___strcpy_chk) || defined(__GNUC__)
-#undef strcpy
-/* char *strcpy(char *dst, const char *src) */
-#define strcpy(dest, ...) \
- __builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
+#if __supports_builtin(__builtin___stpncpy_chk, 4, 7)
+#define __stpncpy_chk_func(dest, ...) \
+ __builtin___stpncpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
-#if __DARWIN_C_LEVEL >= 200809L
-#if __has_builtin(__builtin___stpcpy_chk) || defined(__GNUC__)
-#undef stpcpy
-/* char *stpcpy(char *dst, const char *src) */
-#define stpcpy(dest, ...) \
- __builtin___stpcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
+#if __supports_builtin(__builtin___strncpy_chk, 0, 0)
+#define __strncpy_chk_func(dest, ...) \
+ __builtin___strncpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
-#endif /* __DARWIN_C_LEVEL >= 200809L */
-#if __DARWIN_C_LEVEL >= 200809L
-#if __has_builtin(__builtin___stpncpy_chk) || __APPLE_CC__ >= 5666 || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
-#undef stpncpy
-/* char *stpncpy(char *dst, const char *src, size_t n) */
-#define stpncpy(dest, ...) \
- __builtin___stpncpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
-#endif
-#endif /* _DARWIN_C_LEVEL >= 200809L */
+#if __is_modern_darwin(70000, 1090)
-#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
-#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 || \
- defined(__DRIVERKIT_VERSION_MIN_REQUIRED)
-#if __has_builtin(__builtin___strlcpy_chk) && __HAS_FIXED_CHK_PROTOTYPES
-#undef strlcpy
-/* size_t strlcpy(char *dst, const char *source, size_t size) */
-#define strlcpy(dest, ...) \
+#if __supports_builtin(__builtin___strlcpy_chk, 0, 0)
+#define __strlcpy_chk_func(dest, ...) \
__builtin___strlcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
-#if __has_builtin(__builtin___strlcat_chk) && __HAS_FIXED_CHK_PROTOTYPES
-#undef strlcat
-/* size_t strlcat(char *dst, const char *source, size_t size) */
-#define strlcat(dest, ...) \
+#if __supports_builtin(__builtin___strlcat_chk, 0, 0)
+#define __strlcat_chk_func(dest, ...) \
__builtin___strlcat_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
-#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 */
-#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
-#if __has_builtin(__builtin___strncpy_chk) || defined(__GNUC__)
-#undef strncpy
-/* char *strncpy(char *dst, const char *src, size_t n) */
-#define strncpy(dest, ...) \
- __builtin___strncpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
+#if __supports_builtin(__builtin___memccpy_chk, 10, 0)
+#define __memccpy_chk_func(dest, ...) \
+ __builtin___memccpy_chk (dest, __VA_ARGS__, __darwin_obsz0 (dest))
#endif
-#if __has_builtin(__builtin___strcat_chk) || defined(__GNUC__)
-#undef strcat
-/* char *strcat(char *s1, const char *s2) */
-#define strcat(dest, ...) \
+#endif /* __is_modern_darwin(70000, 1090) */
+
+
+#if __supports_builtin(__builtin___strcpy_chk, 0, 0)
+#define __strcpy_chk_func(dest, ...) \
+ __builtin___strcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
+#endif
+
+#if __supports_builtin(__builtin___stpcpy_chk, 0, 0)
+#define __stpcpy_chk_func(dest, ...) \
+ __builtin___stpcpy_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
+#endif
+
+#if __supports_builtin(__builtin___strcat_chk, 0, 0)
+#define __strcat_chk_func(dest, ...) \
__builtin___strcat_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
#if ! (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 32000)
-#if __has_builtin(__builtin___strncat_chk) || defined(__GNUC__)
-#undef strncat
-/* char *strncat(char *s1, const char *s2, size_t n) */
-#define strncat(dest, ...) \
+#if __supports_builtin(__builtin___strncat_chk, 0, 0)
+#define __strncat_chk_func(dest, ...) \
__builtin___strncat_chk (dest, __VA_ARGS__, __darwin_obsz (dest))
#endif
#endif
-#undef __HAS_FIXED_CHK_PROTOTYPES
+
+#undef __supports_builtin
+#undef __is_gcc
+
+#endif /* defined(__has_ptrcheck) && __has_ptrcheck */
+
+#undef __is_modern_darwin
+
+/* memccpy, memcpy, mempcpy, memmove, memset, strcpy, strlcpy, stpcpy,
+ strncpy, stpncpy, strcat, strlcat, and strncat */
+
+/* The use of .../__VA_ARGS__ is load-bearing. If the macros take fixed
+ * arguments, they are unable to themselves accept macros that expand to
+ * multiple arguments, like this:
+ * #define memcpy(a, b, c) ...
+ * #define FOO(data) get_bytes(data), get_length(data)
+ * memcpy(bar, FOO(d));
+ * This will fail because the preprocessor only sees two arguments on the first
+ * expansion of memcpy, when 3 are required.
+ * This is also required to support syntaxes that embed commas. The preprocessor
+ * recognizes parentheses for the isolation of arguments but not brackets. This
+ * expands to 3 arguments:
+ * strcpy(destination, [NSString stringWithFormat:@"%i", 4].UTF8String);
+ * ^ ^ ^
+ * |destination | |
+ * |[NSString stringWithFormat:@"%i" |
+ * |4].UTF8String
+ * This expands to 4 arguments:
+ * memcpy(destination, (uint8_t[]) { 1, 2 }, 2);
+ * ^ ^ ^ ^
+ * To work correctly under these hostile circumstances, chk_func macros
+ * need to expand to a bare identifier (like #define memcpy_chk_func __memcpy)
+ * or to a macro that also takes variadic arguments.
+ */
+
+#ifdef __memccpy_chk_func
+#undef memccpy
+#define memccpy(...) __memccpy_chk_func (__VA_ARGS__)
+#endif
+
+#ifdef __memcpy_chk_func
+#undef memcpy
+#define memcpy(...) __memcpy_chk_func (__VA_ARGS__)
+#endif
+
+#ifdef __memmove_chk_func
+#undef memmove
+#define memmove(...) __memmove_chk_func (__VA_ARGS__)
+#endif
+
+#ifdef __memset_chk_func
+#undef memset
+#define memset(...) __memset_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__strcpy_chk_func)
+#undef strcpy
+#define strcpy(...) __strcpy_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__strcat_chk_func)
+#undef strcat
+#define strcat(...) __strcat_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__strncpy_chk_func)
+#undef strncpy
+#define strncpy(...) __strncpy_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__strncat_chk_func)
+#undef strncat
+#define strncat(...) __strncat_chk_func (__VA_ARGS__)
+#endif
+
+#if __DARWIN_C_LEVEL >= 200809L
+
+#if defined(__stpcpy_chk_func)
+#undef stpcpy
+#define stpcpy(...) __stpcpy_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__stpncpy_chk_func)
+#undef stpncpy
+#define stpncpy(...) __stpncpy_chk_func (__VA_ARGS__)
+#endif
+
+#endif /* __DARWIN_C_LEVEL >= 200809L */
+
+#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
+#if defined(__strlcpy_chk_func)
+#undef strlcpy
+#define strlcpy(...) __strlcpy_chk_func (__VA_ARGS__)
+#endif
+
+#if defined(__strlcat_chk_func)
+#undef strlcat
+#define strlcat(...) __strlcat_chk_func (__VA_ARGS__)
+#endif
+#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
#endif /* _USE_FORTIFY_LEVEL > 0 */
+
#endif /* _SECURE__STRING_H_ */
diff --git a/lib/libc/include/any-macos-any/secure/_strings.h b/lib/libc/include/any-macos-any/secure/_strings.h
index 384c5068a6..a841395dda 100644
--- a/lib/libc/include/any-macos-any/secure/_strings.h
+++ b/lib/libc/include/any-macos-any/secure/_strings.h
@@ -39,18 +39,55 @@
/* Removed in Issue 7 */
#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
-#if __has_builtin(__builtin___memmove_chk) || defined(__GNUC__)
+#ifdef __LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES
+
+static inline void
+__bcopy_ptrcheck(const void *_LIBC_SIZE(__n) __src, void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, size_t __n) {
+ memmove(__dst, __src, __n);
+}
+
+static inline void
+__bzero_ptrcheck(void *const _LIBC_SIZE(__n) __darwin_pass_obsz0 __dst, size_t __n) {
+ memset(__dst, 0, __n);
+}
+
+#define __bcopy_chk_func __bcopy_ptrcheck
+#define __bzero_chk_func __bzero_ptrcheck
+
+#else
+
+#ifndef __has_builtin
+#define __undef__has_builtin
+#define __has_builtin(x) defined(__GNUC__)
+#endif
+
+#if __has_builtin(__builtin___memmove_chk)
+#define __bcopy_chk_func(src, dst, ...) \
+ __builtin___memmove_chk(dst, src, __VA_ARGS__, __darwin_obsz0 (dst))
+#endif
+
+#if __has_builtin(__builtin___memset_chk)
+#define __bzero_chk_func(dst, ...) \
+ __builtin___memset_chk(dst, 0, __VA_ARGS__, __darwin_obsz0 (dst))
+#endif
+
+#ifdef __undef__has_builtin
+#undef __undef__has_builtin
+#undef __has_builtin
+#endif
+
+#endif
+
+#ifdef __bcopy_chk_func
#undef bcopy
/* void bcopy(const void *src, void *dst, size_t len) */
-#define bcopy(src, dest, ...) \
- __builtin___memmove_chk (dest, src, __VA_ARGS__, __darwin_obsz0 (dest))
+#define bcopy(...) __bcopy_chk_func (__VA_ARGS__)
#endif
-#if __has_builtin(__builtin___memset_chk) || defined(__GNUC__)
+#ifdef __bzero_chk_func
#undef bzero
/* void bzero(void *s, size_t n) */
-#define bzero(dest, ...) \
- __builtin___memset_chk (dest, 0, __VA_ARGS__, __darwin_obsz0 (dest))
+#define bzero(...) __bzero_chk_func (__VA_ARGS__)
#endif
#endif
diff --git a/lib/libc/include/any-macos-any/setjmp.h b/lib/libc/include/any-macos-any/setjmp.h
index f54ddefa57..2998a2963c 100644
--- a/lib/libc/include/any-macos-any/setjmp.h
+++ b/lib/libc/include/any-macos-any/setjmp.h
@@ -51,9 +51,6 @@ typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];
#elif defined(__arm__) && !defined(__ARM_ARCH_7K__)
-
-#include <machine/signal.h>
-
/*
* _JBLEN is number of ints required to save the following:
* r4-r8, r10, fp, sp, lr, sig == 10 register_t sized
diff --git a/lib/libc/include/any-macos-any/spawn.h b/lib/libc/include/any-macos-any/spawn.h
index 1807f8b04d..0d9306b7d2 100644
--- a/lib/libc/include/any-macos-any/spawn.h
+++ b/lib/libc/include/any-macos-any/spawn.h
@@ -69,6 +69,12 @@ int posix_spawnp(pid_t * __restrict, const char * __restrict,
char *const __argv[__restrict],
char *const __envp[__restrict]) __API_AVAILABLE(macos(10.5), ios(2.0));
+int posix_spawn_file_actions_addchdir(posix_spawn_file_actions_t *,
+ const char * __restrict) __API_AVAILABLE(macos(26.0)) __API_UNAVAILABLE(ios, tvos, watchos, visionos);
+
+int posix_spawn_file_actions_addfchdir(posix_spawn_file_actions_t *,
+ int) __API_AVAILABLE(macos(26.0)) __API_UNAVAILABLE(ios, tvos, watchos, visionos);
+
int posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int) __API_AVAILABLE(macos(10.5), ios(2.0)) __API_UNAVAILABLE(watchos, tvos);
int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int,
@@ -174,10 +180,10 @@ int posix_spawn_file_actions_addinherit_np(posix_spawn_file_actions_t *,
int) __API_AVAILABLE(macos(10.7), ios(4.3)) __API_UNAVAILABLE(watchos, tvos);
int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *,
- const char * __restrict) __API_AVAILABLE(macos(10.15)) __API_UNAVAILABLE(ios, tvos, watchos);
+ const char * __restrict) __API_DEPRECATED("posix_spawn_file_actions_addchdir(3) has replaced posix_spawn_file_actions_addchdir_np(3)", macos(10.15, 26.0)) __API_UNAVAILABLE(ios, tvos, watchos, visionos);
int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *,
- int) __API_AVAILABLE(macos(10.15)) __API_UNAVAILABLE(ios, tvos, watchos);
+ int) __API_DEPRECATED("posix_spawn_file_actions_addfchdir(3) has replaced posix_spawn_file_actions_addfchdir_np(3)", macos(10.15, 26.0)) __API_UNAVAILABLE(ios, tvos, watchos, visionos);
__END_DECLS
diff --git a/lib/libc/include/any-macos-any/sys/_symbol_aliasing.h b/lib/libc/include/any-macos-any/sys/_symbol_aliasing.h
index c0a780342b..d77659f884 100644
--- a/lib/libc/include/any-macos-any/sys/_symbol_aliasing.h
+++ b/lib/libc/include/any-macos-any/sys/_symbol_aliasing.h
@@ -341,18 +341,6 @@
#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_5(x)
#endif
-#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 140400
-#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_4(x) x
-#else
-#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_4(x)
-#endif
-
-#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 140500
-#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_5(x) x
-#else
-#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_5(x)
-#endif
-
#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 140600
#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_14_6(x) x
#else
@@ -557,6 +545,24 @@
#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_18_5(x)
#endif
+#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 180600
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_18_6(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_18_6(x)
+#endif
+
+#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 190000
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_19_0(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_19_0(x)
+#endif
+
+#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 260000
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_26_0(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_IPHONE___IPHONE_26_0(x)
+#endif
+
#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1000
#define __DARWIN_ALIAS_STARTING_MAC___MAC_10_0(x) x
#else
@@ -857,12 +863,6 @@
#define __DARWIN_ALIAS_STARTING_MAC___MAC_13_1(x)
#endif
-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 130100
-#define __DARWIN_ALIAS_STARTING_MAC___MAC_13_1(x) x
-#else
-#define __DARWIN_ALIAS_STARTING_MAC___MAC_13_1(x)
-#endif
-
#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 130200
#define __DARWIN_ALIAS_STARTING_MAC___MAC_13_2(x) x
#else
@@ -983,3 +983,21 @@
#define __DARWIN_ALIAS_STARTING_MAC___MAC_15_5(x)
#endif
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 150600
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_15_6(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_15_6(x)
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 160000
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_16_0(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_16_0(x)
+#endif
+
+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 260000
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_26_0(x) x
+#else
+#define __DARWIN_ALIAS_STARTING_MAC___MAC_26_0(x)
+#endif
+
diff --git a/lib/libc/include/any-macos-any/sys/_types/_graftdmg_un.h b/lib/libc/include/any-macos-any/sys/_types/_graftdmg_un.h
index 366336bea3..5b3b02b666 100644
--- a/lib/libc/include/any-macos-any/sys/_types/_graftdmg_un.h
+++ b/lib/libc/include/any-macos-any/sys/_types/_graftdmg_un.h
@@ -43,6 +43,9 @@
#define SBC_STRICT_AUTH 0x0010 /* Strict authentication mode */
#define SBC_PRESERVE_GRAFT 0x0020 /* Preserve graft itself until unmount */
+/* Flag values for ungraftdmg */
+#define UNGRAFTDMG_NOFORCE 0x0000000000000002ULL /* Disallow ungraft if a non-dir vnode inside the graft is in use */
+
typedef struct secure_boot_cryptex_args {
u_int32_t sbc_version;
u_int32_t sbc_4cc;
diff --git a/lib/libc/include/any-macos-any/sys/attr.h b/lib/libc/include/any-macos-any/sys/attr.h
index 52451bfcc6..ebd4c9e274 100644
--- a/lib/libc/include/any-macos-any/sys/attr.h
+++ b/lib/libc/include/any-macos-any/sys/attr.h
@@ -50,9 +50,10 @@
#define FSOPT_PACK_INVAL_ATTRS 0x00000008
-#define FSOPT_ATTR_CMN_EXTENDED 0x00000020
+#define FSOPT_ATTR_CMN_EXTENDED 0x00000020
#define FSOPT_RETURN_REALDEV 0x00000200
#define FSOPT_NOFOLLOW_ANY 0x00000800
+#define FSOPT_RESOLVE_BENEATH 0x00001000
/* we currently aren't anywhere near this amount for a valid
* fssearchblock.sizeofsearchparams1 or fssearchblock.sizeofsearchparams2
@@ -369,6 +370,9 @@ typedef struct vol_capabilities_attr {
*
* VOL_CAP_INT_PUNCHHOLE: When set, the volume supports the F_PUNCHHOLE
* fcntl.
+ *
+ * VOL_CAP_INT_BARRIERFSYNC: When set, the volume supports the F_BARRIERFSYNC
+ * fcntl.
*/
#define VOL_CAP_INT_SEARCHFS 0x00000001
#define VOL_CAP_INT_ATTRLIST 0x00000002
@@ -393,6 +397,7 @@ typedef struct vol_capabilities_attr {
#define VOL_CAP_INT_RENAME_SECLUDE 0x00200000
#define VOL_CAP_INT_ATTRIBUTION_TAG 0x00400000
#define VOL_CAP_INT_PUNCHHOLE 0x00800000
+#define VOL_CAP_INT_BARRIERFSYNC 0x01000000
typedef struct vol_attributes_attr {
attribute_set_t validattr;
diff --git a/lib/libc/include/any-macos-any/sys/cdefs.h b/lib/libc/include/any-macos-any/sys/cdefs.h
index f75cf88c4f..0b9bfb4c02 100644
--- a/lib/libc/include/any-macos-any/sys/cdefs.h
+++ b/lib/libc/include/any-macos-any/sys/cdefs.h
@@ -199,7 +199,16 @@
*/
#define __exported __attribute__((__visibility__("default")))
#define __exported_push _Pragma("GCC visibility push(default)")
+#ifndef __BUILDING_XNU_LIBRARY__
+#define __exported_push_hidden _Pragma("GCC visibility push(hidden)")
#define __exported_pop _Pragma("GCC visibility pop")
+#define __exported_hidden __private_extern__
+#else /* __BUILDING_XNU_LIBRARY__ */
+/* Don't hide symbols that the might be need to be used from outside */
+#define __exported_push_hidden
+#define __exported_pop
+#define __exported_hidden
+#endif /* __BUILDING_XNU_LIBRARY__ */
/* __deprecated causes the compiler to produce a warning when encountering
* code using the deprecated functionality.
@@ -509,12 +518,14 @@
* for plain C (see also <ptrcheck.h>).
*
* Attribute __unsafe_buffer_usage can be used to label functions that should be
- * avoided as they may perform or otherwise introduce unsafe buffer
- * manipulation operations.
+ * avoided as they may perform or otherwise introduce unsafe buffer manipulation
+ * operations. The attribute can also be attached to class/struct fields that
+ * are used in unsafe buffer manipulations.
*
- * Calls to such functions are flagged by -Wunsafe-buffer-usage, similarly to
+ * Calls to attribute annotated functions are flagged by -Wunsafe-buffer-usage, similar to
* how unchecked buffer manipulation operations are flagged when observed
- * by the compiler directly:
+ * by the compiler directly. Similarly, use of and assignment to the struct/class fields
+ * that have the attribute also get flagged by the compiler.
*
* // An unsafe function that needs to be avoided.
* __unsafe_buffer_usage
@@ -527,14 +538,30 @@
* int array[5];
*
* // Direct unsafe buffer manipulation through subscript operator:
- * array[idx] = 3; // warning [-Wunsafe-buffer-usage]
+ * array[idx] = 3; // warning: function introduces unsafe buffer manipulation [-Wunsafe-buffer-usage]
* // Unsafe buffer manipulation through function foo():
- * foo(array, 5); // warning [-Wunsafe-buffer-usage]
+ * foo(array, 5); // warning: function introduces unsafe buffer manipulation [-Wunsafe-buffer-usage]
* // Checked buffer manipulation, with bounds information automatically
* // preserved for the purposes of runtime checks in standard library:
* foo(array); // no warning
* }
*
+ * struct Reader {
+ * // Field involved in unsafe buffer manipulation
+ * __unsafe_buffer_usage
+ * void *ptr;
+ *
+ * __unsafe_buffer_usage
+ * size_t sz, count;
+ * };
+ *
+ * void add_element(Reader rdr, int value) {
+ * if(rdr.count < rdr.sz) { // warning: unsafe buffer access [-Wunsafe-buffer-usage]
+ * rdr.ptr[rdr.count] = value; // warning: unsafe buffer access [-Wunsafe-buffer-usage]
+ * rdr.count++; // warning: unsafe buffer access [-Wunsafe-buffer-usage]
+ * }
+ * }
+ *
* While annotating a function as __unsafe_buffer_usage has an effect similar
* to annotating it as __deprecated, the __unsafe_buffer_usage attribute
* should be used whenever the resulting warning needs to be controlled
@@ -542,11 +569,12 @@
* don't attempt to achieve bounds safety this way) as opposed to -Wdeprecated
* (enabled in most codebases).
*
- * The attribute does NOT suppress -Wunsafe-buffer-usage warnings inside
- * the function's body; it simply introduces new warnings at each call site
- * to help the developers avoid the function entirely. Most of the time
- * it does not make sense to annotate a function as __unsafe_buffer_usage
- * without providing the users with a safe alternative.
+ * The attribute suppresses all -Wunsafe-buffer-usage warnings inside the
+ * function's body as it is explictly marked as unsafe by the user and
+ * introduces new warnings at each call site to help the developers avoid the
+ * function entirely. Most of the time it does not make sense to annotate a
+ * function as __unsafe_buffer_usage without providing the users with a safe
+ * alternative.
*
* Pragmas __unsafe_buffer_usage_begin and __unsafe_buffer_usage_end
* annotate a range of code as intentionally containing unsafe buffer
@@ -560,9 +588,7 @@
*
* These pragmas are NOT a way to mass-annotate functions with the attribute
* __unsafe_buffer_usage. Functions declared within the pragma range
- * do NOT get annotated automatically. In some rare situations it makes sense
- * to do all three: put the attribute on the function, put pragmas inside
- * the body of the function, and put pragmas around some call sites.
+ * do NOT get annotated automatically.
*/
#if __has_cpp_attribute(clang::unsafe_buffer_usage)
#define __has_safe_buffers 1
diff --git a/lib/libc/include/any-macos-any/sys/clonefile.h b/lib/libc/include/any-macos-any/sys/clonefile.h
index 5b34440fd5..5811ec03e1 100644
--- a/lib/libc/include/any-macos-any/sys/clonefile.h
+++ b/lib/libc/include/any-macos-any/sys/clonefile.h
@@ -30,10 +30,11 @@
#define _SYS_CLONEFILE_H_
/* Options for clonefile calls */
-#define CLONE_NOFOLLOW 0x0001 /* Don't follow symbolic links */
-#define CLONE_NOOWNERCOPY 0x0002 /* Don't copy ownership information from source */
-#define CLONE_ACL 0x0004 /* Copy access control lists from source */
-#define CLONE_NOFOLLOW_ANY 0x0008 /* Don't follow any symbolic links in the path */
+#define CLONE_NOFOLLOW 0x0001 /* Don't follow symbolic links */
+#define CLONE_NOOWNERCOPY 0x0002 /* Don't copy ownership information from source */
+#define CLONE_ACL 0x0004 /* Copy access control lists from source */
+#define CLONE_NOFOLLOW_ANY 0x0008 /* Don't follow any symbolic links in the path */
+#define CLONE_RESOLVE_BENEATH 0x0010 /* path must reside in the hierarchy beneath the starting directory */
#include <sys/cdefs.h>
diff --git a/lib/libc/include/any-macos-any/sys/errno.h b/lib/libc/include/any-macos-any/sys/errno.h
index 0360a496f0..982aaa314c 100644
--- a/lib/libc/include/any-macos-any/sys/errno.h
+++ b/lib/libc/include/any-macos-any/sys/errno.h
@@ -260,7 +260,12 @@ __END_DECLS
#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
#define EQFULL 106 /* Interface output queue is full */
-#define ELAST 106 /* Must be equal largest errno */
+#endif
+
+#define ENOTCAPABLE 107 /* Capabilities insufficient */
+
+#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
+#define ELAST 107 /* Must be equal largest errno */
#endif
#endif /* _SYS_ERRNO_H_ */
diff --git a/lib/libc/include/any-macos-any/sys/fcntl.h b/lib/libc/include/any-macos-any/sys/fcntl.h
index 7f04f1ff12..efe063dfd5 100644
--- a/lib/libc/include/any-macos-any/sys/fcntl.h
+++ b/lib/libc/include/any-macos-any/sys/fcntl.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000-2022 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2025 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
@@ -126,6 +126,7 @@
#define O_TRUNC 0x00000400 /* truncate to zero length */
#define O_EXCL 0x00000800 /* error if already exists */
#define O_RESOLVE_BENEATH 0x00001000 /* only for open(2), same value as FMARK */
+#define O_UNIQUE 0x00002000 /* only for open(2), same value as FDEFER */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
@@ -181,6 +182,8 @@
#define AT_REALDEV 0x0200 /* Return real device inodes resides on for fstatat(2) */
#define AT_FDONLY 0x0400 /* Use only the fd and Ignore the path for fstatat(2) */
#define AT_SYMLINK_NOFOLLOW_ANY 0x0800 /* Path should not contain any symlinks */
+#define AT_RESOLVE_BENEATH 0x2000 /* Path must reside in the hierarchy beneath the starting directory */
+#define AT_NODELETEBUSY 0x4000 /* Don't delete busy files */
#endif
#endif
@@ -258,10 +261,8 @@
#define F_THAW_FS 54 /* "thaw" all fs operations */
#define F_GLOBAL_NOCACHE 55 /* turn data caching off/on (globally) for this file */
-
#define F_ADDSIGS 59 /* add detached signatures */
-
#define F_ADDFILESIGS 61 /* add signature from same file (used by dyld for shared libs) */
#define F_NODIRECT 62 /* used in conjunction with F_NOCACHE to indicate that DIRECT, synchonous writes */
@@ -282,7 +283,6 @@
/* See F_DUPFD_CLOEXEC below for 67 */
-
#define F_SETBACKINGSTORE 70 /* Mark the file as being the backing store for another filesystem */
#define F_GETPATH_MTMINFO 71 /* return the full path of the FD, but error in specific mtmd circumstances */
@@ -300,10 +300,8 @@
#define F_FINDSIGS 78 /* Add detached code signatures (used by dyld for shared libs) */
-
#define F_ADDFILESIGS_FOR_DYLD_SIM 83 /* Add signature from same file, only if it is signed by Apple (used by dyld for simulator) */
-
#define F_BARRIERFSYNC 85 /* fsync + issue barrier to drive */
#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
@@ -314,7 +312,6 @@
#define F_OFD_SETLKWTIMEOUT 93 /* (as F_OFD_SETLKW but return if timeout) */
#endif
-
#define F_ADDFILESIGS_RETURN 97 /* Add signature from same file, return end offset in structure on success */
#define F_CHECK_LV 98 /* Check if Library Validation allows this Mach-O file to be mapped into the calling process */
@@ -335,10 +332,10 @@
#define F_SETLEASE_ARG(t, oc) ((t) | ((oc) << 2))
-
#define F_TRANSFEREXTENTS 110 /* Transfer allocated extents beyond leof to a different file */
#define F_ATTRIBUTION_TAG 111 /* Based on flags, query/set/delete a file's attribution tag */
+#define F_NOCACHE_EXT 112 /* turn data caching off/on for this fd and relax size and alignment restrictions for write */
#define F_ADDSIGS_MAIN_BINARY 113 /* add detached signatures for main binary -- development only */
@@ -359,7 +356,6 @@
#define F_UNLCK 2 /* unlock */
#define F_WRLCK 3 /* exclusive or write lock */
-
/*
* [XSI] The values used for l_whence shall be defined as described
* in <unistd.h>
@@ -409,6 +405,7 @@ struct flocktimeout {
struct flock fl; /* flock passed for file locking */
struct timespec timeout; /* timespec struct for timeout */
};
+
#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
@@ -521,7 +518,6 @@ typedef struct fspecread {
off_t fsr_length; /* IN: size of the region */
} fspecread_t;
-
/* fattributiontag_t used by F_ATTRIBUTION_TAG */
#define ATTRIBUTION_NAME_MAX 255
typedef struct fattributiontag {
@@ -573,7 +569,6 @@ struct log2phys {
#define O_POPUP 0x80000000 /* force window to popup on open */
#define O_ALERT 0x20000000 /* small, clean popup window */
-
#endif /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
@@ -628,4 +623,5 @@ int filesec_unset_property(filesec_t, filesec_property_t) __OSX_AVAILABLE_ST
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
__END_DECLS
+
#endif /* !_SYS_FCNTL_H_ */
diff --git a/lib/libc/include/any-macos-any/sys/kern_control.h b/lib/libc/include/any-macos-any/sys/kern_control.h
index 5dde92543a..da7bd7036b 100644
--- a/lib/libc/include/any-macos-any/sys/kern_control.h
+++ b/lib/libc/include/any-macos-any/sys/kern_control.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000-2004, 2012-2016 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2012-2025 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
diff --git a/lib/libc/include/any-macos-any/sys/mount.h b/lib/libc/include/any-macos-any/sys/mount.h
index 23224f87d9..b414295d98 100644
--- a/lib/libc/include/any-macos-any/sys/mount.h
+++ b/lib/libc/include/any-macos-any/sys/mount.h
@@ -384,7 +384,8 @@ struct netfs_status {
#define VQ_DESIRED_DISK 0x4000 /* the desired disk space */
#define VQ_FREE_SPACE_CHANGE 0x8000 /* free disk space has significantly changed */
#define VQ_PURGEABLE_SPACE_CHANGE 0x10000 /* purgeable disk space has significantly changed */
-#define VQ_FLAG20000 0x20000 /* placeholder */
+#define VQ_IDLE_PURGE_NOTIFY 0x20000 /* Above nearlowdisk and below desired disk space */
+#define VQ_FLAG40000 0x40000 /* placeholder */
@@ -413,7 +414,7 @@ OS_ENUM(graftdmg_type, uint32_t,
GRAFTDMG_CRYPTEX_BOOT = 1,
GRAFTDMG_CRYPTEX_PREBOOT = 2,
GRAFTDMG_CRYPTEX_DOWNLEVEL = 3,
- // Reserved: CRYPTEX1_AUTH_ENV_GENERIC = 4,
+ GRAFTDMG_CRYPTEX_AUTH_ENV_GENERIC = 4,
// Reserved: CRYPTEX1_AUTH_ENV_GENERIC_SUPPLEMENTAL = 5,
GRAFTDMG_CRYPTEX_PDI_NONCE = 6,
GRAFTDMG_CRYPTEX_EFFECTIVE_AP = 7,
@@ -459,6 +460,7 @@ int statfs(const char *, struct statfs *) __DARWIN_INODE64(statfs);
int statfs64(const char *, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_6, __IPHONE_NA, __IPHONE_NA);
#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
int unmount(const char *, int);
+int funmount(int, int) __OSX_AVAILABLE(16.0) __IOS_AVAILABLE(19.0) __TVOS_AVAILABLE(19.0) __WATCHOS_AVAILABLE(12.0);
int getvfsbyname(const char *, struct vfsconf *);
__END_DECLS
diff --git a/lib/libc/include/any-macos-any/sys/paths.h b/lib/libc/include/any-macos-any/sys/paths.h
index 3a2f1bb053..538330184f 100644
--- a/lib/libc/include/any-macos-any/sys/paths.h
+++ b/lib/libc/include/any-macos-any/sys/paths.h
@@ -40,5 +40,16 @@
#define _PATH_RSRCNAME "rsrc"
#define _PATH_RSRCFORKSPEC "/..namedfork/rsrc"
+/* Prefix Path Namespace */
+#define RESOLVE_NOFOLLOW_ANY 0x00000001 /* no symlinks allowed in path */
+#define RESOLVE_NODOTDOT 0x00000002 /* prevent '..' path traversal */
+#define RESOLVE_LOCAL 0x00000004 /* prevent a path lookup into a network filesystem */
+#define RESOLVE_NODEVFS 0x00000008 /* prevent a path lookup into `devfs` filesystem */
+#define RESOLVE_IMMOVABLE 0x00000010 /* prevent a path lookup into a removable filesystem */
+#define RESOLVE_UNIQUE 0x00000020 /* prevent a path lookup on a vnode with multiple links */
+#define RESOLVE_NOXATTRS 0x00000040 /* prevent a path lookup on named streams */
+
+#define RESOLVE_VALIDMASK 0x0000007F
+
#endif /* __APPLE_API_PRIVATE */
#endif /* !_SYS_PATHS_H_ */
diff --git a/lib/libc/include/any-macos-any/sys/proc.h b/lib/libc/include/any-macos-any/sys/proc.h
index 621ef3c0b2..97b710fd76 100644
--- a/lib/libc/include/any-macos-any/sys/proc.h
+++ b/lib/libc/include/any-macos-any/sys/proc.h
@@ -86,6 +86,7 @@
struct session;
struct pgrp;
struct proc;
+struct proc_ident;
/* Exported fields for kern sysctls */
struct extern_proc {
diff --git a/lib/libc/include/any-macos-any/sys/proc_info.h b/lib/libc/include/any-macos-any/sys/proc_info.h
index aa9a4e74c3..92b0ed2cc0 100644
--- a/lib/libc/include/any-macos-any/sys/proc_info.h
+++ b/lib/libc/include/any-macos-any/sys/proc_info.h
@@ -349,6 +349,11 @@ struct proc_threadwithpathinfo {
struct vnode_info_path pvip;
};
+struct proc_archinfo {
+ cpu_type_t p_cputype;
+ cpu_subtype_t p_cpusubtype;
+};
+
/*
* Socket
*/
@@ -758,6 +763,9 @@ struct channel_fdinfo {
#define PROC_PID_RUSAGE 16
#define PROC_PID_RUSAGE_SIZE 0
+#define PROC_PIDARCHINFO 19
+#define PROC_PIDARCHINFO_SIZE (sizeof(struct proc_archinfo))
+
/* Flavors for proc_pidfdinfo */
#define PROC_PIDFDVNODEINFO 1
diff --git a/lib/libc/include/any-macos-any/sys/resource.h b/lib/libc/include/any-macos-any/sys/resource.h
index 207e96120e..ca278157de 100644
--- a/lib/libc/include/any-macos-any/sys/resource.h
+++ b/lib/libc/include/any-macos-any/sys/resource.h
@@ -514,6 +514,7 @@ struct proc_rlimit_control_wakeupmon {
#define IOPOL_TYPE_VFS_SKIP_MTIME_UPDATE 8
#define IOPOL_TYPE_VFS_ALLOW_LOW_SPACE_WRITES 9
#define IOPOL_TYPE_VFS_DISALLOW_RW_FOR_O_EVTONLY 10
+#define IOPOL_TYPE_VFS_ENTITLED_RESERVE_ACCESS 14
/* scope */
#define IOPOL_SCOPE_PROCESS 0
@@ -564,6 +565,9 @@ struct proc_rlimit_control_wakeupmon {
#define IOPOL_VFS_NOCACHE_WRITE_FS_BLKSIZE_DEFAULT 0
#define IOPOL_VFS_NOCACHE_WRITE_FS_BLKSIZE_ON 1
+#define IOPOL_VFS_ENTITLED_RESERVE_ACCESS_OFF 0
+#define IOPOL_VFS_ENTITLED_RESERVE_ACCESS_ON 1
+
#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
diff --git a/lib/libc/include/any-macos-any/sys/signal.h b/lib/libc/include/any-macos-any/sys/signal.h
index e2d8b2b3f1..df70637097 100644
--- a/lib/libc/include/any-macos-any/sys/signal.h
+++ b/lib/libc/include/any-macos-any/sys/signal.h
@@ -164,6 +164,7 @@ union sigval {
#define SIGEV_NONE 0 /* No async notification */
#define SIGEV_SIGNAL 1 /* aio - completion notification */
#define SIGEV_THREAD 3 /* [NOTIMP] [RTS] call notification function */
+#define SIGEV_KEVENT 4 /* Generate a kevent */
struct sigevent {
int sigev_notify; /* Notification type */
diff --git a/lib/libc/include/any-macos-any/sys/stdio.h b/lib/libc/include/any-macos-any/sys/stdio.h
index 1c747a42f4..2246da4939 100644
--- a/lib/libc/include/any-macos-any/sys/stdio.h
+++ b/lib/libc/include/any-macos-any/sys/stdio.h
@@ -37,6 +37,7 @@
#define RENAME_EXCL 0x00000004
#define RENAME_RESERVED1 0x00000008
#define RENAME_NOFOLLOW_ANY 0x00000010
+#define RENAME_RESOLVE_BENEATH 0x00000020
#endif
#if __DARWIN_C_LEVEL >= 200809L
diff --git a/lib/libc/include/any-macos-any/sys/sysctl.h b/lib/libc/include/any-macos-any/sys/sysctl.h
index 1618902ef5..066a21a663 100644
--- a/lib/libc/include/any-macos-any/sys/sysctl.h
+++ b/lib/libc/include/any-macos-any/sys/sysctl.h
@@ -154,7 +154,8 @@ struct ctlname {
#define CTLFLAG_KERN 0x01000000 /* valid inside the kernel */
#define CTLFLAG_LOCKED 0x00800000 /* node will handle locking itself */
#define CTLFLAG_OID2 0x00400000 /* struct sysctl_oid has version info */
-#define CTLFLAG_EXPERIMENT 0x00100000 /* Allows writing w/ the trial experiment entitlement. */
+#define CTLFLAG_EXPERIMENT 0x00100000 /* Allows read/write w/ the trial experiment entitlement. */
+#define CTLFLAG_LEGACY_EXPERIMENT 0x00080000 /* Allows writing w/ the legacy trial experiment entitlement. */
/*
* USE THIS instead of a hardwired number from the categories below
diff --git a/lib/libc/include/any-macos-any/unistd.h b/lib/libc/include/any-macos-any/unistd.h
index 21142adf17..1aadc42c0e 100644
--- a/lib/libc/include/any-macos-any/unistd.h
+++ b/lib/libc/include/any-macos-any/unistd.h
@@ -72,7 +72,15 @@
#include <_types.h>
#include <sys/unistd.h>
#include <Availability.h>
+#define _LIBC_COUNT__PATH_MAX _LIBC_UNSAFE_INDEXABLE
+#if (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
+#if defined(__LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES) && __has_ptrcheck
+/* required for bounds annotations, but pollutes namespace */
#include <sys/syslimits.h>
+#undef _LIBC_COUNT__PATH_MAX
+#define _LIBC_COUNT__PATH_MAX _LIBC_COUNT_OR_NULL(PATH_MAX)
+#endif /* defined(__LIBC_STAGED_BOUNDS_SAFETY_ATTRIBUTES) && __has_ptrcheck */
+#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#include <sys/_types/_gid_t.h>
#include <sys/_types/_intptr_t.h>
#include <sys/_types/_off_t.h>
@@ -517,8 +525,6 @@ extern int optind, opterr, optopt;
__END_DECLS
#endif /* __DARWIN_C_LEVEL >= 199209L */
-
-
/* Additional functionality provided by:
* POSIX.1c-1995,
* POSIX.1i-1995,
@@ -526,7 +532,6 @@ __END_DECLS
*/
#if __DARWIN_C_LEVEL >= 199506L
-#include <_ctermid.h>
/* These F_* are really XSI or Issue 6 */
#define F_ULOCK 0 /* unlock locked section */
#define F_LOCK 1 /* lock a section for exclusive use */
@@ -536,6 +541,11 @@ __END_DECLS
__BEGIN_DECLS
/* Begin XSI */
+/* Removed in Issue 7 */
+#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
+#include <_ctermid.h>
+#endif
+
/* Removed in Issue 6 */
#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200112L
#if !defined(_POSIX_C_SOURCE)
@@ -565,7 +575,7 @@ char *_LIBC_CSTR getpass(const char *) __POSIX_C_DEPRECATED(199506L);
/* Removed in Issue 7 */
#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
-char *_LIBC_CSTR getwd(char *_LIBC_COUNT_OR_NULL(PATH_MAX)) __POSIX_C_DEPRECATED(200112L); /* obsoleted by getcwd() */
+char *_LIBC_CSTR getwd(char *_LIBC_COUNT__PATH_MAX) __POSIX_C_DEPRECATED(200112L); /* obsoleted by getcwd() */
#endif
int lchown(const char *, uid_t, gid_t) __DARWIN_ALIAS(lchown);
diff --git a/lib/libc/include/any-macos-any/xpc/base.h b/lib/libc/include/any-macos-any/xpc/base.h
index 493818131f..0e8cb37869 100644
--- a/lib/libc/include/any-macos-any/xpc/base.h
+++ b/lib/libc/include/any-macos-any/xpc/base.h
@@ -93,8 +93,10 @@ __BEGIN_DECLS
#if defined(__XPC_TEST__) && __XPC_TEST__
#define XPC_TESTSTATIC
#define XPC_TESTEXTERN extern
+#define XPC_TESTNORETURN
#else // defined(__XPC_TEST__) && __XPC_TEST__
#define XPC_TESTSTATIC static
+#define XPC_TESTNORETURN XPC_NORETURN
#endif // defined(__XPC_TEST__) && __XPC_TEST__
#if __has_feature(objc_arc)
@@ -242,6 +244,8 @@ __BEGIN_DECLS
#define XPC_SWIFT_UNAVAILABLE(msg) __swift_unavailable(msg)
#define XPC_SWIFT_NOEXPORT XPC_SWIFT_UNAVAILABLE("Unavailable in Swift from the XPC C Module")
+#define XPC_SWIFT_SENDABLE __attribute__((__swift_attr__("@Sendable")))
+
__END_DECLS
#endif // __XPC_BASE_H__
diff --git a/lib/libc/include/any-macos-any/xpc/connection.h b/lib/libc/include/any-macos-any/xpc/connection.h
index 36f20bae9c..f27937bdb4 100644
--- a/lib/libc/include/any-macos-any/xpc/connection.h
+++ b/lib/libc/include/any-macos-any/xpc/connection.h
@@ -141,8 +141,8 @@ typedef void (*xpc_finalizer_t)(void * _Nullable value);
* The GCD queue to which the event handler block will be submitted. This
* parameter may be NULL, in which case the connection's target queue will be
* libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT.
- * The target queue may be changed later with a call to
- * xpc_connection_set_target_queue().
+ * The target queue may be changed prior to the connection being activated with
+ * a call to xpc_connection_set_target_queue().
*
* @result
* A new connection object. The caller is responsible for disposing of the
@@ -178,8 +178,8 @@ xpc_connection_create(const char * _Nullable name,
* The GCD queue to which the event handler block will be submitted. This
* parameter may be NULL, in which case the connection's target queue will be
* libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT.
- * The target queue may be changed later with a call to
- * xpc_connection_set_target_queue().
+ * The target queue may be changed prior to the connection being activated with
+ * a call to xpc_connection_set_target_queue().
*
* @param flags
* Additional attributes with which to create the connection.
@@ -240,14 +240,11 @@ xpc_connection_create_from_endpoint(xpc_endpoint_t endpoint);
* libdispatch's default target queue, defined as DISPATCH_TARGET_QUEUE_DEFAULT.
*
* @discussion
- * Setting the target queue is asynchronous and non-preemptive and therefore
- * this method will not interrupt the execution of an already-running event
- * handler block. Setting the target queue may be likened to issuing a barrier
- * to the connection which does the actual work of changing the target queue.
+ * Once a connection is activated, this method may no longer be called and the
+ * target queue may no longer be updated.
*
- * The XPC runtime guarantees this non-preemptiveness even for concurrent target
- * queues. If the target queue is a concurrent queue, then XPC still guarantees
- * that there will never be more than one invocation of the connection's event
+ * Even if the target queue is a concurrent queue, XPC still guarantees that
+ * there will never be more than one invocation of the connection's event
* handler block executing concurrently. If you wish to process events
* concurrently, you can dispatch_async(3) to a concurrent queue from within
* the event handler.
@@ -330,7 +327,7 @@ __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_5_0)
XPC_EXPORT XPC_NONNULL_ALL
void
xpc_connection_set_event_handler(xpc_connection_t connection,
- xpc_handler_t handler);
+ XPC_SWIFT_SENDABLE xpc_handler_t handler);
/*!
* @function xpc_connection_activate
@@ -534,7 +531,7 @@ XPC_EXPORT XPC_NONNULL1 XPC_NONNULL2 XPC_NONNULL4
void
xpc_connection_send_message_with_reply(xpc_connection_t connection,
xpc_object_t message, dispatch_queue_t _Nullable replyq,
- xpc_handler_t handler);
+ XPC_SWIFT_SENDABLE xpc_handler_t handler);
/*!
* @function xpc_connection_send_message_with_reply_sync
@@ -984,6 +981,33 @@ int
xpc_connection_set_peer_lightweight_code_requirement(xpc_connection_t connection, xpc_object_t lwcr);
/*!
+ * @function xpc_connection_set_peer_requirement
+ * Requires that the connection peer has the specified requirement
+ *
+ * @param connection
+ * The connection object which is to be modified
+ *
+ * @param peer_requirement
+ * The requirement the peer must have
+ * It is safe to deallocate the peer requirement after calling `xpc_connection_set_peer_requirement`
+ *
+ * @discussion
+ * It is a programming error to call multiple of the `xpc_connection_set_peer_*_requirement` family of functions on the same
+ * connection. If more complex combinations of requirements are required, use lightweight code requirement.
+ *
+ * All messages received on this connection will be checked to ensure that they come from a peer who satisfies the
+ * requirement. For a listener connection, requests that do not satisfy the requirement are dropped. When a reply
+ * is expected on the connection and the peer does not satisfy the requirement `XPC_ERROR_PEER_CODE_SIGNING_REQUIREMENT`
+ * will be delivered instead of the reply.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_NONNULL_ALL
+void
+xpc_connection_set_peer_requirement(xpc_connection_t connection,
+ xpc_peer_requirement_t peer_requirement);
+
+/*!
* @function xpc_connection_copy_invalidation_reason
* Returns a description of why the connection was invalidated.
*
diff --git a/lib/libc/include/any-macos-any/xpc/listener.h b/lib/libc/include/any-macos-any/xpc/listener.h
index 6cf34d2c82..b956ae0941 100644
--- a/lib/libc/include/any-macos-any/xpc/listener.h
+++ b/lib/libc/include/any-macos-any/xpc/listener.h
@@ -24,7 +24,7 @@ __BEGIN_DECLS
* connect to the server
*
*/
-OS_OBJECT_DECL_CLASS(xpc_listener);
+OS_OBJECT_DECL_SENDABLE_CLASS(xpc_listener);
#pragma mark Constants
/*!
@@ -202,19 +202,22 @@ xpc_listener_reject_peer(xpc_session_t peer, const char *reason);
* The listener object which is to be modified.
*
* @param requirement
- * The code signing requirement to be satisfied by the peer
- * It is safe to deallocate the requirement string after calling `xpc_listener_set_peer_code_signing_requirement`
+ * The code signing requirement to be satisfied by the peer. It is safe to
+ * deallocate the requirement string after calling this function.
*
* @result
* 0 on success, non-zero on error
*
* @discussion
- * This function will return an error promptly if the code signing requirement string is invalid.
+ * This function will return an error promptly if the code signing requirement
+ * string is invalid.
*
- * It is a programming error to call `xpc_listener_set_peer_code_signing_requirement` more than once per listener.
+ * It is a programming error to call `xpc_listener_set_peer_*requirement` more
+ * than once per listener.
*
- * All messages received on this listener will be checked to ensure they come from a peer who satisfies
- * the code signing requirement. Requests that do not satisfy the requirement are dropped.
+ * All messages received on this listener will be checked to ensure they come
+ * from a peer who satisfies the code signing requirement. Requests that do not
+ * satisfy the requirement are dropped.
*
* @see https://developer.apple.com/documentation/technotes/tn3127-inside-code-signing-requirements
*/
@@ -224,6 +227,32 @@ XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT
int
xpc_listener_set_peer_code_signing_requirement(xpc_listener_t listener, const char *requirement);
+/*!
+ * @function xpc_listener_set_peer_requirement
+ * Requires that the listener peer satisfies a requirement.
+ *
+ * @param listener
+ * The listener object which is to be modified. Must be inactive.
+ *
+ * @param requirement
+ * The requirement to be satisfied by the peer. It will be retained by XPC.
+ *
+ * @discussion
+ * It is a programming error to call `xpc_listener_set_peer_*requirement` more
+ * than once per listener.
+ *
+ * All messages received on this listener will be checked to ensure they come
+ * from a peer who satisfies the code signing requirement. Requests that do not
+ * satisfy the requirement are dropped.
+ *
+ * Peer sessions created from the listener do not inherit the requirement.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_NONNULL_ALL
+void
+xpc_listener_set_peer_requirement(xpc_listener_t listener, xpc_peer_requirement_t requirement);
+
__END_DECLS
XPC_ASSUME_NONNULL_END
diff --git a/lib/libc/include/any-macos-any/xpc/peer_requirement.h b/lib/libc/include/any-macos-any/xpc/peer_requirement.h
new file mode 100644
index 0000000000..36d4bb1519
--- /dev/null
+++ b/lib/libc/include/any-macos-any/xpc/peer_requirement.h
@@ -0,0 +1,242 @@
+#ifndef __XPC_PEER_REQ_H__
+#define __XPC_PEER_REQ_H__
+
+#ifndef __XPC_INDIRECT__
+#error "Please #include <xpc/xpc.h> instead of this file directly."
+// For HeaderDoc.
+#include <xpc/base.h>
+#endif // __XPC_INDIRECT__
+
+XPC_ASSUME_NONNULL_BEGIN
+__BEGIN_DECLS
+
+XPC_SWIFT_NOEXPORT
+/*!
+ * @typedef xpc_peer_requirement_t
+ *
+ * @abstract
+ * XPC peer requirement is an abstract type that represents a validated
+ * requirement on peers.
+ *
+ * @discussion
+ * Users can specify a requirement via `xpc_peer_requirement_create_*` API.
+ * These constructors will return a non-null xpc_peer_requirement_t if the
+ * requirement is valid. Users can set a xpc_peer_requirement_t on connections,
+ * sessions or listeners using one of `xpc_*_set_peer_requirement` API.
+ *
+ * xpc_peer_requirement_t is reference counted and concurrency-safe. One
+ * xpc_peer_requirement_t can be shared among multiple connections, sessions
+ * or listeners.
+ */
+OS_OBJECT_DECL_CLASS(xpc_peer_requirement);
+
+#pragma mark Constructors
+
+/*!
+ * @function xpc_peer_requirement_create_entitlement_exists
+ * Create a requirement that the peer has the specified entitlement
+ *
+ * @param entitlement
+ * The entitlement the peer must have. It is safe to deallocate the entitlement
+ * string after calling this function.
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On success this returns a new peer requirement object. On failure this will
+ * return NULL and if set, error_out will be set to an error describing the
+ * failure.
+ *
+ * @discussion
+ * This function will return NULL promptly if the entitlement requirement is
+ * invalid.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_RETURNS_RETAINED
+xpc_peer_requirement_t _Nullable
+xpc_peer_requirement_create_entitlement_exists(const char *entitlement,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+/*!
+ * @function xpc_peer_requirement_create_entitlement_matches_value
+ * Create a requirement that the peer has the entitlement with matching value
+ *
+ * @param entitlement
+ * The entitlement the peer must have. It is safe to deallocate the entitlement
+ * string after calling this function.
+ *
+ * @param value
+ * The value that the entitlement must match. It is safe to deallocate the value
+ * object after calling this function. Valid xpc types for this object are
+ * `XPC_TYPE_BOOL`, `XPC_TYPE_STRING` and `XPC_TYPE_INT64`.
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On success this returns a new peer requirement object. On failure this will
+ * return NULL and if set, error_out will be set to an error describing the
+ * failure.
+ *
+ * @discussion
+ * This function will return NULL promptly if the entitlement requirement is
+ * invalid.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_RETURNS_RETAINED
+xpc_peer_requirement_t _Nullable
+xpc_peer_requirement_create_entitlement_matches_value(const char *entitlement,
+ xpc_object_t value,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+/*!
+ * @function xpc_peer_requirement_create_team_identity
+ * Create a requirement that the peer has the specified identity and is signed
+ * with the same team identifier as the current process
+ *
+ * @param signing_identifier
+ * The optional signing identifier the peer must have. It is safe to deallocate
+ * the signing identifier string after calling this function.
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On success this returns a new peer requirement object. On failure this will
+ * return NULL and if set, error_out will be set to an error describing the
+ * failure.
+ *
+ * @discussion
+ * This function will return NULL promptly if the identity requirement is
+ * invalid.
+ *
+ * The peer process must be signed as either a Testflight app or an App store
+ * app, or be signed by an apple issued development certificate, an enterprise
+ * distributed certificate (embedded only), or a Developer ID certificate (macOS
+ * only)
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_RETURNS_RETAINED
+xpc_peer_requirement_t _Nullable
+xpc_peer_requirement_create_team_identity(
+ const char * _Nullable signing_identifier,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+/*!
+ * @function xpc_peer_requirement_create_platform_identity
+ * Create a requirement that the peer has the specified identity and is from
+ * platform binary.
+ *
+ * @param signing_identifier
+ * The optional signing identifier the peer must have. If not specified, this
+ * function ensures that the peer process' executable is a platform binary. It
+ * is safe to deallocate the signing identifier string after calling this
+ * function.
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On success this returns a new peer requirement object. On failure this will
+ * return NULL and if set, error_out will be set to an error describing the
+ * failure.
+ *
+ * @discussion
+ * This function will return NULL promptly if the identity requirement is
+ * invalid.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_RETURNS_RETAINED
+xpc_peer_requirement_t _Nullable
+xpc_peer_requirement_create_platform_identity(
+ const char * _Nullable signing_identifier,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+/*!
+ * @function xpc_peer_requirement_create_lwcr
+ * Create a requirement that the peer has the specified lightweight code requirement
+ *
+ * @param lwcr
+ * The lightweight code requirement the peer must have. It is safe to deallocate
+ * the lightweight code requirement object after calling this function.
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On success this returns a new peer requirement object. On failure this will
+ * return NULL and if set, error_out will be set to an error describing the
+ * failure.
+ *
+ * @discussion
+ * This function will return NULL promptly if the lightweight code requirement
+ * is invalid.
+ *
+ * The lightweight code requirement must be an `xpc_dictionary_t` equivalent of
+ * an LWCR constraint (see
+ * https://developer.apple.com/documentation/security/defining_launch_environment_and_library_constraints
+ * for details on the contents of the dictionary)
+ *
+ * The lightweight code requirement in the example below uses the $or operator
+ * to require that an executable’s either signed with the Team ID 8XCUU22SN2, or
+ * is an operating system executable:
+ * ```c
+ * xpc_object_t or_val = xpc_dictionary_create_empty();
+ * xpc_dictionary_set_string(or_val, "team-identifier", "8XCUU22SN2");
+ * xpc_dictionary_set_int64(or_val, "validation-category", 1);
+ *
+ * xpc_object_t lwcr = xpc_dictionary_create_empty();
+ * xpc_dictionary_set_value(lwcr, "$or", or_val);
+ *
+ * xpc_peer_requirement_t req = xpc_peer_requirement_create_lwcr(lwcr, NULL);
+ * ```
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_RETURNS_RETAINED
+xpc_peer_requirement_t _Nullable
+xpc_peer_requirement_create_lwcr(xpc_object_t lwcr,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+#pragma mark Matching Peer Requirement on Received Messages
+
+/*!
+ * @function xpc_peer_requirement_match_received_message
+ * Check the specified requirement against a received message from the peer.
+ *
+ * @param peer_requirement
+ * The requirement the peer must have
+ *
+ * @param message
+ * The received dictionary to be checked
+ *
+ * @param error_out
+ * An out-parameter that, if set and in the event of an error, will point to an
+ * {@link xpc_rich_error_t} describing the details of any errors that occurred.
+ *
+ * @result
+ * On match this returns true. On mismatch or failure this will return false and
+ * if set, error_out will be set to an error describing the failure.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT
+bool
+xpc_peer_requirement_match_received_message(xpc_peer_requirement_t peer_requirement,
+ xpc_object_t message,
+ xpc_rich_error_t _Nullable XPC_GIVES_REFERENCE * _Nullable error_out);
+
+__END_DECLS
+XPC_ASSUME_NONNULL_END
+
+#endif
diff --git a/lib/libc/include/any-macos-any/xpc/session.h b/lib/libc/include/any-macos-any/xpc/session.h
index 0bb268a9ca..fe5293db7f 100644
--- a/lib/libc/include/any-macos-any/xpc/session.h
+++ b/lib/libc/include/any-macos-any/xpc/session.h
@@ -25,8 +25,11 @@ __BEGIN_DECLS
* Clients can initiate a session with a service that accepts xpc_connection_t connections but session
* semantics will be maintained.
*
+ * Sessions can be created in an active or inactive state. They must be
+ * activated and subsequently cancelled before they can be released.
+ *
*/
-OS_OBJECT_DECL_CLASS(xpc_session);
+OS_OBJECT_DECL_SENDABLE_CLASS(xpc_session);
#pragma mark Constants
/*!
@@ -244,8 +247,8 @@ xpc_session_set_target_queue(xpc_session_t session,
*
* @discussion
* xpc_session_activate must not be called on a session that has been already
- * activated. Releasing the last reference on an inactive session that was
- * created with an xpc_session_create*() will trigger an API misuse crash.
+ * activated. Releasing the last reference on an inactive session or an
+ * active session that has not been cancelled will trigger an API misuse crash.
*
* If activation fails, the session is automatically cancelled.
*/
@@ -266,8 +269,9 @@ xpc_session_activate(xpc_session_t session,
* The session object to cancel.
*
* @discussion
- * Session must have been activated to be canceled. Cancellation is asynchronous
- * and non-preemptive.
+ * Session must have been activated to be cancelled and must be cancelled
+ * before the last reference can be released. Cancellation is asynchronous and
+ * non-preemptive.
*/
API_AVAILABLE(macos(13.0), ios(16.0), tvos(16.0), watchos(9.0))
XPC_EXPORT XPC_SWIFT_NOEXPORT
@@ -388,20 +392,26 @@ xpc_session_send_message_with_reply_async(xpc_session_t session,
* The session object which is to be modified.
*
* @param requirement
- * The code signing requirement to be satisfied by the peer
- * It is safe to deallocate the requirement string after calling `xpc_session_set_peer_code_signing_requirement`
+ * The code signing requirement to be satisfied by the peer. It is safe to
+ * deallocate the requirement string after calling this function.
*
* @result
* 0 on success, non-zero on error
*
* @discussion
- * This function will return an error promptly if the code signing requirement string is invalid.
+ * This function will return an error promptly if the code signing requirement
+ * string is invalid.
*
- * It is a programming error to call `xpc_session_set_peer_code_signing_requirement` more than once per session.
+ * It is a programming error to call `xpc_session_set_peer_*requirement` more
+ * than once per session.
*
- * All messages received on this session will be checked to ensure they come from a peer who satisfies
- * the code signing requirement. When message or a reply is received on the session and the peer does
- * not satisfy the requirement the session will be cancelled.
+ * All messages received on this session will be checked to ensure they come
+ * from a peer who satisfies the code signing requirement. When message or a
+ * reply is received on the session and the peer does not satisfy the
+ * requirement the session will be cancelled. A rich error describing the peer
+ * code signing error will be passed to the cancellation handler. For
+ * `xpc_session_send_message_with_reply_*` NULL will be returned instead of
+ * reply, with `error_out` pointing to that rich error.
*
* @see https://developer.apple.com/documentation/technotes/tn3127-inside-code-signing-requirements
*/
@@ -411,6 +421,34 @@ XPC_EXPORT XPC_NONNULL_ALL XPC_WARN_RESULT
int
xpc_session_set_peer_code_signing_requirement(xpc_session_t session, const char *requirement);
+/*!
+ * @function xpc_session_set_peer_requirement
+ * Requires that the session peer satisfies a requirement.
+ *
+ * @param session
+ * The session object which is to be modified. Must be inactive.
+ *
+ * @param requirement
+ * The requirement to be satisfied by the peer. It will be retained by XPC.
+ *
+ * @discussion
+ * It is a programming error to call `xpc_session_set_peer_*requirement` more
+ * than once per session.
+ *
+ * All messages received on this session will be checked to ensure they come
+ * from a peer who satisfies the requirement. When a reply is expected on the
+ * session and the peer does not satisfy the requirement, the session will be
+ * canceled with cancellation handler called with a rich error describing the
+ * peer code signing error. For `xpc_session_send_message_with_reply_sync` NULL
+ * will be returned instead of reply, with `error_out` (if set) pointing to the
+ * rich error describing the peer code signing error.
+ */
+API_AVAILABLE(macos(26.0), ios(26.0))
+API_UNAVAILABLE(tvos, watchos)
+XPC_EXPORT XPC_SWIFT_NOEXPORT XPC_NONNULL_ALL
+void
+xpc_session_set_peer_requirement(xpc_session_t session, xpc_peer_requirement_t requirement);
+
/* This is included for compatibility and should not be used in new code */
#define XPC_TYPE_SESSION (&_xpc_type_session)
XPC_EXPORT
diff --git a/lib/libc/include/any-macos-any/xpc/xpc.h b/lib/libc/include/any-macos-any/xpc/xpc.h
index 83742c6f01..771e555347 100644
--- a/lib/libc/include/any-macos-any/xpc/xpc.h
+++ b/lib/libc/include/any-macos-any/xpc/xpc.h
@@ -344,6 +344,7 @@ XPC_ASSUME_NONNULL_END
#include <xpc/debug.h>
#if __BLOCKS__
#include <xpc/activity.h>
+#include <xpc/peer_requirement.h>
#include <xpc/connection.h>
#include <xpc/rich_error.h>
#include <xpc/session.h>
@@ -2771,7 +2772,7 @@ API_UNAVAILABLE(ios)
XPC_EXPORT XPC_NONNULL1 XPC_NONNULL3
void
xpc_set_event_stream_handler(const char *stream,
- dispatch_queue_t _Nullable targetq, xpc_handler_t handler);
+ dispatch_queue_t _Nullable targetq, XPC_SWIFT_SENDABLE xpc_handler_t handler);
#endif // __BLOCKS__
__END_DECLS