[PATCH v4 08/13] target/loongarch: Change return value type with loongarch_tlb_search_cb()

Bibo Mao posted 13 patches 5 months, 1 week ago
Maintainers: Song Gao <gaosong@loongson.cn>
[PATCH v4 08/13] target/loongarch: Change return value type with loongarch_tlb_search_cb()
Posted by Bibo Mao 5 months, 1 week ago
With function loongarch_tlb_search_cb(), change return value type from
bool type to pointer LoongArchTLB *, the pointer type can be use directly
in future.

Signed-off-by: Bibo Mao <maobibo@loongson.cn>
---
 target/loongarch/tcg/tlb_helper.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/target/loongarch/tcg/tlb_helper.c b/target/loongarch/tcg/tlb_helper.c
index 5b78146769..c7f30eaf15 100644
--- a/target/loongarch/tcg/tlb_helper.c
+++ b/target/loongarch/tcg/tlb_helper.c
@@ -203,8 +203,9 @@ static uint32_t get_random_tlb(uint32_t low, uint32_t high)
  * field in tlb entry contains bit[47:13], so need adjust.
  * virt_vpn = vaddr[47:13]
  */
-static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
-                                    int *index, int csr_asid, tlb_match func)
+static LoongArchTLB *loongarch_tlb_search_cb(CPULoongArchState *env,
+                                             vaddr vaddr, int csr_asid,
+                                             tlb_match func)
 {
     LoongArchTLB *tlb;
     uint16_t tlb_asid, stlb_idx;
@@ -229,8 +230,7 @@ static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
 
             if (func(tlb_g, csr_asid, tlb_asid) &&
                 (vpn == (tlb_vppn >> compare_shift))) {
-                *index = i * 256 + stlb_idx;
-                return true;
+                return tlb;
             }
         }
     }
@@ -248,12 +248,11 @@ static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
             vpn = (vaddr & TARGET_VIRT_MASK) >> (tlb_ps + 1);
             if (func(tlb_g, csr_asid, tlb_asid) &&
                 (vpn == (tlb_vppn >> compare_shift))) {
-                *index = i;
-                return true;
+                return tlb;
             }
         }
     }
-    return false;
+    return NULL;
 }
 
 static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
@@ -261,10 +260,17 @@ static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
 {
     int csr_asid;
     tlb_match func;
+    LoongArchTLB *tlb;
 
     func = tlb_match_any;
     csr_asid = FIELD_EX64(env->CSR_ASID, CSR_ASID, ASID);
-    return loongarch_tlb_search_cb(env, vaddr, index, csr_asid, func);
+    tlb = loongarch_tlb_search_cb(env, vaddr, csr_asid, func);
+    if (tlb) {
+        *index = tlb - env->tlb;
+        return true;
+    }
+
+    return false;
 }
 
 void helper_tlbsrch(CPULoongArchState *env)
-- 
2.39.3
Re: [PATCH v4 08/13] target/loongarch: Change return value type with loongarch_tlb_search_cb()
Posted by gaosong 4 months, 2 weeks ago
在 2025/9/6 下午3:04, Bibo Mao 写道:
> With function loongarch_tlb_search_cb(), change return value type from
> bool type to pointer LoongArchTLB *, the pointer type can be use directly
> in future.
>
> Signed-off-by: Bibo Mao <maobibo@loongson.cn>
> ---
>   target/loongarch/tcg/tlb_helper.c | 22 ++++++++++++++--------
>   1 file changed, 14 insertions(+), 8 deletions(-)
Reviewed-by: Song Gao <gaosong@loongson.cn>

Thanks.
Song Gao
> diff --git a/target/loongarch/tcg/tlb_helper.c b/target/loongarch/tcg/tlb_helper.c
> index 5b78146769..c7f30eaf15 100644
> --- a/target/loongarch/tcg/tlb_helper.c
> +++ b/target/loongarch/tcg/tlb_helper.c
> @@ -203,8 +203,9 @@ static uint32_t get_random_tlb(uint32_t low, uint32_t high)
>    * field in tlb entry contains bit[47:13], so need adjust.
>    * virt_vpn = vaddr[47:13]
>    */
> -static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
> -                                    int *index, int csr_asid, tlb_match func)
> +static LoongArchTLB *loongarch_tlb_search_cb(CPULoongArchState *env,
> +                                             vaddr vaddr, int csr_asid,
> +                                             tlb_match func)
>   {
>       LoongArchTLB *tlb;
>       uint16_t tlb_asid, stlb_idx;
> @@ -229,8 +230,7 @@ static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
>   
>               if (func(tlb_g, csr_asid, tlb_asid) &&
>                   (vpn == (tlb_vppn >> compare_shift))) {
> -                *index = i * 256 + stlb_idx;
> -                return true;
> +                return tlb;
>               }
>           }
>       }
> @@ -248,12 +248,11 @@ static bool loongarch_tlb_search_cb(CPULoongArchState *env, vaddr vaddr,
>               vpn = (vaddr & TARGET_VIRT_MASK) >> (tlb_ps + 1);
>               if (func(tlb_g, csr_asid, tlb_asid) &&
>                   (vpn == (tlb_vppn >> compare_shift))) {
> -                *index = i;
> -                return true;
> +                return tlb;
>               }
>           }
>       }
> -    return false;
> +    return NULL;
>   }
>   
>   static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
> @@ -261,10 +260,17 @@ static bool loongarch_tlb_search(CPULoongArchState *env, vaddr vaddr,
>   {
>       int csr_asid;
>       tlb_match func;
> +    LoongArchTLB *tlb;
>   
>       func = tlb_match_any;
>       csr_asid = FIELD_EX64(env->CSR_ASID, CSR_ASID, ASID);
> -    return loongarch_tlb_search_cb(env, vaddr, index, csr_asid, func);
> +    tlb = loongarch_tlb_search_cb(env, vaddr, csr_asid, func);
> +    if (tlb) {
> +        *index = tlb - env->tlb;
> +        return true;
> +    }
> +
> +    return false;
>   }
>   
>   void helper_tlbsrch(CPULoongArchState *env)