// Shahir Ahmed and Boosung Kim
#include "../h/exception_handler.h"
#include "../h/pandos_const.h"
int exceptionCode;
extern pcb_t* currentProcess; // pointer to the current executing process
void exceptionHandler()
{
state_t* exceptionState = (state_t*) BIOSDATAPAGE; // processor 0 exception state (BIOS data page)
// 0 0 00 000000000000 00000000 0 11111 00
unsigned int cause = (exceptionState->cause & GETEXECCODE) >> 2; // cause of the exception
exceptionCode = cause;
if(cause == 0){
// Device interrupt
InterruptHandler(exceptionState->cause); // Invoke Nucleus device interrupt handler
return;
}
if(cause == 1 || cause == 2 || cause == 3){
// TLB exceptions
PassUpOrDie(0, exceptionState); // TLB exception handler
return;
}
if(cause == 8){
if(((exceptionState->status) & 0b1000) == 0){
// Kernel mode
SyscallExceptionHandler(exceptionState);
} else {
// User mode
cause = 10;
exceptionHandler();
}
return;
}
PassUpOrDie(1, exceptionState);
}
void PassUpOrDie(int exceptionType, state_t* exceptionState)
{
if (currentProcess->p_supportStruct == NULL) {
// Die portion - the current process and all its progeny are terminated
Terminate_Process_SYS2();
} else {
// Passed up portion - pass up the handling of an exception to the support level (phase 3)
(currentProcess->p_supportStruct)->sup_exceptState[exceptionType] = *exceptionState;
context_t info = (currentProcess->p_supportStruct)->sup_exceptContext[exceptionType];
LDCXT(info.stackPtr, info.status, info.pc );
}
}