firocu 发表于 2015-09-04 14:53

求助关于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住呢?

nswcfd 发表于 2015-09-10 20:53

要是可以用qemu模拟的话,可以结合gdb跟踪一下。

amarant 发表于 2015-09-11 17:16

// 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
*/

nswcfd 发表于 2015-09-14 18:54

应该如版主指出的,指令和数据混在一起了。

PS,对arm不熟悉,是靠mov   pc, lr完成函数返回的吗?
页: [1]
查看完整版本: 求助关于arm 内核多核cpu初始化汇编代码调试