qemu/include/hw/s390x/storage-keys.h
<<
>>
Prefs
   1/*
   2 * s390 storage key device
   3 *
   4 * Copyright 2015 IBM Corp.
   5 * Author(s): Jason J. Herne <jjherne@linux.vnet.ibm.com>
   6 *
   7 * This work is licensed under the terms of the GNU GPL, version 2 or (at
   8 * your option) any later version. See the COPYING file in the top-level
   9 * directory.
  10 */
  11
  12#ifndef S390_STORAGE_KEYS_H
  13#define S390_STORAGE_KEYS_H
  14
  15#include "hw/qdev-core.h"
  16#include "monitor/monitor.h"
  17#include "qom/object.h"
  18
  19#define TYPE_S390_SKEYS "s390-skeys"
  20OBJECT_DECLARE_TYPE(S390SKeysState, S390SKeysClass, S390_SKEYS)
  21
  22struct S390SKeysState {
  23    DeviceState parent_obj;
  24    bool migration_enabled;
  25
  26};
  27
  28
  29struct S390SKeysClass {
  30    DeviceClass parent_class;
  31
  32    /**
  33     * @skeys_are_enabled:
  34     *
  35     * Check whether storage keys are enabled. If not enabled, they were not
  36     * enabled lazily either by the guest via a storage key instruction or
  37     * by the host during migration.
  38     *
  39     * If disabled, everything not explicitly triggered by the guest,
  40     * such as outgoing migration or dirty/change tracking, should not touch
  41     * storage keys and should not lazily enable it.
  42     *
  43     * @ks: the #S390SKeysState
  44     *
  45     * Returns false if not enabled and true if enabled.
  46     */
  47    bool (*skeys_are_enabled)(S390SKeysState *ks);
  48
  49    /**
  50     * @enable_skeys:
  51     *
  52     * Lazily enable storage keys. If this function is not implemented,
  53     * setting a storage key will lazily enable storage keys implicitly
  54     * instead. TCG guests have to make sure to flush the TLB of all CPUs
  55     * if storage keys were not enabled before this call.
  56     *
  57     * @ks: the #S390SKeysState
  58     *
  59     * Returns false if not enabled before this call, and true if already
  60     * enabled.
  61     */
  62    bool (*enable_skeys)(S390SKeysState *ks);
  63
  64    /**
  65     * @get_skeys:
  66     *
  67     * Get storage keys for the given PFN range. This call will fail if
  68     * storage keys have not been lazily enabled yet.
  69     *
  70     * Callers have to validate that a GFN is valid before this call.
  71     *
  72     * @ks: the #S390SKeysState
  73     * @start_gfn: the start GFN to get storage keys for
  74     * @count: the number of storage keys to get
  75     * @keys: the byte array where storage keys will be stored to
  76     *
  77     * Returns 0 on success, returns an error if getting a storage key failed.
  78     */
  79    int (*get_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t count,
  80                     uint8_t *keys);
  81    /**
  82     * @set_skeys:
  83     *
  84     * Set storage keys for the given PFN range. This call will fail if
  85     * storage keys have not been lazily enabled yet and implicit
  86     * enablement is not supported.
  87     *
  88     * Callers have to validate that a GFN is valid before this call.
  89     *
  90     * @ks: the #S390SKeysState
  91     * @start_gfn: the start GFN to set storage keys for
  92     * @count: the number of storage keys to set
  93     * @keys: the byte array where storage keys will be read from
  94     *
  95     * Returns 0 on success, returns an error if setting a storage key failed.
  96     */
  97    int (*set_skeys)(S390SKeysState *ks, uint64_t start_gfn, uint64_t count,
  98                     uint8_t *keys);
  99};
 100
 101#define TYPE_KVM_S390_SKEYS "s390-skeys-kvm"
 102#define TYPE_QEMU_S390_SKEYS "s390-skeys-qemu"
 103typedef struct QEMUS390SKeysState QEMUS390SKeysState;
 104DECLARE_INSTANCE_CHECKER(QEMUS390SKeysState, QEMU_S390_SKEYS,
 105                         TYPE_QEMU_S390_SKEYS)
 106
 107struct QEMUS390SKeysState {
 108    S390SKeysState parent_obj;
 109    uint8_t *keydata;
 110    uint32_t key_count;
 111};
 112
 113void s390_skeys_init(void);
 114
 115S390SKeysState *s390_get_skeys_device(void);
 116
 117void hmp_dump_skeys(Monitor *mon, const QDict *qdict);
 118void hmp_info_skeys(Monitor *mon, const QDict *qdict);
 119
 120#endif /* S390_STORAGE_KEYS_H */
 121