+ return (kern_feature_overrides & fmask) == fmask;
+}
+
+boolean_t
+on_device_corefile_enabled(void)
+{
+ assert(startup_phase >= STARTUP_SUB_TUNABLES);
+#if CONFIG_KDP_INTERACTIVE_DEBUGGING
+ if (debug_boot_arg == 0) {
+ return FALSE;
+ }
+ if (debug_boot_arg & DB_DISABLE_LOCAL_CORE) {
+ return FALSE;
+ }
+#if !XNU_TARGET_OS_OSX
+ /*
+ * outside of macOS, if there's a debug boot-arg set and local
+ * cores aren't explicitly disabled, we always write a corefile.
+ */
+ return TRUE;
+#else /* !XNU_TARGET_OS_OSX */
+ /*
+ * on macOS, if corefiles on panic are requested and local cores
+ * aren't disabled we write a local core.
+ */
+ if (debug_boot_arg & (DB_KERN_DUMP_ON_NMI | DB_KERN_DUMP_ON_PANIC)) {
+ return TRUE;
+ }
+#endif /* !XNU_TARGET_OS_OSX */
+#endif /* CONFIG_KDP_INTERACTIVE_DEBUGGING */
+ return FALSE;
+}
+
+boolean_t
+panic_stackshot_to_disk_enabled(void)
+{
+ assert(startup_phase >= STARTUP_SUB_TUNABLES);
+#if defined(__x86_64__)
+ if (PEGetCoprocessorVersion() < kCoprocessorVersion2) {
+ /* Only enabled on pre-Gibraltar machines where it hasn't been disabled explicitly */
+ if ((debug_boot_arg != 0) && (debug_boot_arg & DB_DISABLE_STACKSHOT_TO_DISK)) {
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+#endif
+ return FALSE;
+}
+
+#if DEBUG || DEVELOPMENT
+const char *
+sysctl_debug_get_preoslog(size_t *size)
+{
+ int result = 0;
+ void *preoslog_pa = NULL;
+ int preoslog_size = 0;
+
+ result = IODTGetLoaderInfo("preoslog", &preoslog_pa, &preoslog_size);
+ if (result || preoslog_pa == NULL || preoslog_size == 0) {
+ kprintf("Couldn't obtain preoslog region: result = %d, preoslog_pa = %p, preoslog_size = %d\n", result, preoslog_pa, preoslog_size);
+ *size = 0;
+ return NULL;
+ }
+
+ /*
+ * Beware:
+ * On release builds, we would need to call IODTFreeLoaderInfo("preoslog", preoslog_pa, preoslog_size) to free the preoslog buffer.
+ * On Development & Debug builds, we retain the buffer so it can be extracted from coredumps.
+ */
+ *size = preoslog_size;
+ return (char *)(ml_static_ptovirt((vm_offset_t)(preoslog_pa)));