本帖最后由 garyv 于 2014-06-26 19:50 编辑
最近自己在Freescale的i.MX6Q(ARM cortex-a9)四核开发板上做了一个很小的kernel,kernel运行于PL1,app运行于PL0,现在希望从kernel切换到app,需要进行PL1至PL0的切换,但是下述代码切换一直出错,未知原因:
- void switch_to_app(u32 app_id)
- {
- __asm volatile
- (
- "ldr r0, %0\n\t"
- "msr spsr_c, %1\n\t"
- "mov r1, #0\n\t"
- "movs pc, r1"
- : : "m"(app_id), "i"(0x10) : "r0", "r1"
- );
- }
复制代码 执行到"movs pc, r1"时,产生 data abort 异常。
内核地址范围: 0xC0000000 ~ 0xC0FFFFFF 用户空间地址范围:0x00000000 ~ 0x000FFFFF 都是虚拟地址。
app的入口代码如下,起始于虚拟地址0:
- .section .text
- _start:
- @ startup by kernel
- b _next
- @ size info in byte
- .word 0x55aa
- .word 0x1100
- _next:
- ldr r1, =__stack_top @ __stack_top is 0xFE000 specified in link script.
- mov sp, r1
- push {r1} @ app stack bottom
- push {r0} @ app id
- mov r3, r0
- ...
复制代码
出错时的调试信息:
##DABORT EXCEPTION##CPU0
LR 0x00000000
AIFSR 0x00000000
ADFSR 0x00000000
IFAR 0xAC589A80
IFSR 0x00000000
DFAR 0xC0000000
DFSR 0x0000000F
LR是调整之后的LR,也就是说0地址就是产生data abort的地址。
希望本版里面的高手能提供linux kernel里面PL1 --> PL0 切换的关键代码供参考。
|