[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 071/108] linux-user: Split out fstat64, fstatat64
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v2 071/108] linux-user: Split out fstat64, fstatat64, newfstatat, lstat64, stat64 |
Date: |
Sat, 9 Jun 2018 17:01:43 -1000 |
Comment on the odd overlap of fstatat64 and newfstatat,
especially with respect to nios2.
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall.c | 135 ++++++++++++++++++++++++++++---------------
1 file changed, 89 insertions(+), 46 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index c2dc7131bb..8d6b949b8a 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8140,6 +8140,42 @@ IMPL(fstat)
return ret;
}
+#ifdef TARGET_NR_fstat64
+IMPL(fstat64)
+{
+ struct stat st;
+ abi_long ret;
+
+ ret = get_errno(fstat(arg1, &st));
+ if (!is_error(ret) && host_to_target_stat64(cpu_env, arg2, &st)) {
+ return -TARGET_EFAULT;
+ }
+ return ret;
+}
+#endif
+
+/* Some targets name this syscall newfstatat, with the same arguments. */
+/* ??? Our nios2/syscall_nr.h defines both names; the kernel does not.
+ * Preserve previous behavior and map both syscalls to this function.
+ */
+IMPL(fstatat64)
+{
+ char *p;
+ abi_long ret;
+ struct stat st;
+
+ p = lock_user_string(arg2);
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(fstatat(arg1, path(p), &st, arg4));
+ unlock_user(p, arg2, 0);
+ if (!is_error(ret) && host_to_target_stat64(cpu_env, arg3, &st)) {
+ return -TARGET_EFAULT;
+ }
+ return ret;
+}
+
IMPL(fstatfs)
{
struct statfs stfs;
@@ -8815,6 +8851,25 @@ IMPL(lstat)
}
#endif
+#ifdef TARGET_NR_lstat64
+IMPL(lstat64)
+{
+ char *p = lock_user_string(arg1);
+ struct stat st;
+ abi_long ret;
+
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(lstat(path(p), &st));
+ unlock_user(p, arg1, 0);
+ if (!is_error(ret) && host_to_target_stat64(cpu_env, arg2, &st)) {
+ return -TARGET_EFAULT;
+ }
+ return ret;
+}
+#endif
+
#ifdef TARGET_NR_mkdir
IMPL(mkdir)
{
@@ -10790,6 +10845,25 @@ IMPL(stat)
}
#endif
+#ifdef TARGET_NR_stat64
+IMPL(stat64)
+{
+ char *p = lock_user_string(arg1);
+ struct stat st;
+ abi_long ret;
+
+ if (!p) {
+ return -TARGET_EFAULT;
+ }
+ ret = get_errno(stat(path(p), &st));
+ unlock_user(p, arg1, 0);
+ if (!is_error(ret) && host_to_target_stat64(cpu_env, arg2, &st)) {
+ return -TARGET_EFAULT;
+ }
+ return ret;
+}
+#endif
+
IMPL(statfs)
{
char *p = lock_user_string(arg1);
@@ -11333,55 +11407,9 @@ static abi_long do_syscall1(void *cpu_env, unsigned
num, abi_long arg1,
{
CPUState *cpu __attribute__((unused)) = ENV_GET_CPU(cpu_env);
abi_long ret;
- struct stat st;
void *p;
switch(num) {
-#ifdef TARGET_NR_stat64
- case TARGET_NR_stat64:
- if (!(p = lock_user_string(arg1))) {
- return -TARGET_EFAULT;
- }
- ret = get_errno(stat(path(p), &st));
- unlock_user(p, arg1, 0);
- if (!is_error(ret))
- ret = host_to_target_stat64(cpu_env, arg2, &st);
- return ret;
-#endif
-#ifdef TARGET_NR_lstat64
- case TARGET_NR_lstat64:
- if (!(p = lock_user_string(arg1))) {
- return -TARGET_EFAULT;
- }
- ret = get_errno(lstat(path(p), &st));
- unlock_user(p, arg1, 0);
- if (!is_error(ret))
- ret = host_to_target_stat64(cpu_env, arg2, &st);
- return ret;
-#endif
-#ifdef TARGET_NR_fstat64
- case TARGET_NR_fstat64:
- ret = get_errno(fstat(arg1, &st));
- if (!is_error(ret))
- ret = host_to_target_stat64(cpu_env, arg2, &st);
- return ret;
-#endif
-#if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
-#ifdef TARGET_NR_fstatat64
- case TARGET_NR_fstatat64:
-#endif
-#ifdef TARGET_NR_newfstatat
- case TARGET_NR_newfstatat:
-#endif
- if (!(p = lock_user_string(arg2))) {
- return -TARGET_EFAULT;
- }
- ret = get_errno(fstatat(arg1, path(p), &st, arg4));
- unlock_user(p, arg2, 0);
- if (!is_error(ret))
- ret = host_to_target_stat64(cpu_env, arg3, &st);
- return ret;
-#endif
#ifdef TARGET_NR_lchown
case TARGET_NR_lchown:
if (!(p = lock_user_string(arg1)))
@@ -13041,6 +13069,12 @@ static impl_fn *syscall_table(unsigned num)
SYSCALL(fork);
#endif
SYSCALL(fstat);
+#ifdef TARGET_NR_fstat64
+ SYSCALL(fstat64);
+#endif
+#ifdef TARGET_NR_fstatat64
+ SYSCALL(fstatat64);
+#endif
SYSCALL(fstatfs);
#ifdef TARGET_NR_fstatfs64
SYSCALL(fstatfs64);
@@ -13109,6 +13143,9 @@ static impl_fn *syscall_table(unsigned num)
#ifdef TARGET_NR_lstat
SYSCALL(lstat);
#endif
+#ifdef TARGET_NR_lstat64
+ SYSCALL(lstat64);
+#endif
#ifdef TARGET_NR_mkdir
SYSCALL(mkdir);
#endif
@@ -13151,6 +13188,9 @@ static impl_fn *syscall_table(unsigned num)
SYSCALL(name_to_handle_at);
#endif
SYSCALL(nanosleep);
+#ifdef TARGET_NR_newfstatat
+ SYSCALL_WITH(newfstatat, fstatat64);
+#endif
#ifdef TARGET_NR__newselect
SYSCALL(_newselect);
#endif
@@ -13322,6 +13362,9 @@ static impl_fn *syscall_table(unsigned num)
#endif
#ifdef TARGET_NR_stat
SYSCALL(stat);
+#endif
+#ifdef TARGET_NR_stat64
+ SYSCALL(stat64);
#endif
SYSCALL(statfs);
#ifdef TARGET_NR_statfs64
--
2.17.1
- [Qemu-devel] [PATCH v2 061/108] linux-user: Split out poll, ppoll, (continued)
- [Qemu-devel] [PATCH v2 061/108] linux-user: Split out poll, ppoll, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 062/108] linux-user: Split out flock, preadv, pwritev, readv, writev, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 063/108] linux-user: Split out fdatasync, getsid, _sysctl, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 065/108] linux-user: Split out getcpu, nanosleep, prctl, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 064/108] linux-user: Split out sched syscalls, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 066/108] linux-user: Split out arch_prctl, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 067/108] linux-user: Split out getcwd, pread64, pwrite64, sigaltstack, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 068/108] linux-user: Split out capget, capset, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 070/108] linux-user: Split out ftruncate64, truncate64, ugetrlimit, vfork, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 069/108] linux-user: Split out sendfile, sendfile64, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 071/108] linux-user: Split out fstat64, fstatat64, newfstatat, lstat64, stat64,
Richard Henderson <=
- [Qemu-devel] [PATCH v2 072/108] linux-user: Split out getegid, geteuid, getgid, getuid, lchown, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 073/108] linux-user: Split out getgroups, setgroups, setregid, setreuid, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 075/108] linux-user: Split out chown, getresgid, getresuid, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 074/108] linux-user: Split out fchown, fchownat, setresgid, setresuid, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 076/108] linux-user: Split out setfsgid, setfsuid, setgid, setuid, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 077/108] linux-user: Split out getuid32, getxgid, getxuid, lchown32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 079/108] linux-user: Split out getegid32, geteuid32, getgid32, setregid32, setreuid32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 080/108] linux-user: Split out fchown32, getgroups32, setgroups32, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 078/108] linux-user: Split out osf_getsysinfo, osf_setsysinfo, osf_sigprocmask, Richard Henderson, 2018/06/09
- [Qemu-devel] [PATCH v2 081/108] linux-user: Split out getresgid32, getresuid32, setresgid32, setresuid32, Richard Henderson, 2018/06/09
- Prev by Date:
[Qemu-devel] [PATCH v2 069/108] linux-user: Split out sendfile, sendfile64
- Next by Date:
[Qemu-devel] [PATCH v2 072/108] linux-user: Split out getegid, geteuid, getgid, getuid, lchown
- Previous by thread:
[Qemu-devel] [PATCH v2 069/108] linux-user: Split out sendfile, sendfile64
- Next by thread:
[Qemu-devel] [PATCH v2 072/108] linux-user: Split out getegid, geteuid, getgid, getuid, lchown
- Index(es):