commit c32c2be34af08d1916382f329931866548e5cded
parent aff04880be7d7c5e6ee9efcfec213d12148c99bd
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sat, 24 Oct 2020 09:25:07 +0200
os9/arm64: Improve break-before-make
This implementation ensures the correct break-before-make.
Change-Id: I2c7b79bc6b583e0c4890b7981da8727b6876994c
Diffstat:
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/os9/arch/arm64/arch.s b/src/os9/arch/arm64/arch.s
@@ -39,7 +39,6 @@ invtlb:
LSR X9,X0,#12
DSB ISHST
TLBI VAE1,X9
-// DC CVAU,X0 // FIXME: line commented because it generates an exception
DSB ISH
RET
diff --git a/src/os9/arch/arm64/mmu.c b/src/os9/arch/arm64/mmu.c
@@ -183,6 +183,7 @@ vmap(phyaddr_t pa, uintptr_t va, int perm)
attr |= EL0;
/*
+ * TODO: It does not need locking, it needs a exclusive load
* locking is needed if we are in a system
* with SMMUv3 and page tables are shared.
*/
@@ -195,13 +196,12 @@ vmap(phyaddr_t pa, uintptr_t va, int perm)
* in multi processor systems.
*/
*p = INVALID;
+ invtlb(va);
barrier(DATA);
+ barrier(CODE);
*p = MASK(pa) | attr;
barrier(DATA);
- barrier(CODE);
-
- invtlb(va);
unlock(&m);
dbg("page %p: %llx\n", p, MASK(pa) | attr);