我在调S3C2440的SLEEP模式时发现在CPU进入POWER OFF后在唤醒时出现了问题。调试时发现在BOOT起来后,已转到相关的wake up from power off的代码,但是在执行下面语句时出现问题,整个机子没反应了:
ldr r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
ldr r9, [r5, #SleepState_MMUTTB] ; load the MMU TTB info
ldr r8, [r5, #SleepState_MMUCTL] ; load the MMU control info
ldr r7, [r5, #SleepState_WakeAddr ] ; load the LR address
nop
nop
nop
nop
nop
; if software reset
teq r1, r7
bne %f1
bl BringUpWinCE
; wakeup routine
1
mcr p15, 0, r10, c3, c0, 0 ; setup access to domain 0
mcr p15, 0, r9, c2, c0, 0 ; PT address
mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs
mcr p15, 0, r8, c1, c0, 0 ; restore MMU control (enable the mmu)
nop
nop
nop
nop
; 3. Jump to Kernel Image's fw.s (Awake_address)
mov pc, r7 ; jump to new VA (back up Power management stack)
nop
上述就是出问题的唤醒代码,经调试,确认在执行到 mcr p15, 0, r8, c1, c0, 0 这个语句时出了问题。这个语句作用是把R8中的内容恢复到C1中,而经过几次调试,发现在恢复C1的第0位时出的问题。C1的第0位作用是使能MMU,查阅资料时我注意到了使能MMU时必须:
1、建立好页表,相关的寄存器要完成初始化。
2、在使能MMU时,应该清除CACHE中的地址变换条目。
3、使能MMU代码的物理地址和虚拟地址应该相同,否则可能产生PC误指。
mcr p15, 0, r9, c2, c0, 0 ; PT address
mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs
这两条语句已满足1,2两点要求,我的疑问是如何保证使能MMU代码的物理地址和虚拟地址相同,或者使能MMU之前是否还少了哪些流程,请大家指点,或者加我QQ:17988731 讨论。
ldr r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
ldr r9, [r5, #SleepState_MMUTTB] ; load the MMU TTB info
ldr r8, [r5, #SleepState_MMUCTL] ; load the MMU control info
ldr r7, [r5, #SleepState_WakeAddr ] ; load the LR address
nop
nop
nop
nop
nop
; if software reset
teq r1, r7
bne %f1
bl BringUpWinCE
; wakeup routine
1
mcr p15, 0, r10, c3, c0, 0 ; setup access to domain 0
mcr p15, 0, r9, c2, c0, 0 ; PT address
mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs
mcr p15, 0, r8, c1, c0, 0 ; restore MMU control (enable the mmu)
nop
nop
nop
nop
; 3. Jump to Kernel Image's fw.s (Awake_address)
mov pc, r7 ; jump to new VA (back up Power management stack)
nop
上述就是出问题的唤醒代码,经调试,确认在执行到 mcr p15, 0, r8, c1, c0, 0 这个语句时出了问题。这个语句作用是把R8中的内容恢复到C1中,而经过几次调试,发现在恢复C1的第0位时出的问题。C1的第0位作用是使能MMU,查阅资料时我注意到了使能MMU时必须:
1、建立好页表,相关的寄存器要完成初始化。
2、在使能MMU时,应该清除CACHE中的地址变换条目。
3、使能MMU代码的物理地址和虚拟地址应该相同,否则可能产生PC误指。
mcr p15, 0, r9, c2, c0, 0 ; PT address
mcr p15, 0, r0, c8, c7, 0 ; flush I+D TLBs
这两条语句已满足1,2两点要求,我的疑问是如何保证使能MMU代码的物理地址和虚拟地址相同,或者使能MMU之前是否还少了哪些流程,请大家指点,或者加我QQ:17988731 讨论。