Module: xenomai-jki
Branch: for-forge
Commit: ec8c168898e71c732b00b02501144c79ae4d947d
URL:    
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=ec8c168898e71c732b00b02501144c79ae4d947d

Author: Jan Kiszka <jan.kis...@siemens.com>
Date:   Tue Mar  7 18:30:22 2017 +0100

cobalt/posix: Provide compat version signal_copyinfo extension

Enables compat-capable implementations of this extension.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>

---

 kernel/cobalt/posix/extension.h |    4 ++++
 kernel/cobalt/posix/signal.c    |   20 +++++++++++++-------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/kernel/cobalt/posix/extension.h b/kernel/cobalt/posix/extension.h
index b831a3a..ae365c7 100644
--- a/kernel/cobalt/posix/extension.h
+++ b/kernel/cobalt/posix/extension.h
@@ -54,6 +54,10 @@ struct cobalt_extension {
                                       void __user *u_si,
                                       const struct siginfo *si,
                                       int overrun);
+               int (*signal_copyinfo_compat)(struct cobalt_extref *refthread,
+                                             void __user *u_si,
+                                             const struct siginfo *si,
+                                             int overrun);
                int (*sched_yield)(struct cobalt_extref *curref);
                int (*thread_setsched)(struct cobalt_extref *refthread, /* 
nklocked, IRQs off. */
                                       struct xnsched_class *sched_class,
diff --git a/kernel/cobalt/posix/signal.c b/kernel/cobalt/posix/signal.c
index 518a5c6..803d998 100644
--- a/kernel/cobalt/posix/signal.c
+++ b/kernel/cobalt/posix/signal.c
@@ -342,17 +342,23 @@ done:
                goto out;       /* Return signo only. */
 
 #ifdef CONFIG_XENO_ARCH_SYS3264
-       if (compat)
+       if (compat) {
                ret = sys32_put_siginfo(u_si, sip, overrun);
-       else
+               if (!ret)
+                       /* Allow an extended target to receive more data. */
+                       cobalt_call_extension(signal_copyinfo_compat,
+                                             &curr->extref, ret, u_si, sip,
+                                             overrun);
+       } else
 #endif
+       {
                ret = signal_put_siginfo(u_si, sip, overrun);
-       if (ret)
-               goto out;
+               if (!ret)
+                       /* Allow an extended target to receive more data. */
+                       cobalt_call_extension(signal_copyinfo, &curr->extref,
+                                             ret, u_si, sip, overrun);
+       }
 
-       /* Allow an extended target to receive more data. */
-       cobalt_call_extension(signal_copyinfo, &curr->extref,
-                             ret, u_si, sip, overrun);
 out:
        /*
         * If we pulled the signal information from a sigpending


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

Reply via email to