3cc2d3fbc284025fa33f0f53c9a2f4d7989beb1b
[akaros.git] / user / roslib / inc / lib.h
1 // Main public header file for our user-land support library,
2 // whose code lives in the lib directory.
3 // This library is roughly our OS's version of a standard C library,
4 // and is intended to be linked into all user-mode applications
5 // (NOT the kernel or boot loader).
6
7 #ifndef ROS_INC_LIB_H
8 #define ROS_INC_LIB_H 1
9
10 #include <ros/timer.h>
11 #include <ros/error.h>
12 #include <ros/memlayout.h>
13 #include <ros/procdata.h>
14 #include <ros/common.h>
15
16 #include <stdarg.h>
17 #include <string.h>
18 #include <pool.h>
19 #include <assert.h>
20 #include <sys/queue.h>
21
22 #define USED(x)         (void)(x)
23
24 // libos.c or entry.S
25 extern char *NTS binaryname;
26 extern procinfo_t* procinfo;
27 extern procdata_t* procdata;
28 extern syscall_front_ring_t syscallfrontring;
29 extern sysevent_back_ring_t syseventbackring;
30 void exit(void) __attribute__((noreturn));
31
32 /*
33  * Syscall Descriptor: This helps userspace track a specific syscall.  Includes
34  * a cleanup function to be run when this syscall is complete.  Linked list of
35  * these for now. (Tail Queue)
36  */
37 typedef struct syscall_desc syscall_desc_t;
38 struct syscall_desc {
39         TAILQ_ENTRY(syscall_desc) next;
40         syscall_front_ring_t* sysfr;
41         uint32_t idx;
42         // cleanup
43         void (*cleanup)(void* data);
44         void* data;
45 };
46 TAILQ_HEAD(syscall_desc_list, syscall_desc);
47 typedef struct syscall_desc_list syscall_desc_list_t;
48
49 // syscall.c
50 void        sys_null();
51 error_t     sys_null_async(syscall_desc_t* desc);
52 void        sys_cache_buster(uint32_t num_writes, uint32_t num_pages,
53                              uint32_t flags);
54 error_t     sys_cache_buster_async(syscall_desc_t* desc, uint32_t num_writes,
55                                    uint32_t num_pages, uint32_t flags);
56 void        sys_cache_invalidate();
57 ssize_t     sys_cputs(const char *string, size_t len);
58 error_t     sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
59                             void (*cleanup_handler)(void*), void* cleanup_data);
60 uint16_t    sys_cgetc(void);
61 size_t      sys_getcpuid(void);
62 /* Process Management */
63 int         sys_getpid(void);
64 error_t     sys_proc_destroy(int pid);
65 void        sys_yield(void);
66 int         sys_proc_create(char* path);
67 error_t     sys_proc_run(int pid);
68 /* Memory Management */
69 void *COUNT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
70                              int fd, size_t offset);
71 /* Resource Requests */
72 ssize_t sys_resource_req(int type, size_t amount, uint32_t flags);
73
74 /* Generic Async Call */
75 error_t     waiton_syscall(syscall_desc_t* desc, syscall_rsp_t*COUNT(1) rsp);
76
77 // async callback
78 #define MAX_SYSCALLS 100
79 #define MAX_ASYNCCALLS 100
80
81 // The high-level object a process waits on, with multiple syscalls within.
82 typedef struct async_desc {
83         syscall_desc_list_t syslist;
84         void (*cleanup)(void* data);
85         void* data;
86 } async_desc_t;
87
88 // Response to an async call.  Should be some sort of aggregation of the
89 // syscall responses.
90 typedef struct async_rsp_t {
91         int32_t retval;
92 } async_rsp_t;
93
94 // This is per-thread, and used when entering a async library call to properly
95 // group syscall_desc_t used during the processing of that async call
96 extern async_desc_t*COUNT(1) current_async_desc;
97
98 // This pooltype contains syscall_desc_t, which is how you wait on one syscall.
99 POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
100 POOL_TYPE_DEFINE(async_desc_t, async_desc_pool, MAX_ASYNCCALLS);
101
102 // This pooltype contains all the timers used in user level time tracking
103 POOL_TYPE_DEFINE(timer_t, timer_pool, MAX_TIMERS);
104
105 // These are declared in libmain.c
106 extern syscall_desc_pool_t syscall_desc_pool;
107 extern async_desc_pool_t async_desc_pool;
108 extern timer_pool_t timer_pool;
109
110 error_t waiton_async_call(async_desc_t*COUNT(1) desc, async_rsp_t* rsp);
111 async_desc_t*COUNT(1) get_async_desc(void);
112 syscall_desc_t* get_sys_desc(async_desc_t* desc);
113 error_t get_all_desc(async_desc_t** a_desc, syscall_desc_t** s_desc);
114
115 // Arch specific, in roslib/ARCH/libmain.c
116 // Can move these to a inc/arch/lib.h when we don't maintain that symlink to the
117 // kernel's arch folder
118 uint32_t newcore(void);
119 void setvcore0(void);
120 void prepare_for_multi_mode(void);
121
122 /* File open modes */
123 #define O_RDONLY        0x0000          /* open for reading only */
124 #define O_WRONLY        0x0001          /* open for writing only */
125 #define O_RDWR          0x0002          /* open for reading and writing */
126 #define O_ACCMODE       0x0003          /* mask for above modes */
127
128 #define O_CREAT         0x0100          /* create if nonexistent */
129 #define O_TRUNC         0x0200          /* truncate to zero length */
130 #define O_EXCL          0x0400          /* error if already exists */
131 #define O_MKDIR         0x0800          /* create directory, not regular file */
132
133 #endif  // !ROS_INC_LIB_H