/* * Called by secondaries to update state and initialize CPU registers. */ static void __init smp_cpu_init(int cpunum) { extern int init_per_cpu(int); /* arch/parisc/kernel/setup.c */ extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */ /* Set modes and Enable floating point coprocessor */ (void) init_per_cpu(cpunum); disable_sr_hashing(); mb(); /* Well, support 2.4 linux scheme as well. */ if (cpu_test_and_set(cpunum, cpu_online_map)) { extern void machine_halt(void); /* arch/parisc.../process.c */ printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); machine_halt(); } /* Initialise the idle task for this CPU */ atomic_inc(&init_mm.mm_count); current->active_mm = &init_mm; if(current->mm) BUG(); enter_lazy_tlb(&init_mm, current); init_IRQ(); /* make sure no IRQ's are enabled or pending */ }
/* * Called by secondaries to update state and initialize CPU registers. */ static void __init smp_cpu_init(int cpunum) { extern int init_per_cpu(int); /* arch/parisc/kernel/processor.c */ extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */ extern void start_cpu_itimer(void); /* arch/parisc/kernel/time.c */ /* Set modes and Enable floating point coprocessor */ (void) init_per_cpu(cpunum); disable_sr_hashing(); mb(); /* Well, support 2.4 linux scheme as well. */ if (cpu_online(cpunum)) { extern void machine_halt(void); /* arch/parisc.../process.c */ printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum); machine_halt(); } notify_cpu_starting(cpunum); ipi_call_lock(); set_cpu_online(cpunum, true); ipi_call_unlock(); /* Initialise the idle task for this CPU */ atomic_inc(&init_mm.mm_count); current->active_mm = &init_mm; BUG_ON(current->mm); enter_lazy_tlb(&init_mm, current); init_IRQ(); /* make sure no IRQs are enabled or pending */ start_cpu_itimer(); }
static void __init setup_bootmem(void) { unsigned long bootmap_size; unsigned long mem_max; unsigned long bootmap_pages; unsigned long bootmap_start_pfn; unsigned long bootmap_pfn; #ifndef CONFIG_DISCONTIGMEM physmem_range_t pmem_holes[MAX_PHYSMEM_RANGES - 1]; int npmem_holes; #endif int i, sysram_resource_count; disable_sr_hashing(); /* Turn off space register hashing */ /* * Sort the ranges. Since the number of ranges is typically * small, and performance is not an issue here, just do * a simple insertion sort. */ for (i = 1; i < npmem_ranges; i++) { int j; for (j = i; j > 0; j--) { unsigned long tmp; if (pmem_ranges[j-1].start_pfn < pmem_ranges[j].start_pfn) { break; } tmp = pmem_ranges[j-1].start_pfn; pmem_ranges[j-1].start_pfn = pmem_ranges[j].start_pfn; pmem_ranges[j].start_pfn = tmp; tmp = pmem_ranges[j-1].pages; pmem_ranges[j-1].pages = pmem_ranges[j].pages; pmem_ranges[j].pages = tmp; } } #ifndef CONFIG_DISCONTIGMEM /* * Throw out ranges that are too far apart (controlled by * MAX_GAP). */ for (i = 1; i < npmem_ranges; i++) { if (pmem_ranges[i].start_pfn - (pmem_ranges[i-1].start_pfn + pmem_ranges[i-1].pages) > MAX_GAP) { npmem_ranges = i; printk("Large gap in memory detected (%ld pages). " "Consider turning on CONFIG_DISCONTIGMEM\n", pmem_ranges[i].start_pfn - (pmem_ranges[i-1].start_pfn + pmem_ranges[i-1].pages)); break; } } #endif if (npmem_ranges > 1) { /* Print the memory ranges */ printk(KERN_INFO "Memory Ranges:\n"); for (i = 0; i < npmem_ranges; i++) { unsigned long start; unsigned long size; size = (pmem_ranges[i].pages << PAGE_SHIFT); start = (pmem_ranges[i].start_pfn << PAGE_SHIFT); printk(KERN_INFO "%2d) Start 0x%016lx End 0x%016lx Size %6ld MB\n", i,start, start + (size - 1), size >> 20); } }