VMM: Clean up per-cpu VMCS state
[akaros.git] / kern / arch / riscv / arch.h
index dce737d..db28f28 100644 (file)
@@ -1,5 +1,4 @@
-#ifndef ROS_INC_ARCH_H
-#define ROS_INC_ARCH_H
+#pragma once
 
 #include <ros/arch/arch.h>
 #include <arch/mmu.h>
 /* Arch Constants */
 #define ARCH_CL_SIZE 64
 
-#ifdef __riscv64
-# define KERN64
-#endif
-
 void print_cpuinfo(void);
-void show_mapping(uintptr_t start, size_t size);
+void show_mapping(pgdir_t pgdir, uintptr_t start, size_t size);
 void backtrace(void);
 
-static __inline void
-breakpoint(void)
+static __inline void breakpoint(void)
 {
        asm volatile ("break");
 }
 
-static __inline void
-tlbflush(void)
+static __inline void tlbflush(void)
 {
        lcr3(rcr3());
 }
 
-static __inline void 
-invlpg(void *addr)
+static __inline void invlpg(void *addr)
 { 
        tlbflush();
 }
 
-static __inline void
-icache_flush_page(void* va, void* kva)
+static __inline void icache_flush_page(void* va, void* kva)
 {
        asm volatile ("fence.i");
 }
 
-static __inline uint64_t
-read_tsc(void)
+static __inline uint64_t read_tsc(void)
 {
        unsigned long t;
        asm volatile ("rdtime %0" : "=r"(t));
@@ -52,51 +42,43 @@ read_tsc(void)
 }
 
 /* Continuing the poor tradition of x86 opcode functions... */
-static __inline uint64_t
-read_tscp(void)
+static __inline uint64_t read_tscp(void)
 {
        return read_tsc();
 }
 
-static __inline uint64_t 
-read_tsc_serialized(void)
+static __inline uint64_t read_tsc_serialized(void)
 {
        mb();
        return read_tsc();
 }
 
-static __inline uintptr_t
-enable_fp(void)
+static __inline uintptr_t enable_fp(void)
 {
        return setpcr(PCR_SR, SR_EF);
 }
 
-static __inline uintptr_t
-enable_irq(void)
+static __inline uintptr_t enable_irq(void)
 {
        return setpcr(PCR_SR, SR_ET);
 }
 
-static __inline uintptr_t
-disable_irq(void)
+static __inline uintptr_t disable_irq(void)
 {
        return clearpcr(PCR_SR, SR_ET);
 }
 
-static __inline void
-restore_irq(uintptr_t val)
+static __inline void restore_irq(uintptr_t val)
 {
        mtpcr(PCR_SR, val);
 }
 
-static __inline int
-irq_is_enabled(void)
+static __inline int irq_is_enabled(void)
 {
        return mfpcr(PCR_SR) & SR_ET;
 }
 
-static __inline void
-enable_irqsave(int8_t* state)
+static __inline void enable_irqsave(int8_t* state)
 {
        // *state tracks the number of nested enables and disables
        // initial value of state: 0 = first run / no favorite
@@ -115,8 +97,7 @@ enable_irqsave(int8_t* state)
                (*state)++;
 }
 
-static __inline void
-disable_irqsave(int8_t* state)
+static __inline void disable_irqsave(int8_t* state)
 {
        if ((*state == 0) && irq_is_enabled())
                disable_irq();
@@ -124,34 +105,30 @@ disable_irqsave(int8_t* state)
                (*state)--;
 }
 
-static __inline void
-cpu_relax(void)
+static __inline void cpu_relax(void)
 {
-  for(int i = 0; i < 100; i++)
-         asm ("nop");
+       // compute and use 0/0, which stalls Rocket for dozens of cycles
+       long scratch;
+       asm volatile ("div %0, zero, zero; move %0, %0" : "=r"(scratch));
 }
 
-static __inline void
-clflush(uintptr_t* addr)
+static __inline void clflush(uintptr_t* addr)
 {
 }
 
 /* os_coreid -> hw_coreid */
-static __inline int
-get_hw_coreid(int coreid)
+static __inline int get_hw_coreid(int coreid)
 {
-  return coreid;
+       return coreid;
 }
 
-static __inline int
-hw_core_id(void)
+static __inline int hw_core_id(void)
 {
-  return mfpcr(PCR_COREID);
+       return mfpcr(PCR_COREID);
 }
 
 /* hw_coreid -> os_coreid */
-static __inline int
-get_os_coreid(int hw_coreid)
+static __inline int get_os_coreid(int hw_coreid)
 {
        return hw_coreid;
 }
@@ -159,19 +136,21 @@ get_os_coreid(int hw_coreid)
 /* core_id() returns the OS core number, not to be confused with the
  * hardware-specific core identifier (such as the lapic id) returned by
  * hw_core_id() */
-static __inline int
-core_id(void)
+static __inline int core_id(void)
 {
        return get_os_coreid(hw_core_id());
 }
 
-static __inline void
-cache_flush(void)
+static __inline int core_id_early(void)
 {
+       return core_id();
 }
 
-static __inline void
-reboot(void)
+static __inline void cache_flush(void)
+{
+}
+
+static __inline void reboot(void)
 {
        extern void cputchar(int ch);
        cputchar(0);
@@ -179,4 +158,10 @@ reboot(void)
 
 extern void cpu_halt(void);
 
-#endif /* !ROS_INC_ARCH_H */
+static inline void prefetch(void *addr)
+{
+}
+
+static inline void prefetchw(void *addr)
+{
+}