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 | #include "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_CPU, |
27 | S390_FEAT_TYPE_MISC, |
28 | S390_FEAT_TYPE_PLO, |
29 | S390_FEAT_TYPE_PTFF, |
30 | S390_FEAT_TYPE_KMAC, |
31 | S390_FEAT_TYPE_KMC, |
32 | S390_FEAT_TYPE_KM, |
33 | S390_FEAT_TYPE_KIMD, |
34 | S390_FEAT_TYPE_KLMD, |
35 | S390_FEAT_TYPE_PCKMO, |
36 | S390_FEAT_TYPE_KMCTR, |
37 | S390_FEAT_TYPE_KMF, |
38 | S390_FEAT_TYPE_KMO, |
39 | S390_FEAT_TYPE_PCC, |
40 | S390_FEAT_TYPE_PPNO, |
41 | S390_FEAT_TYPE_KMA, |
42 | S390_FEAT_TYPE_KDSA, |
43 | S390_FEAT_TYPE_SORTL, |
44 | S390_FEAT_TYPE_DFLTCC, |
45 | } S390FeatType; |
46 | |
47 | /* Definition of a CPU feature */ |
48 | typedef struct { |
49 | const char *name; /* name exposed to the user */ |
50 | const char *desc; /* description exposed to the user */ |
51 | S390FeatType type; /* feature type (way of indication)*/ |
52 | int bit; /* bit within the feature type area (fixed) */ |
53 | } S390FeatDef; |
54 | |
55 | /* use ordinary bitmap operations to work with features */ |
56 | typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)]; |
57 | |
58 | /* 64bit based bitmap used to init S390FeatBitmap from generated data */ |
59 | typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1]; |
60 | |
61 | const S390FeatDef *s390_feat_def(S390Feat feat); |
62 | S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit); |
63 | void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap); |
64 | void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type, |
65 | uint8_t *data); |
66 | void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type, |
67 | uint8_t *data); |
68 | void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque, |
69 | void (*fn)(const char *name, void *opaque)); |
70 | |
71 | /* Definition of a CPU feature group */ |
72 | typedef struct { |
73 | const char *name; /* name exposed to the user */ |
74 | const char *desc; /* description exposed to the user */ |
75 | S390FeatBitmap feat; /* features contained in the group */ |
76 | S390FeatInit init; /* used to init feat from generated data */ |
77 | } S390FeatGroupDef; |
78 | |
79 | const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group); |
80 | |
81 | #define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1)) |
82 | |
83 | static inline void set_be_bit(unsigned int bit_nr, uint8_t *array) |
84 | { |
85 | array[bit_nr / 8] |= 0x80 >> (bit_nr % 8); |
86 | } |
87 | static inline bool test_be_bit(unsigned int bit_nr, const uint8_t *array) |
88 | { |
89 | return array[bit_nr / 8] & (0x80 >> (bit_nr % 8)); |
90 | } |
91 | #endif /* TARGET_S390X_CPU_FEATURES_H */ |
92 | |