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?

--George

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