summaryrefslogtreecommitdiffstats
path: root/src/kernel/exception.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-07-08 17:42:40 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-07-08 17:42:40 -0500
commit204c3d248426c2ba0b332c05994d67a80f49f958 (patch)
treed0bbf0ca1b17349458cc938fd08846fa1c74e2ff /src/kernel/exception.C
parent2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (diff)
downloadtalos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.tar.gz
talos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.zip
MMIO mapping support and syscalls.
Diffstat (limited to 'src/kernel/exception.C')
-rw-r--r--src/kernel/exception.C57
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)
OpenPOWER on IntegriCloud