[Xenomai-git] Philippe Gerum : cobalt/posix: 32bit syscall wrappers

2014-10-30 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: e34b18e0f5de26254b774977acae119cbd7f1f1d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e34b18e0f5de26254b774977acae119cbd7f1f1d

Author: Philippe Gerum r...@xenomai.org
Date:   Thu Oct 16 14:43:59 2014 +0200

cobalt/posix: 32bit syscall wrappers

---

 kernel/cobalt/posix/Makefile|2 +-
 kernel/cobalt/posix/syscall32.c | 1149 ++-
 kernel/cobalt/posix/syscall32.h |  267 +
 3 files changed, 1403 insertions(+), 15 deletions(-)

diff --git a/kernel/cobalt/posix/Makefile b/kernel/cobalt/posix/Makefile
index e965846..22d5f2b 100644
--- a/kernel/cobalt/posix/Makefile
+++ b/kernel/cobalt/posix/Makefile
@@ -20,6 +20,6 @@ xenomai-y :=  \
timer.o \
timerfd.o
 
-xenomai-$(CONFIG_XENO_OPT_SYS3264) += syscall32.o
+xenomai-$(CONFIG_XENO_ARCH_SYS3264) += syscall32.o
 
 ccflags-y := -Iarch/$(SRCARCH)/xenomai/include -Iinclude/xenomai -Ikernel
diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
index 3b0b71c..603c379 100644
--- a/kernel/cobalt/posix/syscall32.c
+++ b/kernel/cobalt/posix/syscall32.c
@@ -17,19 +17,1140 @@
  */
 #include linux/types.h
 #include linux/err.h
-#include linux/compat.h
 #include cobalt/uapi/syscall.h
+#include xenomai/rtdm/internal.h
 #include internal.h
-#include thread.h
-#include sched.h
-#include mutex.h
-#include cond.h
-#include mqueue.h
-#include sem.h
-#include signal.h
-#include timer.h
-#include monitor.h
-#include clock.h
-#include event.h
-#include timerfd.h
-#include io.h
+#include syscall32.h
+#include ../debug.h
+
+static int sys32_get_timespec(struct timespec *ts,
+ const struct compat_timespec __user *cts)
+{
+   return (cts == NULL ||
+   !access_rok(cts, sizeof(*cts)) ||
+   __xn_get_user(ts-tv_sec, cts-tv_sec) ||
+   __xn_get_user(ts-tv_nsec, cts-tv_nsec)) ? -EFAULT : 0;
+}
+
+static int sys32_put_timespec(struct compat_timespec __user *cts,
+ const struct timespec *ts)
+{
+   return (cts == NULL ||
+   !access_wok(cts, sizeof(*cts)) ||
+   __xn_put_user(ts-tv_sec, cts-tv_sec) ||
+   __xn_put_user(ts-tv_nsec, cts-tv_nsec)) ? -EFAULT : 0;
+}
+
+static int sys32_get_itimerspec(struct itimerspec *its,
+   const struct compat_itimerspec __user *cits)
+{
+   int ret = sys32_get_timespec(its-it_value, cits-it_value);
+
+   return ret ?: sys32_get_timespec(its-it_interval, cits-it_interval);
+}
+
+static int sys32_put_itimerspec(struct compat_itimerspec __user *cits,
+   const struct itimerspec *its)
+{
+   int ret = sys32_put_timespec(cits-it_value, its-it_value);
+
+   return ret ?: sys32_put_timespec(cits-it_interval, its-it_interval);
+}
+
+static int sys32_get_timeval(struct timeval *tv,
+const struct compat_timeval __user *ctv)
+{
+   return (ctv == NULL ||
+   !access_rok(ctv, sizeof(*ctv)) ||
+   __xn_get_user(tv-tv_sec, ctv-tv_sec) ||
+   __xn_get_user(tv-tv_usec, ctv-tv_usec)) ? -EFAULT : 0;
+}
+
+static int sys32_put_timeval(struct compat_timeval __user *ctv,
+const struct timeval *tv)
+{
+   return (ctv == NULL ||
+   !access_wok(ctv, sizeof(*ctv)) ||
+   __xn_put_user(tv-tv_sec, ctv-tv_sec) ||
+   __xn_put_user(tv-tv_usec, ctv-tv_usec)) ? -EFAULT : 0;
+}
+
+static ssize_t sys32_get_fdset(fd_set *fds, const compat_fd_set __user *cfds,
+  size_t cfdsize)
+{
+   int rdpos, wrpos, rdlim = cfdsize / sizeof(compat_ulong_t);
+
+   if (cfds == NULL || !access_rok(cfds, cfdsize))
+   return -EFAULT;
+
+   for (rdpos = 0, wrpos = 0; rdpos  rdlim; rdpos++, wrpos++)
+   if (__xn_get_user(fds-fds_bits[wrpos], cfds-fds_bits + rdpos))
+   return -EFAULT;
+
+   return (ssize_t)rdlim * sizeof(long);
+}
+
+static ssize_t sys32_put_fdset(compat_fd_set __user *cfds, const fd_set *fds,
+  size_t fdsize)
+{
+   int rdpos, wrpos, wrlim = fdsize / sizeof(long);
+
+   if (cfds == NULL || !access_wok(cfds, wrlim * sizeof(compat_ulong_t)))
+   return -EFAULT;
+
+   for (rdpos = 0, wrpos = 0; wrpos  wrlim; rdpos++, wrpos++)
+   if (__xn_put_user(fds-fds_bits[rdpos], cfds-fds_bits + wrpos))
+   return -EFAULT;
+
+   return (ssize_t)wrlim * sizeof(compat_ulong_t);
+}
+
+static int sys32_get_param_ex(int policy,
+ struct sched_param_ex *p,
+ const struct compat_sched_param_ex __user *u_cp)
+{
+   struct compat_sched_param_ex cpex;
+
+   if (u_cp == NULL || __xn_safe_copy_from_user(cpex, u_cp, sizeof(cpex)))
+   return -EFAULT;
+
+   p-sched_priority = 

[Xenomai-git] Philippe Gerum : cobalt/posix: 32bit syscall wrappers

2014-10-25 Thread git repository hosting
Module: xenomai-3
Branch: next
Commit: e34b18e0f5de26254b774977acae119cbd7f1f1d
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e34b18e0f5de26254b774977acae119cbd7f1f1d

Author: Philippe Gerum r...@xenomai.org
Date:   Thu Oct 16 14:43:59 2014 +0200

cobalt/posix: 32bit syscall wrappers

---

 kernel/cobalt/posix/Makefile|2 +-
 kernel/cobalt/posix/syscall32.c | 1149 ++-
 kernel/cobalt/posix/syscall32.h |  267 +
 3 files changed, 1403 insertions(+), 15 deletions(-)

diff --git a/kernel/cobalt/posix/Makefile b/kernel/cobalt/posix/Makefile
index e965846..22d5f2b 100644
--- a/kernel/cobalt/posix/Makefile
+++ b/kernel/cobalt/posix/Makefile
@@ -20,6 +20,6 @@ xenomai-y :=  \
timer.o \
timerfd.o
 
-xenomai-$(CONFIG_XENO_OPT_SYS3264) += syscall32.o
+xenomai-$(CONFIG_XENO_ARCH_SYS3264) += syscall32.o
 
 ccflags-y := -Iarch/$(SRCARCH)/xenomai/include -Iinclude/xenomai -Ikernel
diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
index 3b0b71c..603c379 100644
--- a/kernel/cobalt/posix/syscall32.c
+++ b/kernel/cobalt/posix/syscall32.c
@@ -17,19 +17,1140 @@
  */
 #include linux/types.h
 #include linux/err.h
-#include linux/compat.h
 #include cobalt/uapi/syscall.h
+#include xenomai/rtdm/internal.h
 #include internal.h
-#include thread.h
-#include sched.h
-#include mutex.h
-#include cond.h
-#include mqueue.h
-#include sem.h
-#include signal.h
-#include timer.h
-#include monitor.h
-#include clock.h
-#include event.h
-#include timerfd.h
-#include io.h
+#include syscall32.h
+#include ../debug.h
+
+static int sys32_get_timespec(struct timespec *ts,
+ const struct compat_timespec __user *cts)
+{
+   return (cts == NULL ||
+   !access_rok(cts, sizeof(*cts)) ||
+   __xn_get_user(ts-tv_sec, cts-tv_sec) ||
+   __xn_get_user(ts-tv_nsec, cts-tv_nsec)) ? -EFAULT : 0;
+}
+
+static int sys32_put_timespec(struct compat_timespec __user *cts,
+ const struct timespec *ts)
+{
+   return (cts == NULL ||
+   !access_wok(cts, sizeof(*cts)) ||
+   __xn_put_user(ts-tv_sec, cts-tv_sec) ||
+   __xn_put_user(ts-tv_nsec, cts-tv_nsec)) ? -EFAULT : 0;
+}
+
+static int sys32_get_itimerspec(struct itimerspec *its,
+   const struct compat_itimerspec __user *cits)
+{
+   int ret = sys32_get_timespec(its-it_value, cits-it_value);
+
+   return ret ?: sys32_get_timespec(its-it_interval, cits-it_interval);
+}
+
+static int sys32_put_itimerspec(struct compat_itimerspec __user *cits,
+   const struct itimerspec *its)
+{
+   int ret = sys32_put_timespec(cits-it_value, its-it_value);
+
+   return ret ?: sys32_put_timespec(cits-it_interval, its-it_interval);
+}
+
+static int sys32_get_timeval(struct timeval *tv,
+const struct compat_timeval __user *ctv)
+{
+   return (ctv == NULL ||
+   !access_rok(ctv, sizeof(*ctv)) ||
+   __xn_get_user(tv-tv_sec, ctv-tv_sec) ||
+   __xn_get_user(tv-tv_usec, ctv-tv_usec)) ? -EFAULT : 0;
+}
+
+static int sys32_put_timeval(struct compat_timeval __user *ctv,
+const struct timeval *tv)
+{
+   return (ctv == NULL ||
+   !access_wok(ctv, sizeof(*ctv)) ||
+   __xn_put_user(tv-tv_sec, ctv-tv_sec) ||
+   __xn_put_user(tv-tv_usec, ctv-tv_usec)) ? -EFAULT : 0;
+}
+
+static ssize_t sys32_get_fdset(fd_set *fds, const compat_fd_set __user *cfds,
+  size_t cfdsize)
+{
+   int rdpos, wrpos, rdlim = cfdsize / sizeof(compat_ulong_t);
+
+   if (cfds == NULL || !access_rok(cfds, cfdsize))
+   return -EFAULT;
+
+   for (rdpos = 0, wrpos = 0; rdpos  rdlim; rdpos++, wrpos++)
+   if (__xn_get_user(fds-fds_bits[wrpos], cfds-fds_bits + rdpos))
+   return -EFAULT;
+
+   return (ssize_t)rdlim * sizeof(long);
+}
+
+static ssize_t sys32_put_fdset(compat_fd_set __user *cfds, const fd_set *fds,
+  size_t fdsize)
+{
+   int rdpos, wrpos, wrlim = fdsize / sizeof(long);
+
+   if (cfds == NULL || !access_wok(cfds, wrlim * sizeof(compat_ulong_t)))
+   return -EFAULT;
+
+   for (rdpos = 0, wrpos = 0; wrpos  wrlim; rdpos++, wrpos++)
+   if (__xn_put_user(fds-fds_bits[rdpos], cfds-fds_bits + wrpos))
+   return -EFAULT;
+
+   return (ssize_t)wrlim * sizeof(compat_ulong_t);
+}
+
+static int sys32_get_param_ex(int policy,
+ struct sched_param_ex *p,
+ const struct compat_sched_param_ex __user *u_cp)
+{
+   struct compat_sched_param_ex cpex;
+
+   if (u_cp == NULL || __xn_safe_copy_from_user(cpex, u_cp, sizeof(cpex)))
+   return -EFAULT;
+
+   p-sched_priority =