[Xenomai-core] [PATCH 02/12] Handle-based xeno_get_current service

2008-10-16 Thread Jan Kiszka
To avoid sharing kernel object pointers with user space, a handle-based
approach is installed by this patch. It also reserves a few bits of the
handle value for special use (like the claimed bit of fast xnsynch).
Furthermore, the patch ensures that threads are registered at least
anonymously to allow them being used with fast xnsynch objects.

Signed-off-by: Jan Kiszka [EMAIL PROTECTED]
---
 include/asm-generic/bits/bind.h|9 -
 include/asm-generic/bits/current.h |5 +--
 include/nucleus/types.h|   13 +++
 ksrc/nucleus/shadow.c  |   16 +++--
 ksrc/skins/native/Kconfig  |1 
 ksrc/skins/native/task.c   |8 +---
 ksrc/skins/posix/Kconfig   |1 
 ksrc/skins/posix/cb_lock.h |   15 ++---
 ksrc/skins/posix/cond.c|   12 ---
 ksrc/skins/posix/mutex.c   |   21 +++-
 ksrc/skins/posix/mutex.h   |   61 +++--
 ksrc/skins/posix/syscall.c |   11 +++---
 ksrc/skins/posix/thread.c  |   12 +++
 ksrc/skins/psos+/Kconfig   |2 -
 ksrc/skins/rtai/Kconfig|1 
 ksrc/skins/rtai/task.c |   10 ++
 ksrc/skins/rtdm/drvlib.c   |8 
 ksrc/skins/uitron/Kconfig  |1 
 ksrc/skins/uitron/task.c   |   11 ++
 ksrc/skins/vrtx/Kconfig|2 -
 ksrc/skins/vrtx/task.c |   17 +-
 ksrc/skins/vxworks/Kconfig |2 -
 src/skins/posix/mutex.c|   41 
 23 files changed, 199 insertions(+), 81 deletions(-)

Index: b/include/asm-generic/bits/current.h
===
--- a/include/asm-generic/bits/current.h
+++ b/include/asm-generic/bits/current.h
@@ -2,14 +2,15 @@
 #define _XENO_ASM_GENERIC_CURRENT_H
 
 #include pthread.h
+#include nucleus/types.h
 
 extern pthread_key_t xeno_current_key;
 
 extern void xeno_set_current(void);
 
-static inline void *xeno_get_current(void)
+static inline xnhandle_t xeno_get_current(void)
 {
-   return pthread_getspecific(xeno_current_key);
+   return (xnhandle_t)pthread_getspecific(xeno_current_key);
 }
 
 #endif /* _XENO_ASM_GENERIC_CURRENT_H */
Index: b/include/nucleus/types.h
===
--- a/include/nucleus/types.h
+++ b/include/nucleus/types.h
@@ -61,6 +61,19 @@ typedef unsigned long xnhandle_t;
 
 #define XN_NO_HANDLE ((xnhandle_t)0)
 
+#define XN_HANDLE_SPARE0   ((xnhandle_t)0x1000)
+#define XN_HANDLE_SPARE1   ((xnhandle_t)0x2000)
+#define XN_HANDLE_SPARE2   ((xnhandle_t)0x4000)
+#define XN_HANDLE_SPARE3   ((xnhandle_t)0x8000)
+#define XN_HANDLE_SPARE_MASK   ((xnhandle_t)0xf000)
+
+#define xnhandle_mask_spare(handle)  ((handle)  ~XN_HANDLE_SPARE_MASK)
+#define xnhandle_test_spare(handle, bits)  (!!((handle)  (bits)))
+#define xnhandle_set_spare(handle, bits) \
+   do { (handle) |= (bits); } while (0)
+#define xnhandle_clear_spare(handle, bits) \
+   do { (handle) = ~(bits); } while (0)
+
 struct xnintr;
 
 typedef int (*xnisr_t)(struct xnintr *intr);
Index: b/ksrc/nucleus/shadow.c
===
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1908,13 +1908,21 @@ static int xnshadow_sys_sem_heap(struct
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
 
+#ifdef CONFIG_XENO_OPT_REGISTRY
 static int xnshadow_sys_current(struct pt_regs *regs)
 {
-   xnthread_t * __user *us_current, *cur = xnshadow_thread(current);
-   us_current = (xnthread_t *__user *) __xn_reg_arg1(regs);
+   xnthread_t *cur = xnshadow_thread(current);
+   xnhandle_t __user *us_handle;
 
-   return __xn_safe_copy_to_user(us_current, cur, sizeof(*us_current));
+   if (!cur)
+   return -EPERM;
+
+   us_handle = (xnhandle_t __user *) __xn_reg_arg1(regs);
+
+   return __xn_safe_copy_to_user(us_handle, xnthread_handle(cur),
+ sizeof(*us_handle));
 }
+#endif /* CONFIG_XENO_OPT_REGISTRY */
 
 static xnsysent_t __systab[] = {
[__xn_sys_migrate] = {xnshadow_sys_migrate, __xn_exec_current},
@@ -1925,7 +1933,9 @@ static xnsysent_t __systab[] = {
[__xn_sys_barrier] = {xnshadow_sys_barrier, __xn_exec_lostage},
[__xn_sys_trace] = {xnshadow_sys_trace, __xn_exec_any},
[__xn_sys_sem_heap] = {xnshadow_sys_sem_heap, __xn_exec_any},
+#ifdef CONFIG_XENO_OPT_REGISTRY
[__xn_sys_current] = {xnshadow_sys_current, __xn_exec_any},
+#endif /* CONFIG_XENO_OPT_REGISTRY */
 };
 
 static void *xnshadow_sys_event(int event, void *data)
Index: b/ksrc/skins/posix/cb_lock.h
===
--- a/ksrc/skins/posix/cb_lock.h
+++ b/ksrc/skins/posix/cb_lock.h
@@ -3,15 +3,22 @@
 
 #include asm/xenomai/atomic.h
 #include nucleus/compiler.h

Re: [Xenomai-core] [PATCH 02/12] Handle-based xeno_get_current service

2008-10-16 Thread Gilles Chanteperdrix
Jan Kiszka wrote:

ok for me.

-- 
Gilles.

___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core