aboutsummaryrefslogtreecommitdiff
path: root/secure
diff options
context:
space:
mode:
authorPiotr Kubaj <pkubaj@FreeBSD.org>2021-11-22 02:28:46 +0000
committerPiotr Kubaj <pkubaj@FreeBSD.org>2021-11-23 22:26:53 +0000
commit3a60869237b8b315fe66497cf5299ec08b688533 (patch)
tree7700f03755dcc4003ad262258de6e51b08ae24ac /secure
parent9cf1841c4aaf8fbab06132ab9f76094f34ad7c7b (diff)
downloadsrc-3a60869237b8b315fe66497cf5299ec08b688533.tar.gz
src-3a60869237b8b315fe66497cf5299ec08b688533.zip
Add assembly optimized code for OpenSSL on powerpc, powerpc64 and powerpc64le
Summary: 1. https://github.com/openssl/openssl/commit/34ab13b7d8e3e723adb60be8142e38b7c9cd382a needs to be merged for ELFv2 support on big-endian. 2. crypto/openssl/crypto/ppccap.c needs to be patched. Same reason as in https://github.com/openssl/openssl/pull/17082. Approved by: jkim, jhibbits MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D33076
Diffstat (limited to 'secure')
-rw-r--r--secure/lib/libcrypto/Makefile50
-rw-r--r--secure/lib/libcrypto/Makefile.asm189
-rw-r--r--secure/lib/libcrypto/Makefile.inc35
3 files changed, 272 insertions, 2 deletions
diff --git a/secure/lib/libcrypto/Makefile b/secure/lib/libcrypto/Makefile
index ff9303c9edae..cf9259a19e16 100644
--- a/secure/lib/libcrypto/Makefile
+++ b/secure/lib/libcrypto/Makefile
@@ -28,6 +28,12 @@ SRCS+= x86_64cpuid.S
SRCS+= armv4cpuid.S armcap.c
.elif defined(ASM_i386)
SRCS+= x86cpuid.S
+.elif defined(ASM_powerpc)
+SRCS+= ppccpuid.S ppccap.c
+.elif defined(ASM_powerpc64)
+SRCS+= ppccpuid.S ppccap.c
+.elif defined(ASM_powerpc64le)
+SRCS+= ppccpuid.S ppccap.c
.else
SRCS+= mem_clr.c
.endif
@@ -44,6 +50,12 @@ SRCS+= aesni-x86_64.S vpaes-x86_64.S
SRCS+= aes-armv4.S aesv8-armx.S bsaes-armv7.S
.elif defined(ASM_i386)
SRCS+= aes_core.c aesni-x86.S vpaes-x86.S
+.elif defined(ASM_powerpc)
+SRCS+= aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+= aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+= aes_core.c aes-ppc.S vpaes-ppc.S aesp8-ppc.S
.else
SRCS+= aes_core.c
.endif
@@ -99,6 +111,12 @@ SRCS+= x86_64-mont.S x86_64-mont5.S
SRCS+= armv4-gf2m.S armv4-mont.S bn_asm.c
.elif defined(ASM_i386)
SRCS+= bn-586.S co-586.S x86-gf2m.S x86-mont.S
+.elif defined(ASM_powerpc)
+SRCS+= ppc.S ppc-mont.S
+.elif defined(ASM_powerpc64)
+SRCS+= ppc.S ppc-mont.S
+.elif defined(ASM_powerpc64le)
+SRCS+= ppc.S ppc-mont.S
.else
SRCS+= bn_asm.c
.endif
@@ -128,6 +146,12 @@ SRCS+= chacha-x86_64.S
SRCS+= chacha-armv4.S
.elif defined(ASM_i386)
SRCS+= chacha-x86.S
+.elif defined(ASM_powerpc)
+SRCS+= chacha-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+= chacha-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+= chacha-ppc.S
.else
SRCS+= chacha_enc.c
.endif
@@ -189,6 +213,10 @@ SRCS+= ecp_nistz256-x86_64.S ecp_nistz256.c x25519-x86_64.S
SRCS+= ecp_nistz256-armv4.S ecp_nistz256.c
.elif defined(ASM_i386)
SRCS+= ecp_nistz256-x86.S ecp_nistz256.c
+.elif defined(ASM_powerpc64)
+SRCS+= ecp_nistz256-ppc64.S ecp_nistz256.c x25519-ppc64.S
+.elif defined(ASM_powerpc64le)
+SRCS+= ecp_nistz256-ppc64.S ecp_nistz256.c x25519-ppc64.S
.endif
# engine
@@ -250,6 +278,12 @@ SRCS+= aesni-gcm-x86_64.S ghash-x86_64.S
SRCS+= ghash-armv4.S ghashv8-armx.S
.elif defined(ASM_i386)
SRCS+= ghash-x86.S
+.elif defined(ASM_powerpc)
+SRCS+= ghashp8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+= ghashp8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+= ghashp8-ppc.S
.endif
# objects
@@ -282,6 +316,12 @@ SRCS+= poly1305-x86_64.S
SRCS+= poly1305-armv4.S
.elif defined(ASM_i386)
SRCS+= poly1305-x86.S
+.elif defined(ASM_powerpc)
+SRCS+= poly1305-ppc.S poly1305-ppcfp.S
+.elif defined(ASM_powerpc64)
+SRCS+= poly1305-ppc.S poly1305-ppcfp.S
+.elif defined(ASM_powerpc64le)
+SRCS+= poly1305-ppc.S poly1305-ppcfp.S
.endif
# rand
@@ -333,6 +373,12 @@ SRCS+= sha256-mb-x86_64.S sha256-x86_64.S sha512-x86_64.S
SRCS+= keccak1600-armv4.S sha1-armv4-large.S sha256-armv4.S sha512-armv4.S
.elif defined(ASM_i386)
SRCS+= keccak1600.c sha1-586.S sha256-586.S sha512-586.S
+.elif defined(ASM_powerpc)
+SRCS+= keccak1600.c sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
+.elif defined(ASM_powerpc64)
+SRCS+= keccak1600-ppc64.S sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
+.elif defined(ASM_powerpc64le)
+SRCS+= keccak1600-ppc64.S sha1-ppc.S sha256-ppc.S sha512-ppc.S sha256p8-ppc.S sha512p8-ppc.S
.else
SRCS+= keccak1600.c
.endif
@@ -430,7 +476,7 @@ SRCS+= buildinf.h
CLEANDIRS= openssl
CLEANFILES= buildinf.h opensslconf.h opensslconf.h.tmp
-.if defined(ASM_${MACHINE_CPUARCH})
+.if defined(ASM_${MACHINE_CPUARCH}) || defined(ASM_${MACHINE_ARCH})
_cmd1=/%%NO_ASM%%/d
.else
_cmd1=s/%%NO_ASM%%//
@@ -471,6 +517,8 @@ PICFLAG+= -DOPENSSL_PIC
.if defined(ASM_amd64)
.PATH: ${LCRYPTO_SRC}/crypto/bn/asm
.endif
+.elif defined(ASM_${MACHINE_ARCH})
+.PATH: ${SRCTOP}/sys/crypto/openssl/${MACHINE_ARCH}
.endif
.PATH: ${LCRYPTO_SRC}/crypto \
diff --git a/secure/lib/libcrypto/Makefile.asm b/secure/lib/libcrypto/Makefile.asm
index 9480c3a59833..5e44285de0d9 100644
--- a/secure/lib/libcrypto/Makefile.asm
+++ b/secure/lib/libcrypto/Makefile.asm
@@ -295,6 +295,195 @@ CLEANFILES= ${ASM} ${SRCS:R:S/$/.s/}
env CC=cc perl ${PERLPATH} ${.IMPSRC} elf ${CFLAGS} ${.IMPSRC:R:S/$/.s/} ;\
cat ${.IMPSRC:R:S/$/.s/} ;\
echo '#endif' ) > ${.TARGET}
+
+.elif defined(ASM_powerpc)
+
+.PATH: ${LCRYPTO_SRC}/crypto \
+ ${LCRYPTO_SRC}/crypto/aes/asm \
+ ${LCRYPTO_SRC}/crypto/bn/asm \
+ ${LCRYPTO_SRC}/crypto/chacha/asm \
+ ${LCRYPTO_SRC}/crypto/modes/asm \
+ ${LCRYPTO_SRC}/crypto/poly1305/asm \
+ ${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH= -I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS= ppccpuid.pl
+
+#bn
+SRCS+= ppc.pl ppc-mont.pl
+
+#aes
+SRCS+= aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+= sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+= ghashp8-ppc.pl
+
+#chacha
+SRCS+= chacha-ppc.pl
+
+#poly1305
+SRCS+= poly1305-ppc.pl poly1305-ppcfp.pl
+
+ASM= ${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all: ${ASM}
+
+CLEANFILES= ${ASM}
+.SUFFIXES: .pl
+
+sha256-ppc.S: sha512-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux32 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S: sha512p8-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux32 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+ env CC=cc perl ${.IMPSRC} linux32 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.elif defined(ASM_powerpc64)
+
+.PATH: ${LCRYPTO_SRC}/crypto \
+ ${LCRYPTO_SRC}/crypto/aes/asm \
+ ${LCRYPTO_SRC}/crypto/bn/asm \
+ ${LCRYPTO_SRC}/crypto/chacha/asm \
+ ${LCRYPTO_SRC}/crypto/ec/asm \
+ ${LCRYPTO_SRC}/crypto/modes/asm \
+ ${LCRYPTO_SRC}/crypto/poly1305/asm \
+ ${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH= -I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS= ppccpuid.pl
+
+#bn
+SRCS+= ppc.pl ppc-mont.pl
+
+#aes
+SRCS+= aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+= sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+= ghashp8-ppc.pl
+
+#chacha
+SRCS+= chacha-ppc.pl
+
+#poly1305
+SRCS+= poly1305-ppc.pl poly1305-ppcfp.pl
+
+#ec
+SRCS+= ecp_nistz256-ppc64.pl x25519-ppc64.pl
+
+#keccak1600
+SRCS+= keccak1600-ppc64.pl
+
+ASM= ${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all: ${ASM}
+
+CLEANFILES= ${ASM}
+.SUFFIXES: .pl
+
+sha256-ppc.S: sha512-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S: sha512p8-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+ env CC=cc perl ${.IMPSRC} linux64v2 ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.elif defined(ASM_powerpc64le)
+
+.PATH: ${LCRYPTO_SRC}/crypto \
+ ${LCRYPTO_SRC}/crypto/aes/asm \
+ ${LCRYPTO_SRC}/crypto/bn/asm \
+ ${LCRYPTO_SRC}/crypto/chacha/asm \
+ ${LCRYPTO_SRC}/crypto/ec/asm \
+ ${LCRYPTO_SRC}/crypto/modes/asm \
+ ${LCRYPTO_SRC}/crypto/poly1305/asm \
+ ${LCRYPTO_SRC}/crypto/sha/asm
+
+PERLPATH= -I${LCRYPTO_SRC}/crypto/perlasm
+
+#cpuid
+SRCS= ppccpuid.pl
+
+#bn
+SRCS+= ppc.pl ppc-mont.pl
+
+#aes
+SRCS+= aes-ppc.pl vpaes-ppc.pl aesp8-ppc.pl
+
+#sha1
+SRCS+= sha1-ppc.pl sha512-ppc.pl sha512p8-ppc.pl
+
+#modes
+SRCS+= ghashp8-ppc.pl
+
+#chacha
+SRCS+= chacha-ppc.pl
+
+#poly1305
+SRCS+= poly1305-ppc.pl poly1305-ppcfp.pl
+
+#ec
+SRCS+= ecp_nistz256-ppc64.pl x25519-ppc64.pl
+
+#keccak1600
+SRCS+= keccak1600-ppc64.pl
+
+ASM= ${SRCS:R:S/$/.S/} sha256-ppc.S sha256p8-ppc.S
+
+all: ${ASM}
+
+CLEANFILES= ${ASM}
+.SUFFIXES: .pl
+
+sha256-ppc.S: sha512-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux64le ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+sha256p8-ppc.S: sha512p8-ppc.pl
+ env CC=cc perl ${.ALLSRC} linux64le ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
+.pl.S:
+ env CC=cc perl ${.IMPSRC} linux64le ${.TARGET:R:S/$/.s/}
+ ( echo '/* $$'FreeBSD'$$ */' ;\
+ echo '/* Do not modify. This file is auto-generated from ${.ALLSRC:T:R:S/$/.pl/}. */' ;\
+ cat ${.TARGET:R:S/$/.s/}) > ${.TARGET}
+
.endif
.include <bsd.prog.mk>
diff --git a/secure/lib/libcrypto/Makefile.inc b/secure/lib/libcrypto/Makefile.inc
index 7e37eda14cd2..f6221b7f74e0 100644
--- a/secure/lib/libcrypto/Makefile.inc
+++ b/secure/lib/libcrypto/Makefile.inc
@@ -23,9 +23,12 @@ CFLAGS+= -DB_ENDIAN
.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \
${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "i386"
ASM_${MACHINE_CPUARCH}=
+.elif ${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpc64" || \
+ ${MACHINE_ARCH} == "powerpc64le"
+ASM_${MACHINE_ARCH}=
.endif
-.if defined(ASM_${MACHINE_CPUARCH})
+.if defined(ASM_${MACHINE_CPUARCH}) || defined(ASM_${MACHINE_ARCH})
CFLAGS+= -DOPENSSL_CPUID_OBJ
.if defined(ASM_aarch64)
CFLAGS+= -DOPENSSL_BN_ASM_MONT
@@ -69,6 +72,36 @@ CFLAGS+= -DGHASH_ASM
CFLAGS+= -DECP_NISTZ256_ASM
CFLAGS+= -DPADLOCK_ASM
CFLAGS+= -DPOLY1305_ASM
+.elif defined(ASM_powerpc)
+CFLAGS+= -DOPENSSL_BN_ASM_MONT
+CFLAGS+= -DAES_ASM
+CFLAGS+= -DVPAES_ASM
+CFLAGS+= -DSHA1_ASM
+CFLAGS+= -DSHA256_ASM
+CFLAGS+= -DSHA512_ASM
+CFLAGS+= -DPOLY1305_ASM
+.elif defined(ASM_powerpc64)
+CFLAGS+= -DOPENSSL_BN_ASM_MONT
+CFLAGS+= -DAES_ASM
+CFLAGS+= -DVPAES_ASM
+CFLAGS+= -DSHA1_ASM
+CFLAGS+= -DSHA256_ASM
+CFLAGS+= -DSHA512_ASM
+CFLAGS+= -DPOLY1305_ASM
+CFLAGS+= -DECP_NISTZ256_ASM
+CFLAGS+= -DX25519_ASM
+CFLAGS+= -DKECCAK1600_ASM
+.elif defined(ASM_powerpc64le)
+CFLAGS+= -DOPENSSL_BN_ASM_MONT
+CFLAGS+= -DAES_ASM
+CFLAGS+= -DVPAES_ASM
+CFLAGS+= -DSHA1_ASM
+CFLAGS+= -DSHA256_ASM
+CFLAGS+= -DSHA512_ASM
+CFLAGS+= -DPOLY1305_ASM
+CFLAGS+= -DECP_NISTZ256_ASM
+CFLAGS+= -DX25519_ASM
+CFLAGS+= -DKECCAK1600_ASM
.endif
.endif