diff options
Diffstat (limited to 'libgloss/m68k/mvme135-asm.S')
-rw-r--r-- | libgloss/m68k/mvme135-asm.S | 397 |
1 files changed, 0 insertions, 397 deletions
diff --git a/libgloss/m68k/mvme135-asm.S b/libgloss/m68k/mvme135-asm.S deleted file mode 100644 index 1722c18..0000000 --- a/libgloss/m68k/mvme135-asm.S +++ /dev/null @@ -1,397 +0,0 @@ -/* - * mvme135-asm.S -- assembler routines for the MVME stub. - * - * This code was pulled out of mvme135-stub.c by Ian Taylor so that I - * could handle different register and label prefixes in a sensible - * way. - */ - -/**************************************************************************** - - THIS SOFTWARE IS NOT COPYRIGHTED - - HP offers the following for use in the public domain. HP makes no - warranty with regard to the software or it's performance and the - user accepts the software "AS IS" with all faults. - - HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD - TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -****************************************************************************/ - -#include "asm.h" - - .title "mvme135-asm.S for m68k" - - .globl SYM (registers) - .globl SYM (lastFrame) - .globl SYM (superStack) - .globl SYM (exceptionHook) - .globl SYM (_returnFromException) - .globl SYM (stackPtr) - .globl SYM (handle_exception) - .globl SYM (exceptionSize) - .globl SYM (exceptionHandler) - -.text - - -/* - * Create a new exception vector table and populates it. Vectors from the - * boot monitor are spliced in so I/O and the abort button will continue - * to work. We also use the monitor's generalized vector for anything the - * debugger doesn't want. - */ - .global SYM (setup_vectors) -SYM (setup_vectors): - link fp, IMM (-8) - /* copy monitor vector table */ - - movecl vbr, a0 - lea SYM (vbr_table), a1 - movel 0x8(a0), d0 /* get generalized vector */ - movew IMM (0x3fc), d1 /* load vector count */ - -loop: /* fill table to gen. vector */ - movel d0, (a1,d1) - subqw IMM (4), d1 - bne loop - - movel 0x10(a0), 0x10(a1) /* breakpoint */ - movel 0x24(a0), 0x24(a1) /* trace */ - movel 0xbc(a0), 0xbc(a1) /* system call */ - - /* add stub vectors to table */ - movel SYM (_catchException), 0x8(a1) /* vector = 2, Access Fault */ - movel SYM (_catchException), 0xc(a1) /* vector = 3, Address Error */ - movel SYM (_catchException), 0x10(a1) /* vector = 4, Illegal instruction */ - movel SYM (_catchException), 0x14(a1) /* vector = 5, divide by 0 */ - movel SYM (_catchException), 0x18(a1) /* vector = 6, chk, chk2 instruction */ - movel SYM (_catchException), 0x1c(a1) /* vector = 7, ftrap, trap, trapv ins */ - movel SYM (_catchException), 0x20(a1) /* vector = 8, priviledge violation */ - movel SYM (_catchException), 0x24(a1) /* vector = 9, trace */ - movel SYM (_catchException), 0x28(a1) /* vector = 10, Aline opcode */ - movel SYM (_catchException), 0x2c(a1) /* vector = 11, fline opcode */ - movel SYM (_catchException), 0x30(a1) /* vector = 12, reserved */ - movel SYM (_catchException), 0x34(a1) /* vector = 13, coprocessor protocol violation */ - movel SYM (_catchException), 0x38(a1) /* vector = 14, format error */ - movel SYM (_catchException), 0x3c(a1) /* vector = 15, unitialized interupt */ - - /* unassigned, reserved */ - movel SYM (_catchException), 0x40(a1) /* vector = 16 */ - movel SYM (_catchException), 0x44(a1) /* vector = 17 */ - movel SYM (_catchException), 0x48(a1) /* vector = 18 */ - movel SYM (_catchException), 0x4c(a1) /* vector = 19 */ - movel SYM (_catchException), 0x50(a1) /* vector = 20 */ - movel SYM (_catchException), 0x54(a1) /* vector = 21 */ - movel SYM (_catchException), 0x58(a1) /* vector = 22 */ - movel SYM (_catchException), 0x5c(a1) /* vector = 23 */ - - movel SYM (_catchException), 0x84(a1) /* vector = 33, breakpoint, trap #1 */ - movel SYM (_catchException), 0xa0(a1) /* vector = 40 , trap #8*/ - - /* floating point traps */ - movel SYM (_catchException), 0xc0(a1) /* vector = 48 */ - movel SYM (_catchException), 0xc4(a1) /* vector = 49 */ - movel SYM (_catchException), 0xc8(a1) /* vector = 50 */ - movel SYM (_catchException), 0xcc(a1) /* vector = 51 */ - movel SYM (_catchException), 0xd0(a1) /* vector = 52 */ - movel SYM (_catchException), 0xd4(a1) /* vector = 53 */ - movel SYM (_catchException), 0xd8(a1) /* vector = 54 */ - movel SYM (_catchException), 0xdc(a1) /* vector = 55 */ - movel SYM (_catchException), 0xe0(a1) /* vector = 56 */ - movel SYM (_catchException), 0xe4(a1) /* vector = 57 */ - movel SYM (_catchException), 0xe8(a1) /* vector = 58 */ - -/*** movel &__debug_level7, 0x7c(a1) /* level7 interupt vector */ - - movecl a1, vbr /* change VBR to new table */ - unlk fp - rts -/* - * exceptionHandler -- sets up exception vector table. - * First arg is an integer vector number - * Second arg is the function pointer for the vector - */ -SYM (exceptionHandler): -# link a6, IMM (-8) -#str1: .ascii "Exception Handler Called\n" -# moveal IMM (str1), a0 -# moveal IMM (str1+25), a1 -# jsr SYM (outln) - -# unlk a6 - rts - -/* this never gets called */ - movel fp@(8), d0 /* get vector number */ - movel fp@(12), a0 /* get function address */ - moveal &SYM (vbr_table), a1 /* FIXME */ - - addl d0, d0 - addl d0, d0 - - addal d0, a1 - movel a0, (a1) - - movecl a1, vbr - unlk a6 - rts - -.globl SYM (return_to_super) -SYM (return_to_super): - movel SYM (registers)+60,sp /* get new stack pointer */ - movel SYM (lastFrame),a0 /* get last frame info */ - bra return_to_any - -.globl SYM (return_to_user) -SYM (return_to_user): - movel SYM (registers)+60,a0 /* get usp */ - movel a0,usp /* set usp */ - movel SYM (superStack),sp /* get original stack pointer */ - -return_to_any: - movel SYM (lastFrame),a0 /* get last frame info */ - movel a0@+,SYM (lastFrame) /* link in previous frame */ - addql IMM (8),a0 /* skip over pc, vector#*/ - movew a0@+,d0 /* get # of words in cpu frame */ - addw d0,a0 /* point to end of data */ - addw d0,a0 /* point to end of data */ - movel a0,a1 -/* copy the stack frame */ - subql IMM (1),d0 -copyUserLoop: - movew a1@-,sp@- - dbf d0,copyUserLoop - -#ifdef __HAVE_68881__ - fmoveml SYM (registers)+168,fpcr/fpsr/fpi - fmovemx SYM (registers)+72,fp0-fp7 - cmpl IMM (-1),a0@ /* skip frestore flag set ? */ - beq skip_frestore - frestore a0@+ -skip_frestore: -#endif - - moveml SYM (registers),d0-d7/a0-a6 - rte /* pop and go! */ - - -/* this function is called immediately when a level 7 interrupt occurs */ -/* if the previous interrupt level was 7 then we're already servicing */ -/* this interrupt and an rte is in order to return to the debugger. */ -/* For the 68000, the offset for sr is 6 due to the jsr return address */ -.text -.globl SYM (_debug_level7) -SYM (_debug_level7): - movew d0,sp@- -#ifdef mc68020 - movew sp@(2),d0 -#else - movew sp@(6),d0 -#endif - andiw IMM (0x700),d0 - cmpiw IMM (0x700),d0 - beq _already7 - movew sp@+,d0 - bra SYM (_catchException) -_already7: - movew sp@+,d0 -#ifndef mc68020 - lea sp@(4),sp /* pull off 68000 return address */ -#endif - rte - -#ifdef mc68020 -/* This function is called when a 68020 exception occurs. It saves - * all the cpu and fpcp regs in the _registers array, creates a frame on a - * linked list of frames which has the cpu and fpcp stack frames needed - * to properly restore the context of these processors, and invokes - * an exception handler (remcom_handler). - * - * stack on entry: stack on exit: - * N bytes of junk exception # MSWord - * Exception Format Word exception # MSWord - * Program counter LSWord - * Program counter MSWord - * Status Register - * - * - */ - -.text -.globl SYM (_catchException) -SYM (_catchException): - - oriw IMM (0x0700),sr /* Disable interrupts */ - - moveml d0-d7/a0-a6,SYM (registers) /* save registers */ - movel SYM (lastFrame),a0 /* last frame pointer */ - -#ifdef __HAVE_68881__ - /* do an fsave, then remember the address to begin a restore from */ - fsave a0@- - fmovemx fp0-fp7, SYM (registers)+72 - fmoveml fpcr/fpsr/fpi, SYM (registers)+168 -#endif - - lea SYM (registers),a5 /* get address of registers */ - movew sp@,d1 /* get status register */ - movew d1,a5@(66) /* save sr */ - movel sp@(2),a4 /* save pc in a4 for later use */ - movel a4,a5@(68) /* save pc in _regisers[] */ - -/* figure out how many bytes in the stack frame */ - movew sp@(6),d0 /* get '020 exception format */ - movew d0,d2 /* make a copy of format word */ - andiw IMM (0xf000),d0 /* mask off format type */ - rolw IMM (5),d0 /* rotate into the low byte *2 */ - lea SYM (exceptionSize),a1 - addw d0,a1 /* index into the table */ - movew a1@,d0 /* get number of words in frame */ - movew d0,d3 /* save it */ - subw d0,a0 /* adjust save pointer */ - subw d0,a0 /* adjust save pointer(bytes) */ - movel a0,a1 /* copy save pointer */ - subql IMM (1),d0 /* predecrement loop counter */ - -/* copy the frame */ - -saveFrameLoop: - movew sp@+,a1@+ - dbf d0,saveFrameLoop - -/* now that the stack has been clenaed, - * save the a7 in use at time of exception - */ - movel sp,SYM (superStack) /* save supervisor sp */ - andiw IMM (0x2000),d1 /* were we in supervisor mode ? */ - beq userMode - movel a7,a5@(60) /* save a7 */ - bra a7saveDone -userMode: - movel usp,a1 - movel a1,a5@(60) /* save user stack pointer */ -a7saveDone: - - -/* save size of frame */ - movew d3,a0@- - -/* compute exception number */ - andl IMM (0xfff),d2 /* mask off vector offset */ - lsrw IMM (2),d2 /* divide by 4 to get vect num */ - movel d2,a0@- /* save it */ - -/* save pc causing exception */ - movel a4,a0@- - -/* save old frame link and set the new value*/ - movel SYM (lastFrame),a1 /* last frame pointer */ - movel a1,a0@- /* save pointer to prev frame */ - movel a0,SYM (lastFrame) - - movel d2,sp@- /* push exception num */ -#ifdef TMP_HACK - movel SYM (exceptionHook),a0 /* get address of handler */ - jbsr a0@ /* and call it */ -#else - jbsr SYM (remcomHandler) -#endif - clrl sp@ /* replace exception num parm with frame ptr */ - jbsr SYM (_returnFromException) /* jbsr, but never returns */ - -#else /* mc68000 */ - -/* This function is called when an exception occurs. It translates the - * return address found on the stack into an exception vector # which - * is then handled by either handle_exception or a system handler. - * _catchException provides a front end for both. - * - * stack on entry: stack on exit: - * Program counter MSWord exception # MSWord - * Program counter LSWord exception # MSWord - * Status Register - * Return Address MSWord - * Return Address LSWord - */ -.text -.globl SYM (_catchException) -SYM (_catchException): - - oriw IMM (0x0700),sr /* Disable interrupts */ - - moveml d0-d7/a0-a6,SYM (registers) /* save registers */ - movel SYM (lastFrame),a0 /* last frame pointer */ - -#ifdef __HAVE_68881__ - /* do an fsave, then remember the address to begin a restore from */ - fsave a0@- - fmovemx fp0-fp7, SYM (registers)+72 - fmoveml fpcr/fpsr/fpi, SYM (registers)+168 -#endif - - lea SYM (registers),a5 /* get address of registers */ - movel sp@+,d2 /* pop return address */ - addl IMM (1530),d2 /* convert return addr to */ - divs IMM (6),d2 /* exception number */ - extl d2 - - moveql IMM (3),d3 /* assume a three word frame */ - - cmpiw IMM (3),d2 /* bus error or address error ? */ - bgt normal /* if >3 then normal error */ - movel sp@+,a0@- /* copy error info to frame buff*/ - movel sp@+,a0@- /* these are never used */ - moveql IMM (7),d3 /* this is a 7 word frame */ - -normal: - movew sp@+,d1 /* pop status register */ - movel sp@+,a4 /* pop program counter */ - movew d1,a5@(66) /* save sr */ - movel a4,a5@(68) /* save pc in _regisers[] */ - movel a4,a0@- /* copy pc to frame buffer */ - movew d1,a0@- /* copy sr to frame buffer */ - - movel sp,SYM (superStack) /* save supervisor sp */ - - andiw IMM (0x2000),d1 /* were we in supervisor mode ? */ - beq userMode - movel a7,a5@(60) /* save a7 */ - bra saveDone -userMode: - movel usp,a1 /* save user stack pointer */ - movel a1,a5@(60) /* save user stack pointer */ -saveDone: - - movew d3,a0@- /* push frame size in words */ - movel d2,a0@- /* push vector number */ - movel a4,a0@- /* push exception pc */ - -/* save old frame link and set the new value */ - movel SYM (lastFrame),a1 /* last frame pointer */ - movel a1,a0@- /* save pointer to prev frame */ - movel a0,SYM (lastFrame) - - movel d2,sp@- /* push exception num */ - movel SYM (exceptionHook),a0 /* get address of handler */ - jbsr a0@ /* and call it */ - clrl sp@ /* replace exception num parm with frame ptr */ - jbsr SYM (_returnFromException) /* jbsr, but never returns */ - -#endif /* m68000 */ - -/* - * remcomHandler is a front end for handle_exception. It moves the - * stack pointer into an area reserved for debugger use in case the - * breakpoint happened in supervisor mode. - */ -.globl SYM (remcomHandler) -SYM (remcomHandler): - addl IMM (4),sp /* pop off return address */ - movel sp@+,d0 /* get the exception number */ - movel SYM (stackPtr),sp /* move to remcom stack area */ - movel d0,sp@- /* push exception onto stack */ - jbsr SYM (handle_exception) /* this never returns */ - rts /* return */ |