diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-01 16:48:11 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-01 16:48:11 -0800 |
commit | fba40b7a8c495dbfb5219c2fd478ce993f4b4c45 (patch) | |
tree | 94ae5a126be93aeff568570e049a13a2f3e33214 | |
parent | 5e29b5ccff5958ce4e8ddfd9feefdb6d562843f9 (diff) | |
download | riscv-pk-fba40b7a8c495dbfb5219c2fd478ce993f4b4c45.zip riscv-pk-fba40b7a8c495dbfb5219c2fd478ce993f4b4c45.tar.gz riscv-pk-fba40b7a8c495dbfb5219c2fd478ce993f4b4c45.tar.bz2 |
Use new counter-enable CSRs
-rw-r--r-- | pk/emulation.c | 13 | ||||
-rw-r--r-- | pk/encoding.h | 34 | ||||
-rw-r--r-- | pk/minit.c | 2 | ||||
-rw-r--r-- | pk/mtrap.h | 10 |
4 files changed, 54 insertions, 5 deletions
diff --git a/pk/emulation.c b/pk/emulation.c index fb655ef..87db2de 100644 --- a/pk/emulation.c +++ b/pk/emulation.c @@ -248,12 +248,21 @@ static inline int emulate_read_csr(int num, uintptr_t mstatus, uintptr_t* result switch (num) { case CSR_TIME: - *result = read_csr(mtime) + HLS()->stime_delta; + *result = read_csr(mtime) + HLS()->utime_delta; return 0; case CSR_CYCLE: - *result = read_csr(mcycle) + HLS()->scycle_delta; + *result = read_csr(mcycle) + HLS()->ucycle_delta; return 0; case CSR_INSTRET: + *result = read_csr(minstret) + HLS()->uinstret_delta; + return 0; + case CSR_STIME: + *result = read_csr(mtime) + HLS()->stime_delta; + return 0; + case CSR_SCYCLE: + *result = read_csr(mcycle) + HLS()->scycle_delta; + return 0; + case CSR_SINSTRET: *result = read_csr(minstret) + HLS()->sinstret_delta; return 0; #ifdef __riscv32 diff --git a/pk/encoding.h b/pk/encoding.h index 1127234..9189fde 100644 --- a/pk/encoding.h +++ b/pk/encoding.h @@ -647,6 +647,9 @@ #define CSR_SIP 0x144 #define CSR_SPTBR 0x180 #define CSR_SASID 0x181 +#define CSR_SCYCLE 0xd00 +#define CSR_STIME 0xd01 +#define CSR_SINSTRET 0xd02 #define CSR_MSTATUS 0x300 #define CSR_MEDELEG 0x302 #define CSR_MIDELEG 0x303 @@ -659,6 +662,14 @@ #define CSR_MBADADDR 0x343 #define CSR_MIP 0x344 #define CSR_MIPI 0x345 +#define CSR_MUCOUNTEREN 0x310 +#define CSR_MSCOUNTEREN 0x311 +#define CSR_MUCYCLE_DELTA 0x700 +#define CSR_MUTIME_DELTA 0x701 +#define CSR_MUINSTRET_DELTA 0x702 +#define CSR_MSCYCLE_DELTA 0x704 +#define CSR_MSTIME_DELTA 0x705 +#define CSR_MSINSTRET_DELTA 0x706 #define CSR_MCYCLE 0xf00 #define CSR_MTIME 0xf01 #define CSR_MINSTRET 0xf02 @@ -675,6 +686,12 @@ #define CSR_TIMEH 0xc81 #define CSR_INSTRETH 0xc82 #define CSR_MTIMECMPH 0x361 +#define CSR_MUCYCLE_DELTAH 0x780 +#define CSR_MUTIME_DELTAH 0x781 +#define CSR_MUINSTRET_DELTAH 0x782 +#define CSR_MSCYCLE_DELTAH 0x784 +#define CSR_MSTIME_DELTAH 0x785 +#define CSR_MSINSTRET_DELTAH 0x786 #define CSR_MCYCLEH 0xf80 #define CSR_MTIMEH 0xf81 #define CSR_MINSTRETH 0xf82 @@ -952,6 +969,9 @@ DECLARE_CSR(sbadaddr, CSR_SBADADDR) DECLARE_CSR(sip, CSR_SIP) DECLARE_CSR(sptbr, CSR_SPTBR) DECLARE_CSR(sasid, CSR_SASID) +DECLARE_CSR(scycle, CSR_SCYCLE) +DECLARE_CSR(stime, CSR_STIME) +DECLARE_CSR(sinstret, CSR_SINSTRET) DECLARE_CSR(mstatus, CSR_MSTATUS) DECLARE_CSR(medeleg, CSR_MEDELEG) DECLARE_CSR(mideleg, CSR_MIDELEG) @@ -964,6 +984,14 @@ DECLARE_CSR(mcause, CSR_MCAUSE) DECLARE_CSR(mbadaddr, CSR_MBADADDR) DECLARE_CSR(mip, CSR_MIP) DECLARE_CSR(mipi, CSR_MIPI) +DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN) +DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) +DECLARE_CSR(mucycle_delta, CSR_MUCYCLE_DELTA) +DECLARE_CSR(mutime_delta, CSR_MUTIME_DELTA) +DECLARE_CSR(muinstret_delta, CSR_MUINSTRET_DELTA) +DECLARE_CSR(mscycle_delta, CSR_MSCYCLE_DELTA) +DECLARE_CSR(mstime_delta, CSR_MSTIME_DELTA) +DECLARE_CSR(msinstret_delta, CSR_MSINSTRET_DELTA) DECLARE_CSR(mcycle, CSR_MCYCLE) DECLARE_CSR(mtime, CSR_MTIME) DECLARE_CSR(minstret, CSR_MINSTRET) @@ -980,6 +1008,12 @@ DECLARE_CSR(cycleh, CSR_CYCLEH) DECLARE_CSR(timeh, CSR_TIMEH) DECLARE_CSR(instreth, CSR_INSTRETH) DECLARE_CSR(mtimecmph, CSR_MTIMECMPH) +DECLARE_CSR(mucycle_deltah, CSR_MUCYCLE_DELTAH) +DECLARE_CSR(mutime_deltah, CSR_MUTIME_DELTAH) +DECLARE_CSR(muinstret_deltah, CSR_MUINSTRET_DELTAH) +DECLARE_CSR(mscycle_deltah, CSR_MSCYCLE_DELTAH) +DECLARE_CSR(mstime_deltah, CSR_MSTIME_DELTAH) +DECLARE_CSR(msinstret_deltah, CSR_MSINSTRET_DELTAH) DECLARE_CSR(mcycleh, CSR_MCYCLEH) DECLARE_CSR(mtimeh, CSR_MTIMEH) DECLARE_CSR(minstreth, CSR_MINSTRETH) @@ -22,6 +22,8 @@ static void mstatus_init() write_csr(mtimecmp, 0); clear_csr(mip, MIP_MSIP); write_csr(mie, -1); + write_csr(mucounteren, -1); + write_csr(mscounteren, -1); } static void delegate_traps() @@ -164,13 +164,17 @@ static inline int xlen() typedef struct { volatile uintptr_t* csrs; - uint64_t stime_delta; - uint64_t scycle_delta; - uint64_t sinstret_delta; int hart_id; volatile int mipi_pending; volatile int sipi_pending; int console_ibuf; + + uint64_t utime_delta; + uint64_t ucycle_delta; + uint64_t uinstret_delta; + uint64_t stime_delta; + uint64_t scycle_delta; + uint64_t sinstret_delta; } hls_t; #define IPI_SOFT 0x1 |