[PATCH] riscv, lib: Fix Zbb strncmp

Guenter Roeck linux at roeck-us.net
Tue Feb 28 13:18:12 PST 2023


On 2/28/23 10:42, Björn Töpel wrote:
> From: Björn Töpel <bjorn at rivosinc.com>
> 
> The Zbb optimized strncmp has two parts; a fast path that does XLEN/8B
> per iteration, and a slow that does one byte per iteration.
> 
> The idea is to compare aligned XLEN chunks for most of strings, and do
> the remainder tail in the slow path.
> 
> The Zbb strncmp has two issues in the fast path:
> 
> Incorrect remainder handling (wrong compare): Assume that the string
> length is 9. On 64b systems, the fast path should do one iteration,
> and one iteration in the slow path. Instead, both were done in the
> fast path, which lead to incorrect results. An example:
> 
>    strncmp("/dev/vda", "/dev/", 5);
> 
> Correct by changing "bgt" to "bge".
> 
> Missing NULL checks in the second string: This could lead to incorrect
> results for:
> 
>    strncmp("/dev/vda", "/dev/vda\0", 8);
> 
> Correct by adding an additional check.
> 
> Fixes: b6fcdb191e36 ("RISC-V: add zbb support to string functions")
> Suggested-by: Heiko Stuebner <heiko.stuebner at vrull.eu>
> Signed-off-by: Björn Töpel <bjorn at rivosinc.com>

Tested-by: Guenter Roeck <linux at roeck-us.net>

> ---
>   arch/riscv/lib/strncmp.S | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/riscv/lib/strncmp.S b/arch/riscv/lib/strncmp.S
> index ee49595075be..efd3f3150a54 100644
> --- a/arch/riscv/lib/strncmp.S
> +++ b/arch/riscv/lib/strncmp.S
> @@ -78,11 +78,13 @@ strncmp_zbb:
>   	/* Main loop for aligned string.  */
>   	.p2align 3
>   1:
> -	bgt	a0, t6, 3f
> +	bge	a0, t6, 3f
>   	REG_L	t0, 0(a0)
>   	REG_L	t1, 0(a1)
>   	orc.b	t3, t0
>   	bne	t3, t5, 2f
> +	orc.b	t3, t1
> +	bne	t3, t5, 2f
>   	addi	a0, a0, SZREG
>   	addi	a1, a1, SZREG
>   	beq	t0, t1, 1b
> 
> base-commit: eb9be8310c58c166f9fae3b71c0ad9d6741b4897




More information about the linux-riscv mailing list