qemu/target-s390x/cpu_features.h
David Hildenbrand 8b3d6cb1fa s390x/cpumodel: introduce CPU feature group definitions
Let's use the generated groups to create feature group representations for
the user. These groups can later be used to enable/disable multiple
features in one shot and will be used to reduce the amount of reported
features to the user if all subfeatures are in place.

We want to work on features using ordinary bitmap operations, however we
can't initialize a bitmap statically (unsigned long[] ...). Therefore
we store the generated feature lists in separate arrays and convert
them to a proper bitmaps before they will ever be used.

Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Message-Id: <20160905085244.99980-8-dahi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
2016-09-06 17:06:49 +02:00

94 lines
3.1 KiB
C

/*
* CPU features/facilities helper structs and utility functions for s390
*
* Copyright 2016 IBM Corp.
*
* Author(s): Michael Mueller <mimu@linux.vnet.ibm.com>
* David Hildenbrand <dahi@linux.vnet.ibm.com>
*
* This work is licensed under the terms of the GNU GPL, version 2 or (at
* your option) any later version. See the COPYING file in the top-level
* directory.
*/
#ifndef TARGET_S390X_CPU_FEATURES_H
#define TARGET_S390X_CPU_FEATURES_H
#include "qemu/bitmap.h"
#include "cpu_features_def.h"
/* CPU features are announced via different ways */
typedef enum {
S390_FEAT_TYPE_STFL,
S390_FEAT_TYPE_SCLP_CONF_CHAR,
S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
S390_FEAT_TYPE_SCLP_CPU,
S390_FEAT_TYPE_MISC,
S390_FEAT_TYPE_PLO,
S390_FEAT_TYPE_PTFF,
S390_FEAT_TYPE_KMAC,
S390_FEAT_TYPE_KMC,
S390_FEAT_TYPE_KM,
S390_FEAT_TYPE_KIMD,
S390_FEAT_TYPE_KLMD,
S390_FEAT_TYPE_PCKMO,
S390_FEAT_TYPE_KMCTR,
S390_FEAT_TYPE_KMF,
S390_FEAT_TYPE_KMO,
S390_FEAT_TYPE_PCC,
S390_FEAT_TYPE_PPNO,
} S390FeatType;
/* Definition of a CPU feature */
typedef struct {
const char *name; /* name exposed to the user */
const char *desc; /* description exposed to the user */
S390FeatType type; /* feature type (way of indication)*/
int bit; /* bit within the feature type area (fixed) */
} S390FeatDef;
/* use ordinary bitmap operations to work with features */
typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)];
/* 64bit based bitmap used to init S390FeatBitmap from generated data */
typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1];
const S390FeatDef *s390_feat_def(S390Feat feat);
S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit);
void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap);
void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type,
uint8_t *data);
void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
uint8_t *data);
void s390_feat_bitmap_to_ascii(const S390FeatBitmap features, void *opaque,
void (*fn)(const char *name, void *opaque));
/* static groups that will never change */
typedef enum {
S390_FEAT_GROUP_PLO,
S390_FEAT_GROUP_TOD_CLOCK_STEERING,
S390_FEAT_GROUP_GEN13_PTFF_ENH,
S390_FEAT_GROUP_MSA,
S390_FEAT_GROUP_MSA_EXT_1,
S390_FEAT_GROUP_MSA_EXT_2,
S390_FEAT_GROUP_MSA_EXT_3,
S390_FEAT_GROUP_MSA_EXT_4,
S390_FEAT_GROUP_MSA_EXT_5,
S390_FEAT_GROUP_MAX,
} S390FeatGroup;
/* Definition of a CPU feature group */
typedef struct {
const char *name; /* name exposed to the user */
const char *desc; /* description exposed to the user */
S390FeatBitmap feat; /* features contained in the group */
S390FeatInit init; /* used to init feat from generated data */
} S390FeatGroupDef;
const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group);
#define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1))
#define BE_BIT(BIT) (1ULL < BE_BIT_NR(BIT))
#endif /* TARGET_S390X_CPU_FEATURES_H */