decode_msr.py 843 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/env 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. msrs = dict()
  7. with open(sys.argv[1] if len(sys.argv) > 1 else "msr-index.h", "r") as f:
  8. for j in f:
  9. m = re.match(r'#define (MSR_\w+)\s+(0x[0-9a-fA-F]+)', j)
  10. if m:
  11. msrs[int(m.group(2), 16)] = m.group(1)
  12. extra_ranges = (
  13. ( "MSR_LASTBRANCH_%d_FROM_IP", 0x680, 0x69F ),
  14. ( "MSR_LASTBRANCH_%d_TO_IP", 0x6C0, 0x6DF ),
  15. ( "LBR_INFO_%d", 0xdc0, 0xddf ),
  16. )
  17. for j in sys.stdin:
  18. m = re.search(r'(read|write)_msr:\s+([0-9a-f]+)', j)
  19. if m:
  20. r = None
  21. num = int(m.group(2), 16)
  22. if num in msrs:
  23. r = msrs[num]
  24. else:
  25. for er in extra_ranges:
  26. if er[1] <= num <= er[2]:
  27. r = er[0] % (num - er[1],)
  28. break
  29. if r:
  30. j = j.replace(" " + m.group(2), " " + r + "(" + m.group(2) + ")")
  31. print j,