[Xenomai-git] Philippe Gerum : cobalt/shadow: sanitize ppd retrieval
Module: xenomai-forge Branch: next Commit: 74e853742ce919df6e35c9919354465c3982f7bb URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=74e853742ce919df6e35c9919354465c3982f7bb Author: Philippe Gerum Date: Tue Jan 7 13:15:49 2014 +0100 cobalt/shadow: sanitize ppd retrieval --- include/cobalt/kernel/assert.h |2 +- include/cobalt/kernel/ppd.h| 15 ++- kernel/cobalt/debug.c |3 --- kernel/cobalt/posix/internal.h |9 - kernel/cobalt/shadow.c | 17 + 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h index 63886a1..775ae1f 100644 --- a/include/cobalt/kernel/assert.h +++ b/include/cobalt/kernel/assert.h @@ -83,7 +83,7 @@ #define primary_mode_only()XENO_BUGON(CONTEXT, ipipe_root_p) #define secondary_mode_only() XENO_BUGON(CONTEXT, !ipipe_root_p) #define interrupt_only() XENO_BUGON(CONTEXT, !xnsched_interrupt_p()) -#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && spltest()) == 0) +#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && hard_irqs_disabled()) == 0) #define realtime_cpu_only()XENO_BUGON(CONTEXT, !xnsched_supported_cpu(ipipe_processor_id())) void __xnsys_assert_failed(const char *file, int line, const char *msg); diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..937f998 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -23,6 +23,7 @@ #include #include +#include #include struct mm_struct; @@ -53,7 +54,7 @@ struct xnsys_ppd { extern struct xnsys_ppd __xnsys_global_ppd; -static inline struct xnsys_ppd *xnsys_ppd_get(int global) +static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { struct xnshadow_ppd *ppd; @@ -63,4 +64,16 @@ static inline struct xnsys_ppd *xnsys_ppd_get(int global) return container_of(ppd, struct xnsys_ppd, ppd); } +static inline struct xnsys_ppd *xnsys_ppd_get(int global) +{ + struct xnsys_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); + ppd = __xnsys_ppd_get(global); + xnlock_put_irqrestore(&nklock, s); + + return ppd; +} + #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/posix/internal.h b/kernel/cobalt/posix/internal.h index bf73ea3..9102e27 100644 --- a/kernel/cobalt/posix/internal.h +++ b/kernel/cobalt/posix/internal.h @@ -67,9 +67,16 @@ static inline struct cobalt_process *cobalt_process_context(void) static inline struct cobalt_kqueues *cobalt_kqueues(int pshared) { struct xnshadow_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); - if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL) + if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL) { + xnlock_put_irqrestore(&nklock, s); return &cobalt_global_kqueues; + } + + xnlock_put_irqrestore(&nklock, s); return &container_of(ppd, struct cobalt_process, ppd)->kqueues; } diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c index 4fc51ca..8f53474 100644 --- a/kernel/cobalt/shadow.c +++ b/kernel/cobalt/shadow.c @@ -919,7 +919,6 @@ int xnshadow_map_user(struct xnthread *thread, struct xnthread_start_attr attr; struct xnsys_ppd *sys_ppd; struct xnheap *sem_heap; - spl_t s; int ret; if (!xnthread_test_state(thread, XNUSER)) @@ -953,10 +952,7 @@ int xnshadow_map_user(struct xnthread *thread, } #endif /* CONFIG_MMU */ - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); - sem_heap = &sys_ppd->sem_heap; u_window = xnheap_alloc(sem_heap, sizeof(*u_window)); if (u_window == NULL) { @@ -1323,7 +1319,7 @@ static int handle_mayday_event(struct pt_regs *regs) /* We enter the mayday handler with hw IRQs off. */ xnlock_get(&nklock); - sys_ppd = xnsys_ppd_get(0); + sys_ppd = __xnsys_ppd_get(0); xnlock_put(&nklock); xnarch_handle_mayday(tcb, regs, sys_ppd->mayday_addr); @@ -1551,9 +1547,6 @@ static int xnshadow_sys_heap_info(struct xnheap_desc __user *u_hd, { struct xnheap_desc hd; struct xnheap *heap; - spl_t s; - - xnlock_get_irqsave(&nklock, s);
[Xenomai-git] Philippe Gerum : cobalt/shadow: sanitize ppd retrieval
Module: xenomai-forge Branch: master Commit: 74e853742ce919df6e35c9919354465c3982f7bb URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=74e853742ce919df6e35c9919354465c3982f7bb Author: Philippe Gerum Date: Tue Jan 7 13:15:49 2014 +0100 cobalt/shadow: sanitize ppd retrieval --- include/cobalt/kernel/assert.h |2 +- include/cobalt/kernel/ppd.h| 15 ++- kernel/cobalt/debug.c |3 --- kernel/cobalt/posix/internal.h |9 - kernel/cobalt/shadow.c | 17 + 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h index 63886a1..775ae1f 100644 --- a/include/cobalt/kernel/assert.h +++ b/include/cobalt/kernel/assert.h @@ -83,7 +83,7 @@ #define primary_mode_only()XENO_BUGON(CONTEXT, ipipe_root_p) #define secondary_mode_only() XENO_BUGON(CONTEXT, !ipipe_root_p) #define interrupt_only() XENO_BUGON(CONTEXT, !xnsched_interrupt_p()) -#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && spltest()) == 0) +#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && hard_irqs_disabled()) == 0) #define realtime_cpu_only()XENO_BUGON(CONTEXT, !xnsched_supported_cpu(ipipe_processor_id())) void __xnsys_assert_failed(const char *file, int line, const char *msg); diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..937f998 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -23,6 +23,7 @@ #include #include +#include #include struct mm_struct; @@ -53,7 +54,7 @@ struct xnsys_ppd { extern struct xnsys_ppd __xnsys_global_ppd; -static inline struct xnsys_ppd *xnsys_ppd_get(int global) +static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { struct xnshadow_ppd *ppd; @@ -63,4 +64,16 @@ static inline struct xnsys_ppd *xnsys_ppd_get(int global) return container_of(ppd, struct xnsys_ppd, ppd); } +static inline struct xnsys_ppd *xnsys_ppd_get(int global) +{ + struct xnsys_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); + ppd = __xnsys_ppd_get(global); + xnlock_put_irqrestore(&nklock, s); + + return ppd; +} + #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c index 226c5ee..10fbb53 100644 --- a/kernel/cobalt/debug.c +++ b/kernel/cobalt/debug.c @@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread) { struct xnsys_ppd *sys_ppd; size_t len; - spl_t s; - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); /* * The caller is current, so we know for sure that sys_ppd * will still be valid after we dropped the lock. diff --git a/kernel/cobalt/posix/internal.h b/kernel/cobalt/posix/internal.h index bf73ea3..9102e27 100644 --- a/kernel/cobalt/posix/internal.h +++ b/kernel/cobalt/posix/internal.h @@ -67,9 +67,16 @@ static inline struct cobalt_process *cobalt_process_context(void) static inline struct cobalt_kqueues *cobalt_kqueues(int pshared) { struct xnshadow_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); - if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL) + if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL) { + xnlock_put_irqrestore(&nklock, s); return &cobalt_global_kqueues; + } + + xnlock_put_irqrestore(&nklock, s); return &container_of(ppd, struct cobalt_process, ppd)->kqueues; } diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c index 4fc51ca..8f53474 100644 --- a/kernel/cobalt/shadow.c +++ b/kernel/cobalt/shadow.c @@ -919,7 +919,6 @@ int xnshadow_map_user(struct xnthread *thread, struct xnthread_start_attr attr; struct xnsys_ppd *sys_ppd; struct xnheap *sem_heap; - spl_t s; int ret; if (!xnthread_test_state(thread, XNUSER)) @@ -953,10 +952,7 @@ int xnshadow_map_user(struct xnthread *thread, } #endif /* CONFIG_MMU */ - xnlock_get_irqsave(&nklock, s); sys_ppd = xnsys_ppd_get(0); - xnlock_put_irqrestore(&nklock, s); - sem_heap = &sys_ppd->sem_heap; u_window = xnheap_alloc(sem_heap, sizeof(*u_window)); if (u_window == NULL) { @@ -1323,7 +1319,7 @@ static int handle_mayday_event(struct pt_regs *regs) /* We enter the mayday handler with hw IRQs off. */ xnlock_get(&nklock); - sys_ppd = xnsys_ppd_get(0); + sys_ppd = __xnsys_ppd_get(0); xnlock_put(&nklock); xnarch_handle_mayday(tcb, regs, sys_ppd->mayday_addr); @@ -1551,9 +1547,6 @@ static int xnshadow_sys_heap_info(struct xnheap_desc __user *u_hd, { struct xnheap_desc hd; struct xnheap *heap; - spl_t s; - - xnlock_get_irqsave(&nklock, s);
[Xenomai-git] Philippe Gerum : cobalt/shadow: sanitize ppd retrieval
Module: xenomai-forge Branch: master Commit: 896e5dada38eb0f11183a5349278ee550701f3b9 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=896e5dada38eb0f11183a5349278ee550701f3b9 Author: Philippe Gerum Date: Tue Jan 7 13:15:49 2014 +0100 cobalt/shadow: sanitize ppd retrieval --- include/cobalt/kernel/assert.h |2 +- include/cobalt/kernel/ppd.h| 15 ++- include/cobalt/kernel/rtdm/Makefile.am |1 + include/cobalt/kernel/rtdm/Makefile.in |1 + include/cobalt/kernel/rtdm/audis.h | 225 kernel/cobalt/debug.c |3 - kernel/cobalt/posix/internal.h |9 +- kernel/cobalt/shadow.c | 17 +-- 8 files changed, 251 insertions(+), 22 deletions(-) diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h index 63886a1..775ae1f 100644 --- a/include/cobalt/kernel/assert.h +++ b/include/cobalt/kernel/assert.h @@ -83,7 +83,7 @@ #define primary_mode_only()XENO_BUGON(CONTEXT, ipipe_root_p) #define secondary_mode_only() XENO_BUGON(CONTEXT, !ipipe_root_p) #define interrupt_only() XENO_BUGON(CONTEXT, !xnsched_interrupt_p()) -#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && spltest()) == 0) +#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && hard_irqs_disabled()) == 0) #define realtime_cpu_only()XENO_BUGON(CONTEXT, !xnsched_supported_cpu(ipipe_processor_id())) void __xnsys_assert_failed(const char *file, int line, const char *msg); diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..937f998 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -23,6 +23,7 @@ #include #include +#include #include struct mm_struct; @@ -53,7 +54,7 @@ struct xnsys_ppd { extern struct xnsys_ppd __xnsys_global_ppd; -static inline struct xnsys_ppd *xnsys_ppd_get(int global) +static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { struct xnshadow_ppd *ppd; @@ -63,4 +64,16 @@ static inline struct xnsys_ppd *xnsys_ppd_get(int global) return container_of(ppd, struct xnsys_ppd, ppd); } +static inline struct xnsys_ppd *xnsys_ppd_get(int global) +{ + struct xnsys_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); + ppd = __xnsys_ppd_get(global); + xnlock_put_irqrestore(&nklock, s); + + return ppd; +} + #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/rtdm/Makefile.am b/include/cobalt/kernel/rtdm/Makefile.am index b15eac8..148a3ef 100644 --- a/include/cobalt/kernel/rtdm/Makefile.am +++ b/include/cobalt/kernel/rtdm/Makefile.am @@ -1,5 +1,6 @@ noinst_HEADERS = \ + audis.h \ can.h \ cobalt.h\ driver.h\ diff --git a/include/cobalt/kernel/rtdm/Makefile.in b/include/cobalt/kernel/rtdm/Makefile.in index df8397f..de1bb04 100644 --- a/include/cobalt/kernel/rtdm/Makefile.in +++ b/include/cobalt/kernel/rtdm/Makefile.in @@ -304,6 +304,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = \ + audis.h \ can.h \ cobalt.h\ driver.h\ diff --git a/include/cobalt/kernel/rtdm/audis.h b/include/cobalt/kernel/rtdm/audis.h new file mode 100644 index 000..08aa58b --- /dev/null +++ b/include/cobalt/kernel/rtdm/audis.h @@ -0,0 +1,225 @@ +/** + * @author Philippe Gerum + * @note Copyright (C) 2013 Siemens + * @brief Kernel interface for AuDis-based drivers + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _COBALT_RTDM_AUDIS_H +#define _COBALT_RTDM_AUDIS_H + +#include +#include +#include +#include + +struct audis_process; + +/** + * @anchor audis_context + * @brief AuDis context descriptor. + * + * The core AuDis context descriptor holds the AuDis-specific data for + * each open file. For this reason, it should be part of each + * driver-specific context descriptor. e.g. + * + * @code + * struct fpga_user { + * struct user_state some_state; + * struct audis_context audis_context; + * }; + * + * struct rtdm_device fpga_device { + * ... + * .context_size = sizeof(struct fpga_us
[Xenomai-git] Philippe Gerum : cobalt/shadow: sanitize ppd retrieval
Module: xenomai-forge Branch: next Commit: 896e5dada38eb0f11183a5349278ee550701f3b9 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=896e5dada38eb0f11183a5349278ee550701f3b9 Author: Philippe Gerum Date: Tue Jan 7 13:15:49 2014 +0100 cobalt/shadow: sanitize ppd retrieval --- include/cobalt/kernel/assert.h |2 +- include/cobalt/kernel/ppd.h| 15 ++- include/cobalt/kernel/rtdm/Makefile.am |1 + include/cobalt/kernel/rtdm/Makefile.in |1 + include/cobalt/kernel/rtdm/audis.h | 225 kernel/cobalt/debug.c |3 - kernel/cobalt/posix/internal.h |9 +- kernel/cobalt/shadow.c | 17 +-- 8 files changed, 251 insertions(+), 22 deletions(-) diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h index 63886a1..775ae1f 100644 --- a/include/cobalt/kernel/assert.h +++ b/include/cobalt/kernel/assert.h @@ -83,7 +83,7 @@ #define primary_mode_only()XENO_BUGON(CONTEXT, ipipe_root_p) #define secondary_mode_only() XENO_BUGON(CONTEXT, !ipipe_root_p) #define interrupt_only() XENO_BUGON(CONTEXT, !xnsched_interrupt_p()) -#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && spltest()) == 0) +#define atomic_only() XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) && hard_irqs_disabled()) == 0) #define realtime_cpu_only()XENO_BUGON(CONTEXT, !xnsched_supported_cpu(ipipe_processor_id())) void __xnsys_assert_failed(const char *file, int line, const char *msg); diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h index 05e32b3..937f998 100644 --- a/include/cobalt/kernel/ppd.h +++ b/include/cobalt/kernel/ppd.h @@ -23,6 +23,7 @@ #include #include +#include #include struct mm_struct; @@ -53,7 +54,7 @@ struct xnsys_ppd { extern struct xnsys_ppd __xnsys_global_ppd; -static inline struct xnsys_ppd *xnsys_ppd_get(int global) +static inline struct xnsys_ppd *__xnsys_ppd_get(int global) { struct xnshadow_ppd *ppd; @@ -63,4 +64,16 @@ static inline struct xnsys_ppd *xnsys_ppd_get(int global) return container_of(ppd, struct xnsys_ppd, ppd); } +static inline struct xnsys_ppd *xnsys_ppd_get(int global) +{ + struct xnsys_ppd *ppd; + spl_t s; + + xnlock_get_irqsave(&nklock, s); + ppd = __xnsys_ppd_get(global); + xnlock_put_irqrestore(&nklock, s); + + return ppd; +} + #endif /* _COBALT_KERNEL_PPD_H */ diff --git a/include/cobalt/kernel/rtdm/Makefile.am b/include/cobalt/kernel/rtdm/Makefile.am index b15eac8..148a3ef 100644 --- a/include/cobalt/kernel/rtdm/Makefile.am +++ b/include/cobalt/kernel/rtdm/Makefile.am @@ -1,5 +1,6 @@ noinst_HEADERS = \ + audis.h \ can.h \ cobalt.h\ driver.h\ diff --git a/include/cobalt/kernel/rtdm/Makefile.in b/include/cobalt/kernel/rtdm/Makefile.in index df8397f..de1bb04 100644 --- a/include/cobalt/kernel/rtdm/Makefile.in +++ b/include/cobalt/kernel/rtdm/Makefile.in @@ -304,6 +304,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = \ + audis.h \ can.h \ cobalt.h\ driver.h\ diff --git a/include/cobalt/kernel/rtdm/audis.h b/include/cobalt/kernel/rtdm/audis.h new file mode 100644 index 000..08aa58b --- /dev/null +++ b/include/cobalt/kernel/rtdm/audis.h @@ -0,0 +1,225 @@ +/** + * @author Philippe Gerum + * @note Copyright (C) 2013 Siemens + * @brief Kernel interface for AuDis-based drivers + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#ifndef _COBALT_RTDM_AUDIS_H +#define _COBALT_RTDM_AUDIS_H + +#include +#include +#include +#include + +struct audis_process; + +/** + * @anchor audis_context + * @brief AuDis context descriptor. + * + * The core AuDis context descriptor holds the AuDis-specific data for + * each open file. For this reason, it should be part of each + * driver-specific context descriptor. e.g. + * + * @code + * struct fpga_user { + * struct user_state some_state; + * struct audis_context audis_context; + * }; + * + * struct rtdm_device fpga_device { + * ... + * .context_size = sizeof(struct fpga_user