/* * Now running in a thread. Kick off other services, * invoke user bootstrap, enter pageout loop. */ static void kernel_bootstrap_thread(void) { processor_t processor = current_processor(); #define kernel_bootstrap_thread_kprintf(x...) /* kprintf("kernel_bootstrap_thread: " x) */ kernel_bootstrap_thread_log("idle_thread_create"); /* * Create the idle processor thread. */ idle_thread_create(processor); /* * N.B. Do not stick anything else * before this point. * * Start up the scheduler services. */ kernel_bootstrap_thread_log("sched_startup"); sched_startup(); /* * Thread lifecycle maintenance (teardown, stack allocation) */ kernel_bootstrap_thread_log("thread_daemon_init"); thread_daemon_init(); /* Create kernel map entry reserve */ vm_kernel_reserved_entry_init(); /* * Thread callout service. */ kernel_bootstrap_thread_log("thread_call_initialize"); thread_call_initialize(); /* * Remain on current processor as * additional processors come online. */ kernel_bootstrap_thread_log("thread_bind"); thread_bind(processor); /* * Initialize ipc thread call support. */ kernel_bootstrap_thread_log("ipc_thread_call_init"); ipc_thread_call_init(); /* * Kick off memory mapping adjustments. */ kernel_bootstrap_thread_log("mapping_adjust"); mapping_adjust(); /* * Create the clock service. */ kernel_bootstrap_thread_log("clock_service_create"); clock_service_create(); /* * Create the device service. */ device_service_create(); kth_started = 1; #if (defined(__i386__) || defined(__x86_64__)) && NCOPY_WINDOWS > 0 /* * Create and initialize the physical copy window for processor 0 * This is required before starting kicking off IOKit. */ cpu_physwindow_init(0); #endif #if MACH_KDP kernel_bootstrap_log("kdp_init"); kdp_init(); #endif #if ALTERNATE_DEBUGGER alternate_debugger_init(); #endif #if KPC kpc_init(); #endif #if CONFIG_ECC_LOGGING ecc_log_init(); #endif #if KPERF kperf_bootstrap(); #endif #if HYPERVISOR hv_support_init(); #endif #if CONFIG_TELEMETRY kernel_bootstrap_log("bootprofile_init"); bootprofile_init(); #endif #if (defined(__i386__) || defined(__x86_64__)) && CONFIG_VMX vmx_init(); #endif #if (defined(__i386__) || defined(__x86_64__)) if (kdebug_serial) { new_nkdbufs = 1; if (trace_typefilter == 0) trace_typefilter = 1; } if (turn_on_log_leaks && !new_nkdbufs) new_nkdbufs = 200000; if (trace_typefilter) start_kern_tracing_with_typefilter(new_nkdbufs, FALSE, trace_typefilter); else start_kern_tracing(new_nkdbufs, FALSE); if (turn_on_log_leaks) log_leaks = 1; #endif kernel_bootstrap_log("prng_init"); prng_cpu_init(master_cpu); #ifdef IOKIT PE_init_iokit(); #endif assert(ml_get_interrupts_enabled() == FALSE); (void) spllo(); /* Allow interruptions */ #if (defined(__i386__) || defined(__x86_64__)) && NCOPY_WINDOWS > 0 /* * Create and initialize the copy window for processor 0 * This also allocates window space for all other processors. * However, this is dependent on the number of processors - so this call * must be after IOKit has been started because IOKit performs processor * discovery. */ cpu_userwindow_init(0); #endif #if (!defined(__i386__) && !defined(__x86_64__)) if (turn_on_log_leaks && !new_nkdbufs) new_nkdbufs = 200000; if (trace_typefilter) start_kern_tracing_with_typefilter(new_nkdbufs, FALSE, trace_typefilter); else start_kern_tracing(new_nkdbufs, FALSE); if (turn_on_log_leaks) log_leaks = 1; #endif /* * Initialize the shared region module. */ vm_shared_region_init(); vm_commpage_init(); vm_commpage_text_init(); #if CONFIG_MACF kernel_bootstrap_log("mac_policy_initmach"); mac_policy_initmach(); #endif #if CONFIG_SCHED_SFI kernel_bootstrap_log("sfi_init"); sfi_init(); #endif /* * Initialize the globals used for permuting kernel * addresses that may be exported to userland as tokens * using VM_KERNEL_ADDRPERM()/VM_KERNEL_ADDRPERM_EXTERNAL(). * Force the random number to be odd to avoid mapping a non-zero * word-aligned address to zero via addition. * Note: at this stage we can use the cryptographically secure PRNG * rather than early_random(). */ read_random(&vm_kernel_addrperm, sizeof(vm_kernel_addrperm)); vm_kernel_addrperm |= 1; read_random(&buf_kernel_addrperm, sizeof(buf_kernel_addrperm)); buf_kernel_addrperm |= 1; read_random(&vm_kernel_addrperm_ext, sizeof(vm_kernel_addrperm_ext)); vm_kernel_addrperm_ext |= 1; vm_set_restrictions(); /* * Start the user bootstrap. */ #ifdef MACH_BSD bsd_init(); #endif /* * Get rid of segments used to bootstrap kext loading. This removes * the KLD, PRELINK symtab, LINKEDIT, and symtab segments/load commands. */ OSKextRemoveKextBootstrap(); serial_keyboard_init(); /* Start serial keyboard if wanted */ vm_page_init_local_q(); thread_bind(PROCESSOR_NULL); /* * Become the pageout daemon. */ vm_pageout(); /*NOTREACHED*/ }
int main (int argc, char *argv[]) { /* initialize i18n */ bindtextdomain (BST_GETTEXT_DOMAIN, BST_PATH_LOCALE); bind_textdomain_codeset (BST_GETTEXT_DOMAIN, "UTF-8"); textdomain (BST_GETTEXT_DOMAIN); setlocale (LC_ALL, ""); /* initialize GLib */ g_thread_init (NULL); g_type_init (); /* initialize Sfi */ sfi_init (&argc, &argv, "TestGUI", NULL); sfi_msg_allow ("misc"); /* ensure SFI can wake us up */ sfi_thread_set_name ("TestGUI"); sfi_thread_set_wakeup ((BirnetThreadWakeup) g_main_context_wakeup, g_main_context_default (), NULL); /* initialize Gtk+ and enter threading mode */ gtk_init (&argc, &argv); g_set_prgname ("testgui"); /* override Gdk's program name */ g_set_application_name ("TestGUI"); /* User visible name */ GDK_THREADS_ENTER (); /* initialize Gtk+ Extension Kit */ gxk_init (); /* add documentation search paths */ gxk_text_add_tsm_path (BST_PATH_DOCS); gxk_text_add_tsm_path (BST_PATH_IMAGES); gxk_text_add_tsm_path ("."); /* initialize BEAST GUI components */ _bst_init_utils (); _bst_init_params (); _bst_gconfig_init (); _bst_skin_config_init (); /* start BSE core and connect */ SfiRec *bseconfig = sfi_rec_new (); bse_init_async (&argc, &argv, "TestGUI", bseconfig); sfi_rec_unref (bseconfig); sfi_glue_context_push (bse_init_glue_context ("TestGUI")); GSource *source = g_source_simple (G_PRIORITY_HIGH - 100, (GSourcePending) sfi_glue_context_pending, (GSourceDispatch) sfi_glue_context_dispatch, NULL, NULL, NULL); g_source_attach (source, NULL); g_source_unref (source); GtkWidget *dialog = gxk_dialog_new (NULL, NULL, GXK_DIALOG_DELETE_BUTTON, "Test Window", NULL); g_object_connect (dialog, "signal::destroy", gtk_main_quit, NULL, NULL); g_object_set (dialog, "default_width", 25, // 560, "default_height", 25, // 640, NULL); GtkWidget *box = g_object_new (GTK_TYPE_VBOX, "visible", TRUE, NULL); gxk_dialog_set_child (GXK_DIALOG (dialog), g_object_new (GTK_TYPE_ALIGNMENT, "visible", TRUE, "border_width", 10, "child", box, NULL)); build_db_meter_test (GTK_BOX (box)); gtk_widget_show_now (dialog); g_object_set (dialog, "height-request", 25, "width-request", 25, NULL); gtk_main (); return 0; }