DMA 任务会定期更新一个特殊的内存块。当另一个Task频繁尝试在这个block中查找数据时,会出现关于L1数据缓存奇偶校验的MCE(Machine Check Exception)。我可以完全或仅在 DMA 更新后使此内存块的 L1 数据缓存无效吗?
libogc 中有一个有趣的 API,例如:
void DCInvalidateRange(void *startaddress,u32 len);
.globl DCInvalidateRange
DCInvalidateRange:
cmplwi r4, 0 # zero or negative size?
blelr
clrlwi. r5, r3, 27 # check for lower bits set in address
beq 1f
addi r4, r4, 0x20
1:
addi r4, r4, 0x1f
srwi r4, r4, 5
mtctr r4
2:
dcbi r0, r3
addi r3, r3, 0x20
bdnz 2b
blr
我不熟悉 ASM,也不熟悉 PowerPC 上的 ASM。人们会推荐有关此操作的链接或描述吗?