From 944032329cbbc866c83af82e6419dcc39ad5569f Mon Sep 17 00:00:00 2001 From: Kito Cheng Date: Tue, 27 Aug 2019 19:33:11 +0800 Subject: [PATCH] Retry if mcycle overflow when get cycle --- src/drivers/riscv_cpu.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/drivers/riscv_cpu.c b/src/drivers/riscv_cpu.c index 96b19369..0b29833f 100644 --- a/src/drivers/riscv_cpu.c +++ b/src/drivers/riscv_cpu.c @@ -499,12 +499,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