riscv: move machine functions to machine.h

And add memory barriers while we are at it.
This commit is contained in:
Anna Lyons
2018-04-10 11:58:11 +10:00
parent 497e04ac06
commit 308e8bf4d2
2 changed files with 17 additions and 15 deletions

View File

@@ -28,13 +28,23 @@
#include <arch/model/smp.h>
#include <arch/sbi.h>
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)
{

View File

@@ -33,6 +33,7 @@
#include <arch/kernel/vspace.h>
#include <linker.h>
#include <plat/machine/devices.h>
#include <arch/machine.h>
#include <plat/machine/hardware.h>
#include <kernel/stack.h>
@@ -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;
}