Changeset f619ec11 in mainline


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.

Files:
16 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);
  • kernel/arch/ia32xen/src/ia32xen.c

    r80bcaed rf619ec11  
    163163                memory_print_map();
    164164               
    165                 #ifdef CONFIG_SMP
     165#ifdef CONFIG_SMP
    166166                acpi_init();
    167                 #endif /* CONFIG_SMP */
     167#endif /* CONFIG_SMP */
    168168        }
    169169}
  • kernel/arch/ia32xen/src/smp/apic.c

    r80bcaed rf619ec11  
    152152         */
    153153        idreg.value = io_apic_read(IOAPICID);
    154         if ((1<<idreg.apic_id) & apic_id_mask) {        /* see if IO APIC ID is used already */
     154        if ((1 << idreg.apic_id) & apic_id_mask) {      /* see if IO APIC ID is used already */
    155155                for (i = 0; i < APIC_ID_COUNT; i++) {
    156156                        if (!((1<<i) & apic_id_mask)) {
     
    303303                 * If this is not 82489DX-based l_apic we must send two STARTUP IPI's.
    304304                 */
    305                 for (i = 0; i<2; i++) {
     305                for (i = 0; i < 2; i++) {
    306306                        icr.lo = l_apic[ICRlo];
    307307                        icr.delmod = DELMOD_STARTUP;
     
    402402        /* Program Logical Destination Register. */
    403403        ldr.value = l_apic[LDR];
    404         if (CPU->id < sizeof(CPU->id)*8)        /* size in bits */
    405                 ldr.id = (1<<CPU->id);
     404        if (CPU->id < sizeof(CPU->id) * 8)      /* size in bits */
     405                ldr.id = (1 << CPU->id);
    406406        l_apic[LDR] = ldr.value;
    407407       
     
    508508                dlvr = DELMOD_LOWPRI;
    509509
    510         reg.lo = io_apic_read(IOREDTBL + pin*2);
    511         reg.hi = io_apic_read(IOREDTBL + pin*2 + 1);
     510        reg.lo = io_apic_read(IOREDTBL + pin * 2);
     511        reg.hi = io_apic_read(IOREDTBL + pin * 2 + 1);
    512512       
    513513        reg.dest = dest;
     
    518518        reg.intvec = v;
    519519
    520         io_apic_write(IOREDTBL + pin*2, reg.lo);
    521         io_apic_write(IOREDTBL + pin*2 + 1, reg.hi);
     520        io_apic_write(IOREDTBL + pin * 2, reg.lo);
     521        io_apic_write(IOREDTBL + pin * 2 + 1, reg.hi);
    522522}
    523523
     
    540540                        pin = smp_irq_to_pin(i);
    541541                        if (pin != -1) {
    542                                 reg.lo = io_apic_read(IOREDTBL + pin*2);
     542                                reg.lo = io_apic_read(IOREDTBL + pin * 2);
    543543                                reg.masked = true;
    544544                                io_apic_write(IOREDTBL + pin*2, reg.lo);
     
    567567                        pin = smp_irq_to_pin(i);
    568568                        if (pin != -1) {
    569                                 reg.lo = io_apic_read(IOREDTBL + pin*2);
     569                                reg.lo = io_apic_read(IOREDTBL + pin * 2);
    570570                                reg.masked = false;
    571571                                io_apic_write(IOREDTBL + pin*2, reg.lo);
  • kernel/arch/ia64/src/drivers/it.c

    r80bcaed rf619ec11  
    114114        itm_write(m);
    115115        srlz_d();                               /* propagate changes */
    116        
     116
     117        /*
     118         * We are holding a lock which prevents preemption.
     119         * Release the lock, call clock() and reacquire the lock again.
     120         */
     121        spinlock_unlock(&irq->lock);   
    117122        clock();
     123        spinlock_lock(&irq->lock);
    118124}
    119125
  • kernel/arch/ia64/src/ia64.c

    r80bcaed rf619ec11  
    8282       
    8383}
    84 
    85 
    8684
    8785void arch_post_mm_init(void)
  • kernel/arch/mips32/src/interrupt.c

    r80bcaed rf619ec11  
    114114        nextcount = cp0_count_read() + cp0_compare_value - drift;
    115115        cp0_compare_write(nextcount);
     116
     117        /*
     118         * We are holding a lock which prevents preemption.
     119         * Release the lock, call clock() and reacquire the lock again.
     120         */
     121        spinlock_unlock(&irq->lock);
    116122        clock();
     123        spinlock_lock(&irq->lock);
    117124       
    118125        if (virtual_timer_fnc != NULL)
  • kernel/arch/sparc64/src/drivers/tick.c

    r80bcaed rf619ec11  
    100100                CPU->missed_clock_ticks++;
    101101        }
    102         CPU->arch.next_tick_cmpr = tick_read() + (CPU->arch.clock_frequency /
    103                 HZ) - drift;
     102        CPU->arch.next_tick_cmpr = tick_read() +
     103            (CPU->arch.clock_frequency / HZ) - drift;
    104104        tick_compare_write(CPU->arch.next_tick_cmpr);
    105105        clock();
  • kernel/arch/sparc64/src/sparc64.c

    r80bcaed rf619ec11  
    137137{
    138138        uint64_t stop = tick_read() + (uint64_t) usec * (uint64_t)
    139                 CPU->arch.clock_frequency / 1000000;
     139            CPU->arch.clock_frequency / 1000000;
    140140
    141141        while (tick_read() < stop)
     
    147147{
    148148        switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
    149                 ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE
    150                 - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
    151                 (uintptr_t) kernel_uarg->uspace_uarg);
     149            ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE
     150            - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
     151            (uintptr_t) kernel_uarg->uspace_uarg);
    152152
    153153        for (;;)
  • kernel/generic/include/mm/as.h

    r80bcaed rf619ec11  
    168168        /** Containing address space. */
    169169        as_t *as;               
    170         /** Flags related to the memory represented by the address space area. */
     170        /**
     171         * Flags related to the memory represented by the address space area.
     172         */
    171173        int flags;
    172174        /** Attributes related to the address space area itself. */
     
    180182
    181183        /**
    182          * If the address space area has been shared, this pointer will reference
    183          * the share info structure.
     184         * If the address space area has been shared, this pointer will
     185         * reference the share info structure.
    184186         */
    185187        share_info_t *sh_info;
  • kernel/generic/src/ddi/ddi.c

    r80bcaed rf619ec11  
    131131        parea = btree_search(&parea_btree, (btree_key_t) pf, &nodep);
    132132        if (!parea || parea->frames < pages || ((flags & AS_AREA_CACHEABLE) &&
    133                 !parea->cacheable) || (!(flags & AS_AREA_CACHEABLE) &&
    134                 parea->cacheable)) {
     133            !parea->cacheable) || (!(flags & AS_AREA_CACHEABLE) &&
     134            parea->cacheable)) {
    135135                /*
    136136                 * This physical memory area cannot be mapped.
     
    235235 * @return 0 on success, otherwise it returns error code found in errno.h
    236236 */
    237 unative_t sys_physmem_map(unative_t phys_base, unative_t virt_base, unative_t
    238         pages, unative_t flags)
     237unative_t sys_physmem_map(unative_t phys_base, unative_t virt_base,
     238    unative_t pages, unative_t flags)
    239239{
    240240        return (unative_t) ddi_physmem_map(ALIGN_DOWN((uintptr_t) phys_base,
    241                 FRAME_SIZE), ALIGN_DOWN((uintptr_t) virt_base, PAGE_SIZE),
    242                 (count_t) pages, (int) flags);
     241            FRAME_SIZE), ALIGN_DOWN((uintptr_t) virt_base, PAGE_SIZE),
     242            (count_t) pages, (int) flags);
    243243}
    244244
     
    259259               
    260260        return (unative_t) ddi_iospace_enable((task_id_t) arg.task_id,
    261                 (uintptr_t) arg.ioaddr, (size_t) arg.size);
     261            (uintptr_t) arg.ioaddr, (size_t) arg.size);
    262262}
    263263
     
    272272unative_t sys_preempt_control(int enable)
    273273{
    274         if (! cap_get(TASK) & CAP_PREEMPT_CONTROL)
     274        if (!cap_get(TASK) & CAP_PREEMPT_CONTROL)
    275275                return EPERM;
    276276        if (enable)
  • kernel/generic/src/ddi/irq.c

    r80bcaed rf619ec11  
    303303        spinlock_lock(&irq->lock);
    304304        if (devno == -1) {
    305                 /* Invoked by irq_dispatch(). */
     305                /* Invoked by irq_dispatch_and_lock(). */
    306306                rv = ((irq->inr == inr) && (irq->claim() == IRQ_ACCEPT));
    307307        } else {
    308                 /* Invoked by irq_find(). */
     308                /* Invoked by irq_find_and_lock(). */
    309309                rv = ((irq->inr == inr) && (irq->devno == devno));
    310310        }
     
    362362        spinlock_lock(&irq->lock);
    363363        if (devno == -1) {
    364                 /* Invoked by irq_dispatch() */
     364                /* Invoked by irq_dispatch_and_lock() */
    365365                rv = (irq->claim() == IRQ_ACCEPT);
    366366        } else {
    367                 /* Invoked by irq_find() */
     367                /* Invoked by irq_find_and_lock() */
    368368                rv = (irq->devno == devno);
    369369        }
  • uspace/ipcc/ipcc.c

    r80bcaed rf619ec11  
    7676                default:
    7777                        printf("Received message from %P: %X\n", phonehash,callid);
    78                         for (i=0; i < 1024; i++)
     78                        for (i = 0; i < 1024; i++)
    7979                                if (!callids[i]) {
    8080                                        callids[i] = callid;
     
    112112
    113113        cnt = 0;
    114         for (i=0;i < 50;i++) {
     114        for (i = 0;i < 50; i++) {
    115115                if (callids[i]) {
    116116                        printf("%d: %P\n", cnt, callids[i]);
     
    128128        cnt = c - '0' + 1;
    129129       
    130         for (i=0;cnt;i++)
     130        for (i = 0; cnt; i++)
    131131                if (callids[i])
    132132                        cnt--;
     
    213213}
    214214
    215 
    216 
    217215int main(void)
    218216{
     
    227225        printf("***********IPC Tester***********\n");
    228226        printf("********************************\n");
    229 
    230227       
    231228        async_set_client_connection(client_connection);
    232229
    233         for (i=TEST_START;i < TEST_START+10;i++) {
     230        for (i = TEST_START; i < TEST_START + 10; i++) {
    234231                res = ipc_connect_to_me(PHONE_NS, i, 0, &phonead);
    235232                if (!res)
     
    263260                        break;
    264261                case 'j':
     262                        printf("Entering infinite loop\n");
    265263                        while (1)
    266264                                ;
     265                        break;
    267266                case 'p':
    268267                        printf("Doing page fault\n");
    269268                        *((char *)0) = 1;
    270269                        printf("done\n");
     270                        break;
    271271                case 'u':
    272272                        var1=*( (int *) ( ( (char *)(&var) ) + 1 ) );
Note: See TracChangeset for help on using the changeset viewer.