Changeset 2a103b5 in mainline for kernel/arch/amd64/src
- Timestamp:
- 2019-06-09T11:31:38Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c48de91
- Parents:
- b401b33
- Location:
- kernel/arch/amd64/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/amd64.c
rb401b33 r2a103b5 60 60 #include <arch/vreg.h> 61 61 #include <arch/kseg.h> 62 #include <genarch/pic/pic_ops.h> 62 63 63 64 #ifdef CONFIG_SMP … … 123 124 (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE); 124 125 125 /* 126 * Set the enable/disable IRQs handlers. 127 * Set the End-of-Interrupt handler. 128 */ 129 enable_irqs_function = pic_enable_irqs; 130 disable_irqs_function = pic_disable_irqs; 131 eoi_function = pic_eoi; 132 irqs_info = "i8259"; 126 /* Set PIC operations. */ 127 pic_ops = &i8259_pic_ops; 133 128 } 134 129 } … … 209 204 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 210 205 i8042_wire(i8042_instance, kbrd); 211 trap_virtual_enable_irqs(1 << IRQ_KBD);212 trap_virtual_enable_irqs(1 << IRQ_MOUSE);206 pic_ops->enable_irqs(1 << IRQ_KBD); 207 pic_ops->enable_irqs(1 << IRQ_MOUSE); 213 208 } 214 209 } … … 235 230 indev_t *srln = srln_wire(srln_instance, sink); 236 231 ns16550_wire(ns16550_instance, srln); 237 trap_virtual_enable_irqs(1 << IRQ_NS16550);232 pic_ops->enable_irqs(1 << IRQ_NS16550); 238 233 } 239 234 #endif … … 246 241 #endif 247 242 248 if (irqs_info != NULL) 249 sysinfo_set_item_val(irqs_info, NULL, true); 243 sysinfo_set_item_val(pic_ops->get_name(), NULL, true); 250 244 } 251 245 -
kernel/arch/amd64/src/interrupt.c
rb401b33 r2a103b5 38 38 #include <panic.h> 39 39 #include <genarch/drivers/i8259/i8259.h> 40 #include <genarch/pic/pic_ops.h> 40 41 #include <halt.h> 41 42 #include <cpu.h> … … 57 58 * Interrupt and exception dispatching. 58 59 */ 59 60 void (*disable_irqs_function)(uint16_t irqmask) = NULL; 61 void (*enable_irqs_function)(uint16_t irqmask) = NULL; 62 void (*eoi_function)(unsigned int) = NULL; 63 const char *irqs_info = NULL; 60 pic_ops_t *pic_ops = NULL; 64 61 65 62 void istate_decode(istate_t *istate) … … 89 86 "r14=%0#18" PRIx64 "\tr15=%0#18" PRIx64 "\n", 90 87 istate->r12, istate->r13, istate->r14, istate->r15); 91 }92 93 static void trap_virtual_eoi(unsigned int irq)94 {95 if (eoi_function)96 eoi_function(irq);97 else98 panic("No eoi_function.");99 100 88 } 101 89 … … 157 145 static void tlb_shootdown_ipi(unsigned int n, istate_t *istate) 158 146 { 159 trap_virtual_eoi(0);147 pic_ops->eoi(0); 160 148 tlb_shootdown_ipi_recv(); 161 149 } … … 182 170 if (irq->preack) { 183 171 /* Send EOI before processing the interrupt */ 184 trap_virtual_eoi(inum);172 pic_ops->eoi(inum); 185 173 ack = true; 186 174 } … … 195 183 196 184 if (!ack) 197 trap_virtual_eoi(inum);185 pic_ops->eoi(inum); 198 186 } 199 187 … … 201 189 { 202 190 unsigned int inum = n - IVT_IRQBASE; 203 if (!pic_ is_spurious(inum)) {191 if (!pic_ops->is_spurious(inum)) { 204 192 /* This is actually not a spurious IRQ, so proceed as usual. */ 205 193 irq_interrupt(n, istate); 206 194 return; 207 195 } 208 pic_ handle_spurious(n);196 pic_ops->handle_spurious(n); 209 197 #ifdef CONFIG_DEBUG 210 198 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id, … … 242 230 } 243 231 244 void trap_virtual_enable_irqs(uint16_t irqmask)245 {246 if (enable_irqs_function)247 enable_irqs_function(irqmask);248 else249 panic("No enable_irqs_function.");250 }251 252 void trap_virtual_disable_irqs(uint16_t irqmask)253 {254 if (disable_irqs_function)255 disable_irqs_function(irqmask);256 else257 panic("No disable_irqs_function.");258 }259 260 232 /** @} 261 233 */
Note:
See TracChangeset
for help on using the changeset viewer.