aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor/sim3x.c
diff options
context:
space:
mode:
authorAlamy Liu <alamy.liu@gmail.com>2015-08-11 17:03:57 -0700
committerPaul Fertser <fercerpav@gmail.com>2015-11-27 10:38:22 +0000
commitbfba15a898ae8eb2086f8981fcabf1298ec5c761 (patch)
tree45a4939b52215d2f9ae743d643bbfe67a0983905 /src/flash/nor/sim3x.c
parent4b608d7fea61855b9a284c5a8e0a2fc167bd7d1f (diff)
downloadriscv-openocd-bfba15a898ae8eb2086f8981fcabf1298ec5c761.zip
riscv-openocd-bfba15a898ae8eb2086f8981fcabf1298ec5c761.tar.gz
riscv-openocd-bfba15a898ae8eb2086f8981fcabf1298ec5c761.tar.bz2
adi_v5: Fix wrong ap value
Problem dap->ap_current is register value, not field value. it restores invalid ap when it calls dap_ap_select(dap, ap_old) later. * assume the current ap is 1, dap->ap_current value would be (1 << 24). ap_old = dap->ap_current; <-- ap_old = 1<<24 = 0x1000000. ... dap_ap_select(dap, ap_old); <-- select 0x1000000, not 1. * All AP registers accessing fail afterwards. One of the reproducible case(s): CORE residents in AP >= 1 dap_lookup_cs_component() being used to find PE(*). In most cases, PE would be found in AP==0, hence the problem is hidden. When AP number is 1, dap->ap_current would have the value of 1<<24. Anyone get the AP value with dap->ap_current and resotre it later would select the wrong AP and all accessing later would fail. The ARM Versatile and/or FPGA would have better chance to provide this kind of environment that PE residents in AP>=1. As they have an 'umbrella' system at AP0, and main system at AP>=1. * PE: Processing Element. AKA Core. See ARM Glossary at http://infocenter.arm.com/help/topic/com.arm.doc.aeg0014g/ABCDEFGH.html Fix Use dap_ap_get_select() to get ap value. a. Retrieve current ap value by calling dap_ap_get_select(); src/flash/nor/kinetis.c src/target/arm_adi_v5.c b. The code is correct (dap->ap_current >> 24), but it's better to use dap_ap_get_select() so everything could be synchronized. src/flash/nor/sim3x.c Change-Id: I97b5a13a3fc5506cf287e299c6c35699374de74f Signed-off-by: Alamy Liu <alamy.liu@gmail.com> Reviewed-on: http://openocd.zylin.com/2935 Reviewed-by: Andreas Färber <afaerber@suse.de> Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
Diffstat (limited to 'src/flash/nor/sim3x.c')
-rw-r--r--src/flash/nor/sim3x.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/flash/nor/sim3x.c b/src/flash/nor/sim3x.c
index 2a87002..0a5906c 100644
--- a/src/flash/nor/sim3x.c
+++ b/src/flash/nor/sim3x.c
@@ -959,7 +959,7 @@ COMMAND_HANDLER(sim3x_mass_erase)
return ERROR_FAIL;
}
- const uint8_t origninal_ap = dap->ap_current >> 24;
+ const uint8_t origninal_ap = dap_ap_get_select(dap);
dap_ap_select(dap, SIM3X_AP);
ret = ap_read_register(dap, SIM3X_AP_ID, &val);
@@ -1017,7 +1017,7 @@ COMMAND_HANDLER(sim3x_lock)
return ERROR_FAIL;
}
} else {
- const uint8_t origninal_ap = dap->ap_current >> 24;
+ const uint8_t origninal_ap = dap_ap_get_select(dap);
dap_ap_select(dap, SIM3X_AP);
/* check SIM3X_AP_ID */