1 /*
2 * Copyright (c) 2023 Institute of Parallel And Distributed Systems (IPADS), Shanghai Jiao Tong University (SJTU)
3 * Licensed under the Mulan PSL v2.
4 * You can use this software according to the terms and conditions of the Mulan PSL v2.
5 * You may obtain a copy of Mulan PSL v2 at:
6 * http://license.coscl.org.cn/MulanPSL2
7 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8 * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9 * PURPOSE.
10 * See the Mulan PSL v2 for more details.
11 */
12
13 #include <chcore/syscall.h>
14 #include <chcore/defs.h>
15 #include <chcore/type.h>
16 #include <chcore/proc.h>
17 #include <syscall_arch.h>
18 #include <raw_syscall.h>
19 #include <errno.h>
20
21 #include <stdio.h>
22
usys_putstr(vaddr_t buffer,size_t size)23 void usys_putstr(vaddr_t buffer, size_t size)
24 {
25 chcore_syscall2(CHCORE_SYS_putstr, buffer, size);
26 }
27
usys_getc(void)28 char usys_getc(void)
29 {
30 return chcore_syscall0(CHCORE_SYS_getc);
31 }
32
usys_tee_push_rdr_update_addr(paddr_t addr,size_t size,bool is_cache_mem,const char * chip_type_buff,size_t buff_len)33 int usys_tee_push_rdr_update_addr(paddr_t addr, size_t size, bool is_cache_mem,
34 const char *chip_type_buff, size_t buff_len)
35 {
36 return chcore_syscall5(CHCORE_SYS_tee_push_rdr_update_addr,
37 addr,
38 size,
39 is_cache_mem,
40 (long)chip_type_buff,
41 buff_len);
42 }
43
usys_debug_rdr_logitem(char * str,size_t str_len)44 int usys_debug_rdr_logitem(char *str, size_t str_len)
45 {
46 return chcore_syscall2(CHCORE_SYS_debug_rdr_logitem, (long)str, str_len);
47 }
48
usys_exit(unsigned long ret)49 _Noreturn void usys_exit(unsigned long ret)
50 {
51 chcore_syscall1(CHCORE_SYS_thread_exit, ret);
52 __builtin_unreachable();
53 }
54
usys_yield(void)55 void usys_yield(void)
56 {
57 chcore_syscall0(CHCORE_SYS_yield);
58 }
59
usys_create_device_pmo(unsigned long paddr,unsigned long size)60 cap_t usys_create_device_pmo(unsigned long paddr, unsigned long size)
61 {
62 return chcore_syscall2(CHCORE_SYS_create_device_pmo, paddr, size);
63 }
64
usys_create_pmo(unsigned long size,unsigned long type)65 cap_t usys_create_pmo(unsigned long size, unsigned long type)
66 {
67 return chcore_syscall2(CHCORE_SYS_create_pmo, size, type);
68 }
69
usys_map_pmo(cap_t cap_group_cap,cap_t pmo_cap,unsigned long addr,unsigned long rights)70 int usys_map_pmo(cap_t cap_group_cap, cap_t pmo_cap, unsigned long addr,
71 unsigned long rights)
72 {
73 return chcore_syscall5(CHCORE_SYS_map_pmo,
74 cap_group_cap,
75 pmo_cap,
76 addr,
77 rights,
78 -1 /* pmo size */);
79 }
80
usys_unmap_pmo(cap_t cap_group_cap,cap_t pmo_cap,unsigned long addr)81 int usys_unmap_pmo(cap_t cap_group_cap, cap_t pmo_cap, unsigned long addr)
82 {
83 return chcore_syscall3(CHCORE_SYS_unmap_pmo, cap_group_cap, pmo_cap, addr);
84 }
85
usys_revoke_cap(cap_t obj_cap,bool revoke_copy)86 int usys_revoke_cap(cap_t obj_cap, bool revoke_copy)
87 {
88 return chcore_syscall2(CHCORE_SYS_revoke_cap, obj_cap, revoke_copy);
89 }
90
usys_set_affinity(cap_t thread_cap,s32 aff)91 int usys_set_affinity(cap_t thread_cap, s32 aff)
92 {
93 return chcore_syscall2(
94 CHCORE_SYS_set_affinity, thread_cap, (unsigned long)aff);
95 }
96
usys_get_affinity(cap_t thread_cap)97 s32 usys_get_affinity(cap_t thread_cap)
98 {
99 return chcore_syscall1(CHCORE_SYS_get_affinity, thread_cap);
100 }
101
usys_get_prio(cap_t thread_cap)102 int usys_get_prio(cap_t thread_cap)
103 {
104 return chcore_syscall1(CHCORE_SYS_get_prio, thread_cap);
105 }
106
usys_set_prio(cap_t thread_cap,int prio)107 int usys_set_prio(cap_t thread_cap, int prio)
108 {
109 return chcore_syscall2(CHCORE_SYS_set_prio, thread_cap, prio);
110 }
111
usys_get_phys_addr(void * vaddr,unsigned long * paddr)112 int usys_get_phys_addr(void *vaddr, unsigned long *paddr)
113 {
114 return chcore_syscall2(
115 CHCORE_SYS_get_phys_addr, (unsigned long)vaddr, (unsigned long)paddr);
116 }
117
usys_create_thread(unsigned long thread_args_p)118 cap_t usys_create_thread(unsigned long thread_args_p)
119 {
120 return chcore_syscall1(CHCORE_SYS_create_thread, thread_args_p);
121 }
122
usys_create_cap_group(unsigned long cap_group_args_p)123 cap_t usys_create_cap_group(unsigned long cap_group_args_p)
124 {
125 return chcore_syscall1(CHCORE_SYS_create_cap_group, cap_group_args_p);
126 }
127
usys_kill_group(int proc_cap)128 int usys_kill_group(int proc_cap)
129 {
130 chcore_syscall1(CHCORE_SYS_kill_group, proc_cap);
131 }
132
usys_register_server(unsigned long callback,cap_t register_thread_cap,unsigned long destructor)133 int usys_register_server(unsigned long callback, cap_t register_thread_cap,
134 unsigned long destructor)
135 {
136 return chcore_syscall3(
137 CHCORE_SYS_register_server, callback, register_thread_cap, destructor);
138 }
139
usys_register_client(cap_t server_cap,unsigned long vm_config_ptr)140 cap_t usys_register_client(cap_t server_cap, unsigned long vm_config_ptr)
141 {
142 return chcore_syscall2(
143 CHCORE_SYS_register_client, server_cap, vm_config_ptr);
144 }
145
usys_ipc_call(cap_t conn_cap,unsigned long ipc_msg_ptr,unsigned int cap_num)146 int usys_ipc_call(cap_t conn_cap, unsigned long ipc_msg_ptr,
147 unsigned int cap_num)
148 {
149 return chcore_syscall3(CHCORE_SYS_ipc_call, conn_cap, ipc_msg_ptr, cap_num);
150 }
151
usys_ipc_return(unsigned long ret,unsigned long cap_num)152 _Noreturn void usys_ipc_return(unsigned long ret, unsigned long cap_num)
153 {
154 chcore_syscall2(CHCORE_SYS_ipc_return, ret, cap_num);
155 __builtin_unreachable();
156 }
157
usys_ipc_register_cb_return(cap_t server_thread_cap,unsigned long server_thread_exit_routine,unsigned long server_shm_addr)158 void usys_ipc_register_cb_return(cap_t server_thread_cap,
159 unsigned long server_thread_exit_routine,
160 unsigned long server_shm_addr)
161 {
162 chcore_syscall3(CHCORE_SYS_ipc_register_cb_return,
163 server_thread_cap,
164 server_thread_exit_routine,
165 server_shm_addr);
166 }
167
usys_ipc_exit_routine_return(void)168 _Noreturn void usys_ipc_exit_routine_return(void)
169 {
170 chcore_syscall0(CHCORE_SYS_ipc_exit_routine_return);
171 __builtin_unreachable();
172 }
173
usys_debug_log(long arg)174 void usys_debug_log(long arg)
175 {
176 chcore_syscall1(CHCORE_SYS_debug_log, arg);
177 }
178
usys_write_pmo(cap_t cap,unsigned long offset,void * buf,unsigned long size)179 int usys_write_pmo(cap_t cap, unsigned long offset, void *buf,
180 unsigned long size)
181 {
182 return chcore_syscall4(
183 CHCORE_SYS_write_pmo, cap, offset, (unsigned long)buf, size);
184 }
185
usys_read_pmo(cap_t cap,unsigned long offset,void * buf,unsigned long size)186 int usys_read_pmo(cap_t cap, unsigned long offset, void *buf,
187 unsigned long size)
188 {
189 return chcore_syscall4(
190 CHCORE_SYS_read_pmo, cap, offset, (unsigned long)buf, size);
191 }
192
usys_transfer_caps(cap_t cap_group,cap_t * src_caps,int nr,cap_t * dst_caps)193 int usys_transfer_caps(cap_t cap_group, cap_t *src_caps, int nr,
194 cap_t *dst_caps)
195 {
196 return chcore_syscall4(CHCORE_SYS_transfer_caps,
197 cap_group,
198 (unsigned long)src_caps,
199 (unsigned long)nr,
200 (unsigned long)dst_caps);
201 }
202
usys_perf_start(void)203 void usys_perf_start(void)
204 {
205 chcore_syscall0(CHCORE_SYS_perf_start);
206 }
207
usys_perf_end(void)208 void usys_perf_end(void)
209 {
210 chcore_syscall0(CHCORE_SYS_perf_end);
211 }
212
usys_perf_null(void)213 void usys_perf_null(void)
214 {
215 chcore_syscall0(CHCORE_SYS_perf_null);
216 }
217
usys_top(void)218 void usys_top(void)
219 {
220 chcore_syscall0(CHCORE_SYS_top);
221 }
222
usys_user_fault_register(cap_t notific_cap,vaddr_t msg_buffer)223 int usys_user_fault_register(cap_t notific_cap, vaddr_t msg_buffer)
224 {
225 return chcore_syscall2(
226 CHCORE_SYS_user_fault_register, notific_cap, msg_buffer);
227 }
228
usys_user_fault_map(badge_t client_badge,vaddr_t fault_va,vaddr_t remap_va,bool copy,vmr_prop_t perm)229 int usys_user_fault_map(badge_t client_badge, vaddr_t fault_va,
230 vaddr_t remap_va, bool copy, vmr_prop_t perm)
231 {
232 return chcore_syscall5(
233 CHCORE_SYS_user_fault_map, client_badge, fault_va, remap_va, copy, perm);
234 }
235
usys_map_pmo_with_length(cap_t pmo_cap,vaddr_t addr,unsigned long perm,size_t length)236 int usys_map_pmo_with_length(cap_t pmo_cap, vaddr_t addr, unsigned long perm,
237 size_t length)
238 {
239 return chcore_syscall5(
240 CHCORE_SYS_map_pmo, SELF_CAP, pmo_cap, addr, perm, length);
241 }
242
usys_irq_register(int irq)243 cap_t usys_irq_register(int irq)
244 {
245 return chcore_syscall1(CHCORE_SYS_irq_register, irq);
246 }
247
usys_disable_irqno(int irq)248 int usys_disable_irqno(int irq)
249 {
250 return chcore_syscall1(CHCORE_SYS_disable_irqno, irq);
251 }
usys_enable_irqno(int irq)252 int usys_enable_irqno(int irq)
253 {
254 return chcore_syscall1(CHCORE_SYS_enable_irqno, irq);
255 }
usys_irq_op(int irq,int op,long val)256 int usys_irq_op(int irq, int op, long val)
257 {
258 return chcore_syscall3(CHCORE_SYS_irq_op, irq, op, val);
259 }
usys_irq_stop(cap_t irq_cap)260 int usys_irq_stop(cap_t irq_cap)
261 {
262 return chcore_syscall1(CHCORE_SYS_irq_stop, irq_cap);
263 }
264
usys_irq_wait(cap_t irq_cap,bool is_block)265 int usys_irq_wait(cap_t irq_cap, bool is_block)
266 {
267 return chcore_syscall2(CHCORE_SYS_irq_wait, irq_cap, is_block);
268 }
269
usys_irq_ack(cap_t irq_cap)270 int usys_irq_ack(cap_t irq_cap)
271 {
272 return chcore_syscall1(CHCORE_SYS_irq_ack, irq_cap);
273 }
274
usys_cache_config(unsigned long option)275 void usys_cache_config(unsigned long option)
276 {
277 chcore_syscall1(CHCORE_SYS_cache_config, option);
278 }
279
usys_create_notifc(void)280 cap_t usys_create_notifc(void)
281 {
282 return chcore_syscall0(CHCORE_SYS_create_notifc);
283 }
284
usys_wait(cap_t notifc_cap,bool is_block,void * timeout)285 int usys_wait(cap_t notifc_cap, bool is_block, void *timeout)
286 {
287 return chcore_syscall3(
288 CHCORE_SYS_wait, notifc_cap, is_block, (unsigned long)timeout);
289 }
290
usys_notify(cap_t notifc_cap)291 int usys_notify(cap_t notifc_cap)
292 {
293 int ret;
294
295 do {
296 ret = chcore_syscall1(CHCORE_SYS_notify, notifc_cap);
297
298 if (ret == -EAGAIN) {
299 // printf("%s retry\n", __func__);
300 usys_yield();
301 }
302 } while (ret == -EAGAIN);
303 return ret;
304 }
305
306 #ifdef CHCORE_OH_TEE
307
usys_create_ns_pmo(cap_t cap_group,unsigned long paddr,unsigned long size)308 cap_t usys_create_ns_pmo(cap_t cap_group, unsigned long paddr,
309 unsigned long size)
310 {
311 return chcore_syscall3(CHCORE_SYS_create_ns_pmo, cap_group, paddr, size);
312 }
313
usys_destroy_ns_pmo(cap_t cap_group,cap_t pmo)314 int usys_destroy_ns_pmo(cap_t cap_group, cap_t pmo)
315 {
316 return chcore_syscall2(CHCORE_SYS_destroy_ns_pmo, cap_group, pmo);
317 }
318
usys_transfer_pmo_owner(cap_t pmo,cap_t cap_group)319 int usys_transfer_pmo_owner(cap_t pmo, cap_t cap_group)
320 {
321 return chcore_syscall2(CHCORE_SYS_transfer_pmo_owner, pmo, cap_group);
322 }
323
usys_create_tee_shared_pmo(cap_t cap_group,void * uuid,unsigned long size,cap_t * self_cap)324 cap_t usys_create_tee_shared_pmo(cap_t cap_group, void *uuid,
325 unsigned long size, cap_t *self_cap)
326 {
327 return chcore_syscall4(CHCORE_SYS_create_tee_shared_pmo,
328 cap_group,
329 (unsigned long)uuid,
330 size,
331 (unsigned long)self_cap);
332 }
333
usys_get_thread_id(cap_t thread_cap)334 cap_t usys_get_thread_id(cap_t thread_cap)
335 {
336 return chcore_syscall1(CHCORE_SYS_get_thread_id, thread_cap);
337 }
338
usys_terminate_thread(cap_t thread_cap)339 int usys_terminate_thread(cap_t thread_cap)
340 {
341 return chcore_syscall1(CHCORE_SYS_terminate_thread, thread_cap);
342 }
343
usys_tee_msg_create_msg_hdl(void)344 cap_t usys_tee_msg_create_msg_hdl(void)
345 {
346 return chcore_syscall0(CHCORE_SYS_tee_msg_create_msg_hdl);
347 }
348
usys_tee_msg_create_channel(void)349 cap_t usys_tee_msg_create_channel(void)
350 {
351 return chcore_syscall0(CHCORE_SYS_tee_msg_create_channel);
352 }
353
usys_tee_msg_stop_channel(cap_t channel_cap)354 int usys_tee_msg_stop_channel(cap_t channel_cap)
355 {
356 return chcore_syscall1(CHCORE_SYS_tee_msg_stop_channel, channel_cap);
357 }
358
usys_tee_msg_receive(cap_t channel_cap,void * recv_buf,size_t recv_len,cap_t msg_hdl_cap,void * info,int timeout)359 int usys_tee_msg_receive(cap_t channel_cap, void *recv_buf, size_t recv_len,
360 cap_t msg_hdl_cap, void *info, int timeout)
361 {
362 return chcore_syscall6(CHCORE_SYS_tee_msg_receive,
363 channel_cap,
364 (unsigned long)recv_buf,
365 recv_len,
366 msg_hdl_cap,
367 (unsigned long)info,
368 timeout);
369 }
usys_tee_msg_call(cap_t channel_cap,void * send_buf,size_t send_len,void * recv_buf,size_t recv_len,void * timeout)370 int usys_tee_msg_call(cap_t channel_cap, void *send_buf, size_t send_len,
371 void *recv_buf, size_t recv_len, void *timeout)
372 {
373 return chcore_syscall6(CHCORE_SYS_tee_msg_call,
374 channel_cap,
375 (unsigned long)send_buf,
376 send_len,
377 (unsigned long)recv_buf,
378 recv_len,
379 (unsigned long)timeout);
380 }
usys_tee_msg_reply(cap_t msg_hdl_cap,void * reply_buf,size_t reply_len)381 int usys_tee_msg_reply(cap_t msg_hdl_cap, void *reply_buf, size_t reply_len)
382 {
383 return chcore_syscall3(CHCORE_SYS_tee_msg_reply,
384 msg_hdl_cap,
385 (unsigned long)reply_buf,
386 reply_len);
387 }
388
usys_tee_msg_notify(cap_t channel_cap,void * send_buf,size_t send_len)389 int usys_tee_msg_notify(cap_t channel_cap, void *send_buf, size_t send_len)
390 {
391 return chcore_syscall3(CHCORE_SYS_tee_msg_notify,
392 channel_cap,
393 (unsigned long)send_buf,
394 send_len);
395 }
396
397 #endif /* CHCORE_OH_TEE */
398
399 /* Only used for recycle process */
usys_register_recycle_thread(cap_t cap,unsigned long buffer)400 int usys_register_recycle_thread(cap_t cap, unsigned long buffer)
401 {
402 return chcore_syscall2(CHCORE_SYS_register_recycle, cap, buffer);
403 }
404
usys_cap_group_recycle(cap_t cap)405 int usys_cap_group_recycle(cap_t cap)
406 {
407 return chcore_syscall1(CHCORE_SYS_cap_group_recycle, cap);
408 }
409
usys_ipc_close_connection(cap_t cap)410 int usys_ipc_close_connection(cap_t cap)
411 {
412 return chcore_syscall1(CHCORE_SYS_ipc_close_connection, cap);
413 }
414
415 /* Get the size of free memory */
usys_get_free_mem_size(void)416 unsigned long usys_get_free_mem_size(void)
417 {
418 return chcore_syscall0(CHCORE_SYS_get_free_mem_size);
419 }
420
usys_get_mem_usage_msg(void)421 void usys_get_mem_usage_msg(void)
422 {
423 chcore_syscall0(CHCORE_SYS_get_mem_usage_msg);
424 }
425
usys_cache_flush(unsigned long start,unsigned long size,int op_type)426 int usys_cache_flush(unsigned long start, unsigned long size, int op_type)
427 {
428 return chcore_syscall3(CHCORE_SYS_cache_flush, start, size, op_type);
429 }
430
usys_get_current_tick(void)431 unsigned long usys_get_current_tick(void)
432 {
433 return chcore_syscall0(CHCORE_SYS_get_current_tick);
434 }
435
usys_get_pci_device(int dev_class,unsigned long uaddr)436 void usys_get_pci_device(int dev_class, unsigned long uaddr)
437 {
438 chcore_syscall2(CHCORE_SYS_get_pci_device, dev_class, uaddr);
439 }
440
usys_tee_wait_switch_req(struct smc_registers * regs)441 int usys_tee_wait_switch_req(struct smc_registers *regs)
442 {
443 return chcore_syscall1(CHCORE_SYS_tee_wait_switch_req, (long)regs);
444 }
445
usys_tee_switch_req(struct smc_registers * regs)446 int usys_tee_switch_req(struct smc_registers *regs)
447 {
448 return chcore_syscall1(CHCORE_SYS_tee_switch_req, (long)regs);
449 }
450
usys_tee_create_ns_pmo(unsigned long paddr,unsigned long size)451 int usys_tee_create_ns_pmo(unsigned long paddr, unsigned long size)
452 {
453 return chcore_syscall2(CHCORE_SYS_tee_create_ns_pmo, paddr, size);
454 }
455
usys_tee_pull_kernel_var(unsigned long cmd_buf_addr_buf)456 int usys_tee_pull_kernel_var(unsigned long cmd_buf_addr_buf)
457 {
458 return chcore_syscall1(CHCORE_SYS_tee_pull_kernel_var, cmd_buf_addr_buf);
459 }
460
usys_disable_local_irq(void)461 void usys_disable_local_irq(void)
462 {
463 chcore_syscall0(CHCORE_SYS_disable_local_irq);
464 }
465
usys_enable_local_irq(void)466 void usys_enable_local_irq(void)
467 {
468 chcore_syscall0(CHCORE_SYS_enable_local_irq);
469 }
470
usys_poweroff(void)471 void usys_poweroff(void)
472 {
473 chcore_syscall0(CHCORE_SYS_poweroff);
474 }
475