1765532c8SArnaldo Carvalho de Melo# Util.py - Python extension for perf script, miscellaneous utility code
27e4b21b8STom Zanussi#
37e4b21b8STom Zanussi# Copyright (C) 2010 by Tom Zanussi <[email protected]>
47e4b21b8STom Zanussi#
57e4b21b8STom Zanussi# This software may be distributed under the terms of the GNU General
67e4b21b8STom Zanussi# Public License ("GPL") version 2 as published by the Free Software
77e4b21b8STom Zanussi# Foundation.
8c45b168eSJeremy Clinefrom __future__ import print_function
97e4b21b8STom Zanussi
106cc73614SArnaldo Carvalho de Meloimport errno, os
116cc73614SArnaldo Carvalho de Melo
1200204c33SArnaldo Carvalho de MeloFUTEX_WAIT = 0
1300204c33SArnaldo Carvalho de MeloFUTEX_WAKE = 1
1400204c33SArnaldo Carvalho de MeloFUTEX_PRIVATE_FLAG = 128
1500204c33SArnaldo Carvalho de MeloFUTEX_CLOCK_REALTIME = 256
1600204c33SArnaldo Carvalho de MeloFUTEX_CMD_MASK = ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
1700204c33SArnaldo Carvalho de Melo
187e4b21b8STom ZanussiNSECS_PER_SEC    = 1000000000
197e4b21b8STom Zanussi
207e4b21b8STom Zanussidef avg(total, n):
217e4b21b8STom Zanussi    return total / n
227e4b21b8STom Zanussi
237e4b21b8STom Zanussidef nsecs(secs, nsecs):
247e4b21b8STom Zanussi    return secs * NSECS_PER_SEC + nsecs
257e4b21b8STom Zanussi
267e4b21b8STom Zanussidef nsecs_secs(nsecs):
277e4b21b8STom Zanussi    return nsecs / NSECS_PER_SEC
287e4b21b8STom Zanussi
297e4b21b8STom Zanussidef nsecs_nsecs(nsecs):
307e4b21b8STom Zanussi    return nsecs % NSECS_PER_SEC
317e4b21b8STom Zanussi
327e4b21b8STom Zanussidef nsecs_str(nsecs):
337e4b21b8STom Zanussi    str = "%5u.%09u" % (nsecs_secs(nsecs), nsecs_nsecs(nsecs)),
347e4b21b8STom Zanussi    return str
3547902f36STom Zanussi
3600204c33SArnaldo Carvalho de Melodef add_stats(dict, key, value):
37c45b168eSJeremy Cline	if key not in dict:
3800204c33SArnaldo Carvalho de Melo		dict[key] = (value, value, value, 1)
3900204c33SArnaldo Carvalho de Melo	else:
4000204c33SArnaldo Carvalho de Melo		min, max, avg, count = dict[key]
4100204c33SArnaldo Carvalho de Melo		if value < min:
4200204c33SArnaldo Carvalho de Melo			min = value
4300204c33SArnaldo Carvalho de Melo		if value > max:
4400204c33SArnaldo Carvalho de Melo			max = value
4500204c33SArnaldo Carvalho de Melo		avg = (avg + value) / 2
4600204c33SArnaldo Carvalho de Melo		dict[key] = (min, max, avg, count + 1)
4700204c33SArnaldo Carvalho de Melo
4847902f36STom Zanussidef clear_term():
4947902f36STom Zanussi    print("\x1b[H\x1b[2J")
506cc73614SArnaldo Carvalho de Melo
516cc73614SArnaldo Carvalho de Meloaudit_package_warned = False
526cc73614SArnaldo Carvalho de Melo
536cc73614SArnaldo Carvalho de Melotry:
546cc73614SArnaldo Carvalho de Melo	import audit
556cc73614SArnaldo Carvalho de Melo	machine_to_id = {
566cc73614SArnaldo Carvalho de Melo		'x86_64': audit.MACH_86_64,
57708a3e8bSWei Li		'aarch64': audit.MACH_AARCH64,
586cc73614SArnaldo Carvalho de Melo		'alpha'	: audit.MACH_ALPHA,
596cc73614SArnaldo Carvalho de Melo		'ia64'	: audit.MACH_IA64,
606cc73614SArnaldo Carvalho de Melo		'ppc'	: audit.MACH_PPC,
616cc73614SArnaldo Carvalho de Melo		'ppc64'	: audit.MACH_PPC64,
626fae8663SNaveen N. Rao		'ppc64le' : audit.MACH_PPC64LE,
636cc73614SArnaldo Carvalho de Melo		's390'	: audit.MACH_S390,
646cc73614SArnaldo Carvalho de Melo		's390x'	: audit.MACH_S390X,
656cc73614SArnaldo Carvalho de Melo		'i386'	: audit.MACH_X86,
666cc73614SArnaldo Carvalho de Melo		'i586'	: audit.MACH_X86,
676cc73614SArnaldo Carvalho de Melo		'i686'	: audit.MACH_X86,
686cc73614SArnaldo Carvalho de Melo	}
697f6c1bd5SArnaldo Carvalho de Melo	try:
707f6c1bd5SArnaldo Carvalho de Melo		machine_to_id['armeb'] = audit.MACH_ARMEB
717f6c1bd5SArnaldo Carvalho de Melo	except:
727f6c1bd5SArnaldo Carvalho de Melo		pass
736cc73614SArnaldo Carvalho de Melo	machine_id = machine_to_id[os.uname()[4]]
746cc73614SArnaldo Carvalho de Meloexcept:
756cc73614SArnaldo Carvalho de Melo	if not audit_package_warned:
766cc73614SArnaldo Carvalho de Melo		audit_package_warned = True
77*41a37430SWei Li		print("Install the python-audit package to get syscall names.\n"
78*41a37430SWei Li                    "For example:\n  # apt-get install python3-audit (Ubuntu)"
79*41a37430SWei Li                    "\n  # yum install python3-audit (Fedora)"
80c45b168eSJeremy Cline                    "\n  etc.\n")
816cc73614SArnaldo Carvalho de Melo
826cc73614SArnaldo Carvalho de Melodef syscall_name(id):
836cc73614SArnaldo Carvalho de Melo	try:
846cc73614SArnaldo Carvalho de Melo		return audit.audit_syscall_to_name(id, machine_id)
856cc73614SArnaldo Carvalho de Melo	except:
866cc73614SArnaldo Carvalho de Melo		return str(id)
876cc73614SArnaldo Carvalho de Melo
886cc73614SArnaldo Carvalho de Melodef strerror(nr):
896cc73614SArnaldo Carvalho de Melo	try:
906cc73614SArnaldo Carvalho de Melo		return errno.errorcode[abs(nr)]
916cc73614SArnaldo Carvalho de Melo	except:
926cc73614SArnaldo Carvalho de Melo		return "Unknown %d errno" % nr
93