Skip to content

Commit e49d914

Browse files
committed
target/loongarch: Add tlb search callback in loongarch_tlb_search()
With function loongarch_tlb_search(), it is to search TLB entry with speficied virtual address, the difference is selection with asid and global bit. Here add selection callback with asid and global bit. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
1 parent 27a26b4 commit e49d914

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

target/loongarch/tcg/tlb_helper.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
#include "cpu-csr.h"
2222
#include "tcg/tcg_loongarch.h"
2323

24+
typedef bool (*tlb_match)(bool global, int asid, int tlb_asid);
25+
26+
static bool tlb_match_any(bool global, int asid, int tlb_asid)
27+
{
28+
return global || tlb_asid == asid;
29+
}
30+
2431
bool check_ps(CPULoongArchState *env, uint8_t tlb_ps)
2532
{
2633
if (tlb_ps >= 64) {
@@ -201,12 +208,15 @@ static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
201208
{
202209
LoongArchTLB *tlb;
203210
uint16_t csr_asid, tlb_asid, stlb_idx;
204-
uint8_t tlb_e, tlb_ps, tlb_g, stlb_ps;
211+
uint8_t tlb_e, tlb_ps, stlb_ps;
212+
bool tlb_g;
205213
int i, compare_shift;
206214
uint64_t vpn, tlb_vppn;
215+
tlb_match func;
207216

217+
func = tlb_match_any;
208218
csr_asid = FIELD_EX64(env->CSR_ASID, CSR_ASID, ASID);
209-
stlb_ps = FIELD_EX64(env->CSR_STLBPS, CSR_STLBPS, PS);
219+
stlb_ps = FIELD_EX64(env->CSR_STLBPS, CSR_STLBPS, PS);
210220
vpn = (vaddr & TARGET_VIRT_MASK) >> (stlb_ps + 1);
211221
stlb_idx = vpn & 0xff; /* VA[25:15] <==> TLBIDX.index for 16KiB Page */
212222
compare_shift = stlb_ps + 1 - R_TLB_MISC_VPPN_SHIFT;
@@ -218,9 +228,9 @@ static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
218228
if (tlb_e) {
219229
tlb_vppn = FIELD_EX64(tlb->tlb_misc, TLB_MISC, VPPN);
220230
tlb_asid = FIELD_EX64(tlb->tlb_misc, TLB_MISC, ASID);
221-
tlb_g = FIELD_EX64(tlb->tlb_entry0, TLBENTRY, G);
231+
tlb_g = !!FIELD_EX64(tlb->tlb_entry0, TLBENTRY, G);
222232

223-
if ((tlb_g == 1 || tlb_asid == csr_asid) &&
233+
if (func(tlb_g, csr_asid, tlb_asid) &&
224234
(vpn == (tlb_vppn >> compare_shift))) {
225235
*index = i * 256 + stlb_idx;
226236
return true;
@@ -239,7 +249,7 @@ static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
239249
tlb_g = FIELD_EX64(tlb->tlb_entry0, TLBENTRY, G);
240250
compare_shift = tlb_ps + 1 - R_TLB_MISC_VPPN_SHIFT;
241251
vpn = (vaddr & TARGET_VIRT_MASK) >> (tlb_ps + 1);
242-
if ((tlb_g == 1 || tlb_asid == csr_asid) &&
252+
if (func(tlb_g, csr_asid, tlb_asid) &&
243253
(vpn == (tlb_vppn >> compare_shift))) {
244254
*index = i;
245255
return true;

0 commit comments

Comments
 (0)