| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- {# note: jinja2 hpm.tmpl > hmp.h#}
- switch (idx) {
- #if __RISCV_XLEN == 32
- {% for item in range(3, 32) -%}
- case {{item}}: __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, 0); // prevent carry
- __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}H, (uint32_t)(value >> 32));
- __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, (uint32_t)(value)); break;
- {% endfor %}
- #elif __RISCV_XLEN == 64
- {% for item in range(3, 32) -%}
- case {{item}}: __RV_CSR_WRITE(CSR_MHPMCOUNTER{{item}}, (value)); break;
- {% endfor %}
- #else
- #endif
- default: break;
- }
- #if __RISCV_XLEN == 32
- volatile uint32_t high0, low, high;
- uint64_t full;
- switch (idx) {
- case 0: return __get_rv_cycle();
- case 2: return __get_rv_instret();
- {% for item in range(3, 32) -%}
- case {{item}}: high0 = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}H);
- low = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}});
- high = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}H);
- if (high0 != high) { low = __RV_CSR_READ(CSR_MHPMCOUNTER{{item}}); }
- full = (((uint64_t)high) << 32) | low; return full;
- {% endfor %}
- #elif __RISCV_XLEN == 64
- switch (idx) {
- case 0: return __get_rv_cycle();
- case 2: return __get_rv_instret();
- {% for item in range(3, 32) -%}
- case {{item}}: return __RV_CSR_READ(CSR_MHPMCOUNTER{{item}});
- {% endfor %}
- #else
- switch (idx) {
- #endif
- default: return 0;
- }
- switch (idx) {
- {% for item in range(3, 32) -%}
- case {{item}}: __RV_CSR_WRITE(CSR_MHPMEVENT{{item}}, event); break;
- {% endfor %}default: break;
- }
- switch (idx) {
- {% for item in range(3, 32) -%}
- case {{item}}: return __RV_CSR_READ(CSR_MHPMEVENT{{item}});
- {% endfor %}default: return 0;
- }
|