|
|
@@ -461,12 +461,21 @@ void __init dma_contiguous_remap(void)
|
|
|
map.type = MT_MEMORY_DMA_READY;
|
|
|
|
|
|
/*
|
|
|
- * Clear previous low-memory mapping
|
|
|
+ * Clear previous low-memory mapping to ensure that the
|
|
|
+ * TLB does not see any conflicting entries, then flush
|
|
|
+ * the TLB of the old entries before creating new mappings.
|
|
|
+ *
|
|
|
+ * This ensures that any speculatively loaded TLB entries
|
|
|
+ * (even though they may be rare) can not cause any problems,
|
|
|
+ * and ensures that this code is architecturally compliant.
|
|
|
*/
|
|
|
for (addr = __phys_to_virt(start); addr < __phys_to_virt(end);
|
|
|
addr += PMD_SIZE)
|
|
|
pmd_clear(pmd_off_k(addr));
|
|
|
|
|
|
+ flush_tlb_kernel_range(__phys_to_virt(start),
|
|
|
+ __phys_to_virt(end));
|
|
|
+
|
|
|
iotable_init(&map, 1);
|
|
|
}
|
|
|
}
|