summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/defaults/make.conf15
-rw-r--r--secure/lib/libcrypto/Makefile92
-rw-r--r--secure/lib/libcrypto/Makefile.inc9
-rw-r--r--share/examples/etc/make.conf15
-rw-r--r--share/mk/sys.mk4
-rw-r--r--usr.bin/make/main.c15
6 files changed, 137 insertions, 13 deletions
diff --git a/etc/defaults/make.conf b/etc/defaults/make.conf
index 9e9d669..41ad7bf 100644
--- a/etc/defaults/make.conf
+++ b/etc/defaults/make.conf
@@ -13,6 +13,19 @@
# You have to find the things you can put here in the Makefiles and
# documentation of the source tree.
#
+#
+# MACHINE_CPU controls which processor-specific optimizations will be
+# used by certain components of FreeBSD (currently only OpenSSL).
+# This should be set to a list of your CPU type, plus all previous
+# generations of the CPU architecture. The reason for using a list is
+# because not all programs which use the MACHINE_CPU variable may have
+# optimizations for your specific CPU generation (e.g. Pentium Pro),
+# but may have optimizations for the previous generation (e.g. Pentium).
+# Currently only the following CPU generations are used:
+# i686 i585 i386
+#
+#MACHINE_CPU=i686 i586 i386
+#
# CFLAGS controls the compiler settings used when compiling C code.
# Note that optimization settings above -O (-O2, ...) are not recommended
# or supported for compiling the world or the kernel - please revert any
@@ -82,7 +95,7 @@ BDECFLAGS= -W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align \
#NOGAMES= true # do not build games (games/ subdir)
#NOINFO= true # do not make or install info files
#NOLIBC_R= true # do not build libc_r (re-entrant version of libc)
-#NOPERL= true # To avoid building perl
+#NOPERL= true # do not build perl. Disables OpenSSL optimizations
#NOPROFILE= true # Avoid compiling profiled libraries
#NOSECURE= true # do not build crypto code in secure/ subdir
#NOSHARE= true # do not go into the share subdir
diff --git a/secure/lib/libcrypto/Makefile b/secure/lib/libcrypto/Makefile
index 7fb60be..2810957 100644
--- a/secure/lib/libcrypto/Makefile
+++ b/secure/lib/libcrypto/Makefile
@@ -16,6 +16,15 @@
${LCRYPTO_SRC}/stack ${LCRYPTO_SRC}/txt_db ${LCRYPTO_SRC}/x509 \
${LCRYPTO_SRC}/x509v3
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+.PATH: ${LCRYPTO_SRC}/rc4/asm ${LCRYPTO_SRC}/rc5/asm \
+ ${LCRYPTO_SRC}/des/asm ${LCRYPTO_SRC}/cast/asm \
+ ${LCRYPTO_SRC}/sha/asm ${LCRYPTO_SRC}/bn/asm \
+ ${LCRYPTO_SRC}/bf/asm ${LCRYPTO_SRC}/md5/asm \
+ ${LCRYPTO_SRC}/ripemd/asm
+PERLPATH= ${LCRYPTO_SRC}/des/asm:${LCRYPTO_SRC}/perlasm
+.endif
+
.if defined(MAKE_IDEA) && ${MAKE_IDEA} == YES
.PATH: ${LCRYPTO_SRC}/idea
.endif
@@ -48,7 +57,16 @@ SRCS+= a_bitstr.c a_bmp.c a_bool.c a_bytes.c a_d2i_fp.c a_digest.c \
x_req.c x_sig.c x_spki.c x_val.c x_x509.c x_x509a.c
# blowfish
-SRCS+= bf_cfb64.c bf_ecb.c bf_enc.c bf_ofb64.c bf_skey.c
+SRCS+= bf_cfb64.c bf_ecb.c bf_ofb64.c bf_skey.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+.if ${MACHINE_CPU:Mi686}
+SRCS+= bf-686.pl
+.else
+SRCS+= bf-586.pl
+.endif
+.else
+SRCS+= bf_enc.c
+.endif
# bio
SRCS+= b_dump.c b_print.c b_sock.c bf_buff.c bf_nbio.c bf_null.c \
@@ -57,16 +75,28 @@ SRCS+= b_dump.c b_print.c b_sock.c bf_buff.c bf_nbio.c bf_null.c \
# bn
-SRCS+= bn_add.c bn_asm.c bn_blind.c bn_ctx.c bn_div.c bn_err.c \
+SRCS+= bn_add.c bn_blind.c bn_ctx.c bn_div.c bn_err.c \
bn_exp.c bn_exp2.c bn_gcd.c bn_lib.c bn_mont.c bn_mpi.c \
bn_mul.c bn_prime.c bn_print.c bn_rand.c bn_recp.c bn_shift.c \
bn_sqr.c bn_word.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= bn-586.pl co-586.pl
+.elif ${MACHINE_ARCH} == "alpha"
+SRCS+= bn-alpha.pl co-alpha.pl
+.else
+SRCS+= bn_asm.c
+.endif
# buffer
SRCS+= buf_err.c buffer.c
# cast
-SRCS+= c_cfb64.c c_ecb.c c_enc.c c_ofb64.c c_skey.c
+SRCS+= c_cfb64.c c_ecb.c c_ofb64.c c_skey.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= cast-586.pl
+.else
+SRCS+= c_enc.c
+.endif
# comp
SRCS+= c_rle.c c_zlib.c comp_lib.c
@@ -75,11 +105,16 @@ SRCS+= c_rle.c c_zlib.c comp_lib.c
SRCS+= conf_api.c conf_def.c conf_err.c conf_lib.c
# des
-SRCS+= cbc_cksm.c cbc_enc.c cfb64ede.c cfb64enc.c cfb_enc.c des_enc.c \
+SRCS+= cbc_cksm.c cbc_enc.c cfb64ede.c cfb64enc.c cfb_enc.c \
ecb3_enc.c ecb_enc.c ede_cbcm_enc.c enc_read.c enc_writ.c \
- fcrypt.c fcrypt_b.c ofb64ede.c ofb64enc.c ofb_enc.c pcbc_enc.c \
+ fcrypt.c ofb64ede.c ofb64enc.c ofb_enc.c pcbc_enc.c \
qud_cksm.c rand_key.c read2pwd.c read_pwd.c rpc_enc.c \
set_key.c str2key.c xcbc_enc.c rnd_keys.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= des-586.pl crypt586.pl
+.else
+SRCS+= des_enc.c
+.endif
# dh
SRCS+= dh_check.c dh_err.c dh_gen.c dh_key.c dh_lib.c
@@ -123,6 +158,9 @@ SRCS+= md4_dgst.c md4_one.c
# md5
SRCS+= md5_dgst.c md5_one.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= md5-586.pl
+.endif
# mdc2
SRCS+= mdc2dgst.c mdc2_one.c
@@ -148,13 +186,26 @@ SRCS+= md_rand.c rand_egd.c rand_err.c rand_lib.c rand_win.c randfile.c
SRCS+= rc2_cbc.c rc2cfb64.c rc2_ecb.c rc2ofb64.c rc2_skey.c
# rc4
-SRCS+= rc4_enc.c rc4_skey.c
+SRCS+= rc4_skey.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= rc4-586.pl
+.else
+SRCS+= rc4_enc.c
+.endif
# rc5
-SRCS+= rc5cfb64.c rc5_ecb.c rc5_enc.c rc5ofb64.c rc5_skey.c
+SRCS+= rc5cfb64.c rc5_ecb.c rc5ofb64.c rc5_skey.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= rc5-586.pl
+.else
+SRCS+= rc5_enc.c
+.endif
# ripemd
SRCS+= rmd_dgst.c rmd_one.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= rmd-586.pl
+.endif
# rsa
.if defined(WITH_RSA) && ${WITH_RSA} == YES
@@ -164,6 +215,9 @@ SRCS+= rsa_chk.c rsa_eay.c rsa_err.c rsa_gen.c rsa_lib.c rsa_none.c \
# sha
SRCS+= sha_dgst.c sha_one.c sha1_one.c sha1dgst.c
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+SRCS+= sha1-586.pl
+.endif
# stack
SRCS+= stack.c
@@ -263,6 +317,30 @@ beforeinstall: openssl/opensslconf.h openssl/evp.h
.include <bsd.lib.mk>
+# If we don't want 686/586 asm, use the "386" modifier to the perl scripts to give
+# compatible output
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+.if ${MACHINE_CPU:Mi686} || ${MACHINE_CPU:Mi586}
+CPUTYPE=
+.elif ${MACHINE_CPU:Mi386}
+CPUTYPE= 386
+.endif
+.endif
+
+.if !defined(NOPERL) && ${MACHINE_ARCH} == "i386"
+.SUFFIXES: .o .pl
+.SUFFIXES: .po .pl
+.SUFFIXES: .So .pl
+.pl.o:
+ perl -I${PERLPATH} $(.ALLSRC) elf ${CPUTYPE} > $(.PREFIX).pl.s ; ${AS} ${AFLAGS} $(.PREFIX).pl.s -o $(.TARGET)
+
+.pl.po:
+ perl -I${PERLPATH} $(.ALLSRC) elf ${CPUTYPE} > $(.PREFIX).pl.s ; ${AS} ${AFLAGS} $(.PREFIX).pl.s -o $(.TARGET)
+
+.pl.So:
+ perl -I${PERLPATH} $(.ALLSRC) elf ${CPUTYPE} > $(.PREFIX).pl.s ; ${AS} ${AFLAGS} $(.PREFIX).pl.s -o $(.TARGET)
+.endif
+
afterinstall:
.if !defined(NOPIC)
@cd ${DESTDIR}${SHLIBDIR}; \
diff --git a/secure/lib/libcrypto/Makefile.inc b/secure/lib/libcrypto/Makefile.inc
index 075d246..5f927eef 100644
--- a/secure/lib/libcrypto/Makefile.inc
+++ b/secure/lib/libcrypto/Makefile.inc
@@ -7,8 +7,10 @@ CFLAGS+= -DNO_IDEA
.endif
.if ${MACHINE_ARCH} == "i386"
-CFLAGS+= -DL_ENDIAN
-# -DBN_ASM -DSHA1_ASM -DMD5_ASM -DRMD160_ASM - XXX notyet
+CFLAGS+= -DL_ENDIAN
+.if !defined(NOPERL)
+CFLAGS+= -DSHA1_ASM -DBN_ASM -DMD5_ASM -DRMD160_ASM
+.endif
.elif ${MACHINE_ARCH} == "alpha"
# no ENDIAN stuff defined for alpha (64-bit)
.endif
@@ -23,7 +25,8 @@ HDRS= asn1/asn1.h asn1/asn1_mac.h bio/bio.h bf/blowfish.h bn/bn.h \
pem/pem2.h pkcs12/pkcs12.h pkcs7/pkcs7.h rand/rand.h rc2/rc2.h \
rc4/rc4.h rc5/rc5.h ripemd/ripemd.h rsa/rsa.h stack/safestack.h \
sha/sha.h stack/stack.h tmdiff.h txt_db/txt_db.h x509/x509.h \
- x509/x509_vfy.h x509v3/x509v3.h symhacks.h objects/obj_mac.h md4/md4.h dso/dso.h conf/conf_api.h
+ x509/x509_vfy.h x509v3/x509v3.h symhacks.h objects/obj_mac.h \
+ md4/md4.h dso/dso.h conf/conf_api.h
.if defined(MAKE_IDEA) && ${MAKE_IDEA} == YES
HDRS+= idea/idea.h
diff --git a/share/examples/etc/make.conf b/share/examples/etc/make.conf
index 9e9d669..41ad7bf 100644
--- a/share/examples/etc/make.conf
+++ b/share/examples/etc/make.conf
@@ -13,6 +13,19 @@
# You have to find the things you can put here in the Makefiles and
# documentation of the source tree.
#
+#
+# MACHINE_CPU controls which processor-specific optimizations will be
+# used by certain components of FreeBSD (currently only OpenSSL).
+# This should be set to a list of your CPU type, plus all previous
+# generations of the CPU architecture. The reason for using a list is
+# because not all programs which use the MACHINE_CPU variable may have
+# optimizations for your specific CPU generation (e.g. Pentium Pro),
+# but may have optimizations for the previous generation (e.g. Pentium).
+# Currently only the following CPU generations are used:
+# i686 i585 i386
+#
+#MACHINE_CPU=i686 i586 i386
+#
# CFLAGS controls the compiler settings used when compiling C code.
# Note that optimization settings above -O (-O2, ...) are not recommended
# or supported for compiling the world or the kernel - please revert any
@@ -82,7 +95,7 @@ BDECFLAGS= -W -Wall -ansi -pedantic -Wbad-function-cast -Wcast-align \
#NOGAMES= true # do not build games (games/ subdir)
#NOINFO= true # do not make or install info files
#NOLIBC_R= true # do not build libc_r (re-entrant version of libc)
-#NOPERL= true # To avoid building perl
+#NOPERL= true # do not build perl. Disables OpenSSL optimizations
#NOPROFILE= true # Avoid compiling profiled libraries
#NOSECURE= true # do not build crypto code in secure/ subdir
#NOSHARE= true # do not go into the share subdir
diff --git a/share/mk/sys.mk b/share/mk/sys.mk
index 1449d99..11d6002 100644
--- a/share/mk/sys.mk
+++ b/share/mk/sys.mk
@@ -101,8 +101,10 @@ YFLAGS ?= -d
# which knows MACHINE, but not MACHINE_ARCH. When building on other
# architectures, assume that the version of make being used has an
# explicit MACHINE_ARCH setting and treat a missing MACHINE_ARCH
-# as an i386 architecture.
+# as an i386 architecture. Similarly for MACHINE_CPU, which indicates
+# the specific CPU generation to use, for optimization purposes.
MACHINE_ARCH ?= i386
+MACHINE_CPU ?= i386
# For tags rule.
GTAGSFLAGS= -o
diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c
index 4695066..8ff1de3 100644
--- a/usr.bin/make/main.c
+++ b/usr.bin/make/main.c
@@ -472,6 +472,7 @@ main(argc, argv)
char cdpath[MAXPATHLEN + 1];
char *machine = getenv("MACHINE");
char *machine_arch = getenv("MACHINE_ARCH");
+ char *machine_cpu = getenv("MACHINE_CPU");
Lst sysMkPath; /* Path of sys.mk */
char *cp = NULL, *start;
/* avoid faults on read-only strings */
@@ -571,6 +572,19 @@ main(argc, argv)
}
/*
+ * Set machine_cpu to the minumum supported CPU revision based
+ * on the target architecture, if not already set.
+ */
+ if (!machine_cpu) {
+ if (!strcmp(machine_arch, "i386"))
+ machine_cpu = "i386";
+ else if (!strcmp(machine_arch, "alpha"))
+ machine_cpu = "ev4";
+ else
+ machine_cpu = "unknown";
+ }
+
+ /*
* The object directory location is determined using the
* following order of preference:
*
@@ -672,6 +686,7 @@ main(argc, argv)
Var_Set("MFLAGS", "", VAR_GLOBAL);
Var_Set("MACHINE", machine, VAR_GLOBAL);
Var_Set("MACHINE_ARCH", machine_arch, VAR_GLOBAL);
+ Var_Set("MACHINE_CPU", machine_cpu, VAR_GLOBAL);
/*
* First snag any flags out of the MAKE environment variable.
OpenPOWER on IntegriCloud