summaryrefslogtreecommitdiffstats
path: root/linux-user/syscall.c
diff options
context:
space:
mode:
authorPeter Maydell2020-03-26 21:55:54 +0100
committerPeter Maydell2020-03-26 21:55:54 +0100
commitcfe68ae025f704f336d7dd3d1903ce37b445831d (patch)
tree5b5e3e9b9d303ad71bc4913691786da17b15aa91 /linux-user/syscall.c
parentMerge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2020-03-26' in... (diff)
parentlinux-user: Flush out implementation of gettimeofday (diff)
downloadqemu-cfe68ae025f704f336d7dd3d1903ce37b445831d.tar.gz
qemu-cfe68ae025f704f336d7dd3d1903ce37b445831d.tar.xz
qemu-cfe68ae025f704f336d7dd3d1903ce37b445831d.zip
Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-5.0-pull-request' into staging
Emulate x86_64 vsyscalls Fix syscall_nr.h cleanup # gpg: Signature made Thu 26 Mar 2020 07:23:16 GMT # gpg: using RSA key CD2F75DDC8E3A4DC2E4F5173F30C38BD3F2FBE3C # gpg: issuer "laurent@vivier.eu" # gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>" [full] # gpg: aka "Laurent Vivier <laurent@vivier.eu>" [full] # gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>" [full] # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier2/tags/linux-user-for-5.0-pull-request: linux-user: Flush out implementation of gettimeofday linux-user: Add x86_64 vsyscall page to /proc/self/maps linux-user/i386: Emulate x86_64 vsyscalls linux-user/i386: Split out gen_signal target/i386: Renumber EXCP_SYSCALL linux-user, configure: fix (again) syscall_nr.h dependencies cleanup Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user/syscall.c')
-rw-r--r--linux-user/syscall.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 35f4146662..49395dcea9 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1273,6 +1273,25 @@ static inline abi_long host_to_target_timespec64(abi_ulong target_addr,
return 0;
}
+#if defined(TARGET_NR_gettimeofday)
+static inline abi_long copy_to_user_timezone(abi_ulong target_tz_addr,
+ struct timezone *tz)
+{
+ struct target_timezone *target_tz;
+
+ if (!lock_user_struct(VERIFY_WRITE, target_tz, target_tz_addr, 1)) {
+ return -TARGET_EFAULT;
+ }
+
+ __put_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
+ __put_user(tz->tz_dsttime, &target_tz->tz_dsttime);
+
+ unlock_user_struct(target_tz, target_tz_addr, 1);
+
+ return 0;
+}
+#endif
+
#if defined(TARGET_NR_settimeofday)
static inline abi_long copy_from_user_timezone(struct timezone *tz,
abi_ulong target_tz_addr)
@@ -7144,6 +7163,16 @@ static int open_self_maps(void *cpu_env, int fd)
}
}
+#ifdef TARGET_VSYSCALL_PAGE
+ /*
+ * We only support execution from the vsyscall page.
+ * This is as if CONFIG_LEGACY_VSYSCALL_XONLY=y from v5.3.
+ */
+ dprintf(fd, TARGET_FMT_lx "-" TARGET_FMT_lx
+ " --xp 00000000 00:00 0 [vsyscall]\n",
+ TARGET_VSYSCALL_PAGE, TARGET_VSYSCALL_PAGE + TARGET_PAGE_SIZE);
+#endif
+
free(line);
fclose(fp);
@@ -8700,10 +8729,16 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
case TARGET_NR_gettimeofday:
{
struct timeval tv;
- ret = get_errno(gettimeofday(&tv, NULL));
+ struct timezone tz;
+
+ ret = get_errno(gettimeofday(&tv, &tz));
if (!is_error(ret)) {
- if (copy_to_user_timeval(arg1, &tv))
+ if (arg1 && copy_to_user_timeval(arg1, &tv)) {
return -TARGET_EFAULT;
+ }
+ if (arg2 && copy_to_user_timezone(arg2, &tz)) {
+ return -TARGET_EFAULT;
+ }
}
}
return ret;