vmap: Use {map,unmap}_segment() helpers
[akaros.git] / kern / arch / riscv / arch.h
index 3f0f721..9e6a18a 100644 (file)
@@ -1,83 +1,84 @@
-#ifndef ROS_INC_ARCH_H
-#define ROS_INC_ARCH_H
+#pragma once
 
 #include <ros/arch/arch.h>
+#include <arch/mmu.h>
 #include <ros/common.h>
 #include <ros/arch/membar.h>
 #include <arch/riscv.h>
-#include <arch/trap.h>
-#include <arch/timer.h>
+#include <arch/time.h>
 
 /* Arch Constants */
-#define HW_CACHE_ALIGN 64
-#define IOAPIC_BASE    0xFFFFFFFF80000000 // upper 2GB reserved (see mmu_init)
+#define ARCH_CL_SIZE 64
 
 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));
        return t;
 }
 
-static __inline uint64_t 
-read_tsc_serialized(void)
+/* Continuing the poor tradition of x86 opcode functions... */
+static __inline uint64_t read_tscp(void)
+{
+       return read_tsc();
+}
+
+static __inline uint64_t read_tsc_serialized(void)
 {
-       uint64_t tsc;
-  mb();
-       tsc = read_tsc();
        mb();
-       return tsc;
+       return read_tsc();
+}
+
+static __inline uintptr_t enable_fp(void)
+{
+       return setpcr(PCR_SR, SR_EF);
 }
 
-static __inline void
-enable_irq(void)
+static __inline uintptr_t enable_irq(void)
 {
-  asm volatile("ei");
+       return setpcr(PCR_SR, SR_ET);
 }
 
-static __inline void
-disable_irq(void)
+static __inline uintptr_t disable_irq(void)
 {
-  asm volatile("di");
+       return clearpcr(PCR_SR, SR_ET);
 }
 
-static __inline int
-irq_is_enabled(void)
+static __inline void restore_irq(uintptr_t val)
 {
-  return mfpcr(PCR_SR) & SR_ET;
+       mtpcr(PCR_SR, val);
 }
 
-static __inline void
-enable_irqsave(int8_t* state)
+static __inline int irq_is_enabled(void)
+{
+       return mfpcr(PCR_SR) & SR_ET;
+}
+
+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
@@ -96,49 +97,38 @@ 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();
-       else 
+       else
                (*state)--;
 }
 
-static __inline void
-cpu_relax(void)
-{
-  for(int i = 0; i < 100; i++)
-         asm ("nop");
-}
-
-static __inline void
-cpu_halt(void)
+static __inline void cpu_relax(void)
 {
-  while(1);
+       // 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 0;
+       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;
 }
@@ -146,23 +136,39 @@ 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 cache_flush(void)
 {
 }
 
-static __inline void
-reboot(void)
+static __inline void reboot(void)
 {
-  extern void fesvr_die();
-       fesvr_die();
-       while(1);
+       extern void cputchar(int ch);
+       cputchar(0);
 }
 
-#endif /* !ROS_INC_ARCH_H */
+extern void cpu_halt(void);
+
+static inline void prefetch(void *addr)
+{
+}
+
+static inline void prefetchw(void *addr)
+{
+}
+
+/* Resets a stack pointer to sp, then calls f(arg) */
+static inline void __attribute__((noreturn))
+__reset_stack_pointer(void *arg, uintptr_t sp, void (*f)(void *))
+{
+       #error "implement me"
+}