]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
um: Add generic stub_syscall6 function
authorBenjamin Berg <benjamin@sipsolutions.net>
Wed, 3 Jul 2024 13:45:27 +0000 (15:45 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 3 Jul 2024 15:09:49 +0000 (17:09 +0200)
This function will be used by the new syscall handling code.

Signed-off-by: Benjamin Berg <benjamin@sipsolutions.net>
Link: https://patch.msgid.link/20240703134536.1161108-4-benjamin@sipsolutions.net
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/x86/um/shared/sysdep/stub_32.h
arch/x86/um/shared/sysdep/stub_64.h

index 2748b7ee031a8bddc0ad60643a6f854897fccc2d..ab08a69fb57f02851f3a3ed8e6054199992cdbef 100644 (file)
@@ -80,6 +80,28 @@ static __always_inline long stub_syscall5(long syscall, long arg1, long arg2,
        return ret;
 }
 
+static __always_inline long stub_syscall6(long syscall, long arg1, long arg2,
+                                         long arg3, long arg4, long arg5,
+                                         long arg6)
+{
+       struct syscall_args {
+               int ebx, ebp;
+       } args = { arg1, arg6 };
+       long ret;
+
+       __asm__ volatile ("pushl %%ebp;"
+                       "movl 0x4(%%ebx),%%ebp;"
+                       "movl (%%ebx),%%ebx;"
+                       "int $0x80;"
+                       "popl %%ebp"
+                       : "=a" (ret)
+                       : "0" (syscall), "b" (&args),
+                       "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
+                       : "memory");
+
+       return ret;
+}
+
 static __always_inline void trap_myself(void)
 {
        __asm("int3");
index 50c5e0529dfb4e0127bd1606ea7dc54eeb25fa8c..d27b34d75d700c85584e28adac9a114ba2640295 100644 (file)
@@ -80,6 +80,22 @@ static __always_inline long stub_syscall5(long syscall, long arg1, long arg2,
        return ret;
 }
 
+static __always_inline long stub_syscall6(long syscall, long arg1, long arg2,
+                                         long arg3, long arg4, long arg5,
+                                         long arg6)
+{
+       long ret;
+
+       __asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; movq %7,%%r9 ; "
+               __syscall
+               : "=a" (ret)
+               : "0" (syscall), "D" (arg1), "S" (arg2), "d" (arg3),
+                 "g" (arg4), "g" (arg5), "g" (arg6)
+               : __syscall_clobber, "r10", "r8", "r9");
+
+       return ret;
+}
+
 static __always_inline void trap_myself(void)
 {
        __asm("int3");