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