From 308e8bf4d27658b6dcf103c03bf12396ebdadb2b Mon Sep 17 00:00:00 2001 From: Anna Lyons Date: Tue, 10 Apr 2018 11:58:11 +1000 Subject: [PATCH] riscv: move machine functions to machine.h And add memory barriers while we are at it. --- include/arch/riscv/arch/machine.h | 12 +++++++++++- src/arch/riscv/kernel/vspace.c | 20 ++++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/arch/riscv/arch/machine.h b/include/arch/riscv/arch/machine.h index 6418739b1..2d7d345f9 100644 --- a/include/arch/riscv/arch/machine.h +++ b/include/arch/riscv/arch/machine.h @@ -28,13 +28,23 @@ #include #include +static inline void sfence(void) +{ + asm volatile ("sfence.vma" ::: "memory"); +} + +static inline void hwASIDFlush(asid_t asid) +{ + asm volatile ("sfence.vma x0, %0" :: "r" (asid): "memory"); +} + #ifdef ENABLE_SMP_SUPPORT #define irq_remote_call_ipi 0 #define irq_reschedule_ipi 1 #define int_remote_call_ipi irq_remote_call_ipi #define int_reschedule_ipi irq_reschedule_ipi -#define IPI_MEM_BARRIER asm volatile("sfence.vma"); +#define IPI_MEM_BARRIER sfence() void ipi_send_target(irq_t irq, word_t cpuTargetList) { diff --git a/src/arch/riscv/kernel/vspace.c b/src/arch/riscv/kernel/vspace.c index ea88c0593..cfba7abaf 100644 --- a/src/arch/riscv/kernel/vspace.c +++ b/src/arch/riscv/kernel/vspace.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -147,9 +148,7 @@ map_it_pt_cap(cap_t vspace_cap, cap_t pt_cap) 0, /* read */ 1 /* valid */ ); - // RVTODO: make this a mcahine helper. probably needs a compiler barrier to ensure - // *targetSlot happened before - asm volatile ("sfence.vma"); + sfence(); } BOOT_CODE void @@ -177,7 +176,7 @@ map_it_frame_cap(cap_t vspace_cap, cap_t frame_cap) 1, /* read */ 1 /* valid */ ); - asm volatile ("sfence.vma"); + sfence(); } BOOT_CODE cap_t @@ -464,12 +463,6 @@ static exception_t performASIDPoolInvocation(asid_t asid, asid_pool_t* poolPtr, return EXCEPTION_NONE; } -static void hwASIDFlush(asid_t asid) -{ - // RVTODO: define abstraction operation for this in machine.h - asm volatile ("sfence.vma x0, %0" :: "r" (asid): "memory"); -} - void deleteASID(asid_t asid, pte_t *vspace) { asid_pool_t* poolPtr; @@ -525,7 +518,7 @@ unmapPageTable(asid_t asid, vptr_t vptr, pte_t* target_pt) 0, /* read */ 0 /* valid */ ); - asm volatile ("sfence.vma"); + sfence(); } static pte_t pte_pte_invalid_new(void) @@ -552,8 +545,7 @@ unmapPage(vm_page_size_t page_size, asid_t asid, vptr_t vptr, pptr_t pptr) } lu_ret.ptSlot[0] = pte_pte_invalid_new(); - - asm volatile ("sfence.vma"); + sfence(); } void @@ -1174,7 +1166,7 @@ performPageGetAddress(void *vbase_ptr) static exception_t updatePTE(pte_t pte, pte_t *base) { *base = pte; - asm volatile ("sfence.vma"); + sfence(); return EXCEPTION_NONE; }