add 7-arg syscall support for mips
authorRich Felker <dalias@aerifal.cx>
Sun, 9 Sep 2012 18:53:06 +0000 (14:53 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 9 Sep 2012 18:53:06 +0000 (14:53 -0400)
no syscalls actually use that many arguments; the issue is that some
syscalls with 64-bit arguments have them ordered badly so that
breaking them into aligned 32-bit half-arguments wastes slots with
padding, and a 7th slot is needed for the last argument.

src/internal/mips/syscall.s
src/internal/syscall.h

index 285754087872ed1325cbee01b17c000adc22aa60..e18a382e24225b673693268f01f3bbc8786fff3d 100644 (file)
@@ -3,17 +3,20 @@
 .global __syscall
 .type   __syscall,@function
 __syscall:
-       move    $25, $4
+       move    $2, $4
        move    $4, $5
        move    $5, $6
        move    $6, $7
        lw      $7, 16($sp)
        lw      $8, 20($sp)
        lw      $9, 24($sp)
+       lw      $10,28($sp)
        subu    $sp, $sp, 32
        sw      $8, 16($sp)
        sw      $9, 20($sp)
-       move    $2, $25
+       sw      $10,24($sp)
+       sw      $2 ,28($sp)
+       lw      $2, 28($sp)
        syscall
        beq     $7, $0, 1f
        addu    $sp, $sp, 32
index ffaf640ae081ca8650ad8960b23f16ab08453f3c..50409ef8168db07e6ef458fefb0ec2b553797bbc 100644 (file)
@@ -14,9 +14,10 @@ long __syscall_cp(long, long, long, long, long, long, long);
 #define __syscall4(n,a,b,c,d) __syscall4(n,(long)(a),(long)(b),(long)(c),(long)(d))
 #define __syscall5(n,a,b,c,d,e) __syscall5(n,(long)(a),(long)(b),(long)(c),(long)(d),(long)(e))
 #define __syscall6(n,a,b,c,d,e,f) __syscall6(n,(long)(a),(long)(b),(long)(c),(long)(d),(long)(e),(long)(f))
+#define __syscall7(n,a,b,c,d,e,f,g) (__syscall)(n,(long)(a),(long)(b),(long)(c),(long)(d),(long)(e),(long)(f),(long)g)
 
-#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
-#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,6,5,4,3,2,1,0)
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n
+#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,7,6,5,4,3,2,1,0)
 #define __SYSCALL_CONCAT_X(a,b) a##b
 #define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X(a,b)
 #define __SYSCALL_DISP(b,...) __SYSCALL_CONCAT(b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)