Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/smp/smp.c

    r99718a2e re3ce39b  
    6262void smp_init(void)
    6363{
     64        uintptr_t l_apic_address, io_apic_address;
     65
    6466        if (acpi_madt) {
    6567                acpi_madt_parse();
    6668                ops = &madt_config_operations;
    6769        }
    68        
    6970        if (config.cpu_count == 1) {
    7071                mps_init();
    7172                ops = &mps_config_operations;
    7273        }
    73        
     74
     75        l_apic_address = (uintptr_t) frame_alloc(ONE_FRAME,
     76            FRAME_ATOMIC | FRAME_KA);
     77        if (!l_apic_address)
     78                panic("Cannot allocate address for l_apic.");
     79
     80        io_apic_address = (uintptr_t) frame_alloc(ONE_FRAME,
     81            FRAME_ATOMIC | FRAME_KA);
     82        if (!io_apic_address)
     83                panic("Cannot allocate address for io_apic.");
     84
    7485        if (config.cpu_count > 1) {
    75                 l_apic = (uint32_t *) hw_map((uintptr_t) l_apic, PAGE_SIZE);
    76                 io_apic = (uint32_t *) hw_map((uintptr_t) io_apic, PAGE_SIZE);
     86                page_table_lock(AS_KERNEL, true);
     87                page_mapping_insert(AS_KERNEL, l_apic_address,
     88                    (uintptr_t) l_apic, PAGE_NOT_CACHEABLE | PAGE_WRITE);
     89                page_mapping_insert(AS_KERNEL, io_apic_address,
     90                    (uintptr_t) io_apic, PAGE_NOT_CACHEABLE | PAGE_WRITE);
     91                page_table_unlock(AS_KERNEL, true);
     92                                 
     93                l_apic = (uint32_t *) l_apic_address;
     94                io_apic = (uint32_t *) io_apic_address;
    7795        }
    7896}
     
    90108       
    91109        ASSERT(ops != NULL);
    92        
     110
    93111        /*
    94112         * We need to access data in frame 0.
    95113         * We boldly make use of kernel address space mapping.
    96114         */
    97        
     115
    98116        /*
    99117         * Set the warm-reset vector to the real-mode address of 4K-aligned ap_boot()
    100118         */
    101119        *((uint16_t *) (PA2KA(0x467 + 0))) =
    102             (uint16_t) (((uintptr_t) ap_boot) >> 4);  /* segment */
    103         *((uint16_t *) (PA2KA(0x467 + 2))) = 0;       /* offset */
     120            (uint16_t) (((uintptr_t) ap_boot) >> 4);    /* segment */
     121        *((uint16_t *) (PA2KA(0x467 + 2))) = 0;         /* offset */
    104122       
    105123        /*
     
    107125         * BIOS will not do the POST after the INIT signal.
    108126         */
    109         pio_write_8((ioport8_t *) 0x70, 0xf);
    110         pio_write_8((ioport8_t *) 0x71, 0xa);
    111        
     127        pio_write_8((ioport8_t *)0x70, 0xf);
     128        pio_write_8((ioport8_t *)0x71, 0xa);
     129
    112130        pic_disable_irqs(0xffff);
    113131        apic_init();
    114132       
    115         for (i = 0; i < config.cpu_count; i++) {
     133        uint8_t apic = l_apic_id();
     134
     135        for (i = 0; i < ops->cpu_count(); i++) {
     136                descriptor_t *gdt_new;
     137               
    116138                /*
    117139                 * Skip processors marked unusable.
     
    119141                if (!ops->cpu_enabled(i))
    120142                        continue;
    121                
     143
    122144                /*
    123145                 * The bootstrap processor is already up.
     
    125147                if (ops->cpu_bootstrap(i))
    126148                        continue;
    127                
    128                 if (ops->cpu_apic_id(i) == bsp_l_apic) {
    129                         printf("kmp: bad processor entry #%u, will not send IPI "
    130                             "to myself\n", i);
     149
     150                if (ops->cpu_apic_id(i) == apic) {
     151                        printf("%s: bad processor entry #%u, will not send IPI "
     152                            "to myself\n", __FUNCTION__, i);
    131153                        continue;
    132154                }
     
    140162                 * the memory subsystem
    141163                 */
    142                 descriptor_t *gdt_new =
    143                     (descriptor_t *) malloc(GDT_ITEMS * sizeof(descriptor_t),
    144                     FRAME_ATOMIC);
     164                gdt_new = (descriptor_t *) malloc(GDT_ITEMS *
     165                    sizeof(descriptor_t), FRAME_ATOMIC);
    145166                if (!gdt_new)
    146167                        panic("Cannot allocate memory for GDT.");
    147                
     168
    148169                memcpy(gdt_new, gdt, GDT_ITEMS * sizeof(descriptor_t));
    149170                memsetb(&gdt_new[TSS_DES], sizeof(descriptor_t), 0);
     
    151172                protected_ap_gdtr.base = KA2PA((uintptr_t) gdt_new);
    152173                gdtr.base = (uintptr_t) gdt_new;
    153                
     174
    154175                if (l_apic_send_init_ipi(ops->cpu_apic_id(i))) {
    155176                        /*
     
    160181                        if (waitq_sleep_timeout(&ap_completion_wq, 1000000,
    161182                            SYNCH_FLAGS_NONE) == ESYNCH_TIMEOUT) {
     183                                unsigned int cpu = (config.cpu_active > i) ?
     184                                    config.cpu_active : i;
    162185                                printf("%s: waiting for cpu%u (APIC ID = %d) "
    163                                     "timed out\n", __FUNCTION__, i,
     186                                    "timed out\n", __FUNCTION__, cpu,
    164187                                    ops->cpu_apic_id(i));
    165188                        }
Note: See TracChangeset for help on using the changeset viewer.