From 348f98e6791eae536881b65535a5029e45481334 Mon Sep 17 00:00:00 2001
From: Runmin Wang <runminw@codeaurora.org>
Date: Wed, 14 Dec 2016 14:50:05 -0800
Subject: [PATCH] lrdp-v2: Add support to extract kaslr-offset from imem

Kaslr-offset in stored in imem by the kernel driver. This patch
enables the parser to extract the required offset before parsing.

Change-Id: Ie773a2e52989b0f2a83c19d39ffdba7f77911e39
---
 linux-ramdump-parser-v2/boards.py  |  1 +
 linux-ramdump-parser-v2/ramdump.py | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/linux-ramdump-parser-v2/boards.py b/linux-ramdump-parser-v2/boards.py
index 250227c..3ed3016 100755
--- a/linux-ramdump-parser-v2/boards.py
+++ b/linux-ramdump-parser-v2/boards.py
@@ -411,6 +411,7 @@ class BoardCobalt(Board):
         self.smem_addr = 0x6000000
         self.phys_offset = 0x80000000
         self.imem_start = 0x14680000
+        self.kaslr_addr = 0x146bf6d0
         self.wdog_addr = 0x146BF658
         self.imem_file_name = 'OCIMEM.BIN'
 
diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py
index 9d66627..344cb37 100755
--- a/linux-ramdump-parser-v2/ramdump.py
+++ b/linux-ramdump-parser-v2/ramdump.py
@@ -547,6 +547,12 @@ class RamDump():
             self.ebi_start = self.ebi_files[0][1]
         if self.phys_offset is None:
             self.get_hw_id()
+
+        if self.kaslr_offset is None:
+            self.get_kaslr_offset()
+            if self.kaslr_offset is not None:
+                self.gdbmi.kaslr_offset = self.kaslr_offset
+
         if options.phys_offset is not None:
             print_out_str(
                 '[!!!] Phys offset was set to {0:x}'.format(\
@@ -968,6 +974,18 @@ class RamDump():
         else:
             return self.read_word(self.tz_addr, False)
 
+    def get_kaslr_offset(self):
+        if(self.kaslr_addr is None):
+            print_out_str('!!!! Kaslr addr is not provided.')
+        else:
+            kaslr_magic = self.read_u32(self.kaslr_addr, False)
+            if kaslr_magic != 0xdead4ead:
+                print_out_str('!!!! Kaslr magic does not match.')
+                self.kaslr_offset = None
+            else:
+                self.kaslr_offset = self.read_u64(self.kaslr_addr + 4, False)
+                print_out_str("The kaslr_offset extracted is: " + str(hex(self.kaslr_offset)))
+
     def get_hw_id(self, add_offset=True):
         socinfo_format = -1
         socinfo_id = -1
@@ -1054,6 +1072,7 @@ class RamDump():
         self.hw_id = board.board_num
         self.cpu_type = board.cpu
         self.imem_fname = board.imem_file_name
+        self.kaslr_addr = board.kaslr_addr
         return True
 
     def resolve_virt(self, virt_or_name):
-- 
GitLab