diff --git a/linux-ramdump-parser-v2/aarch64iommulib.py b/linux-ramdump-parser-v2/aarch64iommulib.py index 7ad1a576fc1b5e2dac62bd70388ff2114795d6f9..baea7ab076b9f16cc779bf10359a09c662c3f817 100644 --- a/linux-ramdump-parser-v2/aarch64iommulib.py +++ b/linux-ramdump-parser-v2/aarch64iommulib.py @@ -154,6 +154,7 @@ def add_flat_mapping(mappings, fl_idx, sl_idx, tl_idx, ll_idx, phy_addr, elif map_type == LL_AP_PR_RO: map_type_str = '[P RO]' + shareability_str = 'N/A' if shareability != -1: if shareability == SH_NON_SHARE: shareability_str = 'Non-Shareable' @@ -163,9 +164,8 @@ def add_flat_mapping(mappings, fl_idx, sl_idx, tl_idx, ll_idx, phy_addr, shareability_str = 'Outer-Shareable' if shareability == SH_INNER_SHARE: shareability_str = 'Inner-Shareable' - else: - shareability_str = 'N/A' + attr_indx_str = 'N/A' if attr_indx != -1: if attr_indx == ATTR_IDX_NONCACHED: attr_indx_str = 'Non-Cached' @@ -173,8 +173,6 @@ def add_flat_mapping(mappings, fl_idx, sl_idx, tl_idx, ll_idx, phy_addr, attr_indx_str = 'Cached' if attr_indx == ATTR_IDX_DEV: attr_indx_str = 'Device' - else: - attr_indx_str = 'N/A' if xn_bit == 1: execute_never_str = 'True' @@ -431,7 +429,7 @@ def parse_aarch64_tables(ramdump, d, domain_num): iommu_context = iommu_context or 'None attached' outfile.write( - 'IOMMU Contextttt: %s. Domain: %s' + 'IOMMU Context: %s. Domain: %s' '[L2 cache redirect for page tables is %s]\n' % ( iommu_context, d.client_name, redirect)) outfile.write( diff --git a/linux-ramdump-parser-v2/iommulib.py b/linux-ramdump-parser-v2/iommulib.py index edfbe3c1fba5b220de5f7c2013311916587e89a0..2a772a0c4e351ef9d3c992111d21ebbaf10d4cce 100644 --- a/linux-ramdump-parser-v2/iommulib.py +++ b/linux-ramdump-parser-v2/iommulib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +# Copyright (c) 2014-2017, 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 @@ -76,13 +76,24 @@ class IommuLib(object): arm_smmu_ops = self.ramdump.address_of('arm_smmu_ops') - dev_ptr = self.ramdump.read_structure_field( - node, 'struct iommu_debug_attachment', 'dev') - - kobj_ptr = dev_ptr + self.ramdump.field_offset('struct device', 'kobj') - - client_name = self.ramdump.read_structure_cstring( - kobj_ptr, 'struct kobject', 'name') + ptr = self.ramdump.read_structure_field( + node, 'struct iommu_debug_attachment', 'group') + if ptr is not None: + dev_list = ptr + self.ramdump.field_offset( + 'struct iommu_group', 'devices') + dev = self.ramdump.read_structure_field( + dev_list, 'struct list_head', 'next') + client_name = self.ramdump.read_structure_cstring( + dev, 'struct iommu_device', 'name') + else: + """Older kernel versions have the field 'dev' + instead of 'iommu_group'. + """ + ptr = self.ramdump.read_structure_field( + node, 'struct iommu_debug_attachment', 'dev') + kobj_ptr = ptr + self.ramdump.field_offset('struct device', 'kobj') + client_name = self.ramdump.read_structure_cstring( + kobj_ptr, 'struct kobject', 'name') iommu_domain_ops = self.ramdump.read_structure_field( domain_ptr, 'struct iommu_domain', 'ops')