riscv: fix sbi_remote_sfence_vma{,_asid}.
Currently sbi_remote_sfence_vma{,_asid} does not pass their arguments to SBI at all, which is semantically incorrect. Neither BBL nor OpenSBI is using these arguments at the moment, and they just do a global flush instead. However we still need to provide correct arguments. Signed-off-by: Gary Guo <gary@garyguo.net> Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
This commit is contained in:
parent
f6635f873a
commit
a21344dfc6
@ -26,22 +26,27 @@
|
|||||||
#define SBI_REMOTE_SFENCE_VMA_ASID 7
|
#define SBI_REMOTE_SFENCE_VMA_ASID 7
|
||||||
#define SBI_SHUTDOWN 8
|
#define SBI_SHUTDOWN 8
|
||||||
|
|
||||||
#define SBI_CALL(which, arg0, arg1, arg2) ({ \
|
#define SBI_CALL(which, arg0, arg1, arg2, arg3) ({ \
|
||||||
register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); \
|
register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0); \
|
||||||
register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); \
|
register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1); \
|
||||||
register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2); \
|
register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2); \
|
||||||
|
register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3); \
|
||||||
register uintptr_t a7 asm ("a7") = (uintptr_t)(which); \
|
register uintptr_t a7 asm ("a7") = (uintptr_t)(which); \
|
||||||
asm volatile ("ecall" \
|
asm volatile ("ecall" \
|
||||||
: "+r" (a0) \
|
: "+r" (a0) \
|
||||||
: "r" (a1), "r" (a2), "r" (a7) \
|
: "r" (a1), "r" (a2), "r" (a3), "r" (a7) \
|
||||||
: "memory"); \
|
: "memory"); \
|
||||||
a0; \
|
a0; \
|
||||||
})
|
})
|
||||||
|
|
||||||
/* Lazy implementations until SBI is finalized */
|
/* Lazy implementations until SBI is finalized */
|
||||||
#define SBI_CALL_0(which) SBI_CALL(which, 0, 0, 0)
|
#define SBI_CALL_0(which) SBI_CALL(which, 0, 0, 0, 0)
|
||||||
#define SBI_CALL_1(which, arg0) SBI_CALL(which, arg0, 0, 0)
|
#define SBI_CALL_1(which, arg0) SBI_CALL(which, arg0, 0, 0, 0)
|
||||||
#define SBI_CALL_2(which, arg0, arg1) SBI_CALL(which, arg0, arg1, 0)
|
#define SBI_CALL_2(which, arg0, arg1) SBI_CALL(which, arg0, arg1, 0, 0)
|
||||||
|
#define SBI_CALL_3(which, arg0, arg1, arg2) \
|
||||||
|
SBI_CALL(which, arg0, arg1, arg2, 0)
|
||||||
|
#define SBI_CALL_4(which, arg0, arg1, arg2, arg3) \
|
||||||
|
SBI_CALL(which, arg0, arg1, arg2, arg3)
|
||||||
|
|
||||||
static inline void sbi_console_putchar(int ch)
|
static inline void sbi_console_putchar(int ch)
|
||||||
{
|
{
|
||||||
@ -86,7 +91,7 @@ static inline void sbi_remote_sfence_vma(const unsigned long *hart_mask,
|
|||||||
unsigned long start,
|
unsigned long start,
|
||||||
unsigned long size)
|
unsigned long size)
|
||||||
{
|
{
|
||||||
SBI_CALL_1(SBI_REMOTE_SFENCE_VMA, hart_mask);
|
SBI_CALL_3(SBI_REMOTE_SFENCE_VMA, hart_mask, start, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
|
static inline void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
|
||||||
@ -94,7 +99,7 @@ static inline void sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
|
|||||||
unsigned long size,
|
unsigned long size,
|
||||||
unsigned long asid)
|
unsigned long asid)
|
||||||
{
|
{
|
||||||
SBI_CALL_1(SBI_REMOTE_SFENCE_VMA_ASID, hart_mask);
|
SBI_CALL_4(SBI_REMOTE_SFENCE_VMA_ASID, hart_mask, start, size, asid);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user