aboutsummaryrefslogtreecommitdiff
path: root/machine/mtrap.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-03-09 23:58:17 -0800
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-03-09 23:58:17 -0800
commitb94c7a4b07f96f24ae7411780abf874416549f7b (patch)
treeb94ca015e49392f52e5abf1209ee184fcf874db4 /machine/mtrap.h
parentf5a96732cb81571a3ba6b081b8556187d564f678 (diff)
downloadriscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.zip
riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.gz
riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.bz2
Refactor pk, bbl, machine into separate libraries
Yuck.
Diffstat (limited to 'machine/mtrap.h')
-rw-r--r--machine/mtrap.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/machine/mtrap.h b/machine/mtrap.h
new file mode 100644
index 0000000..139f359
--- /dev/null
+++ b/machine/mtrap.h
@@ -0,0 +1,96 @@
+#ifndef _RISCV_MTRAP_H
+#define _RISCV_MTRAP_H
+
+#include "encoding.h"
+
+#ifdef __riscv_atomic
+# define MAX_HARTS 8 // arbitrary
+#else
+# define MAX_HARTS 1
+#endif
+
+#ifndef __ASSEMBLER__
+
+#include "sbi.h"
+#include <stdint.h>
+
+#define read_const_csr(reg) ({ unsigned long __tmp; \
+ asm ("csrr %0, " #reg : "=r"(__tmp)); \
+ __tmp; })
+
+static inline int supports_extension(char ext)
+{
+ return read_const_csr(misa) & (1 << (ext - 'A'));
+}
+
+static inline int xlen()
+{
+ return read_const_csr(misa) < 0 ? 64 : 32;
+}
+
+extern uintptr_t first_free_paddr;
+extern uintptr_t mem_size;
+extern uint32_t num_harts;
+
+typedef uintptr_t csr_t; // TODO this might become uint128_t for RV128
+
+typedef struct {
+ volatile csr_t* csrs;
+ volatile int mipi_pending;
+ volatile int sipi_pending;
+ int console_ibuf;
+
+ uint64_t utime_delta;
+ uint64_t ucycle_delta;
+ uint64_t uinstret_delta;
+ uint64_t stime_delta;
+ uint64_t scycle_delta;
+ uint64_t sinstret_delta;
+} hls_t;
+
+#define IPI_SOFT 0x1
+#define IPI_FENCE_I 0x2
+#define IPI_SFENCE_VM 0x4
+
+#define MACHINE_STACK_TOP() ({ \
+ register uintptr_t sp asm ("sp"); \
+ (void*)((sp + RISCV_PGSIZE) & -RISCV_PGSIZE); })
+
+// hart-local storage, at top of stack
+#define HLS() ((hls_t*)(MACHINE_STACK_TOP() - HLS_SIZE))
+#define OTHER_HLS(id) ((hls_t*)((void*)HLS() + RISCV_PGSIZE * ((id) - read_const_csr(mhartid))))
+
+void hls_init(uint32_t hart_id, csr_t* csrs);
+void parse_config_string();
+void poweroff(void) __attribute((noreturn));
+void printm(const char* s, ...);
+void putstring(const char* s);
+#define assert(x) ({ if (!(x)) die("assertion failed: %s", #x); })
+#define die(str, ...) ({ printm("%s:%d: " str "\n", __FILE__, __LINE__, ##__VA_ARGS__); poweroff(); })
+#define printk(...) die("printk")
+
+void enter_supervisor_mode(void (*fn)(uintptr_t), uintptr_t stack)
+ __attribute__((noreturn));
+void boot_loader();
+void boot_other_hart();
+
+static inline void wfi()
+{
+ asm volatile ("wfi" ::: "memory");
+}
+
+#endif // !__ASSEMBLER__
+
+#define MACHINE_STACK_SIZE RISCV_PGSIZE
+#define MENTRY_FRAME_SIZE (INTEGER_CONTEXT_SIZE + SOFT_FLOAT_CONTEXT_SIZE \
+ + HLS_SIZE)
+
+#ifdef __riscv_hard_float
+# define SOFT_FLOAT_CONTEXT_SIZE 0
+#else
+# define SOFT_FLOAT_CONTEXT_SIZE (8 * 32)
+#endif
+#define HLS_SIZE 64
+#define INTEGER_CONTEXT_SIZE (32 * REGBYTES)
+
+#endif