mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-24 03:31:07 +00:00
i686: Add INTERNAL_SYSCALL_NCS 6 argument support
It is required for i686 BZ#12683 support when building with -Os or -fno-omit-frame-pointer on some gcc versions. It is not used on current code. Check on i686-linux-gnu.
This commit is contained in:
parent
c580e6466d
commit
4b850b1f29
@ -311,11 +311,27 @@ struct libc_do_syscall_args
|
||||
INTERNAL_SYSCALL_MAIN_INLINE(name, 4, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_5(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_INLINE(name, 5, args)
|
||||
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_0(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 0, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_1(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 1, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_2(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 2, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_3(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 3, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_4(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 4, args)
|
||||
#define INTERNAL_SYSCALL_MAIN_NCS_5(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 5, args)
|
||||
|
||||
/* Each object using 6-argument inline syscalls must include a
|
||||
definition of __libc_do_syscall. */
|
||||
#ifdef OPTIMIZE_FOR_GCC_5
|
||||
# define INTERNAL_SYSCALL_MAIN_6(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_INLINE(name, 6, args)
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS_6(name, args...) \
|
||||
INTERNAL_SYSCALL_MAIN_NCS(name, 6, args)
|
||||
#else /* GCC 5 */
|
||||
# define INTERNAL_SYSCALL_MAIN_6(name, arg1, arg2, arg3, \
|
||||
arg4, arg5, arg6) \
|
||||
@ -331,12 +347,33 @@ struct libc_do_syscall_args
|
||||
: "=a" (resultvar) \
|
||||
: "i" (__NR_##name), "c" (arg2), "d" (arg3), "S" (arg4), "D" (&_xv) \
|
||||
: "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS_6(name, arg1, arg2, arg3, \
|
||||
arg4, arg5, arg6) \
|
||||
struct libc_do_syscall_args _xv = \
|
||||
{ \
|
||||
(int) (arg1), \
|
||||
(int) (arg5), \
|
||||
(int) (arg6) \
|
||||
}; \
|
||||
asm volatile ( \
|
||||
"movl %1, %%eax\n\t" \
|
||||
"call __libc_do_syscall" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (name), "c" (arg2), "d" (arg3), "S" (arg4), "D" (&_xv) \
|
||||
: "memory", "cc")
|
||||
#endif /* GCC 5 */
|
||||
|
||||
#define INTERNAL_SYSCALL(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
INTERNAL_SYSCALL_MAIN_##nr (name, args); \
|
||||
(int) resultvar; })
|
||||
#define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
INTERNAL_SYSCALL_MAIN_NCS_##nr (name, args); \
|
||||
(int) resultvar; })
|
||||
|
||||
#if I386_USE_SYSENTER
|
||||
# ifdef OPTIMIZE_FOR_GCC_5
|
||||
# ifdef PIC
|
||||
@ -347,16 +384,13 @@ struct libc_do_syscall_args
|
||||
: "=a" (resultvar) \
|
||||
: "a" (__NR_##name), "i" (offsetof (tcbhead_t, sysinfo)) \
|
||||
ASMARGS_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
LOADREGS_##nr(args) \
|
||||
asm volatile ( \
|
||||
"call *%%gs:%P2" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (name), "i" (offsetof (tcbhead_t, sysinfo)) \
|
||||
ASMARGS_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
ASMARGS_##nr(args) : "memory", "cc")
|
||||
# else
|
||||
# define INTERNAL_SYSCALL_MAIN_INLINE(name, nr, args...) \
|
||||
LOADREGS_##nr(args) \
|
||||
@ -364,15 +398,12 @@ struct libc_do_syscall_args
|
||||
"call *_dl_sysinfo" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (__NR_##name) ASMARGS_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
LOADREGS_##nr(args) \
|
||||
asm volatile ( \
|
||||
"call *_dl_sysinfo" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (name) ASMARGS_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
: "a" (name) ASMARGS_##nr(args) : "memory", "cc")
|
||||
# endif
|
||||
# else /* GCC 5 */
|
||||
# ifdef PIC
|
||||
@ -386,9 +417,7 @@ struct libc_do_syscall_args
|
||||
: "=a" (resultvar) \
|
||||
: "i" (__NR_##name), "i" (offsetof (tcbhead_t, sysinfo)) \
|
||||
ASMFMT_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
EXTRAVAR_##nr \
|
||||
asm volatile ( \
|
||||
LOADARGS_##nr \
|
||||
@ -396,8 +425,7 @@ struct libc_do_syscall_args
|
||||
RESTOREARGS_##nr \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name), "i" (offsetof (tcbhead_t, sysinfo)) \
|
||||
ASMFMT_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
ASMFMT_##nr(args) : "memory", "cc")
|
||||
# else
|
||||
# define INTERNAL_SYSCALL_MAIN_INLINE(name, nr, args...) \
|
||||
EXTRAVAR_##nr \
|
||||
@ -408,17 +436,14 @@ struct libc_do_syscall_args
|
||||
RESTOREARGS_##nr \
|
||||
: "=a" (resultvar) \
|
||||
: "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
EXTRAVAR_##nr \
|
||||
asm volatile ( \
|
||||
LOADARGS_##nr \
|
||||
"call *_dl_sysinfo\n\t" \
|
||||
RESTOREARGS_##nr \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name) ASMFMT_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
: "0" (name) ASMFMT_##nr(args) : "memory", "cc")
|
||||
# endif
|
||||
# endif /* GCC 5 */
|
||||
#else
|
||||
@ -429,15 +454,12 @@ struct libc_do_syscall_args
|
||||
"int $0x80" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (__NR_##name) ASMARGS_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
LOADREGS_##nr(args) \
|
||||
asm volatile ( \
|
||||
"int $0x80" \
|
||||
: "=a" (resultvar) \
|
||||
: "a" (name) ASMARGS_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
: "a" (name) ASMARGS_##nr(args) : "memory", "cc")
|
||||
# else /* GCC 5 */
|
||||
# define INTERNAL_SYSCALL_MAIN_INLINE(name, nr, args...) \
|
||||
EXTRAVAR_##nr \
|
||||
@ -448,17 +470,14 @@ struct libc_do_syscall_args
|
||||
RESTOREARGS_##nr \
|
||||
: "=a" (resultvar) \
|
||||
: "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc")
|
||||
# define INTERNAL_SYSCALL_NCS(name, nr, args...) \
|
||||
({ \
|
||||
register unsigned int resultvar; \
|
||||
# define INTERNAL_SYSCALL_MAIN_NCS(name, nr, args...) \
|
||||
EXTRAVAR_##nr \
|
||||
asm volatile ( \
|
||||
LOADARGS_##nr \
|
||||
"int $0x80\n\t" \
|
||||
RESTOREARGS_##nr \
|
||||
: "=a" (resultvar) \
|
||||
: "0" (name) ASMFMT_##nr(args) : "memory", "cc"); \
|
||||
(int) resultvar; })
|
||||
: "0" (name) ASMFMT_##nr(args) : "memory", "cc")
|
||||
# endif /* GCC 5 */
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user