How to bring up CPU 4~7

来自个人维基
2019年11月18日 (一) 18:38free6d1823讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Xen boot error:

...
(XEN) Bringing up CPU3
(XEN) CPU3: Guest atomics will try 12 times before pausing the domain
(XEN) CPU 3 booted.
(XEN) Bringing up CPU4
(XEN) CPU4 MIDR (0x410fd091) does not match boot CPU MIDR (0x410fd034),
(XEN) disable cpu (see big.LITTLE.txt under docs/).
(XEN) CPU4 never came online
(XEN) Failed to bring up CPU 4 (error -5)
(XEN) Bringing up CPU5
(XEN) CPU5 MIDR (0x410fd091) does not match boot CPU MIDR (0x410fd034),
(XEN) disable cpu (see big.LITTLE.txt under docs/).
(XEN) CPU5 never came online
(XEN) Failed to bring up CPU 5 (error -5)
(XEN) Bringing up CPU6
(XEN) CPU6 MIDR (0x410fd091) does not match boot CPU MIDR (0x410fd034),
(XEN) disable cpu (see big.LITTLE.txt under docs/).
(XEN) CPU6 never came online
(XEN) Failed to bring up CPU 6 (error -5)
(XEN) Bringing up CPU7
(XEN) CPU7 MIDR (0x410fd091) does not match boot CPU MIDR (0x410fd034),
(XEN) disable cpu (see big.LITTLE.txt under docs/).
(XEN) CPU7 never came online
(XEN) Failed to bring up CPU 7 (error -5)

Boot sequence:
./xen/arch/arm/smpboot.c

int __cpu_up(unsigned int cpu)
{
    rc = init_secondary_pagetables(cpu);
 console_start_sync(); /* Secondary may use early_printk */
    smp_up_cpu = cpu_logical_map(cpu);
    clean_dcache(smp_up_cpu);
    rc = arch_cpu_up(cpu);
 
    console_end_sync();
    while ( !cpu_online(cpu) && NOW() < deadline )/
 
    {
        cpu_relax();
        process_pending_softirqs();
    }
    /*
     * Ensure that other cpus' initializations are visible before
     * proceeding. Corresponds to smp_wmb() in start_secondary.
     */
    smp_rmb();
    clean_dcache(smp_up_cpu);
 
    if ( !cpu_online(cpu) )
    {
        printk("CPU%d never came online\n", cpu);
        return -EIO;
    }
 
}
 
/* Boot the current CPU */
void start_secondary(void)
{
    /*
     * Currently Xen assumes the platform has only one kind of CPUs.
     * This assumption does not hold on big.LITTLE platform and may
     * result to instability and insecure platform (unless cpu affinity
     * is manually specified for all domains). Better to park them for
     * now.
     */
    if ( !opt_hmp_unsafe &&
         current_cpu_data.midr.bits != boot_cpu_data.midr.bits )
    {
        printk(XENLOG_ERR "CPU%u MIDR (0x%x) does not match boot CPU MIDR (0x%x),\n"
               "disable cpu (see big.LITTLE.txt under docs/).\n",
               smp_processor_id(), current_cpu_data.midr.bits,
               boot_cpu_data.midr.bits);
        stop_cpu();
    }
 
}