[klibc] [PATCH v2] mips/mips64: Get rid of delay slot hacks

Jiaxun Yang jiaxun.yang at flygoat.com
Fri Nov 11 12:01:37 PST 2022


There are some MIPS assembly code trying to take advantage of
delay slots.

However in MIPS Release 6, assembler (LLVM) will try to relax
traditional branch to compat branch, and having noreroder code
will block assembler from doing so.

Moreover, nowadays assemblers are smart enough to fill delay slots
properly. Most of those hacks can actually be archived by assemblers.

Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
---
v2: Rewording commit message to avoid confusion
Sorry about lose track of this matter before.
---
 usr/klibc/arch/mips/syscall.S    | 4 ----
 usr/klibc/arch/mips/sysstub.ph   | 4 +---
 usr/klibc/arch/mips/vfork.S      | 3 +--
 usr/klibc/arch/mips64/sysstub.ph | 4 +---
 4 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/usr/klibc/arch/mips/syscall.S b/usr/klibc/arch/mips/syscall.S
index cca0db22..a5cc73de 100644
--- a/usr/klibc/arch/mips/syscall.S
+++ b/usr/klibc/arch/mips/syscall.S
@@ -1,14 +1,10 @@
 #include <machine/asm.h>
 #include <asm/unistd.h>
 
-	.set noreorder
 
 LEAF(__syscall_common)
 	syscall
         beqz    a3, 1f
-	# sw is actually two instructions; the first one goes
-	# in the branch delay slot
-	# XXX: Break this up manually; as it is now it generates warnings.
         sw      v0, errno
         li      v0, -1
 1:      jr      ra
diff --git a/usr/klibc/arch/mips/sysstub.ph b/usr/klibc/arch/mips/sysstub.ph
index 36895291..a3475b70 100644
--- a/usr/klibc/arch/mips/sysstub.ph
+++ b/usr/klibc/arch/mips/sysstub.ph
@@ -17,11 +17,9 @@ sub make_sysstub($$$$$@) {
     print OUT "#include <machine/asm.h>\n";
     print OUT "#include <asm/unistd.h>\n";
     print OUT "\n";
-    print OUT "\t.set noreorder\n";
-    print OUT "\n";
     print OUT "LEAF(${fname})\n";
-    print OUT "\tj\t__syscall_${stype}\n";
     print OUT "\t  li\tv0, __NR_${sname}\n";
+    print OUT "\tj\t__syscall_${stype}\n";
     print OUT "\tEND(${fname})\n";
     close(OUT);
 }
diff --git a/usr/klibc/arch/mips/vfork.S b/usr/klibc/arch/mips/vfork.S
index 9aa955ae..ae36d5fd 100644
--- a/usr/klibc/arch/mips/vfork.S
+++ b/usr/klibc/arch/mips/vfork.S
@@ -5,11 +5,10 @@
 #define CLONE_VFORK	0x00004000
 #define SIGCHLD		18
 
-	.set noreorder
 
 LEAF(vfork)
 	li	a0, CLONE_VFORK | CLONE_VM | SIGCHLD
 	li	a1, 0
+	li	v0, __NR_clone
 	j	__syscall_common
-	  li	v0, __NR_clone
 	END(vfork)
diff --git a/usr/klibc/arch/mips64/sysstub.ph b/usr/klibc/arch/mips64/sysstub.ph
index e8a02009..57af657f 100644
--- a/usr/klibc/arch/mips64/sysstub.ph
+++ b/usr/klibc/arch/mips64/sysstub.ph
@@ -17,11 +17,9 @@ sub make_sysstub($$$$$@) {
     print OUT "#include <machine/asm.h>\n";
     print OUT "#include <asm/unistd.h>\n";
     print OUT "\n";
-    print OUT "\t.set noreorder\n";
-    print OUT "\n";
     print OUT "LEAF(${fname})\n";
-    print OUT "\tj\t__syscall_${stype}\n";
     print OUT "\t  li\tv0, __NR_${sname}\n";
+    print OUT "\tj\t__syscall_${stype}\n";
     print OUT "\tEND(${fname})\n";
     close(OUT);
 }
-- 
2.34.1



More information about the klibc mailing list