Compare commits

..

No commits in common. "c24d0da5f0ae9d70e6d2adf51118d7b7a4e48931" and "f34dd5637502e78d6bef2c07fac9303c542abeee" have entirely different histories.

3 changed files with 9 additions and 25 deletions

View File

@ -75,16 +75,6 @@ void decode_page_fault_error_code(u64 code)
(code & PF_RESERVED) ? " | Reserved bits set" : "", (code & PF_NX_VIOLATION) ? " | NX violation" : ""); (code & PF_RESERVED) ? " | Reserved bits set" : "", (code & PF_NX_VIOLATION) ? " | NX violation" : "");
} }
static void check_stack(Thread* current, Registers* regs)
{
if (regs->rsp < current->stack.bottom() || regs->rsp >= current->stack.top())
kerrorln("Abnormal stack (RSP outside the normal range, %.16lx-%.16lx)", current->stack.bottom(),
current->stack.top());
if (regs->rsp >= (current->stack.bottom() - ARCH_PAGE_SIZE) && regs->rsp < current->stack.bottom())
kerrorln("Likely stack overflow (CPU exception inside guard page)");
}
void handle_cpu_exception(int signo, const char* err, Registers* regs) void handle_cpu_exception(int signo, const char* err, Registers* regs)
{ {
if (err) kerrorln("Caught CPU exception: %s", err); if (err) kerrorln("Caught CPU exception: %s", err);
@ -99,11 +89,8 @@ void handle_cpu_exception(int signo, const char* err, Registers* regs)
if (!is_in_kernel(regs)) if (!is_in_kernel(regs))
{ {
auto* current = Scheduler::current(); Scheduler::current()->send_signal(signo);
check_stack(current, regs); Scheduler::current()->process_pending_signals(regs);
current->send_signal(signo);
current->process_pending_signals(regs);
return; return;
} }
@ -116,8 +103,6 @@ void handle_page_fault(Registers* regs)
asm volatile("mov %%cr2, %0" : "=r"(cr2)); asm volatile("mov %%cr2, %0" : "=r"(cr2));
kerrorln("Page fault while accessing %lx!", cr2); kerrorln("Page fault while accessing %lx!", cr2);
if (cr2 <= ARCH_PAGE_SIZE) kerrorln("Looks like a null pointer dereference!");
decode_page_fault_error_code(regs->error); decode_page_fault_error_code(regs->error);
handle_cpu_exception(SIGSEGV, nullptr, regs); handle_cpu_exception(SIGSEGV, nullptr, regs);

View File

@ -11,17 +11,16 @@ static constexpr u64 THREAD_STACK_BASE = 0x10000;
static Result<void> create_user_stack(Stack& user_stack, AddressSpace* space) static Result<void> create_user_stack(Stack& user_stack, AddressSpace* space)
{ {
TRY(MemoryManager::alloc_at_zeroed(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES,
MMU::ReadWrite | MMU::NoExecute | MMU::User));
auto guard = make_scope_guard([] { MemoryManager::unmap_owned(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES); });
if (!TRY(space->test_and_alloc_region(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES, PROT_READ | PROT_WRITE, if (!TRY(space->test_and_alloc_region(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, 0, true))) MAP_ANONYMOUS | MAP_PRIVATE, 0, true)))
return err(ENOMEM); return err(ENOMEM);
// Stack overflow guard page, remains unmapped. guard.deactivate();
if (!TRY(space->test_and_alloc_region(THREAD_STACK_BASE - ARCH_PAGE_SIZE, 1, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
0, 0, true)))
return err(ENOMEM);
TRY(MemoryManager::alloc_at_zeroed(THREAD_STACK_BASE, DEFAULT_USER_STACK_PAGES,
MMU::ReadWrite | MMU::NoExecute | MMU::User));
user_stack = { THREAD_STACK_BASE, DEFAULT_USER_STACK_SIZE }; user_stack = { THREAD_STACK_BASE, DEFAULT_USER_STACK_SIZE };

View File

@ -17,7 +17,7 @@ do_patch()
do_configure() do_configure()
{ {
$srcdir/configure --prefix=/usr --target=$LUNA_ARCH-luna --host=$LUNA_ARCH-luna --disable-nls --with-build-sysroot=$LUNA_BASE --enable-languages=c,c++ --enable-checking $srcdir/configure --prefix=/usr --target=$LUNA_ARCH-luna --host=$LUNA_ARCH-luna --disable-nls --with-build-sysroot=$BUILD_SYSROOT --enable-languages=c,c++
} }
do_build() do_build()