qemu/include/hw/virtio/virtio-mem.h
<<
>>
Prefs
   1/*
   2 * Virtio MEM device
   3 *
   4 * Copyright (C) 2020 Red Hat, Inc.
   5 *
   6 * Authors:
   7 *  David Hildenbrand <david@redhat.com>
   8 *
   9 * This work is licensed under the terms of the GNU GPL, version 2.
  10 * See the COPYING file in the top-level directory.
  11 */
  12
  13#ifndef HW_VIRTIO_MEM_H
  14#define HW_VIRTIO_MEM_H
  15
  16#include "standard-headers/linux/virtio_mem.h"
  17#include "hw/virtio/virtio.h"
  18#include "qapi/qapi-types-misc.h"
  19#include "sysemu/hostmem.h"
  20#include "qom/object.h"
  21
  22#define TYPE_VIRTIO_MEM "virtio-mem"
  23
  24OBJECT_DECLARE_TYPE(VirtIOMEM, VirtIOMEMClass,
  25                    VIRTIO_MEM)
  26
  27#define VIRTIO_MEM_MEMDEV_PROP "memdev"
  28#define VIRTIO_MEM_NODE_PROP "node"
  29#define VIRTIO_MEM_SIZE_PROP "size"
  30#define VIRTIO_MEM_REQUESTED_SIZE_PROP "requested-size"
  31#define VIRTIO_MEM_BLOCK_SIZE_PROP "block-size"
  32#define VIRTIO_MEM_ADDR_PROP "memaddr"
  33
  34struct VirtIOMEM {
  35    VirtIODevice parent_obj;
  36
  37    /* guest -> host request queue */
  38    VirtQueue *vq;
  39
  40    /* bitmap used to track unplugged memory */
  41    int32_t bitmap_size;
  42    unsigned long *bitmap;
  43
  44    /* assigned memory backend and memory region */
  45    HostMemoryBackend *memdev;
  46
  47    /* NUMA node */
  48    uint32_t node;
  49
  50    /* assigned address of the region in guest physical memory */
  51    uint64_t addr;
  52
  53    /* usable region size (<= region_size) */
  54    uint64_t usable_region_size;
  55
  56    /* actual size (how much the guest plugged) */
  57    uint64_t size;
  58
  59    /* requested size */
  60    uint64_t requested_size;
  61
  62    /* block size and alignment */
  63    uint64_t block_size;
  64
  65    /* notifiers to notify when "size" changes */
  66    NotifierList size_change_notifiers;
  67
  68    /* listeners to notify on plug/unplug activity. */
  69    QLIST_HEAD(, RamDiscardListener) rdl_list;
  70};
  71
  72struct VirtIOMEMClass {
  73    /* private */
  74    VirtIODevice parent;
  75
  76    /* public */
  77    void (*fill_device_info)(const VirtIOMEM *vmen, VirtioMEMDeviceInfo *vi);
  78    MemoryRegion *(*get_memory_region)(VirtIOMEM *vmem, Error **errp);
  79    void (*add_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier);
  80    void (*remove_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier);
  81};
  82
  83#endif
  84