Skip to content

Commit

Permalink
Merge pull request #172 from sifive/mcycle-rv32
Browse files Browse the repository at this point in the history
Retry if mcycle overflow when get cycle
  • Loading branch information
nategraff-sifive authored Aug 28, 2019
2 parents 9329a08 + 9440323 commit fa83e2a
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions src/drivers/riscv_cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,12 +471,15 @@ unsigned long long __metal_driver_cpu_mcycle_get(struct metal_cpu *cpu) {
#if __riscv_xlen == 32
unsigned long hi, hi1, lo;

__asm__ volatile("csrr %0, mcycleh" : "=r"(hi));
__asm__ volatile("csrr %0, mcycle" : "=r"(lo));
__asm__ volatile("csrr %0, mcycleh" : "=r"(hi1));
if (hi == hi1) {
val = ((unsigned long long)hi << 32) | lo;
}
do {
__asm__ volatile("csrr %0, mcycleh" : "=r"(hi));
__asm__ volatile("csrr %0, mcycle" : "=r"(lo));
__asm__ volatile("csrr %0, mcycleh" : "=r"(hi1));
/* hi != hi1 means mcycle overflow during we get value,
* so we must retry. */
} while (hi != hi1);

val = ((unsigned long long)hi << 32) | lo;
#else
__asm__ volatile("csrr %0, mcycle" : "=r"(val));
#endif
Expand Down

0 comments on commit fa83e2a

Please sign in to comment.