在使用运行 MPC5674F 的定制硬件进行一些实验时,我在尝试恢复数据缓存中的缓存作为 RAM 配置时遇到了一些麻烦。
在某些时候,在初始化期间,数据缓存似乎被配置为有效地址为 0x40040000 的快速 RAM。目前,我无法修改初始化代码,因此我尝试在软件执行期间解锁它,但每当我尝试解锁它的方式时它都会崩溃——无论是通过 dcblc 指令还是通过设置 L1CSR0[DCLFC]。由于硬件有点像黑盒子(它没有故障转储,而且我还没有合适的调试环境),所以我没有关于导致崩溃的异常的信息。
尽管有所有这些模糊的信息,但我想知道是否有人知道我在尝试解锁此缓存时丢失的东西。
首先,是我无法修改的 MMU 和缓存配置代码(如果注释有误或无用,请警告我,我插入了它们,但我仍在尝试弄清楚 MMU 是如何工作的):
============
mmu_config:
e_lis r3, 0x1005 /* TLB 条目 5 */
mtmas0 r3
e_lis r3, 0x8 /* 有效的 TLB 条目 */
e_or2i r3, 0x200 /* 页面大小:16KB */
mtmas1 r3
e_lis r3, 0x4004 /* 链接到地址 0x40040000?*/
mtmas2 r3
e_lis r3, 0x4004 /* 链接到地址 0x40040000?*/
e_or2i r3, 0xf /* 可以在用户或管理员模式下读写 */
mtmas3 r3
se_isync
tlbwe
msync
se_isync
============
然后,dcache 失效(我省略这段代码是因为它看起来很简单)。全部无效后,再启用并锁定:
============
dcache_enable:
e_lis r3, 0x10 /* copyback */
e_or2i r3, 0x1 /* 打开 dcache */
dcache_lock:
e_li r3, 512 /* 遍历所有 512 行 */
mtctr r3
e_lis r3, 0x4004 /* 从 EA 0x40040000 开始 */
loop:
dcbz 0, r3 /* 将 EA 分配给 dcache 行并将 0 分配给整行 */
dcbtls 0, r0, r3 /* 加载缓存行并锁定它 */
e_addi r3, r3, 32 /* 转到下一个块,直到我们映射到缓存从 0x40040000 开始的所有 16KB */
e_bdnz 循环
======== ====
到目前为止,一切都很好。上面的代码似乎工作正常。
最后,有我自己的代码。在尝试重新配置之前,我确保(至少,我尝试过)没有任何东西映射到数据缓存。我的第一次解锁尝试是:
============
.globl UnlockDCache
.type UnlockDCache, @func
tion
UnlockDCache:
unlock_start:
e_li r4, 0x100 /* L1CSR0[DCLFC] */
mfspr r3, l1csr0
e_or2i r3, 0x100
msync
se_isync
mtspr l1csr0, 复制代码r3
se_isync
unlock_wait:
mfspr r3,l1csr0
se_and r3,r4
e_cmp16i r3,0x100
e_beq unlock_wait
cabt_check:
mfspr r3,l1csr0
e_li r5,4
se_and r3,r5
e_cmp16i r3,4
e_beq unlock_start
.size UnlockDCache,$-UnlockDCache
===== =======
我的第二次尝试(也没有用)是:
============
.globl UnlockDCacheAlready
.type UnlockDCacheAlready, @function
UnlockDCacheAlready:
e_li r3, 512
mtCTR r3
e_lis r3, 0x4004
dcache_unlocking_loop:
dcblc 0, r0, r3
e_addi r3, r3, 32
e_bdnz dcache_unlocking_loop
。大小 UnlockDCacheAlready, $-UnlockDCacheAlready
=============
正如我之前所说,我认为这两次尝试都因某些处理器异常而以崩溃告终。我在这里错过了什么?