2022-09-29 19:17:43 +02:00
|
|
|
#include "sys/Syscall.h"
|
2022-10-08 14:18:25 +02:00
|
|
|
#include "errno.h"
|
2022-09-29 19:17:43 +02:00
|
|
|
#include "io/Serial.h"
|
2022-10-13 21:55:51 +02:00
|
|
|
#include "memory/VMM.h"
|
2022-10-13 22:13:04 +02:00
|
|
|
#include "std/string.h"
|
2022-09-29 19:17:43 +02:00
|
|
|
#include "thread/Scheduler.h"
|
|
|
|
|
|
|
|
void Syscall::entry(Context* context)
|
|
|
|
{
|
|
|
|
asm volatile("cli");
|
2022-10-13 21:55:51 +02:00
|
|
|
VMM::enter_syscall_context();
|
2022-09-29 19:17:43 +02:00
|
|
|
switch (context->rax)
|
|
|
|
{
|
2022-10-11 21:32:28 +02:00
|
|
|
case SYS_exit: sys_exit(context, (int)context->rdi); break;
|
|
|
|
case SYS_yield: sys_yield(context); break;
|
|
|
|
case SYS_sleep: sys_sleep(context, context->rdi); break;
|
|
|
|
case SYS_write: sys_write(context, (int)context->rdi, context->rsi, (const char*)context->rdx); break;
|
2022-10-02 17:01:46 +02:00
|
|
|
case SYS_paint: sys_paint(context, context->rdi, context->rsi, context->rdx, context->r10, context->r8); break;
|
2022-10-01 17:30:31 +02:00
|
|
|
case SYS_gettid: sys_gettid(context); break;
|
2022-10-06 17:13:34 +02:00
|
|
|
case SYS_mmap: sys_mmap(context, (void*)context->rdi, context->rsi, (int)context->rdx); break;
|
2022-10-02 20:45:04 +02:00
|
|
|
case SYS_munmap: sys_munmap(context, (void*)context->rdi, context->rsi); break;
|
2022-10-10 20:21:39 +02:00
|
|
|
case SYS_open: sys_open(context, (const char*)context->rdi, (int)context->rsi); break;
|
|
|
|
case SYS_read: sys_read(context, (int)context->rdi, context->rsi, (char*)context->rdx); break;
|
|
|
|
case SYS_close: sys_close(context, (int)context->rdi); break;
|
2022-10-12 15:56:03 +02:00
|
|
|
case SYS_seek: sys_seek(context, (int)context->rdi, (long)context->rsi, (int)context->rdx); break;
|
2022-10-12 17:45:58 +02:00
|
|
|
case SYS_exec: sys_exec(context, (const char*)context->rdi); break;
|
2022-10-15 10:56:06 +02:00
|
|
|
case SYS_fcntl: sys_fcntl(context, (int)context->rdi, (int)context->rsi, context->rdx); break;
|
2022-10-15 12:57:14 +02:00
|
|
|
case SYS_mprotect: sys_mprotect(context, (void*)context->rdi, context->rsi, (int)context->rdx); break;
|
2022-10-15 13:17:26 +02:00
|
|
|
case SYS_clock: sys_clock(context); break;
|
2022-10-16 17:22:12 +02:00
|
|
|
case SYS_mkdir: sys_mkdir(context, (const char*)context->rdi); break;
|
2022-10-17 18:43:35 +02:00
|
|
|
case SYS_fork: sys_fork(context); break;
|
2022-10-08 14:18:25 +02:00
|
|
|
default: context->rax = -ENOSYS; break;
|
2022-09-29 19:17:43 +02:00
|
|
|
}
|
2022-10-13 21:55:51 +02:00
|
|
|
VMM::exit_syscall_context();
|
2022-10-13 22:13:04 +02:00
|
|
|
}
|
|
|
|
|
2022-10-15 10:56:06 +02:00
|
|
|
char* Syscall::strdup_from_user(const char* user_string) // FIXME: This function is a little hacky.
|
2022-10-13 22:13:04 +02:00
|
|
|
{
|
|
|
|
uint64_t phys = VMM::get_physical((uint64_t)user_string);
|
|
|
|
if (phys == (uint64_t)-1) { return nullptr; }
|
|
|
|
return strdup((const char*)phys);
|
2022-09-29 19:17:43 +02:00
|
|
|
}
|