> Date: Tue, 31 Jan 2023 20:19:19 -0500
> From: George Koehler <[email protected]>
> 
> OpenBSD/macppc can enforce xonly on the PowerPC G5.  libcrypto linked
> with cc -Wl,--execute-only will SIGSEGV as the PowerPC asm of sha256
> tries to read a table from text.  The fix is to move the table to
> rodata.  To find the table, I would do
> 
>       bcl     20, 31, 1f
> 1:    mflr    %r7
>       addis   %r7, %r7, .Ltable-1b@ha
>       addi    %r7, %r7, .Ltable-1b@l
> 
> This diff does so in perlasm syntax.  The literal "@ha" and "@l" in
> this diff are for an ELF platform (like OpenBSD) and might break the
> build for AIX or Mac OS, but I suspect that nobody builds this asm
> for those platforms.  (PowerPC Mac OS is long obsolete, ended at
> Mac OS X 10.5.8.)  If someone wants to try the PowerPC asm on a
> not-ELF platform, please tell me.
> 
> aes-ppc.pl would have the same problem, but we don't use aes-ppc.pl,
> so I provide no fix.  ports/security/openssl/{1.0.2,1.1,3.0} has
> copies of aes-ppc.pl and sha512-ppc.pl with the same problem, but
> doesn't enable them on OpenBSD, so I don't plan to edit them.
> 
> sha512-ppc.pl can emit code for sha256 or sha512, but we only use it
> for sha256.  The code uses simple ops (add, subtract, bit logic,
> bit rotation), nothing more fancy.  I don't know why it runs faster
> than the (not asm) sha256 in ports/security/openssl.
> 
> ok for this diff in src/lib/libcrypto?

ok kettenis@

> Index: sha/asm/sha512-ppc.pl
> ===================================================================
> RCS file: /cvs/src/lib/libcrypto/sha/asm/sha512-ppc.pl,v
> retrieving revision 1.3
> diff -u -p -r1.3 sha512-ppc.pl
> --- sha/asm/sha512-ppc.pl     14 Nov 2015 14:53:13 -0000      1.3
> +++ sha/asm/sha512-ppc.pl     31 Jan 2023 22:03:47 -0000
> @@ -220,8 +220,11 @@ $func:
>       $LD     $G,`6*$SZ`($ctx)
>       $LD     $H,`7*$SZ`($ctx)
>  
> -     bl      LPICmeup
> -LPICedup:
> +     bcl     20,31,Lpc
> +Lpc:
> +     mflr    $Tbl
> +     addis   $Tbl,$Tbl,Ltable-Lpc\@ha
> +     addi    $Tbl,$Tbl,Ltable-Lpc\@l
>       andi.   r0,$inp,3
>       bne     Lunaligned
>  Laligned:
> @@ -377,22 +380,8 @@ $code.=<<___;
>       blr
>       .long   0
>       .byte   0,12,0x14,0,0,0,0,0
> -___
> -
> -# Ugly hack here, because PPC assembler syntax seem to vary too
> -# much from platforms to platform...
> -$code.=<<___;
> -.align       6
> -LPICmeup:
> -     mflr    r0
> -     bcl     20,31,\$+4
> -     mflr    $Tbl    ; vvvvvv "distance" between . and 1st data entry
> -     addi    $Tbl,$Tbl,`64-8`
> -     mtlr    r0
> -     blr
> -     .long   0
> -     .byte   0,12,0x14,0,0,0,0,0
> -     .space  `64-9*4`
> +     .rodata
> +Ltable:
>  ___
>  $code.=<<___ if ($SZ==8);
>       .long   0x428a2f98,0xd728ae22,0x71374491,0x23ef65cd
> 
> 

Reply via email to