From 2c10c1dc2befc3d82d74507cc767e58cf11db173 Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Thu, 3 Jun 2010 18:45:38 -0500 Subject: Add stub for decrementer interrupt. --- src/kernel/cpumgr.C | 5 +++++ src/kernel/start.S | 30 ++++++++++++++++++++++++++---- src/kernel/syscall.C | 10 ++++++++++ src/kernel/taskmgr.C | 1 - 4 files changed, 41 insertions(+), 5 deletions(-) (limited to 'src') 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,5 +1,15 @@ #include +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() { 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"); } } -- cgit v1.2.1