bug fixes for timer and timer training.
[akaros.git] / inc / syscall.h
1 #ifndef ROS_INC_SYSCALL_H
2 #define ROS_INC_SYSCALL_H
3
4 #include <inc/types.h>
5 #include <inc/ring_buffer.h>
6 #include <inc/queue.h>
7
8 /* system call numbers */
9 enum
10 {
11         SYS_null = 1,
12         SYS_cache_buster,
13         SYS_cputs,
14         SYS_cgetc,
15         SYS_getenvid,
16         SYS_env_destroy,
17 };
18 #define NSYSCALLS (SYS_env_destroy)
19 // syscall number starts at 1 and goes up to NSYSCALLS, without holes.
20 #define INVALID_SYSCALL(syscallno) ((syscallno) > NSYSCALLS)
21
22 #define NUM_SYS_ARGS 6
23 typedef struct syscall_req {
24         uint32_t num;
25         uint32_t flags;
26         uint32_t args[NUM_SYS_ARGS];
27 } syscall_req_t;
28
29 typedef struct syscall_rsp {
30         int32_t retval;
31 } syscall_rsp_t;
32
33 // Generic Syscall Ring Buffer
34 DEFINE_RING_TYPES(syscall, syscall_req_t, syscall_rsp_t);
35
36 typedef struct syscall_desc syscall_desc_t;
37 struct syscall_desc {
38         LIST_ENTRY(syscall_desc_t) next;
39         syscall_front_ring_t* sysfr;
40         uint32_t idx;
41         // cleanup
42         void (*cleanup)(void* data);
43         void* data;
44 };
45 LIST_HEAD(syscall_desc_list_t, syscall_desc_t);
46
47 static uint32_t
48 syscall_sysenter(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5);
49
50 #endif /* !ROS_INC_SYSCALL_H */