svn commit: r359672 - head/sys/riscv/riscv
Jessica Clarke
jrtc27 at FreeBSD.org
Mon Apr 6 22:31:31 UTC 2020
Author: jrtc27
Date: Mon Apr 6 22:31:30 2020
New Revision: 359672
URL: https://svnweb.freebsd.org/changeset/base/359672
Log:
riscv: Make sure local hart's icache is synced in pmap_sync_icache
The only way to flush the local hart's icache is with a FENCE.I (or an
equivalent SBI call); a normal FENCE is insufficient and, for the
single-hart case, unnecessary.
Reviewed by: jhb (mentor), markj
Approved by: jhb (mentor), markj
Differential Revision: https://reviews.freebsd.org/D24317
Modified:
head/sys/riscv/riscv/pmap.c
Modified: head/sys/riscv/riscv/pmap.c
==============================================================================
--- head/sys/riscv/riscv/pmap.c Mon Apr 6 22:29:15 2020 (r359671)
+++ head/sys/riscv/riscv/pmap.c Mon Apr 6 22:31:30 2020 (r359672)
@@ -4335,13 +4335,20 @@ pmap_sync_icache(pmap_t pmap, vm_offset_t va, vm_size_
* RISC-V harts, the writing hart has to execute a data FENCE
* before requesting that all remote RISC-V harts execute a
* FENCE.I."
+ *
+ * However, this is slightly misleading; we still need to
+ * perform a FENCE.I for the local hart, as FENCE does nothing
+ * for its icache. FENCE.I alone is also sufficient for the
+ * local hart.
*/
sched_pin();
mask = all_harts;
CPU_CLR(PCPU_GET(hart), &mask);
- fence();
- if (!CPU_EMPTY(&mask) && smp_started)
+ fence_i()
+ if (!CPU_EMPTY(&mask) && smp_started) {
+ fence();
sbi_remote_fence_i(mask.__bits);
+ }
sched_unpin();
}
More information about the svn-src-all
mailing list