aboutsummaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-11-12 15:27:01 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2021-03-10 21:32:43 +0000
commitfaaa42283f5c06830fe997b80d6c64f6469c6cf0 (patch)
treee767a9c608c791a069f19ad5097a25b1f2a8892d /src/target
parent47fa000193a6de7c374b4cae075ddaae3917a0e4 (diff)
downloadriscv-openocd-faaa42283f5c06830fe997b80d6c64f6469c6cf0.zip
riscv-openocd-faaa42283f5c06830fe997b80d6c64f6469c6cf0.tar.gz
riscv-openocd-faaa42283f5c06830fe997b80d6c64f6469c6cf0.tar.bz2
stlink: fix execution order in stlink_config_trace()
The change [1] guarantees that the value pointed by 'prescaler' gets always set, even when the adapter does not support the specific mode requested (e.g. sync), or during trace disabling. This works fine with the code in armv7m_trace_tpiu_config(), but requires all the parameters to be valid also to disable the trace (with 'enable==false'), otherwise returns error on incorrect parameters or even causes segmentation fault if pointers 'trace_freq' or 'prescaler' are NULL. Another problem in stlink_config_trace(), not linked with [1], is caused by a tentative to change the settings on an already enabled trace; the trace is disabled before the new parameters are fully validated and in case of invalid parameters the trace is not re-enabled. It would be more logical to first check all the parameters, then disable the trace, change the settings and re-enable the trace. Practically revert [1] by checking 'enable==false' at function entry, then disable trace and exit without any further check on the other parameters. For the case 'enable==true', validate all the function parameters then disable the trace, update the trace settings and re-enable the trace. Modify the caller armv7m_trace_tpiu_config() to initialize the variable 'prescaler' to a safe value to avoid the issue targeted by [1]. [1] commit 38277fa75280 ("jtag/drivers/stlink_usb: fix SWO prescaler") Change-Id: Ia6530682162ca2c9f5ac64301f2456f70cc07ed2 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5934 Tested-by: jenkins Reviewed-by: Adrian M Negreanu <adrian.negreanu@nxp.com>
Diffstat (limited to 'src/target')
-rw-r--r--src/target/armv7m_trace.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/target/armv7m_trace.c b/src/target/armv7m_trace.c
index 32b48a7..adfef2e 100644
--- a/src/target/armv7m_trace.c
+++ b/src/target/armv7m_trace.c
@@ -87,7 +87,7 @@ int armv7m_trace_tpiu_config(struct target *target)
{
struct armv7m_common *armv7m = target_to_armv7m(target);
struct armv7m_trace_config *trace_config = &armv7m->trace_config;
- uint16_t prescaler;
+ uint16_t prescaler = TPIU_ACPR_MAX_SWOSCALER + 1;
int retval;
target_unregister_timer_callback(armv7m_poll_trace, target);