Changeset 2a103b5 in mainline for kernel/arch/ia32/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/ia32/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/drivers/i8254.c
rb401b33 r2a103b5 96 96 { 97 97 pio_write_8(CLK_PORT4, 0x36); 98 pic_disable_irqs(1 << IRQ_CLK);98 i8259_disable_irqs(1 << IRQ_CLK); 99 99 pio_write_8(CLK_PORT1, (CLK_CONST / HZ) & 0xf); 100 100 pio_write_8(CLK_PORT1, (CLK_CONST / HZ) >> 8); 101 pic_enable_irqs(1 << IRQ_CLK);101 i8259_enable_irqs(1 << IRQ_CLK); 102 102 } 103 103 -
kernel/arch/ia32/src/ia32.c
rb401b33 r2a103b5 58 58 #include <genarch/multiboot/multiboot.h> 59 59 #include <genarch/multiboot/multiboot2.h> 60 #include <genarch/pic/pic_ops.h> 60 61 #include <arch/pm.h> 61 62 #include <arch/vreg.h> … … 112 113 (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE); 113 114 114 /* 115 * Set the enable/disable IRQs handlers. 116 * Set the End-of-Interrupt handler. 117 */ 118 enable_irqs_function = pic_enable_irqs; 119 disable_irqs_function = pic_disable_irqs; 120 eoi_function = pic_eoi; 121 irqs_info = "i8259"; 115 /* Set PIC operations. */ 116 pic_ops = &i8259_pic_ops; 122 117 } 123 118 } … … 194 189 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 195 190 i8042_wire(i8042_instance, kbrd); 196 trap_virtual_enable_irqs(1 << IRQ_KBD);197 trap_virtual_enable_irqs(1 << IRQ_MOUSE);191 pic_ops->enable_irqs(1 << IRQ_KBD); 192 pic_ops->enable_irqs(1 << IRQ_MOUSE); 198 193 } 199 194 } … … 220 215 indev_t *srln = srln_wire(srln_instance, sink); 221 216 ns16550_wire(ns16550_instance, srln); 222 trap_virtual_enable_irqs(1 << IRQ_NS16550);217 pic_ops->enable_irqs(1 << IRQ_NS16550); 223 218 } 224 219 #endif … … 231 226 #endif 232 227 233 if (irqs_info != NULL) 234 sysinfo_set_item_val(irqs_info, NULL, true); 228 sysinfo_set_item_val(pic_ops->get_name(), NULL, true); 235 229 } 236 230 -
kernel/arch/ia32/src/interrupt.c
rb401b33 r2a103b5 40 40 #include <panic.h> 41 41 #include <genarch/drivers/i8259/i8259.h> 42 #include <genarch/pic/pic_ops.h> 42 43 #include <halt.h> 43 44 #include <cpu.h> … … 61 62 */ 62 63 63 void (*disable_irqs_function)(uint16_t irqmask) = NULL; 64 void (*enable_irqs_function)(uint16_t irqmask) = NULL; 65 void (*eoi_function)(unsigned int) = NULL; 66 const char *irqs_info = NULL; 64 pic_ops_t *pic_ops = NULL; 67 65 68 66 void istate_decode(istate_t *istate) … … 88 86 istate_from_uspace(istate) ? istate->esp : 89 87 (uint32_t) &istate->esp); 90 }91 92 static void trap_virtual_eoi(unsigned int inum)93 {94 if (eoi_function)95 eoi_function(inum);96 else97 panic("No eoi_function.");98 99 88 } 100 89 … … 179 168 istate_t *istate __attribute__((unused))) 180 169 { 181 trap_virtual_eoi(0);170 pic_ops->eoi(0); 182 171 tlb_shootdown_ipi_recv(); 183 172 } … … 202 191 if (irq->preack) { 203 192 /* Send EOI before processing the interrupt */ 204 trap_virtual_eoi(inum);193 pic_ops->eoi(inum); 205 194 ack = true; 206 195 } … … 215 204 216 205 if (!ack) 217 trap_virtual_eoi(inum);206 pic_ops->eoi(inum); 218 207 } 219 208 … … 221 210 { 222 211 unsigned int inum = n - IVT_IRQBASE; 223 if (!pic_ is_spurious(inum)) {212 if (!pic_ops->is_spurious(inum)) { 224 213 /* This is actually not a spurious IRQ, so proceed as usual. */ 225 214 irq_interrupt(n, istate); 226 215 return; 227 216 } 228 pic_ handle_spurious(n);217 pic_ops->handle_spurious(n); 229 218 #ifdef CONFIG_DEBUG 230 219 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id, … … 264 253 } 265 254 266 void trap_virtual_enable_irqs(uint16_t irqmask)267 {268 if (enable_irqs_function)269 enable_irqs_function(irqmask);270 else271 panic("No enable_irqs_function.");272 }273 274 void trap_virtual_disable_irqs(uint16_t irqmask)275 {276 if (disable_irqs_function)277 disable_irqs_function(irqmask);278 else279 panic("No disable_irqs_function.");280 }281 282 255 /** @} 283 256 */ -
kernel/arch/ia32/src/smp/apic.c
rb401b33 r2a103b5 47 47 #include <arch.h> 48 48 #include <ddi/irq.h> 49 #include <genarch/pic/pic_ops.h> 49 50 50 51 #ifdef CONFIG_SMP … … 63 64 */ 64 65 66 static const char *apic_get_name(void); 67 static bool l_apic_is_spurious(unsigned int); 68 static void l_apic_handle_spurious(unsigned int); 69 70 pic_ops_t apic_pic_ops = { 71 .get_name = apic_get_name, 72 .enable_irqs = io_apic_enable_irqs, 73 .disable_irqs = io_apic_disable_irqs, 74 .eoi = l_apic_eoi, 75 .is_spurious = l_apic_is_spurious, 76 .handle_spurious = l_apic_handle_spurious, 77 }; 78 65 79 /* 66 80 * These variables either stay configured as initilalized, or are changed by … … 125 139 #endif /* LAPIC_VERBOSE */ 126 140 141 const char *apic_get_name(void) 142 { 143 return "apic"; 144 } 145 146 bool l_apic_is_spurious(unsigned int n) 147 { 148 return n == VECTOR_APIC_SPUR; 149 } 150 151 void l_apic_handle_spurious(unsigned int n) 152 { 153 } 154 127 155 /** APIC spurious interrupt handler. 128 156 * … … 134 162 istate_t *istate __attribute__((unused))) 135 163 { 136 #ifdef CONFIG_DEBUG137 log(LF_ARCH, LVL_DEBUG, "cpu%u: APIC spurious interrupt", CPU->id);138 #endif139 164 } 140 165 … … 175 200 (iroutine_t) apic_spurious); 176 201 177 enable_irqs_function = io_apic_enable_irqs; 178 disable_irqs_function = io_apic_disable_irqs; 179 eoi_function = l_apic_eoi; 180 irqs_info = "apic"; 202 pic_ops = &apic_pic_ops; 181 203 182 204 /* -
kernel/arch/ia32/src/smp/smp.c
rb401b33 r2a103b5 130 130 pio_write_8((ioport8_t *) 0x71, 0xa); 131 131 132 pic_disable_irqs(0xffff);132 i8259_disable_irqs(0xffff); 133 133 apic_init(); 134 134
Note:
See TracChangeset
for help on using the changeset viewer.