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
7 from __future__
import print_function
16 sys
.path
.append(os
.environ
['PERF_EXEC_PATH'] + \
17 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
19 #physical address ranges for System RAM
21 #physical address ranges for Persistent Memory
23 #file object for proc iomem
25 #Count for each type of memory
26 load_mem_type_cnt
= collections
.Counter()
32 f
= open('/proc/iomem', 'r')
33 for i
, j
in enumerate(f
):
34 m
= re
.split('-|:',j
,2)
35 if m
[2].strip() == 'System RAM':
36 system_ram
.append(int(m
[0], 16))
37 system_ram
.append(int(m
[1], 16))
38 if m
[2].strip() == 'Persistent Memory':
39 pmem
.append(int(m
[0], 16))
40 pmem
.append(int(m
[1], 16))
42 def print_memory_type():
43 print("Event: %s" % (event_name
))
44 print("%-40s %10s %10s\n" % ("Memory type", "count", "percentage"), end
='')
45 print("%-40s %10s %10s\n" % ("----------------------------------------",
46 "-----------", "-----------"),
48 total
= sum(load_mem_type_cnt
.values())
49 for mem_type
, count
in sorted(load_mem_type_cnt
.most_common(), \
50 key
= lambda kv
: (kv
[1], kv
[0]), reverse
= True):
51 print("%-40s %10d %10.1f%%\n" %
52 (mem_type
, count
, 100 * count
/ total
),
62 def is_system_ram(phys_addr
):
63 #/proc/iomem is sorted
64 position
= bisect
.bisect(system_ram
, phys_addr
)
69 def is_persistent_mem(phys_addr
):
70 position
= bisect
.bisect(pmem
, phys_addr
)
75 def find_memory_type(phys_addr
):
78 if is_system_ram(phys_addr
):
81 if is_persistent_mem(phys_addr
):
82 return "Persistent Memory"
84 #slow path, search all
87 m
= re
.split('-|:',j
,2)
88 if int(m
[0], 16) <= phys_addr
<= int(m
[1], 16):
92 def process_event(param_dict
):
93 name
= param_dict
["ev_name"]
94 sample
= param_dict
["sample"]
95 phys_addr
= sample
["phys_addr"]
98 if event_name
== None:
100 load_mem_type_cnt
[find_memory_type(phys_addr
)] += 1