hpm.tmpl 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. {# note: jinja2 hpm.tmpl > hmp.h#}
  2. switch (idx) {
  3. #if __RISCV_XLEN == 32
  4. {% for item in range(3, 32) -%}
  5. case {{item}}: __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, 0); // prevent carry
  6. __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}H, (uint32_t)(value >> 32));
  7. __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, (uint32_t)(value)); break;
  8. {% endfor %}
  9. #elif __RISCV_XLEN == 64
  10. {% for item in range(3, 32) -%}
  11. case {{item}}: __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, (value)); break;
  12. {% endfor %}
  13. #else
  14. #endif
  15. default: break;
  16. }
  17. #if __RISCV_XLEN == 32
  18. volatile uint32_t high0, low, high;
  19. uint64_t full;
  20. switch (idx) {
  21. case 0: return __get_rv_cycle();
  22. case 2: return __get_rv_instret();
  23. {% for item in range(3, 32) -%}
  24. case {{item}}: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}H);
  25. low = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}});
  26. high = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}H);
  27. if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}); }
  28. full = (((uint64_t)high) << 32) | low; return full;
  29. {% endfor %}
  30. #elif __RISCV_XLEN == 64
  31. switch (idx) {
  32. case 0: return __get_rv_cycle();
  33. case 2: return __get_rv_instret();
  34. {% for item in range(3, 32) -%}
  35. case {{item}}: return __RV_CSR_READ(CSR_MHPMCOUNTER{{item}});
  36. {% endfor %}
  37. #else
  38. switch (idx) {
  39. #endif
  40. default: return 0;
  41. }
  42. switch (idx) {
  43. {% for item in range(3, 32) -%}
  44. case {{item}}: __RV_CSR_WRITE(CSR_MHPMEVENT{{item}}, event); break;
  45. {% endfor %}default: break;
  46. }
  47. switch (idx) {
  48. {% for item in range(3, 32) -%}
  49. case {{item}}: return __RV_CSR_READ(CSR_MHPMEVENT{{item}});
  50. {% endfor %}default: return 0;
  51. }