aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Holland <samuel.holland@sifive.com>2023-10-17 15:20:19 -0700
committerAnup Patel <anup@brainfault.org>2023-11-16 09:21:47 +0530
commita140a4e862ce04584dee208424714952609e5b2c (patch)
tree5b7ae258d44251b49fcc9fbb45c95d44f569e5c9
parent3e21b96003526d00a102ad500990014f1daf5136 (diff)
downloadopensbi-a140a4e862ce04584dee208424714952609e5b2c.zip
opensbi-a140a4e862ce04584dee208424714952609e5b2c.tar.gz
opensbi-a140a4e862ce04584dee208424714952609e5b2c.tar.bz2
lib: sbi: Correctly limit flushes to a single ASID/VMID
Per the SBI specification, the effects of these functions are limited to a specific ASID and/or VMID. This applies even when flushing the entire address space. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
-rw-r--r--lib/sbi/sbi_tlb.c21
1 files changed, 3 insertions, 18 deletions
diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c
index ced2854..dad9508 100644
--- a/lib/sbi/sbi_tlb.c
+++ b/lib/sbi/sbi_tlb.c
@@ -111,12 +111,7 @@ void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo)
hgatp = csr_swap(CSR_HGATP,
(vmid << HGATP_VMID_SHIFT) & HGATP_VMID_MASK);
- if (start == 0 && size == 0) {
- __sbi_hfence_vvma_all();
- goto done;
- }
-
- if (size == SBI_TLB_FLUSH_ALL) {
+ if ((start == 0 && size == 0) || (size == SBI_TLB_FLUSH_ALL)) {
__sbi_hfence_vvma_asid(asid);
goto done;
}
@@ -138,12 +133,7 @@ void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo)
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_VMID_RCVD);
- if (start == 0 && size == 0) {
- __sbi_hfence_gvma_all();
- return;
- }
-
- if (size == SBI_TLB_FLUSH_ALL) {
+ if ((start == 0 && size == 0) || (size == SBI_TLB_FLUSH_ALL)) {
__sbi_hfence_gvma_vmid(vmid);
return;
}
@@ -162,13 +152,8 @@ void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo)
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_ASID_RCVD);
- if (start == 0 && size == 0) {
- tlb_flush_all();
- return;
- }
-
/* Flush entire MM context for a given ASID */
- if (size == SBI_TLB_FLUSH_ALL) {
+ if ((start == 0 && size == 0) || (size == SBI_TLB_FLUSH_ALL)) {
__asm__ __volatile__("sfence.vma x0, %0"
:
: "r"(asid)