2017-09-10 16 views
3

Je suis sur GCC112, une petite machine Power8 sous Linux. Power8 a in-core crypto fournissant AES, SHA et quelques autres fonctionnalités utiles. J'essaie de déterminer la disponibilité des fonctionnalités à l'exécution en utilisant getauxval. Le cas d'utilisation est la construction de distributions pour une machine capable "minimum", et nous devons permuter une fonction plus rapide au moment de l'exécution.Détecter l'environnement d'exécution Power8 et le cryptage in-core via getauxval?

Le vidage de hwcaps.h est illustré ci-dessous, mais il manque des bits spécifiques pour Power8, AES, SHA et autres. Cependant, je crois que Power8 est ISA 2.07, et ISA 2.07 a le bit PPC_FEATURE2_ARCH_2_07. La chose que je ne suis pas clair sur est, est crypto in-core Power8 optionnel comme crypto ARM sous ARMv8. Je ne trouve pas de document indiquant clairement l'exigence, et je n'ai pas d'appartenance à OpenPower pour accéder aux documents ISA. (Une autre possibilité est, c'est indiqué mais je l'ai manqué dans les docs).

Est-il possible d'utiliser getauxval pour interroger l'environnement d'exécution pour les fonctionnalités? Si non, alors comment déterminer la disponibilité des fonctionnalités à l'exécution? Le CPU est-il la seule alternative disponible? Peut-être plus généralement, comment déterminons-nous les environnements d'exécution Power6, Power7 et Power8?


auxv.h est généralement vide. Le fichier d'en-tête comprend 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 */ 

Répondre

2

Je dirais que getauxval() serait la meilleure façon de le faire; Les valeurs HWCAP & HWCAP2 permettent de déterminer exactement les caractéristiques matérielles. Manquant de votre liste est le PPC_FEATURE2_VEC_CRYPTO, qui indique la présence des instructions de crypto vectorielles, qui sonne comme celui dont vous avez besoin.

Comme une note de côté: vous ne voulez probablement pas à détecter le processeur implémentations, mais le processeur fonctionnalités. Spécifiquement, vérifiez la fonctionnalité individuelle, plutôt que d'essayer de vérifier un processus qui fournit cette fonctionnalité. (par exemple, détecter VEC_CRYPTO directement, plutôt que d'essayer de vérifier POWER8, et supposer que cela implique une fonctionnalité crypto). Pour plus de détails, les entrées cputables de Linux spécifient les valeurs HWCAP/HWCAP2. En utilisant POWER8 comme exemple:

#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) 

C'est de arch/powerpc/include/asm/cputable.h dans le noyau (qui fournit également les bits de hwcap réels qui peuvent être définies dans le vecteur aux). Enfin, je suis pratiquement sûr que vous n'avez pas besoin d'être un membre de la fondation OpenPOWER pour télécharger l'ISA (le plus récent est 3.0B) - vous avez juste besoin d'un compte sur le site Web.

+0

Merci @Jeremy. 'PPC_FEATURE2_VEC_CRYPTO' semble à peu près juste. Peut-être que la version de SUSE que GCC112 exécute est trop ancienne (noyau 3.10). Cette machine ne répond pas 'lsb_release' ou'/etc/releases', donc je ne suis pas sûr de la version de SUSE. Seriez-vous capable de savoir quelle est la valeur de 'PPC_FEATURE2_VEC_CRYPTO'? – jww

+0

Pas de problème. J'ai ajouté un lien aux définitions de ces bits. Gardez à l'esprit que le noyau que vous utilisez devra être conscient de ces bits pour les paramétrer. –

+0

Merci encore @Jeremy.Je ne l'aime pas, mais j'inscris une version qui effectue des tests de cpu pour les anciens noyaux Linux. AIX en avait besoin de toute façon puisque je n'ai pas trouvé l'équivalent Linux sur AIX. Voir aussi ['ppc-simd.cpp'] (https://github.com/weidai11/cryptopp/blob/master/ppc-simd.cpp#L203). J'ai été surpris de voir le 'getsystemcfg (SC_L1C_DLS)' d'AIX retourner 128 pour une taille de ligne de cache de données L1. C'est le premier que j'ai vu aussi grand. – jww