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

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Tue Dec  1 15:12:14 2009 +0100

x86_64: implement signals handling

---

 include/asm-x86/features_64.h |    2 +-
 include/asm-x86/syscall.h     |   78 ++++++++++++++++++++++++++++-------------
 2 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/include/asm-x86/features_64.h b/include/asm-x86/features_64.h
index f476486..8f417ac 100644
--- a/include/asm-x86/features_64.h
+++ b/include/asm-x86/features_64.h
@@ -23,7 +23,7 @@
 #include <asm-generic/xenomai/features.h>
 
 /* The ABI revision level we use on this arch. */
-#define XENOMAI_ABI_REV   2UL
+#define XENOMAI_ABI_REV   3UL
 
 #define XENOMAI_FEAT_DEP  __xn_feat_generic_mask
 
diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h
index e6849f1..d0bd197 100644
--- a/include/asm-x86/syscall.h
+++ b/include/asm-x86/syscall.h
@@ -48,6 +48,7 @@
 #define __xn_reg_arg3(regs)   ((regs)->x86reg_dx)
 #define __xn_reg_arg4(regs)   ((regs)->r10) /* entry.S convention here. */
 #define __xn_reg_arg5(regs)   ((regs)->r8)
+#define __xn_reg_sigp(regs)   ((regs)->r9)
 #endif /* x86_64 */
 
 #define __xn_reg_mux_p(regs)  ((__xn_reg_mux(regs) & 0x7fff) == __xn_sys_mux)
@@ -79,6 +80,8 @@ static inline int __xn_interrupted_p(struct pt_regs *regs)
 
 #else /* !__KERNEL__ */
 
+#include <errno.h>             /* For -ERESTART */
+
 /*
  * Some of the following macros have been adapted from glibc's syscall
  * mechanism implementation. They define an inline syscall mechanism used
@@ -213,64 +216,89 @@ asm (".L__X'%ebx = 1\n\t"
 #else /* x86_64 */
 
 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
-#define LOAD_ARGS_0()  asm volatile ("" : /* */ : /* */ : "memory");
+#define LOAD_ARGS_0(sigp, dummy...)                    \
+       long int __arg6 = (long)(sigp);         \
+       asm volatile ("" : /* */ : /* */ : "memory");
 #else
-#define LOAD_ARGS_0()
+#define LOAD_ARGS_0(sigp, dummy...)                    \
+       long int __arg6 = (long)(sigp);
 #endif
-#define LOAD_REGS_0
-#define ASM_ARGS_0
+#define LOAD_REGS_0 \
+       register long int _a6 asm ("r9") = __arg6;
+#define ASM_ARGS_0      , "r" (_a6)
 
-#define LOAD_ARGS_1(a1)                                        \
+#define LOAD_ARGS_1(sigp, a1)                          \
        long int __arg1 = (long) (a1);                  \
-       LOAD_ARGS_0()
+       LOAD_ARGS_0(sigp)
 #define LOAD_REGS_1                                    \
        register long int _a1 asm ("rdi") = __arg1;     \
        LOAD_REGS_0
 #define ASM_ARGS_1     ASM_ARGS_0, "r" (_a1)
 
-#define LOAD_ARGS_2(a1, a2)                            \
+#define LOAD_ARGS_2(sigp, a1, a2)                      \
        long int __arg2 = (long) (a2);                  \
-       LOAD_ARGS_1(a1)
+       LOAD_ARGS_1(sigp, a1)
 #define LOAD_REGS_2                                    \
        register long int _a2 asm ("rsi") = __arg2;     \
        LOAD_REGS_1
 #define ASM_ARGS_2     ASM_ARGS_1, "r" (_a2)
 
-#define LOAD_ARGS_3(a1, a2, a3)                                \
+#define LOAD_ARGS_3(sigp, a1, a2, a3)                  \
        long int __arg3 = (long) (a3);                  \
-       LOAD_ARGS_2 (a1, a2)
+       LOAD_ARGS_2 (sigp, a1, a2)
 #define LOAD_REGS_3                                    \
        register long int _a3 asm ("rdx") = __arg3;     \
        LOAD_REGS_2
 #define ASM_ARGS_3     ASM_ARGS_2, "r" (_a3)
 
-#define LOAD_ARGS_4(a1, a2, a3, a4)                    \
+#define LOAD_ARGS_4(sigp, a1, a2, a3, a4)              \
        long int __arg4 = (long) (a4);                  \
-       LOAD_ARGS_3 (a1, a2, a3)
+       LOAD_ARGS_3 (sigp, a1, a2, a3)
 #define LOAD_REGS_4                                    \
        register long int _a4 asm ("r10") = __arg4;     \
        LOAD_REGS_3
 #define ASM_ARGS_4     ASM_ARGS_3, "r" (_a4)
 
-#define LOAD_ARGS_5(a1, a2, a3, a4, a5)                        \
+#define LOAD_ARGS_5(sigp, a1, a2, a3, a4, a5)          \
        long int __arg5 = (long) (a5);                  \
-       LOAD_ARGS_4 (a1, a2, a3, a4)
+       LOAD_ARGS_4 (sigp, a1, a2, a3, a4)
 #define LOAD_REGS_5                                    \
        register long int _a5 asm ("r8") = __arg5;      \
        LOAD_REGS_4
 #define ASM_ARGS_5     ASM_ARGS_4, "r" (_a5)
 
-#define DO_SYSCALL(name, nr, args...)                  \
-({                                                     \
-       unsigned long __resultvar;                      \
-       LOAD_ARGS_##nr(args)                            \
-       LOAD_REGS_##nr                                  \
-       asm volatile (                                  \
-               "syscall\n\t"                           \
-               : "=a" (__resultvar)                    \
-               : "0" (name) ASM_ARGS_##nr              \
-               : "memory", "cc", "r11", "cx");         \
-       (long) __resultvar;                             \
+#define DO_SYSCALL_INNER(name, nr, args...)    \
+({                                             \
+       unsigned long __resultvar;              \
+       LOAD_ARGS_##nr(args)                    \
+       LOAD_REGS_##nr                          \
+       asm volatile (                          \
+               "syscall\n\t"                   \
+               : "=a" (__resultvar)            \
+               : "0" (name) ASM_ARGS_##nr      \
+               : "memory", "cc", "r11", "cx"); \
+       (long) __resultvar;                     \
+})
+
+#define DO_SYSCALL(name, nr, args...)                                  \
+({                                                                     \
+       int err, res = -ERESTART;                                       \
+       struct xnsig sigs;                                              \
+                                                                       \
+       do {                                                            \
+               sigs.nsigs = 0;                                         \
+               err = DO_SYSCALL_INNER(name, nr, &sigs, args);          \
+               res = xnsig_dispatch(&sigs, res, err);                  \
+                                                                       \
+               while (sigs.nsigs && sigs.remaining) {                  \
+                       sigs.nsigs = 0;                                 \
+                       err = DO_SYSCALL_INNER                          \
+                               (__xn_mux_code(0,__xn_sys_get_next_sigs), \
+                                0, &sigs);                             \
+                       res = xnsig_dispatch_next(&sigs, res, err);     \
+               }                                                       \
+       } while (res == -ERESTART);                                     \
+       res;                                                            \
 })
 
 #define XENOMAI_SYS_MUX(nr, op, args...) \


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

Reply via email to