| 1 | /*****************************
 | 
|---|
| 2 |  * Kernel syscall interfaces *
 | 
|---|
| 3 |  *****************************/
 | 
|---|
| 4 | 
 | 
|---|
| 5 | interface sys_klog {
 | 
|---|
| 6 |                 /* Print using kernel facility */
 | 
|---|
| 7 |                 sysarg_t sys_klog(int fd, const void *buf, size_t size);
 | 
|---|
| 8 |         protocol:
 | 
|---|
| 9 |                 ?sys_klog*
 | 
|---|
| 10 | };
 | 
|---|
| 11 | 
 | 
|---|
| 12 | interface sys_console {
 | 
|---|
| 13 |                 /* Enable kernel console */
 | 
|---|
| 14 |                 sysarg_t sys_debug_enable_console(void);
 | 
|---|
| 15 |                 
 | 
|---|
| 16 |                 /* Disable kernel console */
 | 
|---|
| 17 |                 sysarg_t sys_debug_disable_console(void);
 | 
|---|
| 18 |         protocol:
 | 
|---|
| 19 |                 (
 | 
|---|
| 20 |                         ?sys_debug_enable_console +
 | 
|---|
| 21 |                         ?sys_debug_disable_console
 | 
|---|
| 22 |                 )*
 | 
|---|
| 23 | };
 | 
|---|
| 24 | 
 | 
|---|
| 25 | interface sys_tls {
 | 
|---|
| 26 |                 /* Set thread-local storage pointer (on architectures where kernel mode is required) */
 | 
|---|
| 27 |                 sysarg_t sys_tls_set(sysarg_t addr);
 | 
|---|
| 28 |         protocol:
 | 
|---|
| 29 |                 ?sys_tls_set*
 | 
|---|
| 30 | };
 | 
|---|
| 31 | 
 | 
|---|
| 32 | interface sys_thread {
 | 
|---|
| 33 |                 /* Create new thread */
 | 
|---|
| 34 |                 sysarg_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, size_t name_len, thread_id_t *uspace_thread_id);
 | 
|---|
| 35 |                 
 | 
|---|
| 36 |                 /* Terminate current thread */
 | 
|---|
| 37 |                 sysarg_t sys_thread_exit(int uspace_status);
 | 
|---|
| 38 |                 
 | 
|---|
| 39 |                 /* Get current thread id */
 | 
|---|
| 40 |                 sysarg_t sys_thread_get_id(thread_id_t *uspace_thread_id);
 | 
|---|
| 41 |         protocol:
 | 
|---|
| 42 |                 (
 | 
|---|
| 43 |                         ?sys_thread_create +
 | 
|---|
| 44 |                         ?sys_thread_get_id +
 | 
|---|
| 45 |                         ?sys_thread_exit
 | 
|---|
| 46 |                 )*
 | 
|---|
| 47 | };
 | 
|---|
| 48 | 
 | 
|---|
| 49 | interface sys_task {
 | 
|---|
| 50 |                 /* Set name fo the current task */
 | 
|---|
| 51 |                 sysarg_t sys_task_set_name(const char *uspace_name, size_t name_len);
 | 
|---|
| 52 |                 
 | 
|---|
| 53 |                 /* Get current task id */
 | 
|---|
| 54 |                 sysarg_t sys_task_get_id(task_id_t *uspace_task_id);
 | 
|---|
| 55 |         protocol:
 | 
|---|
| 56 |                 (
 | 
|---|
| 57 |                         ?sys_task_set_name +
 | 
|---|
| 58 |                         ?sys_task_get_id
 | 
|---|
| 59 |                 )*
 | 
|---|
| 60 | };
 | 
|---|
| 61 | 
 | 
|---|
| 62 | interface sys_program {
 | 
|---|
| 63 |                 /* Spawn a new instance of clonable loader service */
 | 
|---|
| 64 |                 sysarg_t sys_program_spawn_loader(char *uspace_name, size_t name_len);
 | 
|---|
| 65 |         protocol:
 | 
|---|
| 66 |                 ?sys_program_spawn_loader*
 | 
|---|
| 67 | };
 | 
|---|
| 68 | 
 | 
|---|
| 69 | interface sys_futex {
 | 
|---|
| 70 |                 /* Sleep in a futex wait queue */
 | 
|---|
| 71 |                 sysarg_t sys_futex_sleep_timeout(uintptr_t uaddr, uint32_t usec, int flags);
 | 
|---|
| 72 |                 
 | 
|---|
| 73 |                 /* Wakeup one thread waiting in futex wait queue */
 | 
|---|
| 74 |                 sysarg_t sys_futex_wakeup(uintptr_t uaddr);
 | 
|---|
| 75 |         protocol:
 | 
|---|
| 76 |                 (
 | 
|---|
| 77 |                         ?sys_futex_sleep_timeout +
 | 
|---|
| 78 |                         ?sys_futex_wakeup
 | 
|---|
| 79 |                 )*
 | 
|---|
| 80 | };
 | 
|---|
| 81 | 
 | 
|---|
| 82 | interface sys_smc {
 | 
|---|
| 83 |                 /* Enforce self-modifying code cache coherency */
 | 
|---|
| 84 |                 sysarg_t sys_smc_coherence(uintptr_t va, size_t size);
 | 
|---|
| 85 |         protocol:
 | 
|---|
| 86 |                 ?sys_smc_coherence*
 | 
|---|
| 87 | };
 | 
|---|
| 88 | 
 | 
|---|
| 89 | interface sys_as {
 | 
|---|
| 90 |                 /* Create new address space area */
 | 
|---|
| 91 |                 sysarg_t sys_as_area_create(uintptr_t address, size_t size, int flags);
 | 
|---|
| 92 |                 
 | 
|---|
| 93 |                 /* Resize an address space area */
 | 
|---|
| 94 |                 sysarg_t sys_as_area_resize(uinptr_t address, size_t size, int flags);
 | 
|---|
| 95 |                 
 | 
|---|
| 96 |                 /* Change flags of an address space area */
 | 
|---|
| 97 |                 sysarg_t sys_as_area_change_flags(uintptr_t address, int flags);
 | 
|---|
| 98 |                 
 | 
|---|
| 99 |                 /* Destroy an address space area */
 | 
|---|
| 100 |                 sysarg_t sys_as_area_destroy(uintptr_t address);
 | 
|---|
| 101 |         protocol:
 | 
|---|
| 102 |                 (
 | 
|---|
| 103 |                         ?sys_as_area_create +
 | 
|---|
| 104 |                         ?sys_as_area_resize +
 | 
|---|
| 105 |                         ?sys_as_area_change_flags +
 | 
|---|
| 106 |                         ?sys_as_area_destroy
 | 
|---|
| 107 |                 )*
 | 
|---|
| 108 | };
 | 
|---|
| 109 | 
 | 
|---|
| 110 | interface sys_ipc {
 | 
|---|
| 111 |                 /* Fast synchronous IPC call */
 | 
|---|
| 112 |                 sysarg_t sys_ipc_call_sync_fast(sysarg_t phoneid, sysarg_t method, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, ipc_data_t *data);
 | 
|---|
| 113 |                 
 | 
|---|
| 114 |                 /* Slow synchronous IPC call */
 | 
|---|
| 115 |                 sysarg_t sys_ipc_call_sync_slow(sysarg_t phoneid, ipc_data_t *question, ipc_data_t *answer);
 | 
|---|
| 116 |                 
 | 
|---|
| 117 |                 /* Fast asynchronous IPC call */
 | 
|---|
| 118 |                 sysarg_t sys_ipc_call_async_fast(sysarg_t phoneid, sysarg_t method, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4);
 | 
|---|
| 119 |                 
 | 
|---|
| 120 |                 /* Slow asynchronous IPC call */
 | 
|---|
| 121 |                 sysarg_t sys_ipc_call_async_slow(sysarg_t phoneid, ipc_data_t *data);
 | 
|---|
| 122 |                 
 | 
|---|
| 123 |                 /* Fast forward a received IPC call to another destination */
 | 
|---|
| 124 |                 sysarg_t sys_ipc_forward_fast(sysarg_t callid, sysarg_t phoneid, sysarg_t method, sysarg_t arg1, sysarg_t arg2, int mode);
 | 
|---|
| 125 |                 
 | 
|---|
| 126 |                 /* Slow forward a received IPC call to another destination */
 | 
|---|
| 127 |                 sysarg_t sys_ipc_forward_slow(sysarg_t callid, sysarg_t phoneid, ipc_data_t *data, int mode);
 | 
|---|
| 128 |                 
 | 
|---|
| 129 |                 /* Fast answer an IPC call */
 | 
|---|
| 130 |                 sysarg_t sys_ipc_answer_fast(sysarg_t callid, sysarg_t retval, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4);
 | 
|---|
| 131 |                 
 | 
|---|
| 132 |                 /* Slow answer an IPC call */
 | 
|---|
| 133 |                 sysarg_t sys_ipc_answer_slow(sysarg_t callid, ipc_data_t *data);
 | 
|---|
| 134 |                 
 | 
|---|
| 135 |                 /* Hang up a phone */
 | 
|---|
| 136 |                 sysarg_t sys_ipc_hangup(int phoneid);
 | 
|---|
| 137 |                 
 | 
|---|
| 138 |                 /* Wait for an incoming IPC call or answer */
 | 
|---|
| 139 |                 sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, int flags);
 | 
|---|
| 140 |                 
 | 
|---|
| 141 |                 /* Interrupt one thread of the current task from waiting on IPC call */
 | 
|---|
| 142 |                 sysarg_t sys_ipc_poke(void);
 | 
|---|
| 143 |         protocol:
 | 
|---|
| 144 |                 (
 | 
|---|
| 145 |                         ?sys_ipc_call_sync_fast +
 | 
|---|
| 146 |                         ?sys_ipc_call_sync_slow +
 | 
|---|
| 147 |                         ?sys_ipc_call_async_fast +
 | 
|---|
| 148 |                         ?sys_ipc_call_async_slow +
 | 
|---|
| 149 |                         ?sys_ipc_forward_fast +
 | 
|---|
| 150 |                         ?sys_ipc_forward_slow +
 | 
|---|
| 151 |                         ?sys_ipc_answer_fast +
 | 
|---|
| 152 |                         ?sys_ipc_answer_slow +
 | 
|---|
| 153 |                         ?sys_ipc_hangup +
 | 
|---|
| 154 |                         ?sys_ipc_wait_for_call +
 | 
|---|
| 155 |                         ?sys_ipc_poke
 | 
|---|
| 156 |                 )*
 | 
|---|
| 157 | };
 | 
|---|
| 158 | 
 | 
|---|
| 159 | interface sys_event {
 | 
|---|
| 160 |                 /* Subscribe to kernel event notifications */
 | 
|---|
| 161 |                 sysarg_t sys_event_subscribe(sysarg_t evno, sysarg_t method);
 | 
|---|
| 162 |         protocol:
 | 
|---|
| 163 |                 ?sys_event_subscribe*
 | 
|---|
| 164 | };
 | 
|---|
| 165 | 
 | 
|---|
| 166 | interface sys_cap {
 | 
|---|
| 167 |                 /* Grant capabilities to a task */
 | 
|---|
| 168 | #ifdef __32_BITS__
 | 
|---|
| 169 |                 sysarg_t sys_cap_grant(sysarg64_t *uspace_taskid, cap_t caps);
 | 
|---|
| 170 | #endif
 | 
|---|
| 171 |                 
 | 
|---|
| 172 | #ifdef __64_BITS__
 | 
|---|
| 173 |                 sysarg_t sys_cap_grant(sysarg_t taskid, cap_t caps);
 | 
|---|
| 174 | #endif
 | 
|---|
| 175 |                 
 | 
|---|
| 176 |                 /* Revoke capabilities from a task */
 | 
|---|
| 177 | #ifdef __32_BITS__
 | 
|---|
| 178 |                 sysarg_t sys_cap_revoke(sysarg64_t *uspace_taskid, cap_t caps);
 | 
|---|
| 179 | #endif
 | 
|---|
| 180 |                 
 | 
|---|
| 181 | #ifdef __64_BITS__
 | 
|---|
| 182 |                 sysarg_t sys_cap_revoke(sysarg_t taskid, cap_t caps);
 | 
|---|
| 183 | #endif
 | 
|---|
| 184 |         protocol:
 | 
|---|
| 185 |                 (
 | 
|---|
| 186 |                         ?sys_cap_grant +
 | 
|---|
| 187 |                         ?sys_cap_rewoke
 | 
|---|
| 188 |                 )*
 | 
|---|
| 189 | };
 | 
|---|
| 190 | 
 | 
|---|
| 191 | interface sys_ddi {
 | 
|---|
| 192 |                 /* Enable access I/O address space for the current task */
 | 
|---|
| 193 |                 sysarg_t sys_enable_iospace(ddi_ioarg_t *uspace_io_arg);
 | 
|---|
| 194 |                 
 | 
|---|
| 195 |                 /* Map physical memory to the current task's address space */
 | 
|---|
| 196 |                 sysarg_t sys_physmem_map(sysarg_t phys_base, sysarg_t virt_base, sysarg_t pages, sysarg_t flags);
 | 
|---|
| 197 |                 
 | 
|---|
| 198 |                 /* Enable or disable preemption */
 | 
|---|
| 199 |                 sysarg_t sys_preempt_control(int enable);
 | 
|---|
| 200 |                 
 | 
|---|
| 201 |                 /* Assign unique device number */
 | 
|---|
| 202 |                 sysarg_t sys_device_assign_devno(void);
 | 
|---|
| 203 |                 
 | 
|---|
| 204 |                 /* Connect an IRQ handler to the current task */
 | 
|---|
| 205 |                 sysarg_t sys_ipc_register_irq(inr_t inr, devno_t devno, sysarg_t method, irq_code_t *ucode);
 | 
|---|
| 206 |                 
 | 
|---|
| 207 |                 /* Disconnect an IRQ handler from the current task */
 | 
|---|
| 208 |                 sysarg_t sys_ipc_unregister_irq(inr_t inr, devno_t devno);
 | 
|---|
| 209 |         protocol:
 | 
|---|
| 210 |                 (
 | 
|---|
| 211 |                         ?sys_enable_iospace +
 | 
|---|
| 212 |                         ?sys_physmem_map +
 | 
|---|
| 213 |                         ?sys_device_assign_devno +
 | 
|---|
| 214 |                         ?sys_preempt_control +
 | 
|---|
| 215 |                         ?sys_ipc_register_irq +
 | 
|---|
| 216 |                         ?sys_ipc_unregister_irq
 | 
|---|
| 217 |                 )*
 | 
|---|
| 218 | };
 | 
|---|
| 219 | 
 | 
|---|
| 220 | interface sys_sysinfo {
 | 
|---|
| 221 |                 /* Check for sysinfo key validity */
 | 
|---|
| 222 |                 sysarg_t sys_sysinfo_valid(sysarg_t ptr, sysarg_t len);
 | 
|---|
| 223 |                 
 | 
|---|
| 224 |                 /* Get sysinfo key value */
 | 
|---|
| 225 |                 sysarg_t sys_sysinfo_value(unatice_t ptr, sysarg_t len);
 | 
|---|
| 226 |         protocol:
 | 
|---|
| 227 |                 (
 | 
|---|
| 228 |                         ?sys_sysinfo_valid +
 | 
|---|
| 229 |                         ?sys_sysinfo_value
 | 
|---|
| 230 |                 )*
 | 
|---|
| 231 | };
 | 
|---|
| 232 | 
 | 
|---|
| 233 | interface sys_debug {
 | 
|---|
| 234 |                 /* Connect to the kernel debugging answerbox of a given task */
 | 
|---|
| 235 | #ifdef __32_BITS__
 | 
|---|
| 236 |                 sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid);
 | 
|---|
| 237 | #endif
 | 
|---|
| 238 |                 
 | 
|---|
| 239 | #ifdef __64_BITS__
 | 
|---|
| 240 |                 sysarg_t sys_ipc_connect_kbox(sysarg_t taskid);
 | 
|---|
| 241 | #endif
 | 
|---|
| 242 |         protocol:
 | 
|---|
| 243 |                 ?sys_ipc_connect_kbox*
 | 
|---|
| 244 | };
 | 
|---|
| 245 | 
 | 
|---|
| 246 | 
 | 
|---|
| 247 | /*****************************************************
 | 
|---|
| 248 |  * Primitive kernel components (exported subsystems) *
 | 
|---|
| 249 |  *****************************************************/
 | 
|---|
| 250 | 
 | 
|---|
| 251 | frame sys_console {
 | 
|---|
| 252 |         provides:
 | 
|---|
| 253 |                 sys_klog sys_klog;
 | 
|---|
| 254 |                 sys_console sys_console;
 | 
|---|
| 255 | };
 | 
|---|
| 256 | 
 | 
|---|
| 257 | frame sys_proc {
 | 
|---|
| 258 |         provides:
 | 
|---|
| 259 |                 sys_tls sys_tls;
 | 
|---|
| 260 |                 sys_thread sys_thread;
 | 
|---|
| 261 |                 sys_task sys_task;
 | 
|---|
| 262 |                 sys_program sys_program;
 | 
|---|
| 263 | };
 | 
|---|
| 264 | 
 | 
|---|
| 265 | frame sys_synch {
 | 
|---|
| 266 |         provides:
 | 
|---|
| 267 |                 sys_futex sys_futex;
 | 
|---|
| 268 |                 sys_smc sys_smc;
 | 
|---|
| 269 | };
 | 
|---|
| 270 | 
 | 
|---|
| 271 | frame sys_mm {
 | 
|---|
| 272 |         provides:
 | 
|---|
| 273 |                 sys_as sys_as;
 | 
|---|
| 274 | };
 | 
|---|
| 275 | 
 | 
|---|
| 276 | frame sys_ipc {
 | 
|---|
| 277 |         provides:
 | 
|---|
| 278 |                 sys_ipc sys_ipc;
 | 
|---|
| 279 |                 sys_event sys_event;
 | 
|---|
| 280 | };
 | 
|---|
| 281 | 
 | 
|---|
| 282 | frame sys_security {
 | 
|---|
| 283 |         provides:
 | 
|---|
| 284 |                 sys_cap sys_cap;
 | 
|---|
| 285 | };
 | 
|---|
| 286 | 
 | 
|---|
| 287 | frame sys_ddi {
 | 
|---|
| 288 |         provides:
 | 
|---|
| 289 |                 sys_ddi sys_ddi;
 | 
|---|
| 290 | };
 | 
|---|
| 291 | 
 | 
|---|
| 292 | frame sys_sysinfo {
 | 
|---|
| 293 |         provides:
 | 
|---|
| 294 |                 sys_sysinfo sys_sysinfo;
 | 
|---|
| 295 | };
 | 
|---|
| 296 | 
 | 
|---|
| 297 | frame sys_debug {
 | 
|---|
| 298 |         provides:
 | 
|---|
| 299 |                 sys_debug sys_debug;
 | 
|---|
| 300 | };
 | 
|---|
| 301 | 
 | 
|---|
| 302 | 
 | 
|---|
| 303 | /******************************
 | 
|---|
| 304 |  * Composite kernel component *
 | 
|---|
| 305 |  ******************************/
 | 
|---|
| 306 | 
 | 
|---|
| 307 | architecture kernel {
 | 
|---|
| 308 |         inst sys_console sys_console;
 | 
|---|
| 309 |         inst sys_proc sys_proc;
 | 
|---|
| 310 |         inst sys_synch sys_synch;
 | 
|---|
| 311 |         inst sys_mm sys_mm;
 | 
|---|
| 312 |         inst sys_ipc sys_ipc;
 | 
|---|
| 313 |         inst sys_security sys_security;
 | 
|---|
| 314 |         inst sys_ddi sys_ddi;
 | 
|---|
| 315 |         inst sys_sysinfo sys_sysinfo;
 | 
|---|
| 316 |         inst sys_debug sys_debug;
 | 
|---|
| 317 |         
 | 
|---|
| 318 |         delegate sys_klog to sys_console:sys_klog;
 | 
|---|
| 319 |         delegate sys_console to sys_console:sys_console;
 | 
|---|
| 320 |         delegate sys_tls to sys_proc:sys_tls;
 | 
|---|
| 321 |         delegate sys_thread to sys_proc:sys_thread;
 | 
|---|
| 322 |         delegate sys_task to sys_proc:sys_task;
 | 
|---|
| 323 |         delegate sys_program to sys_proc:sys_program;
 | 
|---|
| 324 |         delegate sys_futex to sys_synch:sys_futex;
 | 
|---|
| 325 |         delegate sys_smc to sys_synch:sys_smc;
 | 
|---|
| 326 |         delegate sys_as to sys_mm:sys_as;
 | 
|---|
| 327 |         delegate sys_ipc to sys_ipc:sys_ipc;
 | 
|---|
| 328 |         delegate sys_event to sys_ipc:sys_event;
 | 
|---|
| 329 |         delegate sys_cap to sys_security:sys_cap;
 | 
|---|
| 330 |         delegate sys_ddi to sys_ddi:sys_ddi;
 | 
|---|
| 331 |         delegate sys_sysinfo to sys_sysinfo:sys_sysinfo;
 | 
|---|
| 332 |         delegate sys_debug to sys_debug:sys_debug;
 | 
|---|
| 333 | };
 | 
|---|