From a2583fc2739111e240a78762dc3464440c29c145 Mon Sep 17 00:00:00 2001 From: Kumar Harsh <harkumar@codeaurora.org> Date: Mon, 17 Sep 2018 13:56:21 +0530 Subject: [PATCH] ldrp_V2 : Support increased length in Linux banner string This patch fixes the need for a hard coded value to specify upper limit on length of the Linux Banner. get_version() inside ramdump.py has been renamed to get_matched_version() to reflect the true nature of the function. Added a variable banner_len in get_matched_version() which is the length of linux_banner returned by gdbmi.get_value_of_string('linux_banner'). This variable is further passed to read_cstring() function to specify the max limit of characters to be read. We are dynamically calculating the length using gdb to read linux banner. Change-Id: I571882a5999c26ccd8accd90b26d0149c839633b Signed-off-by: Kumar Harsh <harkumar@codeaurora.org> --- linux-ramdump-parser-v2/gdbmi.py | 2 +- linux-ramdump-parser-v2/ramdump.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/linux-ramdump-parser-v2/gdbmi.py b/linux-ramdump-parser-v2/gdbmi.py index 4e06b84..a40d2b6 100644 --- a/linux-ramdump-parser-v2/gdbmi.py +++ b/linux-ramdump-parser-v2/gdbmi.py @@ -294,7 +294,7 @@ class GdbMI(object): def get_value_of_string(self, symbol): """Returns the value of a symbol (as a string)""" - self._run("set print elements 256") + self._run("set print elements 0") cmd = 'print /s {0}'.format(symbol) result = self._run(cmd) if len(result.lines) == 0: diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index 8ad0889..3e4cae9 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -701,7 +701,7 @@ class RamDump(): '!!! This is a BUG in the parser and should be reported.') sys.exit(1) - if not self.get_version(): + if not self.get_matched_version(): print_out_str('!!! Could not get the Linux version!') print_out_str( '!!! Your vmlinux is probably wrong for these dumps') @@ -814,11 +814,16 @@ class RamDump(): else: return addr - (self.kimage_voffset) - def get_version(self): + def get_matched_version(self): banner_addr = self.address_of('linux_banner') if banner_addr is not None: banner_addr = self.kernel_virt_to_phys(banner_addr) - b = self.read_cstring(banner_addr, 256, False) + vm_v = self.gdbmi.get_value_of_string('linux_banner') + if vm_v is None: + print_out_str('!!! Could not read banner address from vmlinux!') + return False + banner_len = len(vm_v) + b = self.read_cstring(banner_addr, banner_len, False) if b is None: print_out_str('!!! Could not read banner address!') return False @@ -835,10 +840,6 @@ class RamDump(): print_out_str('Linux Banner: ' + b.rstrip()) print_out_str('version = {0}'.format(self.version)) - vm_v = self.gdbmi.get_value_of_string('linux_banner') - if vm_v is None: - print_out_str('!!! Could not read banner address from vmlinux!') - return False if str(vm_v) in str(b): print_out_str("Linux banner from vmlinux = %s" % vm_v) print_out_str("Linux banner from dump = %s" % b) -- GitLab