@@ -215,20 +215,20 @@ linux_gateway_entry:
/* Note! We cannot use the syscall table that is mapped
nearby since the gateway page is mapped execute-only. */
+ load32 sys_call_table, %r19
#ifdef CONFIG_64BIT
- ldil L%sys_call_table, %r1
- or,= %r2,%r2,%r2
- addil L%(sys_call_table64-sys_call_table), %r1
- ldo R%sys_call_table(%r1), %r19
+ copy %r20, %r1
or,= %r2,%r2,%r2
- ldo R%sys_call_table64(%r1), %r19
+ ldo __NR_Linux_syscalls(%r20), %r1
+ ldw,s %r1(%r19), %r1
+ add %r1, %r19, %r19
+ depdi 0, 31, 32, %r19 /* clip upper bits */
#else
- load32 sys_call_table, %r19
-#endif
+ ldw,s %r20(%r19), %r19
+#endif
+
comiclr,>> __NR_Linux_syscalls, %r20, %r0
b,n .Lsyscall_nosys
-
- LDREGX %r20(%r19), %r19
/* If this is a sys_rt_sigreturn call, and the signal was received
* when not in_syscall, then we want to return via syscall_exit_rfi,
@@ -350,22 +350,21 @@ tracesys_next:
/* Note! We cannot use the syscall table that is mapped
nearby since the gateway page is mapped execute-only. */
+ load32 sys_call_table, %r19
#ifdef CONFIG_64BIT
- LDREG TASK_PT_GR30(%r1), %r19 /* get users sp back */
- extrd,u %r19,63,1,%r2 /* W hidden in bottom bit */
+ LDREG TASK_PT_GR30(%r1), %r1 /* get users sp back */
+ extrd,u %r1,63,1,%r2 /* W hidden in bottom bit */
- ldil L%sys_call_table, %r1
- or,= %r2,%r2,%r2
- addil L%(sys_call_table64-sys_call_table), %r1
- ldo R%sys_call_table(%r1), %r19
+ copy %r20, %r1
or,= %r2,%r2,%r2
- ldo R%sys_call_table64(%r1), %r19
+ ldo __NR_Linux_syscalls(%r20), %r1
+ ldw,s %r1(%r19), %r1
+ add %r1, %r19, %r19
+ depdi 0, 31, 32, %r19 /* clip upper bits */
#else
- load32 sys_call_table, %r19
+ ldw,s %r20(%r19), %r19
#endif
- LDREGX %r20(%r19), %r19
-
/* If this is a sys_rt_sigreturn call, and the signal was received
* when not in_syscall, then we want to return via syscall_exit_rfi,
* not syscall_exit. Signal no. in r20, in_syscall in r25 (see
@@ -923,12 +922,14 @@ ENTRY(lws_table)
END(lws_table)
/* End of lws table */
-#define __SYSCALL(nr, entry, nargs) ASM_ULONG_INSN entry
+
ENTRY(sys_call_table)
#if defined(CONFIG_64BIT)
+#define __SYSCALL(nr, entry, nargs) .word (entry - sys_call_table) /* 32-bit relative */
#include <asm/syscall_table_c32.h> /* compat syscalls */
#else
+#define __SYSCALL(nr, entry, nargs) .word entry
#include <asm/syscall_table_32.h> /* 32-bit native syscalls */
#endif
END(sys_call_table)
This patch (on top of the syscall-table refracturing patch by Firoz Khan) halves the requires size for the syscall table and thus saves 4*351*2 bytes = 2808 bytes (4 bytes per syscall * syscalls * 64&32-bit entries). Additional cost is one instruction more per syscall, which I'm not sure is possible to avoid. I'm still unsure if this patch is a good idea to apply. Signed-off-by: Helge Deller <deller@gmx.de>