Expose akaros_syscall_sync through libc (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.14.1-ros / sysdeps / ros / sys / syscall.h
1 /* Copyright (c) 2012 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * glibc syscall functions / tools for working with Akaros */
6
7 #ifndef _GLIBC_ROS_SYSCALL_H
8 #define _GLIBC_ROS_SYSCALL_H
9
10 #ifndef __ASSEMBLER__
11
12 #include <ros/syscall.h>
13 #include <ros/event.h>
14
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18
19 /**************** Functions to invoke syscalls ****************/
20 /* Convenience wrapper for __ros_syscall_errno.  Most code uses this (for now)*/
21 #define ros_syscall(which, a0, a1, a2, a3, a4, a5) \
22    __ros_syscall_errno(which, (long)(a0), (long)(a1), (long)(a2), (long)(a3), \
23                        (long)(a4), (long)(a5))
24
25 /* Issue a single syscall and block into the 2LS until it completes */
26 void ros_syscall_sync(struct syscall *sysc);
27
28 /* Raw syscall, user-provided errno (send in 0 if you don't want it).  This is
29  * usually used by code that can't handle errno (TLS). */
30 long __ros_syscall(unsigned int _num, long _a0, long _a1, long _a2, long _a3,
31                    long _a4, long _a5, int *errno_loc);
32
33 /* This version knows about errno and will handle it. */
34 long __ros_syscall_errno(unsigned int _num, long _a0, long _a1, long _a2,
35                          long _a3, long _a4, long _a5);
36
37 /* Bypass PLT when invoked from within libc */
38 #ifdef libc_hidden_proto
39 libc_hidden_proto(ros_syscall_sync)
40 libc_hidden_proto(__ros_syscall)
41 libc_hidden_proto(__ros_syscall_errno)
42 #endif
43
44 /**************** Additional syscall support ****************/
45 /* Simple ev_q that routes notifs to vcore0's public mbox.  This is used by the
46  * default scp_syscall, but can also be used for signals or other basic
47  * event/signal needs. */
48 extern struct event_queue __ros_scp_simple_evq;
49
50 /* Attempts to block on sysc, returning when it is done or progress has been
51  * made.  (function is in uthread.c) */
52 extern void (*ros_syscall_blockon)(struct syscall *sysc);
53
54 /* Glibc initial blockon, usable before parlib code can init things (or if it
55  * never can, like for RTLD).  MCPs will need the 'uthread-aware' blockon. */
56 void __ros_scp_syscall_blockon(struct syscall *sysc);
57
58 #ifdef __cplusplus
59 }
60 #endif
61
62 #endif
63
64 #endif /* _GLIBC_ROS_SYSCALL_H */