xref: /rk3399_rockchip-uboot/arch/nios2/cpu/exceptions.S (revision 3765b3e7bd0f8e46914d417f29cbcb0c72b1acf7)
137e4dafaSPeter Tyser/*
237e4dafaSPeter Tyser * (C) Copyright 2004, Psyent Corporation <www.psyent.com>
337e4dafaSPeter Tyser * Scott McNutt <smcnutt@psyent.com>
437e4dafaSPeter Tyser *
5*1a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
637e4dafaSPeter Tyser */
737e4dafaSPeter Tyser
837e4dafaSPeter Tyser#include <config.h>
937e4dafaSPeter Tyser#include <asm/opcodes.h>
1037e4dafaSPeter Tyser
1137e4dafaSPeter Tyser
1237e4dafaSPeter Tyser	.text
1337e4dafaSPeter Tyser	.align	4
1437e4dafaSPeter Tyser
1537e4dafaSPeter Tyser	.global _exception
1637e4dafaSPeter Tyser
1737e4dafaSPeter Tyser	.set noat
1837e4dafaSPeter Tyser	.set nobreak
1937e4dafaSPeter Tyser
2037e4dafaSPeter Tyser_exception:
2137e4dafaSPeter Tyser	/* SAVE ALL REGS -- this allows trap and unimplemented
2237e4dafaSPeter Tyser	 * instruction handlers to be coded conveniently in C
2337e4dafaSPeter Tyser	 */
2437e4dafaSPeter Tyser	addi	sp, sp, -(33*4)
2537e4dafaSPeter Tyser	stw	r0, 0(sp)
2637e4dafaSPeter Tyser	stw	r1, 4(sp)
2737e4dafaSPeter Tyser	stw	r2, 8(sp)
2837e4dafaSPeter Tyser	stw	r3, 12(sp)
2937e4dafaSPeter Tyser	stw	r4, 16(sp)
3037e4dafaSPeter Tyser	stw	r5, 20(sp)
3137e4dafaSPeter Tyser	stw	r6, 24(sp)
3237e4dafaSPeter Tyser	stw	r7, 28(sp)
3337e4dafaSPeter Tyser	stw	r8, 32(sp)
3437e4dafaSPeter Tyser	stw	r9, 36(sp)
3537e4dafaSPeter Tyser	stw	r10, 40(sp)
3637e4dafaSPeter Tyser	stw	r11, 44(sp)
3737e4dafaSPeter Tyser	stw	r12, 48(sp)
3837e4dafaSPeter Tyser	stw	r13, 52(sp)
3937e4dafaSPeter Tyser	stw	r14, 56(sp)
4037e4dafaSPeter Tyser	stw	r15, 60(sp)
4137e4dafaSPeter Tyser	stw	r16, 64(sp)
4237e4dafaSPeter Tyser	stw	r17, 68(sp)
4337e4dafaSPeter Tyser	stw	r19, 72(sp)
4437e4dafaSPeter Tyser	stw	r19, 76(sp)
4537e4dafaSPeter Tyser	stw	r20, 80(sp)
4637e4dafaSPeter Tyser	stw	r21, 84(sp)
4737e4dafaSPeter Tyser	stw	r22, 88(sp)
4837e4dafaSPeter Tyser	stw	r23, 92(sp)
4937e4dafaSPeter Tyser	stw	r24, 96(sp)
5037e4dafaSPeter Tyser	stw	r25, 100(sp)
5137e4dafaSPeter Tyser	stw	r26, 104(sp)
5237e4dafaSPeter Tyser	stw	r27, 108(sp)
5337e4dafaSPeter Tyser	stw	r28, 112(sp)
5437e4dafaSPeter Tyser	stw	r29, 116(sp)
5537e4dafaSPeter Tyser	stw	r30, 120(sp)
5637e4dafaSPeter Tyser	stw	r31, 124(sp)
5737e4dafaSPeter Tyser	rdctl	et, estatus
5837e4dafaSPeter Tyser	stw	et, 128(sp)
5937e4dafaSPeter Tyser
6037e4dafaSPeter Tyser	/* If interrupts are disabled -- software interrupt */
6137e4dafaSPeter Tyser	rdctl	et, estatus
6237e4dafaSPeter Tyser	andi	et, et, 1
6337e4dafaSPeter Tyser	beq	et, r0, 0f
6437e4dafaSPeter Tyser
6537e4dafaSPeter Tyser	/* If no interrupts are pending -- software interrupt */
6637e4dafaSPeter Tyser	rdctl	et, ipending
6737e4dafaSPeter Tyser	beq	et, r0, 0f
6837e4dafaSPeter Tyser
6937e4dafaSPeter Tyser	/* HARDWARE INTERRUPT: Call interrupt handler */
7037e4dafaSPeter Tyser	movhi	r3, %hi(external_interrupt)
7137e4dafaSPeter Tyser	ori	r3, r3, %lo(external_interrupt)
7237e4dafaSPeter Tyser	mov	r4, sp		/* ptr to regs */
7337e4dafaSPeter Tyser	callr	r3
7437e4dafaSPeter Tyser
7537e4dafaSPeter Tyser	/* Return address fixup: execution resumes by re-issue of
7637e4dafaSPeter Tyser	 * interrupted instruction at ea-4 (ea == r29). Here we do
7737e4dafaSPeter Tyser	 * simple fixup to allow common exception return.
7837e4dafaSPeter Tyser	 */
7937e4dafaSPeter Tyser	ldw	r3, 116(sp)
8037e4dafaSPeter Tyser	addi	r3, r3, -4
8137e4dafaSPeter Tyser	stw	r3, 116(sp)
8237e4dafaSPeter Tyser	br	_exception_return
8337e4dafaSPeter Tyser
8437e4dafaSPeter Tyser0:
8537e4dafaSPeter Tyser	/* TRAP EXCEPTION */
8637e4dafaSPeter Tyser	movhi	r3, %hi(OPC_TRAP)
8737e4dafaSPeter Tyser	ori	r3, r3, %lo(OPC_TRAP)
8837e4dafaSPeter Tyser	addi	r1, ea, -4
8937e4dafaSPeter Tyser	ldw	r1, 0(r1)
9037e4dafaSPeter Tyser	bne	r1, r3, 1f
9137e4dafaSPeter Tyser	movhi	r3, %hi(trap_handler)
9237e4dafaSPeter Tyser	ori	r3, r3, %lo(trap_handler)
9337e4dafaSPeter Tyser	mov	r4, sp		/* ptr to regs */
9437e4dafaSPeter Tyser	callr	r3
9537e4dafaSPeter Tyser	br	_exception_return
9637e4dafaSPeter Tyser
9737e4dafaSPeter Tyser1:
9837e4dafaSPeter Tyser	/* UNIMPLEMENTED INSTRUCTION EXCEPTION */
9937e4dafaSPeter Tyser	movhi	r3, %hi(soft_emulation)
10037e4dafaSPeter Tyser	ori	r3, r3, %lo(soft_emulation)
10137e4dafaSPeter Tyser	mov	r4, sp		/* ptr to regs */
10237e4dafaSPeter Tyser	callr	r3
10337e4dafaSPeter Tyser
10437e4dafaSPeter Tyser	/* Restore regsisters and return from exception*/
10537e4dafaSPeter Tyser_exception_return:
10637e4dafaSPeter Tyser	ldw	r1, 4(sp)
10737e4dafaSPeter Tyser	ldw	r2, 8(sp)
10837e4dafaSPeter Tyser	ldw	r3, 12(sp)
10937e4dafaSPeter Tyser	ldw	r4, 16(sp)
11037e4dafaSPeter Tyser	ldw	r5, 20(sp)
11137e4dafaSPeter Tyser	ldw	r6, 24(sp)
11237e4dafaSPeter Tyser	ldw	r7, 28(sp)
11337e4dafaSPeter Tyser	ldw	r8, 32(sp)
11437e4dafaSPeter Tyser	ldw	r9, 36(sp)
11537e4dafaSPeter Tyser	ldw	r10, 40(sp)
11637e4dafaSPeter Tyser	ldw	r11, 44(sp)
11737e4dafaSPeter Tyser	ldw	r12, 48(sp)
11837e4dafaSPeter Tyser	ldw	r13, 52(sp)
11937e4dafaSPeter Tyser	ldw	r14, 56(sp)
12037e4dafaSPeter Tyser	ldw	r15, 60(sp)
12137e4dafaSPeter Tyser	ldw	r16, 64(sp)
12237e4dafaSPeter Tyser	ldw	r17, 68(sp)
12337e4dafaSPeter Tyser	ldw	r19, 72(sp)
12437e4dafaSPeter Tyser	ldw	r19, 76(sp)
12537e4dafaSPeter Tyser	ldw	r20, 80(sp)
12637e4dafaSPeter Tyser	ldw	r21, 84(sp)
12737e4dafaSPeter Tyser	ldw	r22, 88(sp)
12837e4dafaSPeter Tyser	ldw	r23, 92(sp)
12937e4dafaSPeter Tyser	ldw	r24, 96(sp)
13037e4dafaSPeter Tyser	ldw	r25, 100(sp)
13137e4dafaSPeter Tyser	ldw	r26, 104(sp)
13237e4dafaSPeter Tyser	ldw	r27, 108(sp)
13337e4dafaSPeter Tyser	ldw	r28, 112(sp)
13437e4dafaSPeter Tyser	ldw	r29, 116(sp)
13537e4dafaSPeter Tyser	ldw	r30, 120(sp)
13637e4dafaSPeter Tyser	ldw	r31, 124(sp)
13737e4dafaSPeter Tyser	addi	sp, sp, (33*4)
13837e4dafaSPeter Tyser	eret
13937e4dafaSPeter Tyser/*-------------------------------------------------------------*/
140