* [Qemu-devel] [PULL v2 01/13] Add support for MAP_NORESERVE mmap flag.
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 02/13] linux-user: added fake open() for /proc/self/cmdline riku.voipio
` (12 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Christophe Lyon, Anthony Liguori
From: Christophe Lyon <christophe.lyon@linaro.org>
mmap_flags_tbl contains a list of mmap flags, and how to map them to
the target. This patch adds MAP_NORESERVE, which was missing to the
list.
Signed-off-by: Christophe Lyon <christophe.lyon@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 7d74079..007d59d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -3908,6 +3908,8 @@ static bitmask_transtbl mmap_flags_tbl[] = {
{ TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, MAP_DENYWRITE, MAP_DENYWRITE },
{ TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, MAP_EXECUTABLE, MAP_EXECUTABLE },
{ TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
+ { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, MAP_NORESERVE,
+ MAP_NORESERVE },
{ 0, 0, 0, 0 }
};
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 02/13] linux-user: added fake open() for /proc/self/cmdline
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 01/13] Add support for MAP_NORESERVE mmap flag riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 03/13] linux-user: translate the result of getsockopt SO_TYPE riku.voipio
` (11 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Wim Vander Schelden, Anthony Liguori
From: Wim Vander Schelden <wim@fixnum.org>
Signed-off-by: Wim Vander Schelden <wim@fixnum.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 007d59d..5c175ba 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -4949,6 +4949,51 @@ int host_to_target_waitstatus(int status)
return status;
}
+static int open_self_cmdline(void *cpu_env, int fd)
+{
+ int fd_orig = -1;
+ bool word_skipped = false;
+
+ fd_orig = open("/proc/self/cmdline", O_RDONLY);
+ if (fd_orig < 0) {
+ return fd_orig;
+ }
+
+ while (true) {
+ ssize_t nb_read;
+ char buf[128];
+ char *cp_buf = buf;
+
+ nb_read = read(fd_orig, buf, sizeof(buf));
+ if (nb_read < 0) {
+ fd_orig = close(fd_orig);
+ return -1;
+ } else if (nb_read == 0) {
+ break;
+ }
+
+ if (!word_skipped) {
+ /* Skip the first string, which is the path to qemu-*-static
+ instead of the actual command. */
+ cp_buf = memchr(buf, 0, sizeof(buf));
+ if (cp_buf) {
+ /* Null byte found, skip one string */
+ cp_buf++;
+ nb_read -= cp_buf - buf;
+ word_skipped = true;
+ }
+ }
+
+ if (word_skipped) {
+ if (write(fd, cp_buf, nb_read) != nb_read) {
+ return -1;
+ }
+ }
+ }
+
+ return close(fd_orig);
+}
+
static int open_self_maps(void *cpu_env, int fd)
{
#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
@@ -5150,6 +5195,7 @@ static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
{ "maps", open_self_maps, is_proc_myself },
{ "stat", open_self_stat, is_proc_myself },
{ "auxv", open_self_auxv, is_proc_myself },
+ { "cmdline", open_self_cmdline, is_proc_myself },
#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
{ "/proc/net/route", open_net_route, is_proc },
#endif
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 03/13] linux-user: translate the result of getsockopt SO_TYPE
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 01/13] Add support for MAP_NORESERVE mmap flag riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 02/13] linux-user: added fake open() for /proc/self/cmdline riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 04/13] linux-user: support SO_ACCEPTCONN getsockopt option riku.voipio
` (10 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
QEMU previously passed the result of the host syscall directly to the
target program. This is a problem if the host & target have different
representations of socket types, as is the case when running a MIPS
target program on an x86 host. Introduce a host_to_target_sock_type
helper function mirroring the existing target_to_host_sock_type, and
call it to translate the value provided by getsockopt when called for
the SO_TYPE option.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 5c175ba..8d13781 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -592,6 +592,37 @@ char *target_strerror(int err)
return strerror(target_to_host_errno(err));
}
+static inline int host_to_target_sock_type(int host_type)
+{
+ int target_type;
+
+ switch (host_type & 0xf /* SOCK_TYPE_MASK */) {
+ case SOCK_DGRAM:
+ target_type = TARGET_SOCK_DGRAM;
+ break;
+ case SOCK_STREAM:
+ target_type = TARGET_SOCK_STREAM;
+ break;
+ default:
+ target_type = host_type & 0xf /* SOCK_TYPE_MASK */;
+ break;
+ }
+
+#if defined(SOCK_CLOEXEC)
+ if (host_type & SOCK_CLOEXEC) {
+ target_type |= TARGET_SOCK_CLOEXEC;
+ }
+#endif
+
+#if defined(SOCK_NONBLOCK)
+ if (host_type & SOCK_NONBLOCK) {
+ target_type |= TARGET_SOCK_NONBLOCK;
+ }
+#endif
+
+ return target_type;
+}
+
static abi_ulong target_brk;
static abi_ulong target_original_brk;
static abi_ulong brk_page;
@@ -1636,6 +1667,9 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
if (ret < 0)
return ret;
+ if (optname == SO_TYPE) {
+ val = host_to_target_sock_type(val);
+ }
if (len > lv)
len = lv;
if (len == 4) {
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 04/13] linux-user: support SO_ACCEPTCONN getsockopt option
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (2 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 03/13] linux-user: translate the result of getsockopt SO_TYPE riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 05/13] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options riku.voipio
` (9 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Translate the SO_ACCEPTCONN option to the host value & execute the
syscall as expected.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 8d13781..b1e57df 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1652,6 +1652,9 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
case TARGET_SO_RCVLOWAT:
optname = SO_RCVLOWAT;
goto int_case;
+ case TARGET_SO_ACCEPTCONN:
+ optname = SO_ACCEPTCONN;
+ goto int_case;
default:
goto int_case;
}
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 05/13] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (3 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 04/13] linux-user: support SO_ACCEPTCONN getsockopt option riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 06/13] linux-user: support SO_PASSSEC setsockopt option riku.voipio
` (8 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Translate the SO_SNDBUFFORCE & SO_RCVBUFFORCE options to setsockopt to
the host values & perform the syscall as expected, allowing use of those
options by target programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index b1e57df..bdc60fe 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1502,9 +1502,15 @@ set_timeout:
case TARGET_SO_SNDBUF:
optname = SO_SNDBUF;
break;
+ case TARGET_SO_SNDBUFFORCE:
+ optname = SO_SNDBUFFORCE;
+ break;
case TARGET_SO_RCVBUF:
optname = SO_RCVBUF;
break;
+ case TARGET_SO_RCVBUFFORCE:
+ optname = SO_RCVBUFFORCE;
+ break;
case TARGET_SO_KEEPALIVE:
optname = SO_KEEPALIVE;
break;
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 06/13] linux-user: support SO_PASSSEC setsockopt option
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (4 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 05/13] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 07/13] linux-user: allow NULL arguments to mount riku.voipio
` (7 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Translate the SO_PASSSEC option to setsockopt to the host value &
perform the syscall as expected, allowing use of the option by target
programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/socket.h | 5 +++++
linux-user/syscall.c | 3 +++
2 files changed, 8 insertions(+)
diff --git a/linux-user/socket.h b/linux-user/socket.h
index ae17959..4dacae6 100644
--- a/linux-user/socket.h
+++ b/linux-user/socket.h
@@ -63,6 +63,7 @@
#define TARGET_SO_PEERSEC 30
#define TARGET_SO_SNDBUFFORCE 31
#define TARGET_SO_RCVBUFFORCE 33
+ #define TARGET_SO_PASSSEC 34
/** sock_type - Socket types
*
@@ -242,6 +243,10 @@
#define TARGET_SOCK_MAX (TARGET_SOCK_PACKET + 1)
#define TARGET_SOCK_TYPE_MASK 0xf /* Covers up to TARGET_SOCK_MAX-1. */
+
+ #define TARGET_SO_PASSSEC 31
+#else
+ #define TARGET_SO_PASSSEC 34
#endif
/* For setsockopt(2) */
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index bdc60fe..3971cb5 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1531,6 +1531,9 @@ set_timeout:
case TARGET_SO_PASSCRED:
optname = SO_PASSCRED;
break;
+ case TARGET_SO_PASSSEC:
+ optname = SO_PASSSEC;
+ break;
case TARGET_SO_TIMESTAMP:
optname = SO_TIMESTAMP;
break;
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 07/13] linux-user: allow NULL arguments to mount
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (5 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 06/13] linux-user: support SO_PASSSEC setsockopt option riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 08/13] linux-user: support strace of epoll_create1 riku.voipio
` (6 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Calls to the mount syscall can legitimately provide NULL as the value
for the source of filesystemtype arguments, which QEMU would previously
reject & return -EFAULT to the target program. An example of this is
remounting an already mounted filesystem with different properties.
Instead of rejecting such syscalls with -EFAULT, pass NULL along to the
kernel as the target program expects.
Additionally this patch fixes a potential memory leak when DEBUG_REMAP
is enabled and lock_user_string fails on the target or filesystemtype
arguments but a prior argument was non-NULL and already locked.
Since the patch already touched most lines of the TARGET_NR_mount case,
it fixes the indentation & coding style for good measure.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 75 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 53 insertions(+), 22 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 3971cb5..4e48af6 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5614,29 +5614,60 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#endif
case TARGET_NR_mount:
- {
- /* need to look at the data field */
- void *p2, *p3;
- p = lock_user_string(arg1);
- p2 = lock_user_string(arg2);
- p3 = lock_user_string(arg3);
- if (!p || !p2 || !p3)
- ret = -TARGET_EFAULT;
- else {
- /* FIXME - arg5 should be locked, but it isn't clear how to
- * do that since it's not guaranteed to be a NULL-terminated
- * string.
- */
- if ( ! arg5 )
- ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, NULL));
- else
- ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)));
- }
+ {
+ /* need to look at the data field */
+ void *p2, *p3;
+
+ if (arg1) {
+ p = lock_user_string(arg1);
+ if (!p) {
+ goto efault;
+ }
+ } else {
+ p = NULL;
+ }
+
+ p2 = lock_user_string(arg2);
+ if (!p2) {
+ if (arg1) {
+ unlock_user(p, arg1, 0);
+ }
+ goto efault;
+ }
+
+ if (arg3) {
+ p3 = lock_user_string(arg3);
+ if (!p3) {
+ if (arg1) {
unlock_user(p, arg1, 0);
- unlock_user(p2, arg2, 0);
- unlock_user(p3, arg3, 0);
- break;
- }
+ }
+ unlock_user(p2, arg2, 0);
+ goto efault;
+ }
+ } else {
+ p3 = NULL;
+ }
+
+ /* FIXME - arg5 should be locked, but it isn't clear how to
+ * do that since it's not guaranteed to be a NULL-terminated
+ * string.
+ */
+ if (!arg5) {
+ ret = mount(p, p2, p3, (unsigned long)arg4, NULL);
+ } else {
+ ret = mount(p, p2, p3, (unsigned long)arg4, g2h(arg5));
+ }
+ ret = get_errno(ret);
+
+ if (arg1) {
+ unlock_user(p, arg1, 0);
+ }
+ unlock_user(p2, arg2, 0);
+ if (arg3) {
+ unlock_user(p3, arg3, 0);
+ }
+ }
+ break;
#ifdef TARGET_NR_umount
case TARGET_NR_umount:
if (!(p = lock_user_string(arg1)))
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 08/13] linux-user: support strace of epoll_create1
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (6 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 07/13] linux-user: allow NULL arguments to mount riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 09/13] linux-user: fix struct target_epoll_event layout for MIPS riku.voipio
` (5 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Add the epoll_create1 syscall to strace.list in order to display that
syscall when it occurs, rather than a message about the syscall being
unknown despite QEMU already implementing support for it.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/strace.list | 3 +++
1 file changed, 3 insertions(+)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index cf5841a..fcb258d 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -114,6 +114,9 @@
#ifdef TARGET_NR_epoll_create
{ TARGET_NR_epoll_create, "epoll_create" , NULL, NULL, NULL },
#endif
+#ifdef TARGET_NR_epoll_create1
+{ TARGET_NR_epoll_create1, "epoll_create1" , NULL, NULL, NULL },
+#endif
#ifdef TARGET_NR_epoll_ctl
{ TARGET_NR_epoll_ctl, "epoll_ctl" , NULL, NULL, NULL },
#endif
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 09/13] linux-user: fix struct target_epoll_event layout for MIPS
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (7 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 08/13] linux-user: support strace of epoll_create1 riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 10/13] linux-user: respect timezone for settimeofday riku.voipio
` (4 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
MIPS requires the pad field to 64b-align the data field just as ARM
does.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall_defs.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 69c3982..e379b45 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2528,7 +2528,7 @@ typedef union target_epoll_data {
struct target_epoll_event {
uint32_t events;
-#ifdef TARGET_ARM
+#if defined(TARGET_ARM) || defined(TARGET_MIPS) || defined(TARGET_MIPS64)
uint32_t __pad;
#endif
target_epoll_data_t data;
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 10/13] linux-user: respect timezone for settimeofday
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (8 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 09/13] linux-user: fix struct target_epoll_event layout for MIPS riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 11/13] linux-user: allow NULL tv argument " riku.voipio
` (3 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
The settimeofday syscall accepts a tz argument indicating the desired
timezone to the kernel. QEMU previously ignored any argument provided
by the target program & always passed NULL to the kernel. Instead,
translate the argument & pass along the data userland provided.
Although this argument is described by the settimeofday man page as
obsolete, it is used by systemd as of version 213.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 29 ++++++++++++++++++++++++++++-
linux-user/syscall_defs.h | 5 +++++
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 4e48af6..0ce1a4e 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -935,6 +935,23 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr,
return 0;
}
+static inline abi_long copy_from_user_timezone(struct timezone *tz,
+ abi_ulong target_tz_addr)
+{
+ struct target_timezone *target_tz;
+
+ if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) {
+ return -TARGET_EFAULT;
+ }
+
+ __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
+ __get_user(tz->tz_dsttime, &target_tz->tz_dsttime);
+
+ unlock_user_struct(target_tz, target_tz_addr, 0);
+
+ return 0;
+}
+
#if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
#include <mqueue.h>
@@ -6385,9 +6402,19 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
case TARGET_NR_settimeofday:
{
struct timeval tv;
+ struct timezone tz, *ptz = NULL;
+
if (copy_from_user_timeval(&tv, arg1))
goto efault;
- ret = get_errno(settimeofday(&tv, NULL));
+
+ if (arg2) {
+ if (copy_from_user_timezone(&tz, arg2)) {
+ goto efault;
+ }
+ ptz = &tz;
+ }
+
+ ret = get_errno(settimeofday(&tv, ptz));
}
break;
#if defined(TARGET_NR_select)
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index e379b45..a1f1fce 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -165,6 +165,11 @@ struct target_timespec {
abi_long tv_nsec;
};
+struct target_timezone {
+ abi_int tz_minuteswest;
+ abi_int tz_dsttime;
+};
+
struct target_itimerval {
struct target_timeval it_interval;
struct target_timeval it_value;
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 11/13] linux-user: allow NULL tv argument for settimeofday
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (9 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 10/13] linux-user: respect timezone for settimeofday riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 12/13] linux-user: support the KDSIGACCEPT ioctl riku.voipio
` (2 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
The tv argument to the settimeofday syscall is allowed to be NULL, if
the program only wishes to provide the timezone. QEMU previously
returned -EFAULT when tv was NULL. Instead, execute the syscall &
provide NULL to the kernel as the target program expected.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/syscall.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0ce1a4e..8e2762b 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6401,11 +6401,15 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
case TARGET_NR_settimeofday:
{
- struct timeval tv;
+ struct timeval tv, *ptv = NULL;
struct timezone tz, *ptz = NULL;
- if (copy_from_user_timeval(&tv, arg1))
- goto efault;
+ if (arg1) {
+ if (copy_from_user_timeval(&tv, arg1)) {
+ goto efault;
+ }
+ ptv = &tv;
+ }
if (arg2) {
if (copy_from_user_timezone(&tz, arg2)) {
@@ -6414,7 +6418,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ptz = &tz;
}
- ret = get_errno(settimeofday(&tv, ptz));
+ ret = get_errno(settimeofday(ptv, ptz));
}
break;
#if defined(TARGET_NR_select)
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 12/13] linux-user: support the KDSIGACCEPT ioctl
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (10 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 11/13] linux-user: allow NULL tv argument " riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 13/13] linux-user: support the SIOCGIFINDEX ioctl riku.voipio
2014-06-29 17:09 ` [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 Peter Maydell
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Add a definition of the KDSIGACCEPT ioctl & allow its use by target
programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/ioctls.h | 1 +
linux-user/syscall.c | 7 +++++++
linux-user/syscall_defs.h | 1 +
3 files changed, 9 insertions(+)
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index 309fb21..f278d3e 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -64,6 +64,7 @@
IOCTL(KDSKBLED, 0, TYPE_INT)
IOCTL(KDGETLED, 0, TYPE_INT)
IOCTL(KDSETLED, 0, TYPE_INT)
+ IOCTL_SPECIAL(KDSIGACCEPT, 0, do_ioctl_kdsigaccept, TYPE_INT)
IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT))
IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT))
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 8e2762b..5a272d3 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -3689,6 +3689,13 @@ static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp,
return ret;
}
+static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp,
+ int fd, abi_long cmd, abi_long arg)
+{
+ int sig = target_to_host_signal(arg);
+ return get_errno(ioctl(fd, ie->host_cmd, sig));
+}
+
static IOCTLEntry ioctl_entries[] = {
#define IOCTL(cmd, access, ...) \
{ TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index a1f1fce..4adfd3a 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -831,6 +831,7 @@ struct target_pollfd {
#define TARGET_KDSKBLED 0x4B65 /* set led flags (not lights) */
#define TARGET_KDGETLED 0x4B31 /* return current led state */
#define TARGET_KDSETLED 0x4B32 /* set led state [lights, not flags] */
+#define TARGET_KDSIGACCEPT 0x4B4E
#define TARGET_SIOCATMARK 0x8905
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PULL v2 13/13] linux-user: support the SIOCGIFINDEX ioctl
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (11 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 12/13] linux-user: support the KDSIGACCEPT ioctl riku.voipio
@ 2014-06-29 12:14 ` riku.voipio
2014-06-29 17:09 ` [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 Peter Maydell
13 siblings, 0 replies; 15+ messages in thread
From: riku.voipio @ 2014-06-29 12:14 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori, Paul Burton
From: Paul Burton <paul@archlinuxmips.org>
Add a definition of the SIOCGIFINDEX ioctl, allowing its use by target
programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
---
linux-user/ioctls.h | 1 +
linux-user/syscall_defs.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index f278d3e..07a00da 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -118,6 +118,7 @@
IOCTL(SIOCSIFMEM, IOC_W, MK_PTR(MK_STRUCT(STRUCT_ptr_ifreq)))
IOCTL(SIOCADDMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq)))
IOCTL(SIOCDELMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq)))
+ IOCTL(SIOCGIFINDEX, IOC_W | IOC_R, MK_PTR(MK_STRUCT(STRUCT_sockaddr_ifreq)))
IOCTL(SIOCSIFLINK, 0, TYPE_NULL)
IOCTL_SPECIAL(SIOCGIFCONF, IOC_W | IOC_R, do_ioctl_ifconf,
MK_PTR(MK_STRUCT(STRUCT_ifconf)))
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 4adfd3a..8563027 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -865,6 +865,7 @@ struct target_pollfd {
#define TARGET_SIOCSIFSLAVE 0x8930
#define TARGET_SIOCADDMULTI 0x8931 /* Multicast address lists */
#define TARGET_SIOCDELMULTI 0x8932
+#define TARGET_SIOCGIFINDEX 0x8933
/* Bridging control calls */
#define TARGET_SIOCGIFBR 0x8940 /* Bridging support */
--
2.0.0.rc2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1
2014-06-29 12:14 [Qemu-devel] [PULL v2 00/13] linux-user changes for 2.1 riku.voipio
` (12 preceding siblings ...)
2014-06-29 12:14 ` [Qemu-devel] [PULL v2 13/13] linux-user: support the SIOCGIFINDEX ioctl riku.voipio
@ 2014-06-29 17:09 ` Peter Maydell
13 siblings, 0 replies; 15+ messages in thread
From: Peter Maydell @ 2014-06-29 17:09 UTC (permalink / raw)
To: Riku Voipio; +Cc: QEMU Developers, Anthony Liguori
On 29 June 2014 13:14, <riku.voipio@linaro.org> wrote:
> From: Riku Voipio <riku.voipio@linaro.org>
>
> The following changes since commit de6793e8c2a4d34e28e5ea385276249fc98109ec:
>
> Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20140627' into staging (2014-06-29 11:43:31 +0100)
>
> are available in the git repository at:
>
> git://git.linaro.org/people/riku.voipio/qemu.git linux-user-for-upstream
>
> for you to fetch changes up to f63eb01ac7a5b4437d5589ad4343527534bf9d0b:
>
> linux-user: support the SIOCGIFINDEX ioctl (2014-06-29 14:19:59 +0300)
>
> Changes since v1 - dropped those patches from Paul that add new syscalls from
> this round, since the won't compile with older libc's.
Applied, thanks.
-- PMM
^ permalink raw reply [flat|nested] 15+ messages in thread