init.c
1 #include <darlingserver/duct-tape.h> 2 #include <darlingserver/duct-tape/log.h> 3 #include <darlingserver/duct-tape/memory.h> 4 #include <darlingserver/duct-tape/processor.h> 5 #include <darlingserver/duct-tape/psynch.h> 6 #include <darlingserver/duct-tape/task.h> 7 8 #include <ipc/ipc_importance.h> 9 #include <ipc/ipc_init.h> 10 #include <ipc/ipc_pset.h> 11 #include <ipc/ipc_space.h> 12 #include <kern/host.h> 13 #include <kern/ipc_host.h> 14 #include <kern/sync_sema.h> 15 #include <kern/ux_handler.h> 16 17 struct task_id_token { 18 struct proc_ident ident; 19 ipc_port_t port; 20 os_refcnt_t tidt_refs; 21 }; 22 23 const dtape_hooks_t* dtape_hooks; 24 25 extern zone_t ipc_importance_inherit_zone; 26 extern lck_spin_t ipc_importance_lock_data; 27 extern zone_t ipc_importance_task_zone; 28 extern zone_t semaphore_zone; 29 extern zone_t task_id_token_zone; 30 31 void ipc_table_init(void); 32 void ipc_init(void); 33 void mig_init(void); 34 void host_notify_init(void); 35 void user_data_attr_manager_init(void); 36 void ipc_voucher_init(void); 37 38 void dtape_timer_init(void); 39 void dtape_mk_timer_init(void); 40 41 void dtape_init(const dtape_hooks_t* hooks) { 42 dtape_hooks = hooks; 43 44 dtape_log_debug("dtape_processor_init"); 45 dtape_processor_init(); 46 47 dtape_log_debug("dtape_memory_init"); 48 dtape_memory_init(); 49 50 ipc_space_zone = zone_create("ipc spaces", sizeof(struct ipc_space), ZC_NOENCRYPT); 51 ipc_kmsg_zone = zone_create("ipc kmsgs", IKM_SAVED_KMSG_SIZE, ZC_CACHING | ZC_ZFREE_CLEARMEM); 52 semaphore_zone = zone_create("semaphores", sizeof(struct semaphore), ZC_NONE); 53 54 ipc_object_zones[IOT_PORT] = zone_create("ipc ports", sizeof(struct ipc_port), ZC_NOENCRYPT | ZC_CACHING | ZC_ZFREE_CLEARMEM | ZC_NOSEQUESTER); 55 ipc_object_zones[IOT_PORT_SET] = zone_create("ipc port sets", sizeof(struct ipc_pset), ZC_NOENCRYPT | ZC_ZFREE_CLEARMEM | ZC_NOSEQUESTER); 56 57 ipc_importance_task_zone = zone_create("ipc task importance", sizeof(struct ipc_importance_task), ZC_NOENCRYPT); 58 ipc_importance_inherit_zone = zone_create("ipc importance inherit", sizeof(struct ipc_importance_inherit), ZC_NOENCRYPT); 59 60 task_id_token_zone = zone_create("task_id_token", sizeof(struct task_id_token), ZC_ZFREE_CLEARMEM); 61 62 lck_mtx_init(&realhost.lock, LCK_GRP_NULL, LCK_ATTR_NULL); 63 lck_spin_init(&ipc_importance_lock_data, LCK_GRP_NULL, LCK_ATTR_NULL); 64 65 dtape_log_debug("dtape_timer_init"); 66 dtape_timer_init(); 67 68 dtape_log_debug("dtape_mk_timer_init"); 69 dtape_mk_timer_init(); 70 71 dtape_log_debug("timer_call_init"); 72 timer_call_init(); 73 74 dtape_log_debug("ipc_table_init"); 75 ipc_table_init(); 76 77 dtape_log_debug("ipc_voucher_init"); 78 ipc_voucher_init(); 79 80 dtape_log_debug("dtape_task_init"); 81 dtape_task_init(); 82 83 dtape_log_debug("ipc_init"); 84 ipc_init(); 85 86 for (size_t i = 0; i < processor_count; ++i) { 87 if (processor_array[i] == master_processor) { 88 continue; 89 } 90 91 ipc_processor_init(processor_array[i]); 92 ipc_processor_enable(processor_array[i]); 93 } 94 95 dtape_log_debug("mig_init"); 96 mig_init(); 97 98 dtape_log_debug("host_notify_init"); 99 host_notify_init(); 100 101 dtape_log_debug("user_data_attr_manager_init"); 102 user_data_attr_manager_init(); 103 104 dtape_log_debug("waitq_bootstrap"); 105 waitq_bootstrap(); 106 107 dtape_log_debug("clock_init"); 108 clock_init(); 109 110 dtape_log_debug("turnstiles_init"); 111 turnstiles_init(); 112 113 dtape_log_debug("host_statistics_init"); 114 host_statistics_init(); 115 }; 116 117 void dtape_init_in_thread(void) { 118 dtape_log_debug("thread_call_initialize"); 119 thread_call_initialize(); 120 121 dtape_log_debug("ipc_thread_call_init"); 122 ipc_thread_call_init(); 123 124 dtape_log_debug("clock_service_create"); 125 clock_service_create(); 126 127 dtape_log_debug("thread_deallocate_daemon_init"); 128 thread_deallocate_daemon_init(); 129 130 ux_handler_setup(); 131 132 dtape_psynch_init(); 133 }; 134 135 void dtape_deinit(void) { 136 137 };