Changeset cea12e9 in mainline for kernel/arch/ia32/src/interrupt.c
- Timestamp:
- 2006-10-27T11:13:13Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 16d71f41
- Parents:
- 8c84448
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/interrupt.c
r8c84448 rcea12e9 52 52 #include <ipc/sysipc.h> 53 53 #include <interrupt.h> 54 #include <ddi/irq.h> 54 55 55 56 /* … … 61 62 void (* eoi_function)(void) = NULL; 62 63 63 void PRINT_INFO_ERRCODE(istate_t *istate)64 void decode_istate(istate_t *istate) 64 65 { 65 66 char *symbol = get_symtab_entry(istate->eip); … … 84 85 } 85 86 86 void null_interrupt(int n, istate_t *istate) 87 static void trap_virtual_eoi(void) 88 { 89 if (eoi_function) 90 eoi_function(); 91 else 92 panic("no eoi_function\n"); 93 94 } 95 96 static void null_interrupt(int n, istate_t *istate) 87 97 { 88 98 fault_if_from_uspace(istate, "unserviced interrupt: %d", n); 89 99 90 PRINT_INFO_ERRCODE(istate);100 decode_istate(istate); 91 101 panic("unserviced interrupt: %d\n", n); 92 102 } 93 103 94 104 /** General Protection Fault. */ 95 void gp_fault(int n, istate_t *istate)105 static void gp_fault(int n, istate_t *istate) 96 106 { 97 107 if (TASK) { … … 116 126 } 117 127 118 PRINT_INFO_ERRCODE(istate);128 decode_istate(istate); 119 129 panic("general protection fault\n"); 120 130 } 121 131 122 void ss_fault(int n, istate_t *istate)132 static void ss_fault(int n, istate_t *istate) 123 133 { 124 134 fault_if_from_uspace(istate, "stack fault"); 125 135 126 PRINT_INFO_ERRCODE(istate);136 decode_istate(istate); 127 137 panic("stack fault\n"); 128 138 } 129 139 130 void simd_fp_exception(int n, istate_t *istate)140 static void simd_fp_exception(int n, istate_t *istate) 131 141 { 132 142 uint32_t mxcsr; … … 139 149 (unative_t)mxcsr); 140 150 141 PRINT_INFO_ERRCODE(istate);151 decode_istate(istate); 142 152 printf("MXCSR: %#zx\n",(unative_t)(mxcsr)); 143 153 panic("SIMD FP exception(19)\n"); 144 154 } 145 155 146 void nm_fault(int n, istate_t *istate)156 static void nm_fault(int n, istate_t *istate) 147 157 { 148 158 #ifdef CONFIG_FPU_LAZY … … 154 164 } 155 165 156 void syscall(int n, istate_t *istate) 157 { 158 panic("Obsolete syscall handler."); 159 } 160 161 void tlb_shootdown_ipi(int n, istate_t *istate) 166 #ifdef CONFIG_SMP 167 static void tlb_shootdown_ipi(int n, istate_t *istate) 162 168 { 163 169 trap_virtual_eoi(); 164 170 tlb_shootdown_ipi_recv(); 165 171 } 172 #endif 173 174 /** Handler of IRQ exceptions */ 175 static void irq_interrupt(int n, istate_t *istate) 176 { 177 ASSERT(n >= IVT_IRQBASE); 178 179 int inum = n - IVT_IRQBASE; 180 ASSERT(inum < IRQ_COUNT); 181 ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); 182 183 irq_t *irq = irq_dispatch_and_lock(inum); 184 if (irq) { 185 /* 186 * The IRQ handler was found. 187 */ 188 irq->handler(irq, irq->arg); 189 spinlock_unlock(&irq->lock); 190 } else { 191 /* 192 * Spurious interrupt. 193 */ 194 #ifdef CONFIG_DEBUG 195 printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); 196 #endif 197 } 198 trap_virtual_eoi(); 199 } 200 201 void interrupt_init(void) 202 { 203 int i; 204 205 for (i = 0; i < IVT_ITEMS; i++) 206 exc_register(i, "null", (iroutine) null_interrupt); 207 208 for (i = 0; i < IRQ_COUNT; i++) { 209 if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) 210 exc_register(IVT_IRQBASE + i, "irq", (iroutine) irq_interrupt); 211 } 212 213 exc_register(7, "nm_fault", (iroutine) nm_fault); 214 exc_register(12, "ss_fault", (iroutine) ss_fault); 215 exc_register(13, "gp_fault", (iroutine) gp_fault); 216 exc_register(19, "simd_fp", (iroutine) simd_fp_exception); 217 218 #ifdef CONFIG_SMP 219 exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", (iroutine) tlb_shootdown_ipi); 220 #endif 221 } 166 222 167 223 void trap_virtual_enable_irqs(uint16_t irqmask) … … 181 237 } 182 238 183 void trap_virtual_eoi(void)184 {185 if (eoi_function)186 eoi_function();187 else188 panic("no eoi_function\n");189 190 }191 192 239 /** @} 193 240 */
Note:
See TracChangeset
for help on using the changeset viewer.