Module: xenomai-forge
Branch: master
Commit: 33b2db693294e6ccea864691779aa5135865c1d7
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=33b2db693294e6ccea864691779aa5135865c1d7

Author: Philippe Gerum <r...@xenomai.org>
Date:   Fri Aug 31 10:23:39 2012 +0200

cobalt/generic: fix up for kernel 3.5 series

---

 include/asm-generic/wrappers.h  |   49 ++++++++++++-----------------------
 include/cobalt/nucleus/select.h |   53 ++++++++++++++++++++++++++++++++++++++-
 kernel/cobalt/nucleus/select.c  |   50 ++++++++++++++++++------------------
 kernel/cobalt/nucleus/shadow.c  |    4 +--
 kernel/cobalt/rtdm/drvlib.c     |    6 +---
 kernel/cobalt/syscall.c         |    6 ++--
 6 files changed, 100 insertions(+), 68 deletions(-)

diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h
index dad33b3..50401b0 100644
--- a/include/asm-generic/wrappers.h
+++ b/include/asm-generic/wrappers.h
@@ -57,42 +57,27 @@ static inline struct task_struct 
*wrap_find_task_by_pid(pid_t nr)
 #endif /* !pgprot_noncached */
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
-#include <asm/system.h>
-#define cpu_online_mask (&cpu_online_map)
-#else /* >= 3.4.0 */
-static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
-{
-        unsigned long __tmp = __fd / __NFDBITS;
-        unsigned long __rem = __fd % __NFDBITS;
-        __fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
-}
 
-static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
-{
-        unsigned long __tmp = __fd / __NFDBITS;
-        unsigned long __rem = __fd % __NFDBITS;
-        __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
-}
+#define cpu_online_mask &(cpu_online_map)
 
-static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
-{
-        unsigned long __tmp = __fd / __NFDBITS;
-        unsigned long __rem = __fd % __NFDBITS;
-        return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
-}
+#include <linux/sched.h>
+#include <linux/mm.h>
 
-static inline void __FD_ZERO(__kernel_fd_set *__p)
+static inline
+unsigned long vm_mmap(struct file *file, unsigned long addr,
+       unsigned long len, unsigned long prot,
+       unsigned long flag, unsigned long offset)
 {
-       unsigned long *__tmp = __p->fds_bits;
-       int __i;
-
-       __i = __FDSET_LONGS;
-       while (__i) {
-               __i--;
-               *__tmp = 0;
-               __tmp++;
-       }
+       struct mm_struct *mm = current->mm;
+       int ret;
+
+       down_write(&mm->mmap_sem);
+       ret = do_mmap(file, addr, len, prot, flag, offset);
+       up_write(&mm->mmap_sem);
+
+       return ret;
 }
-#endif /* >= 3.4.0 */
+
+#endif /* LINUX_VERSION_CODE < 3.4.0 */
 
 #endif /* _XENO_ASM_GENERIC_WRAPPERS_H */
diff --git a/include/cobalt/nucleus/select.h b/include/cobalt/nucleus/select.h
index 31c9cac..d9ee5cf 100644
--- a/include/cobalt/nucleus/select.h
+++ b/include/cobalt/nucleus/select.h
@@ -1,4 +1,4 @@
-/**\file
+/*!\file nucleus/select.h
  * \brief file descriptors events multiplexing header.
  * \author Gilles Chanteperdrix
  *
@@ -45,6 +45,47 @@ struct xnselector {
        xnqueue_t bindings; /* only used by xnselector_destroy */
 };
 
+#define __NFDBITS__    (8 * sizeof(unsigned long))
+#define __FDSET_LONGS__        (__FD_SETSIZE/__NFDBITS__)
+#define        __FDELT__(d)    ((d) / __NFDBITS__)
+#define        __FDMASK__(d)   (1UL << ((d) % __NFDBITS__))
+
+static inline void __FD_SET__(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+        unsigned long __tmp = __fd / __NFDBITS__;
+        unsigned long __rem = __fd % __NFDBITS__;
+        __fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
+}
+
+static inline void __FD_CLR__(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+        unsigned long __tmp = __fd / __NFDBITS__;
+        unsigned long __rem = __fd % __NFDBITS__;
+        __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
+}
+
+static inline int __FD_ISSET__(unsigned long __fd, const __kernel_fd_set *__p)
+{
+        unsigned long __tmp = __fd / __NFDBITS__;
+        unsigned long __rem = __fd % __NFDBITS__;
+        return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
+}
+
+static inline void __FD_ZERO__(__kernel_fd_set *__p)
+{
+       unsigned long *__tmp = __p->fds_bits;
+       int __i;
+
+       __i = __FDSET_LONGS__;
+       while (__i) {
+               __i--;
+               *__tmp = 0;
+               __tmp++;
+       }
+}
+
+#ifdef CONFIG_XENO_OPT_SELECT
+
 struct xnselect {
        xnqueue_t bindings;
 };
@@ -113,6 +154,16 @@ int xnselect_umount(void);
 }
 #endif /* __cplusplus */
 
+#else /* !CONFIG_XENO_OPT_SELECT */
+struct xnselector;
+#define DECLARE_XNSELECT(name)
+#define xnselect_init(block)
+#define xnselect_bind(select_block,binding,selector,type,bit_index,state) \
+       ({ -EBADF; })
+#define xnselect_signal(block, state) ({ int __ret = 0; __ret; })
+#define xnselect_destroy(block)
+#endif /* !CONFIG_XENO_OPT_SELECT */
+
 /*@}*/
 
 #endif /* XNSELECT_H */
diff --git a/kernel/cobalt/nucleus/select.c b/kernel/cobalt/nucleus/select.c
index c2bd220..e25dd38 100644
--- a/kernel/cobalt/nucleus/select.c
+++ b/kernel/cobalt/nucleus/select.c
@@ -1,4 +1,4 @@
-/*!\file select.c
+/*!\file nucleus/select.c
  * \brief file descriptors events multiplexing.
  * \author Gilles Chanteperdrix
  *
@@ -126,13 +126,13 @@ int xnselect_bind(struct xnselect *select_block,
 
        appendq(&selector->bindings, &binding->slink);
        appendq(&select_block->bindings, &binding->link);
-       __FD_SET(index, &selector->fds[type].expected);
+       __FD_SET__(index, &selector->fds[type].expected);
        if (state) {
-               __FD_SET(index, &selector->fds[type].pending);
+               __FD_SET__(index, &selector->fds[type].pending);
                if (xnselect_wakeup(selector))
                        xnpod_schedule();
        } else
-               __FD_CLR(index, &selector->fds[type].pending);
+               __FD_CLR__(index, &selector->fds[type].pending);
 
        return 0;
 }
@@ -153,15 +153,15 @@ int __xnselect_signal(struct xnselect *select_block, 
unsigned state)
 
                selector = binding->selector;
                if (state) {
-                       if (!__FD_ISSET(binding->bit_index,
+                       if (!__FD_ISSET__(binding->bit_index,
                                        &selector->fds[binding->type].pending)) 
{
-                               __FD_SET(binding->bit_index,
+                               __FD_SET__(binding->bit_index,
                                         &selector->fds[binding->type].pending);
                                if (xnselect_wakeup(selector))
                                        resched = 1;
                        }
                } else
-                       __FD_CLR(binding->bit_index,
+                       __FD_CLR__(binding->bit_index,
                                 &selector->fds[binding->type].pending);
        }
 
@@ -190,11 +190,11 @@ void xnselect_destroy(struct xnselect *select_block)
                binding = link2binding(holder, link);
                selector = binding->selector;
 
-               __FD_CLR(binding->bit_index,
+               __FD_CLR__(binding->bit_index,
                         &selector->fds[binding->type].expected);
-               if (!__FD_ISSET(binding->bit_index,
+               if (!__FD_ISSET__(binding->bit_index,
                                &selector->fds[binding->type].pending)) {
-                       __FD_SET(binding->bit_index,
+                       __FD_SET__(binding->bit_index,
                                 &selector->fds[binding->type].pending);
                        if (xnselect_wakeup(selector))
                                resched = 1;
@@ -217,14 +217,14 @@ fd_set_andnot(fd_set *result, fd_set *first, fd_set 
*second, unsigned n)
 {
        unsigned i, not_empty = 0;
 
-       for (i = 0; i < __FDELT(n); i++)
+       for (i = 0; i < __FDELT__(n); i++)
                if((result->fds_bits[i] =
                    first->fds_bits[i] & ~(second->fds_bits[i])))
                        not_empty = 1;
 
-       if (i < __FDSET_LONGS
+       if (i < __FDSET_LONGS__
            && (result->fds_bits[i] =
-               first->fds_bits[i] & ~(second->fds_bits[i]) & (__FDMASK(n) - 
1)))
+               first->fds_bits[i] & ~(second->fds_bits[i]) & (__FDMASK__(n) - 
1)))
                not_empty = 1;
 
        return not_empty;
@@ -235,14 +235,14 @@ fd_set_and(fd_set *result, fd_set *first, fd_set *second, 
unsigned n)
 {
        unsigned i, not_empty = 0;
 
-       for (i = 0; i < __FDELT(n); i++)
+       for (i = 0; i < __FDELT__(n); i++)
                if((result->fds_bits[i] =
                    first->fds_bits[i] & second->fds_bits[i]))
                        not_empty = 1;
 
-       if (i < __FDSET_LONGS
+       if (i < __FDSET_LONGS__
            && (result->fds_bits[i] =
-               first->fds_bits[i] & second->fds_bits[i] & (__FDMASK(n) - 1)))
+               first->fds_bits[i] & second->fds_bits[i] & (__FDMASK__(n) - 1)))
                not_empty = 1;
 
        return not_empty;
@@ -252,12 +252,12 @@ static void fd_set_zerofill(fd_set *set, unsigned n)
 {
        unsigned i;
 
-       i = __FDELT(n);
+       i = __FDELT__(n);
 
-       if (i < __FDSET_LONGS)
-               set->fds_bits[i] &= (__FDMASK(n) - 1);
+       if (i < __FDSET_LONGS__)
+               set->fds_bits[i] &= (__FDMASK__(n) - 1);
 
-       for(i++; i < __FDSET_LONGS; i++)
+       for(i++; i < __FDSET_LONGS__; i++)
                set->fds_bits[i] = 0;
 }
 
@@ -265,12 +265,12 @@ static unsigned fd_set_popcount(fd_set *set, unsigned n)
 {
        unsigned count = 0, i;
 
-       for (i = 0; i < __FDELT(n); i++)
+       for (i = 0; i < __FDELT__(n); i++)
                if (set->fds_bits[i])
                        count += hweight_long(set->fds_bits[i]);
 
-       if (i < __FDSET_LONGS && (set->fds_bits[i] & (__FDMASK(n) - 1)))
-               count += hweight_long(set->fds_bits[i] & (__FDMASK(n) - 1));
+       if (i < __FDSET_LONGS__ && (set->fds_bits[i] & (__FDMASK__(n) - 1)))
+               count += hweight_long(set->fds_bits[i] & (__FDMASK__(n) - 1));
 
        return count;
 }
@@ -288,8 +288,8 @@ int xnselector_init(struct xnselector *selector)
 
        xnsynch_init(&selector->synchbase, XNSYNCH_FIFO, NULL);
        for (i = 0; i < XNSELECT_MAX_TYPES; i++) {
-               __FD_ZERO(&selector->fds[i].expected);
-               __FD_ZERO(&selector->fds[i].pending);
+               __FD_ZERO__(&selector->fds[i].expected);
+               __FD_ZERO__(&selector->fds[i].pending);
        }
        initq(&selector->bindings);
        return 0;
diff --git a/kernel/cobalt/nucleus/shadow.c b/kernel/cobalt/nucleus/shadow.c
index 1d3d068..57f44e7 100644
--- a/kernel/cobalt/nucleus/shadow.c
+++ b/kernel/cobalt/nucleus/shadow.c
@@ -1183,9 +1183,7 @@ static unsigned long map_mayday_page(struct task_struct 
*p)
 
        old_fops = filp->f_op;
        filp->f_op = &mayday_fops;
-       down_write(&p->mm->mmap_sem);
-       u_addr = do_mmap(filp, 0, PAGE_SIZE, PROT_EXEC|PROT_READ, MAP_SHARED, 
0);
-       up_write(&p->mm->mmap_sem);
+       u_addr = vm_mmap(filp, 0, PAGE_SIZE, PROT_EXEC|PROT_READ, MAP_SHARED, 
0);
        filp->f_op = (typeof(filp->f_op))old_fops;
        filp_close(filp, p->files);
 
diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
index b763791..40182c3 100644
--- a/kernel/cobalt/rtdm/drvlib.c
+++ b/kernel/cobalt/rtdm/drvlib.c
@@ -1890,10 +1890,8 @@ static int rtdm_do_mmap(rtdm_user_info_t *user_info,
        old_priv_data = filp->private_data;
        filp->private_data = mmap_data;
 
-       down_write(&user_info->mm->mmap_sem);
-       u_addr = do_mmap(filp, (unsigned long)*pptr, len, prot,
-                        MAP_SHARED, 0);
-       up_write(&user_info->mm->mmap_sem);
+       u_addr = vm_mmap(filp, (unsigned long)*pptr, len, prot,
+                        MAP_SHARED, 0);
 
        filp->f_op = (typeof(filp->f_op))old_fops;
        filp->private_data = old_priv_data;
diff --git a/kernel/cobalt/syscall.c b/kernel/cobalt/syscall.c
index dcab4ac..0f066cc 100644
--- a/kernel/cobalt/syscall.c
+++ b/kernel/cobalt/syscall.c
@@ -41,7 +41,7 @@ int cobalt_muxid;
 static int fd_valid_p(int fd)
 {
        cobalt_queues_t *q;
-       const int rtdm_fd_start = FD_SETSIZE - RTDM_FD_MAX;
+       const int rtdm_fd_start = __FD_SETSIZE - RTDM_FD_MAX;
 
        if (fd >= rtdm_fd_start) {
                struct rtdm_dev_context *ctx;
@@ -78,7 +78,7 @@ static int select_bind_one(struct xnselector *selector, 
unsigned type, int fd)
 {
        cobalt_assoc_t *assoc;
        cobalt_queues_t *q;
-       const int rtdm_fd_start = FD_SETSIZE - RTDM_FD_MAX;
+       const int rtdm_fd_start = __FD_SETSIZE - RTDM_FD_MAX;
 
        if (fd >= rtdm_fd_start)
                return rtdm_select_bind(fd - rtdm_fd_start,
@@ -156,7 +156,7 @@ static int __select(int nfds,
                mode = XN_ABSOLUTE;
        }
 
-       fds_size = __FDELT(nfds + __NFDBITS - 1) * sizeof(long);
+       fds_size = __FDELT__(nfds + __NFDBITS - 1) * sizeof(long);
 
        for (i = 0; i < XNSELECT_MAX_TYPES; i++)
                if (ufd_sets[i]) {


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

Reply via email to