summaryrefslogtreecommitdiff
path: root/src/target/target.c
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2010-04-04 00:42:05 -0700
committerDavid Brownell <dbrownell@users.sourceforge.net>2010-04-04 00:42:05 -0700
commit876bf9bf4cd5fc2640d91811fb69c0d36f9e2c18 (patch)
tree5baff955b5886bd71d66bc950677448d672182a0 /src/target/target.c
parent88fcb5a9ef971e54166de7cd16a3b0be20113b82 (diff)
downloadopenocd_libswd-876bf9bf4cd5fc2640d91811fb69c0d36f9e2c18.tar.gz
openocd_libswd-876bf9bf4cd5fc2640d91811fb69c0d36f9e2c18.tar.bz2
openocd_libswd-876bf9bf4cd5fc2640d91811fb69c0d36f9e2c18.tar.xz
openocd_libswd-876bf9bf4cd5fc2640d91811fb69c0d36f9e2c18.zip
target: are we running algorithm code?
Fixing one bug can easily uncover another .... in this case, making sure that we properly invalidate some cached NOR state when resuming arbitrary target code turned up an issue when the code wasn't quite arbitrary (and we couldn't know that, but some parts of OpenOCD assumed the cache would not be invalidated. Specifically: some flash drivers (like CFI) update that state in loops with downloaded algorithms, thus invalidating the state as it's probed. + Add a new target state flag, to record whether the target is running downloaded algorithm code. + Use that flag to add a special case: "trust" downloaded algorithms not to corrupt that cached state, bypassing cache invalidation. Also update some of the documentation to stipulate that this flavor of trustworthiness is now *required* ... not just a fortuitous acident. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src/target/target.c')
-rw-r--r--src/target/target.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/target/target.c b/src/target/target.c
index 75c41d38..286933f4 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -478,9 +478,14 @@ int target_resume(struct target *target, int current, uint32_t address, int hand
* themselves. We want flash drivers and infrastructure to
* be able to rely on (non-invalidated) cached state.
*
+ * For now we require that algorithms provided by OpenOCD are
+ * used only by code which properly maintains that cached state.
+ * state
+ *
* REVISIT do the same for NAND ; maybe other flash flavors too...
*/
- nor_resume(target);
+ if (!target->running_alg)
+ nor_resume(target);
return retval;
}
@@ -659,10 +664,12 @@ int target_run_algorithm(struct target *target,
goto done;
}
+ target->running_alg = true;
retval = target->type->run_algorithm(target,
num_mem_params, mem_params,
num_reg_params, reg_param,
entry_point, exit_point, timeout_ms, arch_info);
+ target->running_alg = false;
done:
return retval;