Handle rdtscp
[akaros.git] / kern / arch / sparc / arch.h
index 74f56a9..e9c12ba 100644 (file)
@@ -5,7 +5,7 @@
 
 /* Arch Constants */
 #define HW_CACHE_ALIGN         64
-#define IOAPIC_BASE            0xFEC00000 // max virtual address
+#define KERN_VMAP_TOP          0xFEC00000 // max virtual address
 
 #include <arch/mmu.h>
 #include <arch/sparc.h>
@@ -13,7 +13,7 @@
 #ifndef __ASSEMBLER__
 
 #include <ros/common.h>
-#include <arch/timer.h>
+#include <arch/time.h>
 
 static __inline void breakpoint(void) __attribute__((always_inline));
 static __inline void invlpg(void *addr) __attribute__((always_inline));
@@ -24,6 +24,7 @@ static __inline void disable_irq(void) __attribute__((always_inline));
 static __inline void enable_irqsave(int8_t* state) __attribute__((always_inline));
 static __inline void disable_irqsave(int8_t* state) __attribute__((always_inline));
 static __inline void cpu_relax(void) __attribute__((always_inline));
+static __inline void cpu_halt(void) __attribute__((always_inline));
 static __inline void tlbflush(void) __attribute__((always_inline));
 static __inline void icache_flush_page(void* va, void* pa)__attribute__((always_inline));
 static __inline void clflush(uintptr_t* addr) __attribute__((always_inline));
@@ -36,8 +37,7 @@ static __inline uint32_t rcr3(void) __attribute__((always_inline));
 
 void print_cpuinfo(void);
 void show_mapping(uintptr_t start, size_t size);
-void backtrace(void);
-void cpu_halt(void);
+void __cpu_halt(void);
 
 extern uintptr_t mmu_context_tables[MAX_NUM_CPUS][NCONTEXTS+CONTEXT_TABLE_PAD];
 
@@ -72,6 +72,12 @@ read_tsc(void)
        return read_perfctr(0,0);
 }
 
+static __inline uint64_t
+read_tscp(void)
+{
+       return read_tsc();
+}
+
 static __inline uint64_t 
 read_tsc_serialized(void)
 {
@@ -81,13 +87,13 @@ read_tsc_serialized(void)
 static __inline void
 enable_irq(void)
 {
-       write_psr(read_psr() & ~0xF00);
+       write_psr(read_psr() & ~PSR_PIL);
 }
 
 static __inline void
 disable_irq(void)
 {
-       write_psr(read_psr() | 0xF00);
+       write_psr(read_psr() | PSR_PIL);
 }
 
 static __inline void
@@ -148,6 +154,14 @@ cpu_relax(void)
 }
 
 static __inline void
+cpu_halt(void)
+{
+       /* TODO: this isn't atomic, but we want it to be. */
+       enable_irq();
+       __cpu_halt();
+}
+
+static __inline void
 clflush(uintptr_t* addr)
 {
        asm volatile("flush %0" : : "r"(addr));
@@ -156,7 +170,7 @@ clflush(uintptr_t* addr)
 static __inline int
 irq_is_enabled(void)
 {
-       return (read_psr() & 0xF00) == 0;
+       return (read_psr() & PSR_PIL) == 0;
 }
 
 static __inline uint32_t
@@ -175,7 +189,7 @@ cache_flush(void)
 static __inline void
 reboot(void)
 {
-       extern void appserver_die(int code);
+       extern void appserver_die(uintptr_t code);
        appserver_die(0);
        while(1);
 }