Added cache_buster syscall
[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 <arch/types.h>
11 #include <arch/timer.h>
12 #include <ros/error.h>
13 #include <stdarg.h>
14 #include <string.h>
15 #include <pool.h>
16
17 #include <ros/memlayout.h>
18 #include <ros/syscall.h>
19 #include <ros/env.h>
20
21 #define USED(x)         (void)(x)
22
23 // libos.c or entry.S
24 extern char *binaryname;
25 extern volatile env_t *env;
26 // will need to change these types when we have real structs
27 // seems like they need to be either arrays [] or functions () for it to work
28 extern volatile uint8_t (COUNT(PGSIZE * UINFO_PAGES) procinfo)[];
29 extern volatile uint8_t (COUNT(PGSIZE * UDATA_PAGES) procdata)[];
30 extern syscall_front_ring_t sysfrontring;
31 void exit(void) __attribute__((noreturn));
32
33 // syscall.c
34 void        sys_null();
35 error_t     sys_null_async(syscall_desc_t* desc);
36 void        sys_cache_invalidate();
37 void        sys_cache_buster(uint32_t num_writes, uint32_t num_pages,
38                              uint32_t flags);
39 error_t     sys_cache_buster_async(syscall_desc_t* desc, uint32_t num_writes,
40                                    uint32_t num_pages, uint32_t flags);
41 ssize_t     sys_cputs(const char *string, size_t len);
42 error_t     sys_cputs_async(const char *s, size_t len, syscall_desc_t* desc,
43                             void (*cleanup_handler)(void*), void* cleanup_data);
44 uint16_t    sys_cgetc(void);
45 envid_t     sys_getenvid(void);
46 envid_t     sys_getcpuid(void);
47 error_t     sys_env_destroy(envid_t);
48 error_t     waiton_syscall(syscall_desc_t* desc, syscall_rsp_t* rsp);
49
50 // async callback
51 #define MAX_SYSCALLS 100
52 #define MAX_ASYNCCALLS 100
53 // The high-level object a process waits on, with multiple syscalls within.
54 typedef struct async_desc {
55         syscall_desc_list_t syslist;
56         void (*cleanup)(void* data);
57         void* data;
58 } async_desc_t;
59
60 // Response to an async call.  Should be some sort of aggregation of the
61 // syscall responses.
62 typedef struct async_rsp_t {
63         int32_t retval;
64 } async_rsp_t;
65
66 // This is per-thread, and used when entering a async library call to properly
67 // group syscall_desc_t used during the processing of that async call
68 extern async_desc_t* current_async_desc;
69 // stdio.h needs to be included after async_desc_t.  assert.h includes stdio.h.
70 #include <stdio.h>
71 #include <assert.h>
72
73 // This pooltype contains syscall_desc_t, which is how you wait on one syscall.
74 POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
75 POOL_TYPE_DEFINE(async_desc_t, async_desc_pool, MAX_ASYNCCALLS);
76
77 // This pooltype contains all the timers used in user level time tracking
78 POOL_TYPE_DEFINE(timer_t, timer_pool, MAX_TIMERS);
79
80 // These are declared in libmain.c
81 extern syscall_desc_pool_t syscall_desc_pool;
82 extern async_desc_pool_t async_desc_pool;
83 extern timer_pool_t timer_pool;
84
85 error_t waiton_async_call(async_desc_t* desc, async_rsp_t* rsp);
86 async_desc_t* get_async_desc(void);
87 syscall_desc_t* get_sys_desc(async_desc_t* desc);
88 error_t get_all_desc(async_desc_t** a_desc, syscall_desc_t** s_desc);
89
90
91 /* File open modes */
92 #define O_RDONLY        0x0000          /* open for reading only */
93 #define O_WRONLY        0x0001          /* open for writing only */
94 #define O_RDWR          0x0002          /* open for reading and writing */
95 #define O_ACCMODE       0x0003          /* mask for above modes */
96
97 #define O_CREAT         0x0100          /* create if nonexistent */
98 #define O_TRUNC         0x0200          /* truncate to zero length */
99 #define O_EXCL          0x0400          /* error if already exists */
100 #define O_MKDIR         0x0800          /* create directory, not regular file */
101
102 #endif  // !ROS_INC_LIB_H