Kmsg debug routine
[akaros.git] / kern / arch / sparc / sparc.h
index eeb10c4..a1132ac 100644 (file)
 #define XSTR(arg) STR(arg)
 
 #include <ros/common.h>
+#include <arch/time.h>
 
 static __inline uint32_t read_psr(void) __attribute__((always_inline));
 static __inline uint32_t read_wim(void) __attribute__((always_inline));
 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 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));
 static __inline void write_mmu_reg(uint32_t which, uint32_t val) __attribute__((always_inline));
-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));
@@ -50,7 +49,7 @@ static __inline uint32_t
 read_psr(void)
 {
        uint32_t reg;
-       asm volatile ("mov %%psr,%0" : "=r"(reg));
+       asm volatile ("mov %%psr,%0" : "=r"(reg) : : "memory");
        return reg;
 }
 
@@ -58,7 +57,7 @@ static __inline uint32_t
 read_wim(void)
 {
        uint32_t reg;
-       asm volatile ("mov %%wim,%0" : "=r"(reg));
+       asm volatile ("mov %%wim,%0" : "=r"(reg) : : "memory");
        return reg;
 }
 
@@ -66,7 +65,7 @@ static __inline uint32_t
 read_tbr(void)
 {
        uint32_t reg;
-       asm volatile ("mov %%tbr,%0" : "=r"(reg));
+       asm volatile ("mov %%tbr,%0" : "=r"(reg) : : "memory");
        return reg;
 }
 
@@ -77,36 +76,13 @@ read_mmu_reg(uint32_t which)
 }
 
 static __inline uint32_t
-read_y(void)
-{
-       uint32_t reg;
-       asm volatile ("mov %%y,%0" : "=r"(reg));
-       return reg;
-}
-
-static __inline uint32_t
 read_fsr(void)
 {
        uint32_t reg;
-       asm volatile ("st %%fsr,%0" : "=m"(reg));
+       asm volatile ("st %%fsr,%0" : "=m"(reg) : : "memory");
        return reg;
 }
 
-static __inline uint64_t
-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;
-}
-
 static __inline void
 write_psr(uint32_t val)
 {
@@ -132,12 +108,6 @@ write_mmu_reg(uint32_t which, uint32_t val)
 }
 
 static __inline void
-write_y(uint32_t val)
-{
-       asm volatile ("mov %0,%%y; nop;nop;nop" : : "r"(val) : "memory");
-}
-
-static __inline void
 write_fsr(uint32_t val)
 {
        asm volatile ("ld %0,%%fsr; nop;nop;nop" : : "m"(val) : "memory");
@@ -168,7 +138,25 @@ mmu_probe(uint32_t va)
 static __inline void
 store_iobus(uint32_t device, uint32_t addr, uint32_t data)
 {
-       store_alternate(device << 16 | addr, 2, data);
+       #ifdef ROS_KERNEL
+               store_alternate(device << 16 | addr, 2, data);
+       #else
+               register uint32_t __my_addr asm("o0") = (addr);
+               register uint32_t __my_data asm("o1") = (data);
+               __asm__ __volatile__ ("ta 11" : : "r"(__my_addr),"r"(__my_data));
+       #endif
+}
+
+static __inline uint32_t
+load_iobus(uint32_t device, uint32_t addr)
+{
+       #ifdef ROS_KERNEL
+               return load_alternate(device << 16 | addr, 2);
+       #else
+               register uint32_t __my_addr asm("o0") = (addr);
+               __asm__ __volatile__ ("ta 10" : "=r"(__my_addr) : "0"(__my_addr));
+               return __my_addr;
+       #endif
 }
 
 static __inline uint32_t
@@ -183,7 +171,7 @@ send_ipi(uint32_t dst)
 static __inline void
 sparc_set_timer(uint32_t clocks, uint32_t enable)
 {
-       store_iobus(1,0,enable << 24 | (clocks-1));
+       store_iobus(1,0,enable << TIMER_PERIOD_BITS | (clocks-1));
 }
 
 #endif /* !__ASSEMBLER__ */