CSR: Access checks on Debug CSRs

- The RISC-V Debug Spec v.0.13.2 (p.41) mandates that the core
    debug CSRs dcsr, dpc, dscratch0 and dscratch1 must not be
    accessible if not in debug mode. Fixes #275
This commit is contained in:
Rahul Behl 2019-08-30 21:10:31 +05:30 committed by Philipp Wagner
parent 892ad8a621
commit 9b51b1143a
5 changed files with 28 additions and 6 deletions

View file

@ -69,9 +69,9 @@ lint_off -msg UNUSED -file "*/rtl/ibex_core.sv" -lines 201
// Signal unoptimizable: Feedback to clock or circular logic: // Signal unoptimizable: Feedback to clock or circular logic:
// ibex_core.id_stage_i.controller_i.ctrl_fsm_cs // ibex_core.id_stage_i.controller_i.ctrl_fsm_cs
// Issue lowrisc/ibex#211 // Issue lowrisc/ibex#211
lint_off -msg UNOPTFLAT -file "*/rtl/ibex_controller.sv" -lines 97 lint_off -msg UNOPTFLAT -file "*/rtl/ibex_controller.sv" -lines 98
// Signal unoptimizable: Feedback to clock or circular logic: // Signal unoptimizable: Feedback to clock or circular logic:
// ibex_core.cs_registers_i.mie_q // ibex_core.cs_registers_i.mie_q
// Issue lowrisc/ibex#212 // Issue lowrisc/ibex#212
lint_off -msg UNOPTFLAT -file "*/rtl/ibex_cs_registers.sv" -lines 149 lint_off -msg UNOPTFLAT -file "*/rtl/ibex_cs_registers.sv" -lines 150

View file

@ -65,6 +65,7 @@ module ibex_controller (
input logic debug_req_i, input logic debug_req_i,
output ibex_pkg::dbg_cause_e debug_cause_o, output ibex_pkg::dbg_cause_e debug_cause_o,
output logic debug_csr_save_o, output logic debug_csr_save_o,
output logic debug_mode_o,
input logic debug_single_step_i, input logic debug_single_step_i,
input logic debug_ebreakm_i, input logic debug_ebreakm_i,
@ -537,6 +538,9 @@ module ibex_controller (
endcase endcase
end end
// signal to CSR when in debug mode
assign debug_mode_o = debug_mode_q;
/////////////////// ///////////////////
// Stall control // // Stall control //
/////////////////// ///////////////////

View file

@ -201,6 +201,7 @@ module ibex_core #(
priv_lvl_e priv_mode; priv_lvl_e priv_mode;
// debug mode and dcsr configuration // debug mode and dcsr configuration
logic debug_mode;
dbg_cause_e debug_cause; dbg_cause_e debug_cause;
logic debug_csr_save; logic debug_csr_save;
logic debug_single_step; logic debug_single_step;
@ -436,6 +437,7 @@ module ibex_core #(
.irq_nm_i ( irq_nm_i ), .irq_nm_i ( irq_nm_i ),
// Debug Signal // Debug Signal
.debug_mode_o ( debug_mode ),
.debug_cause_o ( debug_cause ), .debug_cause_o ( debug_cause ),
.debug_csr_save_o ( debug_csr_save ), .debug_csr_save_o ( debug_csr_save ),
.debug_req_i ( debug_req_i ), .debug_req_i ( debug_req_i ),
@ -600,6 +602,7 @@ module ibex_core #(
// debug // debug
.csr_depc_o ( csr_depc ), .csr_depc_o ( csr_depc ),
.debug_mode_i ( debug_mode ),
.debug_cause_i ( debug_cause ), .debug_cause_i ( debug_cause ),
.debug_csr_save_i ( debug_csr_save ), .debug_csr_save_i ( debug_csr_save ),
.debug_single_step_o ( debug_single_step ), .debug_single_step_o ( debug_single_step ),

View file

@ -57,6 +57,7 @@ module ibex_cs_registers #(
output logic [33:0] csr_pmp_addr_o [PMPNumRegions], output logic [33:0] csr_pmp_addr_o [PMPNumRegions],
// debug // debug
input logic debug_mode_i,
input ibex_pkg::dbg_cause_e debug_cause_i, input ibex_pkg::dbg_cause_e debug_cause_i,
input logic debug_csr_save_i, input logic debug_csr_save_i,
output logic [31:0] csr_depc_o, output logic [31:0] csr_depc_o,
@ -292,10 +293,22 @@ module ibex_cs_registers #(
CSR_PMPADDR14: csr_rdata_int = pmp_addr_rdata[14]; CSR_PMPADDR14: csr_rdata_int = pmp_addr_rdata[14];
CSR_PMPADDR15: csr_rdata_int = pmp_addr_rdata[15]; CSR_PMPADDR15: csr_rdata_int = pmp_addr_rdata[15];
CSR_DCSR: csr_rdata_int = dcsr_q; CSR_DCSR: begin
CSR_DPC: csr_rdata_int = depc_q; csr_rdata_int = dcsr_q;
CSR_DSCRATCH0: csr_rdata_int = dscratch0_q; illegal_csr = ~debug_mode_i;
CSR_DSCRATCH1: csr_rdata_int = dscratch1_q; end
CSR_DPC: begin
csr_rdata_int = depc_q;
illegal_csr = ~debug_mode_i;
end
CSR_DSCRATCH0: begin
csr_rdata_int = dscratch0_q;
illegal_csr = ~debug_mode_i;
end
CSR_DSCRATCH1: begin
csr_rdata_int = dscratch1_q;
illegal_csr = ~debug_mode_i;
end
// machine counter/timers // machine counter/timers
CSR_MCOUNTINHIBIT: csr_rdata_int = mcountinhibit; CSR_MCOUNTINHIBIT: csr_rdata_int = mcountinhibit;

View file

@ -100,6 +100,7 @@ module ibex_id_stage #(
input logic lsu_store_err_i, input logic lsu_store_err_i,
// Debug Signal // Debug Signal
output logic debug_mode_o,
output ibex_pkg::dbg_cause_e debug_cause_o, output ibex_pkg::dbg_cause_e debug_cause_o,
output logic debug_csr_save_o, output logic debug_csr_save_o,
input logic debug_req_i, input logic debug_req_i,
@ -439,6 +440,7 @@ module ibex_id_stage #(
.csr_mtval_o ( csr_mtval_o ), .csr_mtval_o ( csr_mtval_o ),
// Debug Signal // Debug Signal
.debug_mode_o ( debug_mode_o ),
.debug_cause_o ( debug_cause_o ), .debug_cause_o ( debug_cause_o ),
.debug_csr_save_o ( debug_csr_save_o ), .debug_csr_save_o ( debug_csr_save_o ),
.debug_req_i ( debug_req_i ), .debug_req_i ( debug_req_i ),