aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTommy Murphy <tommy_murphy@hotmail.com>2020-05-26 18:33:30 +0100
committerGitHub <noreply@github.com>2020-05-26 10:33:30 -0700
commit95a8cd9b5d07501ac2243c61f331b092b1ea9894 (patch)
tree2a20460816534b185ae6f91f3ba1b2ae2c91fe12 /src
parent4f9e2d7171f3cad8d1a99dff3eee5ec5e6d8ea2b (diff)
downloadriscv-openocd-95a8cd9b5d07501ac2243c61f331b092b1ea9894.zip
riscv-openocd-95a8cd9b5d07501ac2243c61f331b092b1ea9894.tar.gz
riscv-openocd-95a8cd9b5d07501ac2243c61f331b092b1ea9894.tar.bz2
Don't use MMU in M mode - https://github.com/riscv/riscv-openocd/issu… (#479)
* Don't use MMU in M mode - https://github.com/riscv/riscv-openocd/issues/474 * Updated code based on feedback from @timsifive
Diffstat (limited to 'src')
-rw-r--r--src/target/riscv/riscv.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 4c3f8fd..192b8c5 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -1383,15 +1383,34 @@ static int riscv_mmu(struct target *target, int *enabled)
if (riscv_rtos_enabled(target))
riscv_set_current_hartid(target, target->rtos->current_thread - 1);
- riscv_reg_t value;
- if (riscv_get_register(target, &value, GDB_REGNO_SATP) != ERROR_OK) {
+ /* Don't use MMU in explicit or effective M (machine) mode */
+ riscv_reg_t priv;
+ if (riscv_get_register(target, &priv, GDB_REGNO_PRIV) != ERROR_OK) {
+ LOG_ERROR("Failed to read priv register.");
+ return ERROR_FAIL;
+ }
+
+ riscv_reg_t mstatus;
+ if (riscv_get_register(target, &mstatus, GDB_REGNO_MSTATUS) != ERROR_OK) {
+ LOG_ERROR("Failed to read mstatus register.");
+ return ERROR_FAIL;
+ }
+
+ if ((get_field(mstatus, MSTATUS_MPRV) ? get_field(mstatus, MSTATUS_MPP) : priv) == PRV_M) {
+ LOG_DEBUG("SATP/MMU ignored in Machine mode (mstatus=0x%" PRIx64 ").", mstatus);
+ *enabled = 0;
+ return ERROR_OK;
+ }
+
+ riscv_reg_t satp;
+ if (riscv_get_register(target, &satp, GDB_REGNO_SATP) != ERROR_OK) {
LOG_DEBUG("Couldn't read SATP.");
/* If we can't read SATP, then there must not be an MMU. */
*enabled = 0;
return ERROR_OK;
}
- if (get_field(value, RISCV_SATP_MODE(riscv_xlen(target))) == SATP_MODE_OFF) {
+ if (get_field(satp, RISCV_SATP_MODE(riscv_xlen(target))) == SATP_MODE_OFF) {
LOG_DEBUG("MMU is disabled.");
*enabled = 0;
} else {