I already suggested move this to a function +#ifndef MACH_HYP + /* Turn paging on. + * TODO: Why does setting the WP bit here cause a crash? + */ + set_cr0(get_cr0() | CR0_PG /* | CR0_WP */); + set_cr0(get_cr0() & ~(CR0_CD | CR0_NW)); + if (CPU_HAS_FEATURE(CPU_FEATURE_PGE)) + set_cr4(get_cr4() | CR4_PGE);
Added to this, checking this void start_other_cpus(void) { - int cpu; - for (cpu = 0; cpu < NCPUS; cpu++) - if (cpu != cpu_number()) - cpu_start(cpu); -} + int ncpus = smp_get_numcpus(); + + //Copy cpu initialization assembly routine + memcpy((void*)phystokv(AP_BOOT_ADDR), (void*) &apboot, + (uint32_t)&apbootend - (uint32_t)&apboot); +#ifndef APIC + lapic_enable(); /* Enable lapic only once */ +#endif + unsigned cpu; + + splhigh(); + + bspdone = 0; + for (cpu = 1; cpu < ncpus; cpu++) { + machine_slot[cpu].running = FALSE; + + //Start cpu + printf("Starting AP %d\n", cpu); + cpu_start(cpu); + + bspdone++; + do { + asm volatile ("pause" : : : "memory"); + } while (machine_slot[cpu].running == FALSE); + + __sync_synchronize(); + } + printf("BSP: Completed SMP init\n"); +} #endif /* NCPUS > 1 */ I miss the stack's memory reserve and assignation for AP processors, which was usually make before startup these. Where are this? El mié, 1 feb 2023 a las 18:54, Samuel Thibault (<samuel.thiba...@gnu.org>) escribió: > Hello, > > Damien Zammit, le mer. 01 févr. 2023 10:05:47 +0000, a ecrit: > > This is a rather large commit, but difficult to break it up. > > Perhaps you can separate out the moving of the i386at_init code > > > @@ -448,47 +444,8 @@ i386at_init(void) > > */ > > biosmem_setup(); > > > > - /* > > - * We'll have to temporarily install a direct mapping > > - * between physical memory and low linear memory, > > - * until we start using our new kernel segment descriptors. > > - */ > > -#if INIT_VM_MIN_KERNEL_ADDRESS != LINEAR_MIN_KERNEL_ADDRESS > > - vm_offset_t delta = INIT_VM_MIN_KERNEL_ADDRESS - > LINEAR_MIN_KERNEL_ADDRESS; > > - if ((vm_offset_t)(-delta) < delta) > > - delta = (vm_offset_t)(-delta); > > - int nb_direct = delta >> PDESHIFT; > > - for (i = 0; i < nb_direct; i++) > > - > kernel_page_dir[lin2pdenum_cont(INIT_VM_MIN_KERNEL_ADDRESS) + i] = > > - > kernel_page_dir[lin2pdenum_cont(LINEAR_MIN_KERNEL_ADDRESS) + i]; > > [etc.] > > into functions? > > Samuel > >