cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

cpu_features.h (3293B)


      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 */