Port-amd64 archive

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

assembler/toolchain clue needed for openssl aesni feature



Hi,

so a commit by me lately claimed that aesni support had been re-enabled
for i386 and amd64; that wasn't actually true since the detection of the
cpu type isn't yet compiled in (thanks to Jean-Yves Migeon to testing and
finding the issue).

Ok, so I know how to create the necessary x86_64cpuid.S from the perl
shim, and how to make it be included if arch is x86_64.
What I run in then is:
/home/netbsd/amd64/tools/bin/x86_64--netbsd-gcc  -Wl,-x -shared -Wl,-soname,libc
rypto.so.7 -Wl,--warn-shared-textrel  --sysroot=/home/netbsd/amd64/destdir   -o 
libcrypto.so.7.0  -Wl,-rpath,/lib  -L=/lib  -Wl,--whole-archive libcrypto_pic.a 
-Wl,--no-whole-archive -L/home/netbsd/amd64/obj/home/spz/cvs/src/lib/libcrypt -l
crypt 
/home/netbsd/amd64/tools/lib/gcc/x86_64--netbsd/4.1.3/../../../../x86_64--netbsd
/bin/ld: warning: dynamic relocation in readonly section `OPENSSL_cpuid_setup'
/home/netbsd/amd64/tools/lib/gcc/x86_64--netbsd/4.1.3/../../../../x86_64--netbsd
/bin/ld: libcrypto_pic.a(x86_64cpuid.pico): relocation R_X86_64_PC32 against sym
bol `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile
 with -fPIC
/home/netbsd/amd64/tools/lib/gcc/x86_64--netbsd/4.1.3/../../../../x86_64--netbsd
/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status

Logs say x86_64cpuid.pico was created this way:

#   compile  libcrypto/x86_64cpuid.pico
/home/netbsd/amd64/tools/bin/x86_64--netbsd-gcc   -DELF -fstack-protector -Wstac
k-protector   --param ssp-buffer-size=1    --sysroot=/home/netbsd/amd64/destdir 
 -D_FORTIFY_SOURCE=2 -Dlibcrypto -I. -I/home/spz/cvs/src/crypto/external/bsd/ope
nssl/dist/crypto -I/home/spz/cvs/src/crypto/external/bsd/openssl/dist -I/home/sp
z/cvs/src/crypto/external/bsd/openssl/dist/crypto/asn1 -I/home/spz/cvs/src/crypt
o/external/bsd/openssl/dist/crypto/evp -DOPENSSLDIR=\"/etc/openssl\" -DENGINESDI
R=\"/usr/lib/openssl\" -DDSO_DLFCN -DHAVE_DLFCN_H -x assembler-with-cpp -c -DPIC
 -fPIC -DPIC   -I/home/spz/cvs/src/crypto/external/bsd/openssl/dist/crypto/crypt
o -DOPENSSL_CPUID_OBJ /home/spz/cvs/src/crypto/external/bsd/openssl/lib/libcrypt
o/arch/x86_64/x86_64cpuid.S -o x86_64cpuid.pico
/home/netbsd/amd64/tools/bin/x86_64--netbsd-objcopy -x x86_64cpuid.pico

so no missing -fPIC. I assume it's something in the new x86_64cpuid.S.
My x86 assembler knowledge is null.

I've attached x86_64cpuid.S, any enlightenment for me?

regards,
        spz
-- 
spz%serpens.de@localhost (S.P.Zeidler)
.section        .init
        call    OPENSSL_cpuid_setup

.text   

.globl  OPENSSL_atomic_add
.type   OPENSSL_atomic_add,@function
.align  16
OPENSSL_atomic_add:
        movl    (%rdi),%eax
.Lspin: leaq    (%rsi,%rax,1),%r8
.byte   0xf0            
        cmpxchgl        %r8d,(%rdi)
        jne     .Lspin
        movl    %r8d,%eax
.byte   0x48,0x98       
        .byte   0xf3,0xc3
.size   OPENSSL_atomic_add,.-OPENSSL_atomic_add

.globl  OPENSSL_rdtsc
.type   OPENSSL_rdtsc,@function
.align  16
OPENSSL_rdtsc:
        rdtsc
        shlq    $32,%rdx
        orq     %rdx,%rax
        .byte   0xf3,0xc3
.size   OPENSSL_rdtsc,.-OPENSSL_rdtsc

.globl  OPENSSL_ia32_cpuid
.type   OPENSSL_ia32_cpuid,@function
.align  16
OPENSSL_ia32_cpuid:
        movq    %rbx,%r8

        xorl    %eax,%eax
        cpuid
        movl    %eax,%r11d

        xorl    %eax,%eax
        cmpl    $1970169159,%ebx
        setne   %al
        movl    %eax,%r9d
        cmpl    $1231384169,%edx
        setne   %al
        orl     %eax,%r9d
        cmpl    $1818588270,%ecx
        setne   %al
        orl     %eax,%r9d
        jz      .Lintel

        cmpl    $1752462657,%ebx
        setne   %al
        movl    %eax,%r10d
        cmpl    $1769238117,%edx
        setne   %al
        orl     %eax,%r10d
        cmpl    $1145913699,%ecx
        setne   %al
        orl     %eax,%r10d
        jnz     .Lintel


        movl    $2147483648,%eax
        cpuid
        cmpl    $2147483656,%eax
        jb      .Lintel

        movl    $2147483656,%eax
        cpuid
        movzbq  %cl,%r10
        incq    %r10

        movl    $1,%eax
        cpuid
        btl     $28,%edx
        jnc     .Ldone
        shrl    $16,%ebx
        cmpb    %r10b,%bl
        ja      .Ldone
        andl    $4026531839,%edx
        jmp     .Ldone

.Lintel:
        cmpl    $4,%r11d
        movl    $-1,%r10d
        jb      .Lnocacheinfo

        movl    $4,%eax
        movl    $0,%ecx
        cpuid
        movl    %eax,%r10d
        shrl    $14,%r10d
        andl    $4095,%r10d

.Lnocacheinfo:
        movl    $1,%eax
        cpuid
        cmpl    $0,%r9d
        jne     .Lnotintel
        orl     $1048576,%edx
        andb    $15,%ah
        cmpb    $15,%ah
        je      .Lnotintel
        orl     $1073741824,%edx
.Lnotintel:
        btl     $28,%edx
        jnc     .Ldone
        andl    $4026531839,%edx
        cmpl    $0,%r10d
        je      .Ldone

        orl     $268435456,%edx
        shrl    $16,%ebx
        cmpb    $1,%bl
        ja      .Ldone
        andl    $4026531839,%edx
.Ldone:
        shlq    $32,%rcx
        movl    %edx,%eax
        movq    %r8,%rbx
        orq     %rcx,%rax
        .byte   0xf3,0xc3
.size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid

.globl  OPENSSL_cleanse
.type   OPENSSL_cleanse,@function
.align  16
OPENSSL_cleanse:
        xorq    %rax,%rax
        cmpq    $15,%rsi
        jae     .Lot
        cmpq    $0,%rsi
        je      .Lret
.Little:
        movb    %al,(%rdi)
        subq    $1,%rsi
        leaq    1(%rdi),%rdi
        jnz     .Little
.Lret:
        .byte   0xf3,0xc3
.align  16
.Lot:
        testq   $7,%rdi
        jz      .Laligned
        movb    %al,(%rdi)
        leaq    -1(%rsi),%rsi
        leaq    1(%rdi),%rdi
        jmp     .Lot
.Laligned:
        movq    %rax,(%rdi)
        leaq    -8(%rsi),%rsi
        testq   $-8,%rsi
        leaq    8(%rdi),%rdi
        jnz     .Laligned
        cmpq    $0,%rsi
        jne     .Little
        .byte   0xf3,0xc3
.size   OPENSSL_cleanse,.-OPENSSL_cleanse
.globl  OPENSSL_wipe_cpu
.type   OPENSSL_wipe_cpu,@function
.align  16
OPENSSL_wipe_cpu:
        pxor    %xmm0,%xmm0
        pxor    %xmm1,%xmm1
        pxor    %xmm2,%xmm2
        pxor    %xmm3,%xmm3
        pxor    %xmm4,%xmm4
        pxor    %xmm5,%xmm5
        pxor    %xmm6,%xmm6
        pxor    %xmm7,%xmm7
        pxor    %xmm8,%xmm8
        pxor    %xmm9,%xmm9
        pxor    %xmm10,%xmm10
        pxor    %xmm11,%xmm11
        pxor    %xmm12,%xmm12
        pxor    %xmm13,%xmm13
        pxor    %xmm14,%xmm14
        pxor    %xmm15,%xmm15
        xorq    %rcx,%rcx
        xorq    %rdx,%rdx
        xorq    %rsi,%rsi
        xorq    %rdi,%rdi
        xorq    %r8,%r8
        xorq    %r9,%r9
        xorq    %r10,%r10
        xorq    %r11,%r11
        leaq    8(%rsp),%rax
        .byte   0xf3,0xc3
.size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu


Home | Main Index | Thread Index | Old Index