Stability fixes (i hope); attempt to implement argc, argv, envp, auxv; Syscalls

This commit is contained in:
Alex
2022-11-10 07:09:32 +02:00
parent 40b1da9dd1
commit 77081b4e1e
35 changed files with 3116 additions and 211 deletions

2409
SystemCalls/Linux.cpp Normal file

File diff suppressed because it is too large Load Diff

46
SystemCalls/Native.cpp Normal file
View File

@ -0,0 +1,46 @@
#include <syscalls.hpp>
#include <debug.h>
#include "../syscalls.h"
#include "../kernel.h"
static uint64_t sys_exit(SyscallsFrame *Frame, uint64_t code)
{
trace("Userspace thread %s(%lld) exited with code %#llx", TaskManager->GetCurrentThread()->Name, TaskManager->GetCurrentThread()->ID, code);
TaskManager->GetCurrentThread()->ExitCode = code;
TaskManager->GetCurrentThread()->Status = Tasking::TaskStatus::Terminated;
return 0;
}
static int sys_print(SyscallsFrame *Frame, char Char, int Index)
{
debug("%c", Char);
return Display->Print(Char, Index, true);
}
static void *NativeSyscallsTable[] = {
[_exit] = (void *)sys_exit,
[_print] = (void *)sys_print,
};
uint64_t HandleNativeSyscalls(SyscallsFrame *Frame)
{
debug("rax: %#llx, rbx: %#llx, rcx: %#llx, rdx: %#llx, rsi: %#llx, rdi: %#llx, rbp: %#llx, r8: %#llx, r9: %#llx, r10: %#llx, r11: %#llx, r12: %#llx, r13: %#llx, r14: %#llx, r15: %#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx, Frame->rsi, Frame->rdi, Frame->rbp, Frame->r8, Frame->r9, Frame->r10, Frame->r11, Frame->r12, Frame->r13, Frame->r14, Frame->r15);
if (Frame->rax > sizeof(NativeSyscallsTable))
{
fixme("Syscall %lld not implemented", Frame->rax);
return -1;
}
uint64_t (*call)(uint64_t, ...) = reinterpret_cast<uint64_t (*)(uint64_t, ...)>(NativeSyscallsTable[Frame->rax]);
if (!call)
{
error("Syscall %#llx failed.", Frame->rax);
return -1;
}
debug("%#lx %#lx %#lx %#lx %#lx %#lx", Frame->rdi, Frame->rsi, Frame->rdx, Frame->rcx, Frame->r8, Frame->r9);
uint64_t ret = call((uint64_t)Frame, Frame->rdi, Frame->rsi, Frame->rdx, Frame->r10, Frame->r8, Frame->r9);
Frame->rax = ret;
return ret;
}

View File

@ -2,14 +2,33 @@
#include <debug.h>
extern "C" uint64_t SystemCallsHandler(SyscallsRegs *regs)
#include "../kernel.h"
extern "C" uint64_t SystemCallsHandler(SyscallsFrame *Frame)
{
#if defined(__amd64__)
fixme("System call %ld", regs->rax);
switch (TaskManager->GetCurrentThread()->Info.Compatibility)
{
case Tasking::TaskCompatibility::Native:
return HandleNativeSyscalls(Frame);
case Tasking::TaskCompatibility::Linux:
return HandleLinuxSyscalls(Frame);
case Tasking::TaskCompatibility::Windows:
{
error("Windows compatibility not implemented yet.");
break;
}
default:
{
error("Unknown compatibility mode! Killing thread...");
TaskManager->KillThread(TaskManager->GetCurrentThread(), -0xCA11);
break;
}
}
#elif defined(__i386__)
fixme("System call %lld", regs->eax);
#elif defined(__aarch64__)
fixme("System call");
#endif
return 0;
return -1;
}