| Index: lss/linux_syscall_support.h
|
| ===================================================================
|
| --- lss/linux_syscall_support.h (revision 9)
|
| +++ lss/linux_syscall_support.h (working copy)
|
| @@ -1424,7 +1424,8 @@
|
| #define LSS_RETURN(type, res, err) \
|
| do { \
|
| if (err) { \
|
| - LSS_ERRNO = (res); \
|
| + unsigned long __errnovalue = (res); \
|
| + LSS_ERRNO = __errnovalue; \
|
| res = -1; \
|
| } \
|
| return (type) (res); \
|
| @@ -2213,10 +2214,11 @@
|
| #define LSS_BODY(type,name,r7,...) \
|
| register unsigned long __v0 __asm__("$2") = __NR_##name; \
|
| __asm__ __volatile__ ("syscall\n" \
|
| - : "=&r"(__v0), r7 (__r7) \
|
| + : "+r"(__v0), r7 (__r7) \
|
| : "0"(__v0), ##__VA_ARGS__ \
|
| : "$8", "$9", "$10", "$11", "$12", \
|
| - "$13", "$14", "$15", "$24", "memory"); \
|
| + "$13", "$14", "$15", "$24", "$25", \
|
| + "memory"); \
|
| LSS_RETURN(type, __v0, __r7)
|
| #undef _syscall0
|
| #define _syscall0(type, name) \
|
| @@ -2262,20 +2264,19 @@
|
| type5 arg5) { \
|
| LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \
|
| LSS_REG(7, arg4); \
|
| - register unsigned long __v0 __asm__("$2"); \
|
| + register unsigned long __v0 __asm__("$2") = __NR_##name; \
|
| __asm__ __volatile__ (".set noreorder\n" \
|
| - "lw $2, %6\n" \
|
| "subu $29, 32\n" \
|
| - "sw $2, 16($29)\n" \
|
| - "li $2, %2\n" \
|
| + "sw %5, 16($29)\n" \
|
| "syscall\n" \
|
| "addiu $29, 32\n" \
|
| ".set reorder\n" \
|
| - : "=&r"(__v0), "+r" (__r7) \
|
| - : "i" (__NR_##name), "r"(__r4), "r"(__r5), \
|
| - "r"(__r6), "m" ((unsigned long)arg5) \
|
| + : "+r"(__v0), "+r" (__r7) \
|
| + : "r"(__r4), "r"(__r5), \
|
| + "r"(__r6), "r" ((unsigned long)arg5) \
|
| : "$8", "$9", "$10", "$11", "$12", \
|
| - "$13", "$14", "$15", "$24", "memory"); \
|
| + "$13", "$14", "$15", "$24", "$25", \
|
| + "memory"); \
|
| LSS_RETURN(type, __v0, __r7); \
|
| }
|
| #else
|
| @@ -2300,23 +2301,21 @@
|
| type5 arg5, type6 arg6) { \
|
| LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \
|
| LSS_REG(7, arg4); \
|
| - register unsigned long __v0 __asm__("$2"); \
|
| + register unsigned long __v0 __asm__("$2") = __NR_##name; \
|
| __asm__ __volatile__ (".set noreorder\n" \
|
| - "lw $2, %6\n" \
|
| - "lw $8, %7\n" \
|
| "subu $29, 32\n" \
|
| - "sw $2, 16($29)\n" \
|
| - "sw $8, 20($29)\n" \
|
| - "li $2, %2\n" \
|
| + "sw %5, 16($29)\n" \
|
| + "sw %6, 20($29)\n" \
|
| "syscall\n" \
|
| "addiu $29, 32\n" \
|
| ".set reorder\n" \
|
| - : "=&r"(__v0), "+r" (__r7) \
|
| - : "i" (__NR_##name), "r"(__r4), "r"(__r5), \
|
| + : "+r"(__v0), "+r" (__r7) \
|
| + : "r"(__r4), "r"(__r5), \
|
| "r"(__r6), "r" ((unsigned long)arg5), \
|
| "r" ((unsigned long)arg6) \
|
| : "$8", "$9", "$10", "$11", "$12", \
|
| - "$13", "$14", "$15", "$24", "memory"); \
|
| + "$13", "$14", "$15", "$24", "$25", \
|
| + "memory"); \
|
| LSS_RETURN(type, __v0, __r7); \
|
| }
|
| #else
|
| @@ -2416,12 +2415,12 @@
|
| #else
|
| "daddu $29,16\n"
|
| #endif
|
| - : "=&r" (__v0), "=r" (__r7)
|
| + : "=&r" (__v0), "+r" (__r7)
|
| : "i"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit),
|
| "r"(fn), "r"(__stack), "r"(__flags), "r"(arg),
|
| "r"(__ptid), "r"(__r7), "r"(__ctid)
|
| : "$9", "$10", "$11", "$12", "$13", "$14", "$15",
|
| - "$24", "memory");
|
| + "$24", "$25", "memory");
|
| }
|
| LSS_RETURN(int, __v0, __r7);
|
| }
|
| @@ -3339,12 +3338,13 @@
|
| register unsigned long __v1 __asm__("$3");
|
| register unsigned long __r7 __asm__("$7");
|
| __asm__ __volatile__ ("syscall\n"
|
| - : "=&r"(__v0), "=&r"(__v1), "+r" (__r7)
|
| + : "+r"(__v0), "=r"(__v1), "=r" (__r7)
|
| : "0"(__v0)
|
| : "$8", "$9", "$10", "$11", "$12",
|
| - "$13", "$14", "$15", "$24", "memory");
|
| + "$13", "$14", "$15", "$24", "$25", "memory");
|
| if (__r7) {
|
| - LSS_ERRNO = __v0;
|
| + unsigned long __errnovalue = __v0;
|
| + LSS_ERRNO = __errnovalue;
|
| return -1;
|
| } else {
|
| p[0] = __v0;
|
|
|