From 8d5ef431dfda1358820aeef4e8c6df19d9b17651 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 18 Nov 2025 17:31:52 -0800 Subject: [PATCH 1/2] Expose tlb_flush_all function --- include/sbi/sbi_tlb.h | 2 ++ lib/sbi/sbi_tlb.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h index 2c50fe853e2..9c004a4b9d3 100644 --- a/include/sbi/sbi_tlb.h +++ b/include/sbi/sbi_tlb.h @@ -58,4 +58,6 @@ int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo); int sbi_tlb_init(struct sbi_scratch *scratch, bool cold_boot); +void __tlb_flush_all(void); + #endif diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c index 01b31f4e76d..fd1ce7d0147 100644 --- a/lib/sbi/sbi_tlb.c +++ b/lib/sbi/sbi_tlb.c @@ -29,7 +29,7 @@ static unsigned long tlb_fifo_off; static unsigned long tlb_fifo_mem_off; static unsigned long tlb_range_flush_limit; -static void tlb_flush_all(void) +void __tlb_flush_all(void) { __asm__ __volatile("sfence.vma"); } @@ -86,7 +86,7 @@ static void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo) sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_RCVD); if ((start == 0 && size == 0) || (size == SBI_TLB_FLUSH_ALL)) { - tlb_flush_all(); + __tlb_flush_all(); return; } From 799e51cd81c780800d526a60e087e47915a87360 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 18 Nov 2025 17:35:09 -0800 Subject: [PATCH 2/2] Flush TLBs on ADUE change --- lib/sbi/sbi_fwft.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/sbi/sbi_fwft.c b/lib/sbi/sbi_fwft.c index a2aefb9a631..f1a6def372f 100644 --- a/lib/sbi/sbi_fwft.c +++ b/lib/sbi/sbi_fwft.c @@ -13,8 +13,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -167,7 +169,16 @@ static int fwft_adue_supported(struct fwft_config *conf) static int fwft_set_adue(struct fwft_config *conf, unsigned long value) { - return fwft_menvcfg_set_bit(value, ENVCFG_ADUE_SHIFT); + int res = fwft_menvcfg_set_bit(value, ENVCFG_ADUE_SHIFT); + + if (res == SBI_OK) { + __asm__ __volatile__("sfence.vma"); + + if (misa_extension('H')) + __sbi_hfence_gvma_all(); + } + + return res; } static int fwft_get_adue(struct fwft_config *conf, unsigned long *value)