diff --git a/sortix/scheduler.cpp b/sortix/scheduler.cpp index 51a69594..c050a3d4 100644 --- a/sortix/scheduler.cpp +++ b/sortix/scheduler.cpp @@ -143,6 +143,15 @@ namespace Sortix nextthread->LoadRegisters(regs); addr_t newaddrspace = nextthread->process->addrspace; + if ( unlikely(newaddrspace != Page::AlignDown(newaddrspace)) ) + { + PanicF("Thread 0x%p, process %i (0x%p) (backup: %i), had bad " + "address space variable: 0x%zx: not page-aligned " + "(backup: 0x%zx)\n", nextthread, + nextthread->process->pid, nextthread->process, + nextthread->pidbackup, newaddrspace, + nextthread->addrspacebackup); + } Memory::SwitchAddressSpace(newaddrspace); currentthread = nextthread; diff --git a/sortix/thread.cpp b/sortix/thread.cpp index b1bb7128..579acbac 100644 --- a/sortix/thread.cpp +++ b/sortix/thread.cpp @@ -56,6 +56,7 @@ namespace Sortix currentsignal = NULL; sighandler = NULL; pidbackup = -1; + addrspacebackup = 0UL; terminated = false; ResetCallbacks(); } @@ -80,6 +81,7 @@ namespace Sortix scfunc = NULL; sighandler = forkfrom->sighandler; pidbackup = -1; + addrspacebackup = 0UL; terminated = false; ResetCallbacks(); } @@ -190,6 +192,7 @@ namespace Sortix ready = true; this->pidbackup = process->pid; + this->addrspacebackup = process->addrspace; if ( Time::MicrosecondsSinceBoot() < sleepuntil ) { diff --git a/sortix/thread.h b/sortix/thread.h index 47e8bc8a..5ff62eb3 100644 --- a/sortix/thread.h +++ b/sortix/thread.h @@ -61,6 +61,7 @@ namespace Sortix size_t id; Process* process; pid_t pidbackup; + addr_t addrspacebackup; bool terminated; Thread* prevsibling; Thread* nextsibling; diff --git a/sortix/x86-family/memorymanagement.cpp b/sortix/x86-family/memorymanagement.cpp index 5fed13a1..8a37ff36 100644 --- a/sortix/x86-family/memorymanagement.cpp +++ b/sortix/x86-family/memorymanagement.cpp @@ -265,11 +265,14 @@ namespace Sortix addr_t Get() { if ( unlikely(stackused == 0) ) { Error::Set(ENOMEM); return 0; } - return STACK[--stackused]; + addr_t result = STACK[--stackused]; + ASSERT(result == AlignDown(result)); + return result; } void Put(addr_t page) { + ASSERT(page == AlignDown(page)); ASSERT(stackused < MAXSTACKLENGTH); STACK[stackused++] = page; }