[Xenomai-git] Philippe Gerum : drivers/timerbench: fix 32/64bit neutrality issue

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

Author: Philippe Gerum 
Date:   Thu Oct 30 10:02:35 2014 +0100

drivers/timerbench: fix 32/64bit neutrality issue

---

 include/cobalt/kernel/rtdm/testing.h |   16 
 kernel/drivers/testing/timerbench.c  |  141 ++
 2 files changed, 108 insertions(+), 49 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/testing.h 
b/include/cobalt/kernel/rtdm/testing.h
index 6a66990..2cf96a2 100644
--- a/include/cobalt/kernel/rtdm/testing.h
+++ b/include/cobalt/kernel/rtdm/testing.h
@@ -22,4 +22,20 @@
 #include 
 #include 
 
+#ifdef CONFIG_COMPAT
+
+#include 
+
+struct compat_rttst_overall_bench_res {
+   struct rttst_bench_res result;
+   compat_uptr_t histogram_avg;
+   compat_uptr_t histogram_min;
+   compat_uptr_t histogram_max;
+};
+
+#define RTTST_RTIOC_TMBENCH_STOP_COMPAT \
+   _IOWR(RTIOC_TYPE_TESTING, 0x11, struct compat_rttst_overall_bench_res)
+
+#endif /* CONFIG_COMPAT */
+
 #endif /* !_COBALT_RTDM_TESTING_H */
diff --git a/kernel/drivers/testing/timerbench.c 
b/kernel/drivers/testing/timerbench.c
index 9dc0e3e..bc4f35d 100644
--- a/kernel/drivers/testing/timerbench.c
+++ b/kernel/drivers/testing/timerbench.c
@@ -315,11 +315,86 @@ static int rt_tmbench_start(struct rtdm_fd *fd,
return err;
 }
 
-static int rt_tmbench_stop(struct rt_tmbench_context *ctx,
-  struct rttst_overall_bench_res __user *user_res)
+static int kernel_copy_results(struct rt_tmbench_context *ctx,
+  struct rttst_overall_bench_res *res)
+{
+   int size;
+
+   memcpy(&res->result, &ctx->result.overall, sizeof(res->result));
+
+   if (ctx->histogram_size > 0) {
+   size = ctx->histogram_size * sizeof(int32_t);
+   memcpy(res->histogram_min, ctx->histogram_min, size);
+   memcpy(res->histogram_max, ctx->histogram_max, size);
+   memcpy(res->histogram_avg, ctx->histogram_avg, size);
+   kfree(ctx->histogram_min);
+   }
+
+   return 0;
+}
+
+static int user_copy_results(struct rt_tmbench_context *ctx,
+struct rttst_overall_bench_res __user *u_res)
 {
struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
-   int err = 0;
+   struct rttst_overall_bench_res res_buf;
+   int ret, size;
+
+   ret = rtdm_safe_copy_to_user(fd, &u_res->result,
+&ctx->result.overall,
+sizeof(u_res->result));
+   if (ret || ctx->histogram_size == 0)
+   return ret;
+
+   size = ctx->histogram_size * sizeof(int32_t);
+
+   if (rtdm_safe_copy_from_user(fd, &res_buf, u_res, sizeof(res_buf)) < 0 
||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_min,
+  ctx->histogram_min, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_max,
+  ctx->histogram_max, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_avg,
+  ctx->histogram_avg, size) < 0)
+   return -EFAULT;
+
+   return 0;
+}
+
+#ifdef CONFIG_COMPAT
+
+static int compat_user_copy_results(struct rt_tmbench_context *ctx,
+   struct compat_rttst_overall_bench_res 
__user *u_res)
+{
+   struct compat_rttst_overall_bench_res res_buf;
+   struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
+   int ret, size;
+
+   ret = rtdm_safe_copy_to_user(fd, &u_res->result,
+&ctx->result.overall,
+sizeof(u_res->result));
+   if (ret || ctx->histogram_size == 0)
+   return ret;
+
+   size = ctx->histogram_size * sizeof(int32_t);
+
+   if (rtdm_safe_copy_from_user(fd, &res_buf, u_res, sizeof(res_buf)) < 0 
||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_min),
+  ctx->histogram_min, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_max),
+  ctx->histogram_max, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_avg),
+  ctx->histogram_avg, size) < 0)
+   return -EFAULT;
+
+   return 0;
+}
+
+#endif /* CONFIG_COMPAT */
+
+static int rt_tmbench_stop(struct rt_tmbench_context *ctx, void *u_res)
+{
+   struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
+   int ret;
 
down(&ctx->nrt_mutex);
 
@@ -342,54 +417,22 @@ static int rt_tmbench_stop(struct rt_tmbench_context *ctx,
   ((ctx->result.overall.test_loops) > 1 ?
ctx->result.overall.test_loops : 2) - 1);
 
-   if (rtdm_fd_is_user(fd))
-   err

[Xenomai-git] Philippe Gerum : drivers/timerbench: fix 32/64bit neutrality issue

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

Author: Philippe Gerum 
Date:   Thu Oct 30 10:02:35 2014 +0100

drivers/timerbench: fix 32/64bit neutrality issue

---

 include/cobalt/kernel/rtdm/testing.h |   16 
 kernel/drivers/testing/timerbench.c  |  141 ++
 2 files changed, 108 insertions(+), 49 deletions(-)

diff --git a/include/cobalt/kernel/rtdm/testing.h 
b/include/cobalt/kernel/rtdm/testing.h
index 6a66990..2cf96a2 100644
--- a/include/cobalt/kernel/rtdm/testing.h
+++ b/include/cobalt/kernel/rtdm/testing.h
@@ -22,4 +22,20 @@
 #include 
 #include 
 
+#ifdef CONFIG_COMPAT
+
+#include 
+
+struct compat_rttst_overall_bench_res {
+   struct rttst_bench_res result;
+   compat_uptr_t histogram_avg;
+   compat_uptr_t histogram_min;
+   compat_uptr_t histogram_max;
+};
+
+#define RTTST_RTIOC_TMBENCH_STOP_COMPAT \
+   _IOWR(RTIOC_TYPE_TESTING, 0x11, struct compat_rttst_overall_bench_res)
+
+#endif /* CONFIG_COMPAT */
+
 #endif /* !_COBALT_RTDM_TESTING_H */
diff --git a/kernel/drivers/testing/timerbench.c 
b/kernel/drivers/testing/timerbench.c
index 9dc0e3e..bc4f35d 100644
--- a/kernel/drivers/testing/timerbench.c
+++ b/kernel/drivers/testing/timerbench.c
@@ -315,11 +315,86 @@ static int rt_tmbench_start(struct rtdm_fd *fd,
return err;
 }
 
-static int rt_tmbench_stop(struct rt_tmbench_context *ctx,
-  struct rttst_overall_bench_res __user *user_res)
+static int kernel_copy_results(struct rt_tmbench_context *ctx,
+  struct rttst_overall_bench_res *res)
+{
+   int size;
+
+   memcpy(&res->result, &ctx->result.overall, sizeof(res->result));
+
+   if (ctx->histogram_size > 0) {
+   size = ctx->histogram_size * sizeof(int32_t);
+   memcpy(res->histogram_min, ctx->histogram_min, size);
+   memcpy(res->histogram_max, ctx->histogram_max, size);
+   memcpy(res->histogram_avg, ctx->histogram_avg, size);
+   kfree(ctx->histogram_min);
+   }
+
+   return 0;
+}
+
+static int user_copy_results(struct rt_tmbench_context *ctx,
+struct rttst_overall_bench_res __user *u_res)
 {
struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
-   int err = 0;
+   struct rttst_overall_bench_res res_buf;
+   int ret, size;
+
+   ret = rtdm_safe_copy_to_user(fd, &u_res->result,
+&ctx->result.overall,
+sizeof(u_res->result));
+   if (ret || ctx->histogram_size == 0)
+   return ret;
+
+   size = ctx->histogram_size * sizeof(int32_t);
+
+   if (rtdm_safe_copy_from_user(fd, &res_buf, u_res, sizeof(res_buf)) < 0 
||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_min,
+  ctx->histogram_min, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_max,
+  ctx->histogram_max, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, res_buf.histogram_avg,
+  ctx->histogram_avg, size) < 0)
+   return -EFAULT;
+
+   return 0;
+}
+
+#ifdef CONFIG_COMPAT
+
+static int compat_user_copy_results(struct rt_tmbench_context *ctx,
+   struct compat_rttst_overall_bench_res 
__user *u_res)
+{
+   struct compat_rttst_overall_bench_res res_buf;
+   struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
+   int ret, size;
+
+   ret = rtdm_safe_copy_to_user(fd, &u_res->result,
+&ctx->result.overall,
+sizeof(u_res->result));
+   if (ret || ctx->histogram_size == 0)
+   return ret;
+
+   size = ctx->histogram_size * sizeof(int32_t);
+
+   if (rtdm_safe_copy_from_user(fd, &res_buf, u_res, sizeof(res_buf)) < 0 
||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_min),
+  ctx->histogram_min, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_max),
+  ctx->histogram_max, size) < 0 ||
+   rtdm_safe_copy_to_user(fd, compat_ptr(res_buf.histogram_avg),
+  ctx->histogram_avg, size) < 0)
+   return -EFAULT;
+
+   return 0;
+}
+
+#endif /* CONFIG_COMPAT */
+
+static int rt_tmbench_stop(struct rt_tmbench_context *ctx, void *u_res)
+{
+   struct rtdm_fd *fd = rtdm_private_to_fd(ctx);
+   int ret;
 
down(&ctx->nrt_mutex);
 
@@ -342,54 +417,22 @@ static int rt_tmbench_stop(struct rt_tmbench_context *ctx,
   ((ctx->result.overall.test_loops) > 1 ?
ctx->result.overall.test_loops : 2) - 1);
 
-   if (rtdm_fd_is_user(fd))
-   err =