diff --git a/linux-ramdump-parser-v2/aarch64iommulib.py b/linux-ramdump-parser-v2/aarch64iommulib.py index baea7ab076b9f16cc779bf10359a09c662c3f817..bd1d911e2303680a2e695450b4c9993282c83c3c 100644 --- a/linux-ramdump-parser-v2/aarch64iommulib.py +++ b/linux-ramdump-parser-v2/aarch64iommulib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. +# Copyright (c) 2016-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 @@ -76,13 +76,24 @@ class CollapsedMapping(object): self.execute_never_str = execute_never_str self.mapped = mapped - -def add_collapsed_mapping(mappings, virt_start, virt_end, phys_start, phys_end, - map_type, map_size, attr_indx_str, shareability_str, - execute_never_str, mapped): - map = CollapsedMapping(virt_start, virt_end, phys_start, phys_end, - map_type, map_size, attr_indx_str, shareability_str, - execute_never_str, mapped) +""" +Create a single Collapsed mapping representing the FlatMappings between +first and last, inclusive. +""" +def add_collapsed_mapping(mappings, first, last): + virt_start = first.virt + + map = CollapsedMapping( + virt_start = virt_start, + virt_end = last.virt + last.map_size, + phys_start = first.phys, + phys_end = last.phys + last.map_size, + map_type = first.type, + map_size = first.map_size, + attr_indx_str = first.attr_indx_str, + shareability_str = first.shareability_str, + execute_never_str = first.execute_never_str, + mapped = first.mapped) if virt_start not in mappings: mappings[virt_start] = map @@ -90,53 +101,41 @@ def add_collapsed_mapping(mappings, virt_start, virt_end, phys_start, phys_end, map.type = 'Duplicate' mappings[virt_start] = map - return mappings - - +""" +Combine adjacent holes in the page table, but leave all valid entries +unchanged. +""" def create_collapsed_mapping(flat_mapping): collapsed_mapping = {} - if len(flat_mapping.keys()) > 0: - virt_addrs = sorted(flat_mapping.keys()) - start_map = prev_map = flat_mapping[virt_addrs[0]] - last_mapping = False - new_mapping = False - - for virt in virt_addrs[1:]: - map = flat_mapping[virt] - - if map.map_size == prev_map.map_size \ - and map.type == prev_map.type \ - and map.mapped == prev_map.mapped \ - and not map.mapped: - new_mapping = False - - if virt == virt_addrs[-1]: - last_mapping = True - - else: - new_mapping = True - - if new_mapping: - collapsed_mapping = add_collapsed_mapping( - collapsed_mapping, start_map.virt, - map.virt, start_map.phys, - start_map.phys + start_map.map_size, - start_map.type, start_map.map_size, map.attr_indx_str, - map.shareability_str, map.execute_never_str, - start_map.mapped) - start_map = map - - elif last_mapping: - collapsed_mapping = add_collapsed_mapping( - collapsed_mapping, start_map.virt, - 0xFFFFFFFFFFFF + 1, start_map.phys, - start_map.phys + start_map.map_size, - start_map.type, start_map.map_size, map.attr_indx_str, - map.shareability_str, map.execute_never_str, - start_map.mapped) - - prev_map = map + if not len(flat_mapping.keys()): + return collapsed_mapping + + virt_addrs = sorted(flat_mapping.keys()) + start_map = prev_map = flat_mapping[virt_addrs[0]] + new_mapping = False + + for virt in virt_addrs[1:]: + map = flat_mapping[virt] + + if map.map_size == prev_map.map_size \ + and map.type == prev_map.type \ + and map.mapped == prev_map.mapped \ + and map.attr_indx_str == prev_map.attr_indx_str \ + and not map.mapped: + new_mapping = False + else: + new_mapping = True + + if new_mapping: + add_collapsed_mapping( + collapsed_mapping, start_map, prev_map) + start_map = map + + prev_map = map + + """Add the last entry""" + add_collapsed_mapping(collapsed_mapping, start_map, prev_map) return collapsed_mapping