]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * CPU features/facilities helper structs and utility functions for s390 | |
3 | * | |
4 | * Copyright 2016 IBM Corp. | |
5 | * | |
6 | * Author(s): Michael Mueller <[email protected]> | |
7 | * David Hildenbrand <[email protected]> | |
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 | #include "target/s390x/gen-features.h" | |
20 | ||
21 | /* CPU features are announced via different ways */ | |
22 | typedef enum { | |
23 | S390_FEAT_TYPE_STFL, | |
24 | S390_FEAT_TYPE_SCLP_CONF_CHAR, | |
25 | S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, | |
26 | S390_FEAT_TYPE_SCLP_FAC134, | |
27 | S390_FEAT_TYPE_SCLP_CPU, | |
28 | S390_FEAT_TYPE_MISC, | |
29 | S390_FEAT_TYPE_PLO, | |
30 | S390_FEAT_TYPE_PTFF, | |
31 | S390_FEAT_TYPE_KMAC, | |
32 | S390_FEAT_TYPE_KMC, | |
33 | S390_FEAT_TYPE_KM, | |
34 | S390_FEAT_TYPE_KIMD, | |
35 | S390_FEAT_TYPE_KLMD, | |
36 | S390_FEAT_TYPE_PCKMO, | |
37 | S390_FEAT_TYPE_KMCTR, | |
38 | S390_FEAT_TYPE_KMF, | |
39 | S390_FEAT_TYPE_KMO, | |
40 | S390_FEAT_TYPE_PCC, | |
41 | S390_FEAT_TYPE_PPNO, | |
42 | S390_FEAT_TYPE_KMA, | |
43 | S390_FEAT_TYPE_KDSA, | |
44 | S390_FEAT_TYPE_SORTL, | |
45 | S390_FEAT_TYPE_DFLTCC, | |
46 | } S390FeatType; | |
47 | ||
48 | /* Definition of a CPU feature */ | |
49 | typedef struct { | |
50 | const char *name; /* name exposed to the user */ | |
51 | const char *desc; /* description exposed to the user */ | |
52 | S390FeatType type; /* feature type (way of indication)*/ | |
53 | int bit; /* bit within the feature type area (fixed) */ | |
54 | } S390FeatDef; | |
55 | ||
56 | /* use ordinary bitmap operations to work with features */ | |
57 | typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)]; | |
58 | ||
59 | /* 64bit based bitmap used to init S390FeatBitmap from generated data */ | |
60 | typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1]; | |
61 | ||
62 | const S390FeatDef *s390_feat_def(S390Feat feat); | |
63 | S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit); | |
64 | void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap); | |
65 | void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, | |
66 | uint8_t *data); | |
67 | void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type, | |
68 | uint8_t *data); | |
69 | void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque, | |
70 | void (*fn)(const char *name, void *opaque)); | |
71 | ||
72 | /* Definition of a CPU feature group */ | |
73 | typedef struct { | |
74 | const char *name; /* name exposed to the user */ | |
75 | const char *desc; /* description exposed to the user */ | |
76 | S390FeatBitmap feat; /* features contained in the group */ | |
77 | S390FeatInit init; /* used to init feat from generated data */ | |
78 | } S390FeatGroupDef; | |
79 | ||
80 | const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group); | |
81 | ||
82 | #define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1)) | |
83 | ||
84 | static inline void clear_be_bit(unsigned int bit_nr, uint8_t *array) | |
85 | { | |
86 | array[bit_nr / 8] &= ~(0x80 >> (bit_nr % 8)); | |
87 | } | |
88 | static inline void set_be_bit(unsigned int bit_nr, uint8_t *array) | |
89 | { | |
90 | array[bit_nr / 8] |= 0x80 >> (bit_nr % 8); | |
91 | } | |
92 | static inline bool test_be_bit(unsigned int bit_nr, const uint8_t *array) | |
93 | { | |
94 | return array[bit_nr / 8] & (0x80 >> (bit_nr % 8)); | |
95 | } | |
96 | #endif /* TARGET_S390X_CPU_FEATURES_H */ |