Measurement for async syscalls
[akaros.git] / 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 <inc/types.h>
11 #include <inc/stdarg.h>
12 #include <inc/string.h>
13 #include <inc/error.h>
14 #include <inc/env.h>
15 #include <inc/memlayout.h>
16 #include <inc/syscall.h>
17 #include <inc/pool.h>
18 // These two are included below because of dependency issues.
19 //#include <inc/stdio.h>
20 //#include <inc/assert.h>
21
22 #define USED(x)         (void)(x)
23
24 // libos.c or entry.S
25 extern char *binaryname;
26 extern volatile env_t *env;
27 // will need to change these types when we have real structs
28 // seems like they need to be either arrays [] or functions () for it to work
29 extern volatile uint8_t (COUNT(PGSIZE * UINFO_PAGES) procinfo)[];
30 extern volatile uint8_t (COUNT(PGSIZE * UDATA_PAGES) procdata)[];
31 extern syscall_front_ring_t sysfrontring;
32 extern volatile page_t pages[];
33 void    exit(void);
34
35 // readline.c
36 char*   readline(const char *buf);
37
38 // syscall.c
39 void sys_null();
40 void sys_cputs(const char *string, size_t len);
41 void sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
42                      void (*cleanup_handler)(void*), void* cleanup_data);
43 int     sys_cgetc(void);
44 envid_t sys_getenvid(void);
45 int     sys_env_destroy(envid_t);
46 error_t waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp);
47
48 // async callback
49 #define MAX_SYSCALLS 100
50 #define MAX_ASYNCCALLS 100
51 // The high-level object a process waits on, with multiple syscalls within.
52 typedef struct async_desc {
53         syscall_desc_list_t syslist;
54         void (*cleanup)(void* data);
55         void* data;
56 } async_desc_t;
57 // This is per-thread, and used when entering a async library call to properly
58 // group syscall_desc_t used during the processing of that async call
59 extern async_desc_t* current_async_desc;
60 // stdio.h needs to be included after async_desc_t.  assert.h includes stdio.h.
61 #include <inc/stdio.h>
62 #include <inc/assert.h>
63
64
65 // This pooltype contains syscall_desc_t, which is how you wait on one syscall.
66 POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
67 POOL_TYPE_DEFINE(async_desc_t, async_desc_pool, MAX_ASYNCCALLS);
68 // These are declared in libmain.c
69 extern syscall_desc_pool_t syscall_desc_pool;
70 extern async_desc_pool_t async_desc_pool;
71 // Finds a free async_desc_t, on which you can wait for a series of syscalls
72 async_desc_t* get_async_desc(void);
73 // Wait on all syscalls within this async call.  TODO - timeout or something?
74 error_t waiton_async_call(async_desc_t* desc);
75 // Finds a free sys_desc_t, on which you can wait for a specific syscall, and
76 // binds it to the group desc.
77 syscall_desc_t* get_sys_desc(async_desc_t* desc);
78
79
80 /* File open modes */
81 #define O_RDONLY        0x0000          /* open for reading only */
82 #define O_WRONLY        0x0001          /* open for writing only */
83 #define O_RDWR          0x0002          /* open for reading and writing */
84 #define O_ACCMODE       0x0003          /* mask for above modes */
85
86 #define O_CREAT         0x0100          /* create if nonexistent */
87 #define O_TRUNC         0x0200          /* truncate to zero length */
88 #define O_EXCL          0x0400          /* error if already exists */
89 #define O_MKDIR         0x0800          /* create directory, not regular file */
90
91 #endif  // !ROS_INC_LIB_H