diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py index fa6e56bea715e081bfbb3ef92e05615b796c22fc..585f9e264d25f6e3df34e0dcac780fb5efe5c4f7 100644 --- a/linux-ramdump-parser-v2/iommulib.py +++ b/linux-ramdump-parser-v2/iommulib.py @@ -59,12 +59,20 @@ class IommuLib(object): def _iommu_domain_find_default(self, node, domain_list): domain_ptr = self.ramdump.read_structure_field( node, 'struct iommu_debug_attachment', 'domain') - priv_ptr = self.ramdump.read_structure_field( - domain_ptr, 'struct iommu_domain', 'priv') - if not (domain_ptr and priv_ptr): + if not domain_ptr: return + if self.ramdump.field_offset('struct iommu_domain', 'priv') \ + is not None: + priv_ptr = self.ramdump.read_structure_field( + domain_ptr, 'struct iommu_domain', 'priv') + + if not priv_ptr: + return + else: + priv_ptr = None + arm_smmu_ops = self.ramdump.address_of('arm_smmu_ops') dev_ptr = self.ramdump.read_structure_field( @@ -79,8 +87,14 @@ class IommuLib(object): domain_ptr, 'struct iommu_domain', 'ops') if iommu_domain_ops == arm_smmu_ops: + if priv_ptr is not None: + arm_smmu_domain_ptr = priv_ptr + else: + arm_smmu_domain_ptr = self.ramdump.container_of( + domain_ptr, 'struct arm_smmu_domain', 'domain') + pgtbl_ops_ptr = self.ramdump.read_structure_field( - priv_ptr, 'struct arm_smmu_domain', 'pgtbl_ops') + arm_smmu_domain_ptr, 'struct arm_smmu_domain', 'pgtbl_ops') io_pgtable_ptr = self.ramdump.container_of( pgtbl_ops_ptr, 'struct io_pgtable', 'ops')