*参照元 [#t338f415] #backlinks *説明 [#z5b42d5a] -パス: [[linux-4.4.1/arch/arm/mm/cache-v7.S]] -FIXME: これは何? --説明 **引数 [#j6c2ea52] -start -- -end -- **返り値 [#ndd1d057] -なし? **参考 [#bee1b080] *実装 [#kbaf317d] /* * v7_dma_inv_range(start,end) * * Invalidate the data cache within the specified region; we will * be performing a DMA operation in this region and we want to * purge old data in the cache. * * - start - virtual start address of region * - end - virtual end address of region */ v7_dma_inv_range: dcache_line_size r2, r3 - --[[linux-4.4.1/dcache_line_size()]] sub r3, r2, #1 tst r0, r3 bic r0, r0, r3 #ifdef CONFIG_ARM_ERRATA_764369 - --[[linux-4.4.1/CONFIG_ARM_ERRATA_764369]] ALT_SMP(W(dsb)) ALT_UP(W(nop)) - --[[linux-4.4.1/ALT_SMP()]] --[[linux-4.4.1/ALT_UP()]] --[[linux-4.4.1/W()]] #endif mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line -cp15 CRn=c7, opc1=0, CRm=c14, opc2=1, DCCIMVAC レジスタ --データまたは統一キャッシュを clean & invalidate する。 --つまり Dirty なら書き出してからキャッシュを破棄。Clean なら破棄。 --レジスタのデータ(このコードは r0 を渡している)は仮想アドレスとして解釈される。 tst r1, r3 bic r1, r1, r3 mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D / U line 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D / U line -cp15 CRn=c7, opc1=0, CRm=c6, opc2=1, DCIMVAC レジスタ --データまたは統一キャッシュを invalidate する。 --つまり Dirty でも Clean でも破棄。 --レジスタのデータ(このコードは r0 を渡している)は仮想アドレスとして解釈される。 add r0, r0, r2 cmp r0, r1 blo 1b dsb st ret lr ENDPROC(v7_dma_inv_range) - --[[linux-4.4.1/ENDPROC()]] *コメント [#h5c9d8d0]