19f219f731
This patch might influence openocd Tcl commands behaviour in subtle ways, please give it a nice testing. The idea is that if an OpenOCD Tcl command returns an error, an exception is raised, and then the return code is propogated all the way up (or to the "catch" if present). This allows to detect "shutdown" which is not actually an error but has to raise an exception to stop execution of the commands that follow it in the script. openocd_thread special-cases shutdown because it should then terminate OpenOCD with a success error code, unless shutdown was called with an optional "error" argument which means terminate with a non-zero exit code. Change-Id: I7b6fa8a2e24c947dc45d8def0008b4b007c478b3 Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-on: http://openocd.zylin.com/2600 Tested-by: jenkins Reviewed-by: Juha Niskanen <juha.niskanen@haltian.com> Reviewed-by: Jens Bauer <jens@gpio.dk> Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
67 lines
1.8 KiB
Tcl
67 lines
1.8 KiB
Tcl
# Defines basic Tcl procs that must exist for OpenOCD scripts to work.
|
|
#
|
|
# Embedded into OpenOCD executable
|
|
#
|
|
|
|
|
|
# We need to explicitly redirect this to the OpenOCD command
|
|
# as Tcl defines the exit proc
|
|
proc exit {} {
|
|
ocd_throw exit
|
|
}
|
|
|
|
# All commands are registered with an 'ocd_' prefix, while the "real"
|
|
# command is a wrapper that calls this function. Its primary purpose is
|
|
# to discard 'handler' command output,
|
|
proc ocd_bouncer {name args} {
|
|
set cmd [format "ocd_%s" $name]
|
|
set type [eval ocd_command type $cmd $args]
|
|
set errcode error
|
|
if {$type == "native"} {
|
|
return [eval $cmd $args]
|
|
} else {if {$type == "simple"} {
|
|
set errcode [catch {eval $cmd $args}]
|
|
if {$errcode == 0} {
|
|
return ""
|
|
} else {
|
|
# 'classic' commands output error message as part of progress output
|
|
set errmsg ""
|
|
}
|
|
} else {if {$type == "group"} {
|
|
catch {eval ocd_usage $name $args}
|
|
set errmsg [format "%s: command requires more arguments" \
|
|
[concat $name " " $args]]
|
|
} else {
|
|
set errmsg [format "invalid subcommand \"%s\"" $args]
|
|
}}}
|
|
return -code $errcode $errmsg
|
|
}
|
|
|
|
# Try flipping / and \ to find file if the filename does not
|
|
# match the precise spelling
|
|
proc find {filename} {
|
|
if {[catch {ocd_find $filename} t]==0} {
|
|
return $t
|
|
}
|
|
if {[catch {ocd_find [string map {\ /} $filename} t]==0} {
|
|
return $t
|
|
}
|
|
if {[catch {ocd_find [string map {/ \\} $filename} t]==0} {
|
|
return $t
|
|
}
|
|
# make sure error message matches original input string
|
|
return -code error "Can't find $filename"
|
|
}
|
|
add_usage_text find "<file>"
|
|
add_help_text find "print full path to file according to OpenOCD search rules"
|
|
|
|
# Find and run a script
|
|
proc script {filename} {
|
|
uplevel #0 [list source [find $filename]]
|
|
}
|
|
add_help_text script "filename of OpenOCD script (tcl) to run"
|
|
add_usage_text script "<file>"
|
|
|
|
#########
|
|
|