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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user