mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
virtio,pc,acpi fixes, cleanups
Mostly cleanups, notably Eduardo's compat code rework, and smbios rearrangement for use by ARM. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVzIaUAAoJECgfDbjSjVRpnR4IAK8rXJYmByh4haqhHnDCVSTR EHmYyZrMHFAVLw4o5iu62a8Fe8De4JlwLIK5N/nM68ct0eVJkP1NbWRSQGTq5bbc LNOElWunxChvSiF/6ZbyuLkIUN69L+S3bGf8vnB8TvxS4h2PLpswdsw7fOuBR1zB S1fa6Me4iR/O8qss5HlchAf6Ugske8bWlrr2uh+UFiphzyE7rTwJ0Iop4KLxhn2m R8b5ll+b5IN8Crvi3kCPn/cwR7qWjYDeZ2bpVpAOcM6xG3As0uBp7Dx+03bBei/p SqPbnCLBVEF7iKjKw4QW79iQMFSapEKTX2Z8n6kjNMWGSDFbbplGVHEQmaWqfBw= =2yy6 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging virtio,pc,acpi fixes, cleanups Mostly cleanups, notably Eduardo's compat code rework, and smbios rearrangement for use by ARM. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Thu 13 Aug 2015 12:59:16 BST using RSA key ID D28D5469 # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" * remotes/mst/tags/for_upstream: (24 commits) MAINTAINERS: list smbios maintainers smbios: move smbios code into a common folder smbios: remove dependency on x86 e820 tables smbios: extract x86 smbios building code into a function acpi: avoid potential uninitialized access to cpu_hp_io_base virtio-net: remove useless codes pci: allow 0 address for PCI IO/MEM regions pc: Remove redundant arguments from pc_memory_init() pc: Remove redundant arguments from pc_cmos_init() pc: Remove redundant arguments from *load_linux() pc: Use PCMachineState as pc_guest_info_init() argument pc: Move {above,below}_4g_mem_size variables to PCMachineState pc: Use PCMachineState for pc_memory_init() argument pc: Use PCMachineState for pc_cmos_init() argument pc: Eliminate pc_default_machine_options() pc: Eliminate pc_common_machine_options() pc: Move PCMachineClass, PCMachineState to qemu/typedefs.h pc: Rename pc_machine variables to pcms pc: Use error_abort when registering properties target-i386: Remove x86_cpu_compat_set_features() ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
5c314a2eb7
@ -645,13 +645,15 @@ S: Supported
|
||||
F: include/hw/pci/*
|
||||
F: hw/pci/*
|
||||
|
||||
ACPI
|
||||
ACPI/SMBIOS
|
||||
M: Michael S. Tsirkin <mst@redhat.com>
|
||||
M: Igor Mammedov <imammedo@redhat.com>
|
||||
S: Supported
|
||||
F: include/hw/acpi/*
|
||||
F: include/hw/smbios/*
|
||||
F: hw/mem/*
|
||||
F: hw/acpi/*
|
||||
F: hw/smbios/*
|
||||
F: hw/i386/acpi-build.[hc]
|
||||
F: hw/i386/*dsl
|
||||
F: hw/arm/virt-acpi-build.c
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include "sysemu/arch_init.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/audio/audio.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qmp-commands.h"
|
||||
|
@ -49,3 +49,4 @@ CONFIG_MEM_HOTPLUG=y
|
||||
CONFIG_XIO3130=y
|
||||
CONFIG_IOH3420=y
|
||||
CONFIG_I82801B11=y
|
||||
CONFIG_SMBIOS=y
|
||||
|
@ -50,3 +50,4 @@ CONFIG_MEM_HOTPLUG=y
|
||||
CONFIG_XIO3130=y
|
||||
CONFIG_IOH3420=y
|
||||
CONFIG_I82801B11=y
|
||||
CONFIG_SMBIOS=y
|
||||
|
@ -31,6 +31,7 @@ devices-dirs-$(CONFIG_VIRTIO) += virtio/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += watchdog/
|
||||
devices-dirs-$(CONFIG_SOFTMMU) += xen/
|
||||
devices-dirs-$(CONFIG_MEM_HOTPLUG) += mem/
|
||||
devices-dirs-$(CONFIG_SMBIOS) += smbios/
|
||||
devices-dirs-y += core/
|
||||
common-obj-y += $(devices-dirs-y)
|
||||
obj-y += $(devices-dirs-y)
|
||||
|
@ -1,5 +1,5 @@
|
||||
obj-$(CONFIG_KVM) += kvm/
|
||||
obj-y += multiboot.o smbios.o
|
||||
obj-y += multiboot.o
|
||||
obj-y += pc.o pc_piix.o pc_q35.o
|
||||
obj-y += pc_sysfw.o
|
||||
obj-y += intel_iommu.o
|
||||
@ -7,8 +7,14 @@ obj-$(CONFIG_XEN) += ../xenpv/ xen/
|
||||
|
||||
obj-y += kvmvapic.o
|
||||
obj-y += acpi-build.o
|
||||
|
||||
gen-hex-y += hw/i386/acpi-dsdt.hex
|
||||
gen-hex-y += hw/i386/q35-acpi-dsdt.hex
|
||||
|
||||
hw/i386/acpi-build.o: hw/i386/acpi-build.c \
|
||||
hw/i386/acpi-dsdt.hex hw/i386/q35-acpi-dsdt.hex
|
||||
$(gen-hex-y)
|
||||
|
||||
-include $(gen-hex-y:.hex=.d)
|
||||
|
||||
iasl-option=$(shell if test -z "`$(1) $(2) 2>&1 > /dev/null`" \
|
||||
; then echo "$(2)"; else echo "$(3)"; fi ;)
|
||||
|
@ -169,6 +169,7 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
||||
Object *obj = NULL;
|
||||
QObject *o;
|
||||
|
||||
pm->cpu_hp_io_base = 0;
|
||||
pm->pcihp_io_base = 0;
|
||||
pm->pcihp_io_len = 0;
|
||||
if (piix) {
|
||||
|
@ -43,7 +43,6 @@ DefinitionBlock (
|
||||
|
||||
#include "acpi-dsdt-hpet.dsl"
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* PIIX4 PM
|
||||
****************************************************************/
|
||||
|
156
hw/i386/pc.c
156
hw/i386/pc.c
@ -33,7 +33,7 @@
|
||||
#include "hw/pci/pci_bus.h"
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
#include "hw/timer/hpet.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "hw/loader.h"
|
||||
#include "elf.h"
|
||||
#include "multiboot.h"
|
||||
@ -428,26 +428,24 @@ static void pc_cmos_init_late(void *opaque)
|
||||
qemu_unregister_reset(pc_cmos_init_late, opaque);
|
||||
}
|
||||
|
||||
void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
||||
const char *boot_device, MachineState *machine,
|
||||
void pc_cmos_init(PCMachineState *pcms,
|
||||
BusState *idebus0, BusState *idebus1,
|
||||
ISADevice *s)
|
||||
{
|
||||
int val;
|
||||
static pc_cmos_init_late_arg arg;
|
||||
PCMachineState *pc_machine = PC_MACHINE(machine);
|
||||
Error *local_err = NULL;
|
||||
|
||||
/* various important CMOS locations needed by PC/Bochs bios */
|
||||
|
||||
/* memory size */
|
||||
/* base memory (first MiB) */
|
||||
val = MIN(ram_size / 1024, 640);
|
||||
val = MIN(pcms->below_4g_mem_size / 1024, 640);
|
||||
rtc_set_memory(s, 0x15, val);
|
||||
rtc_set_memory(s, 0x16, val >> 8);
|
||||
/* extended memory (next 64MiB) */
|
||||
if (ram_size > 1024 * 1024) {
|
||||
val = (ram_size - 1024 * 1024) / 1024;
|
||||
if (pcms->below_4g_mem_size > 1024 * 1024) {
|
||||
val = (pcms->below_4g_mem_size - 1024 * 1024) / 1024;
|
||||
} else {
|
||||
val = 0;
|
||||
}
|
||||
@ -458,8 +456,8 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
||||
rtc_set_memory(s, 0x30, val);
|
||||
rtc_set_memory(s, 0x31, val >> 8);
|
||||
/* memory between 16MiB and 4GiB */
|
||||
if (ram_size > 16 * 1024 * 1024) {
|
||||
val = (ram_size - 16 * 1024 * 1024) / 65536;
|
||||
if (pcms->below_4g_mem_size > 16 * 1024 * 1024) {
|
||||
val = (pcms->below_4g_mem_size - 16 * 1024 * 1024) / 65536;
|
||||
} else {
|
||||
val = 0;
|
||||
}
|
||||
@ -468,7 +466,7 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
||||
rtc_set_memory(s, 0x34, val);
|
||||
rtc_set_memory(s, 0x35, val >> 8);
|
||||
/* memory above 4GiB */
|
||||
val = above_4g_mem_size / 65536;
|
||||
val = pcms->above_4g_mem_size / 65536;
|
||||
rtc_set_memory(s, 0x5b, val);
|
||||
rtc_set_memory(s, 0x5c, val >> 8);
|
||||
rtc_set_memory(s, 0x5d, val >> 16);
|
||||
@ -476,15 +474,15 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
||||
/* set the number of CPU */
|
||||
rtc_set_memory(s, 0x5f, smp_cpus - 1);
|
||||
|
||||
object_property_add_link(OBJECT(machine), "rtc_state",
|
||||
object_property_add_link(OBJECT(pcms), "rtc_state",
|
||||
TYPE_ISA_DEVICE,
|
||||
(Object **)&pc_machine->rtc,
|
||||
(Object **)&pcms->rtc,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE, &error_abort);
|
||||
object_property_set_link(OBJECT(machine), OBJECT(s),
|
||||
object_property_set_link(OBJECT(pcms), OBJECT(s),
|
||||
"rtc_state", &error_abort);
|
||||
|
||||
set_boot_dev(s, boot_device, &local_err);
|
||||
set_boot_dev(s, MACHINE(pcms)->boot_order, &local_err);
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
exit(1);
|
||||
@ -718,11 +716,46 @@ static unsigned int pc_apic_id_limit(unsigned int max_cpus)
|
||||
return x86_cpu_apic_id_from_index(max_cpus - 1) + 1;
|
||||
}
|
||||
|
||||
static void pc_build_smbios(FWCfgState *fw_cfg)
|
||||
{
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
struct smbios_phys_mem_area *mem_array;
|
||||
unsigned i, array_count;
|
||||
|
||||
smbios_tables = smbios_get_table_legacy(&smbios_tables_len);
|
||||
if (smbios_tables) {
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
|
||||
smbios_tables, smbios_tables_len);
|
||||
}
|
||||
|
||||
/* build the array of physical mem area from e820 table */
|
||||
mem_array = g_malloc0(sizeof(*mem_array) * e820_get_num_entries());
|
||||
for (i = 0, array_count = 0; i < e820_get_num_entries(); i++) {
|
||||
uint64_t addr, len;
|
||||
|
||||
if (e820_get_entry(i, E820_RAM, &addr, &len)) {
|
||||
mem_array[array_count].address = addr;
|
||||
mem_array[array_count].length = len;
|
||||
array_count++;
|
||||
}
|
||||
}
|
||||
smbios_get_tables(mem_array, array_count,
|
||||
&smbios_tables, &smbios_tables_len,
|
||||
&smbios_anchor, &smbios_anchor_len);
|
||||
g_free(mem_array);
|
||||
|
||||
if (smbios_anchor) {
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables",
|
||||
smbios_tables, smbios_tables_len);
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor",
|
||||
smbios_anchor, smbios_anchor_len);
|
||||
}
|
||||
}
|
||||
|
||||
static FWCfgState *bochs_bios_init(void)
|
||||
{
|
||||
FWCfgState *fw_cfg;
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
uint64_t *numa_fw_cfg;
|
||||
int i, j;
|
||||
unsigned int apic_id_limit = pc_apic_id_limit(max_cpus);
|
||||
@ -748,20 +781,7 @@ static FWCfgState *bochs_bios_init(void)
|
||||
acpi_tables, acpi_tables_len);
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_IRQ0_OVERRIDE, kvm_allows_irq0_override());
|
||||
|
||||
smbios_tables = smbios_get_table_legacy(&smbios_tables_len);
|
||||
if (smbios_tables) {
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
|
||||
smbios_tables, smbios_tables_len);
|
||||
}
|
||||
|
||||
smbios_get_tables(&smbios_tables, &smbios_tables_len,
|
||||
&smbios_anchor, &smbios_anchor_len);
|
||||
if (smbios_anchor) {
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-tables",
|
||||
smbios_tables, smbios_tables_len);
|
||||
fw_cfg_add_file(fw_cfg, "etc/smbios/smbios-anchor",
|
||||
smbios_anchor, smbios_anchor_len);
|
||||
}
|
||||
pc_build_smbios(fw_cfg);
|
||||
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_E820_TABLE,
|
||||
&e820_reserve, sizeof(e820_reserve));
|
||||
@ -809,11 +829,8 @@ static long get_file_size(FILE *f)
|
||||
return size;
|
||||
}
|
||||
|
||||
static void load_linux(FWCfgState *fw_cfg,
|
||||
const char *kernel_filename,
|
||||
const char *initrd_filename,
|
||||
const char *kernel_cmdline,
|
||||
hwaddr max_ram_size)
|
||||
static void load_linux(PCMachineState *pcms,
|
||||
FWCfgState *fw_cfg)
|
||||
{
|
||||
uint16_t protocol;
|
||||
int setup_size, kernel_size, initrd_size = 0, cmdline_size;
|
||||
@ -822,6 +839,10 @@ static void load_linux(FWCfgState *fw_cfg,
|
||||
hwaddr real_addr, prot_addr, cmdline_addr, initrd_addr = 0;
|
||||
FILE *f;
|
||||
char *vmode;
|
||||
MachineState *machine = MACHINE(pcms);
|
||||
const char *kernel_filename = machine->kernel_filename;
|
||||
const char *initrd_filename = machine->initrd_filename;
|
||||
const char *kernel_cmdline = machine->kernel_cmdline;
|
||||
|
||||
/* Align to 16 bytes as a paranoia measure */
|
||||
cmdline_size = (strlen(kernel_cmdline)+16) & ~15;
|
||||
@ -886,8 +907,8 @@ static void load_linux(FWCfgState *fw_cfg,
|
||||
initrd_max = 0x37ffffff;
|
||||
}
|
||||
|
||||
if (initrd_max >= max_ram_size - acpi_data_size) {
|
||||
initrd_max = max_ram_size - acpi_data_size - 1;
|
||||
if (initrd_max >= pcms->below_4g_mem_size - acpi_data_size) {
|
||||
initrd_max = pcms->below_4g_mem_size - acpi_data_size - 1;
|
||||
}
|
||||
|
||||
fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_ADDR, cmdline_addr);
|
||||
@ -1189,15 +1210,14 @@ void pc_guest_info_machine_done(Notifier *notifier, void *data)
|
||||
acpi_setup(&guest_info_state->info);
|
||||
}
|
||||
|
||||
PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
|
||||
ram_addr_t above_4g_mem_size)
|
||||
PcGuestInfo *pc_guest_info_init(PCMachineState *pcms)
|
||||
{
|
||||
PcGuestInfoState *guest_info_state = g_malloc0(sizeof *guest_info_state);
|
||||
PcGuestInfo *guest_info = &guest_info_state->info;
|
||||
int i, j;
|
||||
|
||||
guest_info->ram_size_below_4g = below_4g_mem_size;
|
||||
guest_info->ram_size = below_4g_mem_size + above_4g_mem_size;
|
||||
guest_info->ram_size_below_4g = pcms->below_4g_mem_size;
|
||||
guest_info->ram_size = pcms->below_4g_mem_size + pcms->above_4g_mem_size;
|
||||
guest_info->apic_id_limit = pc_apic_id_limit(max_cpus);
|
||||
guest_info->apic_xrupt_override = kvm_allows_irq0_override();
|
||||
guest_info->numa_nodes = nb_numa_nodes;
|
||||
@ -1264,22 +1284,18 @@ void pc_acpi_init(const char *default_dsdt)
|
||||
}
|
||||
}
|
||||
|
||||
FWCfgState *xen_load_linux(const char *kernel_filename,
|
||||
const char *kernel_cmdline,
|
||||
const char *initrd_filename,
|
||||
ram_addr_t below_4g_mem_size,
|
||||
FWCfgState *xen_load_linux(PCMachineState *pcms,
|
||||
PcGuestInfo *guest_info)
|
||||
{
|
||||
int i;
|
||||
FWCfgState *fw_cfg;
|
||||
|
||||
assert(kernel_filename != NULL);
|
||||
assert(MACHINE(pcms)->kernel_filename != NULL);
|
||||
|
||||
fw_cfg = fw_cfg_init_io(BIOS_CFG_IOPORT);
|
||||
rom_set_fw(fw_cfg);
|
||||
|
||||
load_linux(fw_cfg, kernel_filename, initrd_filename,
|
||||
kernel_cmdline, below_4g_mem_size);
|
||||
load_linux(pcms, fw_cfg);
|
||||
for (i = 0; i < nb_option_roms; i++) {
|
||||
assert(!strcmp(option_rom[i].name, "linuxboot.bin") ||
|
||||
!strcmp(option_rom[i].name, "multiboot.bin"));
|
||||
@ -1289,10 +1305,8 @@ FWCfgState *xen_load_linux(const char *kernel_filename,
|
||||
return fw_cfg;
|
||||
}
|
||||
|
||||
FWCfgState *pc_memory_init(MachineState *machine,
|
||||
FWCfgState *pc_memory_init(PCMachineState *pcms,
|
||||
MemoryRegion *system_memory,
|
||||
ram_addr_t below_4g_mem_size,
|
||||
ram_addr_t above_4g_mem_size,
|
||||
MemoryRegion *rom_memory,
|
||||
MemoryRegion **ram_memory,
|
||||
PcGuestInfo *guest_info)
|
||||
@ -1301,9 +1315,10 @@ FWCfgState *pc_memory_init(MachineState *machine,
|
||||
MemoryRegion *ram, *option_rom_mr;
|
||||
MemoryRegion *ram_below_4g, *ram_above_4g;
|
||||
FWCfgState *fw_cfg;
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
MachineState *machine = MACHINE(pcms);
|
||||
|
||||
assert(machine->ram_size == below_4g_mem_size + above_4g_mem_size);
|
||||
assert(machine->ram_size == pcms->below_4g_mem_size +
|
||||
pcms->above_4g_mem_size);
|
||||
|
||||
linux_boot = (machine->kernel_filename != NULL);
|
||||
|
||||
@ -1317,16 +1332,17 @@ FWCfgState *pc_memory_init(MachineState *machine,
|
||||
*ram_memory = ram;
|
||||
ram_below_4g = g_malloc(sizeof(*ram_below_4g));
|
||||
memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram,
|
||||
0, below_4g_mem_size);
|
||||
0, pcms->below_4g_mem_size);
|
||||
memory_region_add_subregion(system_memory, 0, ram_below_4g);
|
||||
e820_add_entry(0, below_4g_mem_size, E820_RAM);
|
||||
if (above_4g_mem_size > 0) {
|
||||
e820_add_entry(0, pcms->below_4g_mem_size, E820_RAM);
|
||||
if (pcms->above_4g_mem_size > 0) {
|
||||
ram_above_4g = g_malloc(sizeof(*ram_above_4g));
|
||||
memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram,
|
||||
below_4g_mem_size, above_4g_mem_size);
|
||||
pcms->below_4g_mem_size,
|
||||
pcms->above_4g_mem_size);
|
||||
memory_region_add_subregion(system_memory, 0x100000000ULL,
|
||||
ram_above_4g);
|
||||
e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM);
|
||||
e820_add_entry(0x100000000ULL, pcms->above_4g_mem_size, E820_RAM);
|
||||
}
|
||||
|
||||
if (!guest_info->has_reserved_memory &&
|
||||
@ -1359,7 +1375,7 @@ FWCfgState *pc_memory_init(MachineState *machine,
|
||||
}
|
||||
|
||||
pcms->hotplug_memory.base =
|
||||
ROUND_UP(0x100000000ULL + above_4g_mem_size, 1ULL << 30);
|
||||
ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1ULL << 30);
|
||||
|
||||
if (pcms->enforce_aligned_dimm) {
|
||||
/* size hotplug region assuming 1G page max alignment per slot */
|
||||
@ -1401,8 +1417,7 @@ FWCfgState *pc_memory_init(MachineState *machine,
|
||||
}
|
||||
|
||||
if (linux_boot) {
|
||||
load_linux(fw_cfg, machine->kernel_filename, machine->initrd_filename,
|
||||
machine->kernel_cmdline, below_4g_mem_size);
|
||||
load_linux(pcms, fw_cfg);
|
||||
}
|
||||
|
||||
for (i = 0; i < nb_option_roms; i++) {
|
||||
@ -1886,39 +1901,39 @@ static void pc_machine_initfn(Object *obj)
|
||||
|
||||
object_property_add(obj, PC_MACHINE_MEMHP_REGION_SIZE, "int",
|
||||
pc_machine_get_hotplug_memory_region_size,
|
||||
NULL, NULL, NULL, NULL);
|
||||
NULL, NULL, NULL, &error_abort);
|
||||
|
||||
pcms->max_ram_below_4g = 1ULL << 32; /* 4G */
|
||||
object_property_add(obj, PC_MACHINE_MAX_RAM_BELOW_4G, "size",
|
||||
pc_machine_get_max_ram_below_4g,
|
||||
pc_machine_set_max_ram_below_4g,
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, &error_abort);
|
||||
object_property_set_description(obj, PC_MACHINE_MAX_RAM_BELOW_4G,
|
||||
"Maximum ram below the 4G boundary (32bit boundary)",
|
||||
NULL);
|
||||
&error_abort);
|
||||
|
||||
pcms->smm = ON_OFF_AUTO_AUTO;
|
||||
object_property_add(obj, PC_MACHINE_SMM, "OnOffAuto",
|
||||
pc_machine_get_smm,
|
||||
pc_machine_set_smm,
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, &error_abort);
|
||||
object_property_set_description(obj, PC_MACHINE_SMM,
|
||||
"Enable SMM (pc & q35)",
|
||||
NULL);
|
||||
&error_abort);
|
||||
|
||||
pcms->vmport = ON_OFF_AUTO_AUTO;
|
||||
object_property_add(obj, PC_MACHINE_VMPORT, "OnOffAuto",
|
||||
pc_machine_get_vmport,
|
||||
pc_machine_set_vmport,
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, &error_abort);
|
||||
object_property_set_description(obj, PC_MACHINE_VMPORT,
|
||||
"Enable vmport (pc & q35)",
|
||||
NULL);
|
||||
&error_abort);
|
||||
|
||||
pcms->enforce_aligned_dimm = true;
|
||||
object_property_add_bool(obj, PC_MACHINE_ENFORCE_ALIGNED_DIMM,
|
||||
pc_machine_get_aligned_dimm,
|
||||
NULL, NULL);
|
||||
NULL, &error_abort);
|
||||
}
|
||||
|
||||
static unsigned pc_cpu_index_to_socket_id(unsigned cpu_index)
|
||||
@ -1938,6 +1953,9 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
pcmc->get_hotplug_handler = mc->get_hotplug_handler;
|
||||
mc->get_hotplug_handler = pc_get_hotpug_handler;
|
||||
mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
|
||||
mc->default_boot_order = "cad";
|
||||
mc->hot_add_cpu = pc_hot_add_cpu;
|
||||
mc->max_cpus = 255;
|
||||
hc->plug = pc_machine_device_plug_cb;
|
||||
hc->unplug_request = pc_machine_device_unplug_request_cb;
|
||||
hc->unplug = pc_machine_device_unplug_cb;
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "hw/loader.h"
|
||||
#include "hw/i386/pc.h"
|
||||
#include "hw/i386/apic.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_ids.h"
|
||||
#include "hw/usb.h"
|
||||
@ -78,11 +78,10 @@ static bool kvmclock_enabled = true;
|
||||
/* PC hardware initialisation */
|
||||
static void pc_init1(MachineState *machine)
|
||||
{
|
||||
PCMachineState *pc_machine = PC_MACHINE(machine);
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
MemoryRegion *system_memory = get_system_memory();
|
||||
MemoryRegion *system_io = get_system_io();
|
||||
int i;
|
||||
ram_addr_t below_4g_mem_size, above_4g_mem_size;
|
||||
PCIBus *pci_bus;
|
||||
ISABus *isa_bus;
|
||||
PCII440FXState *i440fx_state;
|
||||
@ -117,25 +116,26 @@ static void pc_init1(MachineState *machine)
|
||||
/* Handle the machine opt max-ram-below-4g. It is basically doing
|
||||
* min(qemu limit, user limit).
|
||||
*/
|
||||
if (lowmem > pc_machine->max_ram_below_4g) {
|
||||
lowmem = pc_machine->max_ram_below_4g;
|
||||
if (lowmem > pcms->max_ram_below_4g) {
|
||||
lowmem = pcms->max_ram_below_4g;
|
||||
if (machine->ram_size - lowmem > lowmem &&
|
||||
lowmem & ((1ULL << 30) - 1)) {
|
||||
error_report("Warning: Large machine and max_ram_below_4g(%"PRIu64
|
||||
") not a multiple of 1G; possible bad performance.",
|
||||
pc_machine->max_ram_below_4g);
|
||||
pcms->max_ram_below_4g);
|
||||
}
|
||||
}
|
||||
|
||||
if (machine->ram_size >= lowmem) {
|
||||
above_4g_mem_size = machine->ram_size - lowmem;
|
||||
below_4g_mem_size = lowmem;
|
||||
pcms->above_4g_mem_size = machine->ram_size - lowmem;
|
||||
pcms->below_4g_mem_size = lowmem;
|
||||
} else {
|
||||
above_4g_mem_size = 0;
|
||||
below_4g_mem_size = machine->ram_size;
|
||||
pcms->above_4g_mem_size = 0;
|
||||
pcms->below_4g_mem_size = machine->ram_size;
|
||||
}
|
||||
|
||||
if (xen_enabled() && xen_hvm_init(&below_4g_mem_size, &above_4g_mem_size,
|
||||
if (xen_enabled() && xen_hvm_init(&pcms->below_4g_mem_size,
|
||||
&pcms->above_4g_mem_size,
|
||||
&ram_memory) != 0) {
|
||||
fprintf(stderr, "xen hardware virtual machine initialisation failed\n");
|
||||
exit(1);
|
||||
@ -160,7 +160,7 @@ static void pc_init1(MachineState *machine)
|
||||
rom_memory = system_memory;
|
||||
}
|
||||
|
||||
guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
|
||||
guest_info = pc_guest_info_init(pcms);
|
||||
|
||||
guest_info->has_acpi_build = has_acpi_build;
|
||||
guest_info->legacy_acpi_table_size = legacy_acpi_table_size;
|
||||
@ -178,16 +178,11 @@ static void pc_init1(MachineState *machine)
|
||||
|
||||
/* allocate ram and load rom/bios */
|
||||
if (!xen_enabled()) {
|
||||
pc_memory_init(machine, system_memory,
|
||||
below_4g_mem_size, above_4g_mem_size,
|
||||
pc_memory_init(pcms, system_memory,
|
||||
rom_memory, &ram_memory, guest_info);
|
||||
} else if (machine->kernel_filename != NULL) {
|
||||
/* For xen HVM direct kernel boot, load linux here */
|
||||
xen_load_linux(machine->kernel_filename,
|
||||
machine->kernel_cmdline,
|
||||
machine->initrd_filename,
|
||||
below_4g_mem_size,
|
||||
guest_info);
|
||||
xen_load_linux(pcms, guest_info);
|
||||
}
|
||||
|
||||
gsi_state = g_malloc0(sizeof(*gsi_state));
|
||||
@ -202,8 +197,8 @@ static void pc_init1(MachineState *machine)
|
||||
if (pci_enabled) {
|
||||
pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus, gsi,
|
||||
system_memory, system_io, machine->ram_size,
|
||||
below_4g_mem_size,
|
||||
above_4g_mem_size,
|
||||
pcms->below_4g_mem_size,
|
||||
pcms->above_4g_mem_size,
|
||||
pci_memory, ram_memory);
|
||||
} else {
|
||||
pci_bus = NULL;
|
||||
@ -234,14 +229,14 @@ static void pc_init1(MachineState *machine)
|
||||
|
||||
pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
|
||||
|
||||
assert(pc_machine->vmport != ON_OFF_AUTO_MAX);
|
||||
if (pc_machine->vmport == ON_OFF_AUTO_AUTO) {
|
||||
pc_machine->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
|
||||
assert(pcms->vmport != ON_OFF_AUTO_MAX);
|
||||
if (pcms->vmport == ON_OFF_AUTO_AUTO) {
|
||||
pcms->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
|
||||
}
|
||||
|
||||
/* init basic PC hardware */
|
||||
pc_basic_device_init(isa_bus, gsi, &rtc_state, true,
|
||||
(pc_machine->vmport != ON_OFF_AUTO_ON), 0x4);
|
||||
(pcms->vmport != ON_OFF_AUTO_ON), 0x4);
|
||||
|
||||
pc_nic_init(isa_bus, pci_bus);
|
||||
|
||||
@ -271,8 +266,7 @@ static void pc_init1(MachineState *machine)
|
||||
}
|
||||
}
|
||||
|
||||
pc_cmos_init(below_4g_mem_size, above_4g_mem_size, machine->boot_order,
|
||||
machine, idebus[0], idebus[1], rtc_state);
|
||||
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
|
||||
|
||||
if (pci_enabled && usb_enabled()) {
|
||||
pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
|
||||
@ -286,13 +280,13 @@ static void pc_init1(MachineState *machine)
|
||||
/* TODO: Populate SPD eeprom data. */
|
||||
smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
|
||||
gsi[9], smi_irq,
|
||||
pc_machine_is_smm_enabled(pc_machine),
|
||||
pc_machine_is_smm_enabled(pcms),
|
||||
&piix4_pm);
|
||||
smbus_eeprom_init(smbus, 8, NULL, 0);
|
||||
|
||||
object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
|
||||
TYPE_HOTPLUG_HANDLER,
|
||||
(Object **)&pc_machine->acpi_dev,
|
||||
(Object **)&pcms->acpi_dev,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE, &error_abort);
|
||||
object_property_set_link(OBJECT(machine), OBJECT(piix4_pm),
|
||||
@ -319,24 +313,6 @@ static void pc_compat_2_2(MachineState *machine)
|
||||
{
|
||||
pc_compat_2_3(machine);
|
||||
rsdp_in_ram = false;
|
||||
x86_cpu_compat_set_features("kvm64", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("kvm32", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Conroe", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Penryn", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Nehalem", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Westmere", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("SandyBridge", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G1", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G2", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G3", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G4", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G5", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_ECX, 0, CPUID_EXT_F16C);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_ECX, 0, CPUID_EXT_RDRAND);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_ECX, 0, CPUID_EXT_F16C);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_ECX, 0, CPUID_EXT_RDRAND);
|
||||
machine->suppress_vmdesc = true;
|
||||
}
|
||||
|
||||
@ -346,8 +322,6 @@ static void pc_compat_2_1(MachineState *machine)
|
||||
|
||||
pc_compat_2_2(machine);
|
||||
smbios_uuid_encoded = false;
|
||||
x86_cpu_compat_set_features("coreduo", FEAT_1_ECX, CPUID_EXT_VMX, 0);
|
||||
x86_cpu_compat_set_features("core2duo", FEAT_1_ECX, CPUID_EXT_VMX, 0);
|
||||
x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
|
||||
pcms->enforce_aligned_dimm = false;
|
||||
}
|
||||
@ -402,8 +376,6 @@ static void pc_compat_1_5(MachineState *machine)
|
||||
static void pc_compat_1_4(MachineState *machine)
|
||||
{
|
||||
pc_compat_1_5(machine);
|
||||
x86_cpu_compat_set_features("n270", FEAT_1_ECX, 0, CPUID_EXT_MOVBE);
|
||||
x86_cpu_compat_set_features("Westmere", FEAT_1_ECX, 0, CPUID_EXT_PCLMULQDQ);
|
||||
}
|
||||
|
||||
static void pc_compat_1_3(MachineState *machine)
|
||||
@ -471,7 +443,6 @@ static void pc_xen_hvm_init(MachineState *machine)
|
||||
|
||||
static void pc_i440fx_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_default_machine_options(m);
|
||||
m->family = "pc_piix";
|
||||
m->desc = "Standard PC (i440FX + PIIX, 1996)";
|
||||
m->hot_add_cpu = pc_hot_add_cpu;
|
||||
@ -909,7 +880,6 @@ DEFINE_I440FX_MACHINE(v0_10, "pc-0.10", pc_compat_0_13,
|
||||
|
||||
static void isapc_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_common_machine_options(m);
|
||||
m->desc = "ISA-only PC";
|
||||
m->max_cpus = 1;
|
||||
}
|
||||
@ -921,7 +891,6 @@ DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
|
||||
#ifdef CONFIG_XEN
|
||||
static void xenfv_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_common_machine_options(m);
|
||||
m->desc = "Xen Fully-virtualized PC";
|
||||
m->max_cpus = HVM_MAX_VCPUS;
|
||||
m->default_machine_opts = "accel=xen";
|
||||
|
@ -39,7 +39,7 @@
|
||||
#include "hw/pci-host/q35.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "hw/i386/ich9.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "hw/ide/pci.h"
|
||||
#include "hw/ide/ahci.h"
|
||||
#include "hw/usb.h"
|
||||
@ -65,8 +65,7 @@ static bool has_reserved_memory = true;
|
||||
/* PC hardware initialisation */
|
||||
static void pc_q35_init(MachineState *machine)
|
||||
{
|
||||
PCMachineState *pc_machine = PC_MACHINE(machine);
|
||||
ram_addr_t below_4g_mem_size, above_4g_mem_size;
|
||||
PCMachineState *pcms = PC_MACHINE(machine);
|
||||
Q35PCIHost *q35_host;
|
||||
PCIHostState *phb;
|
||||
PCIBus *host_bus;
|
||||
@ -108,25 +107,26 @@ static void pc_q35_init(MachineState *machine)
|
||||
/* Handle the machine opt max-ram-below-4g. It is basically doing
|
||||
* min(qemu limit, user limit).
|
||||
*/
|
||||
if (lowmem > pc_machine->max_ram_below_4g) {
|
||||
lowmem = pc_machine->max_ram_below_4g;
|
||||
if (lowmem > pcms->max_ram_below_4g) {
|
||||
lowmem = pcms->max_ram_below_4g;
|
||||
if (machine->ram_size - lowmem > lowmem &&
|
||||
lowmem & ((1ULL << 30) - 1)) {
|
||||
error_report("Warning: Large machine and max_ram_below_4g(%"PRIu64
|
||||
") not a multiple of 1G; possible bad performance.",
|
||||
pc_machine->max_ram_below_4g);
|
||||
pcms->max_ram_below_4g);
|
||||
}
|
||||
}
|
||||
|
||||
if (machine->ram_size >= lowmem) {
|
||||
above_4g_mem_size = machine->ram_size - lowmem;
|
||||
below_4g_mem_size = lowmem;
|
||||
pcms->above_4g_mem_size = machine->ram_size - lowmem;
|
||||
pcms->below_4g_mem_size = lowmem;
|
||||
} else {
|
||||
above_4g_mem_size = 0;
|
||||
below_4g_mem_size = machine->ram_size;
|
||||
pcms->above_4g_mem_size = 0;
|
||||
pcms->below_4g_mem_size = machine->ram_size;
|
||||
}
|
||||
|
||||
if (xen_enabled() && xen_hvm_init(&below_4g_mem_size, &above_4g_mem_size,
|
||||
if (xen_enabled() && xen_hvm_init(&pcms->below_4g_mem_size,
|
||||
&pcms->above_4g_mem_size,
|
||||
&ram_memory) != 0) {
|
||||
fprintf(stderr, "xen hardware virtual machine initialisation failed\n");
|
||||
exit(1);
|
||||
@ -151,7 +151,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
rom_memory = get_system_memory();
|
||||
}
|
||||
|
||||
guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
|
||||
guest_info = pc_guest_info_init(pcms);
|
||||
guest_info->isapc_ram_fw = false;
|
||||
guest_info->has_acpi_build = has_acpi_build;
|
||||
guest_info->has_reserved_memory = has_reserved_memory;
|
||||
@ -170,8 +170,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
|
||||
/* allocate ram and load rom/bios */
|
||||
if (!xen_enabled()) {
|
||||
pc_memory_init(machine, get_system_memory(),
|
||||
below_4g_mem_size, above_4g_mem_size,
|
||||
pc_memory_init(pcms, get_system_memory(),
|
||||
rom_memory, &ram_memory, guest_info);
|
||||
}
|
||||
|
||||
@ -193,8 +192,8 @@ static void pc_q35_init(MachineState *machine)
|
||||
q35_host->mch.pci_address_space = pci_memory;
|
||||
q35_host->mch.system_memory = get_system_memory();
|
||||
q35_host->mch.address_space_io = get_system_io();
|
||||
q35_host->mch.below_4g_mem_size = below_4g_mem_size;
|
||||
q35_host->mch.above_4g_mem_size = above_4g_mem_size;
|
||||
q35_host->mch.below_4g_mem_size = pcms->below_4g_mem_size;
|
||||
q35_host->mch.above_4g_mem_size = pcms->above_4g_mem_size;
|
||||
q35_host->mch.guest_info = guest_info;
|
||||
/* pci */
|
||||
qdev_init_nofail(DEVICE(q35_host));
|
||||
@ -207,7 +206,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
|
||||
object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
|
||||
TYPE_HOTPLUG_HANDLER,
|
||||
(Object **)&pc_machine->acpi_dev,
|
||||
(Object **)&pcms->acpi_dev,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE, &error_abort);
|
||||
object_property_set_link(OBJECT(machine), OBJECT(lpc),
|
||||
@ -242,17 +241,17 @@ static void pc_q35_init(MachineState *machine)
|
||||
|
||||
pc_register_ferr_irq(gsi[13]);
|
||||
|
||||
assert(pc_machine->vmport != ON_OFF_AUTO_MAX);
|
||||
if (pc_machine->vmport == ON_OFF_AUTO_AUTO) {
|
||||
pc_machine->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
|
||||
assert(pcms->vmport != ON_OFF_AUTO_MAX);
|
||||
if (pcms->vmport == ON_OFF_AUTO_AUTO) {
|
||||
pcms->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
|
||||
}
|
||||
|
||||
/* init basic PC hardware */
|
||||
pc_basic_device_init(isa_bus, gsi, &rtc_state, !mc->no_floppy,
|
||||
(pc_machine->vmport != ON_OFF_AUTO_ON), 0xff0104);
|
||||
(pcms->vmport != ON_OFF_AUTO_ON), 0xff0104);
|
||||
|
||||
/* connect pm stuff to lpc */
|
||||
ich9_lpc_pm_init(lpc, pc_machine_is_smm_enabled(pc_machine), !mc->no_tco);
|
||||
ich9_lpc_pm_init(lpc, pc_machine_is_smm_enabled(pcms), !mc->no_tco);
|
||||
|
||||
/* ahci and SATA device, for q35 1 ahci controller is built-in */
|
||||
ahci = pci_create_simple_multifunction(host_bus,
|
||||
@ -276,8 +275,7 @@ static void pc_q35_init(MachineState *machine)
|
||||
0xb100),
|
||||
8, NULL, 0);
|
||||
|
||||
pc_cmos_init(below_4g_mem_size, above_4g_mem_size, machine->boot_order,
|
||||
machine, idebus[0], idebus[1], rtc_state);
|
||||
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
|
||||
|
||||
/* the rest devices to which pci devfn is automatically assigned */
|
||||
pc_vga_init(isa_bus, host_bus);
|
||||
@ -302,24 +300,6 @@ static void pc_compat_2_2(MachineState *machine)
|
||||
{
|
||||
pc_compat_2_3(machine);
|
||||
rsdp_in_ram = false;
|
||||
x86_cpu_compat_set_features("kvm64", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("kvm32", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Conroe", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Penryn", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Nehalem", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Westmere", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("SandyBridge", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G1", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G2", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G3", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G4", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Opteron_G5", FEAT_1_EDX, 0, CPUID_VME);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_ECX, 0, CPUID_EXT_F16C);
|
||||
x86_cpu_compat_set_features("Haswell", FEAT_1_ECX, 0, CPUID_EXT_RDRAND);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_ECX, 0, CPUID_EXT_F16C);
|
||||
x86_cpu_compat_set_features("Broadwell", FEAT_1_ECX, 0, CPUID_EXT_RDRAND);
|
||||
machine->suppress_vmdesc = true;
|
||||
}
|
||||
|
||||
@ -330,8 +310,6 @@ static void pc_compat_2_1(MachineState *machine)
|
||||
pc_compat_2_2(machine);
|
||||
pcms->enforce_aligned_dimm = false;
|
||||
smbios_uuid_encoded = false;
|
||||
x86_cpu_compat_set_features("coreduo", FEAT_1_ECX, CPUID_EXT_VMX, 0);
|
||||
x86_cpu_compat_set_features("core2duo", FEAT_1_ECX, CPUID_EXT_VMX, 0);
|
||||
x86_cpu_compat_kvm_no_autodisable(FEAT_8000_0001_ECX, CPUID_EXT3_SVM);
|
||||
}
|
||||
|
||||
@ -367,8 +345,6 @@ static void pc_compat_1_5(MachineState *machine)
|
||||
static void pc_compat_1_4(MachineState *machine)
|
||||
{
|
||||
pc_compat_1_5(machine);
|
||||
x86_cpu_compat_set_features("n270", FEAT_1_ECX, 0, CPUID_EXT_MOVBE);
|
||||
x86_cpu_compat_set_features("Westmere", FEAT_1_ECX, 0, CPUID_EXT_PCLMULQDQ);
|
||||
}
|
||||
|
||||
#define DEFINE_Q35_MACHINE(suffix, name, compatfn, optionfn) \
|
||||
@ -385,7 +361,6 @@ static void pc_compat_1_4(MachineState *machine)
|
||||
|
||||
static void pc_q35_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_default_machine_options(m);
|
||||
m->family = "pc_q35";
|
||||
m->desc = "Standard PC (Q35 + ICH9, 2009)";
|
||||
m->hot_add_cpu = pc_hot_add_cpu;
|
||||
|
@ -22,6 +22,7 @@
|
||||
* Based on acpi-dsdt.dsl, but heavily modified for q35 chipset.
|
||||
*/
|
||||
|
||||
|
||||
ACPI_EXTRACT_ALL_CODE Q35AcpiDsdtAmlCode
|
||||
|
||||
DefinitionBlock (
|
||||
|
@ -1124,7 +1124,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
|
||||
virtqueue_push(q->tx_vq, &q->async_tx.elem, 0);
|
||||
virtio_notify(vdev, q->tx_vq);
|
||||
|
||||
q->async_tx.elem.out_num = q->async_tx.len = 0;
|
||||
q->async_tx.elem.out_num = 0;
|
||||
|
||||
virtio_queue_set_notification(q->tx_vq, 1);
|
||||
virtio_net_flush_tx(q);
|
||||
@ -1148,7 +1148,7 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
|
||||
}
|
||||
|
||||
while (virtqueue_pop(q->tx_vq, &elem)) {
|
||||
ssize_t ret, len;
|
||||
ssize_t ret;
|
||||
unsigned int out_num = elem.out_num;
|
||||
struct iovec *out_sg = &elem.out_sg[0];
|
||||
struct iovec sg[VIRTQUEUE_MAX_SIZE], sg2[VIRTQUEUE_MAX_SIZE + 1];
|
||||
@ -1196,18 +1196,14 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
|
||||
out_sg = sg;
|
||||
}
|
||||
|
||||
len = n->guest_hdr_len;
|
||||
|
||||
ret = qemu_sendv_packet_async(qemu_get_subqueue(n->nic, queue_index),
|
||||
out_sg, out_num, virtio_net_tx_complete);
|
||||
if (ret == 0) {
|
||||
virtio_queue_set_notification(q->tx_vq, 0);
|
||||
q->async_tx.elem = elem;
|
||||
q->async_tx.len = len;
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
len += ret;
|
||||
drop:
|
||||
virtqueue_push(q->tx_vq, &elem, 0);
|
||||
virtio_notify(vdev, q->tx_vq);
|
||||
|
@ -117,6 +117,11 @@ struct PCII440FXState {
|
||||
#define I440FX_PAM_SIZE 7
|
||||
#define I440FX_SMRAM 0x72
|
||||
|
||||
/* Older coreboot versions (4.0 and older) read a config register that doesn't
|
||||
* exist in real hardware, to get the RAM size from QEMU.
|
||||
*/
|
||||
#define I440FX_COREBOOT_RAM_SIZE 0x57
|
||||
|
||||
static void piix3_set_irq(void *opaque, int pirq, int level);
|
||||
static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pci_intx);
|
||||
static void piix3_write_config_xen(PCIDevice *dev,
|
||||
@ -394,7 +399,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,
|
||||
if (ram_size > 255) {
|
||||
ram_size = 255;
|
||||
}
|
||||
d->config[0x57] = ram_size;
|
||||
d->config[I440FX_COREBOOT_RAM_SIZE] = ram_size;
|
||||
|
||||
i440fx_update_memory_mappings(f);
|
||||
|
||||
|
12
hw/pci/pci.c
12
hw/pci/pci.c
@ -38,6 +38,7 @@
|
||||
#include "hw/pci/msix.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "hw/hotplug.h"
|
||||
#include "hw/boards.h"
|
||||
|
||||
//#define DEBUG_PCI
|
||||
#ifdef DEBUG_PCI
|
||||
@ -1065,6 +1066,10 @@ static pcibus_t pci_bar_address(PCIDevice *d,
|
||||
pcibus_t new_addr, last_addr;
|
||||
int bar = pci_bar(d, reg);
|
||||
uint16_t cmd = pci_get_word(d->config + PCI_COMMAND);
|
||||
Object *machine = qdev_get_machine();
|
||||
ObjectClass *oc = object_get_class(machine);
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
bool allow_0_address = mc->pci_allow_0_address;
|
||||
|
||||
if (type & PCI_BASE_ADDRESS_SPACE_IO) {
|
||||
if (!(cmd & PCI_COMMAND_IO)) {
|
||||
@ -1075,7 +1080,8 @@ static pcibus_t pci_bar_address(PCIDevice *d,
|
||||
/* Check if 32 bit BAR wraps around explicitly.
|
||||
* TODO: make priorities correct and remove this work around.
|
||||
*/
|
||||
if (last_addr <= new_addr || new_addr == 0 || last_addr >= UINT32_MAX) {
|
||||
if (last_addr <= new_addr || last_addr >= UINT32_MAX ||
|
||||
(!allow_0_address && new_addr == 0)) {
|
||||
return PCI_BAR_UNMAPPED;
|
||||
}
|
||||
return new_addr;
|
||||
@ -1099,8 +1105,8 @@ static pcibus_t pci_bar_address(PCIDevice *d,
|
||||
/* XXX: as we cannot support really dynamic
|
||||
mappings, we handle specific values as invalid
|
||||
mappings. */
|
||||
if (last_addr <= new_addr || new_addr == 0 ||
|
||||
last_addr == PCI_BAR_UNMAPPED) {
|
||||
if (last_addr <= new_addr || last_addr == PCI_BAR_UNMAPPED ||
|
||||
(!allow_0_address && new_addr == 0)) {
|
||||
return PCI_BAR_UNMAPPED;
|
||||
}
|
||||
|
||||
|
@ -1835,6 +1835,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->default_ram_size = 512 * M_BYTE;
|
||||
mc->kvm_type = spapr_kvm_type;
|
||||
mc->has_dynamic_sysbus = true;
|
||||
mc->pci_allow_0_address = true;
|
||||
|
||||
fwc->get_dev_path = spapr_get_fw_dev_path;
|
||||
nc->nmi_monitor_handler = spapr_nmi;
|
||||
|
1
hw/smbios/Makefile.objs
Normal file
1
hw/smbios/Makefile.objs
Normal file
@ -0,0 +1 @@
|
||||
common-obj-$(CONFIG_SMBIOS) += smbios.o
|
@ -19,10 +19,9 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "hw/i386/pc.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "hw/loader.h"
|
||||
|
||||
#include "exec/cpu-common.h"
|
||||
|
||||
/* legacy structures and constants for <= 2.0 machines */
|
||||
struct smbios_header {
|
||||
@ -831,10 +830,12 @@ static void smbios_entry_point_setup(void)
|
||||
ep.structure_table_address = cpu_to_le32(0);
|
||||
}
|
||||
|
||||
void smbios_get_tables(uint8_t **tables, size_t *tables_len,
|
||||
void smbios_get_tables(const struct smbios_phys_mem_area *mem_array,
|
||||
const unsigned int mem_array_size,
|
||||
uint8_t **tables, size_t *tables_len,
|
||||
uint8_t **anchor, size_t *anchor_len)
|
||||
{
|
||||
unsigned i, dimm_cnt, instance;
|
||||
unsigned i, dimm_cnt;
|
||||
|
||||
if (smbios_legacy) {
|
||||
*tables = *anchor = NULL;
|
||||
@ -867,11 +868,9 @@ void smbios_get_tables(uint8_t **tables, size_t *tables_len,
|
||||
smbios_build_type_17_table(i, GET_DIMM_SZ);
|
||||
}
|
||||
|
||||
for (i = 0, instance = 0; i < e820_get_num_entries(); i++) {
|
||||
uint64_t address, length;
|
||||
if (e820_get_entry(i, E820_RAM, &address, &length)) {
|
||||
smbios_build_type_19_table(instance++, address, length);
|
||||
}
|
||||
for (i = 0; i < mem_array_size; i++) {
|
||||
smbios_build_type_19_table(i, mem_array[i].address,
|
||||
mem_array[i].length);
|
||||
}
|
||||
|
||||
smbios_build_type_32_table();
|
@ -100,7 +100,8 @@ struct MachineClass {
|
||||
no_cdrom:1,
|
||||
no_sdcard:1,
|
||||
has_dynamic_sysbus:1,
|
||||
no_tco:1;
|
||||
no_tco:1,
|
||||
pci_allow_0_address:1;
|
||||
int is_default;
|
||||
const char *default_machine_opts;
|
||||
const char *default_boot_order;
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define HW_PC_H
|
||||
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/typedefs.h"
|
||||
#include "exec/memory.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/isa/isa.h"
|
||||
@ -39,6 +40,7 @@ struct PCMachineState {
|
||||
OnOffAuto vmport;
|
||||
OnOffAuto smm;
|
||||
bool enforce_aligned_dimm;
|
||||
ram_addr_t below_4g_mem_size, above_4g_mem_size;
|
||||
};
|
||||
|
||||
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
|
||||
@ -61,9 +63,6 @@ struct PCMachineClass {
|
||||
DeviceState *dev);
|
||||
};
|
||||
|
||||
typedef struct PCMachineState PCMachineState;
|
||||
typedef struct PCMachineClass PCMachineClass;
|
||||
|
||||
#define TYPE_PC_MACHINE "generic-pc-machine"
|
||||
#define PC_MACHINE(obj) \
|
||||
OBJECT_CHECK(PCMachineState, (obj), TYPE_PC_MACHINE)
|
||||
@ -166,8 +165,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
|
||||
void pc_hot_add_cpu(const int64_t id, Error **errp);
|
||||
void pc_acpi_init(const char *default_dsdt);
|
||||
|
||||
PcGuestInfo *pc_guest_info_init(ram_addr_t below_4g_mem_size,
|
||||
ram_addr_t above_4g_mem_size);
|
||||
PcGuestInfo *pc_guest_info_init(PCMachineState *pcms);
|
||||
|
||||
void pc_set_legacy_acpi_data_size(void);
|
||||
|
||||
@ -182,15 +180,10 @@ void pc_set_legacy_acpi_data_size(void);
|
||||
void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory,
|
||||
MemoryRegion *pci_address_space);
|
||||
|
||||
FWCfgState *xen_load_linux(const char *kernel_filename,
|
||||
const char *kernel_cmdline,
|
||||
const char *initrd_filename,
|
||||
ram_addr_t below_4g_mem_size,
|
||||
FWCfgState *xen_load_linux(PCMachineState *pcms,
|
||||
PcGuestInfo *guest_info);
|
||||
FWCfgState *pc_memory_init(MachineState *machine,
|
||||
FWCfgState *pc_memory_init(PCMachineState *pcms,
|
||||
MemoryRegion *system_memory,
|
||||
ram_addr_t below_4g_mem_size,
|
||||
ram_addr_t above_4g_mem_size,
|
||||
MemoryRegion *rom_memory,
|
||||
MemoryRegion **ram_memory,
|
||||
PcGuestInfo *guest_info);
|
||||
@ -202,8 +195,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
|
||||
bool no_vmport,
|
||||
uint32 hpet_irqs);
|
||||
void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
|
||||
void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
||||
const char *boot_device, MachineState *machine,
|
||||
void pc_cmos_init(PCMachineState *pcms,
|
||||
BusState *ide0, BusState *ide1,
|
||||
ISADevice *s);
|
||||
void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
|
||||
@ -374,11 +366,111 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||
|
||||
#define PC_COMPAT_2_2 \
|
||||
PC_COMPAT_2_3 \
|
||||
HW_COMPAT_2_2
|
||||
HW_COMPAT_2_2 \
|
||||
{\
|
||||
.driver = "kvm64" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "kvm32" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Conroe" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Penryn" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Nehalem" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Westmere" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "SandyBridge" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Haswell" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Broadwell" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Opteron_G1" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Opteron_G2" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Opteron_G3" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Opteron_G4" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Opteron_G5" "-" TYPE_X86_CPU,\
|
||||
.property = "vme",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Haswell" "-" TYPE_X86_CPU,\
|
||||
.property = "f16c",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Haswell" "-" TYPE_X86_CPU,\
|
||||
.property = "rdrand",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Broadwell" "-" TYPE_X86_CPU,\
|
||||
.property = "f16c",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Broadwell" "-" TYPE_X86_CPU,\
|
||||
.property = "rdrand",\
|
||||
.value = "off",\
|
||||
},
|
||||
|
||||
#define PC_COMPAT_2_1 \
|
||||
PC_COMPAT_2_2 \
|
||||
HW_COMPAT_2_1
|
||||
HW_COMPAT_2_1 \
|
||||
{\
|
||||
.driver = "coreduo" "-" TYPE_X86_CPU,\
|
||||
.property = "vmx",\
|
||||
.value = "on",\
|
||||
},\
|
||||
{\
|
||||
.driver = "core2duo" "-" TYPE_X86_CPU,\
|
||||
.property = "vmx",\
|
||||
.value = "on",\
|
||||
},
|
||||
|
||||
#define PC_COMPAT_2_0 \
|
||||
PC_COMPAT_2_1 \
|
||||
@ -589,20 +681,18 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||
.driver = "486-" TYPE_X86_CPU,\
|
||||
.property = "model",\
|
||||
.value = stringify(0),\
|
||||
},\
|
||||
{\
|
||||
.driver = "n270" "-" TYPE_X86_CPU,\
|
||||
.property = "movbe",\
|
||||
.value = "off",\
|
||||
},\
|
||||
{\
|
||||
.driver = "Westmere" "-" TYPE_X86_CPU,\
|
||||
.property = "pclmulqdq",\
|
||||
.value = "off",\
|
||||
},
|
||||
|
||||
static inline void pc_common_machine_options(MachineClass *m)
|
||||
{
|
||||
m->default_boot_order = "cad";
|
||||
}
|
||||
|
||||
static inline void pc_default_machine_options(MachineClass *m)
|
||||
{
|
||||
pc_common_machine_options(m);
|
||||
m->hot_add_cpu = pc_hot_add_cpu;
|
||||
m->max_cpus = 255;
|
||||
}
|
||||
|
||||
#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
|
||||
static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
|
||||
{ \
|
||||
|
@ -17,13 +17,21 @@
|
||||
|
||||
#define SMBIOS_MAX_TYPE 127
|
||||
|
||||
/* memory area description, used by type 19 table */
|
||||
struct smbios_phys_mem_area {
|
||||
uint64_t address;
|
||||
uint64_t length;
|
||||
};
|
||||
|
||||
void smbios_entry_add(QemuOpts *opts);
|
||||
void smbios_set_cpuid(uint32_t version, uint32_t features);
|
||||
void smbios_set_defaults(const char *manufacturer, const char *product,
|
||||
const char *version, bool legacy_mode,
|
||||
bool uuid_encoded);
|
||||
uint8_t *smbios_get_table_legacy(size_t *length);
|
||||
void smbios_get_tables(uint8_t **tables, size_t *tables_len,
|
||||
void smbios_get_tables(const struct smbios_phys_mem_area *mem_array,
|
||||
const unsigned int mem_array_size,
|
||||
uint8_t **tables, size_t *tables_len,
|
||||
uint8_t **anchor, size_t *anchor_len);
|
||||
|
||||
/*
|
@ -48,7 +48,6 @@ typedef struct VirtIONetQueue {
|
||||
int tx_waiting;
|
||||
struct {
|
||||
VirtQueueElement elem;
|
||||
ssize_t len;
|
||||
} async_tx;
|
||||
struct VirtIONet *n;
|
||||
} VirtIONetQueue;
|
||||
|
@ -58,6 +58,8 @@ typedef struct PCIESlot PCIESlot;
|
||||
typedef struct PCIExpressDevice PCIExpressDevice;
|
||||
typedef struct PCIExpressHost PCIExpressHost;
|
||||
typedef struct PCIHostState PCIHostState;
|
||||
typedef struct PCMachineState PCMachineState;
|
||||
typedef struct PCMachineClass PCMachineClass;
|
||||
typedef struct PCMCIACardState PCMCIACardState;
|
||||
typedef struct PixelFormat PixelFormat;
|
||||
typedef struct PropertyInfo PropertyInfo;
|
||||
|
@ -17,7 +17,7 @@ MAKEFLAGS += -rR
|
||||
QEMU_CXXFLAGS = -D__STDC_LIMIT_MACROS $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wredundant-decls, $(QEMU_CFLAGS))
|
||||
|
||||
# Flags for dependency generation
|
||||
QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
|
||||
QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(@D)/$(*F).d
|
||||
|
||||
# Same as -I$(SRC_PATH) -I., but for the nested source/object directories
|
||||
QEMU_INCLUDES += -I$(<D) -I$(@D)
|
||||
@ -368,6 +368,6 @@ define unnest-vars
|
||||
$(error $o added in $v but $o-objs is not set)))
|
||||
$(shell mkdir -p ./ $(sort $(dir $($v))))
|
||||
# Include all the .d files
|
||||
$(eval -include $(addsuffix *.d, $(sort $(dir $($v)))))
|
||||
$(eval -include $(patsubst %.o,%.d,$(patsubst %.mo,%.d,$($v))))
|
||||
$(eval $v := $(filter-out %/,$($v))))
|
||||
endef
|
||||
|
@ -1392,32 +1392,6 @@ static X86CPUDefinition builtin_x86_defs[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* x86_cpu_compat_set_features:
|
||||
* @cpu_model: CPU model name to be changed. If NULL, all CPU models are changed
|
||||
* @w: Identifies the feature word to be changed.
|
||||
* @feat_add: Feature bits to be added to feature word
|
||||
* @feat_remove: Feature bits to be removed from feature word
|
||||
*
|
||||
* Change CPU model feature bits for compatibility.
|
||||
*
|
||||
* This function may be used by machine-type compatibility functions
|
||||
* to enable or disable feature bits on specific CPU models.
|
||||
*/
|
||||
void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w,
|
||||
uint32_t feat_add, uint32_t feat_remove)
|
||||
{
|
||||
X86CPUDefinition *def;
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
|
||||
def = &builtin_x86_defs[i];
|
||||
if (!cpu_model || !strcmp(cpu_model, def->name)) {
|
||||
def->features[w] |= feat_add;
|
||||
def->features[w] &= ~feat_remove;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
bool migratable_only);
|
||||
|
||||
|
@ -1332,9 +1332,6 @@ void cpu_smm_update(X86CPU *cpu);
|
||||
|
||||
void cpu_report_tpr_access(CPUX86State *env, TPRAccess access);
|
||||
|
||||
void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w,
|
||||
uint32_t feat_add, uint32_t feat_remove);
|
||||
|
||||
void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features);
|
||||
void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features);
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "libqtest.h"
|
||||
#include "qemu/compiler.h"
|
||||
#include "hw/acpi/acpi-defs.h"
|
||||
#include "hw/i386/smbios.h"
|
||||
#include "hw/smbios/smbios.h"
|
||||
#include "qemu/bitmap.h"
|
||||
|
||||
#define MACHINE_PC "pc"
|
||||
|
Loading…
Reference in New Issue
Block a user