Changes in kernel/arch/amd64/src/interrupt.c [7e752b2:304342e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/interrupt.c
r7e752b2 r304342e 63 63 void (* eoi_function)(void) = NULL; 64 64 65 void istate_decode(istate_t *istate) 66 { 67 printf("cs =%#0" PRIx64 "\trip=%p\t" 68 "rfl=%#0" PRIx64 "\terr=%#0" PRIx64 "\n", 69 istate->cs, (void *) istate->rip, 70 istate->rflags, istate->error_word); 71 72 if (istate_from_uspace(istate)) 73 printf("ss =%#0" PRIx64 "\n", istate->ss); 74 75 printf("rax=%#0" PRIx64 "\trbx=%#0" PRIx64 "\t" 76 "rcx=%#0" PRIx64 "\trdx=%#0" PRIx64 "\n", 77 istate->rax, istate->rbx, istate->rcx, istate->rdx); 78 79 printf("rsi=%p\trdi=%p\trbp=%p\trsp=%p\n", 80 (void *) istate->rsi, (void *) istate->rdi, 81 (void *) istate->rbp, 82 istate_from_uspace(istate) ? ((void *) istate->rsp) : 83 &istate->rsp); 84 85 printf("r8 =%#0" PRIx64 "\tr9 =%#0" PRIx64 "\t" 86 "r10=%#0" PRIx64 "\tr11=%#0" PRIx64 "\n", 87 istate->r8, istate->r9, istate->r10, istate->r11); 88 89 printf("r12=%#0" PRIx64 "\tr13=%#0" PRIx64 "\t" 90 "r14=%#0" PRIx64 "\tr15=%#0" PRIx64 "\n", 91 istate->r12, istate->r13, istate->r14, istate->r15); 65 void decode_istate(int n, istate_t *istate) 66 { 67 char *symbol; 68 69 symbol = symtab_fmt_name_lookup(istate->rip); 70 71 printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__); 72 printf("%%rip: %#llx (%s)\n", istate->rip, symbol); 73 printf("ERROR_WORD=%#llx\n", istate->error_word); 74 printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs, 75 istate->rflags, read_cr0()); 76 printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax, 77 istate->rcx, istate->rdx); 78 printf("%%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi, 79 istate->rdi, istate->r8); 80 printf("%%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9, 81 istate->r10, istate->r11); 82 printf("%%rsp=%#llx\n", &istate->stack[0]); 83 84 stack_trace_istate(istate); 92 85 } 93 86 … … 101 94 } 102 95 103 static void null_interrupt(unsigned int n, istate_t *istate) 104 { 105 fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n); 106 panic_badtrap(istate, n, "Unserviced interrupt."); 107 } 108 109 static void de_fault(unsigned int n, istate_t *istate) 96 static void null_interrupt(int n, istate_t *istate) 97 { 98 fault_if_from_uspace(istate, "Unserviced interrupt: %d.", n); 99 decode_istate(n, istate); 100 panic("Unserviced interrupt."); 101 } 102 103 static void de_fault(int n, istate_t *istate) 110 104 { 111 105 fault_if_from_uspace(istate, "Divide error."); 112 panic_badtrap(istate, n, "Divide error."); 113 } 114 115 /** General Protection Fault. 116 * 117 */ 118 static void gp_fault(unsigned int n, istate_t *istate) 106 decode_istate(n, istate); 107 panic("Divide error."); 108 } 109 110 /** General Protection Fault. */ 111 static void gp_fault(int n, istate_t *istate) 119 112 { 120 113 if (TASK) { 121 irq_spinlock_lock(&TASK->lock, false); 122 size_t ver = TASK->arch.iomapver; 123 irq_spinlock_unlock(&TASK->lock, false); 124 114 size_t ver; 115 116 spinlock_lock(&TASK->lock); 117 ver = TASK->arch.iomapver; 118 spinlock_unlock(&TASK->lock); 119 125 120 if (CPU->arch.iomapver_copy != ver) { 126 121 /* … … 136 131 fault_if_from_uspace(istate, "General protection fault."); 137 132 } 138 panic_badtrap(istate, n, "General protection fault."); 139 } 140 141 static void ss_fault(unsigned int n, istate_t *istate) 133 134 decode_istate(n, istate); 135 panic("General protection fault."); 136 } 137 138 static void ss_fault(int n, istate_t *istate) 142 139 { 143 140 fault_if_from_uspace(istate, "Stack fault."); 144 panic_badtrap(istate, n, "Stack fault."); 145 } 146 147 static void nm_fault(unsigned int n, istate_t *istate) 141 decode_istate(n, istate); 142 panic("Stack fault."); 143 } 144 145 static void nm_fault(int n, istate_t *istate) 148 146 { 149 147 #ifdef CONFIG_FPU_LAZY … … 156 154 157 155 #ifdef CONFIG_SMP 158 static void tlb_shootdown_ipi( unsignedint n, istate_t *istate)156 static void tlb_shootdown_ipi(int n, istate_t *istate) 159 157 { 160 158 trap_virtual_eoi(); … … 163 161 #endif 164 162 165 /** Handler of IRQ exceptions. 166 * 167 */ 168 static void irq_interrupt(unsigned int n, istate_t *istate) 163 /** Handler of IRQ exceptions */ 164 static void irq_interrupt(int n, istate_t *istate) 169 165 { 170 166 ASSERT(n >= IVT_IRQBASE); 171 167 172 unsignedint inum = n - IVT_IRQBASE;168 int inum = n - IVT_IRQBASE; 173 169 bool ack = false; 174 170 ASSERT(inum < IRQ_COUNT); … … 180 176 * The IRQ handler was found. 181 177 */ 182 178 183 179 if (irq->preack) { 184 180 /* Send EOI before processing the interrupt */ … … 187 183 } 188 184 irq->handler(irq); 189 irq_spinlock_unlock(&irq->lock, false);185 spinlock_unlock(&irq->lock); 190 186 } else { 191 187 /* … … 193 189 */ 194 190 #ifdef CONFIG_DEBUG 195 printf("cpu% u: spurious interrupt (inum=%u)\n", CPU->id, inum);191 printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); 196 192 #endif 197 193 } … … 203 199 void interrupt_init(void) 204 200 { 205 unsignedint i;201 int i; 206 202 207 203 for (i = 0; i < IVT_ITEMS; i++) 208 exc_register(i, "null", false, (iroutine_t) null_interrupt);204 exc_register(i, "null", (iroutine) null_interrupt); 209 205 210 206 for (i = 0; i < IRQ_COUNT; i++) { 211 207 if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) 212 exc_register(IVT_IRQBASE + i, "irq", true,213 (iroutine _t) irq_interrupt);208 exc_register(IVT_IRQBASE + i, "irq", 209 (iroutine) irq_interrupt); 214 210 } 215 211 216 exc_register(0, "de_fault", true, (iroutine_t) de_fault); 217 exc_register(7, "nm_fault", true, (iroutine_t) nm_fault); 218 exc_register(12, "ss_fault", true, (iroutine_t) ss_fault); 219 exc_register(13, "gp_fault", true, (iroutine_t) gp_fault); 212 exc_register(0, "de_fault", (iroutine) de_fault); 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(14, "ident_mapper", (iroutine) ident_page_fault); 220 217 221 218 #ifdef CONFIG_SMP 222 exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", true,223 (iroutine _t) tlb_shootdown_ipi);219 exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", 220 (iroutine) tlb_shootdown_ipi); 224 221 #endif 225 222 }
Note:
See TracChangeset
for help on using the changeset viewer.