提交 fa7d4218 编写于 作者: R Rich Felker

remove mips/n32/64 stat struct hacks from syscall machinery

now that we have a kstat structure decoupled from the public struct
stat, we can just use the broken kernel structures directly and let
the code in fstatat do the translation.
上级 01ae3fc6
struct kstat { struct kstat {
dev_t st_dev; unsigned st_dev;
long __st_padding1[2]; long __st_padding1[3];
ino_t st_ino; ino_t st_ino;
mode_t st_mode; mode_t st_mode;
nlink_t st_nlink; nlink_t st_nlink;
uid_t st_uid; uid_t st_uid;
gid_t st_gid; gid_t st_gid;
dev_t st_rdev; unsigned st_rdev;
long __st_padding2[2]; long __st_padding2[3];
off_t st_size; off_t st_size;
long st_atime_sec; long st_atime_sec;
long st_atime_nsec; long st_atime_nsec;
......
...@@ -5,18 +5,6 @@ ...@@ -5,18 +5,6 @@
#define SYSCALL_RLIM_INFINITY (-1UL/2) #define SYSCALL_RLIM_INFINITY (-1UL/2)
#if _MIPSEL || __MIPSEL || __MIPSEL__
#define __stat_fix(st) ((st),(void)0)
#else
#include <sys/stat.h>
static inline void __stat_fix(long p)
{
struct stat *st = (struct stat *)p;
st->st_dev >>= 32;
st->st_rdev >>= 32;
}
#endif
static inline long __syscall0(long n) static inline long __syscall0(long n)
{ {
register long r7 __asm__("$7"); register long r7 __asm__("$7");
...@@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b) ...@@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b)
"r"(r4), "r"(r5) "r"(r4), "r"(r5)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
return ret;
} }
static inline long __syscall3(long n, long a, long b, long c) static inline long __syscall3(long n, long a, long b, long c)
...@@ -74,10 +59,7 @@ static inline long __syscall3(long n, long a, long b, long c) ...@@ -74,10 +59,7 @@ static inline long __syscall3(long n, long a, long b, long c)
"r"(r4), "r"(r5), "r"(r6) "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
return ret;
} }
static inline long __syscall4(long n, long a, long b, long c, long d) static inline long __syscall4(long n, long a, long b, long c, long d)
...@@ -93,11 +75,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d) ...@@ -93,11 +75,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
"r"(r4), "r"(r5), "r"(r6) "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", : "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
if (n == SYS_fstatat64) __stat_fix(c);
return ret;
} }
static inline long __syscall5(long n, long a, long b, long c, long d, long e) static inline long __syscall5(long n, long a, long b, long c, long d, long e)
...@@ -116,11 +94,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e) ...@@ -116,11 +94,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
: "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$9", "$10", "$11", "$12", "$13", : "$1", "$3", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
if (n == SYS_fstatat64) __stat_fix(c);
return r2;
} }
static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f) static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
...@@ -140,11 +114,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo ...@@ -140,11 +114,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
: "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$10", "$11", "$12", "$13", : "$1", "$3", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
if (n == SYS_fstatat64) __stat_fix(c);
return r2;
} }
static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g) static inline long __syscall7(long n, long a, long b, long c, long d, long e, long f, long g)
...@@ -165,11 +135,7 @@ static inline long __syscall7(long n, long a, long b, long c, long d, long e, lo ...@@ -165,11 +135,7 @@ static inline long __syscall7(long n, long a, long b, long c, long d, long e, lo
: "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6) : "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$11", "$12", "$13", : "$1", "$3", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory"); "$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
if (n == SYS_fstatat64) __stat_fix(c);
return r2;
} }
#define VDSO_USEFUL #define VDSO_USEFUL
......
struct kstat { struct kstat {
dev_t st_dev; unsigned st_dev;
int __pad1[3]; int __pad1[3];
ino_t st_ino; ino_t st_ino;
mode_t st_mode; mode_t st_mode;
nlink_t st_nlink; unsigned st_nlink;
uid_t st_uid; uid_t st_uid;
gid_t st_gid; gid_t st_gid;
dev_t st_rdev; unsigned st_rdev;
unsigned int __pad2[2]; int __pad2[3];
off_t st_size; off_t st_size;
int __pad3; int st_atime_sec;
long st_atime_sec; int st_atime_nsec;
long st_atime_nsec; int st_mtime_sec;
long st_mtime_sec; int st_mtime_nsec;
long st_mtime_nsec; int st_ctime_sec;
long st_ctime_sec; int st_ctime_nsec;
long st_ctime_nsec; unsigned st_blksize;
blksize_t st_blksize; unsigned __pad3;
unsigned int __pad4;
blkcnt_t st_blocks; blkcnt_t st_blocks;
int __pad5[14];
}; };
...@@ -3,49 +3,6 @@ ...@@ -3,49 +3,6 @@
#define SYSCALL_RLIM_INFINITY (-1UL/2) #define SYSCALL_RLIM_INFINITY (-1UL/2)
#include <sys/stat.h>
struct kernel_stat {
unsigned int st_dev;
unsigned int __pad1[3];
unsigned long long st_ino;
unsigned int st_mode;
unsigned int st_nlink;
int st_uid;
int st_gid;
unsigned int st_rdev;
unsigned int __pad2[3];
long long st_size;
unsigned int st_atime_sec;
unsigned int st_atime_nsec;
unsigned int st_mtime_sec;
unsigned int st_mtime_nsec;
unsigned int st_ctime_sec;
unsigned int st_ctime_nsec;
unsigned int st_blksize;
unsigned int __pad3;
unsigned long long st_blocks;
};
static void __stat_fix(struct kernel_stat *kst, struct stat *st)
{
st->st_dev = kst->st_dev;
st->st_ino = kst->st_ino;
st->st_mode = kst->st_mode;
st->st_nlink = kst->st_nlink;
st->st_uid = kst->st_uid;
st->st_gid = kst->st_gid;
st->st_rdev = kst->st_rdev;
st->st_size = kst->st_size;
st->st_atim.tv_sec = kst->st_atime_sec;
st->st_atim.tv_nsec = kst->st_atime_nsec;
st->st_mtim.tv_sec = kst->st_mtime_sec;
st->st_mtim.tv_nsec = kst->st_mtime_nsec;
st->st_ctim.tv_sec = kst->st_ctime_sec;
st->st_ctim.tv_nsec = kst->st_ctime_nsec;
st->st_blksize = kst->st_blksize;
st->st_blocks = kst->st_blocks;
}
#define SYSCALL_CLOBBERLIST \ #define SYSCALL_CLOBBERLIST \
"$1", "$3", "$10", "$11", "$12", "$13", \ "$1", "$3", "$10", "$11", "$12", "$13", \
"$14", "$15", "$24", "$25", "hi", "lo", "memory" "$14", "$15", "$24", "$25", "hi", "lo", "memory"
...@@ -77,95 +34,53 @@ static inline long __syscall1(long n, long a) ...@@ -77,95 +34,53 @@ static inline long __syscall1(long n, long a)
static inline long __syscall2(long n, long a, long b) static inline long __syscall2(long n, long a, long b)
{ {
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a; register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b; register long r5 __asm__("$5") = b;
register long r7 __asm__("$7"); register long r7 __asm__("$7");
register long r2 __asm__("$2") = n; register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
__asm__ __volatile__ ( __asm__ __volatile__ (
"syscall" "syscall"
: "+&r"(r2), "=r"(r7) : "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5) : "r"(r4), "r"(r5)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
return r7 ? -r2 : r2;
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
return ret;
} }
static inline long __syscall3(long n, long a, long b, long c) static inline long __syscall3(long n, long a, long b, long c)
{ {
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a; register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b; register long r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c; register long r6 __asm__("$6") = c;
register long r7 __asm__("$7"); register long r7 __asm__("$7");
register long r2 __asm__("$2") = n; register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
__asm__ __volatile__ ( __asm__ __volatile__ (
"syscall" "syscall"
: "+&r"(r2), "=r"(r7) : "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5), "r"(r6) : "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
return r7 ? -r2 : r2;
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
return ret;
} }
static inline long __syscall4(long n, long a, long b, long c, long d) static inline long __syscall4(long n, long a, long b, long c, long d)
{ {
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a; register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b; register long r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c; register long r6 __asm__("$6") = c;
register long r7 __asm__("$7") = d; register long r7 __asm__("$7") = d;
register long r2 __asm__("$2") = n; register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
if (n == SYS_newfstatat)
r6 = (long) &kst;
__asm__ __volatile__ ( __asm__ __volatile__ (
"syscall" "syscall"
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6) : "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
return r7 ? -r2 : r2;
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
if (n == SYS_newfstatat)
__stat_fix(&kst, (struct stat *)c);
return ret;
} }
static inline long __syscall5(long n, long a, long b, long c, long d, long e) static inline long __syscall5(long n, long a, long b, long c, long d, long e)
{ {
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a; register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b; register long r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c; register long r6 __asm__("$6") = c;
...@@ -173,32 +88,16 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e) ...@@ -173,32 +88,16 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
register long r8 __asm__("$8") = e; register long r8 __asm__("$8") = e;
register long r2 __asm__("$2") = n; register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
if (n == SYS_newfstatat)
r6 = (long) &kst;
__asm__ __volatile__ ( __asm__ __volatile__ (
"syscall" "syscall"
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8) : "r"(r4), "r"(r5), "r"(r6), "r"(r8)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
return r7 ? -r2 : r2;
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
if (n == SYS_newfstatat)
__stat_fix(&kst, (struct stat *)c);
return ret;
} }
static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f) static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
{ {
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a; register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b; register long r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c; register long r6 __asm__("$6") = c;
...@@ -207,26 +106,12 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo ...@@ -207,26 +106,12 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
register long r9 __asm__("$9") = f; register long r9 __asm__("$9") = f;
register long r2 __asm__("$2") = n; register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
if (n == SYS_newfstatat)
r6 = (long) &kst;
__asm__ __volatile__ ( __asm__ __volatile__ (
"syscall" "syscall"
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9) : "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
return r7 ? -r2 : r2;
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
if (n == SYS_newfstatat)
__stat_fix(&kst, (struct stat *)c);
return ret;
} }
#define VDSO_USEFUL #define VDSO_USEFUL
......
struct kstat { struct kstat {
dev_t st_dev; unsigned st_dev;
long __pad1[2]; long __pad1[3];
ino_t st_ino; ino_t st_ino;
mode_t st_mode; mode_t st_mode;
nlink_t st_nlink; nlink_t st_nlink;
uid_t st_uid; uid_t st_uid;
gid_t st_gid; gid_t st_gid;
dev_t st_rdev; unsigned st_rdev;
long __pad2[2]; long __pad2[3];
off_t st_size; off_t st_size;
long st_atime_sec; long st_atime_sec;
long st_atime_nsec; long st_atime_nsec;
......
...@@ -3,18 +3,6 @@ ...@@ -3,18 +3,6 @@
#define SYSCALL_RLIM_INFINITY (-1UL/2) #define SYSCALL_RLIM_INFINITY (-1UL/2)
#if _MIPSEL || __MIPSEL || __MIPSEL__
#define __stat_fix(st) ((st),(void)0)
#else
#include <sys/stat.h>
static inline void __stat_fix(long p)
{
struct stat *st = (struct stat *)p;
st->st_dev >>= 32;
st->st_rdev >>= 32;
}
#endif
#define SYSCALL_CLOBBERLIST \ #define SYSCALL_CLOBBERLIST \
"$1", "$3", "$10", "$11", "$12", "$13", \ "$1", "$3", "$10", "$11", "$12", "$13", \
"$14", "$15", "$24", "$25", "hi", "lo", "memory" "$14", "$15", "$24", "$25", "hi", "lo", "memory"
...@@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b) ...@@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b)
: "+&r"(r2), "=r"(r7) : "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5) : "r"(r4), "r"(r5)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
return ret;
} }
static inline long __syscall3(long n, long a, long b, long c) static inline long __syscall3(long n, long a, long b, long c)
...@@ -73,10 +58,7 @@ static inline long __syscall3(long n, long a, long b, long c) ...@@ -73,10 +58,7 @@ static inline long __syscall3(long n, long a, long b, long c)
: "+&r"(r2), "=r"(r7) : "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5), "r"(r6) : "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
return ret;
} }
static inline long __syscall4(long n, long a, long b, long c, long d) static inline long __syscall4(long n, long a, long b, long c, long d)
...@@ -91,11 +73,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d) ...@@ -91,11 +73,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6) : "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
if (r7) return -r2; return r7 ? -r2 : r2;
long ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
if (n == SYS_newfstatat) __stat_fix(c);
return ret;
} }
static inline long __syscall5(long n, long a, long b, long c, long d, long e) static inline long __syscall5(long n, long a, long b, long c, long d, long e)
...@@ -111,9 +89,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e) ...@@ -111,9 +89,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8) : "r"(r4), "r"(r5), "r"(r6), "r"(r8)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b); return r7 ? -r2 : r2;
if (n == SYS_newfstatat) __stat_fix(c);
return r2;
} }
static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f) static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
...@@ -130,9 +106,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo ...@@ -130,9 +106,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
: "+&r"(r2), "+r"(r7) : "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9) : "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
: SYSCALL_CLOBBERLIST); : SYSCALL_CLOBBERLIST);
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b); return r7 ? -r2 : r2;
if (n == SYS_newfstatat) __stat_fix(c);
return r2;
} }
#define VDSO_USEFUL #define VDSO_USEFUL
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册