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
|
#include <string.h>
#include <process.h>
#include <vfs.h>
#include <syscall.h>
typedef uint32_t (*syscall_handler_t)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t);
static syscall_handler_t sc_handlers[SC_MAX] = { 0 };
// ==================== //
// THE SYSCALLS CODE !! //
// ==================== //
static uint32_t exit_sc(uint32_t code, uint32_t uu1, uint32_t uu2, uint32_t uu3, uint32_t uu4) {
dbg_printf("Proc %d exit with code %d\n", proc_pid(current_process()), code);
// TODO : use code... and process exiting is not supposed to be done this way
exit();
return 0;
}
static uint32_t yield_sc() {
yield();
return 0;
}
static uint32_t dbg_print_sc(uint32_t x, uint32_t uu1, uint32_t uu2, uint32_t uu3, uint32_t uu4) {
const char* addr = (const char*)x;
probe_for_read(addr, 256);
char buf[256];
memcpy(buf, addr, 256);
buf[255] = 0;
dbg_print(buf);
return 0;
}
// ====================== //
// SYSCALLS SETUP ROUTINE //
// ====================== //
void setup_syscalls() {
sc_handlers[SC_EXIT] = exit_sc;
sc_handlers[SC_YIELD] = yield_sc;
sc_handlers[SC_DBG_PRINT] = dbg_print_sc;
}
void syscall_handler(registers_t *regs) {
ASSERT(regs->int_no == 64);
if (regs->eax < SC_MAX) {
syscall_handler_t h = sc_handlers[regs->eax];
if (h != 0) {
regs->eax = h(regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi);
} else {
regs->eax = -1;
}
}
}
/* vim: set ts=4 sw=4 tw=0 noet :*/
|