18c2ecf20Sopenharmony_ci#!/usr/bin/env python
28c2ecf20Sopenharmony_ci# add symbolic names to read_msr / write_msr in trace
38c2ecf20Sopenharmony_ci# decode_msr msr-index.h < trace
48c2ecf20Sopenharmony_ciimport sys
58c2ecf20Sopenharmony_ciimport re
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_cimsrs = dict()
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciwith open(sys.argv[1] if len(sys.argv) > 1 else "msr-index.h", "r") as f:
108c2ecf20Sopenharmony_ci	for j in f:
118c2ecf20Sopenharmony_ci		m = re.match(r'#define (MSR_\w+)\s+(0x[0-9a-fA-F]+)', j)
128c2ecf20Sopenharmony_ci		if m:
138c2ecf20Sopenharmony_ci			msrs[int(m.group(2), 16)] = m.group(1)
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ciextra_ranges = (
168c2ecf20Sopenharmony_ci	( "MSR_LASTBRANCH_%d_FROM_IP", 0x680, 0x69F ),
178c2ecf20Sopenharmony_ci	( "MSR_LASTBRANCH_%d_TO_IP", 0x6C0, 0x6DF ),
188c2ecf20Sopenharmony_ci	( "LBR_INFO_%d", 0xdc0, 0xddf ),
198c2ecf20Sopenharmony_ci)
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cifor j in sys.stdin:
228c2ecf20Sopenharmony_ci	m = re.search(r'(read|write)_msr:\s+([0-9a-f]+)', j)
238c2ecf20Sopenharmony_ci	if m:
248c2ecf20Sopenharmony_ci		r = None
258c2ecf20Sopenharmony_ci		num = int(m.group(2), 16)
268c2ecf20Sopenharmony_ci		if num in msrs:
278c2ecf20Sopenharmony_ci			r = msrs[num]
288c2ecf20Sopenharmony_ci		else:
298c2ecf20Sopenharmony_ci			for er in extra_ranges:
308c2ecf20Sopenharmony_ci				if er[1] <= num <= er[2]:
318c2ecf20Sopenharmony_ci					r = er[0] % (num - er[1],)
328c2ecf20Sopenharmony_ci					break
338c2ecf20Sopenharmony_ci		if r:
348c2ecf20Sopenharmony_ci			j = j.replace(" " + m.group(2), " " + r + "(" + m.group(2) + ")")
358c2ecf20Sopenharmony_ci	print j,
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci
38