summaryrefslogtreecommitdiffstats
path: root/src/kernel/exception.C
diff options
context:
space:
mode:
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