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