Skip to content
Snippets Groups Projects
Commit 390fc361 authored by Ankur Bansal's avatar Ankur Bansal
Browse files

lrdp_v2 : Add logcat parser to extract the logcat log from dump

Add new logcat parser to extract the logcat logs from the dump

Change-Id: Ic0a2c7b22a2db954f9000faa32f3388c79109eaf
parent 5e9481d2
No related branches found
No related tags found
No related merge requests found
......@@ -37,10 +37,14 @@ class MMU(object):
"""
def __init__(self, ramdump):
def __init__(self, ramdump, ttbr=None):
self._tlb = {}
self.ramdump = ramdump
self.ttbr = None
if ttbr is not None:
self.ttbr = ttbr
else:
self.ttbr = self.ramdump.kernel_virt_to_phys(
self.ramdump.swapper_pg_dir_addr)
self.load_page_tables()
def virt_to_phys(self, addr, skip_tlb=False, save_in_tlb=True):
......@@ -86,13 +90,10 @@ class Armv7MMU(MMU):
self.secondary_page_tables = [
[0 for col in range(256)] for row in range(4096)]
msm_ttbr0 = self.ramdump.kernel_virt_to_phys(
self.ramdump.swapper_pg_dir_addr)
self.ttbr = msm_ttbr0
virt_address = 0x0
gb_i = 0
se_i = 0
for l1_pte_ptr in range(msm_ttbr0, msm_ttbr0 + (4096 * 4), 4):
for l1_pte_ptr in range(self.ttbr, self.ttbr + (4096 * 4), 4):
l1_pte = self.ramdump.read_word(l1_pte_ptr, False)
self.global_page_table[gb_i] = l1_pte
if l1_pte is None:
......@@ -398,8 +399,6 @@ class Armv7LPAEMMU(MMU):
pass
def page_table_walk(self, virt):
self.ttbr = self.ramdump.kernel_virt_to_phys(
self.ramdump.swapper_pg_dir_addr)
info = self.translate(virt)
return info.phys if info is not None else None
......@@ -497,6 +496,7 @@ class Armv8MMU(MMU):
TL_DESCRIPTOR_RESERVED = 0x1
TL_DESCRIPTOR_PAGE = 0x3
def do_fl_sl_level_lookup(self, table_base_address, table_index,
input_addr_split, block_split):
descriptor, addr = self.do_level_lookup(
......@@ -583,10 +583,6 @@ class Armv8MMU(MMU):
pass
def page_table_walk(self, virt):
self.ttbr = self.ramdump.kernel_virt_to_phys(
self.ramdump.swapper_pg_dir_addr)
virt_r = Register(virt,
zl_index=(47,39),
fl_index=(38,30),
......
# Copyright (c) 2019 The Linux Foundation. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 and
# only version 2 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
from parser_util import register_parser, RamParser, cleanupString
from mmu import Armv8MMU
from print_out import print_out_str
def parse_locat(ramdump):
offset_comm = ramdump.field_offset('struct task_struct', 'comm')
mm_offset = ramdump.field_offset('struct task_struct', 'mm')
f_path_offset = ramdump.field_offset('struct file', 'f_path')
dentry_offset = ramdump.field_offset('struct path', 'dentry')
d_iname_offset = ramdump.field_offset('struct dentry', 'd_iname')
for task in ramdump.for_each_process():
task_name = task + offset_comm
task_name = cleanupString(ramdump.read_cstring(task_name, 16))
if task_name == 'logd':
mm_addr = ramdump.read_word(task + mm_offset)
mmap = ramdump.read_structure_field(mm_addr, 'struct mm_struct',
'mmap')
pgd = ramdump.read_structure_field(mm_addr, 'struct mm_struct',
'pgd')
pgdp = ramdump.virt_to_phys(pgd)
va_start = ramdump.read_structure_field(mmap,
'struct vm_area_struct', 'vm_start')
max = 0
count = 0
while mmap != 0:
if count == 3:
va_start = ramdump.read_structure_field(mmap,
'struct vm_area_struct', 'vm_start')
count = count + 1
file = ramdump.read_structure_field(mmap,
'struct vm_area_struct', 'vm_file')
if file != 0:
dentry = ramdump.read_word(file + f_path_offset +
dentry_offset)
file_name = cleanupString(ramdump.read_cstring(dentry +
d_iname_offset, 16))
if file_name == "logd":
count = count + 1
if file_name.find("linker") == 0:
va_end = ramdump.read_structure_field(mmap,
'struct vm_area_struct', 'vm_end')
if va_end > max:
max = va_end
mmap = ramdump.read_structure_field(mmap, 'struct '
'vm_area_struct', 'vm_next')
size = max - va_start
if size > 0x4000000:
size = 0x4000000
break
mmu = Armv8MMU(ramdump,pgdp)
print_out_str("logcat.bin base address is {0:x}".format(va_start))
with ramdump.open_file("logcat.bin", 'ab') as out_file:
max = va_start + size
while(va_start <= max):
phys = mmu.virt_to_phys(va_start)
if phys is None:
va_start = va_start + 0x1000
out_file.write(b'\x00' * 0x1000)
continue
out_file.write(ramdump.read_physical(phys, 0x1000))
va_start = va_start + 0x1000
return
@register_parser('--logcat', 'Extract logcat logs from ramdump ')
class Logcat(RamParser):
def parse(self):
parse_locat(self.ramdump)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment