+ global in_process_reset
+ if {$in_process_reset} {
+ set in_process_reset 0
+ return -code error "'reset' can not be invoked recursively"
+ }
+
+ set in_process_reset 1
+ set success [expr [catch {ocd_process_reset_inner $MODE} result]==0]
+ set in_process_reset 0
+
+ if {$success} {
+ return $result
+ } else {
+ return -code error $result
+ }
+}
+
+proc ocd_process_reset_inner { MODE } {
+ set targets [target names]
+
+ # If this target must be halted...
+ set halt -1
+ if { 0 == [string compare $MODE halt] } {
+ set halt 1
+ }
+ if { 0 == [string compare $MODE init] } {
+ set halt 1;
+ }
+ if { 0 == [string compare $MODE run ] } {
+ set halt 0;
+ }
+ if { $halt < 0 } {
+ return -error "Invalid mode: $MODE, must be one of: halt, init, or run";
+ }
+
+ # Target event handlers *might* change which TAPs are enabled
+ # or disabled, so we fire all of them. But don't issue any
+ # target "arp_*" commands, which may issue JTAG transactions,
+ # unless we know the underlying TAP is active.
+ #
+ # NOTE: ARP == "Advanced Reset Process" ... "advanced" is
+ # relative to a previous restrictive scheme