1*37e4dafaSPeter Tyser/* 2*37e4dafaSPeter Tyser * (C) Copyright 2004, Psyent Corporation <www.psyent.com> 3*37e4dafaSPeter Tyser * Scott McNutt <smcnutt@psyent.com> 4*37e4dafaSPeter Tyser * 5*37e4dafaSPeter Tyser * See file CREDITS for list of people who contributed to this 6*37e4dafaSPeter Tyser * project. 7*37e4dafaSPeter Tyser * 8*37e4dafaSPeter Tyser * This program is free software; you can redistribute it and/or 9*37e4dafaSPeter Tyser * modify it under the terms of the GNU General Public License as 10*37e4dafaSPeter Tyser * published by the Free Software Foundation; either version 2 of 11*37e4dafaSPeter Tyser * the License, or (at your option) any later version. 12*37e4dafaSPeter Tyser * 13*37e4dafaSPeter Tyser * This program is distributed in the hope that it will be useful, 14*37e4dafaSPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*37e4dafaSPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*37e4dafaSPeter Tyser * GNU General Public License for more details. 17*37e4dafaSPeter Tyser * 18*37e4dafaSPeter Tyser * You should have received a copy of the GNU General Public License 19*37e4dafaSPeter Tyser * along with this program; if not, write to the Free Software 20*37e4dafaSPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*37e4dafaSPeter Tyser * MA 02111-1307 USA 22*37e4dafaSPeter Tyser */ 23*37e4dafaSPeter Tyser 24*37e4dafaSPeter Tyser#include <config.h> 25*37e4dafaSPeter Tyser#include <asm/opcodes.h> 26*37e4dafaSPeter Tyser 27*37e4dafaSPeter Tyser 28*37e4dafaSPeter Tyser .text 29*37e4dafaSPeter Tyser .align 4 30*37e4dafaSPeter Tyser 31*37e4dafaSPeter Tyser .global _exception 32*37e4dafaSPeter Tyser 33*37e4dafaSPeter Tyser .set noat 34*37e4dafaSPeter Tyser .set nobreak 35*37e4dafaSPeter Tyser 36*37e4dafaSPeter Tyser_exception: 37*37e4dafaSPeter Tyser /* SAVE ALL REGS -- this allows trap and unimplemented 38*37e4dafaSPeter Tyser * instruction handlers to be coded conveniently in C 39*37e4dafaSPeter Tyser */ 40*37e4dafaSPeter Tyser addi sp, sp, -(33*4) 41*37e4dafaSPeter Tyser stw r0, 0(sp) 42*37e4dafaSPeter Tyser stw r1, 4(sp) 43*37e4dafaSPeter Tyser stw r2, 8(sp) 44*37e4dafaSPeter Tyser stw r3, 12(sp) 45*37e4dafaSPeter Tyser stw r4, 16(sp) 46*37e4dafaSPeter Tyser stw r5, 20(sp) 47*37e4dafaSPeter Tyser stw r6, 24(sp) 48*37e4dafaSPeter Tyser stw r7, 28(sp) 49*37e4dafaSPeter Tyser stw r8, 32(sp) 50*37e4dafaSPeter Tyser stw r9, 36(sp) 51*37e4dafaSPeter Tyser stw r10, 40(sp) 52*37e4dafaSPeter Tyser stw r11, 44(sp) 53*37e4dafaSPeter Tyser stw r12, 48(sp) 54*37e4dafaSPeter Tyser stw r13, 52(sp) 55*37e4dafaSPeter Tyser stw r14, 56(sp) 56*37e4dafaSPeter Tyser stw r15, 60(sp) 57*37e4dafaSPeter Tyser stw r16, 64(sp) 58*37e4dafaSPeter Tyser stw r17, 68(sp) 59*37e4dafaSPeter Tyser stw r19, 72(sp) 60*37e4dafaSPeter Tyser stw r19, 76(sp) 61*37e4dafaSPeter Tyser stw r20, 80(sp) 62*37e4dafaSPeter Tyser stw r21, 84(sp) 63*37e4dafaSPeter Tyser stw r22, 88(sp) 64*37e4dafaSPeter Tyser stw r23, 92(sp) 65*37e4dafaSPeter Tyser stw r24, 96(sp) 66*37e4dafaSPeter Tyser stw r25, 100(sp) 67*37e4dafaSPeter Tyser stw r26, 104(sp) 68*37e4dafaSPeter Tyser stw r27, 108(sp) 69*37e4dafaSPeter Tyser stw r28, 112(sp) 70*37e4dafaSPeter Tyser stw r29, 116(sp) 71*37e4dafaSPeter Tyser stw r30, 120(sp) 72*37e4dafaSPeter Tyser stw r31, 124(sp) 73*37e4dafaSPeter Tyser rdctl et, estatus 74*37e4dafaSPeter Tyser stw et, 128(sp) 75*37e4dafaSPeter Tyser 76*37e4dafaSPeter Tyser /* If interrupts are disabled -- software interrupt */ 77*37e4dafaSPeter Tyser rdctl et, estatus 78*37e4dafaSPeter Tyser andi et, et, 1 79*37e4dafaSPeter Tyser beq et, r0, 0f 80*37e4dafaSPeter Tyser 81*37e4dafaSPeter Tyser /* If no interrupts are pending -- software interrupt */ 82*37e4dafaSPeter Tyser rdctl et, ipending 83*37e4dafaSPeter Tyser beq et, r0, 0f 84*37e4dafaSPeter Tyser 85*37e4dafaSPeter Tyser /* HARDWARE INTERRUPT: Call interrupt handler */ 86*37e4dafaSPeter Tyser movhi r3, %hi(external_interrupt) 87*37e4dafaSPeter Tyser ori r3, r3, %lo(external_interrupt) 88*37e4dafaSPeter Tyser mov r4, sp /* ptr to regs */ 89*37e4dafaSPeter Tyser callr r3 90*37e4dafaSPeter Tyser 91*37e4dafaSPeter Tyser /* Return address fixup: execution resumes by re-issue of 92*37e4dafaSPeter Tyser * interrupted instruction at ea-4 (ea == r29). Here we do 93*37e4dafaSPeter Tyser * simple fixup to allow common exception return. 94*37e4dafaSPeter Tyser */ 95*37e4dafaSPeter Tyser ldw r3, 116(sp) 96*37e4dafaSPeter Tyser addi r3, r3, -4 97*37e4dafaSPeter Tyser stw r3, 116(sp) 98*37e4dafaSPeter Tyser br _exception_return 99*37e4dafaSPeter Tyser 100*37e4dafaSPeter Tyser0: 101*37e4dafaSPeter Tyser /* TRAP EXCEPTION */ 102*37e4dafaSPeter Tyser movhi r3, %hi(OPC_TRAP) 103*37e4dafaSPeter Tyser ori r3, r3, %lo(OPC_TRAP) 104*37e4dafaSPeter Tyser addi r1, ea, -4 105*37e4dafaSPeter Tyser ldw r1, 0(r1) 106*37e4dafaSPeter Tyser bne r1, r3, 1f 107*37e4dafaSPeter Tyser movhi r3, %hi(trap_handler) 108*37e4dafaSPeter Tyser ori r3, r3, %lo(trap_handler) 109*37e4dafaSPeter Tyser mov r4, sp /* ptr to regs */ 110*37e4dafaSPeter Tyser callr r3 111*37e4dafaSPeter Tyser br _exception_return 112*37e4dafaSPeter Tyser 113*37e4dafaSPeter Tyser1: 114*37e4dafaSPeter Tyser /* UNIMPLEMENTED INSTRUCTION EXCEPTION */ 115*37e4dafaSPeter Tyser movhi r3, %hi(soft_emulation) 116*37e4dafaSPeter Tyser ori r3, r3, %lo(soft_emulation) 117*37e4dafaSPeter Tyser mov r4, sp /* ptr to regs */ 118*37e4dafaSPeter Tyser callr r3 119*37e4dafaSPeter Tyser 120*37e4dafaSPeter Tyser /* Restore regsisters and return from exception*/ 121*37e4dafaSPeter Tyser_exception_return: 122*37e4dafaSPeter Tyser ldw r1, 4(sp) 123*37e4dafaSPeter Tyser ldw r2, 8(sp) 124*37e4dafaSPeter Tyser ldw r3, 12(sp) 125*37e4dafaSPeter Tyser ldw r4, 16(sp) 126*37e4dafaSPeter Tyser ldw r5, 20(sp) 127*37e4dafaSPeter Tyser ldw r6, 24(sp) 128*37e4dafaSPeter Tyser ldw r7, 28(sp) 129*37e4dafaSPeter Tyser ldw r8, 32(sp) 130*37e4dafaSPeter Tyser ldw r9, 36(sp) 131*37e4dafaSPeter Tyser ldw r10, 40(sp) 132*37e4dafaSPeter Tyser ldw r11, 44(sp) 133*37e4dafaSPeter Tyser ldw r12, 48(sp) 134*37e4dafaSPeter Tyser ldw r13, 52(sp) 135*37e4dafaSPeter Tyser ldw r14, 56(sp) 136*37e4dafaSPeter Tyser ldw r15, 60(sp) 137*37e4dafaSPeter Tyser ldw r16, 64(sp) 138*37e4dafaSPeter Tyser ldw r17, 68(sp) 139*37e4dafaSPeter Tyser ldw r19, 72(sp) 140*37e4dafaSPeter Tyser ldw r19, 76(sp) 141*37e4dafaSPeter Tyser ldw r20, 80(sp) 142*37e4dafaSPeter Tyser ldw r21, 84(sp) 143*37e4dafaSPeter Tyser ldw r22, 88(sp) 144*37e4dafaSPeter Tyser ldw r23, 92(sp) 145*37e4dafaSPeter Tyser ldw r24, 96(sp) 146*37e4dafaSPeter Tyser ldw r25, 100(sp) 147*37e4dafaSPeter Tyser ldw r26, 104(sp) 148*37e4dafaSPeter Tyser ldw r27, 108(sp) 149*37e4dafaSPeter Tyser ldw r28, 112(sp) 150*37e4dafaSPeter Tyser ldw r29, 116(sp) 151*37e4dafaSPeter Tyser ldw r30, 120(sp) 152*37e4dafaSPeter Tyser ldw r31, 124(sp) 153*37e4dafaSPeter Tyser addi sp, sp, (33*4) 154*37e4dafaSPeter Tyser eret 155*37e4dafaSPeter Tyser/*-------------------------------------------------------------*/ 156