cvw/tests/custom/crt0/pcnt_driver.s

148 lines
2.5 KiB
ArmAsm
Raw Normal View History

.section .text
.global enablePerfCnt
.type enablePerfCnt, @function
enablePerfCnt:
# a0 is the mask
csrrc x0, 0x320, a0 # clear bits to disable inhibit register
ret
.section .text
.global disablePerfCnt
.type disablePerfCnt, @function
disablePerfCnt:
# a0 is the mask
csrrs x0, 0x320, a0 # set bits to disable inhibit register
ret
.section .text
.global readPerfCnt
.type readPerfCnt, @function
readPerfCnt:
# a0 is the counter to read
# a1 is the flag to clear the register
# return the value of the counter in a0
li t0, 0xB
# if the counter number is greater than the number
# of counters return a -1
bge a0, t0, readPerfCntError
# pointers are 8 bytes so shift a0 by 8
slli a0, a0, 3
li t1, 1
beq a1, t1, readPerfCntClear
la t0, csrTable
j skip
readPerfCntClear:
la t0, csrTable_clear
skip:
add t0, t0, a0
ld t0, 0(t0)
jr t0
csrCycle:
csrrs a0, 0xB00, x0
ret
csrNull:
li a0, -1
ret
csrInstrCount:
csrrs a0, 0xB02, x0
ret
csrLoadStallCount:
csrrs a0, 0xB03, x0
ret
csrBPWrongCount:
csrrs a0, 0xB04, x0
ret
csrBPCount:
csrrs a0, 0xB05, x0
ret
csrBTBWrongCount:
csrrs a0, 0xB06, x0
ret
csrNonBRCFICount:
csrrs a0, 0xB07, x0
ret
csrRasWrongCount:
csrrs a0, 0xB08, x0
ret
csrReturnCount:
csrrs a0, 0xB09, x0
ret
csrBTBClassWrongCount:
csrrs a0, 0xB0A, x0
ret
csrCycle_clear:
csrrw a0, 0xB00, x0
ret
csrNull_clear:
li a0, -1
ret
csrInstrCount_clear:
csrrw a0, 0xB02, x0
ret
csrLoadStallCount_clear:
csrrw a0, 0xB03, x0
ret
csrBPWrongCount_clear:
csrrw a0, 0xB04, x0
ret
csrBPCount_clear:
csrrw a0, 0xB05, x0
ret
csrBTBWrongCount_clear:
csrrw a0, 0xB06, x0
ret
csrNonBRCFICount_clear:
csrrw a0, 0xB07, x0
ret
csrRasWrongCount_clear:
csrrw a0, 0xB08, x0
ret
csrReturnCount_clear:
csrrw a0, 0xB09, x0
ret
csrBTBClassWrongCount_clear:
csrrw a0, 0xB0A, x0
ret
readPerfCntError:
li a0, -1
ret
.section .data
.align 3
csrTable:
.8byte csrCycle #0
.8byte csrNull #1
.8byte csrInstrCount #2
.8byte csrLoadStallCount #3
.8byte csrBPWrongCount #4
.8byte csrBPCount #5
.8byte csrBTBWrongCount #6
.8byte csrNonBRCFICount #7
.8byte csrRasWrongCount #8
.8byte csrReturnCount #9
.8byte csrBTBClassWrongCount #A
csrTable_clear:
.8byte csrCycle_clear #0
.8byte csrNull_clear #1
.8byte csrInstrCount_clear #2
.8byte csrLoadStallCount_clear #3
.8byte csrBPWrongCount_clear #4
.8byte csrBPCount_clear #5
.8byte csrBTBWrongCount_clear #6
.8byte csrNonBRCFICount_clear #7
.8byte csrRasWrongCount_clear #8
.8byte csrReturnCount_clear #9
.8byte csrBTBClassWrongCount_clear #A