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