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

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

nucleus, skins: fix up for kernel 3.5 series

---

 include/asm-generic/wrappers.h |   46 ++++++++++++-------------------------
 include/nucleus/select.h       |   39 ++++++++++++++++++++++++++++++++
 ksrc/nucleus/select.c          |   48 ++++++++++++++++++++--------------------
 ksrc/nucleus/shadow.c          |    4 +--
 ksrc/skins/posix/syscall.c     |    6 ++--
 ksrc/skins/rtdm/drvlib.c       |    4 +--
 6 files changed, 83 insertions(+), 64 deletions(-)

diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h
index be01c4f..7f95f0f 100644
--- a/include/asm-generic/wrappers.h
+++ b/include/asm-generic/wrappers.h
@@ -700,44 +700,28 @@ static inline void wrap_proc_dir_entry_owner(struct 
proc_dir_entry *entry)
 #endif
 
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
+
 #define cpu_online_mask &(cpu_online_map)
-#endif
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(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);
-}
+#include <linux/sched.h>
+#include <linux/mm.h>
 
-static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
+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 = __fd / __NFDBITS;
-        unsigned long __rem = __fd % __NFDBITS;
-        __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
-}
+       struct mm_struct *mm = current->mm;
+       int ret;
 
-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;
-}
+       down_write(&mm->mmap_sem);
+       ret = do_mmap(file, addr, len, prot, flag, offset);
+       up_write(&mm->mmap_sem);
 
-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++;
-       }
+       return ret;
 }
-#endif
+
+#endif /* LINUX_VERSION_CODE < 3.4.0 */
 
 #ifdef CONFIG_IPIPE_CORE
 #if IPIPE_CORE_APIREV >= 2
diff --git a/include/nucleus/select.h b/include/nucleus/select.h
index bda4cba..d9ee5cf 100644
--- a/include/nucleus/select.h
+++ b/include/nucleus/select.h
@@ -45,6 +45,45 @@ 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 {
diff --git a/ksrc/nucleus/select.c b/ksrc/nucleus/select.c
index 2dd38c5..e25dd38 100644
--- a/ksrc/nucleus/select.c
+++ b/ksrc/nucleus/select.c
@@ -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/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 16e570b..f6165bb 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -1633,9 +1633,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/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 9f5d315..34086b4 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -2326,7 +2326,7 @@ static int fd_valid_p(int fd)
 {
        pse51_queues_t *q;
 #if defined(CONFIG_XENO_SKIN_RTDM) || defined (CONFIG_XENO_SKIN_RTDM_MODULE)
-       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;
@@ -2365,7 +2365,7 @@ static int select_bind_one(struct xnselector *selector, 
unsigned type, int fd)
        pse51_assoc_t *assoc;
        pse51_queues_t *q;
 #if defined(CONFIG_XENO_SKIN_RTDM) || defined (CONFIG_XENO_SKIN_RTDM_MODULE)
-       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,
@@ -2443,7 +2443,7 @@ static int __select(struct pt_regs *regs)
        }
 
        nfds = __xn_reg_arg1(regs);
-       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]) {
diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c
index 06fa772..4b74042 100644
--- a/ksrc/skins/rtdm/drvlib.c
+++ b/ksrc/skins/rtdm/drvlib.c
@@ -1913,10 +1913,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,
+       u_addr = vm_mmap(filp, (unsigned long)*pptr, len, prot,
                         MAP_SHARED, 0);
-       up_write(&user_info->mm->mmap_sem);
 
        filp->f_op = (typeof(filp->f_op))old_fops;
        filp->private_data = old_priv_data;


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

Reply via email to