From a52ad04505b7c00f1d556cb2ac480306c6650b24 Mon Sep 17 00:00:00 2001
From: Patrick Daly <pdaly@codeaurora.org>
Date: Thu, 11 Jan 2018 13:03:31 -0800
Subject: [PATCH] lrdp: iommu: Ensure proper PTE attributes are printed

Fix an error where the attributes of the next PTE were printed
as the attributes for the current PTE.

Change-Id: I7307f148609164ef5891c58abf5c221d4ed78066
---
 linux-ramdump-parser-v2/aarch64iommulib.py | 103 ++++++++++-----------
 1 file changed, 51 insertions(+), 52 deletions(-)

diff --git a/linux-ramdump-parser-v2/aarch64iommulib.py b/linux-ramdump-parser-v2/aarch64iommulib.py
index baea7ab..bd1d911 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
 
 
-- 
GitLab