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" 122e5b09fdSMarkus Armbruster #include "hw/core/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 */ 89a44432b4SMarkus 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. 169d2321d31SPeter Xu * @hotplug_allowed: 170d2321d31SPeter Xu * If the hook is provided, then it'll be called for each device 171d2321d31SPeter Xu * hotplug to check whether the device hotplug is allowed. Return 172d2321d31SPeter Xu * true to grant allowance or false to reject the hotplug. When 173d2321d31SPeter Xu * false is returned, an error must be set to show the reason of 174d2321d31SPeter Xu * the rejection. If the hook is not provided, all hotplug will be 175d2321d31SPeter Xu * allowed. 17636d20cb2SMarcel Apfelbaum */ 17736d20cb2SMarcel Apfelbaum struct MachineClass { 17836d20cb2SMarcel Apfelbaum /*< private >*/ 17936d20cb2SMarcel Apfelbaum ObjectClass parent_class; 18036d20cb2SMarcel Apfelbaum /*< public >*/ 18136d20cb2SMarcel Apfelbaum 1822709f263SLaszlo Ersek const char *family; /* NULL iff @name identifies a standalone machtype */ 1838ea75371SMarc-André Lureau char *name; 18400b4fbe2SMarcel Apfelbaum const char *alias; 18500b4fbe2SMarcel Apfelbaum const char *desc; 18608fe6824SThomas Huth const char *deprecation_reason; 18700b4fbe2SMarcel Apfelbaum 1883ef96221SMarcel Apfelbaum void (*init)(MachineState *state); 189a0628599SLike Xu void (*reset)(MachineState *state); 1904b5e06c9SNicholas Piggin void (*wakeup)(MachineState *state); 191a0628599SLike Xu void (*hot_add_cpu)(MachineState *state, const int64_t id, Error **errp); 192dc0ca80eSEric Auger int (*kvm_type)(MachineState *machine, const char *arg); 1936f479566SLike Xu void (*smp_parse)(MachineState *ms, QemuOpts *opts); 19400b4fbe2SMarcel Apfelbaum 19500b4fbe2SMarcel Apfelbaum BlockInterfaceType block_default_type; 19616026518SJohn Snow int units_per_default_bus; 19700b4fbe2SMarcel Apfelbaum int max_cpus; 19872649619SEmilio G. Cota int min_cpus; 19972649619SEmilio G. Cota int default_cpus; 20000b4fbe2SMarcel Apfelbaum unsigned int no_serial:1, 20100b4fbe2SMarcel Apfelbaum no_parallel:1, 20200b4fbe2SMarcel Apfelbaum no_floppy:1, 20300b4fbe2SMarcel Apfelbaum no_cdrom:1, 20433cd52b5SAlexander Graf no_sdcard:1, 205bab47d9aSGerd Hoffmann pci_allow_0_address:1, 206bab47d9aSGerd Hoffmann legacy_fw_cfg_order:1; 20700b4fbe2SMarcel Apfelbaum int is_default; 20800b4fbe2SMarcel Apfelbaum const char *default_machine_opts; 20900b4fbe2SMarcel Apfelbaum const char *default_boot_order; 2106f00494aSGerd Hoffmann const char *default_display; 211b66bbee3SMarc-André Lureau GPtrArray *compat_props; 21200b4fbe2SMarcel Apfelbaum const char *hw_version; 213076b35b5SNikunj A Dadhania ram_addr_t default_ram_size; 2146063d4c0SIgor Mammedov const char *default_cpu_type; 215b2fc91dbSPeter Xu bool default_kernel_irqchip_split; 21671ae9e94SEduardo Habkost bool option_rom_has_mr; 21771ae9e94SEduardo Habkost bool rom_file_has_mr; 21820bccb82SPeter Maydell int minimum_page_bits; 219c5514d0eSIgor Mammedov bool has_hotpluggable_cpus; 220ed860129SPeter Maydell bool ignore_memory_transaction_failures; 22155641213SLaurent Vivier int numa_mem_align_shift; 222c9cf636dSAlistair Francis const char **valid_cpu_types; 2230bd1909dSEduardo Habkost strList *allowed_dynamic_sysbus_devices; 2247b8be49dSDou Liyang bool auto_enable_numa_with_memhp; 2253bfe5716SLaurent Vivier void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes, 2263bfe5716SLaurent Vivier int nb_nodes, ram_addr_t size); 227907aac2fSMark Cave-Ayland bool ignore_boot_device_suffixes; 2287fccf2a0SCorey Minyard bool smbus_no_migration_support; 229f6a0d06bSEric Auger bool nvdimm_supported; 230cd5ff833SIgor Mammedov bool numa_mem_supported; 2310533ef5fSTao Xu bool auto_enable_numa; 232b7454548SIgor Mammedov 233b7454548SIgor Mammedov HotplugHandler *(*get_hotplug_handler)(MachineState *machine, 234b7454548SIgor Mammedov DeviceState *dev); 235d2321d31SPeter Xu bool (*hotplug_allowed)(MachineState *state, DeviceState *dev, 236d2321d31SPeter Xu Error **errp); 237ea089eebSIgor Mammedov CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine, 238ea089eebSIgor Mammedov unsigned cpu_index); 23980e5db30SIgor Mammedov const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine); 24079e07936SIgor Mammedov int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx); 24136d20cb2SMarcel Apfelbaum }; 24236d20cb2SMarcel Apfelbaum 24336d20cb2SMarcel Apfelbaum /** 244e017da37SDavid Hildenbrand * DeviceMemoryState: 245b0c14ec4SDavid Hildenbrand * @base: address in guest physical address space where the memory 246b0c14ec4SDavid Hildenbrand * address space for memory devices starts 247b0c14ec4SDavid Hildenbrand * @mr: address space container for memory devices 248b0c14ec4SDavid Hildenbrand */ 249e017da37SDavid Hildenbrand typedef struct DeviceMemoryState { 250b0c14ec4SDavid Hildenbrand hwaddr base; 251b0c14ec4SDavid Hildenbrand MemoryRegion mr; 252e017da37SDavid Hildenbrand } DeviceMemoryState; 253b0c14ec4SDavid Hildenbrand 254b0c14ec4SDavid Hildenbrand /** 255edeeec91SLike Xu * CpuTopology: 256edeeec91SLike Xu * @cpus: the number of present logical processors on the machine 257edeeec91SLike Xu * @cores: the number of cores in one package 258edeeec91SLike Xu * @threads: the number of threads in one core 259edeeec91SLike Xu * @max_cpus: the maximum number of logical processors on the machine 260edeeec91SLike Xu */ 261edeeec91SLike Xu typedef struct CpuTopology { 262edeeec91SLike Xu unsigned int cpus; 263edeeec91SLike Xu unsigned int cores; 264edeeec91SLike Xu unsigned int threads; 265edeeec91SLike Xu unsigned int max_cpus; 266edeeec91SLike Xu } CpuTopology; 267edeeec91SLike Xu 268edeeec91SLike Xu /** 26936d20cb2SMarcel Apfelbaum * MachineState: 27036d20cb2SMarcel Apfelbaum */ 27136d20cb2SMarcel Apfelbaum struct MachineState { 27236d20cb2SMarcel Apfelbaum /*< private >*/ 27336d20cb2SMarcel Apfelbaum Object parent_obj; 27433cd52b5SAlexander Graf Notifier sysbus_notifier; 27533cd52b5SAlexander Graf 27636d20cb2SMarcel Apfelbaum /*< public >*/ 27736d20cb2SMarcel Apfelbaum 27836d20cb2SMarcel Apfelbaum char *accel; 279d8870d02SMarcel Apfelbaum bool kernel_irqchip_allowed; 280d8870d02SMarcel Apfelbaum bool kernel_irqchip_required; 28132c18a2dSMatt Gingell bool kernel_irqchip_split; 28236d20cb2SMarcel Apfelbaum int kvm_shadow_mem; 28336d20cb2SMarcel Apfelbaum char *dtb; 28436d20cb2SMarcel Apfelbaum char *dumpdtb; 28536d20cb2SMarcel Apfelbaum int phandle_start; 28636d20cb2SMarcel Apfelbaum char *dt_compatible; 28736d20cb2SMarcel Apfelbaum bool dump_guest_core; 28836d20cb2SMarcel Apfelbaum bool mem_merge; 28936d20cb2SMarcel Apfelbaum bool usb; 290c6e76503SPaolo Bonzini bool usb_disabled; 29179814179STiejun Chen bool igd_gfx_passthru; 29236d20cb2SMarcel Apfelbaum char *firmware; 293a52a7fdfSLe Tan bool iommu; 2949850c604SAlexander Graf bool suppress_vmdesc; 295902c053dSGreg Kurz bool enforce_config_section; 296cfc58cf3SEduardo Habkost bool enable_graphics; 297db588194SBrijesh Singh char *memory_encryption; 298e017da37SDavid Hildenbrand DeviceMemoryState *device_memory; 29936d20cb2SMarcel Apfelbaum 3003ef96221SMarcel Apfelbaum ram_addr_t ram_size; 301c270fb9eSIgor Mammedov ram_addr_t maxram_size; 302c270fb9eSIgor Mammedov uint64_t ram_slots; 3033ef96221SMarcel Apfelbaum const char *boot_order; 3046b1b1440SMarcel Apfelbaum char *kernel_filename; 3056b1b1440SMarcel Apfelbaum char *kernel_cmdline; 3066b1b1440SMarcel Apfelbaum char *initrd_filename; 3076063d4c0SIgor Mammedov const char *cpu_type; 308ac2da55eSEduardo Habkost AccelState *accelerator; 30938690a1cSIgor Mammedov CPUArchIdList *possible_cpus; 310edeeec91SLike Xu CpuTopology smp; 311f6a0d06bSEric Auger struct NVDIMMState *nvdimms_state; 312aa570207STao Xu struct NumaState *numa_state; 31336d20cb2SMarcel Apfelbaum }; 31436d20cb2SMarcel Apfelbaum 315ed0b6de3SEduardo Habkost #define DEFINE_MACHINE(namestr, machine_initfn) \ 316ed0b6de3SEduardo Habkost static void machine_initfn##_class_init(ObjectClass *oc, void *data) \ 317ed0b6de3SEduardo Habkost { \ 318ed0b6de3SEduardo Habkost MachineClass *mc = MACHINE_CLASS(oc); \ 319ed0b6de3SEduardo Habkost machine_initfn(mc); \ 320ed0b6de3SEduardo Habkost } \ 321ed0b6de3SEduardo Habkost static const TypeInfo machine_initfn##_typeinfo = { \ 322ed0b6de3SEduardo Habkost .name = MACHINE_TYPE_NAME(namestr), \ 323ed0b6de3SEduardo Habkost .parent = TYPE_MACHINE, \ 324ed0b6de3SEduardo Habkost .class_init = machine_initfn##_class_init, \ 325ed0b6de3SEduardo Habkost }; \ 326ed0b6de3SEduardo Habkost static void machine_initfn##_register_types(void) \ 327ed0b6de3SEduardo Habkost { \ 328ed0b6de3SEduardo Habkost type_register_static(&machine_initfn##_typeinfo); \ 329ed0b6de3SEduardo Habkost } \ 3300e6aac87SEduardo Habkost type_init(machine_initfn##_register_types) 331ed0b6de3SEduardo Habkost 332*5f258577SEvgeny Yakovlev extern GlobalProperty hw_compat_4_2[]; 333*5f258577SEvgeny Yakovlev extern const size_t hw_compat_4_2_len; 334*5f258577SEvgeny Yakovlev 3359aec2e52SCornelia Huck extern GlobalProperty hw_compat_4_1[]; 3369aec2e52SCornelia Huck extern const size_t hw_compat_4_1_len; 3379aec2e52SCornelia Huck 3389bf2650bSCornelia Huck extern GlobalProperty hw_compat_4_0[]; 3399bf2650bSCornelia Huck extern const size_t hw_compat_4_0_len; 3409bf2650bSCornelia Huck 341abd93cc7SMarc-André Lureau extern GlobalProperty hw_compat_3_1[]; 342abd93cc7SMarc-André Lureau extern const size_t hw_compat_3_1_len; 343abd93cc7SMarc-André Lureau 344ddb3235dSMarc-André Lureau extern GlobalProperty hw_compat_3_0[]; 345ddb3235dSMarc-André Lureau extern const size_t hw_compat_3_0_len; 346ddb3235dSMarc-André Lureau 3470d47310bSMarc-André Lureau extern GlobalProperty hw_compat_2_12[]; 3480d47310bSMarc-André Lureau extern const size_t hw_compat_2_12_len; 3490d47310bSMarc-André Lureau 35043df70a9SMarc-André Lureau extern GlobalProperty hw_compat_2_11[]; 35143df70a9SMarc-André Lureau extern const size_t hw_compat_2_11_len; 35243df70a9SMarc-André Lureau 353503224f4SMarc-André Lureau extern GlobalProperty hw_compat_2_10[]; 354503224f4SMarc-André Lureau extern const size_t hw_compat_2_10_len; 355503224f4SMarc-André Lureau 3563e803152SMarc-André Lureau extern GlobalProperty hw_compat_2_9[]; 3573e803152SMarc-André Lureau extern const size_t hw_compat_2_9_len; 3583e803152SMarc-André Lureau 359edc24ccdSMarc-André Lureau extern GlobalProperty hw_compat_2_8[]; 360edc24ccdSMarc-André Lureau extern const size_t hw_compat_2_8_len; 361edc24ccdSMarc-André Lureau 3625a995064SMarc-André Lureau extern GlobalProperty hw_compat_2_7[]; 3635a995064SMarc-André Lureau extern const size_t hw_compat_2_7_len; 3645a995064SMarc-André Lureau 365ff8f261fSMarc-André Lureau extern GlobalProperty hw_compat_2_6[]; 366ff8f261fSMarc-André Lureau extern const size_t hw_compat_2_6_len; 367ff8f261fSMarc-André Lureau 368fe759610SMarc-André Lureau extern GlobalProperty hw_compat_2_5[]; 369fe759610SMarc-André Lureau extern const size_t hw_compat_2_5_len; 370fe759610SMarc-André Lureau 3712f99b9c2SMarc-André Lureau extern GlobalProperty hw_compat_2_4[]; 3722f99b9c2SMarc-André Lureau extern const size_t hw_compat_2_4_len; 3732f99b9c2SMarc-André Lureau 3748995dd90SMarc-André Lureau extern GlobalProperty hw_compat_2_3[]; 3758995dd90SMarc-André Lureau extern const size_t hw_compat_2_3_len; 3768995dd90SMarc-André Lureau 3771c30044eSMarc-André Lureau extern GlobalProperty hw_compat_2_2[]; 3781c30044eSMarc-André Lureau extern const size_t hw_compat_2_2_len; 3791c30044eSMarc-André Lureau 380c4fc5695SMarc-André Lureau extern GlobalProperty hw_compat_2_1[]; 381c4fc5695SMarc-André Lureau extern const size_t hw_compat_2_1_len; 382c4fc5695SMarc-André Lureau 3830d09e41aSPaolo Bonzini #endif 384