Skip to content

Commit 055948c

Browse files
committed
tlb/page perm check: added support for Svade
1 parent 18a8bdb commit 055948c

3 files changed

Lines changed: 61 additions & 5 deletions

File tree

source_code/caches/page_perm_check.sv

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ always_comb begin
9999
fault_insn_page = access == ACCESS_INSN;
100100
end
101101
end
102+
// Svade
103+
// fault if accessed bit not set
104+
else if (~pte_perms.accessed) begin
105+
fault_load_page = access == ACCESS_LOAD;
106+
fault_store_page = access == ACCESS_STORE;
107+
fault_insn_page = access == ACCESS_INSN;
108+
end
109+
// Svade
110+
// fault if a store and dirty bit not set
111+
else if (access == ACCESS_STORE && ~pte_perms.dirty) begin
112+
fault_store_page = 1;
113+
end
102114
end
103115
end
104116
end

source_code/caches/tlb/tlb.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ module tlb #(
188188
if (IS_ITLB) begin
189189
assign access = ACCESS_INSN;
190190
end else begin
191-
assign access = prv_pipe_if.ex_mem_wen ? ACCESS_STORE : ACCESS_LOAD;
191+
assign access = prv_pipe_if.ex_mem_wen ? ACCESS_STORE : prv_pipe_if.ex_mem_ren ? ACCESS_LOAD : ACCESS_NONE;
192192
end
193193
endgenerate
194194

source_code/tb/tb_page_perm_check.sv

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
* - Fault -> U = 0, in U-Mode
3232
* - No Fault -> Level != 0, sv32 = 0, should NEVER EVER happen in RV32
3333
* - Fault -> Level != 0, sv32 = 1, pte_sv32.ppn[9:0] != 0
34+
* - Fault -> Access bit not set
3435
* - No Fault -> U = 1, in S-Mode, and mstatus.sum = 1
3536
* - No Fault -> U = 1, in U-Mode
3637
* - No Fault -> Level != 0, sv32 = 1, pte_sv32.ppn[9:0] == 0
@@ -56,6 +57,7 @@
5657
* - Fault -> R = 1, W = 0, X = 1
5758
* - No Fault -> R = 1, W = 1, X = 0
5859
* - No Fault -> R = 1, W = 1, X = 1
60+
* - Fault -> Dirty bit not set
5961
* Instructions:
6062
* - Fault -> R = 0, W = 0, X = 0
6163
* - No Fault -> R = 0, W = 0, X = 1
@@ -326,6 +328,25 @@ initial begin : MAIN
326328
complete_test();
327329

328330

331+
/**************************
332+
* Fault -> Access bit not set
333+
**************************/
334+
begin_test("All", "Fault -> Access bit not set");
335+
336+
// non test related inputs
337+
set_level('0);
338+
set_satp(1, '1, '1);
339+
set_priv_level(S_MODE);
340+
341+
// test related inputs
342+
set_pte('1, RWXV_PERMS, 0, 1);
343+
344+
// check outputs
345+
check_all_fault();
346+
347+
complete_test();
348+
349+
329350
/**************************
330351
* No Fault -> U = 1, in S-Mode, and mstatus.sum = 1
331352
**************************/
@@ -774,6 +795,25 @@ initial begin : MAIN
774795
complete_test();
775796

776797

798+
/**************************
799+
* Fault -> Dirty bit not set
800+
**************************/
801+
begin_test("Stores", "Fault -> Dirty bit not set");
802+
803+
// non test related inputs
804+
set_priv_level(S_MODE);
805+
set_level(0);
806+
set_satp(1, '1, '1);
807+
808+
// test related inputs
809+
set_pte('1, PAGE_PERM_VALID | PAGE_PERM_READ | PAGE_PERM_WRITE | PAGE_PERM_EXECUTE, 1, 0);
810+
811+
// check outputs
812+
check_store_fault();
813+
814+
complete_test();
815+
816+
777817
/**************************
778818
* Instructions:
779819
* Fault -> R = 0, W = 0, X = 0
@@ -968,11 +1008,15 @@ task set_access;
9681008
access = new_access;
9691009
endtask
9701010

971-
task set_pte;
972-
input logic [SV32_PPNLEN-1:0] new_ppn;
973-
input logic [9:0] new_perms;
1011+
task set_pte (
1012+
input logic [SV32_PPNLEN-1:0] new_ppn,
1013+
input logic [9:0] new_perms,
1014+
input logic set_accessed = 1,
1015+
input logic set_dirty = 1
1016+
);
1017+
9741018
pte_sv32.ppn = new_ppn;
975-
pte_sv32.perms = pte_perms_t'(new_perms);
1019+
pte_sv32.perms = pte_perms_t'(new_perms | (set_accessed ? PAGE_PERM_ACCESSED : 0) | (set_dirty ? PAGE_PERM_DIRTY : 0));
9761020
endtask
9771021

9781022
task set_priv_level;

0 commit comments

Comments
 (0)