forked from mirror/qemu
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			54 lines
		
	
	
		
			786 B
		
	
	
	
		
			ArmAsm
		
	
			
		
		
	
	
			54 lines
		
	
	
		
			786 B
		
	
	
	
		
			ArmAsm
		
	
| 	.option	norvc
 | |
| 
 | |
| 	.text
 | |
| 	.global _start
 | |
| _start:
 | |
| 	lla	t0, trap
 | |
| 	csrw	mtvec, t0
 | |
| 
 | |
| 	# These are all illegal instructions
 | |
| 	csrw	time, x0
 | |
| 	.insn	i CUSTOM_0, 0, x0, x0, 0x321
 | |
| 	csrw	time, x0
 | |
| 	.insn	i CUSTOM_0, 0, x0, x0, 0x123
 | |
| 	csrw	cycle, x0
 | |
| 
 | |
| 	# Success!
 | |
| 	li	a0, 0
 | |
| 	j	_exit
 | |
| 
 | |
| trap:
 | |
| 	# When an instruction traps, compare it to the insn in memory.
 | |
| 	csrr	t0, mepc
 | |
| 	csrr	t1, mtval
 | |
| 	lwu	t2, 0(t0)
 | |
| 	bne	t1, t2, fail
 | |
| 
 | |
| 	# Skip the insn and continue.
 | |
| 	addi	t0, t0, 4
 | |
| 	csrw	mepc, t0
 | |
| 	mret
 | |
| 
 | |
| fail:
 | |
| 	li	a0, 1
 | |
| 
 | |
| # Exit code in a0
 | |
| _exit:
 | |
| 	lla	a1, semiargs
 | |
| 	li	t0, 0x20026	# ADP_Stopped_ApplicationExit
 | |
| 	sd	t0, 0(a1)
 | |
| 	sd	a0, 8(a1)
 | |
| 	li	a0, 0x20	# TARGET_SYS_EXIT_EXTENDED
 | |
| 
 | |
| 	# Semihosting call sequence
 | |
| 	.balign	16
 | |
| 	slli	zero, zero, 0x1f
 | |
| 	ebreak
 | |
| 	srai	zero, zero, 0x7
 | |
| 	j	.
 | |
| 
 | |
| 	.data
 | |
| 	.balign	16
 | |
| semiargs:
 | |
| 	.space	16
 |