1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
#include <debug.h>
#include <syscall.h>
#include <string.h>
#include <printf.h>
static inline uint32_t call(uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t ss, uint32_t dd) {
uint32_t ret;
asm volatile("int $0x40"
:"=a"(ret)
:"a"(a),"b"(b),"c"(c),"d"(d),"S"(ss),"D"(dd));
return ret;
}
void dbg_print(const char* str) {
call(SC_DBG_PRINT, (uint32_t)str, strlen(str), 0, 0, 0);
}
void dbg_printf(const char* fmt, ...) {
va_list ap;
char buffer[256];
va_start(ap, fmt);
vsnprintf(buffer, 256, fmt, ap);
va_end(ap);
dbg_print(buffer);
}
void yield() {
call(SC_YIELD, 0, 0, 0, 0, 0);
}
void exit(int code) {
call(SC_EXIT, code, 0, 0, 0, 0);
}
void usleep(int usecs) {
call(SC_USLEEP, usecs, 0, 0, 0, 0);
}
bool mmap(void* addr, size_t size, int mode) {
return call(SC_MMAP, (uint32_t)addr, size, mode, 0, 0);
}
bool mmap_file(fd_t file, size_t offset, void* addr, size_t size, int mode) {
return call(SC_MMAP_FILE, file, offset, (uint32_t)addr, size, mode);
}
bool mchmap(void* addr, int mode) {
return call(SC_MCHMAP, (uint32_t)addr, mode, 0, 0, 0);
}
bool munmap(void* addr) {
return call(SC_MUNMAP, (uint32_t)addr, 0, 0, 0, 0);
}
bool create(const char* name, int type) {
return call(SC_CREATE, (uint32_t)name, strlen(name), type, 0, 0);
}
bool delete(const char* name) {
return call(SC_CREATE, (uint32_t)name, strlen(name), 0, 0, 0);
}
bool move(const char* oldname, const char* newname) {
return call(SC_MOVE, (uint32_t)oldname, strlen(oldname), (uint32_t)newname, strlen(newname), 0);
}
bool stat(const char* name, stat_t *s) {
return call(SC_STAT, (uint32_t)name, strlen(name), (uint32_t)s, 0, 0);
}
fd_t open(const char* name, int mode) {
return call(SC_OPEN, (uint32_t)name, strlen(name), mode, 0, 0);
}
void close(fd_t file) {
call(SC_CLOSE, file, 0, 0, 0, 0);
}
size_t read(fd_t file, size_t offset, size_t len, char *buf) {
return call(SC_READ, file, offset, len, (uint32_t)buf, 0);
}
size_t write(fd_t file, size_t offset, size_t len, const char* buf) {
return call(SC_WRITE, file, offset, len, (uint32_t)buf, 0);
}
bool readdir(fd_t file, size_t ent_no, dirent_t *d) {
return call(SC_READDIR, file, ent_no, (uint32_t)d, 0, 0);
}
bool stat_open(fd_t file, stat_t *s) {
return call(SC_STAT_OPEN, file, (uint32_t)s, 0, 0, 0);
}
int ioctl(fd_t file, int command, void* data) {
return call(SC_IOCTL, file, command, (uint32_t)data, 0, 0);
}
int get_mode(fd_t file) {
return call(SC_GET_MODE, file, 0, 0, 0, 0);
}
bool make_fs(const char* name, const char* driver, fd_t source, const char* options) {
sc_make_fs_args_t args = {
.driver = driver,
.driver_strlen = strlen(driver),
.fs_name = name,
.fs_name_strlen = strlen(name),
.source_fd = source,
.opts = options,
.opts_strlen = strlen(options),
};
return call(SC_MAKE_FS, (uint32_t)&args, 0, 0, 0, 0);
}
bool fs_add_source(const char* fs, fd_t source, const char* options) {
return call(SC_FS_ADD_SRC, (uint32_t)fs, strlen(fs), source, (uint32_t)options, strlen(options));
}
bool fs_subfs(const char* name, const char* orig_fs, const char* root, int ok_modes) {
sc_subfs_args_t args = {
.new_name = name,
.new_name_strlen = strlen(name),
.from_fs = orig_fs,
.from_fs_strlen = strlen(orig_fs),
.root = root,
.root_strlen = strlen(root),
.ok_modes = ok_modes,
.bind_to_pid = 0
};
return call(SC_SUBFS, (uint32_t)&args, 0, 0, 0, 0);
}
void fs_remove(const char* name) {
call(SC_RM_FS, (uint32_t)name, strlen(name), 0, 0, 0);
}
pid_t new_proc() {
return call(SC_NEW_PROC, 0, 0, 0, 0, 0);
}
bool bind_fs(pid_t pid, const char* new_name, const char* fs) {
return call(SC_BIND_FS, pid, (uint32_t)new_name, strlen(new_name), (uint32_t)fs, strlen(fs));
}
bool bind_subfs(pid_t pid, const char* new_name, const char* orig_fs, const char* root, int ok_modes) {
sc_subfs_args_t args = {
.new_name = new_name,
.new_name_strlen = strlen(new_name),
.from_fs = orig_fs,
.from_fs_strlen = strlen(orig_fs),
.root = root,
.root_strlen = strlen(root),
.ok_modes = ok_modes,
.bind_to_pid = pid
};
return call(SC_BIND_SUBFS, (uint32_t)&args, 0, 0, 0, 0);
}
bool bind_fd(pid_t pid, fd_t new_fd, fd_t fd) {
return call(SC_BIND_FD, new_fd, fd, 0, 0, 0);
}
bool proc_exec(pid_t pid, const char* file) {
return call(SC_PROC_EXEC, pid, (uint32_t)file, strlen(file), 0, 0);
}
bool proc_status(pid_t pid, proc_status_t *s) {
return call(SC_PROC_STATUS, pid, (uint32_t)s, 0, 0, 0);
}
bool proc_kill(pid_t pid, proc_status_t *s) {
return call(SC_PROC_KILL, pid, (uint32_t)s, 0, 0, 0);
}
void proc_wait(pid_t pid, proc_status_t *s) {
call(SC_PROC_WAIT, pid, (uint32_t)s, 0, 0, 0);
}
void proc_wait_any(proc_status_t *s) {
call(SC_PROC_WAIT_ANY, (uint32_t)s, 0, 0, 0, 0);
}
/* vim: set ts=4 sw=4 tw=0 noet :*/
|