From a6485a3524b82d9d404ed8a5f82d87ac9b6ba220 Mon Sep 17 00:00:00 2001 From: Liam Mark <lmark@codeaurora.org> Date: Fri, 24 Jun 2016 11:14:21 -0700 Subject: [PATCH] lrdp-v2: support for arm_smmu_domain container of iommu_domain The arm_smmu_domain is no longer stored in the iommu_domain priv field, from kernel version 4.1 the arm_smmu_domain is a container of iommu_domain. Add support for this configuration. CRs-Fixed: 1034128 Change-Id: I949ec4a24a7dedc394aedc3e6e30e64f34ca3715 --- linux-ramdump-parser-v2/iommulib.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py index fa6e56b..585f9e2 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') -- GitLab