Changeset f619ec11 in mainline for kernel/arch/ia32


Ignore:
Timestamp:
2007-02-03T21:26:54Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
cf5ddf6
Parents:
80bcaed
Message:

When clock() is called by an external interrupt dispatched by the IRQ dispatcher,
no spinlock can be held or the kernel will not be preemptive. This fixes Ticket #24.

Formating and indentation fixes.

Location:
kernel/arch/ia32/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/drivers/i8254.c

    r80bcaed rf619ec11  
    6969static void i8254_irq_handler(irq_t *irq, void *arg, ...)
    7070{
     71        /*
     72         * This IRQ is responsible for kernel preemption.
     73         * Nevertheless, we are now holding a spinlock which prevents
     74         * preemption. For this particular IRQ, we don't need the
     75         * lock. We just release it, call clock() and then reacquire it again.
     76         */
     77        spinlock_unlock(&irq->lock);
    7178        clock();
     79        spinlock_lock(&irq->lock);
    7280}
    7381
     
    137145        o2 |= inb(CLK_PORT1) << 8;
    138146
    139         CPU->delay_loop_const = ((MAGIC_NUMBER*LOOPS)/1000) / ((t1-t2)-(o1-o2)) + (((MAGIC_NUMBER*LOOPS)/1000) % ((t1-t2)-(o1-o2)) ? 1 : 0);
     147        CPU->delay_loop_const =
     148            ((MAGIC_NUMBER * LOOPS) / 1000) / ((t1 - t2) - (o1 - o2)) +
     149            (((MAGIC_NUMBER * LOOPS) / 1000) % ((t1 - t2) - (o1 - o2)) ? 1 : 0);
    140150
    141151        clk1 = get_cycle();
  • kernel/arch/ia32/src/drivers/i8259.c

    r80bcaed rf619ec11  
    8787
    8888        pic_disable_irqs(0xffff);               /* disable all irq's */
    89         pic_enable_irqs(1<<IRQ_PIC1);           /* but enable pic1 */
     89        pic_enable_irqs(1 << IRQ_PIC1);         /* but enable pic1 */
    9090}
    9191
     
    120120void pic_eoi(void)
    121121{
    122         outb(0x20,0x20);
    123         outb(0xa0,0x20);
     122        outb(0x20, 0x20);
     123        outb(0xa0, 0x20);
    124124}
    125125
  • kernel/arch/ia32/src/ia32.c

    r80bcaed rf619ec11  
    119119                memory_print_map();
    120120               
    121                 #ifdef CONFIG_SMP
     121#ifdef CONFIG_SMP
    122122                acpi_init();
    123                 #endif /* CONFIG_SMP */
     123#endif /* CONFIG_SMP */
    124124        }
    125125}
  • kernel/arch/ia32/src/interrupt.c

    r80bcaed rf619ec11  
    141141{
    142142        uint32_t mxcsr;
    143         asm
    144         (
     143        asm (
    145144                "stmxcsr %0;\n"
    146145                :"=m"(mxcsr)
    147146        );
    148147        fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zx",
    149                              (unative_t)mxcsr);
     148            (unative_t)mxcsr);
    150149
    151150        decode_istate(istate);
  • kernel/arch/ia32/src/smp/smp.c

    r80bcaed rf619ec11  
    113113         * Set the warm-reset vector to the real-mode address of 4K-aligned ap_boot()
    114114         */
    115         *((uint16_t *) (PA2KA(0x467+0))) =  ((uintptr_t) ap_boot) >> 4; /* segment */
    116         *((uint16_t *) (PA2KA(0x467+2))) =  0;                          /* offset */
     115        *((uint16_t *) (PA2KA(0x467 + 0))) =  ((uintptr_t) ap_boot) >> 4;       /* segment */
     116        *((uint16_t *) (PA2KA(0x467 + 2))) =  0;                                /* offset */
    117117       
    118118        /*
     
    120120         * BIOS will not do the POST after the INIT signal.
    121121         */
    122         outb(0x70,0xf);
    123         outb(0x71,0xa);
     122        outb(0x70, 0xf);
     123        outb(0x71, 0xa);
    124124
    125125        pic_disable_irqs(0xffff);
Note: See TracChangeset for help on using the changeset viewer.