Skip to contentSkip to conversation

Fix NR_syscalls in ARM

PATCH In review Deepak Saxena 2 participants 3 messages Jun 1, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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.

---

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

include/asm-arm/unistd.h +1 -1
Index: 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
 
 /*
Signature · 1 line
Deepak Saxena - [email protected] - http://www.plexity.net 
#1 lore raw
Quoted 6 lines · Deepak Saxena

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.

Signature · 3 lines
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:
#2 lore raw
Quoted 14 lines · Russell King
Quoted 6 lines · Deepak Saxena

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.

Quoted 4 lines

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.)

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