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