Added set_timer(usec) function
[akaros.git] / kern / arch / sparc / sparc.h
index b246f30..eeb10c4 100644 (file)
@@ -23,7 +23,6 @@
 #define XSTR(arg) STR(arg)
 
 #include <ros/common.h>
-#include <arch/frontend.h>
 
 static __inline uint32_t read_psr(void) __attribute__((always_inline));
 static __inline uint32_t read_wim(void) __attribute__((always_inline));
@@ -31,7 +30,7 @@ static __inline uint32_t read_tbr(void) __attribute__((always_inline));
 static __inline uint32_t read_mmu_reg(uint32_t which) __attribute__((always_inline));
 static __inline uint32_t read_y(void) __attribute__((always_inline));
 static __inline uint32_t read_fsr(void) __attribute__((always_inline));
-static __inline uint64_t read_perfctr(uint32_t which) __attribute__((always_inline));
+static __inline uint64_t read_perfctr(uint32_t core, uint32_t which) __attribute__((always_inline));
 static __inline void write_psr(uint32_t val) __attribute__((always_inline));
 static __inline void write_wim(uint32_t val) __attribute__((always_inline));
 static __inline void write_tbr(uint32_t val) __attribute__((always_inline));
@@ -40,6 +39,7 @@ static __inline void write_y(uint32_t val) __attribute__((always_inline));
 static __inline void write_fsr(uint32_t val) __attribute__((always_inline));
 static __inline uint32_t memsize_mb(void) __attribute__((always_inline));
 static __inline uint32_t mmu_probe(uint32_t va) __attribute__((always_inline));
+static __inline uint32_t send_ipi(uint32_t dst) __attribute__((always_inline));
 
 void flush_windows();
 
@@ -93,12 +93,17 @@ read_fsr(void)
 }
 
 static __inline uint64_t
-read_perfctr(uint32_t which)
-{
-       uint32_t hi,lo;
-       intptr_t addr = which<<3;
-       hi = load_alternate(addr,2);
-       lo = load_alternate(addr+4,2);
+read_perfctr(uint32_t cpu, uint32_t which)
+{
+       register uint32_t hi asm("o0"), lo asm("o1");
+       intptr_t addr = cpu<<10 | which<<3;
+       #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,6 +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_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 */