Kernel: Stack pointer is validated when updated

This allows us not to fail stack pointer when in syscall since
interrupts use their own stack
This commit is contained in:
Bananymous
2023-04-21 10:40:24 +03:00
parent b1c7af38d0
commit 9c506ef85b
9 changed files with 37 additions and 23 deletions

View File

@@ -45,7 +45,8 @@ namespace Kernel
[](void* entry_func)
{
Thread& current = Thread::current();
Process::current().m_mmu->map_range(current.stack_base(), current.stack_size(), MMU::Flags::UserSupervisor | MMU::Flags::ReadWrite | MMU::Flags::Present);
current.process().m_mmu->map_range(current.stack_base(), current.stack_size(), MMU::Flags::UserSupervisor | MMU::Flags::ReadWrite | MMU::Flags::Present);
current.process().m_mmu->load();
current.jump_userspace((uintptr_t)entry_func);
ASSERT_NOT_REACHED();
}, (void*)entry

View File

@@ -158,8 +158,6 @@ namespace Kernel
current.set_rip(rip);
current.set_rsp(rsp);
ASSERT(current.stack_base() <= rsp && rsp <= current.stack_base() + current.stack_size());
return false;
}

View File

@@ -10,29 +10,29 @@ namespace Kernel
Process::current().exit();
}
int sys_read(int fd, void* buffer, size_t size)
long sys_read(int fd, void* buffer, size_t size)
{
auto res = Process::current().read(fd, buffer, size);
if (res.is_error())
return res.error().get_error_code();
return 0;
return res.value();
}
int sys_write(int fd, const void* buffer, size_t size)
long sys_write(int fd, const void* buffer, size_t size)
{
auto res = Process::current().write(fd, buffer, size);
if (res.is_error())
return res.error().get_error_code();
return 0;
return res.value();
}
extern "C" int cpp_syscall_handler(int syscall, void* arg1, void* arg2, void* arg3)
extern "C" long cpp_syscall_handler(int syscall, void* arg1, void* arg2, void* arg3)
{
(void)arg1;
(void)arg2;
(void)arg3;
Thread::current().set_in_syscall(true);
int ret = 0;
asm volatile("sti");
long ret = 0;
switch (syscall)
{
case SYS_EXIT:
@@ -50,6 +50,10 @@ namespace Kernel
break;
}
asm volatile("cli");
Thread::current().set_in_syscall(false);
return ret;
}

View File

@@ -99,12 +99,12 @@ namespace BAN::Formatter
}
extern "C" uintptr_t g_rodata_start;
extern "C" uintptr_t g_rodata_end;
extern "C" uintptr_t g_userspace_start;
extern "C" uintptr_t g_userspace_end;
extern "C" uintptr_t g_kernel_start;
extern "C" uintptr_t g_kernel_end;
extern void userspace_entry();
static void jump_userspace();
@@ -213,7 +213,7 @@ static void jump_userspace()
using namespace Kernel;
MMU::get().map_range((uintptr_t)&g_userspace_start, (uintptr_t)&g_userspace_end - (uintptr_t)&g_userspace_start, MMU::Flags::UserSupervisor | MMU::Flags::Present);
MMU::get().map_range((uintptr_t)&g_rodata_start, (uintptr_t)&g_rodata_end - (uintptr_t)&g_rodata_start, MMU::Flags::UserSupervisor | MMU::Flags::Present);
MMU::get().map_range((uintptr_t)&g_kernel_start, (uintptr_t)&g_kernel_end - (uintptr_t)&g_kernel_start, MMU::Flags::UserSupervisor | MMU::Flags::Present);
MUST(Process::create_userspace(userspace_entry));
}