git: 9front

Download patch

ref: dc3328bc5e3c350a73488907443c36b48162a4ea
parent: 39ef41cfe33a424db362e3b3e1942bf1a8f7f2e2
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Feb 22 18:24:54 EST 2023

libc: fix strchr() for little endian mips (thanks adventuresin9)

adventuresin9 wrote:

I finally found the time to get the kernel working for the Mediatek
mt7688.  Just the uart works now, so I still need to do the ethernet
and hopefully wifi and other stuff.  But it boots all the way to the
bootargs ask, and then running !rc lets you run rc in paqfs.

https://github.com/adventuresin9/9front-mt7688

I had a heck of a time getting it to work at first, till I tracked
down an issue in strlen, that comes from the strchr code.  Lots of
stuff broke, and this bug also meant error messages wouldn't print
properly.

running this on the mt7688;
    int n1, n2, n3, n4, n5, n6;
    char *a1, *a2, *a3, *a4, *a5, *a6;

    a1 = "\0";
    a2 = "A";
    a3 = "AA";
    a4 = "AAA";
    a5 = "AAAA";
    a6 = "AAAAA";

    n1 = strlen(a1);
    n2 = strlen(a2);
    n3 = strlen(a3);
    n4 = strlen(a4);
    n5 = strlen(a5);
    n6 = strlen(a6);

    iprint("STRLEN %d %d %d %d %d %d\n", n1, n2, n3, n4, n5, n6);

would get ;
STRLEN 0 1 1 2 1 6

and now it gets;
STRLEN 0 1 2 3 4 5

--- a/sys/src/libc/spim/strchr.s
+++ b/sys/src/libc/spim/strchr.s
@@ -34,12 +34,12 @@
 l4:
 	MOVW	(R3), R5
 	ADDU	$4, R3
-	AND	R6,R5, R1
-	AND	R7,R5, R2
+	AND	$0xff,R5, R1
+	AND	$0xff00,R5, R2
 	BEQ	R1, b0
-	AND	$0xff00,R5, R1
+	AND	R7, R5, R1
 	BEQ	R2, b1
-	AND	$0xff,R5, R2
+	AND	R6, R5, R2
 	BEQ	R1, b2
 	BNE	R2, l4
 
--