summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-03 18:45:38 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-03 18:45:38 -0500
commit2c10c1dc2befc3d82d74507cc767e58cf11db173 (patch)
tree8eb9bc264f3f598703d9982534f72fecb748bebb /src
parenta14b97b73ee6cd6821177cd307cdc6993438f987 (diff)
downloadtalos-hostboot-2c10c1dc2befc3d82d74507cc767e58cf11db173.tar.gz
talos-hostboot-2c10c1dc2befc3d82d74507cc767e58cf11db173.zip
Add stub for decrementer interrupt.
Diffstat (limited to 'src')
-rw-r--r--src/kernel/cpumgr.C5
-rw-r--r--src/kernel/start.S30
-rw-r--r--src/kernel/syscall.C10
-rw-r--r--src/kernel/taskmgr.C1
4 files changed, 41 insertions, 5 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index f20139dd1..6855bfc1e 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -61,6 +61,11 @@ void CpuManager::startCPU(ssize_t i)
{
register task_t* idle_task = iv_cpus[i]->scheduler->getIdleTask();
asm volatile("mtsprg3 %0" :: "r" (idle_task));
+
+ // TODO: Set up decrementer properly.
+ register uint64_t decrementer = 0x0f000000;
+ asm volatile("mtdec %0" :: "r"(decrementer));
+
}
else
{
diff --git a/src/kernel/start.S b/src/kernel/start.S
index 8cb885c39..192b38685 100644
--- a/src/kernel/start.S
+++ b/src/kernel/start.S
@@ -105,11 +105,33 @@ intvect_fp_unavail:
.org _start + 0x900
intvect_decrementer:
- b intvect_decrementer;
+ mtsprg1 r1 ;// Save GPR1
+
+ ;// Retrieve processing address for interrupt.
+ lis r1,intvect_decrementer_finish_save@h
+ ori r1,r1,intvect_decrementer_finish_save@l
+ ;// Save interrupt address in SPRG0
+ mtsprg0 r1
+
+ mfsprg1 r1 ;// Restore GPR1
+ b kernel_save_task ;// Save current task.
+
+intvect_decrementer_finish_save:
+ ;// Get TOC entry for kernel_execute_systemcall
+ lis r2, kernel_execute_decrementer@h
+ ori r2, r2, kernel_execute_decrementer@l
+ ld r0,0(r2) ;// Load call addr.
+ mtlr r0
+ ld r2,8(r2) ;// Load TOC base.
+
+ blrl ;// Call kernel_execute_systemcall
+ nop
+ b kernel_dispatch_task ;// Return to task.
+
.org _start + 0x980
intvect_hype_decrementer:
- b intvect_hype_decrementer;
+ b intvect_decrementer;
.org _start + 0xC00
intvect_system_call:
@@ -132,7 +154,7 @@ intvect_system_call_finish_save:
mtlr r0
ld r2,8(r2) ;// Load TOC base.
- blr ;// Call kernel_execute_systemcall
+ blrl ;// Call kernel_execute_systemcall
nop
b kernel_dispatch_task ;// Return to task.
@@ -270,7 +292,7 @@ kernel_dispatch_task:
mtxer r23 ;// Restore XER
mfmsr r2 ;// Get current MSR
- ;// TODO: Modify MSR to user-space.
+ ori r2,r2, 0xC000 ;// Enable MSR[EE,PR].
mtsrr1 r2 ;// Set task MSR (SRR1)
ld r2, TASK_NIP(r1) ;// Load NIP from context.
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index 250c18ae2..d59ea1a03 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -1,6 +1,16 @@
#include <kernel/console.H>
extern "C"
+void kernel_execute_decrementer()
+{
+ //printk("Decrementer.\n");
+
+ // Resync decrementer.
+ register uint64_t decrementer = 0x0f000000;
+ asm volatile("mtdec %0" :: "r"(decrementer));
+}
+
+extern "C"
void kernel_execute_systemcall()
{
//printk("Syscall.\n");
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index e5085655b..a3dcdf5f3 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -7,7 +7,6 @@ void TaskManager::idleTaskLoop()
{
while(1)
{
- asm volatile("sc");
}
}
OpenPOWER on IntegriCloud