mirror of https://gitlab.com/nakst/essence
fix CPULocal usage in page fault handler
This commit is contained in:
parent
9ccbb40295
commit
aaa0114e8d
|
@ -411,6 +411,7 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool supervisor = (context->cs & 3) == 0;
|
bool supervisor = (context->cs & 3) == 0;
|
||||||
|
Thread *currentThread = GetCurrentThread();
|
||||||
|
|
||||||
if (!supervisor) {
|
if (!supervisor) {
|
||||||
// EsPrint("User interrupt: %x/%x/%x\n", interrupt, context->cr2, context->errorCode);
|
// EsPrint("User interrupt: %x/%x/%x\n", interrupt, context->cr2, context->errorCode);
|
||||||
|
@ -424,9 +425,7 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// User-code exceptions are *basically* the same thing as system calls.
|
// User-code exceptions are *basically* the same thing as system calls.
|
||||||
Thread *currentThread = GetCurrentThread();
|
ThreadTerminatableState previousTerminatableState = currentThread->terminatableState;
|
||||||
ThreadTerminatableState previousTerminatableState;
|
|
||||||
previousTerminatableState = currentThread->terminatableState;
|
|
||||||
currentThread->terminatableState = THREAD_IN_SYSCALL;
|
currentThread->terminatableState = THREAD_IN_SYSCALL;
|
||||||
|
|
||||||
if (local && local->spinlockCount) {
|
if (local && local->spinlockCount) {
|
||||||
|
@ -435,6 +434,7 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
|
|
||||||
// Re-enable interrupts during exception handling.
|
// Re-enable interrupts during exception handling.
|
||||||
ProcessorEnableInterrupts();
|
ProcessorEnableInterrupts();
|
||||||
|
local = nullptr; // The CPU we're executing on could change.
|
||||||
|
|
||||||
if (interrupt == 14) {
|
if (interrupt == 14) {
|
||||||
bool success = MMArchHandlePageFault(context->cr2, (context->errorCode & 2) ? MM_HANDLE_PAGE_FAULT_WRITE : 0);
|
bool success = MMArchHandlePageFault(context->cr2, (context->errorCode & 2) ? MM_HANDLE_PAGE_FAULT_WRITE : 0);
|
||||||
|
@ -450,10 +450,10 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
|
|
||||||
// TODO Usermode exceptions and debugging.
|
// TODO Usermode exceptions and debugging.
|
||||||
KernelLog(LOG_ERROR, "Arch", "unhandled userland exception",
|
KernelLog(LOG_ERROR, "Arch", "unhandled userland exception",
|
||||||
"InterruptHandler - Exception (%z) in userland process (%z).\nRIP = %x (CPU %d)\nRSP = %x\nX86_64 error codes: [err] %x, [cr2] %x\n",
|
"InterruptHandler - Exception (%z) in userland process (%z).\nRIP = %x\nRSP = %x\nX86_64 error codes: [err] %x, [cr2] %x\n",
|
||||||
exceptionInformation[interrupt],
|
exceptionInformation[interrupt],
|
||||||
currentThread->process->cExecutableName,
|
currentThread->process->cExecutableName,
|
||||||
context->rip, local->processorID, context->rsp, context->errorCode, context->cr2);
|
context->rip, context->rsp, context->errorCode, context->cr2);
|
||||||
|
|
||||||
EsPrint("Attempting to make a stack trace...\n");
|
EsPrint("Attempting to make a stack trace...\n");
|
||||||
|
|
||||||
|
@ -507,19 +507,20 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
goto fault;
|
goto fault;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((context->flags & 0x200) && context->cr8 != 0xE) {
|
|
||||||
ProcessorEnableInterrupts();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (local && local->spinlockCount && ((context->cr2 >= 0xFFFF900000000000 && context->cr2 < 0xFFFFF00000000000)
|
if (local && local->spinlockCount && ((context->cr2 >= 0xFFFF900000000000 && context->cr2 < 0xFFFFF00000000000)
|
||||||
|| context->cr2 < 0x8000000000000000)) {
|
|| context->cr2 < 0x8000000000000000)) {
|
||||||
KernelPanic("HandlePageFault - Page fault occurred with spinlocks active at %x (S = %x, B = %x, LG = %x, CR2 = %x, local = %x).\n",
|
KernelPanic("HandlePageFault - Page fault occurred with spinlocks active at %x (S = %x, B = %x, LG = %x, CR2 = %x, local = %x).\n",
|
||||||
context->rip, context->rsp, context->rbp, local->currentThread->lastKnownExecutionAddress, context->cr2, local);
|
context->rip, context->rsp, context->rbp, local->currentThread->lastKnownExecutionAddress, context->cr2, local);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((context->flags & 0x200) && context->cr8 != 0xE) {
|
||||||
|
ProcessorEnableInterrupts();
|
||||||
|
local = nullptr; // The CPU we're executing on could change.
|
||||||
|
}
|
||||||
|
|
||||||
if (!MMArchHandlePageFault(context->cr2, MM_HANDLE_PAGE_FAULT_FOR_SUPERVISOR
|
if (!MMArchHandlePageFault(context->cr2, MM_HANDLE_PAGE_FAULT_FOR_SUPERVISOR
|
||||||
| ((context->errorCode & 2) ? MM_HANDLE_PAGE_FAULT_WRITE : 0))) {
|
| ((context->errorCode & 2) ? MM_HANDLE_PAGE_FAULT_WRITE : 0))) {
|
||||||
if (local->currentThread->inSafeCopy && context->cr2 < 0x8000000000000000) {
|
if (currentThread->inSafeCopy && context->cr2 < 0x8000000000000000) {
|
||||||
context->rip = context->r8; // See definition of MMArchSafeCopy.
|
context->rip = context->r8; // See definition of MMArchSafeCopy.
|
||||||
} else {
|
} else {
|
||||||
goto fault;
|
goto fault;
|
||||||
|
@ -529,11 +530,11 @@ extern "C" void InterruptHandler(InterruptContext *context) {
|
||||||
ProcessorDisableInterrupts();
|
ProcessorDisableInterrupts();
|
||||||
} else {
|
} else {
|
||||||
fault:
|
fault:
|
||||||
KernelPanic("Unresolvable processor exception encountered in supervisor mode.\n%z\nRIP = %x (CPU %d)\nX86_64 error codes: [err] %x, [cr2] %x\n"
|
KernelPanic("Unresolvable processor exception encountered in supervisor mode.\n%z\nRIP = %x\nX86_64 error codes: [err] %x, [cr2] %x\n"
|
||||||
"Stack: [rsp] %x, [rbp] %x\nRegisters: [rax] %x, [rbx] %x, [rsi] %x, [rdi] %x.\nThread ID = %d\n",
|
"Stack: [rsp] %x, [rbp] %x\nRegisters: [rax] %x, [rbx] %x, [rsi] %x, [rdi] %x.\nThread ID = %d\n",
|
||||||
exceptionInformation[interrupt], context->rip, local ? local->processorID : -1, context->errorCode, context->cr2,
|
exceptionInformation[interrupt], context->rip, context->errorCode, context->cr2,
|
||||||
context->rsp, context->rbp, context->rax, context->rbx, context->rsi, context->rdi,
|
context->rsp, context->rbp, context->rax, context->rbx, context->rsi, context->rdi,
|
||||||
local && local->currentThread ? local->currentThread->id : -1);
|
currentThread ? currentThread->id : -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (interrupt == 0xFF) {
|
} else if (interrupt == 0xFF) {
|
||||||
|
|
|
@ -1102,10 +1102,6 @@ EsError CCSpaceAccess(CCSpace *cache, K_USER_BUFFER void *_buffer, EsFileOffset
|
||||||
|
|
||||||
copy:;
|
copy:;
|
||||||
|
|
||||||
if (GetLocalStorage()->spinlockCount) {
|
|
||||||
KernelPanic("CCSpaceAccess - Spinlocks acquired.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy into/from the user's buffer.
|
// Copy into/from the user's buffer.
|
||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
|
|
Loading…
Reference in New Issue