162306a36Sopenharmony_ci#!/usr/bin/env python
262306a36Sopenharmony_ci# add symbolic names to read_msr / write_msr in trace
362306a36Sopenharmony_ci# decode_msr msr-index.h < trace
462306a36Sopenharmony_ciimport sys
562306a36Sopenharmony_ciimport re
662306a36Sopenharmony_ci
762306a36Sopenharmony_cimsrs = dict()
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciwith open(sys.argv[1] if len(sys.argv) > 1 else "msr-index.h", "r") as f:
1062306a36Sopenharmony_ci	for j in f:
1162306a36Sopenharmony_ci		m = re.match(r'#define (MSR_\w+)\s+(0x[0-9a-fA-F]+)', j)
1262306a36Sopenharmony_ci		if m:
1362306a36Sopenharmony_ci			msrs[int(m.group(2), 16)] = m.group(1)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciextra_ranges = (
1662306a36Sopenharmony_ci	( "MSR_LASTBRANCH_%d_FROM_IP", 0x680, 0x69F ),
1762306a36Sopenharmony_ci	( "MSR_LASTBRANCH_%d_TO_IP", 0x6C0, 0x6DF ),
1862306a36Sopenharmony_ci	( "LBR_INFO_%d", 0xdc0, 0xddf ),
1962306a36Sopenharmony_ci)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cifor j in sys.stdin:
2262306a36Sopenharmony_ci	m = re.search(r'(read|write)_msr:\s+([0-9a-f]+)', j)
2362306a36Sopenharmony_ci	if m:
2462306a36Sopenharmony_ci		r = None
2562306a36Sopenharmony_ci		num = int(m.group(2), 16)
2662306a36Sopenharmony_ci		if num in msrs:
2762306a36Sopenharmony_ci			r = msrs[num]
2862306a36Sopenharmony_ci		else:
2962306a36Sopenharmony_ci			for er in extra_ranges:
3062306a36Sopenharmony_ci				if er[1] <= num <= er[2]:
3162306a36Sopenharmony_ci					r = er[0] % (num - er[1],)
3262306a36Sopenharmony_ci					break
3362306a36Sopenharmony_ci		if r:
3462306a36Sopenharmony_ci			j = j.replace(" " + m.group(2), " " + r + "(" + m.group(2) + ")")
3562306a36Sopenharmony_ci	print j,
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci
38