Pull the common code out from the SYS_NI macros into a new __SYS_NI macro.
Also conditionalize the X64 version in preparation for enabling syscall
wrappers on 32-bit native kernels.
Signed-off-by: Brian Gerst <[email protected]>
Reviewed-by: Dominik Brodowski <[email protected]>
Reviewed-by: Andy Lutomirski <[email protected]>
---
arch/x86/include/asm/syscall_wrapper.h | 32 ++++++++++++++++++--------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index 0117b25e6753..1d96ccebc0d2 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -42,6 +42,9 @@ struct pt_regs;
return sys_ni_syscall(); \
}
+#define __SYS_NI(abi, name) \
+ SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers)
+
#ifdef CONFIG_X86_64
#define __X64_SYS_STUB0(name) \
__SYS_STUB0(x64, sys_##name)
@@ -52,10 +55,14 @@ struct pt_regs;
#define __X64_COND_SYSCALL(name) \
__COND_SYSCALL(x64, sys_##name)
+
+#define __X64_SYS_NI(name) \
+ __SYS_NI(x64, sys_##name)
#else /* CONFIG_X86_64 */
#define __X64_SYS_STUB0(name)
#define __X64_SYS_STUBx(x, name, ...)
#define __X64_COND_SYSCALL(name)
+#define __X64_SYS_NI(name)
#endif /* CONFIG_X86_64 */
#ifdef CONFIG_IA32_EMULATION
@@ -77,6 +84,9 @@ struct pt_regs;
#define __IA32_COMPAT_COND_SYSCALL(name) \
__COND_SYSCALL(ia32, compat_sys_##name)
+#define __IA32_COMPAT_SYS_NI(name) \
+ __SYS_NI(ia32, compat_sys_##name)
+
#define __IA32_SYS_STUB0(name) \
__SYS_STUB0(ia32, sys_##name)
@@ -87,17 +97,17 @@ struct pt_regs;
#define __IA32_COND_SYSCALL(name) \
__COND_SYSCALL(ia32, sys_##name)
-#define SYS_NI(name) \
- SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \
- SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers)
-
+#define __IA32_SYS_NI(name) \
+ __SYS_NI(ia32, sys_##name)
#else /* CONFIG_IA32_EMULATION */
#define __IA32_COMPAT_SYS_STUB0(name)
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
#define __IA32_COMPAT_COND_SYSCALL(name)
+#define __IA32_COMPAT_SYS_NI(name)
#define __IA32_SYS_STUB0(name)
#define __IA32_SYS_STUBx(x, name, ...)
#define __IA32_COND_SYSCALL(name)
+#define __IA32_SYS_NI(name)
#endif /* CONFIG_IA32_EMULATION */
@@ -116,10 +126,14 @@ struct pt_regs;
#define __X32_COMPAT_COND_SYSCALL(name) \
__COND_SYSCALL(x32, compat_sys_##name)
+
+#define __X32_COMPAT_SYS_NI(name) \
+ __SYS_NI(x32, compat_sys_##name)
#else /* CONFIG_X86_X32 */
#define __X32_COMPAT_SYS_STUB0(name)
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
#define __X32_COMPAT_COND_SYSCALL(name)
+#define __X32_COMPAT_SYS_NI(name)
#endif /* CONFIG_X86_X32 */
@@ -158,8 +172,8 @@ struct pt_regs;
__X32_COMPAT_COND_SYSCALL(name)
#define COMPAT_SYS_NI(name) \
- SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \
- SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers)
+ __IA32_COMPAT_SYS_NI(name) \
+ __X32_COMPAT_SYS_NI(name)
#endif /* CONFIG_COMPAT */
@@ -231,9 +245,9 @@ struct pt_regs;
__X64_COND_SYSCALL(name) \
__IA32_COND_SYSCALL(name)
-#ifndef SYS_NI
-#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);
-#endif
+#define SYS_NI(name) \
+ __X64_SYS_NI(name) \
+ __IA32_SYS_NI(name)
/*
--
2.24.1
The following commit has been merged into the x86/entry branch of tip:
Commit-ID: a74d187c2df3a382b8ab6227da34cba690e71e4d
Gitweb: https://git.kernel.org/tip/a74d187c2df3a382b8ab6227da34cba690e71e4d
Author: Brian Gerst <[email protected]>
AuthorDate: Fri, 13 Mar 2020 15:51:30 -04:00
Committer: Thomas Gleixner <[email protected]>
CommitterDate: Sat, 21 Mar 2020 16:03:20 +01:00
x86/entry: Refactor SYS_NI macros
Pull the common code out from the SYS_NI macros into a new __SYS_NI macro.
Also conditionalize the X64 version in preparation for enabling syscall
wrappers on 32-bit native kernels.
Signed-off-by: Brian Gerst <[email protected]>
Signed-off-by: Thomas Gleixner <[email protected]>
Reviewed-by: Dominik Brodowski <[email protected]>
Reviewed-by: Andy Lutomirski <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
arch/x86/include/asm/syscall_wrapper.h | 32 +++++++++++++++++--------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index 0117b25..1d96cce 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -42,6 +42,9 @@ struct pt_regs;
return sys_ni_syscall(); \
}
+#define __SYS_NI(abi, name) \
+ SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers)
+
#ifdef CONFIG_X86_64
#define __X64_SYS_STUB0(name) \
__SYS_STUB0(x64, sys_##name)
@@ -52,10 +55,14 @@ struct pt_regs;
#define __X64_COND_SYSCALL(name) \
__COND_SYSCALL(x64, sys_##name)
+
+#define __X64_SYS_NI(name) \
+ __SYS_NI(x64, sys_##name)
#else /* CONFIG_X86_64 */
#define __X64_SYS_STUB0(name)
#define __X64_SYS_STUBx(x, name, ...)
#define __X64_COND_SYSCALL(name)
+#define __X64_SYS_NI(name)
#endif /* CONFIG_X86_64 */
#ifdef CONFIG_IA32_EMULATION
@@ -77,6 +84,9 @@ struct pt_regs;
#define __IA32_COMPAT_COND_SYSCALL(name) \
__COND_SYSCALL(ia32, compat_sys_##name)
+#define __IA32_COMPAT_SYS_NI(name) \
+ __SYS_NI(ia32, compat_sys_##name)
+
#define __IA32_SYS_STUB0(name) \
__SYS_STUB0(ia32, sys_##name)
@@ -87,17 +97,17 @@ struct pt_regs;
#define __IA32_COND_SYSCALL(name) \
__COND_SYSCALL(ia32, sys_##name)
-#define SYS_NI(name) \
- SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers); \
- SYSCALL_ALIAS(__ia32_sys_##name, sys_ni_posix_timers)
-
+#define __IA32_SYS_NI(name) \
+ __SYS_NI(ia32, sys_##name)
#else /* CONFIG_IA32_EMULATION */
#define __IA32_COMPAT_SYS_STUB0(name)
#define __IA32_COMPAT_SYS_STUBx(x, name, ...)
#define __IA32_COMPAT_COND_SYSCALL(name)
+#define __IA32_COMPAT_SYS_NI(name)
#define __IA32_SYS_STUB0(name)
#define __IA32_SYS_STUBx(x, name, ...)
#define __IA32_COND_SYSCALL(name)
+#define __IA32_SYS_NI(name)
#endif /* CONFIG_IA32_EMULATION */
@@ -116,10 +126,14 @@ struct pt_regs;
#define __X32_COMPAT_COND_SYSCALL(name) \
__COND_SYSCALL(x32, compat_sys_##name)
+
+#define __X32_COMPAT_SYS_NI(name) \
+ __SYS_NI(x32, compat_sys_##name)
#else /* CONFIG_X86_X32 */
#define __X32_COMPAT_SYS_STUB0(name)
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
#define __X32_COMPAT_COND_SYSCALL(name)
+#define __X32_COMPAT_SYS_NI(name)
#endif /* CONFIG_X86_X32 */
@@ -158,8 +172,8 @@ struct pt_regs;
__X32_COMPAT_COND_SYSCALL(name)
#define COMPAT_SYS_NI(name) \
- SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \
- SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers)
+ __IA32_COMPAT_SYS_NI(name) \
+ __X32_COMPAT_SYS_NI(name)
#endif /* CONFIG_COMPAT */
@@ -231,9 +245,9 @@ struct pt_regs;
__X64_COND_SYSCALL(name) \
__IA32_COND_SYSCALL(name)
-#ifndef SYS_NI
-#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);
-#endif
+#define SYS_NI(name) \
+ __X64_SYS_NI(name) \
+ __IA32_SYS_NI(name)
/*
* Brian Gerst <[email protected]> wrote:
> Pull the common code out from the SYS_NI macros into a new __SYS_NI macro.
> Also conditionalize the X64 version in preparation for enabling syscall
> wrappers on 32-bit native kernels.
>
> Signed-off-by: Brian Gerst <[email protected]>
> Reviewed-by: Dominik Brodowski <[email protected]>
> Reviewed-by: Andy Lutomirski <[email protected]>
> #define COMPAT_SYS_NI(name) \
> - SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \
> - SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers)
> + __IA32_COMPAT_SYS_NI(name) \
> + __X32_COMPAT_SYS_NI(name)
>
> #endif /* CONFIG_COMPAT */
>
> @@ -231,9 +245,9 @@ struct pt_regs;
> __X64_COND_SYSCALL(name) \
> __IA32_COND_SYSCALL(name)
>
> -#ifndef SYS_NI
> -#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);
> -#endif
> +#define SYS_NI(name) \
> + __X64_SYS_NI(name) \
> + __IA32_SYS_NI(name)
This breaks the x86-64 build on !CONFIG_POSIX_TIMERS (and probably also
with some x32 build variants), because of a missing ';' between
__X64_SYS_NI() and __IA32_SYS_NI().
I suspect testing didn't catch this because SYS_NI() is rarely used in
our x86-64 Kconfig space.
Very lightly tested fix attached.
I didn't see the COND_SYSCALL_COMPAT() build failure, but seems to have a
similar bug.
Thanks,
Ingo
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/include/asm/syscall_wrapper.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
index e10efa1454bc..8929419b9783 100644
--- a/arch/x86/include/asm/syscall_wrapper.h
+++ b/arch/x86/include/asm/syscall_wrapper.h
@@ -214,12 +214,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
* COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
* kernel/time/posix-stubs.c to cover this case as well.
*/
-#define COND_SYSCALL_COMPAT(name) \
- __IA32_COMPAT_COND_SYSCALL(name) \
+#define COND_SYSCALL_COMPAT(name) \
+ __IA32_COMPAT_COND_SYSCALL(name); \
__X32_COMPAT_COND_SYSCALL(name)
#define COMPAT_SYS_NI(name) \
- __IA32_COMPAT_SYS_NI(name) \
+ __IA32_COMPAT_SYS_NI(name); \
__X32_COMPAT_SYS_NI(name)
#endif /* CONFIG_COMPAT */
@@ -257,7 +257,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
__IA32_COND_SYSCALL(name)
#define SYS_NI(name) \
- __X64_SYS_NI(name) \
+ __X64_SYS_NI(name); \
__IA32_SYS_NI(name)
On Mon, Mar 23, 2020 at 4:11 AM Ingo Molnar <[email protected]> wrote:
>
>
> * Brian Gerst <[email protected]> wrote:
>
> > Pull the common code out from the SYS_NI macros into a new __SYS_NI macro.
> > Also conditionalize the X64 version in preparation for enabling syscall
> > wrappers on 32-bit native kernels.
> >
> > Signed-off-by: Brian Gerst <[email protected]>
> > Reviewed-by: Dominik Brodowski <[email protected]>
> > Reviewed-by: Andy Lutomirski <[email protected]>
>
> > #define COMPAT_SYS_NI(name) \
> > - SYSCALL_ALIAS(__ia32_compat_sys_##name, sys_ni_posix_timers); \
> > - SYSCALL_ALIAS(__x32_compat_sys_##name, sys_ni_posix_timers)
> > + __IA32_COMPAT_SYS_NI(name) \
> > + __X32_COMPAT_SYS_NI(name)
> >
> > #endif /* CONFIG_COMPAT */
> >
> > @@ -231,9 +245,9 @@ struct pt_regs;
> > __X64_COND_SYSCALL(name) \
> > __IA32_COND_SYSCALL(name)
> >
> > -#ifndef SYS_NI
> > -#define SYS_NI(name) SYSCALL_ALIAS(__x64_sys_##name, sys_ni_posix_timers);
> > -#endif
> > +#define SYS_NI(name) \
> > + __X64_SYS_NI(name) \
> > + __IA32_SYS_NI(name)
>
> This breaks the x86-64 build on !CONFIG_POSIX_TIMERS (and probably also
> with some x32 build variants), because of a missing ';' between
> __X64_SYS_NI() and __IA32_SYS_NI().
>
> I suspect testing didn't catch this because SYS_NI() is rarely used in
> our x86-64 Kconfig space.
>
> Very lightly tested fix attached.
>
> I didn't see the COND_SYSCALL_COMPAT() build failure, but seems to have a
> similar bug.
>
> Thanks,
>
> Ingo
>
> Signed-off-by: Ingo Molnar <[email protected]>
>
> ---
> arch/x86/include/asm/syscall_wrapper.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h
> index e10efa1454bc..8929419b9783 100644
> --- a/arch/x86/include/asm/syscall_wrapper.h
> +++ b/arch/x86/include/asm/syscall_wrapper.h
> @@ -214,12 +214,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
> * kernel/time/posix-stubs.c to cover this case as well.
> */
> -#define COND_SYSCALL_COMPAT(name) \
> - __IA32_COMPAT_COND_SYSCALL(name) \
> +#define COND_SYSCALL_COMPAT(name) \
> + __IA32_COMPAT_COND_SYSCALL(name); \
> __X32_COMPAT_COND_SYSCALL(name)
>
> #define COMPAT_SYS_NI(name) \
> - __IA32_COMPAT_SYS_NI(name) \
> + __IA32_COMPAT_SYS_NI(name); \
> __X32_COMPAT_SYS_NI(name)
>
> #endif /* CONFIG_COMPAT */
> @@ -257,7 +257,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
> __IA32_COND_SYSCALL(name)
>
> #define SYS_NI(name) \
> - __X64_SYS_NI(name) 6e4847640c6aebcaa2d9b3686cecc91b41f09269 \
> + __X64_SYS_NI(name); \
> __IA32_SYS_NI(name)
>
>
A simpler fix would be to add the semicolon to the end of the __SYS_NI
macro. COND_SYSCALL_COMPAT isn't a problem because it expands to a
function instead of an asm statement.
That said, I think __SYS_NI should be changed to mirror
__COND_SYSCALL, so that the function prototypes match (see commit
6e484764)
--
Brian Gerst