xref: /OK3568_Linux_fs/kernel/Documentation/trace/postprocess/decode_msr.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/usr/bin/env python
2*4882a593Smuzhiyun# add symbolic names to read_msr / write_msr in trace
3*4882a593Smuzhiyun# decode_msr msr-index.h < trace
4*4882a593Smuzhiyunimport sys
5*4882a593Smuzhiyunimport re
6*4882a593Smuzhiyun
7*4882a593Smuzhiyunmsrs = dict()
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunwith open(sys.argv[1] if len(sys.argv) > 1 else "msr-index.h", "r") as f:
10*4882a593Smuzhiyun	for j in f:
11*4882a593Smuzhiyun		m = re.match(r'#define (MSR_\w+)\s+(0x[0-9a-fA-F]+)', j)
12*4882a593Smuzhiyun		if m:
13*4882a593Smuzhiyun			msrs[int(m.group(2), 16)] = m.group(1)
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunextra_ranges = (
16*4882a593Smuzhiyun	( "MSR_LASTBRANCH_%d_FROM_IP", 0x680, 0x69F ),
17*4882a593Smuzhiyun	( "MSR_LASTBRANCH_%d_TO_IP", 0x6C0, 0x6DF ),
18*4882a593Smuzhiyun	( "LBR_INFO_%d", 0xdc0, 0xddf ),
19*4882a593Smuzhiyun)
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunfor j in sys.stdin:
22*4882a593Smuzhiyun	m = re.search(r'(read|write)_msr:\s+([0-9a-f]+)', j)
23*4882a593Smuzhiyun	if m:
24*4882a593Smuzhiyun		r = None
25*4882a593Smuzhiyun		num = int(m.group(2), 16)
26*4882a593Smuzhiyun		if num in msrs:
27*4882a593Smuzhiyun			r = msrs[num]
28*4882a593Smuzhiyun		else:
29*4882a593Smuzhiyun			for er in extra_ranges:
30*4882a593Smuzhiyun				if er[1] <= num <= er[2]:
31*4882a593Smuzhiyun					r = er[0] % (num - er[1],)
32*4882a593Smuzhiyun					break
33*4882a593Smuzhiyun		if r:
34*4882a593Smuzhiyun			j = j.replace(" " + m.group(2), " " + r + "(" + m.group(2) + ")")
35*4882a593Smuzhiyun	print j,
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun
38