* [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify @ 2008-12-13 12:39 Lionel Landwerlin 2008-12-14 18:11 ` Kirill A. Shutemov 0 siblings, 1 reply; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-13 12:39 UTC (permalink / raw) To: qemu-devel >From 57a528de47a737e59f391ff7df2f87367b40529e Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> Date: Mon, 1 Dec 2008 02:42:24 +0100 Subject: [PATCH] Added posix message queue syscalls except mq_notify Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> --- linux-user/syscall.c | 151 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 117 insertions(+), 0 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 4065917..c4dd38a 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -28,6 +28,7 @@ #include <fcntl.h> #include <time.h> #include <limits.h> +#include <mqueue.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> @@ -629,6 +630,43 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, return 0; } +static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, + abi_ulong target_mq_attr_addr) +{ + struct mq_attr *target_mq_attr; + + if (!lock_user_struct(VERIFY_READ, target_mq_attr, + target_mq_attr_addr, 1)) + return -TARGET_EFAULT; + + __get_user(attr->mq_flags, &target_mq_attr->mq_flags); + __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); + __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); + __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); + + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0); + + return 0; +} + +static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr, + const struct mq_attr *attr) +{ + struct mq_attr *target_mq_attr; + + if (!lock_user_struct(VERIFY_WRITE, target_mq_attr, + target_mq_attr_addr, 0)) + return -TARGET_EFAULT; + + __put_user(attr->mq_flags, &target_mq_attr->mq_flags); + __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); + __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); + __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); + + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1); + + return 0; +} /* do_select() must return target values and target errnos. */ static abi_long do_select(int n, @@ -6033,6 +6071,85 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; #endif +#ifdef TARGET_NR_mq_open + case TARGET_NR_mq_open: + { + struct mq_attr posix_mq_attr; + + p = lock_user_string(arg1 - 1); + if (arg4 != 0) + copy_from_user_mq_attr (&posix_mq_attr, arg4); + ret = get_errno(mq_open(p, arg2, arg3, &posix_mq_attr)); + unlock_user (p, arg1, 0); + break; + } + + case TARGET_NR_mq_unlink: + p = lock_user_string(arg1 - 1); + ret = get_errno(mq_unlink(p)); + unlock_user (p, arg1, 0); + break; + + case TARGET_NR_mq_timedsend: + { + struct timespec ts; + + if (arg5 != 0) { + p = lock_user (VERIFY_READ, arg2, arg3, 1); + target_to_host_timespec(&ts, arg5); + ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts)); + host_to_target_timespec(arg5, &ts); + unlock_user (p, arg2, arg3); + } else { + p = lock_user (VERIFY_READ, arg2, arg3, 1); + ret = get_errno(mq_send(arg1, p, arg3, arg4)); + unlock_user (p, arg2, arg3); + } + break; + } + + case TARGET_NR_mq_timedreceive: + { + struct timespec ts; + unsigned int prio; + + if (arg5 != 0) { + p = lock_user (VERIFY_READ, arg2, arg3, 1); + target_to_host_timespec(&ts, arg5); + ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts)); + host_to_target_timespec(arg5, &ts); + unlock_user (p, arg2, arg3); + } else { + p = lock_user (VERIFY_READ, arg2, arg3, 1); + ret = get_errno(mq_receive(arg1, p, arg3, &prio)); + unlock_user (p, arg2, arg3); + } + if (arg4 != 0) + put_user_u32(prio, arg4); + break; + } + + /* Not implemented for now... */ +/* case TARGET_NR_mq_notify: */ +/* break; */ + + case TARGET_NR_mq_getsetattr: + { + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; + + if (arg3 != 0) { + ret = mq_getattr(arg1, &posix_mq_attr_out); + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); + } + if (arg2 != 0) { + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); + } + + break; + } +#endif + default: unimplemented: gemu_log("qemu: Unsupported syscall: %d\n", num); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-13 12:39 [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Lionel Landwerlin @ 2008-12-14 18:11 ` Kirill A. Shutemov 2008-12-14 19:19 ` Lionel Landwerlin 2008-12-15 21:01 ` Lionel Landwerlin 0 siblings, 2 replies; 13+ messages in thread From: Kirill A. Shutemov @ 2008-12-14 18:11 UTC (permalink / raw) To: qemu-devel [-- Attachment #1: Type: text/plain, Size: 5761 bytes --] On Sat, Dec 13, 2008 at 01:39:27PM +0100, Lionel Landwerlin wrote: > >From 57a528de47a737e59f391ff7df2f87367b40529e Mon Sep 17 00:00:00 2001 > From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > Date: Mon, 1 Dec 2008 02:42:24 +0100 > Subject: [PATCH] Added posix message queue syscalls except mq_notify > > Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > > --- > linux-user/syscall.c | 151 ++++++++++++++++++++++++++++++++++++++++++++------ > 1 files changed, 117 insertions(+), 0 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 4065917..c4dd38a 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -28,6 +28,7 @@ > #include <fcntl.h> > #include <time.h> > #include <limits.h> > +#include <mqueue.h> > #include <sys/types.h> > #include <sys/ipc.h> > #include <sys/msg.h> > @@ -629,6 +630,43 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, > return 0; > } > > +static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, > + abi_ulong target_mq_attr_addr) > +{ > + struct mq_attr *target_mq_attr; It's wrong. struct mq_attr has long int fields, so you should define struct target_mq_attr using abi_long. > + > + if (!lock_user_struct(VERIFY_READ, target_mq_attr, > + target_mq_attr_addr, 1)) > + return -TARGET_EFAULT; > + > + __get_user(attr->mq_flags, &target_mq_attr->mq_flags); > + __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); > + __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); > + __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); > + > + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0); > + > + return 0; > +} > + > +static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr, > + const struct mq_attr *attr) > +{ > + struct mq_attr *target_mq_attr; > + > + if (!lock_user_struct(VERIFY_WRITE, target_mq_attr, > + target_mq_attr_addr, 0)) > + return -TARGET_EFAULT; > + > + __put_user(attr->mq_flags, &target_mq_attr->mq_flags); > + __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); > + __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); > + __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); > + > + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1); > + > + return 0; > +} > > /* do_select() must return target values and target errnos. */ > static abi_long do_select(int n, > @@ -6033,6 +6071,85 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > break; > #endif > > +#ifdef TARGET_NR_mq_open > + case TARGET_NR_mq_open: > + { > + struct mq_attr posix_mq_attr; > + > + p = lock_user_string(arg1 - 1); Why - 1? > + if (arg4 != 0) > + copy_from_user_mq_attr (&posix_mq_attr, arg4); > + ret = get_errno(mq_open(p, arg2, arg3, &posix_mq_attr)); > + unlock_user (p, arg1, 0); > + break; > + } > + > + case TARGET_NR_mq_unlink: > + p = lock_user_string(arg1 - 1); ? > + ret = get_errno(mq_unlink(p)); > + unlock_user (p, arg1, 0); > + break; > + > + case TARGET_NR_mq_timedsend: > + { > + struct timespec ts; > + > + if (arg5 != 0) { > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > + target_to_host_timespec(&ts, arg5); > + ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts)); > + host_to_target_timespec(arg5, &ts); > + unlock_user (p, arg2, arg3); > + } else { > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > + ret = get_errno(mq_send(arg1, p, arg3, arg4)); > + unlock_user (p, arg2, arg3); > + } We can lock and unlock outside of if startament, I think. > + break; > + } > + > + case TARGET_NR_mq_timedreceive: > + { > + struct timespec ts; > + unsigned int prio; > + > + if (arg5 != 0) { > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > + target_to_host_timespec(&ts, arg5); > + ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts)); > + host_to_target_timespec(arg5, &ts); > + unlock_user (p, arg2, arg3); > + } else { > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > + ret = get_errno(mq_receive(arg1, p, arg3, &prio)); > + unlock_user (p, arg2, arg3); > + } The same about locking. > + if (arg4 != 0) > + put_user_u32(prio, arg4); > + break; > + } > + > + /* Not implemented for now... */ > +/* case TARGET_NR_mq_notify: */ > +/* break; */ Is there any problem with this syscall? > + > + case TARGET_NR_mq_getsetattr: > + { > + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; > + > + if (arg3 != 0) { > + ret = mq_getattr(arg1, &posix_mq_attr_out); > + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); > + } > + if (arg2 != 0) { > + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); > + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); > + } > + > + break; > + } > +#endif > + > default: > unimplemented: > gemu_log("qemu: Unsupported syscall: %d\n", num); > -- > 1.5.6.5 -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-14 18:11 ` Kirill A. Shutemov @ 2008-12-14 19:19 ` Lionel Landwerlin 2008-12-14 19:37 ` Kirill A. Shutemov 2008-12-15 21:01 ` Lionel Landwerlin 1 sibling, 1 reply; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-14 19:19 UTC (permalink / raw) To: qemu-devel Le dimanche 14 décembre 2008 à 20:11 +0200, Kirill A. Shutemov a écrit : > On Sat, Dec 13, 2008 at 01:39:27PM +0100, Lionel Landwerlin wrote: > > >From 57a528de47a737e59f391ff7df2f87367b40529e Mon Sep 17 00:00:00 2001 > > From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > > Date: Mon, 1 Dec 2008 02:42:24 +0100 > > Subject: [PATCH] Added posix message queue syscalls except mq_notify > > > > Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > > > > --- > > linux-user/syscall.c | 151 ++++++++++++++++++++++++++++++++++++++++++++------ > > 1 files changed, 117 insertions(+), 0 deletions(-) > > > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > > index 4065917..c4dd38a 100644 > > --- a/linux-user/syscall.c > > +++ b/linux-user/syscall.c > > @@ -28,6 +28,7 @@ > > #include <fcntl.h> > > #include <time.h> > > #include <limits.h> > > +#include <mqueue.h> > > #include <sys/types.h> > > #include <sys/ipc.h> > > #include <sys/msg.h> > > @@ -629,6 +630,43 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, > > return 0; > > } > > > > +static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, > > + abi_ulong target_mq_attr_addr) > > +{ > > + struct mq_attr *target_mq_attr; > > It's wrong. struct mq_attr has long int fields, so you should define > struct target_mq_attr using abi_long. I will do that, thx. > > > + > > + if (!lock_user_struct(VERIFY_READ, target_mq_attr, > > + target_mq_attr_addr, 1)) > > + return -TARGET_EFAULT; > > + > > + __get_user(attr->mq_flags, &target_mq_attr->mq_flags); > > + __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); > > + __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); > > + __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); > > + > > + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0); > > + > > + return 0; > > +} > > + > > +static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr, > > + const struct mq_attr *attr) > > +{ > > + struct mq_attr *target_mq_attr; > > + > > + if (!lock_user_struct(VERIFY_WRITE, target_mq_attr, > > + target_mq_attr_addr, 0)) > > + return -TARGET_EFAULT; > > + > > + __put_user(attr->mq_flags, &target_mq_attr->mq_flags); > > + __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); > > + __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); > > + __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); > > + > > + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1); > > + > > + return 0; > > +} > > > > /* do_select() must return target values and target errnos. */ > > static abi_long do_select(int n, > > @@ -6033,6 +6071,85 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > > break; > > #endif > > > > +#ifdef TARGET_NR_mq_open > > + case TARGET_NR_mq_open: > > + { > > + struct mq_attr posix_mq_attr; > > + > > + p = lock_user_string(arg1 - 1); > > Why - 1? Look at glibc/uclibc implementation, the string argument is (str + 1). > > > + if (arg4 != 0) > > + copy_from_user_mq_attr (&posix_mq_attr, arg4); > > + ret = get_errno(mq_open(p, arg2, arg3, &posix_mq_attr)); > > + unlock_user (p, arg1, 0); > > + break; > > + } > > + > > + case TARGET_NR_mq_unlink: > > + p = lock_user_string(arg1 - 1); > > ? Same thing. > > > + ret = get_errno(mq_unlink(p)); > > + unlock_user (p, arg1, 0); > > + break; > > + > > + case TARGET_NR_mq_timedsend: > > + { > > + struct timespec ts; > > + > > + if (arg5 != 0) { > > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > > + target_to_host_timespec(&ts, arg5); > > + ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts)); > > + host_to_target_timespec(arg5, &ts); > > + unlock_user (p, arg2, arg3); > > + } else { > > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > > + ret = get_errno(mq_send(arg1, p, arg3, arg4)); > > + unlock_user (p, arg2, arg3); > > + } > > We can lock and unlock outside of if startament, I think. Right. > > > + break; > > + } > > + > > + case TARGET_NR_mq_timedreceive: > > + { > > + struct timespec ts; > > + unsigned int prio; > > + > > + if (arg5 != 0) { > > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > > + target_to_host_timespec(&ts, arg5); > > + ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts)); > > + host_to_target_timespec(arg5, &ts); > > + unlock_user (p, arg2, arg3); > > + } else { > > + p = lock_user (VERIFY_READ, arg2, arg3, 1); > > + ret = get_errno(mq_receive(arg1, p, arg3, &prio)); > > + unlock_user (p, arg2, arg3); > > + } > > The same about locking. > > > + if (arg4 != 0) > > + put_user_u32(prio, arg4); > > + break; > > + } > > + > > + /* Not implemented for now... */ > > +/* case TARGET_NR_mq_notify: */ > > +/* break; */ > > Is there any problem with this syscall? This syscall is a little bit more complicated. The implementation would be a kind of signal handler. > > > + > > + case TARGET_NR_mq_getsetattr: > > + { > > + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; > > + > > + if (arg3 != 0) { > > + ret = mq_getattr(arg1, &posix_mq_attr_out); > > + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); > > + } > > + if (arg2 != 0) { > > + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); > > + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); > > + } > > + > > + break; > > + } > > +#endif > > + > > default: > > unimplemented: > > gemu_log("qemu: Unsupported syscall: %d\n", num); > > -- > > 1.5.6.5 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-14 19:19 ` Lionel Landwerlin @ 2008-12-14 19:37 ` Kirill A. Shutemov 2008-12-14 20:33 ` Lionel Landwerlin 0 siblings, 1 reply; 13+ messages in thread From: Kirill A. Shutemov @ 2008-12-14 19:37 UTC (permalink / raw) To: qemu-devel [-- Attachment #1: Type: text/plain, Size: 375 bytes --] On Sun, Dec 14, 2008 at 08:19:51PM +0100, Lionel Landwerlin wrote: > > > + p = lock_user_string(arg1 - 1); > > > > Why - 1? > > Look at glibc/uclibc implementation, the string argument is (str + 1). Hm.. Do you have any explanation why glibc/uclibc do so? -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-14 19:37 ` Kirill A. Shutemov @ 2008-12-14 20:33 ` Lionel Landwerlin 0 siblings, 0 replies; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-14 20:33 UTC (permalink / raw) To: qemu-devel Le dimanche 14 décembre 2008 à 21:37 +0200, Kirill A. Shutemov a écrit : > On Sun, Dec 14, 2008 at 08:19:51PM +0100, Lionel Landwerlin wrote: > > > > + p = lock_user_string(arg1 - 1); > > > > > > Why - 1? > > > > Look at glibc/uclibc implementation, the string argument is (str + 1). > > Hm.. Do you have any explanation why glibc/uclibc do so? > No idea... but you can't create directory in mqueue filesystem on Linux, that's maybe why it's not useful to give a / as everything is at root level. -- Lione Landwerlin O p e n W i d e 14, rue Gaillon 75002 Paris ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-14 18:11 ` Kirill A. Shutemov 2008-12-14 19:19 ` Lionel Landwerlin @ 2008-12-15 21:01 ` Lionel Landwerlin 2008-12-15 21:24 ` Kirill A. Shutemov 2009-01-12 12:12 ` [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Riku Voipio 1 sibling, 2 replies; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-15 21:01 UTC (permalink / raw) To: qemu-devel Le dimanche 14 décembre 2008 à 20:11 +0200, Kirill A. Shutemov a écrit : > On Sat, Dec 13, 2008 at 01:39:27PM +0100, Lionel Landwerlin wrote: Here is a second version of my patch for mq_open, mq_getsetattr, mq_timedsend, mq_timedreceive and mq_unlink syscalls. >From 2aaa1d66232da3bee0fcdac93bbab09f12ce4b19 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> Date: Mon, 1 Dec 2008 02:42:24 +0100 Subject: [PATCH] Added posix message queue syscalls except mq_notify Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> --- linux-user/syscall.c | 147 +++++++++++++++++++++++++++++++++++++++----- linux-user/syscall_defs.h | 9 +++- 2 files changed, 138 insertions(+), 18 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 73427ab..39f26b5 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -28,6 +28,7 @@ #include <fcntl.h> #include <time.h> #include <limits.h> +#include <mqueue.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> @@ -629,6 +630,43 @@ static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr, return 0; } +static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr, + abi_ulong target_mq_attr_addr) +{ + struct target_mq_attr *target_mq_attr; + + if (!lock_user_struct(VERIFY_READ, target_mq_attr, + target_mq_attr_addr, 1)) + return -TARGET_EFAULT; + + __get_user(attr->mq_flags, &target_mq_attr->mq_flags); + __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); + __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); + __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); + + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0); + + return 0; +} + +static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr, + const struct mq_attr *attr) +{ + struct target_mq_attr *target_mq_attr; + + if (!lock_user_struct(VERIFY_WRITE, target_mq_attr, + target_mq_attr_addr, 0)) + return -TARGET_EFAULT; + + __put_user(attr->mq_flags, &target_mq_attr->mq_flags); + __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg); + __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize); + __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs); + + unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1); + + return 0; +} /* do_select() must return target values and target errnos. */ static abi_long do_select(int n, @@ -6035,6 +6073,81 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; #endif +#ifdef TARGET_NR_mq_open + case TARGET_NR_mq_open: + { + struct mq_attr posix_mq_attr; + + p = lock_user_string(arg1 - 1); + if (arg4 != 0) + copy_from_user_mq_attr (&posix_mq_attr, arg4); + ret = get_errno(mq_open(p, arg2, arg3, &posix_mq_attr)); + unlock_user (p, arg1, 0); + break; + } + + case TARGET_NR_mq_unlink: + p = lock_user_string(arg1 - 1); + ret = get_errno(mq_unlink(p)); + unlock_user (p, arg1, 0); + break; + + case TARGET_NR_mq_timedsend: + { + struct timespec ts; + + p = lock_user (VERIFY_READ, arg2, arg3, 1); + if (arg5 != 0) { + target_to_host_timespec(&ts, arg5); + ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts)); + host_to_target_timespec(arg5, &ts); + } + else + ret = get_errno(mq_send(arg1, p, arg3, arg4)); + unlock_user (p, arg2, arg3); + break; + } + + case TARGET_NR_mq_timedreceive: + { + struct timespec ts; + unsigned int prio; + + p = lock_user (VERIFY_READ, arg2, arg3, 1); + if (arg5 != 0) { + target_to_host_timespec(&ts, arg5); + ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts)); + host_to_target_timespec(arg5, &ts); + } + else + ret = get_errno(mq_receive(arg1, p, arg3, &prio)); + unlock_user (p, arg2, arg3); + if (arg4 != 0) + put_user_u32(prio, arg4); + break; + } + + /* Not implemented for now... */ +/* case TARGET_NR_mq_notify: */ +/* break; */ + + case TARGET_NR_mq_getsetattr: + { + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; + + if (arg3 != 0) { + ret = mq_getattr(arg1, &posix_mq_attr_out); + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); + } + if (arg2 != 0) { + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); + } + + break; + } +#endif + default: unimplemented: gemu_log("qemu: Unsupported syscall: %d\n", num); diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 86c9d82..728fedb 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -1997,6 +1997,13 @@ struct linux_dirent64 { char d_name[256]; }; +struct target_mq_attr { + abi_long mq_flags; + abi_long mq_maxmsg; + abi_long mq_msgsize; + abi_long mq_curmsgs; +}; + #include "socket.h" #include "errno_defs.h" -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-15 21:01 ` Lionel Landwerlin @ 2008-12-15 21:24 ` Kirill A. Shutemov 2008-12-20 18:20 ` Lionel Landwerlin 2009-01-12 12:12 ` [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Riku Voipio 1 sibling, 1 reply; 13+ messages in thread From: Kirill A. Shutemov @ 2008-12-15 21:24 UTC (permalink / raw) To: qemu-devel [-- Attachment #1: Type: text/plain, Size: 1144 bytes --] On Mon, Dec 15, 2008 at 10:01:41PM +0100, Lionel Landwerlin wrote: > Le dimanche 14 décembre 2008 à 20:11 +0200, Kirill A. Shutemov a écrit : > > On Sat, Dec 13, 2008 at 01:39:27PM +0100, Lionel Landwerlin wrote: > > Here is a second version of my patch for mq_open, mq_getsetattr, > mq_timedsend, mq_timedreceive and mq_unlink syscalls. > > >From 2aaa1d66232da3bee0fcdac93bbab09f12ce4b19 Mon Sep 17 00:00:00 2001 > From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > Date: Mon, 1 Dec 2008 02:42:24 +0100 > Subject: [PATCH] Added posix message queue syscalls except mq_notify > > Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > --- > linux-user/syscall.c | 147 +++++++++++++++++++++++++++++++++++++++----- > linux-user/syscall_defs.h | 9 +++- > 2 files changed, 138 insertions(+), 18 deletions(-) Reviewed-by: Kirill A. Shutemov <kirill@shutemov.name> I also have added it to my patchset: http://git.altlinux.org/people/kas/packages/qemu.git?a=shortlog;h=refs/heads/for-upstream -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-15 21:24 ` Kirill A. Shutemov @ 2008-12-20 18:20 ` Lionel Landwerlin 2008-12-20 18:33 ` Kirill A. Shutemov 0 siblings, 1 reply; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-20 18:20 UTC (permalink / raw) To: qemu-devel; +Cc: Kirill A. Shutemov Here another patch to format mq_open strace arguments (very similar to the open format) : >From faec50221490c953c229f1614a37f7d45bfe0ec7 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> Date: Sat, 20 Dec 2008 19:15:58 +0100 Subject: [PATCH] Format mq_open strace arguments Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> --- linux-user/strace.list | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/linux-user/strace.list b/linux-user/strace.list index 09a801f..45eb24d 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -530,7 +530,7 @@ { TARGET_NR_mq_notify, "mq_notify" , NULL, NULL, NULL }, #endif #ifdef TARGET_NR_mq_open -{ TARGET_NR_mq_open, "mq_open" , NULL, NULL, NULL }, +{ TARGET_NR_mq_open, "mq_open" , "%s(\"/%s\",%#x,%#o,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_timedreceive { TARGET_NR_mq_timedreceive, "mq_timedreceive" , NULL, NULL, NULL }, -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-20 18:20 ` Lionel Landwerlin @ 2008-12-20 18:33 ` Kirill A. Shutemov 2008-12-20 20:20 ` [Qemu-devel] [PATCH] More strace formatting for posix message queues syscalls Lionel Landwerlin 0 siblings, 1 reply; 13+ messages in thread From: Kirill A. Shutemov @ 2008-12-20 18:33 UTC (permalink / raw) To: Lionel Landwerlin; +Cc: qemu-devel [-- Attachment #1: Type: text/plain, Size: 1359 bytes --] On Sat, Dec 20, 2008 at 07:20:55PM +0100, Lionel Landwerlin wrote: > Here another patch to format mq_open strace arguments (very similar to > the open format) : > > >From faec50221490c953c229f1614a37f7d45bfe0ec7 Mon Sep 17 00:00:00 2001 > From: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > Date: Sat, 20 Dec 2008 19:15:58 +0100 > Subject: [PATCH] Format mq_open strace arguments > > Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> > --- > linux-user/strace.list | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/linux-user/strace.list b/linux-user/strace.list > index 09a801f..45eb24d 100644 > --- a/linux-user/strace.list > +++ b/linux-user/strace.list > @@ -530,7 +530,7 @@ > { TARGET_NR_mq_notify, "mq_notify" , NULL, NULL, NULL }, > #endif > #ifdef TARGET_NR_mq_open > -{ TARGET_NR_mq_open, "mq_open" , NULL, NULL, NULL }, > +{ TARGET_NR_mq_open, "mq_open" , "%s(\"/%s\",%#x,%#o,%p)", NULL, NULL }, > #endif > #ifdef TARGET_NR_mq_timedreceive > { TARGET_NR_mq_timedreceive, "mq_timedreceive" , NULL, NULL, NULL }, > -- > 1.5.6.5 Reviewed-by: Kirill A. Shutemov <kirill@shutemov.name> Thanks. Added to my patchset. Please, use git send-email next time. -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH] More strace formatting for posix message queues syscalls 2008-12-20 18:33 ` Kirill A. Shutemov @ 2008-12-20 20:20 ` Lionel Landwerlin 2008-12-21 13:55 ` [Qemu-devel] " Kirill A. Shutemov 0 siblings, 1 reply; 13+ messages in thread From: Lionel Landwerlin @ 2008-12-20 20:20 UTC (permalink / raw) To: qemu-devel; +Cc: Kirill A. Shutemov More strace formatting for posix message queues syscalls Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> --- linux-user/strace.list | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/linux-user/strace.list b/linux-user/strace.list index 45eb24d..3f688db 100644 --- a/linux-user/strace.list +++ b/linux-user/strace.list @@ -524,22 +524,22 @@ { TARGET_NR_mpx, "mpx" , NULL, NULL, NULL }, #endif #ifdef TARGET_NR_mq_getsetattr -{ TARGET_NR_mq_getsetattr, "mq_getsetattr" , NULL, NULL, NULL }, +{ TARGET_NR_mq_getsetattr, "mq_getsetattr" , "%s(%d,%p,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_notify -{ TARGET_NR_mq_notify, "mq_notify" , NULL, NULL, NULL }, +{ TARGET_NR_mq_notify, "mq_notify" , "%s(%d,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_open { TARGET_NR_mq_open, "mq_open" , "%s(\"/%s\",%#x,%#o,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_timedreceive -{ TARGET_NR_mq_timedreceive, "mq_timedreceive" , NULL, NULL, NULL }, +{ TARGET_NR_mq_timedreceive, "mq_timedreceive" , "%s(%d,%p,%d,%u,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_timedsend -{ TARGET_NR_mq_timedsend, "mq_timedsend" , NULL, NULL, NULL }, +{ TARGET_NR_mq_timedsend, "mq_timedsend" , "%s(%d,%p,%d,%u,%p)", NULL, NULL }, #endif #ifdef TARGET_NR_mq_unlink -{ TARGET_NR_mq_unlink, "mq_unlink" , NULL, NULL, NULL }, +{ TARGET_NR_mq_unlink, "mq_unlink" , "%s(%s)", NULL, NULL }, #endif #ifdef TARGET_NR_mremap { TARGET_NR_mremap, "mremap" , NULL, NULL, NULL }, -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] Re: [PATCH] More strace formatting for posix message queues syscalls 2008-12-20 20:20 ` [Qemu-devel] [PATCH] More strace formatting for posix message queues syscalls Lionel Landwerlin @ 2008-12-21 13:55 ` Kirill A. Shutemov 0 siblings, 0 replies; 13+ messages in thread From: Kirill A. Shutemov @ 2008-12-21 13:55 UTC (permalink / raw) To: Lionel Landwerlin; +Cc: qemu-devel [-- Attachment #1: Type: text/plain, Size: 370 bytes --] On Sat, Dec 20, 2008 at 09:20:15PM +0100, Lionel Landwerlin wrote: > More strace formatting for posix message queues syscalls > > Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> Reviewed-by: Kirill A. Shutemov <kirill@shutemov.name> Thanks. -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2008-12-15 21:01 ` Lionel Landwerlin 2008-12-15 21:24 ` Kirill A. Shutemov @ 2009-01-12 12:12 ` Riku Voipio 2009-01-12 12:59 ` Kirill A. Shutemov 1 sibling, 1 reply; 13+ messages in thread From: Riku Voipio @ 2009-01-12 12:12 UTC (permalink / raw) To: Lionel Landwerlin; +Cc: qemu-devel On Mon, Dec 15, 2008 at 10:01:41PM +0100, Lionel Landwerlin wrote: > + case TARGET_NR_mq_getsetattr: > + { > + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; ret = 0; > + > + if (arg3 != 0) { > + ret = mq_getattr(arg1, &posix_mq_attr_out); > + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); > + } > + if (arg2 != 0) { > + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); > + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); > + } > + > + break; mq_getsetattr might end up called without both arg3 and arg2. Other than that, looks good to me. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify 2009-01-12 12:12 ` [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Riku Voipio @ 2009-01-12 12:59 ` Kirill A. Shutemov 0 siblings, 0 replies; 13+ messages in thread From: Kirill A. Shutemov @ 2009-01-12 12:59 UTC (permalink / raw) To: qemu-devel; +Cc: Lionel Landwerlin [-- Attachment #1: Type: text/plain, Size: 921 bytes --] On Mon, Jan 12, 2009 at 02:12:35PM +0200, Riku Voipio wrote: > > On Mon, Dec 15, 2008 at 10:01:41PM +0100, Lionel Landwerlin wrote: > > + case TARGET_NR_mq_getsetattr: > > + { > > + struct mq_attr posix_mq_attr_in, posix_mq_attr_out; > > ret = 0; > > > + > > + if (arg3 != 0) { > > + ret = mq_getattr(arg1, &posix_mq_attr_out); > > + copy_to_user_mq_attr(arg3, &posix_mq_attr_out); > > + } > > + if (arg2 != 0) { > > + copy_from_user_mq_attr(&posix_mq_attr_in, arg2); > > + ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out); > > + } > > + > > + break; > > mq_getsetattr might end up called without both arg3 and arg2. Other than > that, looks good to me. Fixed in my patchset. Thanks. -- Regards, Kirill A. Shutemov + Belarus, Minsk + ALT Linux Team, http://www.altlinux.org/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-01-12 12:56 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-13 12:39 [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Lionel Landwerlin 2008-12-14 18:11 ` Kirill A. Shutemov 2008-12-14 19:19 ` Lionel Landwerlin 2008-12-14 19:37 ` Kirill A. Shutemov 2008-12-14 20:33 ` Lionel Landwerlin 2008-12-15 21:01 ` Lionel Landwerlin 2008-12-15 21:24 ` Kirill A. Shutemov 2008-12-20 18:20 ` Lionel Landwerlin 2008-12-20 18:33 ` Kirill A. Shutemov 2008-12-20 20:20 ` [Qemu-devel] [PATCH] More strace formatting for posix message queues syscalls Lionel Landwerlin 2008-12-21 13:55 ` [Qemu-devel] " Kirill A. Shutemov 2009-01-12 12:12 ` [Qemu-devel] [linux-user] Added posix message queue syscalls except mq_notify Riku Voipio 2009-01-12 12:59 ` Kirill A. Shutemov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).