很多时候我们需要在内核中调试一些汇编代码,这个时候要是想打印一些寄存器信息咋办呢?还有要是我们在console未初始化之前,要调试代码,怎样通过串口输出信息呢?研究下内核中的代码片段: 76 __error_p:
77 #ifdef CONFIG_DEBUG_LL
78 adr r0, str_p1
79 bl printascii
80 mov r0, r9
81 bl printhex8
82 adr r0, str_p2
83 bl printascii
84 b __error
85 str_p1: .asciz "\nError: unrecognized/unsupported processor variant (0x"
86 str_p2: .asciz ").\n"
87 .align
88 #endif
89 ENDPROC(__error_p)
上面代码片段来自于arch/arm/kernel/head-common.S(内核版本2.6.35.3)
要想上面代码参与编译,需要配置内核如下:
Kernel hacking --->
[*] Kernel low-level debugging functions
78:讲85行字符串的基地址赋值给r0
79: 跳转到printascii打印r0内核的字符串
80:将r9的值赋给r0
81:跳转到printhex8,以16进制打印出r0内的值
82-83:打印出86行字符串。
上面汇编实现的__error_p函数就是用来处理内核支持的arm core和内核支持arm core匹配的问题,这个时候console还不能用呢。
具体的调用可以参看代码:
83 mrc p15, 0, r9, c0, c0 @ get processor id
84 bl __lookup_processor_type @ r5=procinfo r9=cpuid
85 movs r10, r5 @ invalid processor (r5=0)?
86 beq __error_p @ yes, error 'p'
代码片段来自于arch/arm/kernel/head.S。
83:从ARM的CP15协处理器的寄存器中读取出 processor id;
84: 跳转到函数 __lookup_processor_type,返回r5=procinfo,读入参数r9=cpuid
85: 如果不支持改processor,返回值r5=0
86:如果r5=0则跳转到__error_p,打印出错信息。
例如:Error: unrecognized/unsupported processor variant(0x41069265)。
好了,看到了汇编级串口信息打印函数了吧:),我们调试的时候依葫芦画瓢就行了。
上面用到的printascii,printhex8等等,他们都被封装在arch/arm/kernel/debug.S中。
以后用到了可以看看,实际上这种debug方法可以移植到uboot上,貌似以前samsung的vivi bootloader也是支持这个debug方法的,用着很方便。
阅读(5582) | 评论(0) | 转发(1) |