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