Added set_timer(usec) function
[akaros.git] / kern / arch / sparc / sparc.h
index fac8912..eeb10c4 100644 (file)
@@ -95,10 +95,15 @@ read_fsr(void)
 static __inline uint64_t
 read_perfctr(uint32_t cpu, uint32_t which)
 {
-       uint32_t hi,lo;
+       register uint32_t hi asm("o0"), lo asm("o1");
        intptr_t addr = cpu<<10 | which<<3;
-       hi = load_alternate(addr,2);
-       lo = load_alternate(addr+4,2);
+       #ifdef ROS_KERNEL
+               hi = load_alternate(addr,2);
+               lo = load_alternate(addr+4,2);
+       #else
+               asm volatile("mov %2,%%o0; ta 9"
+                            : "=r"(hi),"=r"(lo) : "r"(addr));
+       #endif
        return (((uint64_t)hi) << 32) | lo;
 }
 
@@ -160,13 +165,27 @@ mmu_probe(uint32_t va)
        return load_alternate((va & ~0xFFF) | 0x400, 3);
 }
 
+static __inline void
+store_iobus(uint32_t device, uint32_t addr, uint32_t data)
+{
+       store_alternate(device << 16 | addr, 2, data);
+}
+
 static __inline uint32_t
 send_ipi(uint32_t dst)
 {
-       store_alternate(2 << 16 | dst << 10, 2, 0);
+       store_iobus(2,dst<<10,0);
        return 0;
 }
 
+// arm the calling core's interrupt timer.
+// enable must be 1 or 0; clocks must be a power of 2
+static __inline void
+sparc_set_timer(uint32_t clocks, uint32_t enable)
+{
+       store_iobus(1,0,enable << 24 | (clocks-1));
+}
+
 #endif /* !__ASSEMBLER__ */
 
 #endif /* !ROS_INC_X86_H */