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

boards.h (15238B)


      1/* Declarations for use by board files for creating devices.  */
      2
      3#ifndef HW_BOARDS_H
      4#define HW_BOARDS_H
      5
      6#include "exec/memory.h"
      7#include "sysemu/hostmem.h"
      8#include "sysemu/blockdev.h"
      9#include "qemu/accel.h"
     10#include "qapi/qapi-types-machine.h"
     11#include "qemu/module.h"
     12#include "qom/object.h"
     13#include "hw/core/cpu.h"
     14
     15#define TYPE_MACHINE_SUFFIX "-machine"
     16
     17/* Machine class name that needs to be used for class-name-based machine
     18 * type lookup to work.
     19 */
     20#define MACHINE_TYPE_NAME(machinename) (machinename TYPE_MACHINE_SUFFIX)
     21
     22#define TYPE_MACHINE "machine"
     23#undef MACHINE  /* BSD defines it and QEMU does not use it */
     24OBJECT_DECLARE_TYPE(MachineState, MachineClass, MACHINE)
     25
     26extern MachineState *current_machine;
     27
     28void machine_run_board_init(MachineState *machine);
     29bool machine_usb(MachineState *machine);
     30int machine_phandle_start(MachineState *machine);
     31bool machine_dump_guest_core(MachineState *machine);
     32bool machine_mem_merge(MachineState *machine);
     33HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine);
     34void machine_set_cpu_numa_node(MachineState *machine,
     35                               const CpuInstanceProperties *props,
     36                               Error **errp);
     37
     38/**
     39 * machine_class_allow_dynamic_sysbus_dev: Add type to list of valid devices
     40 * @mc: Machine class
     41 * @type: type to allow (should be a subtype of TYPE_SYS_BUS_DEVICE)
     42 *
     43 * Add the QOM type @type to the list of devices of which are subtypes
     44 * of TYPE_SYS_BUS_DEVICE but which are still permitted to be dynamically
     45 * created (eg by the user on the command line with -device).
     46 * By default if the user tries to create any devices on the command line
     47 * that are subtypes of TYPE_SYS_BUS_DEVICE they will get an error message;
     48 * for the special cases which are permitted for this machine model, the
     49 * machine model class init code must call this function to add them
     50 * to the list of specifically permitted devices.
     51 */
     52void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
     53
     54/**
     55 * device_is_dynamic_sysbus: test whether device is a dynamic sysbus device
     56 * @mc: Machine class
     57 * @dev: device to check
     58 *
     59 * Returns: true if @dev is a sysbus device on the machine's list
     60 * of dynamically pluggable sysbus devices; otherwise false.
     61 *
     62 * This function checks whether @dev is a valid dynamic sysbus device,
     63 * by first confirming that it is a sysbus device and then checking it
     64 * against the list of permitted dynamic sysbus devices which has been
     65 * set up by the machine using machine_class_allow_dynamic_sysbus_dev().
     66 *
     67 * It is valid to call this with something that is not a subclass of
     68 * TYPE_SYS_BUS_DEVICE; the function will return false in this case.
     69 * This allows hotplug callback functions to be written as:
     70 *     if (device_is_dynamic_sysbus(mc, dev)) {
     71 *         handle dynamic sysbus case;
     72 *     } else if (some other kind of hotplug) {
     73 *         handle that;
     74 *     }
     75 */
     76bool device_is_dynamic_sysbus(MachineClass *mc, DeviceState *dev);
     77
     78/*
     79 * Checks that backend isn't used, preps it for exclusive usage and
     80 * returns migratable MemoryRegion provided by backend.
     81 */
     82MemoryRegion *machine_consume_memdev(MachineState *machine,
     83                                     HostMemoryBackend *backend);
     84
     85/**
     86 * CPUArchId:
     87 * @arch_id - architecture-dependent CPU ID of present or possible CPU
     88 * @cpu - pointer to corresponding CPU object if it's present on NULL otherwise
     89 * @type - QOM class name of possible @cpu object
     90 * @props - CPU object properties, initialized by board
     91 * #vcpus_count - number of threads provided by @cpu object
     92 */
     93typedef struct CPUArchId {
     94    uint64_t arch_id;
     95    int64_t vcpus_count;
     96    CpuInstanceProperties props;
     97    Object *cpu;
     98    const char *type;
     99} CPUArchId;
    100
    101/**
    102 * CPUArchIdList:
    103 * @len - number of @CPUArchId items in @cpus array
    104 * @cpus - array of present or possible CPUs for current machine configuration
    105 */
    106typedef struct {
    107    int len;
    108    CPUArchId cpus[];
    109} CPUArchIdList;
    110
    111/**
    112 * SMPCompatProps:
    113 * @prefer_sockets - whether sockets are preferred over cores in smp parsing
    114 * @dies_supported - whether dies are supported by the machine
    115 */
    116typedef struct {
    117    bool prefer_sockets;
    118    bool dies_supported;
    119} SMPCompatProps;
    120
    121/**
    122 * MachineClass:
    123 * @deprecation_reason: If set, the machine is marked as deprecated. The
    124 *    string should provide some clear information about what to use instead.
    125 * @max_cpus: maximum number of CPUs supported. Default: 1
    126 * @min_cpus: minimum number of CPUs supported. Default: 1
    127 * @default_cpus: number of CPUs instantiated if none are specified. Default: 1
    128 * @is_default:
    129 *    If true QEMU will use this machine by default if no '-M' option is given.
    130 * @get_hotplug_handler: this function is called during bus-less
    131 *    device hotplug. If defined it returns pointer to an instance
    132 *    of HotplugHandler object, which handles hotplug operation
    133 *    for a given @dev. It may return NULL if @dev doesn't require
    134 *    any actions to be performed by hotplug handler.
    135 * @cpu_index_to_instance_props:
    136 *    used to provide @cpu_index to socket/core/thread number mapping, allowing
    137 *    legacy code to perform maping from cpu_index to topology properties
    138 *    Returns: tuple of socket/core/thread ids given cpu_index belongs to.
    139 *    used to provide @cpu_index to socket number mapping, allowing
    140 *    a machine to group CPU threads belonging to the same socket/package
    141 *    Returns: socket number given cpu_index belongs to.
    142 * @hw_version:
    143 *    Value of QEMU_VERSION when the machine was added to QEMU.
    144 *    Set only by old machines because they need to keep
    145 *    compatibility on code that exposed QEMU_VERSION to guests in
    146 *    the past (and now use qemu_hw_version()).
    147 * @possible_cpu_arch_ids:
    148 *    Returns an array of @CPUArchId architecture-dependent CPU IDs
    149 *    which includes CPU IDs for present and possible to hotplug CPUs.
    150 *    Caller is responsible for freeing returned list.
    151 * @get_default_cpu_node_id:
    152 *    returns default board specific node_id value for CPU slot specified by
    153 *    index @idx in @ms->possible_cpus[]
    154 * @has_hotpluggable_cpus:
    155 *    If true, board supports CPUs creation with -device/device_add.
    156 * @default_cpu_type:
    157 *    specifies default CPU_TYPE, which will be used for parsing target
    158 *    specific features and for creating CPUs if CPU name wasn't provided
    159 *    explicitly at CLI
    160 * @minimum_page_bits:
    161 *    If non-zero, the board promises never to create a CPU with a page size
    162 *    smaller than this, so QEMU can use a more efficient larger page
    163 *    size than the target architecture's minimum. (Attempting to create
    164 *    such a CPU will fail.) Note that changing this is a migration
    165 *    compatibility break for the machine.
    166 * @ignore_memory_transaction_failures:
    167 *    If this is flag is true then the CPU will ignore memory transaction
    168 *    failures which should cause the CPU to take an exception due to an
    169 *    access to an unassigned physical address; the transaction will instead
    170 *    return zero (for a read) or be ignored (for a write). This should be
    171 *    set only by legacy board models which rely on the old RAZ/WI behaviour
    172 *    for handling devices that QEMU does not yet model. New board models
    173 *    should instead use "unimplemented-device" for all memory ranges where
    174 *    the guest will attempt to probe for a device that QEMU doesn't
    175 *    implement and a stub device is required.
    176 * @kvm_type:
    177 *    Return the type of KVM corresponding to the kvm-type string option or
    178 *    computed based on other criteria such as the host kernel capabilities.
    179 *    kvm-type may be NULL if it is not needed.
    180 * @numa_mem_supported:
    181 *    true if '--numa node.mem' option is supported and false otherwise
    182 * @hotplug_allowed:
    183 *    If the hook is provided, then it'll be called for each device
    184 *    hotplug to check whether the device hotplug is allowed.  Return
    185 *    true to grant allowance or false to reject the hotplug.  When
    186 *    false is returned, an error must be set to show the reason of
    187 *    the rejection.  If the hook is not provided, all hotplug will be
    188 *    allowed.
    189 * @default_ram_id:
    190 *    Specifies inital RAM MemoryRegion name to be used for default backend
    191 *    creation if user explicitly hasn't specified backend with "memory-backend"
    192 *    property.
    193 *    It also will be used as a way to optin into "-m" option support.
    194 *    If it's not set by board, '-m' will be ignored and generic code will
    195 *    not create default RAM MemoryRegion.
    196 * @fixup_ram_size:
    197 *    Amends user provided ram size (with -m option) using machine
    198 *    specific algorithm. To be used by old machine types for compat
    199 *    purposes only.
    200 *    Applies only to default memory backend, i.e., explicit memory backend
    201 *    wasn't used.
    202 */
    203struct MachineClass {
    204    /*< private >*/
    205    ObjectClass parent_class;
    206    /*< public >*/
    207
    208    const char *family; /* NULL iff @name identifies a standalone machtype */
    209    char *name;
    210    const char *alias;
    211    const char *desc;
    212    const char *deprecation_reason;
    213
    214    void (*init)(MachineState *state);
    215    void (*reset)(MachineState *state);
    216    void (*wakeup)(MachineState *state);
    217    int (*kvm_type)(MachineState *machine, const char *arg);
    218
    219    BlockInterfaceType block_default_type;
    220    int units_per_default_bus;
    221    int max_cpus;
    222    int min_cpus;
    223    int default_cpus;
    224    unsigned int no_serial:1,
    225        no_parallel:1,
    226        no_floppy:1,
    227        no_cdrom:1,
    228        no_sdcard:1,
    229        pci_allow_0_address:1,
    230        legacy_fw_cfg_order:1;
    231    bool is_default;
    232    const char *default_machine_opts;
    233    const char *default_boot_order;
    234    const char *default_display;
    235    GPtrArray *compat_props;
    236    const char *hw_version;
    237    ram_addr_t default_ram_size;
    238    const char *default_cpu_type;
    239    bool default_kernel_irqchip_split;
    240    bool option_rom_has_mr;
    241    bool rom_file_has_mr;
    242    int minimum_page_bits;
    243    bool has_hotpluggable_cpus;
    244    bool ignore_memory_transaction_failures;
    245    int numa_mem_align_shift;
    246    const char **valid_cpu_types;
    247    strList *allowed_dynamic_sysbus_devices;
    248    bool auto_enable_numa_with_memhp;
    249    bool auto_enable_numa_with_memdev;
    250    bool ignore_boot_device_suffixes;
    251    bool smbus_no_migration_support;
    252    bool nvdimm_supported;
    253    bool numa_mem_supported;
    254    bool auto_enable_numa;
    255    SMPCompatProps smp_props;
    256    const char *default_ram_id;
    257
    258    HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
    259                                           DeviceState *dev);
    260    bool (*hotplug_allowed)(MachineState *state, DeviceState *dev,
    261                            Error **errp);
    262    CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine,
    263                                                         unsigned cpu_index);
    264    const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
    265    int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
    266    ram_addr_t (*fixup_ram_size)(ram_addr_t size);
    267};
    268
    269/**
    270 * DeviceMemoryState:
    271 * @base: address in guest physical address space where the memory
    272 * address space for memory devices starts
    273 * @mr: address space container for memory devices
    274 */
    275typedef struct DeviceMemoryState {
    276    hwaddr base;
    277    MemoryRegion mr;
    278} DeviceMemoryState;
    279
    280/**
    281 * CpuTopology:
    282 * @cpus: the number of present logical processors on the machine
    283 * @sockets: the number of sockets on the machine
    284 * @dies: the number of dies in one socket
    285 * @cores: the number of cores in one die
    286 * @threads: the number of threads in one core
    287 * @max_cpus: the maximum number of logical processors on the machine
    288 */
    289typedef struct CpuTopology {
    290    unsigned int cpus;
    291    unsigned int sockets;
    292    unsigned int dies;
    293    unsigned int cores;
    294    unsigned int threads;
    295    unsigned int max_cpus;
    296} CpuTopology;
    297
    298/**
    299 * MachineState:
    300 */
    301struct MachineState {
    302    /*< private >*/
    303    Object parent_obj;
    304    Notifier sysbus_notifier;
    305
    306    /*< public >*/
    307
    308    void *fdt;
    309    char *dtb;
    310    char *dumpdtb;
    311    int phandle_start;
    312    char *dt_compatible;
    313    bool dump_guest_core;
    314    bool mem_merge;
    315    bool usb;
    316    bool usb_disabled;
    317    char *firmware;
    318    bool iommu;
    319    bool suppress_vmdesc;
    320    bool enable_graphics;
    321    ConfidentialGuestSupport *cgs;
    322    char *ram_memdev_id;
    323    /*
    324     * convenience alias to ram_memdev_id backend memory region
    325     * or to numa container memory region
    326     */
    327    MemoryRegion *ram;
    328    DeviceMemoryState *device_memory;
    329
    330    ram_addr_t ram_size;
    331    ram_addr_t maxram_size;
    332    uint64_t   ram_slots;
    333    const char *boot_order;
    334    const char *boot_once;
    335    char *kernel_filename;
    336    char *kernel_cmdline;
    337    char *initrd_filename;
    338    const char *cpu_type;
    339    AccelState *accelerator;
    340    CPUArchIdList *possible_cpus;
    341    CpuTopology smp;
    342    struct NVDIMMState *nvdimms_state;
    343    struct NumaState *numa_state;
    344};
    345
    346#define DEFINE_MACHINE(namestr, machine_initfn) \
    347    static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
    348    { \
    349        MachineClass *mc = MACHINE_CLASS(oc); \
    350        machine_initfn(mc); \
    351    } \
    352    static const TypeInfo machine_initfn##_typeinfo = { \
    353        .name       = MACHINE_TYPE_NAME(namestr), \
    354        .parent     = TYPE_MACHINE, \
    355        .class_init = machine_initfn##_class_init, \
    356    }; \
    357    static void machine_initfn##_register_types(void) \
    358    { \
    359        type_register_static(&machine_initfn##_typeinfo); \
    360    } \
    361    type_init(machine_initfn##_register_types)
    362
    363extern GlobalProperty hw_compat_6_1[];
    364extern const size_t hw_compat_6_1_len;
    365
    366extern GlobalProperty hw_compat_6_0[];
    367extern const size_t hw_compat_6_0_len;
    368
    369extern GlobalProperty hw_compat_5_2[];
    370extern const size_t hw_compat_5_2_len;
    371
    372extern GlobalProperty hw_compat_5_1[];
    373extern const size_t hw_compat_5_1_len;
    374
    375extern GlobalProperty hw_compat_5_0[];
    376extern const size_t hw_compat_5_0_len;
    377
    378extern GlobalProperty hw_compat_4_2[];
    379extern const size_t hw_compat_4_2_len;
    380
    381extern GlobalProperty hw_compat_4_1[];
    382extern const size_t hw_compat_4_1_len;
    383
    384extern GlobalProperty hw_compat_4_0[];
    385extern const size_t hw_compat_4_0_len;
    386
    387extern GlobalProperty hw_compat_3_1[];
    388extern const size_t hw_compat_3_1_len;
    389
    390extern GlobalProperty hw_compat_3_0[];
    391extern const size_t hw_compat_3_0_len;
    392
    393extern GlobalProperty hw_compat_2_12[];
    394extern const size_t hw_compat_2_12_len;
    395
    396extern GlobalProperty hw_compat_2_11[];
    397extern const size_t hw_compat_2_11_len;
    398
    399extern GlobalProperty hw_compat_2_10[];
    400extern const size_t hw_compat_2_10_len;
    401
    402extern GlobalProperty hw_compat_2_9[];
    403extern const size_t hw_compat_2_9_len;
    404
    405extern GlobalProperty hw_compat_2_8[];
    406extern const size_t hw_compat_2_8_len;
    407
    408extern GlobalProperty hw_compat_2_7[];
    409extern const size_t hw_compat_2_7_len;
    410
    411extern GlobalProperty hw_compat_2_6[];
    412extern const size_t hw_compat_2_6_len;
    413
    414extern GlobalProperty hw_compat_2_5[];
    415extern const size_t hw_compat_2_5_len;
    416
    417extern GlobalProperty hw_compat_2_4[];
    418extern const size_t hw_compat_2_4_len;
    419
    420extern GlobalProperty hw_compat_2_3[];
    421extern const size_t hw_compat_2_3_len;
    422
    423extern GlobalProperty hw_compat_2_2[];
    424extern const size_t hw_compat_2_2_len;
    425
    426extern GlobalProperty hw_compat_2_1[];
    427extern const size_t hw_compat_2_1_len;
    428
    429#endif