提交 9a3bbce4 编写于 作者: R Rich Felker

add 7-arg syscall support for mips

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.
上级 5e3c243d
...@@ -3,17 +3,20 @@ ...@@ -3,17 +3,20 @@
.global __syscall .global __syscall
.type __syscall,@function .type __syscall,@function
__syscall: __syscall:
move $25, $4 move $2, $4
move $4, $5 move $4, $5
move $5, $6 move $5, $6
move $6, $7 move $6, $7
lw $7, 16($sp) lw $7, 16($sp)
lw $8, 20($sp) lw $8, 20($sp)
lw $9, 24($sp) lw $9, 24($sp)
lw $10,28($sp)
subu $sp, $sp, 32 subu $sp, $sp, 32
sw $8, 16($sp) sw $8, 16($sp)
sw $9, 20($sp) sw $9, 20($sp)
move $2, $25 sw $10,24($sp)
sw $2 ,28($sp)
lw $2, 28($sp)
syscall syscall
beq $7, $0, 1f beq $7, $0, 1f
addu $sp, $sp, 32 addu $sp, $sp, 32
......
...@@ -14,9 +14,10 @@ long __syscall_cp(long, long, long, long, long, long, long); ...@@ -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 __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 __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 __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_X(a,b,c,d,e,f,g,h,n,...) n
#define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,6,5,4,3,2,1,0) #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_X(a,b) a##b
#define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X(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__) #define __SYSCALL_DISP(b,...) __SYSCALL_CONCAT(b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册