2023-03-13 15:32:46 +02:00
|
|
|
#include <kernel/Debug.h>
|
2023-04-12 17:51:36 +03:00
|
|
|
#include <kernel/Process.h>
|
2023-03-13 15:32:46 +02:00
|
|
|
#include <kernel/Syscall.h>
|
|
|
|
|
|
|
|
namespace Kernel
|
|
|
|
{
|
|
|
|
|
2023-04-12 17:51:36 +03:00
|
|
|
void sys_exit()
|
2023-03-13 15:32:46 +02:00
|
|
|
{
|
2023-04-19 00:34:18 +03:00
|
|
|
Process::current().exit();
|
2023-04-12 17:51:36 +03:00
|
|
|
}
|
|
|
|
|
2023-04-21 10:40:24 +03:00
|
|
|
long sys_read(int fd, void* buffer, size_t size)
|
2023-04-12 17:51:36 +03:00
|
|
|
{
|
2023-04-19 00:34:18 +03:00
|
|
|
auto res = Process::current().read(fd, buffer, size);
|
2023-04-12 17:51:36 +03:00
|
|
|
if (res.is_error())
|
|
|
|
return res.error().get_error_code();
|
2023-04-21 10:40:24 +03:00
|
|
|
return res.value();
|
2023-03-13 15:32:46 +02:00
|
|
|
}
|
|
|
|
|
2023-04-21 10:40:24 +03:00
|
|
|
long sys_write(int fd, const void* buffer, size_t size)
|
2023-03-13 15:32:46 +02:00
|
|
|
{
|
2023-04-19 00:34:18 +03:00
|
|
|
auto res = Process::current().write(fd, buffer, size);
|
2023-04-12 17:51:36 +03:00
|
|
|
if (res.is_error())
|
|
|
|
return res.error().get_error_code();
|
2023-04-21 10:40:24 +03:00
|
|
|
return res.value();
|
2023-03-13 15:32:46 +02:00
|
|
|
}
|
|
|
|
|
2023-04-21 10:40:24 +03:00
|
|
|
extern "C" long cpp_syscall_handler(int syscall, void* arg1, void* arg2, void* arg3)
|
2023-03-13 15:32:46 +02:00
|
|
|
{
|
2023-04-21 10:40:24 +03:00
|
|
|
Thread::current().set_in_syscall(true);
|
2023-03-13 15:32:46 +02:00
|
|
|
|
2023-04-21 10:40:24 +03:00
|
|
|
asm volatile("sti");
|
|
|
|
|
|
|
|
long ret = 0;
|
2023-03-13 15:32:46 +02:00
|
|
|
switch (syscall)
|
|
|
|
{
|
2023-04-12 17:51:36 +03:00
|
|
|
case SYS_EXIT:
|
|
|
|
sys_exit();
|
|
|
|
break;
|
|
|
|
case SYS_READ:
|
|
|
|
ret = sys_read((int)(uintptr_t)arg1, arg2, (size_t)(uintptr_t)arg3);
|
2023-03-13 15:32:46 +02:00
|
|
|
break;
|
2023-04-12 17:51:36 +03:00
|
|
|
case SYS_WRITE:
|
|
|
|
ret = sys_write((int)(uintptr_t)arg1, arg2, (size_t)(uintptr_t)arg3);
|
2023-03-13 15:32:46 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
ret = -1;
|
|
|
|
dprintln("Unknown syscall");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-04-21 10:40:24 +03:00
|
|
|
asm volatile("cli");
|
|
|
|
|
|
|
|
Thread::current().set_in_syscall(false);
|
|
|
|
|
2023-03-13 15:32:46 +02:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|