10d09e41aSPaolo Bonzini /* Declarations for use by board files for creating devices. */ 20d09e41aSPaolo Bonzini 30d09e41aSPaolo Bonzini #ifndef HW_BOARDS_H 40d09e41aSPaolo Bonzini #define HW_BOARDS_H 50d09e41aSPaolo Bonzini 6d4842052SMarkus Armbruster #include "exec/memory.h" 70d09e41aSPaolo Bonzini #include "sysemu/blockdev.h" 8ac2da55eSEduardo Habkost #include "sysemu/accel.h" 98ac25c84SMarkus Armbruster #include "qapi/qapi-types-machine.h" 100b8fa32fSMarkus Armbruster #include "qemu/module.h" 1136d20cb2SMarcel Apfelbaum #include "qom/object.h" 123811ef14SIgor Mammedov #include "qom/cpu.h" 130d09e41aSPaolo Bonzini 1409ad6438SPeter Maydell /** 1509ad6438SPeter Maydell * memory_region_allocate_system_memory - Allocate a board's main memory 1609ad6438SPeter Maydell * @mr: the #MemoryRegion to be initialized 1709ad6438SPeter Maydell * @owner: the object that tracks the region's reference count 1809ad6438SPeter Maydell * @name: name of the memory region 1909ad6438SPeter Maydell * @ram_size: size of the region in bytes 2009ad6438SPeter Maydell * 2109ad6438SPeter Maydell * This function allocates the main memory for a board model, and 2209ad6438SPeter Maydell * initializes @mr appropriately. It also arranges for the memory 2309ad6438SPeter Maydell * to be migrated (by calling vmstate_register_ram_global()). 2409ad6438SPeter Maydell * 2509ad6438SPeter Maydell * Memory allocated via this function will be backed with the memory 2609ad6438SPeter Maydell * backend the user provided using "-mem-path" or "-numa node,memdev=..." 2709ad6438SPeter Maydell * if appropriate; this is typically used to cause host huge pages to be 2809ad6438SPeter Maydell * used. This function should therefore be called by a board exactly once, 2909ad6438SPeter Maydell * for the primary or largest RAM area it implements. 3009ad6438SPeter Maydell * 3109ad6438SPeter Maydell * For boards where the major RAM is split into two parts in the memory 3209ad6438SPeter Maydell * map, you can deal with this by calling memory_region_allocate_system_memory() 3309ad6438SPeter Maydell * once to get a MemoryRegion with enough RAM for both parts, and then 3409ad6438SPeter Maydell * creating alias MemoryRegions via memory_region_init_alias() which 3509ad6438SPeter Maydell * alias into different parts of the RAM MemoryRegion and can be mapped 3609ad6438SPeter Maydell * into the memory map in the appropriate places. 3709ad6438SPeter Maydell * 3809ad6438SPeter Maydell * Smaller pieces of memory (display RAM, static RAMs, etc) don't need 3909ad6438SPeter Maydell * to be backed via the -mem-path memory backend and can simply 405bd366b4SPeter Maydell * be created via memory_region_init_ram(). 4109ad6438SPeter Maydell */ 42dfabb8b9SPaolo Bonzini void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner, 43dfabb8b9SPaolo Bonzini const char *name, 44dfabb8b9SPaolo Bonzini uint64_t ram_size); 45dfabb8b9SPaolo Bonzini 46dfabb8b9SPaolo Bonzini #define TYPE_MACHINE_SUFFIX "-machine" 47c84a8f01SEduardo Habkost 48c84a8f01SEduardo Habkost /* Machine class name that needs to be used for class-name-based machine 49c84a8f01SEduardo Habkost * type lookup to work. 50c84a8f01SEduardo Habkost */ 51c84a8f01SEduardo Habkost #define MACHINE_TYPE_NAME(machinename) (machinename TYPE_MACHINE_SUFFIX) 52c84a8f01SEduardo Habkost 5336d20cb2SMarcel Apfelbaum #define TYPE_MACHINE "machine" 54c8897e8eSMarcel Apfelbaum #undef MACHINE /* BSD defines it and QEMU does not use it */ 5536d20cb2SMarcel Apfelbaum #define MACHINE(obj) \ 5636d20cb2SMarcel Apfelbaum OBJECT_CHECK(MachineState, (obj), TYPE_MACHINE) 5736d20cb2SMarcel Apfelbaum #define MACHINE_GET_CLASS(obj) \ 5836d20cb2SMarcel Apfelbaum OBJECT_GET_CLASS(MachineClass, (obj), TYPE_MACHINE) 5936d20cb2SMarcel Apfelbaum #define MACHINE_CLASS(klass) \ 6036d20cb2SMarcel Apfelbaum OBJECT_CLASS_CHECK(MachineClass, (klass), TYPE_MACHINE) 6136d20cb2SMarcel Apfelbaum 620056ae24SMarcel Apfelbaum extern MachineState *current_machine; 630056ae24SMarcel Apfelbaum 64482dfe9aSIgor Mammedov void machine_run_board_init(MachineState *machine); 655e97b623SMarcel Apfelbaum bool machine_usb(MachineState *machine); 66d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_allowed(MachineState *machine); 67d8870d02SMarcel Apfelbaum bool machine_kernel_irqchip_required(MachineState *machine); 6832c18a2dSMatt Gingell bool machine_kernel_irqchip_split(MachineState *machine); 694689b77bSMarcel Apfelbaum int machine_kvm_shadow_mem(MachineState *machine); 706cabe7faSMarcel Apfelbaum int machine_phandle_start(MachineState *machine); 7147c8ca53SMarcel Apfelbaum bool machine_dump_guest_core(MachineState *machine); 7275cc7f01SMarcel Apfelbaum bool machine_mem_merge(MachineState *machine); 73f2d672c2SIgor Mammedov HotpluggableCPUList *machine_query_hotpluggable_cpus(MachineState *machine); 747c88e65dSIgor Mammedov void machine_set_cpu_numa_node(MachineState *machine, 757c88e65dSIgor Mammedov const CpuInstanceProperties *props, 767c88e65dSIgor Mammedov Error **errp); 775e97b623SMarcel Apfelbaum 780bd1909dSEduardo Habkost void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type); 790bd1909dSEduardo Habkost 800bd1909dSEduardo Habkost 8136d20cb2SMarcel Apfelbaum /** 823811ef14SIgor Mammedov * CPUArchId: 833811ef14SIgor Mammedov * @arch_id - architecture-dependent CPU ID of present or possible CPU 843811ef14SIgor Mammedov * @cpu - pointer to corresponding CPU object if it's present on NULL otherwise 85d342eb76SIgor Mammedov * @type - QOM class name of possible @cpu object 86c67ae933SIgor Mammedov * @props - CPU object properties, initialized by board 87f2d672c2SIgor Mammedov * #vcpus_count - number of threads provided by @cpu object 883811ef14SIgor Mammedov */ 89*a44432b4SMarkus Armbruster typedef struct CPUArchId { 903811ef14SIgor Mammedov uint64_t arch_id; 91f2d672c2SIgor Mammedov int64_t vcpus_count; 92c67ae933SIgor Mammedov CpuInstanceProperties props; 938aba3842SIgor Mammedov Object *cpu; 94d342eb76SIgor Mammedov const char *type; 953811ef14SIgor Mammedov } CPUArchId; 963811ef14SIgor Mammedov 973811ef14SIgor Mammedov /** 983811ef14SIgor Mammedov * CPUArchIdList: 993811ef14SIgor Mammedov * @len - number of @CPUArchId items in @cpus array 1003811ef14SIgor Mammedov * @cpus - array of present or possible CPUs for current machine configuration 1013811ef14SIgor Mammedov */ 1023811ef14SIgor Mammedov typedef struct { 1033811ef14SIgor Mammedov int len; 1043811ef14SIgor Mammedov CPUArchId cpus[0]; 1053811ef14SIgor Mammedov } CPUArchIdList; 1063811ef14SIgor Mammedov 1073811ef14SIgor Mammedov /** 10836d20cb2SMarcel Apfelbaum * MachineClass: 10908fe6824SThomas Huth * @deprecation_reason: If set, the machine is marked as deprecated. The 11008fe6824SThomas Huth * string should provide some clear information about what to use instead. 11172649619SEmilio G. Cota * @max_cpus: maximum number of CPUs supported. Default: 1 11272649619SEmilio G. Cota * @min_cpus: minimum number of CPUs supported. Default: 1 11372649619SEmilio G. Cota * @default_cpus: number of CPUs instantiated if none are specified. Default: 1 114b7454548SIgor Mammedov * @get_hotplug_handler: this function is called during bus-less 115b7454548SIgor Mammedov * device hotplug. If defined it returns pointer to an instance 116b7454548SIgor Mammedov * of HotplugHandler object, which handles hotplug operation 117b7454548SIgor Mammedov * for a given @dev. It may return NULL if @dev doesn't require 118b7454548SIgor Mammedov * any actions to be performed by hotplug handler. 119ea089eebSIgor Mammedov * @cpu_index_to_instance_props: 120ea089eebSIgor Mammedov * used to provide @cpu_index to socket/core/thread number mapping, allowing 121ea089eebSIgor Mammedov * legacy code to perform maping from cpu_index to topology properties 122ea089eebSIgor Mammedov * Returns: tuple of socket/core/thread ids given cpu_index belongs to. 12357924bcdSIgor Mammedov * used to provide @cpu_index to socket number mapping, allowing 12457924bcdSIgor Mammedov * a machine to group CPU threads belonging to the same socket/package 12557924bcdSIgor Mammedov * Returns: socket number given cpu_index belongs to. 126fac862ffSEduardo Habkost * @hw_version: 127fac862ffSEduardo Habkost * Value of QEMU_VERSION when the machine was added to QEMU. 128fac862ffSEduardo Habkost * Set only by old machines because they need to keep 129fac862ffSEduardo Habkost * compatibility on code that exposed QEMU_VERSION to guests in 130fac862ffSEduardo Habkost * the past (and now use qemu_hw_version()). 1313811ef14SIgor Mammedov * @possible_cpu_arch_ids: 1323811ef14SIgor Mammedov * Returns an array of @CPUArchId architecture-dependent CPU IDs 1333811ef14SIgor Mammedov * which includes CPU IDs for present and possible to hotplug CPUs. 1343811ef14SIgor Mammedov * Caller is responsible for freeing returned list. 13579e07936SIgor Mammedov * @get_default_cpu_node_id: 13679e07936SIgor Mammedov * returns default board specific node_id value for CPU slot specified by 13779e07936SIgor Mammedov * index @idx in @ms->possible_cpus[] 138c5514d0eSIgor Mammedov * @has_hotpluggable_cpus: 139c5514d0eSIgor Mammedov * If true, board supports CPUs creation with -device/device_add. 1406063d4c0SIgor Mammedov * @default_cpu_type: 1416063d4c0SIgor Mammedov * specifies default CPU_TYPE, which will be used for parsing target 1426063d4c0SIgor Mammedov * specific features and for creating CPUs if CPU name wasn't provided 1436063d4c0SIgor Mammedov * explicitly at CLI 14420bccb82SPeter Maydell * @minimum_page_bits: 14520bccb82SPeter Maydell * If non-zero, the board promises never to create a CPU with a page size 14620bccb82SPeter Maydell * smaller than this, so QEMU can use a more efficient larger page 14720bccb82SPeter Maydell * size than the target architecture's minimum. (Attempting to create 14820bccb82SPeter Maydell * such a CPU will fail.) Note that changing this is a migration 14920bccb82SPeter Maydell * compatibility break for the machine. 150ed860129SPeter Maydell * @ignore_memory_transaction_failures: 151ed860129SPeter Maydell * If this is flag is true then the CPU will ignore memory transaction 152ed860129SPeter Maydell * failures which should cause the CPU to take an exception due to an 153ed860129SPeter Maydell * access to an unassigned physical address; the transaction will instead 154ed860129SPeter Maydell * return zero (for a read) or be ignored (for a write). This should be 155ed860129SPeter Maydell * set only by legacy board models which rely on the old RAZ/WI behaviour 156ed860129SPeter Maydell * for handling devices that QEMU does not yet model. New board models 157ed860129SPeter Maydell * should instead use "unimplemented-device" for all memory ranges where 158ed860129SPeter Maydell * the guest will attempt to probe for a device that QEMU doesn't 159ed860129SPeter Maydell * implement and a stub device is required. 160dc0ca80eSEric Auger * @kvm_type: 161dc0ca80eSEric Auger * Return the type of KVM corresponding to the kvm-type string option or 162dc0ca80eSEric Auger * computed based on other criteria such as the host kernel capabilities. 163cd5ff833SIgor Mammedov * @numa_mem_supported: 164cd5ff833SIgor Mammedov * true if '--numa node.mem' option is supported and false otherwise 1656f479566SLike Xu * @smp_parse: 1666f479566SLike Xu * The function pointer to hook different machine specific functions for 1676f479566SLike Xu * parsing "smp-opts" from QemuOpts to MachineState::CpuTopology and more 1686f479566SLike Xu * machine specific topology fields, such as smp_dies for PCMachine. 16936d20cb2SMarcel Apfelbaum */ 17036d20cb2SMarcel Apfelbaum struct MachineClass { 17136d20cb2SMarcel Apfelbaum /*< private >*/ 17236d20cb2SMarcel Apfelbaum ObjectClass parent_class; 17336d20cb2SMarcel Apfelbaum /*< public >*/ 17436d20cb2SMarcel Apfelbaum 1752709f263SLaszlo Ersek const char *family; /* NULL iff @name identifies a standalone machtype */ 1768ea75371SMarc-André Lureau char *name; 17700b4fbe2SMarcel Apfelbaum const char *alias; 17800b4fbe2SMarcel Apfelbaum const char *desc; 17908fe6824SThomas Huth const char *deprecation_reason; 18000b4fbe2SMarcel Apfelbaum 1813ef96221SMarcel Apfelbaum void (*init)(MachineState *state); 182a0628599SLike Xu void (*reset)(MachineState *state); 183a0628599SLike Xu void (*hot_add_cpu)(MachineState *state, const int64_t id, Error **errp); 184dc0ca80eSEric Auger int (*kvm_type)(MachineState *machine, const char *arg); 1856f479566SLike Xu void (*smp_parse)(MachineState *ms, QemuOpts *opts); 18600b4fbe2SMarcel Apfelbaum 18700b4fbe2SMarcel Apfelbaum BlockInterfaceType block_default_type; 18816026518SJohn Snow int units_per_default_bus; 18900b4fbe2SMarcel Apfelbaum int max_cpus; 19072649619SEmilio G. Cota int min_cpus; 19172649619SEmilio G. Cota int default_cpus; 19200b4fbe2SMarcel Apfelbaum unsigned int no_serial:1, 19300b4fbe2SMarcel Apfelbaum no_parallel:1, 19400b4fbe2SMarcel Apfelbaum no_floppy:1, 19500b4fbe2SMarcel Apfelbaum no_cdrom:1, 19633cd52b5SAlexander Graf no_sdcard:1, 197bab47d9aSGerd Hoffmann pci_allow_0_address:1, 198bab47d9aSGerd Hoffmann legacy_fw_cfg_order:1; 19900b4fbe2SMarcel Apfelbaum int is_default; 20000b4fbe2SMarcel Apfelbaum const char *default_machine_opts; 20100b4fbe2SMarcel Apfelbaum const char *default_boot_order; 2026f00494aSGerd Hoffmann const char *default_display; 203b66bbee3SMarc-André Lureau GPtrArray *compat_props; 20400b4fbe2SMarcel Apfelbaum const char *hw_version; 205076b35b5SNikunj A Dadhania ram_addr_t default_ram_size; 2066063d4c0SIgor Mammedov const char *default_cpu_type; 207b2fc91dbSPeter Xu bool default_kernel_irqchip_split; 20871ae9e94SEduardo Habkost bool option_rom_has_mr; 20971ae9e94SEduardo Habkost bool rom_file_has_mr; 21020bccb82SPeter Maydell int minimum_page_bits; 211c5514d0eSIgor Mammedov bool has_hotpluggable_cpus; 212ed860129SPeter Maydell bool ignore_memory_transaction_failures; 21355641213SLaurent Vivier int numa_mem_align_shift; 214c9cf636dSAlistair Francis const char **valid_cpu_types; 2150bd1909dSEduardo Habkost strList *allowed_dynamic_sysbus_devices; 2167b8be49dSDou Liyang bool auto_enable_numa_with_memhp; 2173bfe5716SLaurent Vivier void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes, 2183bfe5716SLaurent Vivier int nb_nodes, ram_addr_t size); 219907aac2fSMark Cave-Ayland bool ignore_boot_device_suffixes; 2207fccf2a0SCorey Minyard bool smbus_no_migration_support; 221f6a0d06bSEric Auger bool nvdimm_supported; 222cd5ff833SIgor Mammedov bool numa_mem_supported; 223b7454548SIgor Mammedov 224b7454548SIgor Mammedov HotplugHandler *(*get_hotplug_handler)(MachineState *machine, 225b7454548SIgor Mammedov DeviceState *dev); 226ea089eebSIgor Mammedov CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine, 227ea089eebSIgor Mammedov unsigned cpu_index); 22880e5db30SIgor Mammedov const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine); 22979e07936SIgor Mammedov int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx); 23036d20cb2SMarcel Apfelbaum }; 23136d20cb2SMarcel Apfelbaum 23236d20cb2SMarcel Apfelbaum /** 233e017da37SDavid Hildenbrand * DeviceMemoryState: 234b0c14ec4SDavid Hildenbrand * @base: address in guest physical address space where the memory 235b0c14ec4SDavid Hildenbrand * address space for memory devices starts 236b0c14ec4SDavid Hildenbrand * @mr: address space container for memory devices 237b0c14ec4SDavid Hildenbrand */ 238e017da37SDavid Hildenbrand typedef struct DeviceMemoryState { 239b0c14ec4SDavid Hildenbrand hwaddr base; 240b0c14ec4SDavid Hildenbrand MemoryRegion mr; 241e017da37SDavid Hildenbrand } DeviceMemoryState; 242b0c14ec4SDavid Hildenbrand 243b0c14ec4SDavid Hildenbrand /** 244edeeec91SLike Xu * CpuTopology: 245edeeec91SLike Xu * @cpus: the number of present logical processors on the machine 246edeeec91SLike Xu * @cores: the number of cores in one package 247edeeec91SLike Xu * @threads: the number of threads in one core 248edeeec91SLike Xu * @max_cpus: the maximum number of logical processors on the machine 249edeeec91SLike Xu */ 250edeeec91SLike Xu typedef struct CpuTopology { 251edeeec91SLike Xu unsigned int cpus; 252edeeec91SLike Xu unsigned int cores; 253edeeec91SLike Xu unsigned int threads; 254edeeec91SLike Xu unsigned int max_cpus; 255edeeec91SLike Xu } CpuTopology; 256edeeec91SLike Xu 257edeeec91SLike Xu /** 25836d20cb2SMarcel Apfelbaum * MachineState: 25936d20cb2SMarcel Apfelbaum */ 26036d20cb2SMarcel Apfelbaum struct MachineState { 26136d20cb2SMarcel Apfelbaum /*< private >*/ 26236d20cb2SMarcel Apfelbaum Object parent_obj; 26333cd52b5SAlexander Graf Notifier sysbus_notifier; 26433cd52b5SAlexander Graf 26536d20cb2SMarcel Apfelbaum /*< public >*/ 26636d20cb2SMarcel Apfelbaum 26736d20cb2SMarcel Apfelbaum char *accel; 268d8870d02SMarcel Apfelbaum bool kernel_irqchip_allowed; 269d8870d02SMarcel Apfelbaum bool kernel_irqchip_required; 27032c18a2dSMatt Gingell bool kernel_irqchip_split; 27136d20cb2SMarcel Apfelbaum int kvm_shadow_mem; 27236d20cb2SMarcel Apfelbaum char *dtb; 27336d20cb2SMarcel Apfelbaum char *dumpdtb; 27436d20cb2SMarcel Apfelbaum int phandle_start; 27536d20cb2SMarcel Apfelbaum char *dt_compatible; 27636d20cb2SMarcel Apfelbaum bool dump_guest_core; 27736d20cb2SMarcel Apfelbaum bool mem_merge; 27836d20cb2SMarcel Apfelbaum bool usb; 279c6e76503SPaolo Bonzini bool usb_disabled; 28079814179STiejun Chen bool igd_gfx_passthru; 28136d20cb2SMarcel Apfelbaum char *firmware; 282a52a7fdfSLe Tan bool iommu; 2839850c604SAlexander Graf bool suppress_vmdesc; 284902c053dSGreg Kurz bool enforce_config_section; 285cfc58cf3SEduardo Habkost bool enable_graphics; 286db588194SBrijesh Singh char *memory_encryption; 287e017da37SDavid Hildenbrand DeviceMemoryState *device_memory; 28836d20cb2SMarcel Apfelbaum 2893ef96221SMarcel Apfelbaum ram_addr_t ram_size; 290c270fb9eSIgor Mammedov ram_addr_t maxram_size; 291c270fb9eSIgor Mammedov uint64_t ram_slots; 2923ef96221SMarcel Apfelbaum const char *boot_order; 2936b1b1440SMarcel Apfelbaum char *kernel_filename; 2946b1b1440SMarcel Apfelbaum char *kernel_cmdline; 2956b1b1440SMarcel Apfelbaum char *initrd_filename; 2966063d4c0SIgor Mammedov const char *cpu_type; 297ac2da55eSEduardo Habkost AccelState *accelerator; 29838690a1cSIgor Mammedov CPUArchIdList *possible_cpus; 299edeeec91SLike Xu CpuTopology smp; 300f6a0d06bSEric Auger struct NVDIMMState *nvdimms_state; 30136d20cb2SMarcel Apfelbaum }; 30236d20cb2SMarcel Apfelbaum 303ed0b6de3SEduardo Habkost #define DEFINE_MACHINE(namestr, machine_initfn) \ 304ed0b6de3SEduardo Habkost static void machine_initfn##_class_init(ObjectClass *oc, void *data) \ 305ed0b6de3SEduardo Habkost { \ 306ed0b6de3SEduardo Habkost MachineClass *mc = MACHINE_CLASS(oc); \ 307ed0b6de3SEduardo Habkost machine_initfn(mc); \ 308ed0b6de3SEduardo Habkost } \ 309ed0b6de3SEduardo Habkost static const TypeInfo machine_initfn##_typeinfo = { \ 310ed0b6de3SEduardo Habkost .name = MACHINE_TYPE_NAME(namestr), \ 311ed0b6de3SEduardo Habkost .parent = TYPE_MACHINE, \ 312ed0b6de3SEduardo Habkost .class_init = machine_initfn##_class_init, \ 313ed0b6de3SEduardo Habkost }; \ 314ed0b6de3SEduardo Habkost static void machine_initfn##_register_types(void) \ 315ed0b6de3SEduardo Habkost { \ 316ed0b6de3SEduardo Habkost type_register_static(&machine_initfn##_typeinfo); \ 317ed0b6de3SEduardo Habkost } \ 3180e6aac87SEduardo Habkost type_init(machine_initfn##_register_types) 319ed0b6de3SEduardo Habkost 3209bf2650bSCornelia Huck extern GlobalProperty hw_compat_4_0[]; 3219bf2650bSCornelia Huck extern const size_t hw_compat_4_0_len; 3229bf2650bSCornelia Huck 323abd93cc7SMarc-André Lureau extern GlobalProperty hw_compat_3_1[]; 324abd93cc7SMarc-André Lureau extern const size_t hw_compat_3_1_len; 325abd93cc7SMarc-André Lureau 326ddb3235dSMarc-André Lureau extern GlobalProperty hw_compat_3_0[]; 327ddb3235dSMarc-André Lureau extern const size_t hw_compat_3_0_len; 328ddb3235dSMarc-André Lureau 3290d47310bSMarc-André Lureau extern GlobalProperty hw_compat_2_12[]; 3300d47310bSMarc-André Lureau extern const size_t hw_compat_2_12_len; 3310d47310bSMarc-André Lureau 33243df70a9SMarc-André Lureau extern GlobalProperty hw_compat_2_11[]; 33343df70a9SMarc-André Lureau extern const size_t hw_compat_2_11_len; 33443df70a9SMarc-André Lureau 335503224f4SMarc-André Lureau extern GlobalProperty hw_compat_2_10[]; 336503224f4SMarc-André Lureau extern const size_t hw_compat_2_10_len; 337503224f4SMarc-André Lureau 3383e803152SMarc-André Lureau extern GlobalProperty hw_compat_2_9[]; 3393e803152SMarc-André Lureau extern const size_t hw_compat_2_9_len; 3403e803152SMarc-André Lureau 341edc24ccdSMarc-André Lureau extern GlobalProperty hw_compat_2_8[]; 342edc24ccdSMarc-André Lureau extern const size_t hw_compat_2_8_len; 343edc24ccdSMarc-André Lureau 3445a995064SMarc-André Lureau extern GlobalProperty hw_compat_2_7[]; 3455a995064SMarc-André Lureau extern const size_t hw_compat_2_7_len; 3465a995064SMarc-André Lureau 347ff8f261fSMarc-André Lureau extern GlobalProperty hw_compat_2_6[]; 348ff8f261fSMarc-André Lureau extern const size_t hw_compat_2_6_len; 349ff8f261fSMarc-André Lureau 350fe759610SMarc-André Lureau extern GlobalProperty hw_compat_2_5[]; 351fe759610SMarc-André Lureau extern const size_t hw_compat_2_5_len; 352fe759610SMarc-André Lureau 3532f99b9c2SMarc-André Lureau extern GlobalProperty hw_compat_2_4[]; 3542f99b9c2SMarc-André Lureau extern const size_t hw_compat_2_4_len; 3552f99b9c2SMarc-André Lureau 3568995dd90SMarc-André Lureau extern GlobalProperty hw_compat_2_3[]; 3578995dd90SMarc-André Lureau extern const size_t hw_compat_2_3_len; 3588995dd90SMarc-André Lureau 3591c30044eSMarc-André Lureau extern GlobalProperty hw_compat_2_2[]; 3601c30044eSMarc-André Lureau extern const size_t hw_compat_2_2_len; 3611c30044eSMarc-André Lureau 362c4fc5695SMarc-André Lureau extern GlobalProperty hw_compat_2_1[]; 363c4fc5695SMarc-André Lureau extern const size_t hw_compat_2_1_len; 364c4fc5695SMarc-André Lureau 3650d09e41aSPaolo Bonzini #endif 366