蝉は、やがて死ぬる午後に気づいた。ああ、私たち、もっと仕合せになってよかったのだ。:2019年07月24日分

2019/07/24(Wed)

[オレオレN6] OpenSSL + ARM arch

前回の続き、オレオレN6のOpenSSLがhpcarmでビルド止まるのはクロス用のgccが__ARM_ARCH_3__なのでarm_arch.hの中で未サポートのCPUと判定されるからなんだが、N8で問題が起きないのは__ARM_ARCH_5TEJ__を返すからちゅーことか。

$ echo __ARM_ARCH_5TEJ__ | /usr/tooldir/bin/arm--netbsdelf-eabi-gcc -E -
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
1

ということで、今のMakefile中では

.if !empty(MACHINE_ARCH:Mearmv4*) || ${MACHINE_ARCH} == "armeb"
CPPFLAGS += -D__ARM_MAX_ARCH__=4
.elif ${MACHINE_ARCH} == "earmeb" || ${MACHINE_ARCH} == "earmhfeb"
CPPFLAGS += -D__ARM_MAX_ARCH__=5
.elif !empty(MACHINE_ARCH:Mearmv6*eb)
CPPFLAGS += -D__ARM_MAX_ARCH__=6
.else
CPPFLAGS += -D__ARM_MAX_ARCH__=8
.endif

としてMACHINE_ARCHで条件分岐してOpenSSLローカルの定義である__ARM_MAX_ARCH__をセットしとるんだけどこれは間違いであり

diff --git a/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/crypto.inc b/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/crypto.inc
index e11de9e953..699ee2de0e 100644
--- a/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/crypto.inc
+++ b/crypto/external/bsd/openssl/lib/libcrypto/arch/arm/crypto.inc
@@ -3,13 +3,13 @@ CPUID_SRCS = armv4cpuid.S armcap.c armv4-mont.S armv4-gf2m.S
 CPUID = yes
 CPPFLAGS += -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m
 .if !empty(MACHINE_ARCH:Mearmv4*) || ${MACHINE_ARCH} == "armeb"
-CPPFLAGS += -D__ARM_MAX_ARCH__=4
+CPPFLAGS += -D__ARM_ARCH__=4
 .elif ${MACHINE_ARCH} == "earmeb" || ${MACHINE_ARCH} == "earmhfeb"
-CPPFLAGS += -D__ARM_MAX_ARCH__=5
+CPPFLAGS += -D__ARM_ARCH__=5
 .elif !empty(MACHINE_ARCH:Mearmv6*eb)
-CPPFLAGS += -D__ARM_MAX_ARCH__=6
+CPPFLAGS += -D__ARM_ARCH__=6
 .else
-CPPFLAGS += -D__ARM_MAX_ARCH__=8
+CPPFLAGS += -D__ARM_ARCH__=8
 .endif
 .include "../../crypto.inc"

として本来はコンパイラが正しい値をセットするはずの(現状はしていない)__ARM_ARCH__を指定して、arm_arch.hの条件分岐を機能するようにしろってことかね。

あとワイはevb*とか基板剥きだしのオタクプロダクツには近寄らん主義なのでさっぱり判らんのだけど、/etc/mk.confに

USR_OBJMACHINE=yes
OBJMACHINE=yes

を設定しただけではMACHINE_ARCHが異なる場合もobjdirが同じで困るんだが、これ明示的に別のディレクトリにするにはわざわざbuild.shの引数で設定しないとダメなんすかね、めんどい。

[オレオレN6] OpenSSLアップデート作業もうそろそろ片付きそう

ようやくopensslconf.hのMD化を終えてN6でサポートされてるCPUはひととおりビルド通るのを確認、x86_64とsparc64は32/64bitでかっこわるいifdef入れてるけど、それぞれi386とsparcのopensslconf.hもインストールするようにして

#if defined(__x86_64__)
#include <openssl/x86_64/opensslconf.h>
#elif defined(__i386__)
#include <openssl/i386/opensslconf.h>
#endif

みたいなwrapperを用意した方がよさそうだけど、それは後回し。

そんでOpenSSLのコードには最適化のための黒魔術

# DES_PTR       use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
# DES_RISC1     use different DES_ENCRYPT macro that helps reduce register
#               dependancies but needs to more registers, good for RISC CPU's
# DES_RISC2     A different RISC variant.
# DES_UNROLL    unroll the inner DES loop, sometimes helps, somtimes hinders.
# BN_LLONG      use the type 'long long' in crypto/bn/bn.h
# RC4_INDEX     define RC4_INDEX in crypto/rc4/rc4_locl.h.  This turns on
#               array lookups instead of pointer use.
# RC4_CHUNK     enables code that handles data aligned at long (natural CPU
#               word) boundary.
# BF_PTR        use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
# BF_PTR2       intel specific version (generic version is more efficient).

というマクロが大量にあって、Configureを実行するとターゲットのCPUに合わせた設定をopensslconf.hに定義してくれるんだが

で定義される値がバラバラで、どれがちゃんとベンチ回して測定して決めた最適値なのか判らんのよな。 特に今opensslconf.hにではなくCPPFLAGSで渡してる値なんてそれこそSSLeay時代からの設定をそのまま秘伝のタレ状態で引継いでて、廃止されてるはずの指定あったりで信用性がちょっとね…

今はpkgsrcのパッチの値を採用してopensslconf.hを生成して放り込んだけど、それでもOpenBSD(LibreSSL)やLinuxの設定値と結構違いがあるのだ(CPU同じなら一緒やろ)、ちゃんとマシン用意してベンチ回して検証せんと駄目だわな。 とはいえしまいこんでる産廃ども(SUN Blade150, Mac Mini G4, Jornada 710, W-ZERO3複数)を引っ張り出して火入れてられるような家庭の状態じゃねえからな…

しゃーないのでgxemulとかQEMUでお茶濁すか、どうせ今更エミュ以外で動かす奴もおらんだろうし…

ということでmasterへのmergeのblockerになっとるlint(1)のfalse alarm問題以外はだいたい片付いたから、そっちの退治に戻りますかね…ああ読みたくねえ…