decode_msr.py (843B)
1#!/usr/bin/env python 2# add symbolic names to read_msr / write_msr in trace 3# decode_msr msr-index.h < trace 4import sys 5import re 6 7msrs = dict() 8 9with 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 15extra_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 21for 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