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.
This commit is contained in:
Rich Felker 2019-07-18 19:07:32 -04:00
parent 01ae3fc6d4
commit fa7d4218c7
6 changed files with 36 additions and 213 deletions

View File

@ -1,13 +1,13 @@
struct kstat {
dev_t st_dev;
long __st_padding1[2];
unsigned st_dev;
long __st_padding1[3];
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
long __st_padding2[2];
unsigned st_rdev;
long __st_padding2[3];
off_t st_size;
long st_atime_sec;
long st_atime_nsec;

View File

@ -5,18 +5,6 @@
#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)
{
register long r7 __asm__("$7");
@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b)
"r"(r4), "r"(r5)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
return ret;
return r7 ? -r2 : r2;
}
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)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -r2;
long ret = r2;
if (n == SYS_stat64 || n == SYS_fstat64 || n == SYS_lstat64) __stat_fix(b);
return ret;
return r7 ? -r2 : r2;
}
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)
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -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;
return r7 ? -r2 : r2;
}
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)
: "$1", "$3", "$9", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -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;
return r7 ? -r2 : r2;
}
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
: "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$10", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -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;
return r7 ? -r2 : r2;
}
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
: "ir"(n), "0"(r2), "1"(r7), "r"(r4), "r"(r5), "r"(r6)
: "$1", "$3", "$11", "$12", "$13",
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
if (r7) return -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;
return r7 ? -r2 : r2;
}
#define VDSO_USEFUL

View File

@ -1,23 +1,21 @@
struct kstat {
dev_t st_dev;
unsigned st_dev;
int __pad1[3];
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
unsigned st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
unsigned int __pad2[2];
unsigned st_rdev;
int __pad2[3];
off_t st_size;
int __pad3;
long st_atime_sec;
long st_atime_nsec;
long st_mtime_sec;
long st_mtime_nsec;
long st_ctime_sec;
long st_ctime_nsec;
blksize_t st_blksize;
unsigned int __pad4;
int st_atime_sec;
int st_atime_nsec;
int st_mtime_sec;
int st_mtime_nsec;
int st_ctime_sec;
int st_ctime_nsec;
unsigned st_blksize;
unsigned __pad3;
blkcnt_t st_blocks;
int __pad5[14];
};

View File

@ -3,49 +3,6 @@
#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 \
"$1", "$3", "$10", "$11", "$12", "$13", \
"$14", "$15", "$24", "$25", "hi", "lo", "memory"
@ -77,95 +34,53 @@ static inline long __syscall1(long n, long a)
static inline long __syscall2(long n, long a, long b)
{
struct kernel_stat kst;
long ret;
register long r4 __asm__("$4") = a;
register long r5 __asm__("$5") = b;
register long r7 __asm__("$7");
register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
__asm__ __volatile__ (
"syscall"
: "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5)
: SYSCALL_CLOBBERLIST);
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
return ret;
return r7 ? -r2 : r2;
}
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 r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c;
register long r7 __asm__("$7");
register long r2 __asm__("$2") = n;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
r5 = (long) &kst;
__asm__ __volatile__ (
"syscall"
: "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST);
if (r7) return -r2;
ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
__stat_fix(&kst, (struct stat *)b);
return ret;
return r7 ? -r2 : r2;
}
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 r5 __asm__("$5") = b;
register long r6 __asm__("$6") = c;
register long r7 __asm__("$7") = d;
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__ (
"syscall"
: "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST);
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;
return r7 ? -r2 : r2;
}
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 r5 __asm__("$5") = b;
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)
register long r8 __asm__("$8") = e;
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__ (
"syscall"
: "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8)
: SYSCALL_CLOBBERLIST);
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;
return r7 ? -r2 : r2;
}
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 r5 __asm__("$5") = b;
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
register long r9 __asm__("$9") = f;
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__ (
"syscall"
: "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
: SYSCALL_CLOBBERLIST);
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;
return r7 ? -r2 : r2;
}
#define VDSO_USEFUL

View File

@ -1,13 +1,13 @@
struct kstat {
dev_t st_dev;
long __pad1[2];
unsigned st_dev;
long __pad1[3];
ino_t st_ino;
mode_t st_mode;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
long __pad2[2];
unsigned st_rdev;
long __pad2[3];
off_t st_size;
long st_atime_sec;
long st_atime_nsec;

View File

@ -3,18 +3,6 @@
#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 \
"$1", "$3", "$10", "$11", "$12", "$13", \
"$14", "$15", "$24", "$25", "hi", "lo", "memory"
@ -55,10 +43,7 @@ static inline long __syscall2(long n, long a, long b)
: "+&r"(r2), "=r"(r7)
: "r"(r4), "r"(r5)
: SYSCALL_CLOBBERLIST);
if (r7) return -r2;
long ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
return ret;
return r7 ? -r2 : r2;
}
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"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST);
if (r7) return -r2;
long ret = r2;
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
return ret;
return r7 ? -r2 : r2;
}
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"(r4), "r"(r5), "r"(r6)
: SYSCALL_CLOBBERLIST);
if (r7) return -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;
return r7 ? -r2 : r2;
}
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"(r4), "r"(r5), "r"(r6), "r"(r8)
: SYSCALL_CLOBBERLIST);
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
if (n == SYS_newfstatat) __stat_fix(c);
return r2;
return r7 ? -r2 : r2;
}
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
: "+&r"(r2), "+r"(r7)
: "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
: SYSCALL_CLOBBERLIST);
if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat) __stat_fix(b);
if (n == SYS_newfstatat) __stat_fix(c);
return r2;
return r7 ? -r2 : r2;
}
#define VDSO_USEFUL