diff options
Diffstat (limited to 'Documentation/trace/postprocess/decode_msr.py')
-rw-r--r-- | Documentation/trace/postprocess/decode_msr.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Documentation/trace/postprocess/decode_msr.py b/Documentation/trace/postprocess/decode_msr.py new file mode 100644 index 000000000000..0ab40e0db580 --- /dev/null +++ b/Documentation/trace/postprocess/decode_msr.py | |||
@@ -0,0 +1,37 @@ | |||
1 | #!/usr/bin/python | ||
2 | # add symbolic names to read_msr / write_msr in trace | ||
3 | # decode_msr msr-index.h < trace | ||
4 | import sys | ||
5 | import re | ||
6 | |||
7 | msrs = dict() | ||
8 | |||
9 | with open(sys.argv[1] if len(sys.argv) > 1 else "msr-index.h", "r") as f: | ||
10 | for j in f: | ||
11 | m = re.match(r'#define (MSR_\w+)\s+(0x[0-9a-fA-F]+)', j) | ||
12 | if m: | ||
13 | msrs[int(m.group(2), 16)] = m.group(1) | ||
14 | |||
15 | extra_ranges = ( | ||
16 | ( "MSR_LASTBRANCH_%d_FROM_IP", 0x680, 0x69F ), | ||
17 | ( "MSR_LASTBRANCH_%d_TO_IP", 0x6C0, 0x6DF ), | ||
18 | ( "LBR_INFO_%d", 0xdc0, 0xddf ), | ||
19 | ) | ||
20 | |||
21 | for j in sys.stdin: | ||
22 | m = re.search(r'(read|write)_msr:\s+([0-9a-f]+)', j) | ||
23 | if m: | ||
24 | r = None | ||
25 | num = int(m.group(2), 16) | ||
26 | if num in msrs: | ||
27 | r = msrs[num] | ||
28 | else: | ||
29 | for er in extra_ranges: | ||
30 | if er[1] <= num <= er[2]: | ||
31 | r = er[0] % (num - er[1],) | ||
32 | break | ||
33 | if r: | ||
34 | j = j.replace(" " + m.group(2), " " + r + "(" + m.group(2) + ")") | ||
35 | print j, | ||
36 | |||
37 | |||