* [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements
@ 2014-06-21 22:52 Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 01/16] linux-user: translate the result of getsockopt SO_TYPE Paul Burton
` (16 more replies)
0 siblings, 17 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
From: Paul Burton <paul.burton@imgtec.com>
This series fixes a number of bugs in QEMUs linux-user support, some
specific to targetting the MIPS architecture but mostly generic. It also
adds support for some previously unsupported syscalls & {g,s}etsockopt
options.
Paul Burton (16):
linux-user: translate the result of getsockopt SO_TYPE
linux-user: support SO_ACCEPTCONN getsockopt option
linux-user: support SO_{SND,RCV}BUFFORCE setsockopt options
linux-user: support SO_PASSSEC setsockopt option
linux-user: allow NULL arguments to mount
linux-user: support strace of epoll_create1
linux-user: fix struct target_epoll_event layout for MIPS
linux-user: respect timezone for settimeofday
linux-user: allow NULL tv argument for settimeofday
linux-user: support timerfd_{create,gettime,settime} syscalls
linux-user: support ioprio_{get,set} syscalls
linux-user: support {name_to,open_by}_handle_at syscalls
linux-user: support the setns syscall
linux-user: support the unshare syscall
linux-user: support the KDSIGACCEPT ioctl
linux-user: support the SIOCGIFINDEX ioctl
linux-user/ioctls.h | 2 +
linux-user/socket.h | 5 +
linux-user/strace.c | 30 +++++
linux-user/strace.list | 21 ++++
linux-user/syscall.c | 271 +++++++++++++++++++++++++++++++++++++++++-----
linux-user/syscall_defs.h | 9 +-
6 files changed, 311 insertions(+), 27 deletions(-)
--
2.0.0
^ permalink raw reply [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 01/16] linux-user: translate the result of getsockopt SO_TYPE
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
@ 2014-06-21 22:52 ` Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 02/16] linux-user: support SO_ACCEPTCONN getsockopt option Paul Burton
` (15 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- Remove indirection via a function pointer, and just call
host_to_target_sock_type directly.
---
linux-user/syscall.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 7d74079..30610e7 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -592,6 +592,35 @@ 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 +1665,8 @@ 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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 02/16] linux-user: support SO_ACCEPTCONN getsockopt option
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 01/16] linux-user: translate the result of getsockopt SO_TYPE Paul Burton
@ 2014-06-21 22:52 ` Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 03/16] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options Paul Burton
` (14 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Translate the SO_ACCEPTCONN option to the host value & execute the
syscall as expected.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 30610e7..dba5b4d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1650,6 +1650,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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 03/16] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 01/16] linux-user: translate the result of getsockopt SO_TYPE Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 02/16] linux-user: support SO_ACCEPTCONN getsockopt option Paul Burton
@ 2014-06-21 22:52 ` Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 04/16] linux-user: support SO_PASSSEC setsockopt option Paul Burton
` (13 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index dba5b4d..ce1ea1f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1500,9 +1500,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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 04/16] linux-user: support SO_PASSSEC setsockopt option
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (2 preceding siblings ...)
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 03/16] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options Paul Burton
@ 2014-06-21 22:52 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 05/16] linux-user: allow NULL arguments to mount Paul Burton
` (12 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:52 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- Fix the value of TARGET_SO_PASSSEC for the sparc target.
---
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 ce1ea1f..7da21c7 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1529,6 +1529,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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 05/16] linux-user: allow NULL arguments to mount
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (3 preceding siblings ...)
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 04/16] linux-user: support SO_PASSSEC setsockopt option Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 06/16] linux-user: support strace of epoll_create1 Paul Burton
` (11 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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 for good measure.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 68 +++++++++++++++++++++++++++++++++++-----------------
1 file changed, 46 insertions(+), 22 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 7da21c7..3861f0f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5563,29 +5563,53 @@ 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 = get_errno(mount(p, p2, p3, (unsigned long)arg4, NULL));
+ else
+ ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)));
+
+ 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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 06/16] linux-user: support strace of epoll_create1
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (4 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 05/16] linux-user: allow NULL arguments to mount Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 07/16] linux-user: fix struct target_epoll_event layout for MIPS Paul Burton
` (10 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- None.
---
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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 07/16] linux-user: fix struct target_epoll_event layout for MIPS
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (5 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 06/16] linux-user: support strace of epoll_create1 Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday Paul Burton
` (9 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
MIPS requires the pad field to 64b-align the data field just as ARM
does.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- Apply the same padding for the mips64 target.
---
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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (6 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 07/16] linux-user: fix struct target_epoll_event layout for MIPS Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 23:18 ` Peter Maydell
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 09/16] linux-user: allow NULL tv argument " Paul Burton
` (8 subsequent siblings)
16 siblings, 1 reply; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 27 ++++++++++++++++++++++++++-
linux-user/syscall_defs.h | 5 +++++
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 3861f0f..ef04dc6 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -933,6 +933,22 @@ 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>
@@ -6327,9 +6343,18 @@ 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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 09/16] linux-user: allow NULL tv argument for settimeofday
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (7 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 10/16] linux-user: support timerfd_{create, gettime, settime} syscalls Paul Burton
` (7 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
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>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index ef04dc6..cd0221b 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6342,11 +6342,14 @@ 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))
@@ -6354,7 +6357,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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 10/16] linux-user: support timerfd_{create, gettime, settime} syscalls
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (8 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 09/16] linux-user: allow NULL tv argument " Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 11/16] linux-user: support ioprio_{get, set} syscalls Paul Burton
` (6 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Adds support for the timerfd_create, timerfd_gettime & timerfd_settime
syscalls, allowing use of timerfds by target programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/strace.list | 9 +++++++++
linux-user/syscall.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index fcb258d..8de972a 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1404,6 +1404,15 @@
#ifdef TARGET_NR_timer_settime
{ TARGET_NR_timer_settime, "timer_settime" , NULL, NULL, NULL },
#endif
+#ifdef TARGET_NR_timerfd_create
+{ TARGET_NR_timerfd_create, "timerfd_create" , NULL, NULL, NULL },
+#endif
+#ifdef TARGET_NR_timerfd_gettime
+{ TARGET_NR_timerfd_gettime, "timerfd_gettime" , NULL, NULL, NULL },
+#endif
+#ifdef TARGET_NR_timerfd_settime
+{ TARGET_NR_timerfd_settime, "timerfd_settime" , NULL, NULL, NULL },
+#endif
#ifdef TARGET_NR_times
{ TARGET_NR_times, "times" , NULL, NULL, NULL },
#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index cd0221b..1c300be 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -58,6 +58,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base,
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/statfs.h>
+#include <sys/timerfd.h>
#include <utime.h>
#include <sys/sysinfo.h>
//#include <sys/user.h>
@@ -9430,6 +9431,49 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
}
#endif
+#ifdef TARGET_NR_timerfd_create
+ case TARGET_NR_timerfd_create:
+ ret = get_errno(timerfd_create(arg1,
+ target_to_host_bitmask(arg2, fcntl_flags_tbl)));
+ break;
+#endif
+
+#ifdef TARGET_NR_timerfd_gettime
+ case TARGET_NR_timerfd_gettime:
+ {
+ struct itimerspec its_curr;
+
+ ret = get_errno(timerfd_gettime(arg1, &its_curr));
+
+ if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) {
+ goto efault;
+ }
+ }
+ break;
+#endif
+
+#ifdef TARGET_NR_timerfd_settime
+ case TARGET_NR_timerfd_settime:
+ {
+ struct itimerspec its_new, its_old, *p_new;
+
+ if (arg3) {
+ if (target_to_host_itimerspec(&its_new, arg3))
+ goto efault;
+ p_new = &its_new;
+ } else {
+ p_new = NULL;
+ }
+
+ ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
+
+ if (arg4 && host_to_target_itimerspec(arg4, &its_old)) {
+ goto efault;
+ }
+ }
+ break;
+#endif
+
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
--
2.0.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 11/16] linux-user: support ioprio_{get, set} syscalls
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (9 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 10/16] linux-user: support timerfd_{create, gettime, settime} syscalls Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls Paul Burton
` (5 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Add support for the ioprio_get & ioprio_set syscalls, allowing their
use by target programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- Declare the host syscalls conditionally upon whether both host &
target define their numbers, to avoid compile time warnings/errors
about the host syscall functions being unused when built for targets
which don't support them.
---
linux-user/syscall.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1c300be..fb36f46 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -252,6 +252,12 @@ _syscall2(int, capget, struct __user_cap_header_struct *, header,
struct __user_cap_data_struct *, data);
_syscall2(int, capset, struct __user_cap_header_struct *, header,
struct __user_cap_data_struct *, data);
+#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
+_syscall2(int, ioprio_get, int, which, int, who)
+#endif
+#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
+_syscall3(int, ioprio_set, int, which, int, who, int, ioprio)
+#endif
static bitmask_transtbl fcntl_flags_tbl[] = {
{ TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, },
@@ -9474,6 +9480,18 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#endif
+#if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
+ case TARGET_NR_ioprio_get:
+ ret = get_errno(ioprio_get(arg1, arg2));
+ break;
+#endif
+
+#if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
+ case TARGET_NR_ioprio_set:
+ ret = get_errno(ioprio_set(arg1, arg2, arg3));
+ break;
+#endif
+
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
--
2.0.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (10 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 11/16] linux-user: support ioprio_{get, set} syscalls Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-27 13:26 ` Riku Voipio
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 13/16] linux-user: support the setns syscall Paul Burton
` (4 subsequent siblings)
16 siblings, 1 reply; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Implement support for the name_to_handle_at and open_by_handle_at
syscalls, allowing their use by the target program.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/strace.c | 30 ++++++++++++++++++++++++++++++
linux-user/strace.list | 6 ++++++
linux-user/syscall.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 86 insertions(+)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index ea6c1d2..c20ddf1 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -1552,6 +1552,36 @@ print_kill(const struct syscallname *name,
}
#endif
+#ifdef TARGET_NR_name_to_handle_at
+static void
+print_name_to_handle_at(const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ print_at_dirfd(arg0, 0);
+ print_string(arg1, 0);
+ print_pointer(arg2, 0);
+ print_pointer(arg3, 0);
+ print_raw_param("0x%x", arg4, 1);
+ print_syscall_epilogue(name);
+}
+#endif
+
+#ifdef TARGET_NR_open_by_handle_at
+static void
+print_open_by_handle_at(const struct syscallname *name,
+ abi_long arg0, abi_long arg1, abi_long arg2,
+ abi_long arg3, abi_long arg4, abi_long arg5)
+{
+ print_syscall_prologue(name);
+ print_raw_param("%d", arg0, 0);
+ print_pointer(arg2, 0);
+ print_open_flags(arg3, 1);
+ print_syscall_epilogue(name);
+}
+#endif
+
/*
* An array of all of the syscalls we know about
*/
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 8de972a..147f579 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -582,6 +582,9 @@
#ifdef TARGET_NR_munmap
{ TARGET_NR_munmap, "munmap" , NULL, print_munmap, NULL },
#endif
+#ifdef TARGET_NR_name_to_handle_at
+{ TARGET_NR_name_to_handle_at, "name_to_handle_at" , NULL, print_name_to_handle_at, NULL },
+#endif
#ifdef TARGET_NR_nanosleep
{ TARGET_NR_nanosleep, "nanosleep" , NULL, NULL, NULL },
#endif
@@ -624,6 +627,9 @@
#ifdef TARGET_NR_openat
{ TARGET_NR_openat, "openat" , NULL, print_openat, NULL },
#endif
+#ifdef TARGET_NR_open_by_handle_at
+{ TARGET_NR_open_by_handle_at, "open_by_handle_at" , NULL, print_open_by_handle_at, NULL },
+#endif
#ifdef TARGET_NR_osf_adjtime
{ TARGET_NR_osf_adjtime, "osf_adjtime" , NULL, NULL, NULL },
#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index fb36f46..0495781 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5347,6 +5347,56 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
unlock_user(p, arg2, 0);
break;
#endif
+#ifdef TARGET_NR_name_to_handle_at
+ case TARGET_NR_name_to_handle_at:
+ {
+ struct file_handle *fh;
+ uint32_t sz;
+ int mount_id;
+
+ if (!(p = lock_user_string(arg2)))
+ goto efault;
+
+ if (get_user_u32(sz, arg3)) {
+ unlock_user(p, arg2, 0);
+ goto efault;
+ }
+
+ if (!(fh = lock_user(VERIFY_WRITE, arg3, sizeof(*fh) + sz, 1))) {
+ unlock_user(p, arg2, 0);
+ goto efault;
+ }
+
+ ret = get_errno(name_to_handle_at(arg1, path(p), fh,
+ &mount_id, arg5));
+
+ unlock_user(p, arg2, 0);
+ unlock_user(p, arg3, sizeof(*fh) + sz);
+
+ if (put_user_s32(mount_id, arg4))
+ goto efault;
+ }
+ break;
+#endif
+#ifdef TARGET_NR_open_by_handle_at
+ case TARGET_NR_open_by_handle_at:
+ {
+ struct file_handle *fh;
+ uint32_t sz;
+
+ if (get_user_u32(sz, arg2))
+ goto efault;
+
+ if (!(fh = lock_user(VERIFY_WRITE, arg2, sizeof(*fh) + sz, 1)))
+ goto efault;
+
+ ret = get_errno(open_by_handle_at(arg1, fh,
+ target_to_host_bitmask(arg3, fcntl_flags_tbl)));
+
+ unlock_user(p, arg2, sizeof(*fh) + sz);
+ }
+ break;
+#endif
case TARGET_NR_close:
ret = get_errno(close(arg1));
break;
--
2.0.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 13/16] linux-user: support the setns syscall
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (11 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 14/16] linux-user: support the unshare syscall Paul Burton
` (3 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Add support for the setns syscall, trivially passed through to the host.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/strace.list | 3 +++
linux-user/syscall.c | 6 ++++++
2 files changed, 9 insertions(+)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index 147f579..d5b8033 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1191,6 +1191,9 @@
#ifdef TARGET_NR_set_mempolicy
{ TARGET_NR_set_mempolicy, "set_mempolicy" , NULL, NULL, NULL },
#endif
+#ifdef TARGET_NR_setns
+{ TARGET_NR_setns, "setns" , NULL, NULL, NULL },
+#endif
#ifdef TARGET_NR_setpgid
{ TARGET_NR_setpgid, "setpgid" , NULL, NULL, NULL },
#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0495781..0bbdf61 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9542,6 +9542,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#endif
+#ifdef TARGET_NR_setns
+ case TARGET_NR_setns:
+ ret = get_errno(setns(arg1, arg2));
+ break;
+#endif
+
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
--
2.0.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 14/16] linux-user: support the unshare syscall
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (12 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 13/16] linux-user: support the setns syscall Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl Paul Burton
` (2 subsequent siblings)
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Add support for the unshare syscall, trivially passed through to the
host.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
linux-user/syscall.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0bbdf61..936064c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -9548,6 +9548,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#endif
+#ifdef TARGET_NR_unshare
+ case TARGET_NR_unshare:
+ ret = get_errno(unshare(arg1));
+ break;
+#endif
+
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
--
2.0.0
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (13 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 14/16] linux-user: support the unshare syscall Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-21 23:13 ` Peter Maydell
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 16/16] linux-user: support the SIOCGIFINDEX ioctl Paul Burton
2014-06-27 13:30 ` [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Riku Voipio
16 siblings, 1 reply; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Add a definition of the KDSIGACCEPT ioctl & allow its use by target
programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
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 309fb21..cd21e64 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(KDSIGACCEPT, 0, TYPE_INT)
IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT))
IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT))
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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* [Qemu-devel] [PATCH v2 16/16] linux-user: support the SIOCGIFINDEX ioctl
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (14 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl Paul Burton
@ 2014-06-21 22:53 ` Paul Burton
2014-06-27 13:30 ` [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Riku Voipio
16 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-21 22:53 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio, Paul Burton
Add a definition of the SIOCGIFINDEX ioctl, allowing its use by target
programs.
Signed-off-by: Paul Burton <paul@archlinuxmips.org>
---
Changes in v2:
- None.
---
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 cd21e64..20551a8 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
^ permalink raw reply related [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl Paul Burton
@ 2014-06-21 23:13 ` Peter Maydell
2014-06-22 10:08 ` Paul Burton
0 siblings, 1 reply; 24+ messages in thread
From: Peter Maydell @ 2014-06-21 23:13 UTC (permalink / raw)
To: Paul Burton; +Cc: Riku Voipio, QEMU Developers
On 21 June 2014 23:53, Paul Burton <paul@archlinuxmips.org> wrote:
> Add a definition of the KDSIGACCEPT ioctl & allow its use by target
> programs.
>
> Signed-off-by: Paul Burton <paul@archlinuxmips.org>
> ---
> Changes in v2:
> - None.
> ---
> 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 309fb21..cd21e64 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(KDSIGACCEPT, 0, TYPE_INT)
>
> IOCTL(BLKROSET, IOC_W, MK_PTR(TYPE_INT))
> IOCTL(BLKROGET, IOC_R, MK_PTR(TYPE_INT))
> 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
The argument to this ioctl is a signal number, right?
Surely we need to translate it to a host signal number,
not just pass it through as TYPE_INT...
thanks
-- PMM
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday Paul Burton
@ 2014-06-21 23:18 ` Peter Maydell
2014-06-22 10:11 ` Paul Burton
0 siblings, 1 reply; 24+ messages in thread
From: Peter Maydell @ 2014-06-21 23:18 UTC (permalink / raw)
To: Paul Burton; +Cc: Riku Voipio, QEMU Developers
On 21 June 2014 23:53, Paul Burton <paul@archlinuxmips.org> wrote:
> 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>
> ---
> Changes in v2:
> - None.
> ---
> linux-user/syscall.c | 27 ++++++++++++++++++++++++++-
> linux-user/syscall_defs.h | 5 +++++
> 2 files changed, 31 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 3861f0f..ef04dc6 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -933,6 +933,22 @@ 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;
Coding style mandates braces even on single-line if()s; checkpatch.pl
will catch this usually.
Code looks OK otherwise.
thanks
-- PMM
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl
2014-06-21 23:13 ` Peter Maydell
@ 2014-06-22 10:08 ` Paul Burton
0 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-22 10:08 UTC (permalink / raw)
To: Peter Maydell; +Cc: Riku Voipio, QEMU Developers, Paul Burton
[-- Attachment #1: Type: text/plain, Size: 666 bytes --]
On Sun, Jun 22, 2014 at 12:13:27AM +0100, Peter Maydell wrote:
> > diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> > index 309fb21..cd21e64 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(KDSIGACCEPT, 0, TYPE_INT)
...snip...
>
> The argument to this ioctl is a signal number, right?
> Surely we need to translate it to a host signal number,
> not just pass it through as TYPE_INT...
True, not sure how I missed that - the clue is in the name!
Thanks,
Paul
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday
2014-06-21 23:18 ` Peter Maydell
@ 2014-06-22 10:11 ` Paul Burton
0 siblings, 0 replies; 24+ messages in thread
From: Paul Burton @ 2014-06-22 10:11 UTC (permalink / raw)
To: Peter Maydell; +Cc: Riku Voipio, QEMU Developers, Paul Burton
[-- Attachment #1: Type: text/plain, Size: 494 bytes --]
On Sun, Jun 22, 2014 at 12:18:02AM +0100, Peter Maydell wrote:
> > + if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1))
> > + return -TARGET_EFAULT;
>
> Coding style mandates braces even on single-line if()s; checkpatch.pl
> will catch this usually.
I copied that style from the equivalent timeval functions, but yeah I'll
make sure to get into the habit of running checkpatch for QEMU patches.
> Code looks OK otherwise.
Thanks for looking,
Paul
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls Paul Burton
@ 2014-06-27 13:26 ` Riku Voipio
0 siblings, 0 replies; 24+ messages in thread
From: Riku Voipio @ 2014-06-27 13:26 UTC (permalink / raw)
To: Paul Burton; +Cc: Riku Voipio, qemu-devel
Hi,
Comments inline:
On Sat, Jun 21, 2014 at 11:53:07PM +0100, Paul Burton wrote:
> Implement support for the name_to_handle_at and open_by_handle_at
> syscalls, allowing their use by the target program.
>
> Signed-off-by: Paul Burton <paul@archlinuxmips.org>
> ---
> Changes in v2:
> - None.
> ---
> linux-user/strace.c | 30 ++++++++++++++++++++++++++++++
> linux-user/strace.list | 6 ++++++
> linux-user/syscall.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 86 insertions(+)
>
> diff --git a/linux-user/strace.c b/linux-user/strace.c
> index ea6c1d2..c20ddf1 100644
> --- a/linux-user/strace.c
> +++ b/linux-user/strace.c
> @@ -1552,6 +1552,36 @@ print_kill(const struct syscallname *name,
> }
> #endif
>
> +#ifdef TARGET_NR_name_to_handle_at
> +static void
> +print_name_to_handle_at(const struct syscallname *name,
> + abi_long arg0, abi_long arg1, abi_long arg2,
> + abi_long arg3, abi_long arg4, abi_long arg5)
> +{
> + print_syscall_prologue(name);
> + print_at_dirfd(arg0, 0);
> + print_string(arg1, 0);
> + print_pointer(arg2, 0);
> + print_pointer(arg3, 0);
> + print_raw_param("0x%x", arg4, 1);
> + print_syscall_epilogue(name);
> +}
> +#endif
> +
> +#ifdef TARGET_NR_open_by_handle_at
> +static void
> +print_open_by_handle_at(const struct syscallname *name,
> + abi_long arg0, abi_long arg1, abi_long arg2,
> + abi_long arg3, abi_long arg4, abi_long arg5)
> +{
> + print_syscall_prologue(name);
> + print_raw_param("%d", arg0, 0);
> + print_pointer(arg2, 0);
> + print_open_flags(arg3, 1);
> + print_syscall_epilogue(name);
> +}
> +#endif
> +
> /*
> * An array of all of the syscalls we know about
> */
> diff --git a/linux-user/strace.list b/linux-user/strace.list
> index 8de972a..147f579 100644
> --- a/linux-user/strace.list
> +++ b/linux-user/strace.list
> @@ -582,6 +582,9 @@
> #ifdef TARGET_NR_munmap
> { TARGET_NR_munmap, "munmap" , NULL, print_munmap, NULL },
> #endif
> +#ifdef TARGET_NR_name_to_handle_at
> +{ TARGET_NR_name_to_handle_at, "name_to_handle_at" , NULL, print_name_to_handle_at, NULL },
> +#endif
> #ifdef TARGET_NR_nanosleep
> { TARGET_NR_nanosleep, "nanosleep" , NULL, NULL, NULL },
> #endif
> @@ -624,6 +627,9 @@
> #ifdef TARGET_NR_openat
> { TARGET_NR_openat, "openat" , NULL, print_openat, NULL },
> #endif
> +#ifdef TARGET_NR_open_by_handle_at
> +{ TARGET_NR_open_by_handle_at, "open_by_handle_at" , NULL, print_open_by_handle_at, NULL },
> +#endif
> #ifdef TARGET_NR_osf_adjtime
> { TARGET_NR_osf_adjtime, "osf_adjtime" , NULL, NULL, NULL },
> #endif
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index fb36f46..0495781 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -5347,6 +5347,56 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
> unlock_user(p, arg2, 0);
> break;
> #endif
> +#ifdef TARGET_NR_name_to_handle_at
+#if defined(TARGET_NR_name_to_handle_at) && defined(__NR_name_to_handle_at)
This is something that all other syscall definitions need - else qemu won't compile
on old distributions anymore.
> + case TARGET_NR_name_to_handle_at:
> + {
> + struct file_handle *fh;
> + uint32_t sz;
> + int mount_id;
> +
> + if (!(p = lock_user_string(arg2)))
> + goto efault;
> +
> + if (get_user_u32(sz, arg3)) {
> + unlock_user(p, arg2, 0);
> + goto efault;
> + }
> +
> + if (!(fh = lock_user(VERIFY_WRITE, arg3, sizeof(*fh) + sz, 1))) {
> + unlock_user(p, arg2, 0);
> + goto efault;
> + }
> +
> + ret = get_errno(name_to_handle_at(arg1, path(p), fh,
> + &mount_id, arg5));
> +
> + unlock_user(p, arg2, 0);
> + unlock_user(p, arg3, sizeof(*fh) + sz);
I think:
+ unlock_user(fh, arg3, sizeof(*fh) + sz);
> +
> + if (put_user_s32(mount_id, arg4))
> + goto efault;
> + }
> + break;
> +#endif
> +#ifdef TARGET_NR_open_by_handle_at
> + case TARGET_NR_open_by_handle_at:
> + {
> + struct file_handle *fh;
> + uint32_t sz;
> +
> + if (get_user_u32(sz, arg2))
> + goto efault;
> +
> + if (!(fh = lock_user(VERIFY_WRITE, arg2, sizeof(*fh) + sz, 1)))
> + goto efault;
> +
> + ret = get_errno(open_by_handle_at(arg1, fh,
> + target_to_host_bitmask(arg3, fcntl_flags_tbl)));
> +
> + unlock_user(p, arg2, sizeof(*fh) + sz);
And here too:
+ unlock_user(fh, arg2, sizeof(*fh) + sz);
> + }
> + break;
> +#endif
> case TARGET_NR_close:
> ret = get_errno(close(arg1));
> break;
> --
> 2.0.0
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
` (15 preceding siblings ...)
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 16/16] linux-user: support the SIOCGIFINDEX ioctl Paul Burton
@ 2014-06-27 13:30 ` Riku Voipio
2014-08-05 11:33 ` Riku Voipio
16 siblings, 1 reply; 24+ messages in thread
From: Riku Voipio @ 2014-06-27 13:30 UTC (permalink / raw)
To: Paul Burton; +Cc: Riku Voipio, qemu-devel, Paul Burton
On Sat, Jun 21, 2014 at 11:52:55PM +0100, Paul Burton wrote:
> From: Paul Burton <paul.burton@imgtec.com>
>
> This series fixes a number of bugs in QEMUs linux-user support, some
> specific to targetting the MIPS architecture but mostly generic. It also
> adds support for some previously unsupported syscalls & {g,s}etsockopt
> options.
Looks mostly good - unfortunately I missed some issues last round.
iI gave comments to the {name_to,open_by}_handle_at patch - which also
caused the build error for Peter.
Also, compile test on older distro showed that new syscalls need both
target and host test:
#ifdef TARGET_NR_setns
needs to be replaced with
#if defined(TARGET_NR_setns) && defined(__NR_setns)
Riku
> Paul Burton (16):
> linux-user: translate the result of getsockopt SO_TYPE
> linux-user: support SO_ACCEPTCONN getsockopt option
> linux-user: support SO_{SND,RCV}BUFFORCE setsockopt options
> linux-user: support SO_PASSSEC setsockopt option
> linux-user: allow NULL arguments to mount
> linux-user: support strace of epoll_create1
> linux-user: fix struct target_epoll_event layout for MIPS
> linux-user: respect timezone for settimeofday
> linux-user: allow NULL tv argument for settimeofday
> linux-user: support timerfd_{create,gettime,settime} syscalls
> linux-user: support ioprio_{get,set} syscalls
> linux-user: support {name_to,open_by}_handle_at syscalls
> linux-user: support the setns syscall
> linux-user: support the unshare syscall
> linux-user: support the KDSIGACCEPT ioctl
> linux-user: support the SIOCGIFINDEX ioctl
>
> linux-user/ioctls.h | 2 +
> linux-user/socket.h | 5 +
> linux-user/strace.c | 30 +++++
> linux-user/strace.list | 21 ++++
> linux-user/syscall.c | 271 +++++++++++++++++++++++++++++++++++++++++-----
> linux-user/syscall_defs.h | 9 +-
> 6 files changed, 311 insertions(+), 27 deletions(-)
>
> --
> 2.0.0
^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements
2014-06-27 13:30 ` [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Riku Voipio
@ 2014-08-05 11:33 ` Riku Voipio
0 siblings, 0 replies; 24+ messages in thread
From: Riku Voipio @ 2014-08-05 11:33 UTC (permalink / raw)
To: Paul Burton; +Cc: qemu-devel, Paul Burton
Hi Paul,
On Fri, Jun 27, 2014 at 04:30:34PM +0300, Riku Voipio wrote:
> On Sat, Jun 21, 2014 at 11:52:55PM +0100, Paul Burton wrote:
> > From: Paul Burton <paul.burton@imgtec.com>
> >
> > This series fixes a number of bugs in QEMUs linux-user support, some
> > specific to targetting the MIPS architecture but mostly generic. It also
> > adds support for some previously unsupported syscalls & {g,s}etsockopt
> > options.
> Looks mostly good - unfortunately I missed some issues last round.
> iI gave comments to the {name_to,open_by}_handle_at patch - which also
> caused the build error for Peter.
> Also, compile test on older distro showed that new syscalls need both
> target and host test:
> #ifdef TARGET_NR_setns
> needs to be replaced with
> #if defined(TARGET_NR_setns) && defined(__NR_setns)
Do you have time to to make the needed ifdef changes and send the remaining
patches again? I can also make the changes myself, if you prefer.
Riku
> Riku
>
> > Paul Burton (16):
> > linux-user: translate the result of getsockopt SO_TYPE
> > linux-user: support SO_ACCEPTCONN getsockopt option
> > linux-user: support SO_{SND,RCV}BUFFORCE setsockopt options
> > linux-user: support SO_PASSSEC setsockopt option
> > linux-user: allow NULL arguments to mount
> > linux-user: support strace of epoll_create1
> > linux-user: fix struct target_epoll_event layout for MIPS
> > linux-user: respect timezone for settimeofday
> > linux-user: allow NULL tv argument for settimeofday
> > linux-user: support timerfd_{create,gettime,settime} syscalls
> > linux-user: support ioprio_{get,set} syscalls
> > linux-user: support {name_to,open_by}_handle_at syscalls
> > linux-user: support the setns syscall
> > linux-user: support the unshare syscall
> > linux-user: support the KDSIGACCEPT ioctl
> > linux-user: support the SIOCGIFINDEX ioctl
> >
> > linux-user/ioctls.h | 2 +
> > linux-user/socket.h | 5 +
> > linux-user/strace.c | 30 +++++
> > linux-user/strace.list | 21 ++++
> > linux-user/syscall.c | 271 +++++++++++++++++++++++++++++++++++++++++-----
> > linux-user/syscall_defs.h | 9 +-
> > 6 files changed, 311 insertions(+), 27 deletions(-)
> >
> > --
> > 2.0.0
^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2014-08-05 11:33 UTC | newest]
Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-21 22:52 [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 01/16] linux-user: translate the result of getsockopt SO_TYPE Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 02/16] linux-user: support SO_ACCEPTCONN getsockopt option Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 03/16] linux-user: support SO_{SND, RCV}BUFFORCE setsockopt options Paul Burton
2014-06-21 22:52 ` [Qemu-devel] [PATCH v2 04/16] linux-user: support SO_PASSSEC setsockopt option Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 05/16] linux-user: allow NULL arguments to mount Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 06/16] linux-user: support strace of epoll_create1 Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 07/16] linux-user: fix struct target_epoll_event layout for MIPS Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 08/16] linux-user: respect timezone for settimeofday Paul Burton
2014-06-21 23:18 ` Peter Maydell
2014-06-22 10:11 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 09/16] linux-user: allow NULL tv argument " Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 10/16] linux-user: support timerfd_{create, gettime, settime} syscalls Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 11/16] linux-user: support ioprio_{get, set} syscalls Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 12/16] linux-user: support {name_to, open_by}_handle_at syscalls Paul Burton
2014-06-27 13:26 ` Riku Voipio
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 13/16] linux-user: support the setns syscall Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 14/16] linux-user: support the unshare syscall Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 15/16] linux-user: support the KDSIGACCEPT ioctl Paul Burton
2014-06-21 23:13 ` Peter Maydell
2014-06-22 10:08 ` Paul Burton
2014-06-21 22:53 ` [Qemu-devel] [PATCH v2 16/16] linux-user: support the SIOCGIFINDEX ioctl Paul Burton
2014-06-27 13:30 ` [Qemu-devel] [PATCH v2 00/16] linux-user fixes & improvements Riku Voipio
2014-08-05 11:33 ` Riku Voipio
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.