Changeset 7cb53f62 in mainline for arch/sparc64/src/trap
- Timestamp:
- 2006-02-26T12:02:25Z (20 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4767721
- Parents:
- 7a255e69
- Location:
- arch/sparc64/src/trap
- Files:
-
- 3 edited
-
exception.c (modified) (2 diffs)
-
trap.c (modified) (1 diff)
-
trap_table.S (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
arch/sparc64/src/trap/exception.c
r7a255e69 r7cb53f62 28 28 29 29 #include <arch/trap/exception.h> 30 #include <arch/asm.h> 30 31 #include <debug.h> 31 32 … … 41 42 panic("Memory Address Not Aligned\n"); 42 43 } 44 45 /** Handle mem_address_not_aligned. */ 46 void do_illegal_instruction(void) 47 { 48 panic("Illegal Instruction: %P\n", tpc_read()); 49 } -
arch/sparc64/src/trap/trap.c
r7a255e69 r7cb53f62 43 43 void trap_init(void) 44 44 { 45 /*46 * Save kernel provided trap handlers.47 */48 memcpy((void *) trap_table_save, (void *) trap_table, TRAP_TABLE_SIZE);49 50 /*51 * Copy OFW's trap table into kernel.52 */53 memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);54 55 /*56 * Install kernel-provided handlers.57 */58 trap_install_handler(TT_INSTRUCTION_ACCESS_EXCEPTION, TRAP_TABLE_ENTRY_SIZE, false);59 trap_install_handler(TT_CLEAN_WINDOW, CLEAN_WINDOW_HANDLER_SIZE, false);60 trap_install_handler(TT_MEM_ADDRESS_NOT_ALIGNED, TRAP_TABLE_ENTRY_SIZE, false);61 trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, false);62 trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, false);63 trap_install_handler(TT_INSTRUCTION_ACCESS_EXCEPTION, TRAP_TABLE_ENTRY_SIZE, true);64 trap_install_handler(TT_CLEAN_WINDOW, CLEAN_WINDOW_HANDLER_SIZE, true);65 trap_install_handler(TT_MEM_ADDRESS_NOT_ALIGNED, TRAP_TABLE_ENTRY_SIZE, true);66 trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, true);67 trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, true);68 trap_install_handler(TT_INTERRUPT_LEVEL_1, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);69 trap_install_handler(TT_INTERRUPT_LEVEL_2, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);70 trap_install_handler(TT_INTERRUPT_LEVEL_3, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);71 trap_install_handler(TT_INTERRUPT_LEVEL_4, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);72 trap_install_handler(TT_INTERRUPT_LEVEL_5, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);73 trap_install_handler(TT_INTERRUPT_LEVEL_6, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);74 trap_install_handler(TT_INTERRUPT_LEVEL_7, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);75 trap_install_handler(TT_INTERRUPT_LEVEL_8, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);76 trap_install_handler(TT_INTERRUPT_LEVEL_9, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);77 trap_install_handler(TT_INTERRUPT_LEVEL_10, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);78 trap_install_handler(TT_INTERRUPT_LEVEL_11, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);79 trap_install_handler(TT_INTERRUPT_LEVEL_12, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);80 trap_install_handler(TT_INTERRUPT_LEVEL_13, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);81 trap_install_handler(TT_INTERRUPT_LEVEL_14, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);82 trap_install_handler(TT_INTERRUPT_LEVEL_15, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);83 trap_install_handler(TT_INTERRUPT_VECTOR_TRAP, INTERRUPT_VECTOR_TRAP_HANDLER_SIZE, false);84 85 /*86 * Kernel must become independent on Open Firmware calls before MMU handlers are enabled.87 */88 /*89 trap_install_handler(TT_FAST_INSTRUCTION_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, false);90 trap_install_handler(TT_FAST_DATA_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, false);91 trap_install_handler(TT_FAST_DATA_ACCESS_PROTECTION, FAST_MMU_HANDLER_SIZE, false);92 trap_install_handler(TT_FAST_INSTRUCTION_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, true);93 trap_install_handler(TT_FAST_DATA_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, true);94 trap_install_handler(TT_FAST_DATA_ACCESS_PROTECTION, FAST_MMU_HANDLER_SIZE, true);95 */96 97 45 } 98 99 /** Copy trap handler to active trap table.100 *101 * The handler is copied from trap_table_kernel to trap_handler.102 *103 * @param tt Trap type. An index that uniquelly identifies handler code.104 * @param len Length of the handler in bytes. Must be multiple of TRAP_TABLE_ENTRY_SIZE (i.e. 32).105 * @param tlnonz If false, tt is considered from the lower half of trap table. If true, the upper half is chosen.106 */107 void trap_install_handler(index_t tt, size_t len, bool tlnonz)108 {109 count_t cnt;110 int i;111 112 ASSERT(tt < TRAP_TABLE_ENTRY_COUNT/2);113 ASSERT(len % TRAP_TABLE_ENTRY_SIZE == 0);114 115 if (tlnonz)116 tt += TRAP_TABLE_ENTRY_COUNT/2;117 118 cnt = len/TRAP_TABLE_ENTRY_SIZE;119 120 for (i = tt; i < tt + cnt; i++) {121 trap_table[i] = trap_table_save[i];122 }123 } -
arch/sparc64/src/trap/trap_table.S
r7a255e69 r7cb53f62 28 28 29 29 /** 30 * This file contains two trap tables. 31 * First, trap_table, is the one wich contains handlers implemented by 32 * kernel. During initialization, these handlers are copied out to 33 * the second trap table, trap_table_save, and the first table is 34 * overwritten with copy of OFW's own trap table. The copy is then patched 35 * from the trap_table_save. 36 * 37 * This arrangement is beneficial because kernel handlers stay on their 38 * link-time addresses which is good for debugging. 30 * This file contains kernel trap table. 39 31 */ 40 32 … … 69 61 SIMPLE_HANDLER do_instruction_access_exc 70 62 63 /* TT = 0x10, TL = 0, illegal_instruction */ 64 .org trap_table + TT_ILLEGAL_INSTRUCTION*ENTRY_SIZE 65 .global illegal_instruction 66 illegal_instruction: 67 SIMPLE_HANDLER do_illegal_instruction 68 71 69 /* TT = 0x24, TL = 0, clean_window handler */ 72 70 .org trap_table + TT_CLEAN_WINDOW*ENTRY_SIZE … … 217 215 SIMPLE_HANDLER do_instruction_access_exc 218 216 217 /* TT = 0x10, TL > 0, illegal_instruction */ 218 .org trap_table + (TT_ILLEGAL_INSTRUCTION+512)*ENTRY_SIZE 219 .global illegal_instruction_high 220 illegal_instruction_high: 221 SIMPLE_HANDLER do_illegal_instruction 222 219 223 /* TT = 0x24, TL > 0, clean_window handler */ 220 224 .org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE … … 258 262 fill_0_normal_high: 259 263 FILL_NORMAL_HANDLER 260 261 262 263 /*264 * Save trap table.265 */266 .align TABLE_SIZE267 .global trap_table_save268 trap_table_save:269 .space TABLE_SIZE, 0270 264 271 265
Note:
See TracChangeset
for help on using the changeset viewer.
