2017-09-10 2 views
3

Ich bin auf GCC112, die eine Little-Endian Power8 Maschine mit Linux ist. Power8 hat in-core crypto bietet AES, SHA und ein paar andere nützliche Funktionen. Ich versuche die Verfügbarkeit der Features zur Laufzeit mit getauxval zu ermitteln. Der Anwendungsfall ist der Aufbau von Distros für eine "minimale" fähige Maschine, und wir müssen zur Laufzeit eine schnellere Funktion einlagern.Erkennen von Power8-Laufzeitumgebung und In-Core-Krypto durch getauxval?

Der Speicherauszug von hwcaps.h ist unten gezeigt, aber es fehlen spezifische Bits für Power8, AES, SHA und andere. Ich glaube jedoch, Power8 ist ISA 2.07 und ISA 2.07 hat das Bit PPC_FEATURE2_ARCH_2_07.

Die Sache, auf die ich nicht klar bin, ist Power8 In-Core-Krypto optional wie ARM Krypto unter ARMv8. Ich kann kein Dokument finden, das die Anforderung eindeutig angibt, und ich habe keine Mitgliedschaft bei OpenPower, um auf ISA-Dokumente zuzugreifen. (Eine andere Möglichkeit ist, es ist angegeben, aber ich habe es in den Dokumenten verpasst).

Ist es möglich, getauxval zu verwenden, um die Laufzeitumgebung für die Features abzufragen? Wenn nicht, wie ermitteln wir die Verfügbarkeit von Features zur Laufzeit? Ist CPU-Sondierung die einzige verfügbare Alternative?

Vielleicht allgemeiner, wie bestimmen wir Power6, Power7 und Power8 Laufzeitumgebungen?


auxv.h ist meist leer. Die Header-Datei enthält hwcaps.h.

$ cat /usr/include/bits/hwcap.h 
... 

/* The bit numbers must match those in the kernel's asm/cputable.h. */ 

/* Feature definitions in AT_HWCAP. */ 
#define PPC_FEATURE_32    0x80000000 /* 32-bit mode. */ 
#define PPC_FEATURE_64    0x40000000 /* 64-bit mode. */ 
#define PPC_FEATURE_601_INSTR  0x20000000 /* 601 chip, Old POWER ISA. */ 
#define PPC_FEATURE_HAS_ALTIVEC  0x10000000 /* SIMD/Vector Unit. */ 
#define PPC_FEATURE_HAS_FPU   0x08000000 /* Floating Point Unit. */ 
#define PPC_FEATURE_HAS_MMU   0x04000000 /* Memory Management Unit. */ 
#define PPC_FEATURE_HAS_4xxMAC  0x02000000 /* 4xx Multiply Accumulator. */ 
#define PPC_FEATURE_UNIFIED_CACHE 0x01000000 /* Unified I/D cache. */ 
#define PPC_FEATURE_HAS_SPE   0x00800000 /* Signal Processing ext. */ 
#define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000 /* SPE Float. */ 
#define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000 /* SPE Double. */ 
#define PPC_FEATURE_NO_TB   0x00100000 /* 601/403gx have no timebase */ 
#define PPC_FEATURE_POWER4   0x00080000 /* POWER4 ISA 2.00 */ 
#define PPC_FEATURE_POWER5   0x00040000 /* POWER5 ISA 2.02 */ 
#define PPC_FEATURE_POWER5_PLUS  0x00020000 /* POWER5+ ISA 2.03 */ 
#define PPC_FEATURE_CELL_BE   0x00010000 /* CELL Broadband Engine */ 
#define PPC_FEATURE_BOOKE   0x00008000 /* ISA Category Embedded */ 
#define PPC_FEATURE_SMT    0x00004000 /* Simultaneous 
                Multi-Threading */ 
#define PPC_FEATURE_ICACHE_SNOOP 0x00002000 
#define PPC_FEATURE_ARCH_2_05  0x00001000 /* ISA 2.05 */ 
#define PPC_FEATURE_PA6T   0x00000800 /* PA Semi 6T Core */ 
#define PPC_FEATURE_HAS_DFP   0x00000400 /* Decimal FP Unit */ 
#define PPC_FEATURE_POWER6_EXT  0x00000200 /* P6 + mffgpr/mftgpr */ 
#define PPC_FEATURE_ARCH_2_06  0x00000100 /* ISA 2.06 */ 
#define PPC_FEATURE_HAS_VSX   0x00000080 /* P7 Vector Extension. */ 
#define PPC_FEATURE_PSERIES_PERFMON_COMPAT 0x00000040 
#define PPC_FEATURE_TRUE_LE   0x00000002 
#define PPC_FEATURE_PPC_LE   0x00000001 

/* Feature definitions in AT_HWCAP2. */ 
#define PPC_FEATURE2_ARCH_2_07  0x80000000 /* ISA 2.07 */ 
#define PPC_FEATURE2_HAS_HTM  0x40000000 /* Hardware Transactional 
               Memory */ 
#define PPC_FEATURE2_HAS_DSCR  0x20000000 /* Data Stream Control 
               Register */ 
#define PPC_FEATURE2_HAS_EBB  0x10000000 /* Event Base Branching */ 
#define PPC_FEATURE2_HAS_ISEL  0x08000000 /* Integer Select */ 
#define PPC_FEATURE2_HAS_TAR  0x04000000 /* Target Address Register */ 

Antwort

2

Ich würde sagen, dass getauxval() der beste Weg, dies zu tun wäre; Die HWCAP & HWCAP2 Werte sind genau zum Ermitteln der Hardwarefunktionen. Aus Ihrer Liste fehlt die PPC_FEATURE2_VEC_CRYPTO, die auf die Vektor-Crypto-Anweisungen hinweist, die wie die von Ihnen benötigte klingen.

Als Randbemerkung: Sie wollen wahrscheinlich nicht Prozessor Implementierungen erkennen, aber Prozessor verfügt. Überprüfen Sie insbesondere das einzelne Feature, anstatt zu versuchen, nach einem Prozess zu suchen, der dieses Feature bereitstellt. (z. B., erkennen Sie VEC_CRYPTO direkt, anstatt zu versuchen, nach POWER8 zu überprüfen, und davon auszugehen, dass dies Krypto-Funktionalität impliziert).

Als ein wenig Detail spezifizieren Linux cputable Einträge die HWCAP/HWCAP2 Werte. Verwendung POWER8 als Beispiel:

#define COMMON_USER2_POWER8 (PPC_FEATURE2_ARCH_2_07 | \ 
       PPC_FEATURE2_HTM_COMP | \ 
       PPC_FEATURE2_HTM_NOSC_COMP | \ 
       PPC_FEATURE2_DSCR | \ 
       PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \ 
       PPC_FEATURE2_VEC_CRYPTO) 

, die aus arch/powerpc/include/asm/cputable.h im Kernel ist (die auch die tatsächliche hwcap Bits bereitstellt, die im AUX-Vektor festgelegt werden kann).

Schließlich bin ich ziemlich sicher, dass Sie kein OpenPOWER Foundation-Mitglied sein müssen, um die ISA herunterzuladen (das neueste ist 3.0B) - Sie brauchen nur ein Konto auf der Website.

+0

Dank @ Jeremy. 'PPC_FEATURE2_VEC_CRYPTO' klingt ungefähr richtig. Vielleicht ist die Version von SUSE, die GCC112 ausführt, zu alt (Kernel 3.10). Dieser Rechner antwortet nicht auf 'lsb_release' oder'/etc/releases', daher bin ich mir nicht sicher, welche Version von SUSE das ist. Würdest du zufällig wissen, welcher Wert 'PPC_FEATURE2_VEC_CRYPTO' ist? – jww

+0

Kein Problem. Ich habe einen Link zu den Definitionen dieser Bits hinzugefügt. Denken Sie daran, dass der Kernel, den Sie ausführen, diese Bits kennen muss, um sie zu setzen. –

+0

Nochmals vielen Dank @ Jeremy.Ich mag es nicht, aber check-in eine Version, die CPU-Sondierung für ältere Linux-Kernel durchführt. AIX brauchte es sowieso, da ich das Linux-Äquivalent auf AIX nicht gefunden habe. Siehe auch ['ppc-simd.cpp'] (https://github.com/weidai11/cryptopp/blob/master/ppc-simd.cpp#L203). Ich war überrascht zu sehen, dass AIX 'getsystemcfg (SC_L1C_DLS)' 128 für eine L1-Daten-Cache-Zeilengröße zurückgibt. Das ist das erste, das ich so groß gesehen habe. – jww

Verwandte Themen