qemu/target/s390x/cpu_features.h
<<
>>
Prefs
   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 "target/s390x/gen-features.h"
  20
  21/* CPU features are announced via different ways */
  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_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 */
  49typedef 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 */
  57typedef unsigned long S390FeatBitmap[BITS_TO_LONGS(S390_FEAT_MAX)];
  58
  59/* 64bit based bitmap used to init S390FeatBitmap from generated data */
  60typedef uint64_t S390FeatInit[S390_FEAT_MAX / 64 + 1];
  61
  62const S390FeatDef *s390_feat_def(S390Feat feat);
  63S390Feat s390_feat_by_type_and_bit(S390FeatType type, int bit);
  64void s390_init_feat_bitmap(const S390FeatInit init, S390FeatBitmap bitmap);
  65void s390_fill_feat_block(const S390FeatBitmap features, S390FeatType type,
  66                          uint8_t *data);
  67void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
  68                          uint8_t *data);
  69void 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 */
  73typedef 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
  80const S390FeatGroupDef *s390_feat_group_def(S390FeatGroup group);
  81
  82#define BE_BIT_NR(BIT) (BIT ^ (BITS_PER_LONG - 1))
  83
  84static inline void clear_be_bit(unsigned int bit_nr, uint8_t *array)
  85{
  86    array[bit_nr / 8] &= ~(0x80 >> (bit_nr % 8));
  87}
  88static inline void set_be_bit(unsigned int bit_nr, uint8_t *array)
  89{
  90    array[bit_nr / 8] |= 0x80 >> (bit_nr % 8);
  91}
  92static 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 */
  97