1
2
3
4
5
6
7
8
9
10
11
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
22typedef 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} S390FeatType;
43
44
45typedef struct {
46 const char *name;
47 const char *desc;
48 S390FeatType type;
49 int bit;
50} S390FeatDef;
51
52
53typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)];
54
55
56typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1];
57
58const S390FeatDef *s390_feat_def(S390Feat feat);
59S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit);
60void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap);
61void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type,
62 uint8_t *data);
63void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
64 uint8_t *data);
65void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque,
66 void (*fn)(const char *name, void *opaque));
67
68
69typedef struct {
70 const char *name;
71 const char *desc;
72 S390FeatBitmap feat;
73 S390FeatInit init;
74} S390FeatGroupDef;
75
76const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group);
77
78#define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1))
79
80static inline void set_be_bit(unsigned int bit_nr, uint8_t *array)
81{
82 array[bit_nr / 8] |= 0x80 >> (bit_nr % 8);
83}
84static inline bool test_be_bit(unsigned int bit_nr, const uint8_t *array)
85{
86 return array[bit_nr / 8] & (0x80 >> (bit_nr % 8));
87}
88#endif
89