Skip to content
Snippets Groups Projects
Commit 76934a74 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "lrdp: iommu: fix page table parsing"

parents 31aca22c 137cd66a
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@
import rb_tree
import linux_list as llist
from mm import phys_to_virt
ARM_SMMU_DOMAIN = 0
MSM_SMMU_DOMAIN = 1
......@@ -112,30 +113,25 @@ class IommuLib(object):
if pgtbl_ops_ptr is None or pgtbl_ops_ptr == 0:
return
pg_table = 0
level = 0
fn = self.ramdump.read_structure_field(pgtbl_ops_ptr,
'struct io_pgtable_ops', 'map')
if fn == self.ramdump.address_of('av8l_fast_map'):
av8l_fast_io_pgtable_ptr = self.ramdump.container_of(
pgtbl_ops_ptr, 'struct av8l_fast_io_pgtable', 'iop.ops')
pg_table = self.ramdump.read_structure_field(
av8l_fast_io_pgtable_ptr, 'struct av8l_fast_io_pgtable',
'pgd')
level = 3
else:
arm_lpae_io_pgtable_ptr = self.ramdump.container_of(
pgtbl_ops_ptr, 'struct arm_lpae_io_pgtable', 'iop.ops')
pg_table = self.ramdump.read_structure_field(
arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable',
'pgd')
level = self.ramdump.read_structure_field(
arm_lpae_io_pgtable_ptr, 'struct arm_lpae_io_pgtable',
'levels')
pg_table = self.ramdump.read_structure_field(
arm_smmu_domain_ptr, 'struct arm_smmu_domain',
'pgtbl_cfg.arm_lpae_s1_cfg.ttbr[0]')
pg_table = phys_to_virt(self.ramdump, pg_table)
domain_create = Domain(pg_table, 0, [], client_name,
ARM_SMMU_DOMAIN, level)
domain_list.append(domain_create)
......
# Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
# Copyright (c) 2013-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
......@@ -309,6 +309,16 @@ def page_address(ramdump, page):
if pam == start:
return None
def phys_to_virt(ramdump, phys):
if not ramdump.arm64:
return phys - ramdump.phys_offset + ramdump.page_offset
if ramdump.kernel_version < (4, 4, 0):
return None
memstart_addr = ramdump.read_s64('memstart_addr')
val = (phys - memstart_addr) | ramdump.page_offset
return val
def for_each_pfn(ramdump):
""" creates a generator for looping through valid pfn
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment