|
|
1.1 ! root 1: /* ! 2: * <vectors.S> ! 3: * ! 4: * Sparc V9 Trap Table(s) with SpitFire/Cheetah extensions. ! 5: * ! 6: * Copyright (C) 1996, 2001 David S. Miller ([email protected]) ! 7: * ! 8: * This program is free software; you can redistribute it and/or ! 9: * modify it under the terms of the GNU General Public License ! 10: * version 2 as published by the Free Software Foundation. ! 11: * ! 12: * This program is distributed in the hope that it will be useful, ! 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: * GNU General Public License for more details. ! 16: * ! 17: * You should have received a copy of the GNU General Public License ! 18: * along with this program; if not, write to the Free Software ! 19: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ! 20: * MA 02110-1301, USA. ! 21: * This program is free software; you can redistribute it and/or ! 22: * modify it under the terms of the GNU General Public License V2 ! 23: * as published by the Free Software Foundation ! 24: */ ! 25: ! 26: #define __ASSEMBLY ! 27: #include "psr.h" ! 28: #include "asm/asi.h" ! 29: #define SER_ADDR5 0x71100004 ! 30: #define SER_ADDR10 0xf1100004 ! 31: ! 32: .section ".text.vectors", "ax" ! 33: .align 4 /* Should be 16384, but alignment is handled by the ldscript */ ! 34: /* Sparc32 trap table */ ! 35: .globl trap_table, t_zero, t_wovf, t_wunf, __divide_error ! 36: trap_table: ! 37: ! 38: #define WINDOW_SPILL \ ! 39: rd %psr, %l0; rd %wim, %l3; b spill_window_entry; nop; ! 40: ! 41: #define WINDOW_FILL \ ! 42: rd %psr, %l0; rd %wim, %l3; b fill_window_entry; nop; ! 43: ! 44: #define BTRAP(lvl) ba bug; mov lvl, %g1; nop; nop; ! 45: #define BTRAPS(x) BTRAP(x) BTRAP(x+1) BTRAP(x+2) BTRAP(x+3) BTRAP(x+4) BTRAP(x+5) BTRAP(x+6) BTRAP(x+7) ! 46: #define TRAP_ENTRY_INTERRUPT(int_level) \ ! 47: sethi %hi(irq_entry ## int_level), %l7; \ ! 48: or %l7, %lo(irq_entry ## int_level), %l7; \ ! 49: jmp %l7; \ ! 50: nop ! 51: ! 52: t_zero: b entry; nop; nop; nop; ! 53: BTRAP(0x1) BTRAP(0x2) BTRAP(0x3) BTRAP(0x4) ! 54: t_wovf: WINDOW_SPILL /* Window Overflow */ ! 55: t_wunf: WINDOW_FILL /* Window Underflow */ ! 56: BTRAP(0x7) ! 57: BTRAPS(0x8) ! 58: #if 0 ! 59: BAD_TRAP(0x10) ! 60: t_irq1: TRAP_ENTRY_INTERRUPT(1) /* IRQ Software/SBUS Level 1 */ ! 61: t_irq2: TRAP_ENTRY_INTERRUPT(2) /* IRQ SBUS Level 2 */ ! 62: t_irq3: TRAP_ENTRY_INTERRUPT(3) /* IRQ SCSI/DMA/SBUS Level 3 */ ! 63: t_irq4: TRAP_ENTRY_INTERRUPT(4) /* IRQ Software Level 4 */ ! 64: t_irq5: TRAP_ENTRY_INTERRUPT(5) /* IRQ SBUS/Ethernet Level 5 */ ! 65: t_irq6: TRAP_ENTRY_INTERRUPT(6) /* IRQ Software Level 6 */ ! 66: t_irq7: TRAP_ENTRY_INTERRUPT(7) /* IRQ Video/SBUS Level 5 */ ! 67: t_irq8: TRAP_ENTRY_INTERRUPT(8) /* IRQ SBUS Level 6 */ ! 68: t_irq9: TRAP_ENTRY_INTERRUPT(9) /* IRQ SBUS Level 7 */ ! 69: t_irq10: TRAP_ENTRY_INTERRUPT(10) /* IRQ Timer #1 (one we use) */ ! 70: t_irq11: TRAP_ENTRY_INTERRUPT(11) /* IRQ Floppy Intr. */ ! 71: t_irq12: TRAP_ENTRY_INTERRUPT(12) /* IRQ Zilog serial chip */ ! 72: t_irq13: TRAP_ENTRY_INTERRUPT(13) /* IRQ Audio Intr. */ ! 73: t_irq14: TRAP_ENTRY_INTERRUPT(14) /* IRQ Timer #2 */ ! 74: t_nmi: BAD_TRAP(0x1f) /* Level 15 (NMI) */ ! 75: #else ! 76: BTRAPS(0x10) ! 77: BTRAP(0x18) BTRAP(0x19) ! 78: t_irq10: TRAP_ENTRY_INTERRUPT(10) /* IRQ Timer #1 (one we use) */ ! 79: BTRAP(0x1b) BTRAP(0x1c) BTRAP(0x1d) ! 80: t_irq14: TRAP_ENTRY_INTERRUPT(14) /* IRQ Timer #2 */ ! 81: BTRAP(0x1f) ! 82: #endif ! 83: BTRAPS(0x20) BTRAPS(0x28) ! 84: BTRAPS(0x30) BTRAPS(0x38) ! 85: BTRAPS(0x40) BTRAPS(0x48) ! 86: BTRAPS(0x50) BTRAPS(0x58) ! 87: BTRAPS(0x60) BTRAPS(0x68) ! 88: BTRAPS(0x70) BTRAPS(0x78) ! 89: BTRAPS(0x80) BTRAPS(0x88) ! 90: BTRAPS(0x90) BTRAPS(0x98) ! 91: BTRAPS(0xa0) BTRAPS(0xa8) ! 92: BTRAPS(0xb0) BTRAPS(0xb8) ! 93: BTRAPS(0xc0) BTRAPS(0xc8) ! 94: BTRAPS(0xd0) BTRAPS(0xd8) ! 95: BTRAPS(0xe0) BTRAPS(0xe8) ! 96: BTRAPS(0xf0) BTRAPS(0xf8) ! 97: ! 98: .section ".text", "ax" ! 99: .align 4 ! 100: __divide_error: ! 101: bug: ! 102: /* Dump the exception and its context */ ! 103: ! Set up CPU state ! 104: rd %psr, %g2 ! 105: andn %g2, PSR_ET, %g2 ! 106: wr %g2, %psr ! 107: ! Disable mmu, re-enable boot mode ! 108: set _start, %g3 ! 109: set dump_exception, %g2 ! 110: sub %g2, %g3, %g3 ! 111: set 3 << 13, %g2 ! 112: jmp %g3 ! 113: sta %g2, [%g0] ASI_M_MMUREGS ! 114: ! 115: outstr: ! 116: /* void outstr (unsigned long port5, unsigned long port10, ! 117: * const unsigned char *str); ! 118: * Writes a string on an IO port. ! 119: */ ! 120: 1: lduba [%o2] ASI_M_KERNELTXT, %o3 ! 121: cmp %o3, 0 ! 122: be 2f ! 123: nop ! 124: stba %o3, [%o0] ASI_M_BYPASS ! 125: stba %o3, [%o1] ASI_M_CTL ! 126: b 1b ! 127: inc %o2 ! 128: 2: retl ! 129: nop ! 130: ! 131: outhex: ! 132: /* void outhex (unsigned long port5, unsigned long port10, ! 133: * uint32_t value); ! 134: * Dumps a 32 bits hex number on serial port ! 135: */ ! 136: mov %o2, %o4 ! 137: set 28, %o3 ! 138: srl %o4, %o3, %o2 ! 139: 1: and %o2, 0xf, %o2 ! 140: cmp %o2, 9 ! 141: bgt 2f ! 142: nop ! 143: b 3f ! 144: add %o2, '0', %o2 ! 145: 2: add %o2, 'a' - 10, %o2 ! 146: 3: stba %o2, [%o0] ASI_M_BYPASS ! 147: stba %o2, [%o1] ASI_M_CTL ! 148: subcc %o3, 4, %o3 ! 149: bge 1b ! 150: srl %o4, %o3, %o2 ! 151: retl ! 152: nop ! 153: ! 154: /* void dump_exception (); ! 155: * ! 156: * Dump a message when catching an exception ! 157: */ ! 158: dump_exception: ! 159: set SER_ADDR5 + 2, %o0 ! 160: set SER_ADDR10 + 2, %o1 ! 161: set (_BUG_message_0), %o2 ! 162: call outstr ! 163: nop ! 164: ! 165: call outhex ! 166: mov %g1, %o2 ! 167: ! 168: set (_BUG_message_1), %o2 ! 169: call outstr ! 170: nop ! 171: ! 172: call outhex ! 173: mov %l1, %o2 ! 174: ! 175: set (_BUG_message_2), %o2 ! 176: call outstr ! 177: nop ! 178: ! 179: call outhex ! 180: mov %l2, %o2 ! 181: ! 182: set (_BUG_message_3), %o2 ! 183: call outstr ! 184: nop ! 185: _forever: ! 186: /* Loop forever */ ! 187: b _forever ; ! 188: nop ! 189: ! 190: irq_entry10: ! 191: sethi %hi(counter_regs), %l7 ! 192: ld [%l7 + %lo(counter_regs)], %l7 ! 193: sethi 0x10000, %l6 ! 194: ld [%l7 + %l6], %g0 ! 195: jmp %l1 ! 196: rett %l2 ! 197: ! 198: irq_entry14: ! 199: sethi %hi(counter_regs), %l7 ! 200: ld [%l7 + %lo(counter_regs)], %l7 ! 201: ld [%l7], %g0 ! 202: jmp %l1 ! 203: rett %l2 ! 204: ! 205: /* Register window handlers */ ! 206: #include "wof.S" ! 207: #include "wuf.S" ! 208: ! 209: .section .rodata ! 210: _BUG_message_0: ! 211: .string "Unhandled Exception 0x" ! 212: _BUG_message_1: ! 213: .string "\r\nPC = 0x" ! 214: _BUG_message_2: ! 215: .string " NPC = 0x" ! 216: _BUG_message_3: ! 217: .string "\r\nStopping execution\r\n"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.