[patch 2/6] sys_indirect RFC - add call_syscall helper to the x86 archs

2007-06-29 Thread Davide Libenzi
This patch introduces a new call_syscall() helper for the x86 family
archs, to be used by sys_indirect().


Signed-off-by: Davide Libenzi <[EMAIL PROTECTED]>


- Davide


---
 arch/i386/kernel/entry.S|   18 ++
 arch/x86_64/kernel/entry.S  |   18 ++
 include/asm-i386/unistd.h   |   16 
 include/asm-x86_64/unistd.h |   15 +++
 4 files changed, 67 insertions(+)

Index: linux-2.6.mod/include/asm-x86_64/unistd.h
===
--- linux-2.6.mod.orig/include/asm-x86_64/unistd.h  2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/include/asm-x86_64/unistd.h   2007-06-29 12:57:59.0 
-0700
@@ -669,6 +669,21 @@
const struct sigaction __user *act,
struct sigaction __user *oact,
size_t sigsetsize);
+extern long call_syscall(unsigned int nr, const unsigned long *params);
+
+static inline int indirect_call_ok(unsigned int nr)
+{
+   switch (nr) {
+   case __NR_clone:
+   case __NR_fork:
+   case __NR_vfork:
+   case __NR_rt_sigsuspend:
+   case __NR_sigaltstack:
+   case __NR_iopl:
+   return 0;
+   }
+   return 1;
+}
 
 #endif  /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
Index: linux-2.6.mod/arch/i386/kernel/entry.S
===
--- linux-2.6.mod.orig/arch/i386/kernel/entry.S 2007-06-29 12:12:42.0 
-0700
+++ linux-2.6.mod/arch/i386/kernel/entry.S  2007-06-29 12:12:48.0 
-0700
@@ -1023,6 +1023,24 @@
CFI_ENDPROC
 ENDPROC(kernel_thread_helper)
 
+ENTRY(call_syscall)
+   movl$-ENOSYS, %eax
+   movl4(%esp), %edx
+   cmpl$(nr_syscalls), %edx
+   jae bad_sysc
+   movl8(%esp), %eax
+   pushl   20(%eax)
+   pushl   16(%eax)
+   pushl   12(%eax)
+   pushl   8(%eax)
+   pushl   4(%eax)
+   pushl   (%eax)
+   call*sys_call_table(,%edx,4)
+   addl$24, %esp
+bad_sysc:
+   ret
+ENDPROC(call_syscall)
+
 .section .rodata,"a"
 #include "syscall_table.S"
 
Index: linux-2.6.mod/include/asm-i386/unistd.h
===
--- linux-2.6.mod.orig/include/asm-i386/unistd.h2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/include/asm-i386/unistd.h 2007-06-29 12:57:58.0 
-0700
@@ -368,5 +368,21 @@
 #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
 #endif
 
+extern long call_syscall(unsigned int nr, const unsigned long *params);
+
+static inline int indirect_call_ok(unsigned int nr)
+{
+   switch (nr) {
+   case __NR_clone:
+   case __NR_fork:
+   case __NR_vfork:
+   case __NR_rt_sigsuspend:
+   case __NR_sigaltstack:
+   case __NR_iopl:
+   return 0;
+   }
+   return 1;
+}
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_I386_UNISTD_H_ */
Index: linux-2.6.mod/arch/x86_64/kernel/entry.S
===
--- linux-2.6.mod.orig/arch/x86_64/kernel/entry.S   2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/arch/x86_64/kernel/entry.S2007-06-29 12:12:48.0 
-0700
@@ -1170,3 +1170,21 @@
sysret
CFI_ENDPROC
 ENDPROC(ignore_sysret)
+
+ENTRY(call_syscall)
+   movq$-ENOSYS, %rax
+   cmpl$__NR_syscall_max, %edi
+   ja  bad_sysc
+   mov %edi, %eax
+   movq%rsi, %r11
+   movq(%r11), %rdi
+   movq8(%r11), %rsi
+   movq16(%r11), %rdx
+   movq24(%r11), %rcx
+   movq32(%r11), %r8
+   movq40(%r11), %r9
+   call*sys_call_table(,%rax,8)
+bad_sysc:
+   ret
+ENDPROC(call_syscall)
+

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[patch 2/6] sys_indirect RFC - add call_syscall helper to the x86 archs

2007-06-29 Thread Davide Libenzi
This patch introduces a new call_syscall() helper for the x86 family
archs, to be used by sys_indirect().


Signed-off-by: Davide Libenzi [EMAIL PROTECTED]


- Davide


---
 arch/i386/kernel/entry.S|   18 ++
 arch/x86_64/kernel/entry.S  |   18 ++
 include/asm-i386/unistd.h   |   16 
 include/asm-x86_64/unistd.h |   15 +++
 4 files changed, 67 insertions(+)

Index: linux-2.6.mod/include/asm-x86_64/unistd.h
===
--- linux-2.6.mod.orig/include/asm-x86_64/unistd.h  2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/include/asm-x86_64/unistd.h   2007-06-29 12:57:59.0 
-0700
@@ -669,6 +669,21 @@
const struct sigaction __user *act,
struct sigaction __user *oact,
size_t sigsetsize);
+extern long call_syscall(unsigned int nr, const unsigned long *params);
+
+static inline int indirect_call_ok(unsigned int nr)
+{
+   switch (nr) {
+   case __NR_clone:
+   case __NR_fork:
+   case __NR_vfork:
+   case __NR_rt_sigsuspend:
+   case __NR_sigaltstack:
+   case __NR_iopl:
+   return 0;
+   }
+   return 1;
+}
 
 #endif  /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
Index: linux-2.6.mod/arch/i386/kernel/entry.S
===
--- linux-2.6.mod.orig/arch/i386/kernel/entry.S 2007-06-29 12:12:42.0 
-0700
+++ linux-2.6.mod/arch/i386/kernel/entry.S  2007-06-29 12:12:48.0 
-0700
@@ -1023,6 +1023,24 @@
CFI_ENDPROC
 ENDPROC(kernel_thread_helper)
 
+ENTRY(call_syscall)
+   movl$-ENOSYS, %eax
+   movl4(%esp), %edx
+   cmpl$(nr_syscalls), %edx
+   jae bad_sysc
+   movl8(%esp), %eax
+   pushl   20(%eax)
+   pushl   16(%eax)
+   pushl   12(%eax)
+   pushl   8(%eax)
+   pushl   4(%eax)
+   pushl   (%eax)
+   call*sys_call_table(,%edx,4)
+   addl$24, %esp
+bad_sysc:
+   ret
+ENDPROC(call_syscall)
+
 .section .rodata,a
 #include syscall_table.S
 
Index: linux-2.6.mod/include/asm-i386/unistd.h
===
--- linux-2.6.mod.orig/include/asm-i386/unistd.h2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/include/asm-i386/unistd.h 2007-06-29 12:57:58.0 
-0700
@@ -368,5 +368,21 @@
 #define cond_syscall(x) asm(.weak\t #x \n\t.set\t #x ,sys_ni_syscall)
 #endif
 
+extern long call_syscall(unsigned int nr, const unsigned long *params);
+
+static inline int indirect_call_ok(unsigned int nr)
+{
+   switch (nr) {
+   case __NR_clone:
+   case __NR_fork:
+   case __NR_vfork:
+   case __NR_rt_sigsuspend:
+   case __NR_sigaltstack:
+   case __NR_iopl:
+   return 0;
+   }
+   return 1;
+}
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_I386_UNISTD_H_ */
Index: linux-2.6.mod/arch/x86_64/kernel/entry.S
===
--- linux-2.6.mod.orig/arch/x86_64/kernel/entry.S   2007-06-29 
12:12:42.0 -0700
+++ linux-2.6.mod/arch/x86_64/kernel/entry.S2007-06-29 12:12:48.0 
-0700
@@ -1170,3 +1170,21 @@
sysret
CFI_ENDPROC
 ENDPROC(ignore_sysret)
+
+ENTRY(call_syscall)
+   movq$-ENOSYS, %rax
+   cmpl$__NR_syscall_max, %edi
+   ja  bad_sysc
+   mov %edi, %eax
+   movq%rsi, %r11
+   movq(%r11), %rdi
+   movq8(%r11), %rsi
+   movq16(%r11), %rdx
+   movq24(%r11), %rcx
+   movq32(%r11), %r8
+   movq40(%r11), %r9
+   call*sys_call_table(,%rax,8)
+bad_sysc:
+   ret
+ENDPROC(call_syscall)
+

-
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/