diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-07-08 17:42:40 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-07-08 17:42:40 -0500 |
commit | 204c3d248426c2ba0b332c05994d67a80f49f958 (patch) | |
tree | d0bbf0ca1b17349458cc938fd08846fa1c74e2ff /src/kernel/exception.C | |
parent | 2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (diff) | |
download | blackbird-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.tar.gz blackbird-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.zip |
MMIO mapping support and syscalls.
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) |