lib: Use __builtin_ctzl() in pmp_get()
authorLi Jinpei <leekingp1994@163.com>
Tue, 11 Feb 2020 10:07:24 +0000 (15:37 +0530)
committerAnup Patel <anup@brainfault.org>
Thu, 13 Feb 2020 03:40:57 +0000 (09:10 +0530)
We should should __builtin_ctzl() in pmp_get() instead of
custom ctz() function.

Signed-off-by: Li Jinpei <leekingp1994@163.com>
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
lib/sbi/riscv_asm.c

index 7b612d4..68f5f17 100644 (file)
@@ -184,18 +184,6 @@ void csr_write_num(int csr_num, unsigned long val)
        };
 }
 
-static unsigned long ctz(unsigned long x)
-{
-       unsigned long ret = 0;
-
-       while (!(x & 1UL)) {
-               ret++;
-               x = x >> 1;
-       }
-
-       return ret;
-}
-
 int pmp_set(unsigned int n, unsigned long prot, unsigned long addr,
            unsigned long log2len)
 {
@@ -287,7 +275,7 @@ int pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *addr_out,
                        addr    = 0;
                        log2len = __riscv_xlen;
                } else {
-                       t1      = ctz(~addr);
+                       t1      = __builtin_ctzl(~addr);
                        addr    = (addr & ~((1UL << t1) - 1)) << PMP_SHIFT;
                        log2len = (t1 + PMP_SHIFT + 1);
                }