Changeset 3e828ea in mainline for kernel/arch/ia32/src
- Timestamp:
- 2019-09-23T12:49:29Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9be2358
- Parents:
- 9259d20 (diff), 1a4ec93f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - git-author:
- Jiri Svoboda <jiri@…> (2019-09-22 12:49:07)
- git-committer:
- Jiri Svoboda <jiri@…> (2019-09-23 12:49:29)
- Location:
- kernel/arch/ia32/src
- Files:
-
- 7 edited
-
debug/stacktrace.c (modified) (1 diff)
-
drivers/i8254.c (modified) (2 diffs)
-
ia32.c (modified) (5 diffs)
-
interrupt.c (modified) (10 diffs)
-
smp/apic.c (modified) (6 diffs)
-
smp/smp.c (modified) (1 diff)
-
userspace.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/debug/stacktrace.c
r9259d20 r3e828ea 67 67 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev) 68 68 { 69 return !copy_from_uspace( (void *)prev,70 (uint32_t *) ctx->fp +FRAME_OFFSET_FP_PREV, sizeof(*prev));69 return !copy_from_uspace(prev, 70 ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_FP_PREV, sizeof(*prev)); 71 71 } 72 72 73 73 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra) 74 74 { 75 return !copy_from_uspace( (void *)ra,76 (uint32_t *) ctx->fp +FRAME_OFFSET_RA, sizeof(*ra));75 return !copy_from_uspace(ra, 76 ctx->fp + sizeof(uintptr_t) * FRAME_OFFSET_RA, sizeof(*ra)); 77 77 } 78 78 -
kernel/arch/ia32/src/drivers/i8254.c
r9259d20 r3e828ea 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 … … 143 143 o2 |= pio_read_8(CLK_PORT1) << 8; 144 144 145 uint32_t delta = (t1 - t2) - (o1 - o2); 146 if (!delta) 147 delta = 1; 148 145 149 CPU->delay_loop_const = 146 ((MAGIC_NUMBER * LOOPS) / 1000) / ((t1 - t2) - (o1 - o2))+147 (((MAGIC_NUMBER * LOOPS) / 1000) % ((t1 - t2) - (o1 - o2))? 1 : 0);150 ((MAGIC_NUMBER * LOOPS) / 1000) / delta + 151 (((MAGIC_NUMBER * LOOPS) / 1000) % delta ? 1 : 0); 148 152 149 153 uint64_t clk1 = get_cycle(); -
kernel/arch/ia32/src/ia32.c
r9259d20 r3e828ea 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> … … 110 111 /* PIC */ 111 112 i8259_init((i8259_t *) I8259_PIC0_BASE, 112 (i8259_t *) I8259_PIC1_BASE, IRQ_PIC1, IVT_IRQBASE, 113 IVT_IRQBASE + 8); 114 115 /* 116 * Set the enable/disable IRQs handlers. 117 * Set the End-of-Interrupt handler. 118 */ 119 enable_irqs_function = pic_enable_irqs; 120 disable_irqs_function = pic_disable_irqs; 121 eoi_function = pic_eoi; 122 irqs_info = "i8259"; 113 (i8259_t *) I8259_PIC1_BASE, IVT_IRQBASE); 114 115 /* Set PIC operations. */ 116 pic_ops = &i8259_pic_ops; 123 117 } 124 118 } … … 195 189 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 196 190 i8042_wire(i8042_instance, kbrd); 197 trap_virtual_enable_irqs(1 << IRQ_KBD);198 trap_virtual_enable_irqs(1 << IRQ_MOUSE);191 pic_ops->enable_irqs(1 << IRQ_KBD); 192 pic_ops->enable_irqs(1 << IRQ_MOUSE); 199 193 } 200 194 } … … 221 215 indev_t *srln = srln_wire(srln_instance, sink); 222 216 ns16550_wire(ns16550_instance, srln); 223 trap_virtual_enable_irqs(1 << IRQ_NS16550);217 pic_ops->enable_irqs(1 << IRQ_NS16550); 224 218 } 225 219 #endif … … 232 226 #endif 233 227 234 if (irqs_info != NULL) 235 sysinfo_set_item_val(irqs_info, NULL, true); 228 sysinfo_set_item_val(pic_ops->get_name(), NULL, true); 236 229 } 237 230 -
kernel/arch/ia32/src/interrupt.c
r9259d20 r3e828ea 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)(void) = 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(void)93 {94 if (eoi_function)95 eoi_function();96 else97 panic("No eoi_function.");98 99 88 } 100 89 … … 179 168 istate_t *istate __attribute__((unused))) 180 169 { 181 trap_virtual_eoi();170 pic_ops->eoi(0); 182 171 tlb_shootdown_ipi_recv(); 183 172 } … … 192 181 bool ack = false; 193 182 assert(inum < IRQ_COUNT); 194 assert( (inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1));183 assert(inum != IRQ_PIC1); 195 184 196 185 irq_t *irq = irq_dispatch_and_lock(inum); … … 202 191 if (irq->preack) { 203 192 /* Send EOI before processing the interrupt */ 204 trap_virtual_eoi();193 pic_ops->eoi(inum); 205 194 ack = true; 206 195 } … … 208 197 irq_spinlock_unlock(&irq->lock, false); 209 198 } else { 210 /*211 * Spurious interrupt.212 */213 199 #ifdef CONFIG_DEBUG 214 printf("cpu%u: spurious interrupt (inum=%u)\n", CPU->id, inum); 200 log(LF_ARCH, LVL_DEBUG, "cpu%u: unhandled IRQ %u", CPU->id, 201 inum); 215 202 #endif 216 203 } 217 204 218 205 if (!ack) 219 trap_virtual_eoi(); 206 pic_ops->eoi(inum); 207 } 208 209 static void pic_spurious(unsigned int n, istate_t *istate) 210 { 211 unsigned int inum = n - IVT_IRQBASE; 212 if (!pic_ops->is_spurious(inum)) { 213 /* This is actually not a spurious IRQ, so proceed as usual. */ 214 irq_interrupt(n, istate); 215 return; 216 } 217 pic_ops->handle_spurious(n); 218 #ifdef CONFIG_DEBUG 219 log(LF_ARCH, LVL_DEBUG, "cpu%u: PIC spurious interrupt %u", CPU->id, 220 inum); 221 #endif 220 222 } 221 223 … … 228 230 229 231 for (i = 0; i < IRQ_COUNT; i++) { 230 if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) 232 if ((i != IRQ_PIC0_SPUR) && (i != IRQ_PIC1_SPUR) && 233 (i != IRQ_PIC1)) 231 234 exc_register(IVT_IRQBASE + i, "irq", true, 232 235 (iroutine_t) irq_interrupt); … … 239 242 exc_register(VECTOR_GP, "gp_fault", true, (iroutine_t) gp_fault); 240 243 exc_register(VECTOR_XM, "simd_fp", true, (iroutine_t) simd_fp_exception); 244 exc_register(VECTOR_PIC0_SPUR, "pic0_spurious", true, 245 (iroutine_t) pic_spurious); 246 exc_register(VECTOR_PIC1_SPUR, "pic1_spurious", true, 247 (iroutine_t) pic_spurious); 241 248 242 249 #ifdef CONFIG_SMP … … 246 253 } 247 254 248 void trap_virtual_enable_irqs(uint16_t irqmask)249 {250 if (enable_irqs_function)251 enable_irqs_function(irqmask);252 else253 panic("No enable_irqs_function.");254 }255 256 void trap_virtual_disable_irqs(uint16_t irqmask)257 {258 if (disable_irqs_function)259 disable_irqs_function(irqmask);260 else261 panic("No disable_irqs_function.");262 }263 264 255 /** @} 265 256 */ -
kernel/arch/ia32/src/smp/apic.c
r9259d20 r3e828ea 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 /* … … 508 530 509 531 /** Local APIC End of Interrupt. */ 510 void l_apic_eoi( void)532 void l_apic_eoi(unsigned int ignored) 511 533 { 512 534 l_apic[EOI] = 0; -
kernel/arch/ia32/src/smp/smp.c
r9259d20 r3e828ea 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 -
kernel/arch/ia32/src/userspace.c
r9259d20 r3e828ea 70 70 : [eflags_mask] "i" (~EFLAGS_NT), 71 71 [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER), 72 [stack_top] "r" ( (uint8_t *)kernel_uarg->uspace_stack +72 [stack_top] "r" (kernel_uarg->uspace_stack + 73 73 kernel_uarg->uspace_stack_size), 74 74 [eflags] "r" ((eflags & ~(EFLAGS_NT)) | EFLAGS_IF),
Note:
See TracChangeset
for help on using the changeset viewer.
