guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: syscalls: Fix ABI mismatch for 'clone'.


From: Ludovic Courtès
Subject: 01/02: syscalls: Fix ABI mismatch for 'clone'.
Date: Sat, 17 Oct 2015 10:04:56 +0000

civodul pushed a commit to branch master
in repository guix.

commit 0e3cc3116de1145545a51d598bece890eb6d8424
Author: Ludovic Courtès <address@hidden>
Date:   Sat Oct 17 11:53:25 2015 +0200

    syscalls: Fix ABI mismatch for 'clone'.
    
    Fixes <http://bugs.gnu.org/21694>.
    
    * guix/build/syscalls.scm (clone): Change 'syscall' parameter types to
      LONG, UNSIGNED-LONG, or '*; make sure it has 6 parameters.  Adjust
      caller accordingly.
---
 guix/build/syscalls.scm |   15 ++++++++++++---
 1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 2c2fbde..a3b68c4 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -315,10 +315,16 @@ string TMPL and return its file name.  TMPL must end with 
'XXXXXX'."
 (define CLONE_NEWNET         #x40000000)
 
 ;; The libc interface to sys_clone is not useful for Scheme programs, so the
-;; low-level system call is wrapped instead.
+;; low-level system call is wrapped instead.  The 'syscall' function is
+;; declared in <unistd.h> as a variadic function; in practice, it expects 6
+;; pointer-sized arguments, as shown in, e.g., x86_64/syscall.S.
 (define clone
   (let* ((ptr        (dynamic-func "syscall" (dynamic-link)))
-         (proc       (pointer->procedure int ptr (list int int '*)))
+         (proc       (pointer->procedure long ptr
+                                         (list long                   ;sysno
+                                               unsigned-long          ;flags
+                                               '* '* '*
+                                               '*)))
          ;; TODO: Don't do this.
          (syscall-id (match (utsname:machine (uname))
                        ("i686"   120)
@@ -329,7 +335,10 @@ string TMPL and return its file name.  TMPL must end with 
'XXXXXX'."
       "Create a new child process by duplicating the current parent process.
 Unlike the fork system call, clone accepts FLAGS that specify which resources
 are shared between the parent and child processes."
-      (let ((ret (proc syscall-id flags %null-pointer))
+      (let ((ret (proc syscall-id flags
+                       %null-pointer               ;child stack
+                       %null-pointer %null-pointer ;ptid & ctid
+                       %null-pointer))             ;unused
             (err (errno)))
         (if (= ret -1)
             (throw 'system-error "clone" "~d: ~A"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]