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