1 /* 2 * CPU features/facilities helper structs and utility functions for s390 3 * 4 * Copyright 2016 IBM Corp. 5 * 6 * Author(s): Michael Mueller <mimu@linux.vnet.ibm.com> 7 * David Hildenbrand <dahi@linux.vnet.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or (at 10 * your option) any later version. See the COPYING file in the top-level 11 * directory. 12 */ 13 14 #ifndef TARGET_S390X_CPU_FEATURES_H 15 #define TARGET_S390X_CPU_FEATURES_H 16 17 #include "qemu/bitmap.h" 18 #include "cpu_features_def.h" 19 20 /* CPU features are announced via different ways */ 21 typedef enum { 22 S390_FEAT_TYPE_STFL, 23 S390_FEAT_TYPE_SCLP_CONF_CHAR, 24 S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 25 S390_FEAT_TYPE_SCLP_CPU, 26 S390_FEAT_TYPE_MISC, 27 S390_FEAT_TYPE_PLO, 28 S390_FEAT_TYPE_PTFF, 29 S390_FEAT_TYPE_KMAC, 30 S390_FEAT_TYPE_KMC, 31 S390_FEAT_TYPE_KM, 32 S390_FEAT_TYPE_KIMD, 33 S390_FEAT_TYPE_KLMD, 34 S390_FEAT_TYPE_PCKMO, 35 S390_FEAT_TYPE_KMCTR, 36 S390_FEAT_TYPE_KMF, 37 S390_FEAT_TYPE_KMO, 38 S390_FEAT_TYPE_PCC, 39 S390_FEAT_TYPE_PPNO, 40 S390_FEAT_TYPE_KMA, 41 } S390FeatType; 42 43 /* Definition of a CPU feature */ 44 typedef struct { 45 const char *name; /* name exposed to the user */ 46 const char *desc; /* description exposed to the user */ 47 S390FeatType type; /* feature type (way of indication)*/ 48 int bit; /* bit within the feature type area (fixed) */ 49 } S390FeatDef; 50 51 /* use ordinary bitmap operations to work with features */ 52 typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)]; 53 54 /* 64bit based bitmap used to init S390FeatBitmap from generated data */ 55 typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1]; 56 57 const S390FeatDef *s390_feat_def(S390Feat feat); 58 S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit); 59 void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap); 60 void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, 61 uint8_t *data); 62 void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type, 63 uint8_t *data); 64 void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque, 65 void (*fn)(const char *name, void *opaque)); 66 67 /* static groups that will never change */ 68 typedef enum { 69 S390_FEAT_GROUP_PLO, 70 S390_FEAT_GROUP_TOD_CLOCK_STEERING, 71 S390_FEAT_GROUP_GEN13_PTFF_ENH, 72 S390_FEAT_GROUP_MSA, 73 S390_FEAT_GROUP_MSA_EXT_1, 74 S390_FEAT_GROUP_MSA_EXT_2, 75 S390_FEAT_GROUP_MSA_EXT_3, 76 S390_FEAT_GROUP_MSA_EXT_4, 77 S390_FEAT_GROUP_MSA_EXT_5, 78 S390_FEAT_GROUP_MSA_EXT_6, 79 S390_FEAT_GROUP_MSA_EXT_7, 80 S390_FEAT_GROUP_MSA_EXT_8, 81 S390_FEAT_GROUP_MAX, 82 } S390FeatGroup; 83 84 /* Definition of a CPU feature group */ 85 typedef struct { 86 const char *name; /* name exposed to the user */ 87 const char *desc; /* description exposed to the user */ 88 S390FeatBitmap feat; /* features contained in the group */ 89 S390FeatInit init; /* used to init feat from generated data */ 90 } S390FeatGroupDef; 91 92 const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group); 93 94 #define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1)) 95 96 static inline void set_be_bit(unsigned int bit_nr, uint8_t *array) 97 { 98 array[bit_nr / 8] |= 0x80 >> (bit_nr % 8); 99 } 100 static inline bool test_be_bit(unsigned int bit_nr, const uint8_t *array) 101 { 102 return array[bit_nr / 8] & (0x80 >> (bit_nr % 8)); 103 } 104 #endif /* TARGET_S390X_CPU_FEATURES_H */ 105