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

Jiaxun Yang jiaxun.yang at flygoat.com
Sat Aug 13 09:45:04 PDT 2022


There are some MIPS assembly code trying to take advantage of
delay slots. However nowadays MIPS Release 6 removed delay slots
so they become an ordering problem.

Moreover, nowadays assmbler are smart enough to fill delay slots
properly. All those hacks can actually be archived by binutils.

Signed-off-by: Jiaxun Yang <jiaxun.yang at flygoat.com>
---
 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.32.1 (Apple Git-133)



More information about the klibc mailing list