l4linux update problem

li94575 li94575 at ...176...
Thu Jul 14 09:51:40 CEST 2016


Hi, all
    Recently, I was trying to update the l4linux to version 3.10, and the FOC kernel has also been updated to rev58 accordingly.
Now, l4linux3.10 can run well if I not set CONFIG_SMP. But I would get a pagefault when enable SMP, and cpu1 failed to come 
online, part of the log is given below:
---------------------------
[     0.320000] {0} CPU: Testing write buffer coherency: ok
[     0.320000] {0} CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[     0.320000] {0} Setting up static identity map for 0x02379fa0 - 0x02379fa0
[init -> l4linux] l4x_virt_to_phys: Could not translate virt. address 2379fa0
[init -> l4linux] l4x_virt_to_phys: Could not translate virt. address 2379fa0
[init -> l4linux] Launching cpu1 on pcpu 1 at 236fc30
[init -> l4linux] l4x_cpu_threads[1] = 84000a00
[init -> l4linux] l4x_virt_to_phys: Could not translate virt. address 254a000
virtual void Genode::Signal_session_component::submit(Genode::Signal_contex_capability,
unsigned int): invalid signal-context capability
virtual void Genode::Pager_activation_base::entry(): Could not resolve pf=8650ca40 ip=2003a24
[     2.360000] {0} CPU1: failed to come online
[     2.360000] {0} Brought up 1 CPUs
[     2.360000] {0} SMP: Total of 1 processors activated (3697.04 BogoMIPS).
......
-----------------------------------
Note that the thread context area starts from 0x80000000 (physical mem area is 0x00000000 ~ 0x7fffffff),
the pagefault seems not to be caused by thread stack overflow, Increasing stack size of vcpu thread can
not help to solve it. Vcpu1 thread have been created successfully, and already entry the entry() function, but __cpu_starter() has not been excuted.
Using genode-arm-objdump tool to convert vmlinux:
---------------------------------------------------------------------
.......
unsigned long l4x_global_save_flags(void)
{
2003a10:   e1a0c00d     mov ip, sp
2003a14:   e92dd800     push    {fp, ip, lr, pc}
2003a18:   e24cb004     sub fp, ip, #4
2003a1c:   e59f300c      ldr r3, [pc, #12]   ; 2003a30 
2003a20:   ee1d2f70      mrc 15, 0, r2 ,cr13, cr0, {3}
2003a24:   e7923003     ldr   r3, [r2, r3]
    return l4vcpu_state(l4x_vcpu_state_current());
#else
    return l4_capability_equal(tamed_per_nr(cli_lock, get_tamer_nr(current_thread_info()->cpu)).owner,
                            l4x_cap_current()) ? L4_IRQ_DISABLED : L4_IRQ_ENABLED;
#endif
}
2003a28:   e1d308b8    ldrh   r0, [r3, #136]  ;  0x88
2003a2c:   e89da800    ldm sp, {fp, sp, pc}
2003a30:   0250c040    .word  0x0250c040
02003a34 :
}
EXPORT_SYMBOL(l4x_global_cli);
......
----------------------------------------------------------------
Noting: l4linux3.10 uses register TPIDRURO to store percpu offset, not TPIDRURW in l4linux3.9, and
a new system call interface of thread object is introduced (seeing arch/l4/include/asm/arch-arm/percpu.h).
I tested this in genode1308 and genode1311, the phenomenon seems to be the same. Now, I have no idea 
to fix this problem, can anybody give some suggestions?





More information about the users mailing list