aboutsummaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorMichael Neuling <mikey@neuling.org>2019-04-17 11:54:28 +1000
committerStewart Smith <stewart@linux.ibm.com>2019-05-15 16:22:23 +1000
commit901261bc7699be337bd61ad44b980850dff02189 (patch)
treee6ab574898bb14f22c6e43bb91b1398ee4bb59f3 /external
parentdf34cedd050a966b334973c933e5e7e90164b6ec (diff)
downloadskiboot-901261bc7699be337bd61ad44b980850dff02189.zip
skiboot-901261bc7699be337bd61ad44b980850dff02189.tar.gz
skiboot-901261bc7699be337bd61ad44b980850dff02189.tar.bz2
mambo: Add addr2func for symbol resolution
If you supply a VMLINUX_MAP/SKIBOOT_MAP/USER_MAP addr2func can guess at your symbol name. ie systemsim % p pc 0xC0000000002A68F8 systemsim % addr2func [p pc] fdt_offset_ptr+0x78 Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Oliver O'Halloran <oohall@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'external')
-rw-r--r--external/mambo/mambo_utils.tcl49
-rw-r--r--external/mambo/skiboot.tcl15
2 files changed, 62 insertions, 2 deletions
diff --git a/external/mambo/mambo_utils.tcl b/external/mambo/mambo_utils.tcl
index 1218855..9870999 100644
--- a/external/mambo/mambo_utils.tcl
+++ b/external/mambo/mambo_utils.tcl
@@ -469,6 +469,55 @@ proc skisym { name } {
return $ret
}
+proc addr2func { addr } {
+ global skiboot_symbol_list
+ global linux_symbol_list
+ global user_symbol_list
+ global mconf
+
+ set prevname ""
+ set preva "0"
+
+ if { [ info exists linux_symbol_list ] && "$addr" >= 0xc000000000000000} {
+ foreach line $linux_symbol_list {
+ lassign $line a type name
+ if { "0x$a" > $addr } {
+ set o [format "0x%x" [expr $addr - "0x$preva"]]
+ return "$prevname+$o"
+ }
+ set prevname $name
+ set preva $a
+ }
+ }
+ # Assume skiboot is less that 4MB big
+ if { [ info exists skiboot_symbol_list ] &&
+ "$addr" > $mconf(boot_load) && "$addr" < [expr $mconf(boot_load) + 4194304] } {
+ set mapaddr [expr $addr - $mconf(boot_load)]
+
+ foreach line $skiboot_symbol_list {
+ lassign $line a type name
+ if { "0x$a" > $mapaddr } {
+ set o [format "0x%x" [expr $mapaddr - "0x$preva"]]
+ return "$prevname+$o"
+ }
+ set prevname $name
+ set preva $a
+ }
+ }
+ if { [ info exists user_symbol_list ] } {
+ foreach line $user_symbol_list {
+ lassign $line a type name
+ if { "0x$a" > $addr } {
+ set o [format "0x%x" [expr $addr - "0x$preva"]]
+ return "$prevname+$o"
+ }
+ set prevname $name
+ set preva $a
+ }
+ }
+ return "+$addr"
+}
+
proc current_insn { { t -1 } { c -1 } { p -1 }} {
global target_t
global target_c
diff --git a/external/mambo/skiboot.tcl b/external/mambo/skiboot.tcl
index cd2f3ee..5155c68 100644
--- a/external/mambo/skiboot.tcl
+++ b/external/mambo/skiboot.tcl
@@ -141,19 +141,30 @@ if {![info exists of::encode_compat]} {
if { [file exists mambo_utils.tcl] } then {
source mambo_utils.tcl
+ if { [info exists env(USER_MAP)] } {
+ global user_symbol_map user_symbol_list
+
+ set fp [open $env(USER_MAP) r]
+ set user_symbol_map [read $fp]
+ set user_symbol_list [split $user_symbol_map "\n"]
+ close $fp
+ }
+
if { [info exists env(VMLINUX_MAP)] } {
- global linux_symbol_map
+ global linux_symbol_map linux_symbol_list
set fp [open $env(VMLINUX_MAP) r]
set linux_symbol_map [read $fp]
+ set linux_symbol_list [split $linux_symbol_map "\n"]
close $fp
}
if { [info exists env(SKIBOOT_MAP)] } {
- global skiboot_symbol_map
+ global skiboot_symbol_map skiboot_symbol_list
set fp [open $env(SKIBOOT_MAP) r]
set skiboot_symbol_map [read $fp]
+ set skiboot_symbol_list [split $skiboot_symbol_map "\n"]
close $fp
}
}