Module: xenomai-forge
Branch: next
Commit: 36ec4bdc4217a0d028dd4f5214b8f88a2e2a0a5f
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=36ec4bdc4217a0d028dd4f5214b8f88a2e2a0a5f

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu May 29 15:13:06 2014 +0200

cobalt/bufd: detect bad calling context early

---

 include/cobalt/kernel/assert.h |    1 +
 kernel/cobalt/bufd.c           |   10 ++++++----
 kernel/cobalt/posix/monitor.c  |    1 +
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h
index 6a3b642..52ddc14 100644
--- a/include/cobalt/kernel/assert.h
+++ b/include/cobalt/kernel/assert.h
@@ -87,6 +87,7 @@
 #define atomic_only()          XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) 
&& hard_irqs_disabled()) == 0)
 #define preemptible_only()     XENO_BUGON(CONTEXT, xnlock_is_owner(&nklock) || 
hard_irqs_disabled())
 #define realtime_cpu_only()    XENO_BUGON(CONTEXT, 
!xnsched_supported_cpu(ipipe_processor_id()))
+#define thread_only()          XENO_BUGON(CONTEXT, xnsched_interrupt_p())
 
 void __xnsys_assert_failed(const char *file, int line, const char *msg);
 
diff --git a/kernel/cobalt/bufd.c b/kernel/cobalt/bufd.c
index cea140f..f09881a 100644
--- a/kernel/cobalt/bufd.c
+++ b/kernel/cobalt/bufd.c
@@ -300,6 +300,8 @@ ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, 
size_t len)
 {
        caddr_t from;
 
+       thread_only();
+
        if (len == 0)
                goto out;
 
@@ -328,7 +330,7 @@ ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, 
size_t len)
         * here, since the source buffer would live in kernel space in
         * such a case.
         */
-       if (!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
+       if (current->mm == bufd->b_mm) {
                preemptible_only();
                if (__xn_safe_copy_from_user(to, (void __user *)from, len))
                        return -EFAULT;
@@ -341,7 +343,6 @@ ssize_t xnbufd_copy_to_kmem(void *to, struct xnbufd *bufd, 
size_t len)
 
 advance_offset:
        bufd->b_off += len;
-
 out:
        return (ssize_t)bufd->b_off;
 }
@@ -407,6 +408,8 @@ ssize_t xnbufd_copy_from_kmem(struct xnbufd *bufd, void 
*from, size_t len)
 {
        caddr_t to;
 
+       thread_only();
+
        if (len == 0)
                goto out;
 
@@ -433,7 +436,7 @@ ssize_t xnbufd_copy_from_kmem(struct xnbufd *bufd, void 
*from, size_t len)
         * here: feeding a RT activity with data from a non-RT context
         * is wrong in the first place, so never mind.
         */
-       if (!xnsched_interrupt_p() && current->mm == bufd->b_mm) {
+       if (current->mm == bufd->b_mm) {
                preemptible_only();
                if (__xn_safe_copy_to_user((void __user *)to, from, len))
                        return -EFAULT;
@@ -468,7 +471,6 @@ direct_copy:
 
 advance_offset:
        bufd->b_off += len;
-
 out:
        return (ssize_t)bufd->b_off;
 }
diff --git a/kernel/cobalt/posix/monitor.c b/kernel/cobalt/posix/monitor.c
index 5507829..3a9ddab 100644
--- a/kernel/cobalt/posix/monitor.c
+++ b/kernel/cobalt/posix/monitor.c
@@ -53,6 +53,7 @@
 #include "thread.h"
 #include "clock.h"
 #include "monitor.h"
+#include <trace/events/cobalt-posix.h>
 
 int cobalt_monitor_init(struct cobalt_monitor_shadow __user *u_mon,
                        clockid_t clk_id, int flags)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to