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