2007-06-01 23:14:48

by Deepak Saxena

[permalink] [raw]
Subject: [PATCH RT] Fix NR_syscalls in ARM


The -rt patch adds a NR_syscalls symbol to the arm/unistd.h but
it is not the correct value as there are 348 syscalls on ARM
and the existing change sets the symbol to 322.

Signed-off-by: Deepak Saxena <[email protected]>

---

Russell: Why isn't this in mainline? Other arches all seem to have
this symbol already defined.

Index: linux-2.6.21/include/asm-arm/unistd.h
===================================================================
--- linux-2.6.21.orig/include/asm-arm/unistd.h
+++ linux-2.6.21/include/asm-arm/unistd.h
@@ -375,7 +375,7 @@
#define __NR_kexec_load (__NR_SYSCALL_BASE+347)

#ifndef __ASSEMBLY__
-#define NR_syscalls (__NR_set_mempolicy + 1 - __NR_SYSCALL_BASE)
+#define NR_syscalls (__NR_kexec_load + 1 - __NR_SYSCALL_BASE)
#endif

/*

--
Deepak Saxena - [email protected] - http://www.plexity.net


2007-06-01 23:18:57

by Russell King

[permalink] [raw]
Subject: Re: [PATCH RT] Fix NR_syscalls in ARM

On Fri, Jun 01, 2007 at 04:10:53PM -0700, Deepak Saxena wrote:
> The -rt patch adds a NR_syscalls symbol to the arm/unistd.h but
> it is not the correct value as there are 348 syscalls on ARM
> and the existing change sets the symbol to 322.
>
> Russell: Why isn't this in mainline? Other arches all seem to have
> this symbol already defined.

The hint is that it isn't in mainline; it's just plainly not required.
It's also the wrong place to define it; it's not a property that
unistd.h should concern itself with - it's a property of the kernel's
branch table for calling the syscalls, and on ARM we calculate that
number directly from the size of the kernel's branch table.

It's also not just last_syscall_number+1 since the table is sized to
make the assembly easy - iow, a number divisible by 4.

So all in all, NR_syscalls in unistd.h is just utterly wrong.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:

2007-06-01 23:28:16

by Russell King

[permalink] [raw]
Subject: Re: [PATCH RT] Fix NR_syscalls in ARM

On Sat, Jun 02, 2007 at 12:18:40AM +0100, Russell King wrote:
> On Fri, Jun 01, 2007 at 04:10:53PM -0700, Deepak Saxena wrote:
> > The -rt patch adds a NR_syscalls symbol to the arm/unistd.h but
> > it is not the correct value as there are 348 syscalls on ARM
> > and the existing change sets the symbol to 322.
> >
> > Russell: Why isn't this in mainline? Other arches all seem to have
> > this symbol already defined.
>
> The hint is that it isn't in mainline; it's just plainly not required.
> It's also the wrong place to define it; it's not a property that
> unistd.h should concern itself with - it's a property of the kernel's
> branch table for calling the syscalls, and on ARM we calculate that
> number directly from the size of the kernel's branch table.
>
> It's also not just last_syscall_number+1 since the table is sized to
> make the assembly easy - iow, a number divisible by 4.
>
> So all in all, NR_syscalls in unistd.h is just utterly wrong.

BTW, it should be pointed out that you've found the exact reason why
putting it in unistd.h is _wrong_. It's all to easy for it to get
out of sync with updates to the place where it really matters - the
code which bounds-checks the syscall number (that being the assembly
code which indexes the branch table.)

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: