2018-03-10 20:57:06

by Tautschnig, Michael

[permalink] [raw]
Subject: [PATCH] x86: always use SYSCALL_DEFINE*

All syscall arguments are passed in as types of the same byte size as
unsigned long (width of full registers). Using a smaller type without a
cast may result in losing bits of information. SYSCALL_DEFINE* introduce
adequate type casts. All definitions of syscalls in x86 except for those
patched here have already been using the appropriate SYSCALL_DEFINE*.

Signed-off-by: Michael Tautschnig <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Jaswinder Singh <[email protected]>
Cc: Andi Kleen <[email protected]>
---
arch/x86/kernel/ioport.c | 3 ++-
arch/x86/kernel/signal.c | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
index 2f72330..d98b2a3 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -23,7 +23,8 @@
/*
* this changes the io permissions bitmap in the current task.
*/
-asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
+SYSCALL_DEFINE3(sys_ioperm, unsigned long, from, unsigned long, num, int,
+ turn_on)
{
struct thread_struct *t = &current->thread;
struct tss_struct *tss;
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index b9e00e8..40ba242 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -25,6 +25,7 @@
#include <linux/user-return-notifier.h>
#include <linux/uprobes.h>
#include <linux/context_tracking.h>
+#include <linux/syscalls.h>

#include <asm/processor.h>
#include <asm/ucontext.h>
@@ -601,7 +602,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
* Do a signal return; undo the signal stack.
*/
#ifdef CONFIG_X86_32
-asmlinkage unsigned long sys_sigreturn(void)
+SYSCALL_DEFINE0(sigreturn)
{
struct pt_regs *regs = current_pt_regs();
struct sigframe __user *frame;
@@ -633,7 +634,7 @@ asmlinkage unsigned long sys_sigreturn(void)
}
#endif /* CONFIG_X86_32 */

-asmlinkage long sys_rt_sigreturn(void)
+SYSCALL_DEFINE0(rt_sigreturn)
{
struct pt_regs *regs = current_pt_regs();
struct rt_sigframe __user *frame;
--
2.7.3.AMZN



Amazon Web Services UK Limited. Registered in England and Wales with registration number 08650665 with its registered office at 1 Principal Place, Worship Street, London, EC2A 2FA, United Kingdom.





2018-03-10 21:01:03

by Tautschnig, Michael

[permalink] [raw]
Subject: Re: [PATCH] x86: always use SYSCALL_DEFINE*

On 10 Mar 2018, at 20:55, Tautschnig, Michael <[email protected]> wrote:
>
> All syscall arguments are passed in as types of the same byte size as
> unsigned long (width of full registers). Using a smaller type without a
> cast may result in losing bits of information. SYSCALL_DEFINE* introduce
> adequate type casts. All definitions of syscalls in x86 except for those
> patched here have already been using the appropriate SYSCALL_DEFINE*.
[...]

Additional context: I had previously made an attempt to ensure type
consistency of sys_ioperm as "Syscall arguments are unsigned long (full
registers)" (https://lkml.org/lkml/2016/7/4/336). I hope the new proposal
is more acceptable.

Best,
Michael



Amazon Web Services UK Limited. Registered in England and Wales with registration number 08650665 with its registered office at 1 Principal Place, Worship Street, London, EC2A 2FA, United Kingdom.




2018-03-11 09:48:13

by Tautschnig, Michael

[permalink] [raw]
Subject: [PATCH v2] x86: always use SYSCALL_DEFINE*

All syscall arguments are passed in as types of the same byte size as
unsigned long (width of full registers). Using a smaller type without a
cast may result in losing bits of information. SYSCALL_DEFINE* introduce
adequate type casts. All definitions of syscalls in x86 except for those
patched here have already been using the appropriate SYSCALL_DEFINE*.

Signed-off-by: Michael Tautschnig <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: Jaswinder Singh <[email protected]>
Cc: Andi Kleen <[email protected]>
---
arch/x86/kernel/ioport.c | 3 ++-
arch/x86/kernel/signal.c | 5 +++--
2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
index 2f72330..7db3d65 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -23,7 +23,8 @@
/*
* this changes the io permissions bitmap in the current task.
*/
-asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
+SYSCALL_DEFINE3(ioperm, unsigned long, from, unsigned long, num, int,
+ turn_on)
{
struct thread_struct *t = &current->thread;
struct tss_struct *tss;
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index b9e00e8..40ba242 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -25,6 +25,7 @@
#include <linux/user-return-notifier.h>
#include <linux/uprobes.h>
#include <linux/context_tracking.h>
+#include <linux/syscalls.h>

#include <asm/processor.h>
#include <asm/ucontext.h>
@@ -601,7 +602,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
* Do a signal return; undo the signal stack.
*/
#ifdef CONFIG_X86_32
-asmlinkage unsigned long sys_sigreturn(void)
+SYSCALL_DEFINE0(sigreturn)
{
struct pt_regs *regs = current_pt_regs();
struct sigframe __user *frame;
@@ -633,7 +634,7 @@ asmlinkage unsigned long sys_sigreturn(void)
}
#endif /* CONFIG_X86_32 */

-asmlinkage long sys_rt_sigreturn(void)
+SYSCALL_DEFINE0(rt_sigreturn)
{
struct pt_regs *regs = current_pt_regs();
struct rt_sigframe __user *frame;
--
2.7.3.AMZN



Amazon Web Services UK Limited. Registered in England and Wales with registration number 08650665 with its registered office at 1 Principal Place, Worship Street, London, EC2A 2FA, United Kingdom.




2018-03-13 21:17:43

by Jann Horn

[permalink] [raw]
Subject: Re: [PATCH] x86: always use SYSCALL_DEFINE*

On Sat, Mar 10, 2018 at 12:55 PM, Tautschnig, Michael
<[email protected]> wrote:
> All syscall arguments are passed in as types of the same byte size as
> unsigned long (width of full registers). Using a smaller type without a
> cast may result in losing bits of information. SYSCALL_DEFINE* introduce
> adequate type casts. All definitions of syscalls in x86 except for those
> patched here have already been using the appropriate SYSCALL_DEFINE*.
[...]
> diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
> index 2f72330..d98b2a3 100644
> --- a/arch/x86/kernel/ioport.c
> +++ b/arch/x86/kernel/ioport.c
> @@ -23,7 +23,8 @@
> /*
> * this changes the io permissions bitmap in the current task.
> */
> -asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
> +SYSCALL_DEFINE3(sys_ioperm, unsigned long, from, unsigned long, num, int,
> + turn_on)

Shouldn't this be "SYSCALL_DEFINE3(ioperm, [...]", without the "sys_"?

2018-03-13 23:19:52

by Andy Lutomirski

[permalink] [raw]
Subject: Re: [PATCH] x86: always use SYSCALL_DEFINE*

On Tue, Mar 13, 2018 at 9:16 PM, Jann Horn <[email protected]> wrote:
> On Sat, Mar 10, 2018 at 12:55 PM, Tautschnig, Michael
> <[email protected]> wrote:
>> All syscall arguments are passed in as types of the same byte size as
>> unsigned long (width of full registers). Using a smaller type without a
>> cast may result in losing bits of information. SYSCALL_DEFINE* introduce
>> adequate type casts. All definitions of syscalls in x86 except for those
>> patched here have already been using the appropriate SYSCALL_DEFINE*.
> [...]
>> diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
>> index 2f72330..d98b2a3 100644
>> --- a/arch/x86/kernel/ioport.c
>> +++ b/arch/x86/kernel/ioport.c
>> @@ -23,7 +23,8 @@
>> /*
>> * this changes the io permissions bitmap in the current task.
>> */
>> -asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
>> +SYSCALL_DEFINE3(sys_ioperm, unsigned long, from, unsigned long, num, int,
>> + turn_on)
>
> Shouldn't this be "SYSCALL_DEFINE3(ioperm, [...]", without the "sys_"?
> --
> To unsubscribe from this list: send the line "unsubscribe linux-api" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

I think this patch will be obsoleted by a series of patches from Dominik.

2018-03-14 05:59:33

by Dominik Brodowski

[permalink] [raw]
Subject: Re: [PATCH] x86: always use SYSCALL_DEFINE*

Michael,

On Tue, Mar 13, 2018 at 11:18:08PM +0000, Andy Lutomirski wrote:
> On Tue, Mar 13, 2018 at 9:16 PM, Jann Horn <[email protected]> wrote:
> > On Sat, Mar 10, 2018 at 12:55 PM, Tautschnig, Michael
> > <[email protected]> wrote:
> >> All syscall arguments are passed in as types of the same byte size as
> >> unsigned long (width of full registers). Using a smaller type without a
> >> cast may result in losing bits of information. SYSCALL_DEFINE* introduce
> >> adequate type casts. All definitions of syscalls in x86 except for those
> >> patched here have already been using the appropriate SYSCALL_DEFINE*.
> > [...]
> >> diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
> >> index 2f72330..d98b2a3 100644
> >> --- a/arch/x86/kernel/ioport.c
> >> +++ b/arch/x86/kernel/ioport.c
> >> @@ -23,7 +23,8 @@
> >> /*
> >> * this changes the io permissions bitmap in the current task.
> >> */
> >> -asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
> >> +SYSCALL_DEFINE3(sys_ioperm, unsigned long, from, unsigned long, num, int,
> >> + turn_on)
> >
> > Shouldn't this be "SYSCALL_DEFINE3(ioperm, [...]", without the "sys_"?
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-api" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> I think this patch will be obsoleted by a series of patches from Dominik.

... the ioperm change is already in mainline (did an equivalent change a
couple of days ago), but the sigreturn/rt_sigreturn changes still seem
useful. Could you send a fresh patch with just these two changes; and -- if
the x86 maintainers agree -- I will push it with my syscall-related changes?

Thanks,
Dominik

2018-03-14 09:45:14

by Tautschnig, Michael

[permalink] [raw]
Subject: Re: [PATCH] x86: always use SYSCALL_DEFINE*

Hi Dominik,

> On 14 Mar 2018, at 05:48, Dominik Brodowski <[email protected]> wrote:
> [...]
> ... the ioperm change is already in mainline (did an equivalent change a
> couple of days ago), but the sigreturn/rt_sigreturn changes still seem
> useful. Could you send a fresh patch with just these two changes; and -- if
> the x86 maintainers agree -- I will push it with my syscall-related changes?

Thanks for all this cleanup work. I have posted the {rt_,}sigreturn changes as
"[PATCH] x86/sigreturn: use SYSCALL_DEFINE0".

Best,
Michael






Amazon Web Services UK Limited. Registered in England and Wales with registration number 08650665 with its registered office at 1 Principal Place, Worship Street, London, EC2A 2FA, United Kingdom.