1 # mem-phys-addr.py: Resolve physical address samples
2 # SPDX-License-Identifier: GPL-2.0
4 # Copyright (c) 2018, Intel Corporation.
6 from __future__ import division
14 sys.path.append(os.environ['PERF_EXEC_PATH'] + \
15 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
17 #physical address ranges for System RAM
19 #physical address ranges for Persistent Memory
21 #file object for proc iomem
23 #Count for each type of memory
24 load_mem_type_cnt = collections.Counter()
30 f = open('/proc/iomem', 'r')
31 for i, j in enumerate(f):
32 m = re.split('-|:',j,2)
33 if m[2].strip() == 'System RAM':
34 system_ram.append(long(m[0], 16))
35 system_ram.append(long(m[1], 16))
36 if m[2].strip() == 'Persistent Memory':
37 pmem.append(long(m[0], 16))
38 pmem.append(long(m[1], 16))
40 def print_memory_type():
41 print "Event: %s" % (event_name)
42 print "%-40s %10s %10s\n" % ("Memory type", "count", "percentage"),
43 print "%-40s %10s %10s\n" % ("----------------------------------------", \
44 "-----------", "-----------"),
45 total = sum(load_mem_type_cnt.values())
46 for mem_type, count in sorted(load_mem_type_cnt.most_common(), \
47 key = lambda(k, v): (v, k), reverse = True):
48 print "%-40s %10d %10.1f%%\n" % (mem_type, count, 100 * count / total),
57 def is_system_ram(phys_addr):
58 #/proc/iomem is sorted
59 position = bisect.bisect(system_ram, phys_addr)
64 def is_persistent_mem(phys_addr):
65 position = bisect.bisect(pmem, phys_addr)
70 def find_memory_type(phys_addr):
73 if is_system_ram(phys_addr):
76 if is_persistent_mem(phys_addr):
77 return "Persistent Memory"
79 #slow path, search all
82 m = re.split('-|:',j,2)
83 if long(m[0], 16) <= phys_addr <= long(m[1], 16):
87 def process_event(param_dict):
88 name = param_dict["ev_name"]
89 sample = param_dict["sample"]
90 phys_addr = sample["phys_addr"]
93 if event_name == None:
95 load_mem_type_cnt[find_memory_type(phys_addr)] += 1