求助关于arm 内核多核cpu初始化汇编代码调试
本帖最后由 firocu 于 2015-09-04 15:09 编辑Hi all,
我现在遇到了smp初始化的问题. 在 secondary core初始化的汇编代码加了printascii 导致secondary core初始化失败!
我的bsp4个cpu core, 加了打印后1 2 3号core没起来, 0号core起来了.
我在arch/arm/mach-相关secondary core boot的汇编代码里面只是加了两个printascii的打log的指令,ENTRY(axp_secondary_startup)
#ifdef CONFIG_CPU_ENDIAN_BE32
/* convert CPU to big endian */
.word 0x100f11ee /* mrc p15, 0, r0, c1, c0 */
.word 0x800080e3 /* orr r0, r0, #0x80 */
.word 0x100f01ee /* mcr p15, 0, r0, c1, c0 */
#endif
#ifdef CONFIG_BE8_ON_LE
setendbe
#endif
ARM( mov r0, r0 )
ARM( b 1f )
THUMB( adr r12, BSYM(1f) )
THUMB( bx r12 )
THUMB( .thumb )
1:
/*
// Added by firo 第一个printascii
adr r0, firo_str1
bl printascii //应该就是停在这个函数里面了, 这是arch提供的调试函数在arch/arm/kernel/debug.S
firo_str1: .asciz "\naaaaaaa\n" //这个输出了
// Added by firo 第二个printascii
adr r0, firo_str2
bl printascii
firo_str2: .asciz "\nbbbbbbb\n" //这个没输出
// Added by firo
*/
/*
* Add CPU to coherency fabric
*/
mrc p15, 0, r0, c0, c0, 5
and r0, r0, #15
mov r4, #1
add r5, r0, #24
printascii的源码ENTRY(printascii)
addruart_current r3, r1, r2
b 2f
1: waituart r2, r3
senduart r1, r3
busyuart r2, r3
teq r1, #'\n'
moveq r1, #'\r'
beq 1b
2: teq r0, #0
ldrnebr1, , #1
teqne r1, #0
bne 1b
mov pc, lr
ENDPROC(printascii)只输出了aaaaaaa, 没有输出后面的bbbbbbb, 感觉像是停在了第一个printascii里面.
我的问题:
1. 大家知道有什么安全的print一类的 打log的函数吗? 不影响cpu初始化的, 找了很久未果.
2. 为什么printascii会导致hang住呢?
要是可以用qemu模拟的话,可以结合gdb跟踪一下。 // Added by firo 第一个printascii
adr r0, firo_str1
bl printascii //应该就是停在这个函数里面了, 这是arch提供的调试函数在arch/arm/kernel/debug.S
firo_str1: .asciz "\naaaaaaa\n" //这个输出了
// Added by firo 第二个printascii
你这个bl返回地址下面的代码是什么,你要确认一下。使用 objdump 之类的工具看看。是否返回地址变成了 aaaaaaa 了
所以你可以试试修改成下面代码:
// Added by firo 第一个printascii
adr r0, firo_str1
bl printascii //应该就是停在这个函数里面了, 这是arch提供的调试函数在arch/arm/kernel/debug.S
// Added by firo 第二个printascii
adr r0, firo_str2
bl printascii
b 1f
firo_str2: .asciz "\nbbbbbbb\n" //这个没输出
firo_str1: .asciz "\naaaaaaa\n" //这个输出了
1:
// Added by firo
*/ 应该如版主指出的,指令和数据混在一起了。
PS,对arm不熟悉,是靠mov pc, lr完成函数返回的吗?
页:
[1]