Added set_timer(usec) function
[akaros.git] / kern / arch / sparc / sparc.h
index 4f95bba..eeb10c4 100644 (file)
@@ -22,8 +22,7 @@
 #define STR(arg) #arg
 #define XSTR(arg) STR(arg)
 
-#include <arch/types.h>
-#include <arch/trap.h>
+#include <ros/common.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,8 +39,8 @@ 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));
 
-uint32_t send_active_message(uint32_t dst, amr_t pc, uint32_t arg0, uint32_t arg1, uint32_t arg2);
 void flush_windows();
 
 #define store_alternate(addr,asi,data) ({ uint32_t __my_addr = (addr); uint32_t __my_data = (data); __asm__ __volatile__ ("sta %0,[%1] %2" : : "r"(__my_data),"r"(__my_addr),"i"(asi)); })
@@ -94,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;
 }
 
@@ -158,7 +162,28 @@ num_cores(void)
 static __inline uint32_t
 mmu_probe(uint32_t va)
 {
-       return load_alternate(va & ~0xFFF | 0x400, 3);
+       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__ */