Redefines PTE present vs mapped
[akaros.git] / kern / arch / riscv / time.c
index 2059017..ba7654c 100644 (file)
@@ -1,6 +1,6 @@
 #include <arch/time.h>
 #include <ros/common.h>
-#include <arch/trap.h>
+#include <trap.h>
 #include <arch/arch.h>
 #include <stdio.h>
 #include <assert.h>
@@ -9,29 +9,35 @@ system_timing_t system_timing = {0};
 
 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);
 }
 
-/* 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)
 {
-       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 << (IRQ_TIMER+SR_IM_SHIFT)));
 
-       enable_irqsave(&irq_state);
+               enable_irqsave(&irq_state);
+       }
+       else
+       {
+               mtpcr(PCR_SR, mfpcr(PCR_SR) & ~(1 << (IRQ_TIMER+SR_IM_SHIFT)));
+       }
 }
 
 void