/ duct-tape / src / init.c
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  };