特別なメモリ ブロックは、DMA タスクによって定期的に更新されます。別のタスクがこのブロック内のデータを頻繁に参照しようとした場合、L1 データ キャッシュのパリティ チェックに関する MCE (Machine Check Exception) が発生します。このメモリ ブロックの L1 データ キャッシュを完全に無効にすることはできますか? または DMA 更新後にのみ無効にすることはできますか?
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 にも精通していません。人々はこの操作に関するリンクや説明を推奨しますか?