xref: /linux/tools/perf/scripts/python/powerpc-hcalls.py (revision 597473720f4dc69749542bfcfed4a927a43d935e)
1ec1e6e6aSRavi Bangoria# SPDX-License-Identifier: GPL-2.0+
2ec1e6e6aSRavi Bangoria#
3ec1e6e6aSRavi Bangoria# Copyright (C) 2018 Ravi Bangoria, IBM Corporation
4ec1e6e6aSRavi Bangoria#
5ec1e6e6aSRavi Bangoria# Hypervisor call statisics
6ec1e6e6aSRavi Bangoria
7*118af5bfSTony Jonesfrom __future__ import print_function
8*118af5bfSTony Jones
9ec1e6e6aSRavi Bangoriaimport os
10ec1e6e6aSRavi Bangoriaimport sys
11ec1e6e6aSRavi Bangoria
12ec1e6e6aSRavi Bangoriasys.path.append(os.environ['PERF_EXEC_PATH'] + \
13ec1e6e6aSRavi Bangoria	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
14ec1e6e6aSRavi Bangoria
15ec1e6e6aSRavi Bangoriafrom perf_trace_context import *
16ec1e6e6aSRavi Bangoriafrom Core import *
17ec1e6e6aSRavi Bangoriafrom Util import *
18ec1e6e6aSRavi Bangoria
19ec1e6e6aSRavi Bangoria# output: {
20ec1e6e6aSRavi Bangoria#	opcode: {
21ec1e6e6aSRavi Bangoria#		'min': minimum time nsec
22ec1e6e6aSRavi Bangoria#		'max': maximum time nsec
23ec1e6e6aSRavi Bangoria#		'time': average time nsec
24ec1e6e6aSRavi Bangoria#		'cnt': counter
25ec1e6e6aSRavi Bangoria#	} ...
26ec1e6e6aSRavi Bangoria# }
27ec1e6e6aSRavi Bangoriaoutput = {}
28ec1e6e6aSRavi Bangoria
29ec1e6e6aSRavi Bangoria# d_enter: {
30ec1e6e6aSRavi Bangoria#	cpu: {
31ec1e6e6aSRavi Bangoria#		opcode: nsec
32ec1e6e6aSRavi Bangoria#	} ...
33ec1e6e6aSRavi Bangoria# }
34ec1e6e6aSRavi Bangoriad_enter = {}
35ec1e6e6aSRavi Bangoria
36ec1e6e6aSRavi Bangoriahcall_table = {
37ec1e6e6aSRavi Bangoria	4: 'H_REMOVE',
38ec1e6e6aSRavi Bangoria	8: 'H_ENTER',
39ec1e6e6aSRavi Bangoria	12: 'H_READ',
40ec1e6e6aSRavi Bangoria	16: 'H_CLEAR_MOD',
41ec1e6e6aSRavi Bangoria	20: 'H_CLEAR_REF',
42ec1e6e6aSRavi Bangoria	24: 'H_PROTECT',
43ec1e6e6aSRavi Bangoria	28: 'H_GET_TCE',
44ec1e6e6aSRavi Bangoria	32: 'H_PUT_TCE',
45ec1e6e6aSRavi Bangoria	36: 'H_SET_SPRG0',
46ec1e6e6aSRavi Bangoria	40: 'H_SET_DABR',
47ec1e6e6aSRavi Bangoria	44: 'H_PAGE_INIT',
48ec1e6e6aSRavi Bangoria	48: 'H_SET_ASR',
49ec1e6e6aSRavi Bangoria	52: 'H_ASR_ON',
50ec1e6e6aSRavi Bangoria	56: 'H_ASR_OFF',
51ec1e6e6aSRavi Bangoria	60: 'H_LOGICAL_CI_LOAD',
52ec1e6e6aSRavi Bangoria	64: 'H_LOGICAL_CI_STORE',
53ec1e6e6aSRavi Bangoria	68: 'H_LOGICAL_CACHE_LOAD',
54ec1e6e6aSRavi Bangoria	72: 'H_LOGICAL_CACHE_STORE',
55ec1e6e6aSRavi Bangoria	76: 'H_LOGICAL_ICBI',
56ec1e6e6aSRavi Bangoria	80: 'H_LOGICAL_DCBF',
57ec1e6e6aSRavi Bangoria	84: 'H_GET_TERM_CHAR',
58ec1e6e6aSRavi Bangoria	88: 'H_PUT_TERM_CHAR',
59ec1e6e6aSRavi Bangoria	92: 'H_REAL_TO_LOGICAL',
60ec1e6e6aSRavi Bangoria	96: 'H_HYPERVISOR_DATA',
61ec1e6e6aSRavi Bangoria	100: 'H_EOI',
62ec1e6e6aSRavi Bangoria	104: 'H_CPPR',
63ec1e6e6aSRavi Bangoria	108: 'H_IPI',
64ec1e6e6aSRavi Bangoria	112: 'H_IPOLL',
65ec1e6e6aSRavi Bangoria	116: 'H_XIRR',
66ec1e6e6aSRavi Bangoria	120: 'H_MIGRATE_DMA',
67ec1e6e6aSRavi Bangoria	124: 'H_PERFMON',
68ec1e6e6aSRavi Bangoria	220: 'H_REGISTER_VPA',
69ec1e6e6aSRavi Bangoria	224: 'H_CEDE',
70ec1e6e6aSRavi Bangoria	228: 'H_CONFER',
71ec1e6e6aSRavi Bangoria	232: 'H_PROD',
72ec1e6e6aSRavi Bangoria	236: 'H_GET_PPP',
73ec1e6e6aSRavi Bangoria	240: 'H_SET_PPP',
74ec1e6e6aSRavi Bangoria	244: 'H_PURR',
75ec1e6e6aSRavi Bangoria	248: 'H_PIC',
76ec1e6e6aSRavi Bangoria	252: 'H_REG_CRQ',
77ec1e6e6aSRavi Bangoria	256: 'H_FREE_CRQ',
78ec1e6e6aSRavi Bangoria	260: 'H_VIO_SIGNAL',
79ec1e6e6aSRavi Bangoria	264: 'H_SEND_CRQ',
80ec1e6e6aSRavi Bangoria	272: 'H_COPY_RDMA',
81ec1e6e6aSRavi Bangoria	276: 'H_REGISTER_LOGICAL_LAN',
82ec1e6e6aSRavi Bangoria	280: 'H_FREE_LOGICAL_LAN',
83ec1e6e6aSRavi Bangoria	284: 'H_ADD_LOGICAL_LAN_BUFFER',
84ec1e6e6aSRavi Bangoria	288: 'H_SEND_LOGICAL_LAN',
85ec1e6e6aSRavi Bangoria	292: 'H_BULK_REMOVE',
86ec1e6e6aSRavi Bangoria	304: 'H_MULTICAST_CTRL',
87ec1e6e6aSRavi Bangoria	308: 'H_SET_XDABR',
88ec1e6e6aSRavi Bangoria	312: 'H_STUFF_TCE',
89ec1e6e6aSRavi Bangoria	316: 'H_PUT_TCE_INDIRECT',
90ec1e6e6aSRavi Bangoria	332: 'H_CHANGE_LOGICAL_LAN_MAC',
91ec1e6e6aSRavi Bangoria	336: 'H_VTERM_PARTNER_INFO',
92ec1e6e6aSRavi Bangoria	340: 'H_REGISTER_VTERM',
93ec1e6e6aSRavi Bangoria	344: 'H_FREE_VTERM',
94ec1e6e6aSRavi Bangoria	348: 'H_RESET_EVENTS',
95ec1e6e6aSRavi Bangoria	352: 'H_ALLOC_RESOURCE',
96ec1e6e6aSRavi Bangoria	356: 'H_FREE_RESOURCE',
97ec1e6e6aSRavi Bangoria	360: 'H_MODIFY_QP',
98ec1e6e6aSRavi Bangoria	364: 'H_QUERY_QP',
99ec1e6e6aSRavi Bangoria	368: 'H_REREGISTER_PMR',
100ec1e6e6aSRavi Bangoria	372: 'H_REGISTER_SMR',
101ec1e6e6aSRavi Bangoria	376: 'H_QUERY_MR',
102ec1e6e6aSRavi Bangoria	380: 'H_QUERY_MW',
103ec1e6e6aSRavi Bangoria	384: 'H_QUERY_HCA',
104ec1e6e6aSRavi Bangoria	388: 'H_QUERY_PORT',
105ec1e6e6aSRavi Bangoria	392: 'H_MODIFY_PORT',
106ec1e6e6aSRavi Bangoria	396: 'H_DEFINE_AQP1',
107ec1e6e6aSRavi Bangoria	400: 'H_GET_TRACE_BUFFER',
108ec1e6e6aSRavi Bangoria	404: 'H_DEFINE_AQP0',
109ec1e6e6aSRavi Bangoria	408: 'H_RESIZE_MR',
110ec1e6e6aSRavi Bangoria	412: 'H_ATTACH_MCQP',
111ec1e6e6aSRavi Bangoria	416: 'H_DETACH_MCQP',
112ec1e6e6aSRavi Bangoria	420: 'H_CREATE_RPT',
113ec1e6e6aSRavi Bangoria	424: 'H_REMOVE_RPT',
114ec1e6e6aSRavi Bangoria	428: 'H_REGISTER_RPAGES',
115ec1e6e6aSRavi Bangoria	432: 'H_DISABLE_AND_GETC',
116ec1e6e6aSRavi Bangoria	436: 'H_ERROR_DATA',
117ec1e6e6aSRavi Bangoria	440: 'H_GET_HCA_INFO',
118ec1e6e6aSRavi Bangoria	444: 'H_GET_PERF_COUNT',
119ec1e6e6aSRavi Bangoria	448: 'H_MANAGE_TRACE',
120ec1e6e6aSRavi Bangoria	468: 'H_FREE_LOGICAL_LAN_BUFFER',
121ec1e6e6aSRavi Bangoria	472: 'H_POLL_PENDING',
122ec1e6e6aSRavi Bangoria	484: 'H_QUERY_INT_STATE',
123ec1e6e6aSRavi Bangoria	580: 'H_ILLAN_ATTRIBUTES',
124ec1e6e6aSRavi Bangoria	592: 'H_MODIFY_HEA_QP',
125ec1e6e6aSRavi Bangoria	596: 'H_QUERY_HEA_QP',
126ec1e6e6aSRavi Bangoria	600: 'H_QUERY_HEA',
127ec1e6e6aSRavi Bangoria	604: 'H_QUERY_HEA_PORT',
128ec1e6e6aSRavi Bangoria	608: 'H_MODIFY_HEA_PORT',
129ec1e6e6aSRavi Bangoria	612: 'H_REG_BCMC',
130ec1e6e6aSRavi Bangoria	616: 'H_DEREG_BCMC',
131ec1e6e6aSRavi Bangoria	620: 'H_REGISTER_HEA_RPAGES',
132ec1e6e6aSRavi Bangoria	624: 'H_DISABLE_AND_GET_HEA',
133ec1e6e6aSRavi Bangoria	628: 'H_GET_HEA_INFO',
134ec1e6e6aSRavi Bangoria	632: 'H_ALLOC_HEA_RESOURCE',
135ec1e6e6aSRavi Bangoria	644: 'H_ADD_CONN',
136ec1e6e6aSRavi Bangoria	648: 'H_DEL_CONN',
137ec1e6e6aSRavi Bangoria	664: 'H_JOIN',
138ec1e6e6aSRavi Bangoria	676: 'H_VASI_STATE',
139ec1e6e6aSRavi Bangoria	688: 'H_ENABLE_CRQ',
140ec1e6e6aSRavi Bangoria	696: 'H_GET_EM_PARMS',
141ec1e6e6aSRavi Bangoria	720: 'H_SET_MPP',
142ec1e6e6aSRavi Bangoria	724: 'H_GET_MPP',
143ec1e6e6aSRavi Bangoria	748: 'H_HOME_NODE_ASSOCIATIVITY',
144ec1e6e6aSRavi Bangoria	756: 'H_BEST_ENERGY',
145ec1e6e6aSRavi Bangoria	764: 'H_XIRR_X',
146ec1e6e6aSRavi Bangoria	768: 'H_RANDOM',
147ec1e6e6aSRavi Bangoria	772: 'H_COP',
148ec1e6e6aSRavi Bangoria	788: 'H_GET_MPP_X',
149ec1e6e6aSRavi Bangoria	796: 'H_SET_MODE',
150ec1e6e6aSRavi Bangoria	61440: 'H_RTAS',
151ec1e6e6aSRavi Bangoria}
152ec1e6e6aSRavi Bangoria
153ec1e6e6aSRavi Bangoriadef hcall_table_lookup(opcode):
154*118af5bfSTony Jones	if (opcode in hcall_table):
155ec1e6e6aSRavi Bangoria		return hcall_table[opcode]
156ec1e6e6aSRavi Bangoria	else:
157ec1e6e6aSRavi Bangoria		return opcode
158ec1e6e6aSRavi Bangoria
159ec1e6e6aSRavi Bangoriaprint_ptrn = '%-28s%10s%10s%10s%10s'
160ec1e6e6aSRavi Bangoria
161ec1e6e6aSRavi Bangoriadef trace_end():
162*118af5bfSTony Jones	print(print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)'))
163*118af5bfSTony Jones	print('-' * 68)
164ec1e6e6aSRavi Bangoria	for opcode in output:
165ec1e6e6aSRavi Bangoria		h_name = hcall_table_lookup(opcode)
166ec1e6e6aSRavi Bangoria		time = output[opcode]['time']
167ec1e6e6aSRavi Bangoria		cnt = output[opcode]['cnt']
168ec1e6e6aSRavi Bangoria		min_t = output[opcode]['min']
169ec1e6e6aSRavi Bangoria		max_t = output[opcode]['max']
170ec1e6e6aSRavi Bangoria
171*118af5bfSTony Jones		print(print_ptrn % (h_name, cnt, min_t, max_t, time//cnt))
172ec1e6e6aSRavi Bangoria
173ec1e6e6aSRavi Bangoriadef powerpc__hcall_exit(name, context, cpu, sec, nsec, pid, comm, callchain,
174ec1e6e6aSRavi Bangoria			opcode, retval):
175*118af5bfSTony Jones	if (cpu in d_enter and opcode in d_enter[cpu]):
176ec1e6e6aSRavi Bangoria		diff = nsecs(sec, nsec) - d_enter[cpu][opcode]
177ec1e6e6aSRavi Bangoria
178*118af5bfSTony Jones		if (opcode in output):
179ec1e6e6aSRavi Bangoria			output[opcode]['time'] += diff
180ec1e6e6aSRavi Bangoria			output[opcode]['cnt'] += 1
181ec1e6e6aSRavi Bangoria			if (output[opcode]['min'] > diff):
182ec1e6e6aSRavi Bangoria				output[opcode]['min'] = diff
183ec1e6e6aSRavi Bangoria			if (output[opcode]['max'] < diff):
184ec1e6e6aSRavi Bangoria				output[opcode]['max'] = diff
185ec1e6e6aSRavi Bangoria		else:
186ec1e6e6aSRavi Bangoria			output[opcode] = {
187ec1e6e6aSRavi Bangoria				'time': diff,
188ec1e6e6aSRavi Bangoria				'cnt': 1,
189ec1e6e6aSRavi Bangoria				'min': diff,
190ec1e6e6aSRavi Bangoria				'max': diff,
191ec1e6e6aSRavi Bangoria			}
192ec1e6e6aSRavi Bangoria
193ec1e6e6aSRavi Bangoria		del d_enter[cpu][opcode]
194ec1e6e6aSRavi Bangoria#	else:
195*118af5bfSTony Jones#		print("Can't find matching hcall_enter event. Ignoring sample")
196ec1e6e6aSRavi Bangoria
197ec1e6e6aSRavi Bangoriadef powerpc__hcall_entry(event_name, context, cpu, sec, nsec, pid, comm,
198ec1e6e6aSRavi Bangoria			 callchain, opcode):
199*118af5bfSTony Jones		if (cpu in d_enter):
200ec1e6e6aSRavi Bangoria			d_enter[cpu][opcode] = nsecs(sec, nsec)
201ec1e6e6aSRavi Bangoria		else:
202ec1e6e6aSRavi Bangoria			d_enter[cpu] = {opcode: nsecs(sec, nsec)}
203