> So something clearly changed…

Compiler output, most probably. I cannot reproduce it. I tried:

        struct xid_command
        {
          int syscall_no;
          long int id[3];
          volatile int cntr;
          volatile int error; /* -1: no call yet, 0: success seen, >0: error 
seen.  */
        };

        extern void a_barrier(int *);

        # define REGISTERS_CLOBBERED_BY_SYSCALL "cc", "r11", "cx"

        /* NB: This also works when X is an array.  For an array X,  type of
           (X) - (X) is ptrdiff_t, which is signed, since size of ptrdiff_t
           == size of pointer, cast is a NOP.   */
        #define TYPEFY1(X) __typeof__ ((X) - (X))
        /* Explicit cast the argument.  */
        #define ARGIFY(X) ((TYPEFY1 (X)) (X))
        /* Create a variable 'name' based on type of variable 'X' to avoid
           explicit types.  */
        #define TYPEFY(X, name) __typeof__ (ARGIFY (X)) name


        #undef INTERNAL_SYSCALL_NCS
        #define INTERNAL_SYSCALL_NCS(number, err, nr, args...)                  
\
                internal_syscall##nr (number, err, args)

        #undef internal_syscall3
        #define internal_syscall3(number, err, arg1, arg2, arg3)                
\
        ({                                                                      
\
            unsigned long int resultvar;                                        
\
            TYPEFY (arg3, __arg3) = ARGIFY (arg3);                              
\
            TYPEFY (arg2, __arg2) = ARGIFY (arg2);                              
\
            TYPEFY (arg1, __arg1) = ARGIFY (arg1);                              
\
            register TYPEFY (arg3, _a3) asm ("rdx") = __arg3;                   
\
            register TYPEFY (arg2, _a2) asm ("rsi") = __arg2;                   
\
            register TYPEFY (arg1, _a1) asm ("rdi") = __arg1;                   
\
            asm volatile (                                                      
\
            "syscall\n\t"                                                       
\
            : "=a" (resultvar)                                                  
\
            : "0" (number), "r" (_a1), "r" (_a2), "r" (_a3)                     
\
            : "memory", REGISTERS_CLOBBERED_BY_SYSCALL);                        
\
            (long int) resultvar;                                               
\
        })

        int
        foo(struct xid_command *cmdp)
        {
          int result;
          asm volatile ("xor rsi,rsi\n\txor rdi,rdi" : : : "rsi", "rdi");
          result = INTERNAL_SYSCALL_NCS (cmdp->syscall_no, err, 3,
                                         cmdp->id[0], cmdp->id[1], cmdp->id[2]);
          a_barrier(&result);
          return result;
        }


Save as x.c then:

x86_64-linux-gnux32-gcc-10 -c -std=gnu11 -fgnu89-inline  -pipe -O2 -g -Wall 
-Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math 
-fstack-protector-strong -Wstrict-prototypes -Wold-style-definition 
-fmath-errno   -fpie   -ftls-model=initial-exec -D_LIBC_REENTRANT -DPIC -S 
-masm=intel x.c -Wno-error

This doesn’t yield any “movsxd” in the output, like in glibc, though:

     b32:       67 48 63 73 08          movsxd rsi,DWORD PTR [ebx+0x8]
     b37:       67 48 63 7b 04          movsxd rdi,DWORD PTR [ebx+0x4]
     b3c:       67 48 63 53 0c          movsxd rdx,DWORD PTR [ebx+0xc]
     b41:       67 8b 03                mov    eax,DWORD PTR [ebx]
     b44:       0f 05                   syscall

(disassembly of pthread_create.o from libpthread.a 2.31)

I’m unsure whether this is a glibc or gcc issue… without a reproducer
I’m stuck.

I’ll have to downgrade to 2.30 for now, to keep the system ssh-in-able…

bye,
//mirabilos
-- 
tarent solutions GmbH
Rochusstraße 2-4, D-53123 Bonn • http://www.tarent.de/
Tel: +49 228 54881-393 • Fax: +49 228 54881-235
HRB 5168 (AG Bonn) • USt-ID (VAT): DE122264941
Geschäftsführer: Dr. Stefan Barth, Kai Ebenrett, Boris Esser, Alexander Steeg

Reply via email to