mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			148 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .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
 | |
| 
 |