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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Oct 18 18:27:37 2010 +0200

x86: remove RT signal handling from syscall path

---

 include/asm-x86/bits/shadow_32.h |   19 ----
 include/asm-x86/bits/shadow_64.h |   13 ---
 include/asm-x86/syscall.h        |  201 ++++++++------------------------------
 include/asm-x86/system_32.h      |    1 -
 include/asm-x86/system_64.h      |    1 -
 5 files changed, 42 insertions(+), 193 deletions(-)

diff --git a/include/asm-x86/bits/shadow_32.h b/include/asm-x86/bits/shadow_32.h
index 41080b1..b7a0e87 100644
--- a/include/asm-x86/bits/shadow_32.h
+++ b/include/asm-x86/bits/shadow_32.h
@@ -57,7 +57,6 @@ static inline void xnarch_setup_mayday_page(void *page)
         * We want this code to appear at the top of the MAYDAY page:
         *
         *      b8 2b 02 00 0c          mov    $<mux_code>,%eax
-        *      bd 00 00 00 00          mov    $0x0,%ebp
         * if HAVE_SEP
         *      65 ff 15 10 00 00 00    call   *%gs:0x10
         * else
@@ -77,10 +76,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        u32 imm;
                } mov_eax;
                struct __attribute__ ((__packed__)) {
-                       u8 op;
-                       u32 imm;
-               } mov_ebp;
-               struct __attribute__ ((__packed__)) {
                        u8 op[3];
                        u32 moffs;
                } syscall;
@@ -90,10 +85,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        .op = 0xb8,
                        .imm = __xn_mux_code(0, __xn_sys_mayday)
                },
-               .mov_ebp = {
-                       .op = 0xbd,
-                       .imm = 0
-               },
                .syscall = {
                        .op = {
                                0x65, 0xff, 0x15
@@ -108,10 +99,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        u8 op;
                        u32 imm;
                } mov_eax;
-               struct __attribute__ ((__packed__)) {
-                       u8 op;
-                       u32 imm;
-               } mov_ebp;
                u16 syscall;
                u16 bug;
        } code_nosep = {
@@ -119,10 +106,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        .op = 0xb8,
                        .imm = __xn_mux_code(0, __xn_sys_mayday)
                },
-               .mov_ebp = {
-                       .op = 0xbd,
-                       .imm = 0
-               },
                .syscall = 0x80cd,
                .bug = 0x0b0f,
        };
@@ -146,7 +129,6 @@ static inline void xnarch_handle_mayday(struct xnarchtcb 
*tcb,
 {
        tcb->mayday.eip = regs->x86reg_ip;
        tcb->mayday.eax = regs->x86reg_ax;
-       tcb->mayday.ebp = regs->x86reg_bp;
        regs->x86reg_ip = tramp;
 }
 
@@ -155,7 +137,6 @@ static inline void xnarch_fixup_mayday(struct xnarchtcb 
*tcb,
 {
        regs->x86reg_ip = tcb->mayday.eip;
        regs->x86reg_ax = tcb->mayday.eax;
-       regs->x86reg_bp = tcb->mayday.ebp;
 }
 
 #endif /* XNARCH_HAVE_MAYDAY */
diff --git a/include/asm-x86/bits/shadow_64.h b/include/asm-x86/bits/shadow_64.h
index 69881db..fc90b9e 100644
--- a/include/asm-x86/bits/shadow_64.h
+++ b/include/asm-x86/bits/shadow_64.h
@@ -60,7 +60,6 @@ static inline void xnarch_setup_mayday_page(void *page)
         * We want this code to appear at the top of the MAYDAY page:
         *
         *      b8 2b 02 00 0c          mov    $<mux_code>,%eax
-        *      49 c7 c1 00 00 00 00    mov    $0x0,%r9
         *      0f 05                   syscall
         *      0f 0b                   ud2a
         *
@@ -72,10 +71,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        u8 op;
                        u32 imm;
                } mov_eax;
-               struct __attribute__ ((__packed__)) {
-                       u8 op[3];
-                       u32 imm;
-               } mov_r9;
                u16 syscall;
                u16 bug;
        } code = {
@@ -83,12 +78,6 @@ static inline void xnarch_setup_mayday_page(void *page)
                        .op = 0xb8,
                        .imm = __xn_mux_code(0, __xn_sys_mayday)
                },
-               .mov_r9 = {
-                       .op = {
-                               0x49, 0xc7, 0xc1
-                       },
-                       .imm = 0
-               },
                .syscall = 0x050f,
                .bug = 0x0b0f,
        };
@@ -109,7 +98,6 @@ static inline void xnarch_handle_mayday(struct xnarchtcb 
*tcb,
 {
        tcb->mayday.eip = regs->x86reg_ip;
        tcb->mayday.eax = regs->x86reg_ax;
-       tcb->mayday.r9 = regs->r9;
        regs->x86reg_ip = tramp;
 }
 
@@ -118,7 +106,6 @@ static inline void xnarch_fixup_mayday(struct xnarchtcb 
*tcb,
 {
        regs->x86reg_ip = tcb->mayday.eip;
        regs->x86reg_ax = tcb->mayday.eax;
-       regs->r9 = tcb->mayday.r9;
 }
 
 #endif /* XNARCH_HAVE_MAYDAY */
diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h
index 06195c9..3beb1ca 100644
--- a/include/asm-x86/syscall.h
+++ b/include/asm-x86/syscall.h
@@ -25,26 +25,6 @@
 #define __xn_mux_code(shifted_id,op) ((op << 24)|shifted_id|(__xn_sys_mux & 
0x7fff))
 #define __xn_mux_shifted_id(id) ((id << 16) & 0xff0000)
 
-#ifdef __i386__
-/* On x86_32, we want ebp to be both a valid frame pointer for correct
-   backtraces, and allow kernel-space to find deterministically the
-   starting address of the xnsig structure. So, we build a phony stack
-   frame which contains the xnsig structure.
-
-   Furthermore, since ebp is used by inline assembly to generate
-   references to memory operands, we can not touch it before all
-   memory operands have been referenced, so we make ebp point to this
-   phony frame only for the time of the syscall instruction.
-
-   We rely on the fact that the sigs structure in the first in the frame.
-*/
-struct frame {
-       struct xnsig sigs;
-       void *last_fp;
-       void *fn_addr;
-};
-#endif /* __i386__ */
-
 #ifdef __KERNEL__
 
 #include <linux/errno.h>
@@ -62,15 +42,12 @@ struct frame {
 #define __xn_reg_arg3(regs)   ((regs)->x86reg_dx)
 #define __xn_reg_arg4(regs)   ((regs)->x86reg_si)
 #define __xn_reg_arg5(regs)   ((regs)->x86reg_di)
-#define __xn_reg_sigp(regs)   ((regs)->x86reg_bp                       \
-                              - offsetof(struct frame, last_fp))
 #else /* x86_64 */
 #define __xn_reg_arg1(regs)   ((regs)->x86reg_di)
 #define __xn_reg_arg2(regs)   ((regs)->x86reg_si)
 #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)
@@ -104,8 +81,6 @@ 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
@@ -174,16 +149,13 @@ static inline void __xn_get_ebp(void **dest)
        asm volatile("movl %%ebp, %0": "=m"(*dest));
 }
 
-#define XENOMAI_SYS_MUX_INNER(nr, op, args...)                 \
+#define XENOMAI_SYS_MUX(nr, op, args...)                       \
 ({                                                             \
        unsigned __resultvar;                                   \
        asm volatile (                                          \
                LOADARGS_##nr                                   \
                "movl %1, %%eax\n\t"                            \
-               "pushl %%ebp\n\t"                               \
-               "movl %2, %%ebp\n\t"                            \
                DOSYSCALL                                       \
-               "popl %%ebp\n\t"                                \
                RESTOREARGS_##nr                                \
                : "=a" (__resultvar)                            \
                : "i" (__xn_mux_code(0, op)) ASMFMT_##nr(args)  \
@@ -191,33 +163,13 @@ static inline void __xn_get_ebp(void **dest)
        (int) __resultvar;                                      \
 })
 
-#define XENOMAI_SYS_MUX(nr, op, args...)                               \
-({                                                                     \
-       int err, res = -ERESTART;                                       \
-       void **volatile fp;                                             \
-       struct frame f;                                                 \
-                                                                       \
-       __xn_get_eip(&f.fn_addr);                                       \
-       __xn_get_ebp(&f.last_fp);                                       \
-       fp = &f.last_fp;                                                \
-       do {                                                            \
-               f.sigs.nsigs = 0;                                       \
-               err = XENOMAI_SYS_MUX_INNER(nr, op, fp, args);          \
-               res = xnsig_dispatch(&f.sigs, res, err);                \
-       } while (res == -ERESTART);                                     \
-       res;                                                            \
-})
-
-#define XENOMAI_SYS_MUX_SAFE_INNER(nr, op, args...)            \
+#define XENOMAI_SYS_MUX_SAFE(nr, op, args...)                  \
 ({                                                             \
        unsigned __resultvar;                                   \
        asm volatile (                                          \
                LOADARGS_##nr                                   \
                "movl %1, %%eax\n\t"                            \
-               "pushl %%ebp\n\t"                               \
-               "movl %2, %%ebp\n\t"                            \
                DOSYSCALLSAFE                                   \
-               "popl %%ebp\n\t"                                \
                RESTOREARGS_##nr                                \
                : "=a" (__resultvar)                            \
                : "i" (__xn_mux_code(0, op)) ASMFMT_##nr(args)  \
@@ -225,34 +177,14 @@ static inline void __xn_get_ebp(void **dest)
        (int) __resultvar;                                      \
 })
 
-#define XENOMAI_SYS_MUX_SAFE(nr, op, args...)                          \
-({                                                                     \
-       int err, res = -ERESTART;                                       \
-       void **volatile fp;                                             \
-       struct frame f;                                                 \
-                                                                       \
-       __xn_get_eip(&f.fn_addr);                                       \
-       __xn_get_ebp(&f.last_fp);                                       \
-       fp = &f.last_fp;                                                \
-       do {                                                            \
-               f.sigs.nsigs = 0;                                       \
-               err = XENOMAI_SYS_MUX_SAFE_INNER(nr, op, fp, args);     \
-               res = xnsig_dispatch_safe(&f.sigs, res, err);           \
-       } while (res == -ERESTART);                                     \
-       res;                                                            \
-})
-
-#define XENOMAI_SKIN_MUX_INNER(nr, shifted_id, op, args...)    \
+#define XENOMAI_SKIN_MUX(nr, shifted_id, op, args...)          \
 ({                                                             \
        int __muxcode = __xn_mux_code(shifted_id, op);          \
        unsigned __resultvar;                                   \
        asm volatile (                                          \
                LOADARGS_##nr                                   \
                "movl %1, %%eax\n\t"                            \
-               "pushl %%ebp\n\t"                               \
-               "movl %2, %%ebp\n\t"                            \
                DOSYSCALL                                       \
-               "popl %%ebp\n\t"                                \
                RESTOREARGS_##nr                                \
                : "=a" (__resultvar)                            \
                : "m" (__muxcode) ASMFMT_##nr(args)             \
@@ -260,27 +192,10 @@ static inline void __xn_get_ebp(void **dest)
        (int) __resultvar;                                      \
 })
 
-#define XENOMAI_SKIN_MUX(nr, shifted_id, op, args...)                  \
-({                                                                     \
-       int err, res = -ERESTART;                                       \
-       void **volatile fp;                                             \
-       struct frame f;                                                 \
-                                                                       \
-       __xn_get_eip(&f.fn_addr);                                       \
-       __xn_get_ebp(&f.last_fp);                                       \
-       fp = &f.last_fp;                                                \
-       do {                                                            \
-               f.sigs.nsigs = 0;                                       \
-               err = XENOMAI_SKIN_MUX_INNER(nr, shifted_id, op, fp, args); \
-               res = xnsig_dispatch(&f.sigs, res, err);                \
-       } while (res == -ERESTART);                                     \
-       res;                                                            \
-})
-
 #define LOADARGS_0
 #define LOADARGS_1 \
-       "bpushl .L__X'%k3, %k3\n\t" \
-       "bmovl .L__X'%k3, %k3\n\t"
+       "bpushl .L__X'%k2, %k2\n\t" \
+       "bmovl .L__X'%k2, %k2\n\t"
 #define LOADARGS_2     LOADARGS_1
 #define LOADARGS_3     LOADARGS_1
 #define LOADARGS_4     LOADARGS_1
@@ -288,118 +203,88 @@ static inline void __xn_get_ebp(void **dest)
 
 #define RESTOREARGS_0
 #define RESTOREARGS_1 \
-       "bpopl .L__X'%k3, %k3\n\t"
+       "bpopl .L__X'%k2, %k2\n\t"
 #define RESTOREARGS_2  RESTOREARGS_1
 #define RESTOREARGS_3  RESTOREARGS_1
 #define RESTOREARGS_4  RESTOREARGS_1
 #define RESTOREARGS_5  RESTOREARGS_1
 
-#define ASMFMT_0(fp, dummy...) \
-       , "m" (fp)
-#define ASMFMT_1(fp, arg1) \
-       ASMFMT_0(fp), "acdSD" (arg1)
-#define ASMFMT_2(fp, arg1, arg2) \
-       ASMFMT_0(fp), "adSD" (arg1), "c" (arg2)
-#define ASMFMT_3(fp, arg1, arg2, arg3) \
-       ASMFMT_0(fp), "aSD" (arg1), "c" (arg2), "d" (arg3)
-#define ASMFMT_4(fp, arg1, arg2, arg3, arg4) \
-       ASMFMT_0(fp), "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
-#define ASMFMT_5(fp, arg1, arg2, arg3, arg4, arg5) \
-       ASMFMT_0(fp), "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
+#define ASMFMT_0()
+#define ASMFMT_1(arg1) \
+       , "acdSD" (arg1)
+#define ASMFMT_2(arg1, arg2) \
+       , "adSD" (arg1), "c" (arg2)
+#define ASMFMT_3(arg1, arg2, arg3) \
+       , "aSD" (arg1), "c" (arg2), "d" (arg3)
+#define ASMFMT_4(arg1, arg2, arg3, arg4) \
+       , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
+#define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
+       , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
 
 #define XENOMAI_SYSBIND(a1,a2,a3,a4) \
        XENOMAI_SYS_MUX_SAFE(4,__xn_sys_bind,a1,a2,a3,a4)
 
-#define XENOMAI_SYSSIGS(sigs)                                  \
-({                                                             \
-       void **volatile fp = &((struct frame *)sigs)->last_fp;  \
-       XENOMAI_SYS_MUX_INNER(0, __xn_sys_get_next_sigs, fp);   \
-})
-
-#define XENOMAI_SYSSIGS_SAFE(sigs)                                     \
-({                                                                     \
-       void **volatile fp = &((struct frame *)sigs)->last_fp;          \
-       XENOMAI_SYS_MUX_SAFE_INNER(0, __xn_sys_get_next_sigs, fp);      \
-})
-
 #else /* x86_64 */
 
 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
-#define LOAD_ARGS_0(sigp, dummy...)                    \
-       long int __arg6 = (long)(sigp);         \
-       asm volatile ("" : /* */ : /* */ : "memory");
+#define LOAD_ARGS_0()  asm volatile ("" : /* */ : /* */ : "memory");
 #else
-#define LOAD_ARGS_0(sigp, dummy...)                    \
-       long int __arg6 = (long)(sigp);
+#define LOAD_ARGS_0()
 #endif
-#define LOAD_REGS_0 \
-       register long int _a6 asm ("r9") = __arg6;
-#define ASM_ARGS_0      , "r" (_a6)
+#define LOAD_REGS_0
+#define ASM_ARGS_0
 
-#define LOAD_ARGS_1(sigp, a1)                          \
+#define LOAD_ARGS_1(a1)                                        \
        long int __arg1 = (long) (a1);                  \
-       LOAD_ARGS_0(sigp)
+       LOAD_ARGS_0()
 #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(sigp, a1, a2)                      \
+#define LOAD_ARGS_2(a1, a2)                            \
        long int __arg2 = (long) (a2);                  \
-       LOAD_ARGS_1(sigp, a1)
+       LOAD_ARGS_1(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(sigp, a1, a2, a3)                  \
+#define LOAD_ARGS_3(a1, a2, a3)                                \
        long int __arg3 = (long) (a3);                  \
-       LOAD_ARGS_2 (sigp, a1, a2)
+       LOAD_ARGS_2 (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(sigp, a1, a2, a3, a4)              \
+#define LOAD_ARGS_4(a1, a2, a3, a4)                    \
        long int __arg4 = (long) (a4);                  \
-       LOAD_ARGS_3 (sigp, a1, a2, a3)
+       LOAD_ARGS_3 (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(sigp, a1, a2, a3, a4, a5)          \
+#define LOAD_ARGS_5(a1, a2, a3, a4, a5)                        \
        long int __arg5 = (long) (a5);                  \
-       LOAD_ARGS_4 (sigp, a1, a2, a3, a4)
+       LOAD_ARGS_4 (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_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 (res == -ERESTART);                                     \
-       res;                                                            \
+#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");         \
+       (int) __resultvar;                              \
 })
 
 #define XENOMAI_SYS_MUX(nr, op, args...) \
@@ -411,8 +296,6 @@ static inline void __xn_get_ebp(void **dest)
 #define XENOMAI_SYSBIND(a1,a2,a3,a4) \
        XENOMAI_SYS_MUX(4,__xn_sys_bind,a1,a2,a3,a4)
 
-#define XENOMAI_SYSSIGS(sigs)                                  \
-       DO_SYSCALL_INNER(__xn_sys_get_next_sigs, 0, sigs)
 #endif /* x86_64 */
 
 #define XENOMAI_SYSCALL0(op)                   XENOMAI_SYS_MUX(0,op)
diff --git a/include/asm-x86/system_32.h b/include/asm-x86/system_32.h
index dc92f45..3c1507e 100644
--- a/include/asm-x86/system_32.h
+++ b/include/asm-x86/system_32.h
@@ -52,7 +52,6 @@ typedef struct xnarchtcb {      /* Per-thread arch-dependent 
block */
        struct {
                unsigned long eip;
                unsigned long eax;
-               unsigned long ebp;
        } mayday;
 #endif
 
diff --git a/include/asm-x86/system_64.h b/include/asm-x86/system_64.h
index 2afe553..da210f3 100644
--- a/include/asm-x86/system_64.h
+++ b/include/asm-x86/system_64.h
@@ -51,7 +51,6 @@ typedef struct xnarchtcb {      /* Per-thread arch-dependent 
block */
        struct {
                unsigned long eip;
                unsigned long eax;
-               unsigned long r9;
        } mayday;
 #endif
 


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

Reply via email to