mirror of https://git.musl-libc.org/git/musl
Browse Source
mips n32 has 32-bit long, and generally uses long syscall arguments
and return values, but provides only SYS_lseek, not SYS_llseek. we
have some framework (syscall_arg_t, added for x32) to make syscall
arguments 64-bit in such a setting, but it's not clear whether this
could match the sign-extension semantics needed for 32-bit args to all
the other syscalls, and we don't have any existing mechanism to allow
the return value of syscalls to be something other than long.
instead, just provide a custom mipsn32 version of the lseek function
doing its own syscall asm with 64-bit arguments. as a result of commit
03919b26ed, stdio will also get the new
code, fixing fseeko/ftello too.
master
1 changed files with 20 additions and 0 deletions
@ -0,0 +1,20 @@ |
|||||
|
#include <unistd.h> |
||||
|
#include "syscall.h" |
||||
|
|
||||
|
off_t __lseek(int fd, off_t offset, int whence) |
||||
|
{ |
||||
|
register long long r4 __asm__("$4") = fd; |
||||
|
register long long r5 __asm__("$5") = offset; |
||||
|
register long long r6 __asm__("$6") = whence; |
||||
|
register long long r7 __asm__("$7"); |
||||
|
register long long r2 __asm__("$2") = SYS_lseek; |
||||
|
__asm__ __volatile__ ( |
||||
|
"syscall" |
||||
|
: "+&r"(r2), "=r"(r7) |
||||
|
: "r"(r4), "r"(r5), "r"(r6) |
||||
|
: SYSCALL_CLOBBERLIST); |
||||
|
return r7 ? __syscall_ret(-r2) : r2; |
||||
|
} |
||||
|
|
||||
|
weak_alias(__lseek, lseek); |
||||
|
weak_alias(__lseek, lseek64); |
||||
Loading…
Reference in new issue