tag 469058 + patch thanks On Wed, Mar 05, 2008 at 03:12:52AM +0100, Aurelien Jarno wrote: > reassign 469058 sbcl > retitle 469058 sbcl don't reset direction flag upon exit > thanks > > Nikodemus Siivola a écrit : > > Looking at http://gcc.gnu.org/gcc-4.3/changes.html, this is the only > > thing that really jumps out: > > > > "GCC no longer places the cld instruction before string operations. > > Both i386 and x86-64 ABI documents mandate the direction flag to be > > clear at the entry of a function. It is now invalid to set the flag in > > asm statement without reseting it afterward." > > > > ...but (1) SBCL _should_ be resetting the direction flag before any > > calls to libc code, and (2) I would expect problems caused by this to > > be more deterministic. > > It actually doesn't reset it. The problem causes the sigemptyset() > function from the glibc to not work correctly. > > I have identified the potential part from SBCL causing the problem, I am > currently testing a fix. >
Please find below the patch to fix the problem. I only tested on amd64, but it should work the same way on i386. --- sbcl-1.0.14.0.orig/src/compiler/x86/call.lisp +++ sbcl-1.0.14.0/src/compiler/x86/call.lisp @@ -364,7 +364,8 @@ ;; Restore EDI, and reset the stack. (emit-label restore-edi) (loadw edi-tn ebx-tn (frame-word-offset 1)) - (inst mov esp-tn ebx-tn)))) + (inst mov esp-tn ebx-tn) + (inst cld)))) (values)) ;;;; unknown values receiving @@ -1376,7 +1377,8 @@ (inst sub ecx 1) (inst jmp :nz loop) ;; NIL out the last cons. - (storew nil-value dst 1 list-pointer-lowtag)) + (storew nil-value dst 1 list-pointer-lowtag) + (inst cld)) (emit-label done)))) ;;; Return the location and size of the &MORE arg glob created by --- sbcl-1.0.14.0.orig/src/compiler/x86/values.lisp +++ sbcl-1.0.14.0/src/compiler/x86/values.lisp @@ -38,6 +38,7 @@ (inst movs :dword) (inst cmp esp-tn esi) (inst jmp :be loop) + (inst cld) DONE (inst lea esp-tn (make-ea :dword :base edi :disp n-word-bytes)) (inst sub edi esi) --- sbcl-1.0.14.0.orig/src/compiler/x86/nlx.lisp +++ sbcl-1.0.14.0/src/compiler/x86/nlx.lisp @@ -237,6 +237,7 @@ (inst std) (inst rep) (inst movs :dword) + (inst cld) DONE ;; Reset the CSP at last moved arg. --- sbcl-1.0.14.0.orig/src/compiler/x86-64/call.lisp +++ sbcl-1.0.14.0/src/compiler/x86-64/call.lisp @@ -356,7 +356,8 @@ ;; Restore EDI, and reset the stack. (emit-label restore-edi) (loadw rdi-tn rbx-tn (- (1+ 1))) - (inst mov rsp-tn rbx-tn)))) + (inst mov rsp-tn rbx-tn) + (inst cld)))) (values)) ;;;; unknown values receiving @@ -1320,7 +1321,8 @@ (inst sub rcx 1) (inst jmp :nz loop) ;; NIL out the last cons. - (storew nil-value dst 1 list-pointer-lowtag)) + (storew nil-value dst 1 list-pointer-lowtag) + (inst cld)) (emit-label done)))) ;;; Return the location and size of the &MORE arg glob created by --- sbcl-1.0.14.0.orig/src/compiler/x86-64/values.lisp +++ sbcl-1.0.14.0/src/compiler/x86-64/values.lisp @@ -38,6 +38,7 @@ (inst movs :qword) (inst cmp rsp-tn rsi) (inst jmp :be LOOP) + (inst cld) DONE (inst lea rsp-tn (make-ea :qword :base rdi :disp n-word-bytes)) (inst sub rdi rsi) --- sbcl-1.0.14.0.orig/src/compiler/x86-64/nlx.lisp +++ sbcl-1.0.14.0/src/compiler/x86-64/nlx.lisp @@ -212,6 +212,7 @@ (inst std) (inst rep) (inst movs :qword) + (inst cld) DONE ;; Reset the CSP at last moved arg. --- sbcl-1.0.14.0.orig/src/assembly/x86/assem-rtns.lisp +++ sbcl-1.0.14.0/src/assembly/x86/assem-rtns.lisp @@ -54,6 +54,7 @@ (inst lea edi (make-ea :dword :base ebx :disp (- n-word-bytes))) (inst rep) (inst movs :dword) + (inst cld) ; restore direction bit ;; solaris requires DF being zero. #!+sunos (inst cld) @@ -153,6 +154,7 @@ (inst sub esi (fixnumize 1)) (inst rep) (inst movs :dword) + (inst cld) ; restore direction bit ;; solaris requires DF being zero. #!+sunos (inst cld) --- sbcl-1.0.14.0.orig/src/assembly/x86-64/assem-rtns.lisp +++ sbcl-1.0.14.0/src/assembly/x86-64/assem-rtns.lisp @@ -54,6 +54,7 @@ (inst lea edi (make-ea :qword :base ebx :disp (- n-word-bytes))) (inst rep) (inst movs :qword) + (inst cld) ; restore direction bit ;; Restore the count. (inst mov ecx edx) @@ -150,6 +151,7 @@ (inst sub esi (fixnumize 1)) (inst rep) (inst movs :qword) + (inst cld) ; restore direction bit ;; Load the register arguments carefully. (loadw edx rbp-tn -1) -- .''`. Aurelien Jarno | GPG: 1024D/F1BCDB73 : :' : Debian developer | Electrical Engineer `. `' [EMAIL PROTECTED] | [EMAIL PROTECTED] `- people.debian.org/~aurel32 | www.aurel32.net -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]