diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h index 3d52636f..67c39000 100644 --- a/include/sbi/sbi_tlb.h +++ b/include/sbi/sbi_tlb.h @@ -12,6 +12,7 @@ #define __SBI_TLB_H__ #include +#include /* clang-format off */ @@ -38,7 +39,7 @@ struct sbi_tlb_info { unsigned long size; unsigned long asid; unsigned long type; - unsigned long shart_mask; + struct sbi_hartmask smask; }; #define SBI_TLB_INFO_INIT(__ptr, __start, __size, __asid, __type, __src_hart) \ @@ -47,7 +48,7 @@ do { \ (__ptr)->size = (__size); \ (__ptr)->asid = (__asid); \ (__ptr)->type = (__type); \ - (__ptr)->shart_mask = 1UL << (__src_hart); \ + SBI_HARTMASK_INIT_EXCEPT(&(__ptr)->smask, (__src_hart)); \ } while (0) #define SBI_TLB_INFO_SIZE sizeof(struct sbi_tlb_info) diff --git a/lib/sbi/sbi_tlb.c b/lib/sbi/sbi_tlb.c index 21e24365..3cae7eec 100644 --- a/lib/sbi/sbi_tlb.c +++ b/lib/sbi/sbi_tlb.c @@ -190,17 +190,14 @@ static void sbi_tlb_local_flush(struct sbi_tlb_info *tinfo) static void sbi_tlb_entry_process(struct sbi_scratch *scratch, struct sbi_tlb_info *tinfo) { - u32 i; - u64 m; + u32 rhartid; struct sbi_scratch *rscratch = NULL; unsigned long *rtlb_sync = NULL; sbi_tlb_local_flush(tinfo); - for (i = 0, m = tinfo->shart_mask; m; i++, m >>= 1) { - if (!(m & 1UL)) - continue; - rscratch = sbi_hart_id_to_scratch(scratch, i); + sbi_hartmask_for_each_hart(rhartid, &tinfo->smask) { + rscratch = sbi_hart_id_to_scratch(scratch, rhartid); rtlb_sync = sbi_scratch_offset_ptr(rscratch, tlb_sync_off); while (atomic_raw_xchg_ulong(rtlb_sync, 1)) ; } @@ -263,11 +260,11 @@ static inline int __sbi_tlb_range_check(struct sbi_tlb_info *curr, if (next->start <= curr->start && next_end > curr_end) { curr->start = next->start; curr->size = next->size; - curr->shart_mask = curr->shart_mask | next->shart_mask; - ret = SBI_FIFO_UPDATED; + sbi_hartmask_or(&curr->smask, &curr->smask, &next->smask); + ret = SBI_FIFO_UPDATED; } else if (next->start >= curr->start && next_end <= curr_end) { - curr->shart_mask = curr->shart_mask | next->shart_mask; - ret = SBI_FIFO_SKIP; + sbi_hartmask_or(&curr->smask, &curr->smask, &next->smask); + ret = SBI_FIFO_SKIP; } return ret;