diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py index 1ca1d6e89a4b3655175113f03a02b69ccfaa0ca1..9d9f30767b0397f56a3c72100f19cd22fa4e6a79 100644 --- a/linux-ramdump-parser-v2/iommulib.py +++ b/linux-ramdump-parser-v2/iommulib.py @@ -11,6 +11,7 @@ import rb_tree import linux_list as llist +from mm import phys_to_virt ARM_SMMU_DOMAIN = 0 MSM_SMMU_DOMAIN = 1 @@ -112,30 +113,25 @@ class IommuLib(object): if pgtbl_ops_ptr is None or pgtbl_ops_ptr == 0: return - pg_table = 0 level = 0 fn = self.ramdump.read_structure_field(pgtbl_ops_ptr, 'struct io_pgtable_ops', 'map') if fn == self.ramdump.address_of('av8l_fast_map'): - av8l_fast_io_pgtable_ptr = self.ramdump.container_of( - pgtbl_ops_ptr, 'struct av8l_fast_io_pgtable', 'iop.ops') - - pg_table = self.ramdump.read_structure_field( - av8l_fast_io_pgtable_ptr, 'struct av8l_fast_io_pgtable', - 'pgd') level = 3 else: arm_lpae_io_pgtable_ptr = self.ramdump.container_of( pgtbl_ops_ptr, 'struct arm_lpae_io_pgtable', 'iop.ops') - pg_table = self.ramdump.read_structure_field( - arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable', - 'pgd') - level = self.ramdump.read_structure_field( arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable', 'levels') + pg_table = self.ramdump.read_structure_field( + arm_smmu_domain_ptr, 'struct arm_smmu_domain', + 'pgtbl_cfg.arm_lpae_s1_cfg.ttbr[0]') + + pg_table = phys_to_virt(self.ramdump, pg_table) + domain_create = Domain(pg_table, 0, [], client_name, ARM_SMMU_DOMAIN, level) domain_list.append(domain_create) diff --git a/linux-ramdump-parser-v2/mm.py b/linux-ramdump-parser-v2/mm.py index b626981030d598dcc23e1fee4e98c7cf90baccbf..b6633d458f5d4764e5d550d98558ccca56707643 100644 --- a/linux-ramdump-parser-v2/mm.py +++ b/linux-ramdump-parser-v2/mm.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. +# Copyright (c) 2013-2018, 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 @@ -309,6 +309,16 @@ def page_address(ramdump, page): if pam == start: return None +def phys_to_virt(ramdump, phys): + if not ramdump.arm64: + return phys - ramdump.phys_offset + ramdump.page_offset + + if ramdump.kernel_version < (4, 4, 0): + return None + + memstart_addr = ramdump.read_s64('memstart_addr') + val = (phys - memstart_addr) | ramdump.page_offset + return val def for_each_pfn(ramdump): """ creates a generator for looping through valid pfn