aboutsummaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-01-08 00:04:14 +1000
committerStewart Smith <stewart@linux.ibm.com>2019-02-12 15:08:17 +1100
commit57610a3681bcc2c6794459d98861e613756e8e83 (patch)
treea07272d7f3927a628e144ca13073ba91e02fec15 /external
parentd27180b55d7740a711f2a6417eed02782a1cd536 (diff)
downloadskiboot-57610a3681bcc2c6794459d98861e613756e8e83.zip
skiboot-57610a3681bcc2c6794459d98861e613756e8e83.tar.gz
skiboot-57610a3681bcc2c6794459d98861e613756e8e83.tar.bz2
external/mambo: allow CPU targeting for most debug utils
Debug util functions target CPU 0:0:0 by default Some can be overidden explicitly per invocation, and others can't at all. Even for those that can be overidden, it is a pain to type them out when you're debugging a particular thread. Provide a new 'target' function that allows the default CPU target to be changed. Wire that up that default to all other utils. Provide a new 'S' step command which only steps the target CPU. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'external')
-rw-r--r--external/mambo/mambo_utils.tcl326
1 files changed, 229 insertions, 97 deletions
diff --git a/external/mambo/mambo_utils.tcl b/external/mambo/mambo_utils.tcl
index ce5bccc..1218855 100644
--- a/external/mambo/mambo_utils.tcl
+++ b/external/mambo/mambo_utils.tcl
@@ -1,25 +1,49 @@
#
# behave like gdb
#
-proc p { reg { t 0 } { c 0 } } {
+set target_t 0
+set target_c 0
+set target_p 0
+
+proc target { { t 0 } { c 0 } { p 0 } } {
+ global target_t
+ global target_c
+ global target_p
+
+ set target_t $t
+ set target_c $c
+ set target_p $p
+
+ return "targeting cpu $p:$c:$t"
+}
+
+proc p { reg { t -1 } { c -1 } { p -1 } } {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
switch -regexp $reg {
^r$ {
- set val [mysim cpu $c thread $t display gprs]
+ set val [mysim cpu $p:$c:$t display gprs]
}
^r[0-9]+$ {
regexp "r(\[0-9\]*)" $reg dummy num
- set val [mysim cpu $c thread $t display gpr $num]
+ set val [mysim cpu $p:$c:$t display gpr $num]
}
^f[0-9]+$ {
regexp "f(\[0-9\]*)" $reg dummy num
- set val [mysim cpu $c thread $t display fpr $num]
+ set val [mysim cpu $p:$c:$t display fpr $num]
}
^v[0-9]+$ {
regexp "v(\[0-9\]*)" $reg dummy num
- set val [mysim cpu $c thread $t display vmxr $num]
+ set val [mysim cpu $p:$c:$t display vmxr $num]
}
default {
- set val [mysim cpu $c thread $t display spr $reg]
+ set val [mysim cpu $p:$c:$t display spr $reg]
}
}
@@ -29,22 +53,30 @@ proc p { reg { t 0 } { c 0 } } {
#
# behave like gdb
#
-proc sr { reg val {t 0}} {
+proc sr { reg val { t -1} { c -1 } { p -1 } } {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
switch -regexp $reg {
^r[0-9]+$ {
regexp "r(\[0-9\]*)" $reg dummy num
- mysim cpu 0:$t set gpr $num $val
+ mysim cpu $p:$c:$t set gpr $num $val
}
^f[0-9]+$ {
regexp "f(\[0-9\]*)" $reg dummy num
- mysim cpu 0:$t set fpr $num $val
+ mysim cpu $p:$c:$t set fpr $num $val
}
^v[0-9]+$ {
regexp "v(\[0-9\]*)" $reg dummy num
- mysim cpu 0:$t set vmxr $num $val
+ mysim cpu $p:$c:$t set vmxr $num $val
}
default {
- mysim cpu 0:$t set spr $reg $val
+ mysim cpu $p:$c:$t set spr $reg $val
}
}
p $reg $t
@@ -78,16 +110,32 @@ proc c { } {
mysim go
}
-proc i { pc { t 0 } { c 0 } } {
- set pc_laddr [mysim cpu $c util itranslate $pc]
- set inst [mysim cpu $c memory display $pc_laddr 4]
- set disasm [mysim cpu $c util ppc_disasm $inst $pc]
- return "\[$c:$t\]: $pc ($pc_laddr) Enc:$inst : $disasm"
+proc i { pc { t -1 } { c -1 } { p -1 } } {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
+ set pc_laddr [mysim cpu $p:$c:$t util itranslate $pc]
+ set inst [mysim cpu $p:$c:$t memory display $pc_laddr 4]
+ set disasm [mysim cpu $p:$c:$t util ppc_disasm $inst $pc]
+ return "\[$p:$c:$t\]: $pc ($pc_laddr) Enc:$inst : $disasm"
}
-proc ipc { {t 0} {c 0}} {
- set pc [mysim cpu $c thread $t display spr pc]
- i $pc $t $c
+proc ipc { { t -1 } { c -1 } { p -1 } } {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
+ set pc [mysim cpu $p:$c:$t display spr pc]
+ i $pc $t $c $p
}
proc ipca { } {
@@ -120,6 +168,17 @@ proc s { {nr 1} } {
}
}
+proc S { {nr 1} } {
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ for { set i 0 } { $i < $nr } { incr i 1 } {
+ mysim cpu $p:$c:$t step 1
+ puts [ipc]
+ }
+}
+
proc z { count } {
while { $count > 0 } {
s
@@ -136,7 +195,11 @@ proc sample_pc { sample count } {
}
proc e2p { ea } {
- set pa [ mysim util dtranslate $ea ]
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ set pa [ mysim cpu $p:$c:$t util dtranslate $ea ]
puts "$pa"
}
@@ -146,14 +209,26 @@ proc x { pa { size 8 } } {
}
proc it { ea } {
- mysim util itranslate $ea
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ mysim cpu $p:$c:$t util itranslate $ea
}
proc dt { ea } {
- mysim util dtranslate $ea
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ mysim cpu $p:$c:$t util dtranslate $ea
}
proc ex { ea { size 8 } } {
- set pa [ mysim util dtranslate $ea ]
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ set pa [ mysim cpu $p:$c:$t util dtranslate $ea ]
set val [ mysim memory display $pa $size ]
puts "$pa : $val"
}
@@ -212,22 +287,42 @@ proc p_str { addr { limit 0 } } {
}
proc slbv {} {
- puts [mysim cpu 0 display slb valid]
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ puts [mysim cpu $p:$c:$t display slb valid]
}
-proc regs { { t 0 } { c 0 } } {
+proc regs { { t -1 } { c -1 } { p -1 }} {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
puts "GPRS:"
- puts [mysim cpu $c thread $t display gprs]
+ puts [mysim cpu $p:$c:$t display gprs]
}
-proc tlbv { { c 0 } } {
- puts "$c:TLB: ----------------------"
- puts [mysim cpu $c display tlb valid]
+proc tlbv {} {
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ puts "$p:$c:$t:TLB: ----------------------"
+ puts [mysim cpu $p:$c:$t display tlb valid]
}
-proc exc { { i SystemReset } { c 0 } } {
- puts "$c:EXCEPTION:$i"
- puts [mysim cpu $c interrupt $i]
+proc exc { { i SystemReset } } {
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ puts "$p:$c:$t:EXCEPTION:$i"
+ puts [mysim cpu $p:$c:$t interrupt $i]
}
proc just_stop { args } {
@@ -236,13 +331,17 @@ proc just_stop { args } {
}
proc st { count } {
- set sp [mysim cpu 0 display gpr 1]
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ set sp [mysim cpu $p:$c:$t display gpr 1]
puts "SP: $sp"
ipc
- set lr [mysim cpu 0 display spr lr]
+ set lr [mysim cpu $p:$c:$t display spr lr]
i $lr
while { $count > 0 } {
- set sp [mysim util itranslate $sp]
+ set sp [mysim cpu $p:$c:$t util itranslate $sp]
set lr [mysim memory display [expr $sp++16] 8]
i $lr
set sp [mysim memory display $sp 8]
@@ -262,17 +361,21 @@ proc mywatch { } {
#
# force gdb to attach
#
-proc gdb { {t 0} } {
+proc gdb { { timeout 0 } } {
mysim set fast off
- mysim debugger wait $t
+ mysim debugger wait $timeout
}
-proc egdb { {t 0} } {
- set srr0 [mysim cpu 0 display spr srr0]
- set srr1 [mysim cpu 0 display spr srr1]
- mysim cpu 0 set spr pc $srr0
- mysim cpu 0 set spr msr $srr1
- gdb $t
+proc egdb { { timeout 0 }} {
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ set srr0 [mysim cpu $p:$c:$t display spr srr0]
+ set srr1 [mysim cpu $p:$c:$t display spr srr1]
+ mysim cpu $p:$c:$t set spr pc $srr0
+ mysim cpu $p:$c:$t set spr msr $srr1
+ gdb $timeout
}
proc mem_display_64_le { addr } {
@@ -294,25 +397,24 @@ proc mem_display_64 { addr le } {
}
proc bt { {sp 0} } {
- set t 0
- if { $sp < 16 } {
- set t $sp
- set sp 0
- }
- set lr [mysim cpu 0:$t display spr pc]
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
+ set lr [mysim cpu $p:$c:$t display spr pc]
puts "pc:\t\t\t\t$lr"
if { $sp == 0 } {
- set sp [mysim cpu 0:$t display gpr 1]
+ set sp [mysim cpu $p:$c:$t display gpr 1]
}
- set lr [mysim cpu 0:$t display spr lr]
+ set lr [mysim cpu $p:$c:$t display spr lr]
puts "lr:\t\t\t\t$lr"
- set msr [mysim cpu 0:$t display spr msr]
+ set msr [mysim cpu $p:$c:$t display spr msr]
set le [ expr $msr & 1 ]
# Limit to 200 in case of an infinite loop
for {set i 0} {$i < 200} {incr i} {
- set pa [ mysim util dtranslate $sp ]
+ set pa [ mysim cpu $p:$c:$t util dtranslate $sp ]
set bc [ mem_display_64 $pa $le ]
set lr [ mem_display_64 [ expr $pa + 16 ] $le ]
puts "stack:$pa \t$lr"
@@ -367,32 +469,46 @@ proc skisym { name } {
return $ret
}
-proc current_insn { { t 0 } { c 0 } } {
- set pc [mysim cpu $c thread $t display spr pc]
- set pc_laddr [mysim cpu $c util itranslate $pc]
- set inst [mysim cpu $c memory display $pc_laddr 4]
- set disasm [mysim cpu $c util ppc_disasm $inst $pc]
+proc current_insn { { t -1 } { c -1 } { p -1 }} {
+ global target_t
+ global target_c
+ global target_p
+
+ if { $t == -1 } { set t $target_t }
+ if { $c == -1 } { set c $target_c }
+ if { $p == -1 } { set p $target_p }
+
+ set pc [mysim cpu $p:$c:$t display spr pc]
+ set pc_laddr [mysim cpu $p:$c:$t util itranslate $pc]
+ set inst [mysim cpu $p:$c:$t memory display $pc_laddr 4]
+ set disasm [mysim cpu $p:$c:$t util ppc_disasm $inst $pc]
return $disasm
}
-global SRR1
-global DSISR
-global DAR
+set SRR1 0
+set DSISR 0
+set DAR 0
proc sreset_trigger { args } {
- variable SRR1
+ global SRR1
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
mysim trigger clear pc 0x100
mysim trigger clear pc 0x104
- set s [expr [mysim cpu 0 display spr srr1] & ~0x00000000003c0002]
+ set s [expr [mysim cpu $p:$c:$t display spr srr1] & ~0x00000000003c0002]
set SRR1 [expr $SRR1 | $s]
- mysim cpu 0 set spr srr1 $SRR1
+ mysim cpu $p:$c:$t set spr srr1 $SRR1
}
proc exc_sreset { } {
- variable SRR1
- variable DSISR
- variable DAR
+ global SRR1
+ global DSISR
+ global DAR
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
# In case of recoverable MCE, idle wakeup always sets RI, others get
# RI from current environment. For unrecoverable, RI would always be
@@ -401,7 +517,7 @@ proc exc_sreset { } {
set msr_ri 0x2
set SRR1_powersave [expr (0x2 << (63-47))]
} else {
- set msr_ri [expr [mysim cpu 0 display spr msr] & 0x2]
+ set msr_ri [expr [mysim cpu $p:$c:$t display spr msr] & 0x2]
set SRR1_powersave 0
}
@@ -419,35 +535,38 @@ proc exc_sreset { } {
# and go over current instruction.
mysim trigger set pc 0x100 "sreset_trigger"
mysim trigger set pc 0x104 "sreset_trigger"
- mysim cpu 0 interrupt SystemReset
+ mysim cpu $p:$c:$t interrupt SystemReset
} else {
mysim trigger set pc 0x100 "sreset_trigger"
mysim trigger set pc 0x104 "sreset_trigger"
- mysim cpu 0 interrupt SystemReset
+ mysim cpu $p:$c:$t interrupt SystemReset
}
# sleep and sometimes other types of interrupts do not trigger 0x100
- if { [expr [mysim cpu 0 display spr pc] == 0x100 ] } {
+ if { [expr [mysim cpu $p:$c:$t display spr pc] == 0x100 ] } {
sreset_trigger
}
- if { [expr [mysim cpu 0 display spr pc] == 0x104 ] } {
+ if { [expr [mysim cpu $p:$c:$t display spr pc] == 0x104 ] } {
sreset_trigger
}
}
proc mce_trigger { args } {
- variable SRR1
- variable DSISR
- variable DAR
+ global SRR1
+ global DSISR
+ global DAR
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
mysim trigger clear pc 0x200
mysim trigger clear pc 0x204
set s [expr [mysim cpu 0 display spr srr1] & ~0x00000000801f0002]
set SRR1 [expr $SRR1 | $s]
- mysim cpu 0 set spr srr1 $SRR1
- mysim cpu 0 set spr dsisr $DSISR
- mysim cpu 0 set spr dar $DAR ; list
+ mysim cpu $p:$c:$t set spr srr1 $SRR1
+ mysim cpu $p:$c:$t set spr dsisr $DSISR
+ mysim cpu $p:$c:$t set spr dar $DAR ; list
}
#
@@ -464,9 +583,12 @@ proc mce_trigger { args } {
# d_side=0 cause=0x1 - unrecoverable i-side ifetch
#
proc exc_mce { { d_side 0 } { cause 0x5 } { recoverable 1 } } {
- variable SRR1
- variable DSISR
- variable DAR
+ global SRR1
+ global DSISR
+ global DAR
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
# puts "INJECTING MCE"
@@ -477,7 +599,7 @@ proc exc_mce { { d_side 0 } { cause 0x5 } { recoverable 1 } } {
set msr_ri 0x2
set SRR1_powersave [expr (0x2 << (63-47))]
} else {
- set msr_ri [expr [mysim cpu 0 display spr msr] & 0x2]
+ set msr_ri [expr [mysim cpu $p:$c:$t display spr msr] & 0x2]
set SRR1_powersave 0
}
@@ -510,30 +632,33 @@ proc exc_mce { { d_side 0 } { cause 0x5 } { recoverable 1 } } {
# and go over current instruction.
mysim trigger set pc 0x200 "mce_trigger"
mysim trigger set pc 0x204 "mce_trigger"
- mysim cpu 0 interrupt MachineCheck
+ mysim cpu $p:$c:$t interrupt MachineCheck
} else {
mysim trigger set pc 0x200 "mce_trigger"
mysim trigger set pc 0x204 "mce_trigger"
- mysim cpu 0 interrupt MachineCheck
+ mysim cpu $p:$c:$t interrupt MachineCheck
}
# sleep and sometimes other types of interrupts do not trigger 0x200
- if { [expr [mysim cpu 0 display spr pc] == 0x200 ] } {
+ if { [expr [mysim cpu $p:$c:$t display spr pc] == 0x200 ] } {
mce_trigger
}
- if { [expr [mysim cpu 0 display spr pc] == 0x204 ] } {
+ if { [expr [mysim cpu $p:$c:$t display spr pc] == 0x204 ] } {
mce_trigger
}
}
-global R1
+set R1 0
# Avoid stopping if we re-enter the same code. Wait until r1 matches.
# This helps stepping over exceptions or function calls etc.
proc stop_stack_match { args } {
- variable R1
+ global R1
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
- set r1 [mysim cpu 0 display gpr 1]
+ set r1 [mysim cpu $p:$c:$t display gpr 1]
if { $R1 == $r1 } {
simstop
ipca
@@ -543,10 +668,13 @@ proc stop_stack_match { args } {
# inject default recoverable MCE and step over it. Useful for testing whether
# code copes with taking an interleaving MCE.
proc inject_mce { } {
- variable R1
+ global R1
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
- set R1 [mysim cpu 0 display gpr 1]
- set pc [mysim cpu 0 display spr pc]
+ set R1 [mysim cpu $p:$c:$t display gpr 1]
+ set pc [mysim cpu $p:$c:$t display spr pc]
mysim trigger set pc $pc "stop_stack_match"
exc_mce
c
@@ -576,16 +704,20 @@ proc inject_mce_step { {nr 1} } {
# inject if RI is set and step over one instruction, and repeat.
proc inject_mce_step_ri { {nr 1} } {
+ upvar #0 target_t t
+ upvar #0 target_c c
+ upvar #0 target_p p
+
set reserve_inject 1
set reserve_inject_skip 0
set reserve_counter 0
for { set i 0 } { $i < $nr } { incr i 1 } {
- if { [expr [mysim cpu 0 display spr msr] & 0x2] } {
+ if { [expr [mysim cpu $p:$c:$t display spr msr] & 0x2] } {
# inject_mce
- if { [mysim cpu 0 display reservation] in { "none" } } {
+ if { [mysim cpu $p:$c:$t display reservation] in { "none" } } {
inject_mce
- mysim cpu 0 set reservation none
+ mysim cpu $p:$c:$t set reservation none
if { $reserve_inject_skip } {
set reserve_inject 1
set reserve_inject_skip 0
@@ -593,13 +725,13 @@ proc inject_mce_step_ri { {nr 1} } {
} else {
if { $reserve_inject } {
inject_mce
- mysim cpu 0 set reservation none
+ mysim cpu $p:$c:$t set reservation none
set reserve_inject 0
} else {
set reserve_inject_skip 1
set reserve_counter [ expr $reserve_counter + 1 ]
if { $reserve_counter > 30 } {
- mysim cpu 0 set reservation none
+ mysim cpu $p:$c:$t set reservation none
}
}
}