aboutsummaryrefslogtreecommitdiff
path: root/machine
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-07-06 03:23:58 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-07-06 03:23:58 -0700
commitf6eff201069564ea01100d556b079f99e076dd09 (patch)
tree0b8932b0f1dd3dcf70ec86e972b91b2f97d2e5c0 /machine
parent8b41191ccdf19f08662e2eb674a2eddc717d5108 (diff)
downloadriscv-pk-f6eff201069564ea01100d556b079f99e076dd09.zip
riscv-pk-f6eff201069564ea01100d556b079f99e076dd09.tar.gz
riscv-pk-f6eff201069564ea01100d556b079f99e076dd09.tar.bz2
Udpate to new PTE format
Diffstat (limited to 'machine')
-rw-r--r--machine/encoding.h8
-rw-r--r--machine/unprivileged_memory.h4
-rw-r--r--machine/vm.h2
3 files changed, 4 insertions, 10 deletions
diff --git a/machine/encoding.h b/machine/encoding.h
index 2f52bdb..641954a 100644
--- a/machine/encoding.h
+++ b/machine/encoding.h
@@ -18,6 +18,7 @@
#define MSTATUS_XS 0x00018000
#define MSTATUS_MPRV 0x00020000
#define MSTATUS_PUM 0x00040000
+#define MSTATUS_MXR 0x00080000
#define MSTATUS_VM 0x1F000000
#define MSTATUS32_SD 0x80000000
#define MSTATUS64_SD 0x8000000000000000
@@ -128,13 +129,6 @@
#define PTE_D 0x080 // Dirty
#define PTE_SOFT 0x300 // Reserved for Software
-#define PTE_TYPE_TABLE 0x00
-#define PTE_TYPE_R 0x02
-#define PTE_TYPE_RW 0x06
-#define PTE_TYPE_X 0x08
-#define PTE_TYPE_RX 0x0A
-#define PTE_TYPE_RWX 0x0E
-
#define PTE_PPN_SHIFT 10
#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V)
diff --git a/machine/unprivileged_memory.h b/machine/unprivileged_memory.h
index d03cc5e..7ed9e7c 100644
--- a/machine/unprivileged_memory.h
+++ b/machine/unprivileged_memory.h
@@ -57,7 +57,7 @@ static uint32_t __attribute__((always_inline)) get_insn(uintptr_t mepc, uintptr_
"lw %[insn], (%[addr])\n"
"csrw mstatus, %[mstatus]"
: [mstatus] "+&r" (__mstatus), [insn] "=&r" (val)
- : [mprv] "r" (MSTATUS_MPRV), [addr] "r" (__mepc));
+ : [mprv] "r" (MSTATUS_MPRV | MSTATUS_MXR), [addr] "r" (__mepc));
#else
uintptr_t rvc_mask = 3, tmp;
asm ("csrrs %[mstatus], mstatus, %[mprv]\n"
@@ -69,7 +69,7 @@ static uint32_t __attribute__((always_inline)) get_insn(uintptr_t mepc, uintptr_
"add %[insn], %[insn], %[tmp]\n"
"1: csrw mstatus, %[mstatus]"
: [mstatus] "+&r" (__mstatus), [insn] "=&r" (val), [tmp] "=&r" (tmp)
- : [mprv] "r" (MSTATUS_MPRV), [addr] "r" (__mepc),
+ : [mprv] "r" (MSTATUS_MPRV | MSTATUS_MXR), [addr] "r" (__mepc),
[rvc_mask] "r" (rvc_mask));
#endif
*mstatus = __mstatus;
diff --git a/machine/vm.h b/machine/vm.h
index f51c639..dd9bf59 100644
--- a/machine/vm.h
+++ b/machine/vm.h
@@ -29,7 +29,7 @@ static inline pte_t pte_create(uintptr_t ppn, int type)
static inline pte_t ptd_create(uintptr_t ppn)
{
- return pte_create(ppn, PTE_TYPE_TABLE);
+ return pte_create(ppn, PTE_V);
}
#endif