Commit 81a1dd10 authored by Björn Töpel's avatar Björn Töpel Committed by Palmer Dabbelt

riscv, lib: Fix Zbb strncmp

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: b6fcdb19 ("RISC-V: add zbb support to string functions")
Suggested-by: default avatarHeiko Stuebner <heiko.stuebner@vrull.eu>
Signed-off-by: default avatarBjörn Töpel <bjorn@rivosinc.com>
Tested-by: default avatarConor Dooley <conor.dooley@microchip.com>
Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230228184211.1585641-1-bjorn@kernel.orgSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 6934cf8a
...@@ -78,11 +78,13 @@ strncmp_zbb: ...@@ -78,11 +78,13 @@ strncmp_zbb:
/* Main loop for aligned string. */ /* Main loop for aligned string. */
.p2align 3 .p2align 3
1: 1:
bgt a0, t6, 3f bge a0, t6, 3f
REG_L t0, 0(a0) REG_L t0, 0(a0)
REG_L t1, 0(a1) REG_L t1, 0(a1)
orc.b t3, t0 orc.b t3, t0
bne t3, t5, 2f bne t3, t5, 2f
orc.b t3, t1
bne t3, t5, 2f
addi a0, a0, SZREG addi a0, a0, SZREG
addi a1, a1, SZREG addi a1, a1, SZREG
beq t0, t1, 1b beq t0, t1, 1b
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment