From 901261bc7699be337bd61ad44b980850dff02189 Mon Sep 17 00:00:00 2001 From: Michael Neuling Date: Wed, 17 Apr 2019 11:54:28 +1000 Subject: [PATCH] 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 Signed-off-by: Oliver O'Halloran Signed-off-by: Stewart Smith --- external/mambo/mambo_utils.tcl | 49 ++++++++++++++++++++++++++++++++++ external/mambo/skiboot.tcl | 15 +++++++++-- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/external/mambo/mambo_utils.tcl b/external/mambo/mambo_utils.tcl index 12188559cfd2..987099907517 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 cd2f3eeabb7c..5155c68aaf2f 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 } }