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