diff options
Diffstat (limited to 'src/kernel/exception.C')
-rw-r--r-- | src/kernel/exception.C | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/kernel/exception.C b/src/kernel/exception.C index 98d36c35c..040284d72 100644 --- a/src/kernel/exception.C +++ b/src/kernel/exception.C @@ -3,6 +3,7 @@ #include <kernel/task.H> #include <kernel/taskmgr.H> #include <kernel/ppcarch.H> +#include <kernel/vmmmgr.H> namespace Systemcalls { void TaskEnd(task_t*); } namespace ExceptionHandles @@ -33,6 +34,62 @@ void kernel_execute_prog_ex() } } +const uint64_t EXCEPTION_DSISR_MASK = 0x0000000040000000; +const uint64_t EXCEPTION_DSISR_PTEMISS = 0x0000000040000000; + +extern "C" +void kernel_execute_data_storage() +{ + task_t* t = TaskManager::getCurrentTask(); + uint64_t exception = ppc_getDSISR() & EXCEPTION_DSISR_MASK; + + bool handled = false; + switch(exception) + { + case EXCEPTION_DSISR_PTEMISS: + handled = VmmManager::pteMiss(t); + break; + } + if (!handled) + { + printk("Data Storage exception on %d: %llx, %llx\n", + t->tid, ppc_getDAR(), ppc_getDSISR()); + Systemcalls::TaskEnd(t); + } +} + +extern "C" +void kernel_execute_data_segment() +{ + task_t* t = TaskManager::getCurrentTask(); + printk("Data Segment exception, killing task %d\n", t->tid); + Systemcalls::TaskEnd(t); +} + +extern "C" +void kernel_execute_inst_storage() +{ + task_t* t = TaskManager::getCurrentTask(); + printk("Inst Storage exception, killing task %d\n", t->tid); + Systemcalls::TaskEnd(t); +} + +extern "C" +void kernel_execute_inst_segment() +{ + task_t* t = TaskManager::getCurrentTask(); + printk("Inst Segment exception, killing task %d\n", t->tid); + Systemcalls::TaskEnd(t); +} + +extern "C" +void kernel_execute_alignment() +{ + task_t* t = TaskManager::getCurrentTask(); + printk("Alignment exception, killing task %d\n", t->tid); + Systemcalls::TaskEnd(t); +} + namespace ExceptionHandles { bool HvEmulation(task_t* t) |