summaryrefslogtreecommitdiff
path: root/rtl
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2022-12-16 22:20:01 -0600
committerAlejandro Soto <alejandro@34project.org>2022-12-16 22:20:26 -0600
commit9ebb4b712e1d6c97a999652d0b9105847eabd134 (patch)
tree0526b6d473ccb1652033613477ad1e8cae034c24 /rtl
parent17366ce06afe0a611ba25a47523c81b01c64961c (diff)
Implement mode privilege checks in MMU
Diffstat (limited to '')
-rw-r--r--rtl/core/arm810.sv2
-rw-r--r--rtl/core/mmu/mmu.sv3
-rw-r--r--rtl/core/mmu/pagewalk.sv4
-rw-r--r--rtl/core/psr.sv4
4 files changed, 8 insertions, 5 deletions
diff --git a/rtl/core/arm810.sv b/rtl/core/arm810.sv
index 569b973..c0e717f 100644
--- a/rtl/core/arm810.sv
+++ b/rtl/core/arm810.sv
@@ -89,7 +89,7 @@ module arm810
);
word cpsr_rd, spsr_rd, psr_wr;
- logic psr_write, psr_saved, update_flags, psr_wr_flags, psr_wr_control;
+ logic psr_write, psr_saved, update_flags, psr_wr_flags, psr_wr_control, privileged;
psr_mode mode;
psr_flags flags;
psr_intmask intmask;
diff --git a/rtl/core/mmu/mmu.sv b/rtl/core/mmu/mmu.sv
index d22f1cd..f8e808b 100644
--- a/rtl/core/mmu/mmu.sv
+++ b/rtl/core/mmu/mmu.sv
@@ -6,7 +6,8 @@ module core_mmu
input logic clk,
rst_n,
- input logic mmu_enable /*verilator public*/,
+ input logic privileged,
+ mmu_enable /*verilator public*/,
input mmu_base mmu_ttbr /*verilator public*/,
input word mmu_dac,
diff --git a/rtl/core/mmu/pagewalk.sv b/rtl/core/mmu/pagewalk.sv
index ce25b19..eb36580 100644
--- a/rtl/core/mmu/pagewalk.sv
+++ b/rtl/core/mmu/pagewalk.sv
@@ -6,7 +6,8 @@ module core_mmu_pagewalk
input logic clk,
rst_n,
- input logic mmu_enable,
+ input logic privileged,
+ mmu_enable,
input mmu_base mmu_ttbr,
input word mmu_dac,
@@ -56,7 +57,6 @@ module core_mmu_pagewalk
.write(hold_write),
.fault(access_fault),
.domain(entry_domain),
- .privileged(1), //TODO
.fault_type(access_fault_type),
.*
);
diff --git a/rtl/core/psr.sv b/rtl/core/psr.sv
index c1fe0fd..41982c0 100644
--- a/rtl/core/psr.sv
+++ b/rtl/core/psr.sv
@@ -17,7 +17,8 @@ module core_psr
output psr_intmask mask,
output psr_mode mode,
output word cpsr_rd,
- spsr_rd
+ spsr_rd,
+ output logic privileged
);
typedef struct packed
@@ -54,6 +55,7 @@ module core_psr
assign wr_word = psr_wr;
assign cpsr_rd = cpsr_word;
assign spsr_rd = spsr_word;
+ assign privileged = |mode[3:0]; // Not user
assign {wr_state.flags, wr_state.mask, wr_state.mode} = {wr_word.nzcv, wr_word.if_, wr_word.m};
`ifdef VERILATOR