risc-v boot process bugfixes
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 24 Jan 2012 02:11:52 +0000 (18:11 -0800)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Fri, 11 May 2012 04:36:24 +0000 (21:36 -0700)
kern/arch/riscv/boot.S
kern/arch/riscv/process.c
kern/arch/riscv/time.c
kern/arch/riscv/trap.c

index 14af7f1..ee987f9 100644 (file)
@@ -16,7 +16,7 @@
 // entry point
 ///////////////////////////////////////////////////////////////////
 
 // entry point
 ///////////////////////////////////////////////////////////////////
 
-#define PCR0 (SR_S | SR_ET | SR_SX)
+#define PCR0 (SR_S | SR_ET | SR_SX | (1 << (IPI_IRQ + SR_IM_SHIFT)))
 .text
 
 .global _start
 .text
 
 .global _start
index f7d29a3..dc834dc 100644 (file)
@@ -14,7 +14,7 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[30] = stack_top-64;
        memset(tf, 0, sizeof(*tf));
 
        tf->gpr[30] = stack_top-64;
-       tf->sr = SR_S | SR_IM | SR_SX | SR_UX | SR_VM;
+       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_SX | SR_UX | SR_VM;
 
        tf->epc = entryp;
 
 
        tf->epc = entryp;
 
@@ -25,7 +25,7 @@ void proc_init_trapframe(trapframe_t *tf, uint32_t vcoreid,
 
 void proc_secure_trapframe(struct trapframe *tf)
 {
 
 void proc_secure_trapframe(struct trapframe *tf)
 {
-       tf->sr = SR_S | SR_IM | SR_SX | SR_UX | SR_VM;
+       tf->sr = SR_S | (mfpcr(PCR_SR) & SR_IM) | SR_SX | SR_UX | SR_VM;
 }
 
 /* Called when we are currently running an address space on our core and want to
 }
 
 /* Called when we are currently running an address space on our core and want to
index 4b1e1af..637643c 100644 (file)
@@ -10,28 +10,34 @@ system_timing_t system_timing = {0};
 void
 timer_init(void)
 {
 void
 timer_init(void)
 {
-       mtpcr(PCR_COUNT, 0);
-       mtpcr(PCR_COMPARE, 0);
-       mtpcr(PCR_SR, mfpcr(PCR_SR) | (SR_IM & (1 << (TIMER_IRQ+SR_IM_SHIFT))));
-
        system_timing.tsc_freq = TSC_HZ;
        cprintf("TSC Frequency: %llu\n", system_timing.tsc_freq);
 }
 
        system_timing.tsc_freq = TSC_HZ;
        cprintf("TSC Frequency: %llu\n", system_timing.tsc_freq);
 }
 
-/* Warning: one-shot timers are unsupported; all timers are periodic.
- * Perhaps this support could be added with a per_cpu boolean, set
- * by set_core_timer, and interpreted by the interrupt handler. */
 void
 set_core_timer(uint32_t usec, bool periodic)
 {
 void
 set_core_timer(uint32_t usec, bool periodic)
 {
-       uint32_t clocks =  (uint64_t)usec*TSC_HZ/1000000;
+       // we could implement periodic timers using one-shot timers,
+       // but for now we only support one-shot
+       assert(!periodic);
+
+       if (usec)
+       {
+         uint32_t clocks =  (uint64_t)usec*TSC_HZ/1000000;
 
 
-  int8_t irq_state = 0;
-       disable_irqsave(&irq_state);
+         int8_t irq_state = 0;
+         disable_irqsave(&irq_state);
 
 
-  mtpcr(PCR_COMPARE, mfpcr(PCR_COUNT) + clocks);
+         mtpcr(PCR_COUNT, 0);
+         mtpcr(PCR_COMPARE, clocks);
+         mtpcr(PCR_SR, mfpcr(PCR_SR) | (1 << (TIMER_IRQ+SR_IM_SHIFT)));
 
 
-       enable_irqsave(&irq_state);
+         enable_irqsave(&irq_state);
+       }
+       else
+       {
+         mtpcr(PCR_SR, mfpcr(PCR_SR) & ~(1 << (TIMER_IRQ+SR_IM_SHIFT)));
+       }
 }
 
 void
 }
 
 void
index 6d16304..d93bde0 100644 (file)
@@ -312,12 +312,12 @@ handle_fault_fetch(trapframe_t* state)
        if(in_kernel(state))
        {
                print_trapframe(state);
        if(in_kernel(state))
        {
                print_trapframe(state);
-               panic("Instruction Page Fault in the Kernel at %p!", state->badvaddr);
+               panic("Instruction Page Fault in the Kernel at %p!", state->epc);
        }
 
        set_current_tf(&per_cpu_info[core_id()], state);
 
        }
 
        set_current_tf(&per_cpu_info[core_id()], state);
 
-       if(handle_page_fault(current, state->badvaddr, PROT_EXEC))
+       if(handle_page_fault(current, state->epc, PROT_EXEC))
                unhandled_trap(state, "Instruction Page Fault");
 }
 
                unhandled_trap(state, "Instruction Page Fault");
 }