openocd/src/helper
Antonio Borneo 334552bc83 helper/startup.tcl: fix execution stack frame of wrapped commands
The OpenOCD commands that have been wrapped with 'ocd_bouncer' are
executed within two levels of nested proc's:
	# see register_command_handler() in src/helper/command.c
	proc my_command {args} {eval ocd_bouncer my_command $args}

	# see ocd_bouncer in src/helper/startup.tcl
	proc ocd_bouncer {name args} {
		... [eval ocd_my_command $args] ...
	}
This causes the stack frame of 'ocd_my_command' to be the same one
of proc 'ocd_bouncer', thus two levels below the stack frame of the
caller of 'my_command'. This is an issue with commands that receive
a variable by name and have to resolve them to access the value.

E.g. the command
	<target> mem2array arrayname bitwidth address count
is wrapped; it receives the name of the array but fails to resolve
it in the current stack frame. Instead, the commands
	mem2array arrayname bitwidth address count
	ocd_<target> mem2array arrayname bitwidth address count
are not wrapped and can directly access the array because they share
the same stack frame of the caller.
Same situation with the symmetric commands 'array2mem'.

How to test:
within a telnet connection, run the following set of commands,
eventually replacing the address 0x08000000 with a valid readable
address of your <target>,
	unset -nocomplain v1 v2 v3
	info vars v?
	mem2array v1 32 0x08000000 1
	<target> mem2array v2 32 0x08000000 1
	ocd_<target> mem2array v3 32 0x08000000 1
	info vars v?
and notice that only v1 and v3 are now allocated. The array v2 has
been allocated in the temporarily stack frame of proc ocd_bouncer,
together with its local variables, and then lost when proc ended.

Fixed by executing the wrapped commands with the command 'uplevel'
instead of 'eval'. The amount of levels to skip is checked to avoid
errors in the unusual case 'ocd_bouncer' is called directly without
the first level of wrapper.

Change-Id: Iff90fb8921faf9b5ab04f61062a530578cc20d78
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/4731
Tested-by: jenkins
Reviewed-by: Christopher Head <chead@zaber.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
2018-12-15 07:18:13 +00:00
..
bin2char.sh Fix some problems with the bin2char utility 2014-08-02 09:01:32 +00:00
binarybuffer.c helper: Code cleanup for hexify() 2016-12-08 12:34:53 +00:00
binarybuffer.h helper: Code cleanup for hexify() 2016-12-08 12:34:53 +00:00
command.c target: use correct target in target-prefixed commands and event handlers 2018-03-03 08:40:09 +00:00
command.h helper/command.h: Add missing #include for target_addr_t 2018-03-07 23:45:40 +00:00
configuration.c helper/configuration: free script_search_dirs and config_file_names 2018-03-07 23:47:31 +00:00
configuration.h helper/configuration: free script_search_dirs and config_file_names 2018-03-07 23:47:31 +00:00
fileio.c Handle improperly build image files gracefully 2018-02-14 08:27:01 +00:00
fileio.h Handle improperly build image files gracefully 2018-02-14 08:27:01 +00:00
ioutil_stubs.c Remove FSF address from GPL notices 2016-05-24 22:30:01 +01:00
ioutil.c Remove FSF address from GPL notices 2016-05-24 22:30:01 +01:00
ioutil.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
jep106.c Remove FSF address from GPL notices 2016-05-24 22:30:01 +01:00
jep106.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
jep106.inc helper: Update jep106 database to JEP106AT 2016-12-08 12:30:14 +00:00
jim-nvp.c jim-nvp: Make Jim_GetOpt_String const-correct 2016-02-29 20:32:31 +00:00
jim-nvp.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
list.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
log.c helper/log: remove dead code in log_forward() 2018-12-11 13:26:05 +00:00
log.h Add RISC-V support. 2018-07-24 13:07:26 +01:00
Makefile.am helper,rtos,server: Restore missing warning flags 2017-01-15 10:16:16 +00:00
options.c helper/options: Add missing #include for MinGW and MSYS2 2017-10-03 11:18:20 +01:00
replacements.c Remove FSF address from GPL notices 2016-05-24 22:30:01 +01:00
replacements.h helper/replacements.h: Add missing #include 2018-03-07 23:43:58 +00:00
startup.tcl helper/startup.tcl: fix execution stack frame of wrapped commands 2018-12-15 07:18:13 +00:00
system.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
time_support_common.c Fix usage of timeval_ms() 2016-07-19 10:45:16 +01:00
time_support.c Add timeval_compare helper function 2018-01-25 16:43:45 +00:00
time_support.h Add timeval_compare helper function 2018-01-25 16:43:45 +00:00
types.h helper/types: cast to uint32_t,uint16_t to avoid UB by shifting int too far 2018-03-12 14:12:07 +00:00
update_jep106.pl helper: Add converter from JEP106 ID to manufacturer name 2016-01-22 15:02:16 +00:00
util.c Remove FSF address from GPL notices 2016-05-24 22:30:01 +01:00
util.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00