diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py index 2a772a0c4e351ef9d3c992111d21ebbaf10d4cce..1ca1d6e89a4b3655175113f03a02b69ccfaa0ca1 100644 --- a/linux-ramdump-parser-v2/iommulib.py +++ b/linux-ramdump-parser-v2/iommulib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. +# Copyright (c) 2014-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 @@ -97,6 +97,8 @@ class IommuLib(object): iommu_domain_ops = self.ramdump.read_structure_field( domain_ptr, 'struct iommu_domain', 'ops') + if iommu_domain_ops is None or iommu_domain_ops == 0: + return if iommu_domain_ops == arm_smmu_ops: if priv_ptr is not None: @@ -107,15 +109,24 @@ class IommuLib(object): pgtbl_ops_ptr = self.ramdump.read_structure_field( arm_smmu_domain_ptr, 'struct arm_smmu_domain', 'pgtbl_ops') + if pgtbl_ops_ptr is None or pgtbl_ops_ptr == 0: + return pg_table = 0 level = 0 - if pgtbl_ops_ptr != 0: - io_pgtable_ptr = self.ramdump.container_of( - pgtbl_ops_ptr, 'struct io_pgtable', 'ops') + 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( - io_pgtable_ptr, 'struct arm_lpae_io_pgtable', 'iop') + 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', diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index 107243538774285f778d7b4a2b6b202adc655082..62029bf71a07a15c56ba6e018d2f831f87fbd5ca 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -1,4 +1,4 @@ -# Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. +# Copyright (c) 2012-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 @@ -72,6 +72,8 @@ class AutoDumpInfo(object): def parse(self): for (filename, base_addr) in self._parse(): fullpath = os.path.join(self.autodumpdir, filename) + if not os.path.exists(fullpath): + continue end = base_addr + os.path.getsize(fullpath) - 1 self.ebi_files.append((open(fullpath, 'rb'), base_addr, end, fullpath)) # sort by addr, DDR files first. The goal is for