免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2887 | 回复: 3
打印 上一主题 下一主题

[CPU及多核] 求助关于arm 内核多核cpu初始化汇编代码调试 [复制链接]

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-04 14:53 |只看该作者 |倒序浏览
本帖最后由 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的指令,
  1. ENTRY(axp_secondary_startup)
  2. #ifdef CONFIG_CPU_ENDIAN_BE32
  3.         /* convert CPU to big endian */
  4.         .word 0x100f11ee /* mrc p15, 0, r0, c1, c0 */
  5.         .word 0x800080e3 /* orr r0, r0, #0x80 */
  6.         .word 0x100f01ee /* mcr p15, 0, r0, c1, c0 */
  7. #endif
  8. #ifdef CONFIG_BE8_ON_LE
  9.         setend  be
  10. #endif
  11.         ARM(            mov     r0, r0          )
  12.         ARM(            b       1f              )
  13.         THUMB(          adr     r12, BSYM(1f)   )
  14.         THUMB(          bx      r12             )
  15.         THUMB(          .thumb                  )
  16. 1:
  17. /*
  18. // Added by firo 第一个printascii
  19.         adr     r0, firo_str1
  20.         bl      printascii                                 //应该就是停在这个函数里面了, 这是arch提供的调试函数在arch/arm/kernel/debug.S
  21. firo_str1: .asciz "\naaaaaaa\n"       //这个输出了
  22. // Added by firo 第二个printascii
  23.         adr     r0, firo_str2
  24.         bl      printascii
  25. firo_str2: .asciz "\nbbbbbbb\n"   //这个没输出
  26. // Added by firo
  27. */
  28.         /*
  29.          * Add CPU to coherency fabric
  30.          */
  31.         mrc     p15, 0, r0, c0, c0, 5
  32.         and     r0, r0, #15
  33.         mov     r4, #1
  34.         add     r5, r0, #24
复制代码
printascii的源码
  1. ENTRY(printascii)
  2.                 addruart_current r3, r1, r2
  3.                 b       2f
  4. 1:              waituart r2, r3
  5.                 senduart r1, r3
  6.                 busyuart r2, r3
  7.                 teq     r1, #'\n'
  8.                 moveq   r1, #'\r'
  9.                 beq     1b
  10. 2:              teq     r0, #0
  11.                 ldrneb  r1, [r0], #1
  12.                 teqne   r1, #0
  13.                 bne     1b
  14.                 mov     pc, lr
  15. ENDPROC(printascii)
复制代码
只输出了aaaaaaa, 没有输出后面的bbbbbbb, 感觉像是停在了第一个printascii里面.


我的问题:
1. 大家知道有什么安全的print一类的 打log的函数吗? 不影响cpu初始化的, 找了很久未果.
2. 为什么printascii会导致hang住呢?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-09-10 20:53 |只看该作者
要是可以用qemu模拟的话,可以结合gdb跟踪一下。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 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
*/

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-09-14 18:54 |只看该作者
应该如版主指出的,指令和数据混在一起了。

PS,对arm不熟悉,是靠  mov     pc, lr  完成函数返回的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP