aboutsummaryrefslogtreecommitdiff
path: root/src/lib/libkogata/syscall.c
blob: 8d24628ff37c8badb3d7d991be05ea04fef363a8 (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
#include <debug.h>
#include <syscall.h>

#include <string.h>
#include <printf.h>

static 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);
}

bool mmap(void* addr, size_t size, int mode) {
	return call(SC_MMAP, (uint32_t)addr, size, mode, 0, 0);
}
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);
}

/* vim: set ts=4 sw=4 tw=0 noet :*/