summaryrefslogtreecommitdiffstats
path: root/api/syscall.h
blob: 4a5d3e4b4db9717b2ad45eb820624a0a6a16cb53 (plain) (blame)
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#ifndef _JOVE_API_SYSCALL_H
#define _JOVE_API_SYSCALL_H 1

#include <stddef.h>
#include <stdint.h>

#include "process.h"
#include "obj.h"

/* General syscall behavior:
 * If the message passed is not a JOVE_OBJ_MESSAGE type, the kernel will return EBADOBJ.
 * If the message is too small to hold the target path, the kernel will return ETOOSMALL.
 * If the target path does not target a real object, the kernel will return EBADPATH.
 * If the target does not support the callid, the kernel will return EBADARG.
 * Otherwise, behavior depends on the syscall specified in callid.
 * */

struct syscall_header
{
    uint16_t callid;
    uint16_t pathlen;
    objpath_part_t path[];
};

/* If the message is too small for data, the kernel will return ETOOSMALL.
 * */
struct syscall_generic_write
{
    size_t len;
    char data[];
};

struct syscall_generic_objpath
{
    objpath_part_t pathlen;
    objpath_part_t path[];
};

/**JOVE_OBJ_UNTYPED syscalls.
 * */

enum
{
    _SYSCALL_UNTYPED_BADCALL = 0,
    SYSCALL_UNTYPED_ADDRESS,
    SYSCALL_UNTYPED_SIZE,
    SYSCALL_UNTYPED_SPLIT,
    SYSCALL_UNTYPED_MERGE,
    SYSCALL_UNTYPED_RETYPE_OBJDIR,
    SYSCALL_UNTYPED_RETYPE_PAGEDIR,
    SYSCALL_UNTYPED_RETYPE_SHMEMORY,
    SYSCALL_UNTYPED_RETYPE_PCB,
    SYSCALL_UNTYPED_RETYPE_MESSAGE,
    _SYSCALL_UNTYPED_ARCH_BEGIN
};

#define SYSCALL_PERM_UNTYPED_ADDRESS JOVE_PERM_READ
#define SYSCALL_PERM_UNTYPED_SIZE JOVE_PERM_READ
#define SYSCALL_PERM_UNTYPED_SPLIT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_UNTYPED_MERGE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_UNTYPED_RETYPE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)

struct syscall_untyped_split
{
    size_t bytes;
    objpath_part_t dest_pathlen;
    objpath_part_t dest_path[];
};

/**JOVE_OBJ_OBJDIR syscalls.
 * */

enum
{
    _SYSCALL_OBJDIR_BADCALL = 0,
    SYSCALL_OBJDIR_OBJTYPE,
    SYSCALL_OBJDIR_SWAP,
    SYSCALL_OBJDIR_LINK,
    SYSCALL_OBJDIR_ISLINK
};

#define SYSCALL_PERM_OBJDIR_OBJTYPE (JOVE_PERM_READ)
#define SYSCALL_PERM_OBJDIR_SWAP (JOVE_PERM_WRITE)
#define SYSCALL_PERM_OBJDIR_LINK (JOVE_PERM_WRITE)

#define SYSCALL_PERM_OBJDIR_SWAP_TGT (JOVE_PERM_WRITE)
#define SYSCALL_PERM_OBJDIR_LINK_TGT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)

struct syscall_objdir_swap
{
    objpath_part_t index;
    objpath_part_t other_path_length;
    objpath_part_t other_path[];
};

struct syscall_objdir_link
{
    objpath_part_t index;
    objpath_part_t other_path_length;
    objpath_part_t other_path[];
};

/* JOVE_OBJ_PAGEDIR syscalls
 * */

enum
{
    _SYSCALL_PAGEDIR_NONE = 0,
    SYSCALL_PAGEDIR_MAP_FRAME,
    SYSCALL_PAGEDIR_MAP_TABLE,
    SYSCALL_PAGEDIR_MAP_SHMEM,
    SYSCALL_PAGEDIR_UNMAP_FRAME,
    SYSCALL_PAGEDIR_UNMAP_TABLE,
    SYSCALL_PAGEDIR_UNMAP_SHMEM,
};

#define SYSCALL_PERM_PAGEDIR_MAP_FRAME (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PAGEDIR_MAP_TABLE (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PAGEDIR_MAP_SHMEM (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PAGEDIR_UNMAP_FRAME (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PAGEDIR_UNMAP_TABLE (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PAGEDIR_UNMAP_SHMEM (JOVE_PERM_READ | JOVE_PERM_WRITE)

struct syscall_pagedir_flags
{
    uint8_t writeable : 1;
    uint8_t executable : 1;
    uint8_t flg_unused : 6;
};

struct syscall_pagedir_map
{
    uintptr_t virtual_address;
    struct syscall_pagedir_flags page_flags;
    objpath_part_t untyped_pathlen;
    objpath_part_t untyped_path[];
};

struct syscall_pagedir_map_shmem
{
    uintptr_t virtual_address;
    unsigned short page_offset;
    struct syscall_pagedir_flags page_flags;
    objpath_part_t shmem_pathlen;
    objpath_part_t shmem_path[];
};

struct syscall_pagedir_unmap
{
    uintptr_t virtual_address;
    objpath_part_t none_pathlen;
    objpath_part_t none_path[];
};

/**JOVE_OBJ_REGION syscalls.
 * */

enum
{
    _SYSCALL_REGION_NONE = 0,
    SYSCALL_REGION_ADDRESS,
    SYSCALL_REGION_TOTAL_PAGES,
    SYSCALL_REGION_FREE_PAGES,
    SYSCALL_REGION_ALLOC,
    SYSCALL_REGION_SPLIT,
    SYSCALL_REGION_RELEASE,
};

#define SYSCALL_PERM_REGION_GETTERS (JOVE_PERM_READ)
#define SYSCALL_PERM_REGION_ALLOC (JOVE_PERM_WRITE)
#define SYSCALL_PERM_REGION_SPLIT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_REGION_MERGE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)

#define SYSCALL_PERM_REGION_ALLOC_TGT (JOVE_PERM_MUTATE)
#define SYSCALL_PERM_REGION_SPLIT_TGT (JOVE_PERM_MUTATE)
#define SYSCALL_PERM_REGION_MERGE_TGT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)

struct syscall_region_alloc
{
    size_t alloc_pages;
    objpath_part_t dest_pathlen;
    objpath_part_t dest_path[];
};

struct syscall_region_split
{
    size_t split_pages;
    objpath_part_t dest_pathlen;
    objpath_part_t dest_path[];
};

struct syscall_region_merge
{
    objpath_part_t dest_pathlen;
    objpath_part_t dest_path[];
};

/**JOVE_OBJ_PCB syscalls.
 * */

enum
{
    _SYSCALL_PCB_NONE = 0,
    SYSCALL_PCB_PID,
    SYSCALL_PCB_YIELD,
    SYSCALL_PCB_SEND,
    SYSCALL_PCB_RECV,
    SYSCALL_PCB_SWAP,
    SYSCALL_PCB_STACK,
    SYSCALL_PCB_READY,
    SYSCALL_PCB_STOP,
    SYSCALL_PCB_STATE,
};

#define SYSCALL_PERM_PCB_PID (JOVE_PERM_READ)
#define SYSCALL_PERM_PCB_YIELD (JOVE_PERM_WRITE)
#define SYSCALL_PERM_PCB_SEND (JOVE_PERM_WRITE)
#define SYSCALL_PERM_PCB_RECV (JOVE_PERM_READ | JOVE_PERM_WRITE)
#define SYSCALL_PERM_PCB_SWAP (SYSCALL_PERM_PCB_SEND | SYSCALL_PERM_PCB_RECV)
#define SYSCALL_PERM_PCB_STACK (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_PCB_READY (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_PCB_STOP (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)
#define SYSCALL_PERM_PCB_STATE (JOVE_PERM_READ)

#define SYSCALL_PERM_PCB_SEND_OBJDIR (JOVE_PERM_WRITE)
#define SYSCALL_PERM_PCB_RECV_DST (JOVE_PERM_MUTATE)
#define SYSCALL_PERM_PCB_SWAP_OBJ (JOVE_PERM_MUTATE)
#define SYSCALL_PERM_PCB_STACK_OBJ (JOVE_PERM_WRITE | JOVE_PERM_MUTATE)

struct syscall_pcb_yield 
{
    pid_t yield_target;
};

struct syscall_pcb_send
{
    pid_t send_target;
    uintmax_t send_timeout;
    objpath_part_t send_path_length;
    objpath_part_t send_path[];
};

struct syscall_pcb_recv
{
    pid_t recv_target;
    uintmax_t recv_timeout;
    objpath_part_t recv_path_length;
    objpath_part_t recv_path[];
};

struct syscall_pcb_swap
{
    pid_t swap_target;
    uintmax_t send_timeout;
    uintmax_t recv_timeout;

    objpath_part_t swap_path_length;
    objpath_part_t swap_path[];
};

struct syscall_pcb_stack
{
    unsigned char type;
    objpath_part_t stack_path_length;
    objpath_part_t stack_path[];
};

/**JOVE_OBJ_INITRD_FILE syscalls
 * */

enum
{
    _SYSCALL_INITRD_FILE_NONE = 0,
    SYSCALL_INITRD_FILE_NAME,
    SYSCALL_INITRD_FILE_SIZE,
    SYSCALL_INITRD_FILE_READ
};

#define SYSCALL_PERM_INITRD_FILE_NAME (JOVE_PERM_READ)
#define SYSCALL_PERM_INITRD_FILE_SIZE (JOVE_PERM_READ)
#define SYSCALL_PERM_INITRD_FILE_READ (JOVE_PERM_READ)

struct syscall_initrd_file_name_ret
{
    size_t len;
    char c_str[];
};

struct syscall_initrd_file_read
{
    size_t start_index;
    size_t read_size;
};

/**JOVE_OBJ_MESSAGE syscalls.
 * */

enum
{
    _SYSCALL_MESSAGE_NONE = 0,
};

/**JOVE_OBJ_VIRTTERM syscalls.*/

enum
{
    _SYSCALL_VTT_NONE = 0,
    SYSCALL_VTT_WRITE
};

#endif