162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci# 362306a36Sopenharmony_ci# Copyright (C) 2018 Ravi Bangoria, IBM Corporation 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Hypervisor call statisics 662306a36Sopenharmony_ci 762306a36Sopenharmony_cifrom __future__ import print_function 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciimport os 1062306a36Sopenharmony_ciimport sys 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 1362306a36Sopenharmony_ci '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cifrom perf_trace_context import * 1662306a36Sopenharmony_cifrom Core import * 1762306a36Sopenharmony_cifrom Util import * 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci# output: { 2062306a36Sopenharmony_ci# opcode: { 2162306a36Sopenharmony_ci# 'min': minimum time nsec 2262306a36Sopenharmony_ci# 'max': maximum time nsec 2362306a36Sopenharmony_ci# 'time': average time nsec 2462306a36Sopenharmony_ci# 'cnt': counter 2562306a36Sopenharmony_ci# } ... 2662306a36Sopenharmony_ci# } 2762306a36Sopenharmony_cioutput = {} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci# d_enter: { 3062306a36Sopenharmony_ci# cpu: { 3162306a36Sopenharmony_ci# opcode: nsec 3262306a36Sopenharmony_ci# } ... 3362306a36Sopenharmony_ci# } 3462306a36Sopenharmony_cid_enter = {} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cihcall_table = { 3762306a36Sopenharmony_ci 4: 'H_REMOVE', 3862306a36Sopenharmony_ci 8: 'H_ENTER', 3962306a36Sopenharmony_ci 12: 'H_READ', 4062306a36Sopenharmony_ci 16: 'H_CLEAR_MOD', 4162306a36Sopenharmony_ci 20: 'H_CLEAR_REF', 4262306a36Sopenharmony_ci 24: 'H_PROTECT', 4362306a36Sopenharmony_ci 28: 'H_GET_TCE', 4462306a36Sopenharmony_ci 32: 'H_PUT_TCE', 4562306a36Sopenharmony_ci 36: 'H_SET_SPRG0', 4662306a36Sopenharmony_ci 40: 'H_SET_DABR', 4762306a36Sopenharmony_ci 44: 'H_PAGE_INIT', 4862306a36Sopenharmony_ci 48: 'H_SET_ASR', 4962306a36Sopenharmony_ci 52: 'H_ASR_ON', 5062306a36Sopenharmony_ci 56: 'H_ASR_OFF', 5162306a36Sopenharmony_ci 60: 'H_LOGICAL_CI_LOAD', 5262306a36Sopenharmony_ci 64: 'H_LOGICAL_CI_STORE', 5362306a36Sopenharmony_ci 68: 'H_LOGICAL_CACHE_LOAD', 5462306a36Sopenharmony_ci 72: 'H_LOGICAL_CACHE_STORE', 5562306a36Sopenharmony_ci 76: 'H_LOGICAL_ICBI', 5662306a36Sopenharmony_ci 80: 'H_LOGICAL_DCBF', 5762306a36Sopenharmony_ci 84: 'H_GET_TERM_CHAR', 5862306a36Sopenharmony_ci 88: 'H_PUT_TERM_CHAR', 5962306a36Sopenharmony_ci 92: 'H_REAL_TO_LOGICAL', 6062306a36Sopenharmony_ci 96: 'H_HYPERVISOR_DATA', 6162306a36Sopenharmony_ci 100: 'H_EOI', 6262306a36Sopenharmony_ci 104: 'H_CPPR', 6362306a36Sopenharmony_ci 108: 'H_IPI', 6462306a36Sopenharmony_ci 112: 'H_IPOLL', 6562306a36Sopenharmony_ci 116: 'H_XIRR', 6662306a36Sopenharmony_ci 120: 'H_MIGRATE_DMA', 6762306a36Sopenharmony_ci 124: 'H_PERFMON', 6862306a36Sopenharmony_ci 220: 'H_REGISTER_VPA', 6962306a36Sopenharmony_ci 224: 'H_CEDE', 7062306a36Sopenharmony_ci 228: 'H_CONFER', 7162306a36Sopenharmony_ci 232: 'H_PROD', 7262306a36Sopenharmony_ci 236: 'H_GET_PPP', 7362306a36Sopenharmony_ci 240: 'H_SET_PPP', 7462306a36Sopenharmony_ci 244: 'H_PURR', 7562306a36Sopenharmony_ci 248: 'H_PIC', 7662306a36Sopenharmony_ci 252: 'H_REG_CRQ', 7762306a36Sopenharmony_ci 256: 'H_FREE_CRQ', 7862306a36Sopenharmony_ci 260: 'H_VIO_SIGNAL', 7962306a36Sopenharmony_ci 264: 'H_SEND_CRQ', 8062306a36Sopenharmony_ci 272: 'H_COPY_RDMA', 8162306a36Sopenharmony_ci 276: 'H_REGISTER_LOGICAL_LAN', 8262306a36Sopenharmony_ci 280: 'H_FREE_LOGICAL_LAN', 8362306a36Sopenharmony_ci 284: 'H_ADD_LOGICAL_LAN_BUFFER', 8462306a36Sopenharmony_ci 288: 'H_SEND_LOGICAL_LAN', 8562306a36Sopenharmony_ci 292: 'H_BULK_REMOVE', 8662306a36Sopenharmony_ci 304: 'H_MULTICAST_CTRL', 8762306a36Sopenharmony_ci 308: 'H_SET_XDABR', 8862306a36Sopenharmony_ci 312: 'H_STUFF_TCE', 8962306a36Sopenharmony_ci 316: 'H_PUT_TCE_INDIRECT', 9062306a36Sopenharmony_ci 332: 'H_CHANGE_LOGICAL_LAN_MAC', 9162306a36Sopenharmony_ci 336: 'H_VTERM_PARTNER_INFO', 9262306a36Sopenharmony_ci 340: 'H_REGISTER_VTERM', 9362306a36Sopenharmony_ci 344: 'H_FREE_VTERM', 9462306a36Sopenharmony_ci 348: 'H_RESET_EVENTS', 9562306a36Sopenharmony_ci 352: 'H_ALLOC_RESOURCE', 9662306a36Sopenharmony_ci 356: 'H_FREE_RESOURCE', 9762306a36Sopenharmony_ci 360: 'H_MODIFY_QP', 9862306a36Sopenharmony_ci 364: 'H_QUERY_QP', 9962306a36Sopenharmony_ci 368: 'H_REREGISTER_PMR', 10062306a36Sopenharmony_ci 372: 'H_REGISTER_SMR', 10162306a36Sopenharmony_ci 376: 'H_QUERY_MR', 10262306a36Sopenharmony_ci 380: 'H_QUERY_MW', 10362306a36Sopenharmony_ci 384: 'H_QUERY_HCA', 10462306a36Sopenharmony_ci 388: 'H_QUERY_PORT', 10562306a36Sopenharmony_ci 392: 'H_MODIFY_PORT', 10662306a36Sopenharmony_ci 396: 'H_DEFINE_AQP1', 10762306a36Sopenharmony_ci 400: 'H_GET_TRACE_BUFFER', 10862306a36Sopenharmony_ci 404: 'H_DEFINE_AQP0', 10962306a36Sopenharmony_ci 408: 'H_RESIZE_MR', 11062306a36Sopenharmony_ci 412: 'H_ATTACH_MCQP', 11162306a36Sopenharmony_ci 416: 'H_DETACH_MCQP', 11262306a36Sopenharmony_ci 420: 'H_CREATE_RPT', 11362306a36Sopenharmony_ci 424: 'H_REMOVE_RPT', 11462306a36Sopenharmony_ci 428: 'H_REGISTER_RPAGES', 11562306a36Sopenharmony_ci 432: 'H_DISABLE_AND_GETC', 11662306a36Sopenharmony_ci 436: 'H_ERROR_DATA', 11762306a36Sopenharmony_ci 440: 'H_GET_HCA_INFO', 11862306a36Sopenharmony_ci 444: 'H_GET_PERF_COUNT', 11962306a36Sopenharmony_ci 448: 'H_MANAGE_TRACE', 12062306a36Sopenharmony_ci 468: 'H_FREE_LOGICAL_LAN_BUFFER', 12162306a36Sopenharmony_ci 472: 'H_POLL_PENDING', 12262306a36Sopenharmony_ci 484: 'H_QUERY_INT_STATE', 12362306a36Sopenharmony_ci 580: 'H_ILLAN_ATTRIBUTES', 12462306a36Sopenharmony_ci 592: 'H_MODIFY_HEA_QP', 12562306a36Sopenharmony_ci 596: 'H_QUERY_HEA_QP', 12662306a36Sopenharmony_ci 600: 'H_QUERY_HEA', 12762306a36Sopenharmony_ci 604: 'H_QUERY_HEA_PORT', 12862306a36Sopenharmony_ci 608: 'H_MODIFY_HEA_PORT', 12962306a36Sopenharmony_ci 612: 'H_REG_BCMC', 13062306a36Sopenharmony_ci 616: 'H_DEREG_BCMC', 13162306a36Sopenharmony_ci 620: 'H_REGISTER_HEA_RPAGES', 13262306a36Sopenharmony_ci 624: 'H_DISABLE_AND_GET_HEA', 13362306a36Sopenharmony_ci 628: 'H_GET_HEA_INFO', 13462306a36Sopenharmony_ci 632: 'H_ALLOC_HEA_RESOURCE', 13562306a36Sopenharmony_ci 644: 'H_ADD_CONN', 13662306a36Sopenharmony_ci 648: 'H_DEL_CONN', 13762306a36Sopenharmony_ci 664: 'H_JOIN', 13862306a36Sopenharmony_ci 676: 'H_VASI_STATE', 13962306a36Sopenharmony_ci 688: 'H_ENABLE_CRQ', 14062306a36Sopenharmony_ci 696: 'H_GET_EM_PARMS', 14162306a36Sopenharmony_ci 720: 'H_SET_MPP', 14262306a36Sopenharmony_ci 724: 'H_GET_MPP', 14362306a36Sopenharmony_ci 748: 'H_HOME_NODE_ASSOCIATIVITY', 14462306a36Sopenharmony_ci 756: 'H_BEST_ENERGY', 14562306a36Sopenharmony_ci 764: 'H_XIRR_X', 14662306a36Sopenharmony_ci 768: 'H_RANDOM', 14762306a36Sopenharmony_ci 772: 'H_COP', 14862306a36Sopenharmony_ci 788: 'H_GET_MPP_X', 14962306a36Sopenharmony_ci 796: 'H_SET_MODE', 15062306a36Sopenharmony_ci 61440: 'H_RTAS', 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cidef hcall_table_lookup(opcode): 15462306a36Sopenharmony_ci if (opcode in hcall_table): 15562306a36Sopenharmony_ci return hcall_table[opcode] 15662306a36Sopenharmony_ci else: 15762306a36Sopenharmony_ci return opcode 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciprint_ptrn = '%-28s%10s%10s%10s%10s' 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cidef trace_end(): 16262306a36Sopenharmony_ci print(print_ptrn % ('hcall', 'count', 'min(ns)', 'max(ns)', 'avg(ns)')) 16362306a36Sopenharmony_ci print('-' * 68) 16462306a36Sopenharmony_ci for opcode in output: 16562306a36Sopenharmony_ci h_name = hcall_table_lookup(opcode) 16662306a36Sopenharmony_ci time = output[opcode]['time'] 16762306a36Sopenharmony_ci cnt = output[opcode]['cnt'] 16862306a36Sopenharmony_ci min_t = output[opcode]['min'] 16962306a36Sopenharmony_ci max_t = output[opcode]['max'] 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci print(print_ptrn % (h_name, cnt, min_t, max_t, time//cnt)) 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cidef powerpc__hcall_exit(name, context, cpu, sec, nsec, pid, comm, callchain, 17462306a36Sopenharmony_ci opcode, retval): 17562306a36Sopenharmony_ci if (cpu in d_enter and opcode in d_enter[cpu]): 17662306a36Sopenharmony_ci diff = nsecs(sec, nsec) - d_enter[cpu][opcode] 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci if (opcode in output): 17962306a36Sopenharmony_ci output[opcode]['time'] += diff 18062306a36Sopenharmony_ci output[opcode]['cnt'] += 1 18162306a36Sopenharmony_ci if (output[opcode]['min'] > diff): 18262306a36Sopenharmony_ci output[opcode]['min'] = diff 18362306a36Sopenharmony_ci if (output[opcode]['max'] < diff): 18462306a36Sopenharmony_ci output[opcode]['max'] = diff 18562306a36Sopenharmony_ci else: 18662306a36Sopenharmony_ci output[opcode] = { 18762306a36Sopenharmony_ci 'time': diff, 18862306a36Sopenharmony_ci 'cnt': 1, 18962306a36Sopenharmony_ci 'min': diff, 19062306a36Sopenharmony_ci 'max': diff, 19162306a36Sopenharmony_ci } 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci del d_enter[cpu][opcode] 19462306a36Sopenharmony_ci# else: 19562306a36Sopenharmony_ci# print("Can't find matching hcall_enter event. Ignoring sample") 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cidef powerpc__hcall_entry(event_name, context, cpu, sec, nsec, pid, comm, 19862306a36Sopenharmony_ci callchain, opcode): 19962306a36Sopenharmony_ci if (cpu in d_enter): 20062306a36Sopenharmony_ci d_enter[cpu][opcode] = nsecs(sec, nsec) 20162306a36Sopenharmony_ci else: 20262306a36Sopenharmony_ci d_enter[cpu] = {opcode: nsecs(sec, nsec)} 203