mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/kraxel/tags/pull-smbios-2' into staging
smbios: make qemu generate smbios tables. # gpg: Signature made Mon 05 May 2014 12:20:27 BST using RSA key ID D3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" * remotes/kraxel/tags/pull-smbios-2: SMBIOS: Build aggregate smbios tables and entry point SMBIOS: Use bitmaps to prevent incompatible comand line options SMBIOS: Use macro to set smbios defaults SMBIOS: Update header file definitions SMBIOS: Rename symbols to better reflect future use E820: Add interface for accessing e820 table pc: add 2.1 machine type Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+34
-5
@@ -612,6 +612,21 @@ int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
|
||||
return e820_entries;
|
||||
}
|
||||
|
||||
int e820_get_num_entries(void)
|
||||
{
|
||||
return e820_entries;
|
||||
}
|
||||
|
||||
bool e820_get_entry(int idx, uint32_t type, uint64_t *address, uint64_t *length)
|
||||
{
|
||||
if (idx < e820_entries && e820_table[idx].type == cpu_to_le32(type)) {
|
||||
*address = le64_to_cpu(e820_table[idx].address);
|
||||
*length = le64_to_cpu(e820_table[idx].length);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Calculates the limit to CPU APIC ID values
|
||||
*
|
||||
* This function returns the limit for the APIC ID value, so that all
|
||||
@@ -627,8 +642,8 @@ static unsigned int pc_apic_id_limit(unsigned int max_cpus)
|
||||
static FWCfgState *bochs_bios_init(void)
|
||||
{
|
||||
FWCfgState *fw_cfg;
|
||||
uint8_t *smbios_table;
|
||||
size_t smbios_len;
|
||||
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);
|
||||
@@ -655,10 +670,21 @@ 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_table = smbios_get_table(&smbios_len);
|
||||
if (smbios_table)
|
||||
smbios_tables = smbios_get_table_legacy(&smbios_tables_len);
|
||||
if (smbios_tables) {
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
|
||||
smbios_table, smbios_len);
|
||||
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);
|
||||
}
|
||||
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_E820_TABLE,
|
||||
&e820_reserve, sizeof(e820_reserve));
|
||||
fw_cfg_add_file(fw_cfg, "etc/e820", e820_table,
|
||||
@@ -1027,6 +1053,9 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
|
||||
sysbus_mmio_map_overlap(SYS_BUS_DEVICE(icc_bridge), 0,
|
||||
APIC_DEFAULT_ADDRESS, 0x1000);
|
||||
}
|
||||
|
||||
/* tell smbios about cpuid version and features */
|
||||
smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]);
|
||||
}
|
||||
|
||||
/* pci-info ROM file. Little endian format */
|
||||
|
||||
+33
-11
@@ -60,7 +60,8 @@ static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
|
||||
|
||||
static bool has_pci_info;
|
||||
static bool has_acpi_build = true;
|
||||
static bool smbios_type1_defaults = true;
|
||||
static bool smbios_defaults = true;
|
||||
static bool smbios_legacy_mode;
|
||||
/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
|
||||
* host addresses aligned at 1Gbyte boundaries. This way we can use 1GByte
|
||||
* pages in the host.
|
||||
@@ -143,10 +144,10 @@ static void pc_init1(QEMUMachineInitArgs *args,
|
||||
guest_info->has_pci_info = has_pci_info;
|
||||
guest_info->isapc_ram_fw = !pci_enabled;
|
||||
|
||||
if (smbios_type1_defaults) {
|
||||
if (smbios_defaults) {
|
||||
/* These values are guest ABI, do not change */
|
||||
smbios_set_type1_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
|
||||
args->machine->name);
|
||||
smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
|
||||
args->machine->name, smbios_legacy_mode);
|
||||
}
|
||||
|
||||
/* allocate ram and load rom/bios */
|
||||
@@ -262,9 +263,15 @@ static void pc_init_pci(QEMUMachineInitArgs *args)
|
||||
pc_init1(args, 1, 1);
|
||||
}
|
||||
|
||||
static void pc_compat_2_0(QEMUMachineInitArgs *args)
|
||||
{
|
||||
smbios_legacy_mode = true;
|
||||
}
|
||||
|
||||
static void pc_compat_1_7(QEMUMachineInitArgs *args)
|
||||
{
|
||||
smbios_type1_defaults = false;
|
||||
pc_compat_2_0(args);
|
||||
smbios_defaults = false;
|
||||
gigabyte_align = false;
|
||||
option_rom_has_mr = true;
|
||||
x86_cpu_compat_disable_kvm_features(FEAT_1_ECX, CPUID_EXT_X2APIC);
|
||||
@@ -303,6 +310,12 @@ static void pc_compat_1_2(QEMUMachineInitArgs *args)
|
||||
x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI);
|
||||
}
|
||||
|
||||
static void pc_init_pci_2_0(QEMUMachineInitArgs *args)
|
||||
{
|
||||
pc_compat_2_0(args);
|
||||
pc_init_pci(args);
|
||||
}
|
||||
|
||||
static void pc_init_pci_1_7(QEMUMachineInitArgs *args)
|
||||
{
|
||||
pc_compat_1_7(args);
|
||||
@@ -345,7 +358,7 @@ static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
|
||||
{
|
||||
has_pci_info = false;
|
||||
has_acpi_build = false;
|
||||
smbios_type1_defaults = false;
|
||||
smbios_defaults = false;
|
||||
x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI);
|
||||
enable_compat_apic_id_mode();
|
||||
pc_init1(args, 1, 0);
|
||||
@@ -355,7 +368,7 @@ static void pc_init_isa(QEMUMachineInitArgs *args)
|
||||
{
|
||||
has_pci_info = false;
|
||||
has_acpi_build = false;
|
||||
smbios_type1_defaults = false;
|
||||
smbios_defaults = false;
|
||||
if (!args->cpu_model) {
|
||||
args->cpu_model = "486";
|
||||
}
|
||||
@@ -383,16 +396,24 @@ static void pc_xen_hvm_init(QEMUMachineInitArgs *args)
|
||||
.desc = "Standard PC (i440FX + PIIX, 1996)", \
|
||||
.hot_add_cpu = pc_hot_add_cpu
|
||||
|
||||
#define PC_I440FX_2_0_MACHINE_OPTIONS \
|
||||
#define PC_I440FX_2_1_MACHINE_OPTIONS \
|
||||
PC_I440FX_MACHINE_OPTIONS, \
|
||||
.default_machine_opts = "firmware=bios-256k.bin"
|
||||
|
||||
static QEMUMachine pc_i440fx_machine_v2_1 = {
|
||||
PC_I440FX_2_1_MACHINE_OPTIONS,
|
||||
.name = "pc-i440fx-2.1",
|
||||
.alias = "pc",
|
||||
.init = pc_init_pci,
|
||||
.is_default = 1,
|
||||
};
|
||||
|
||||
#define PC_I440FX_2_0_MACHINE_OPTIONS PC_I440FX_2_1_MACHINE_OPTIONS
|
||||
|
||||
static QEMUMachine pc_i440fx_machine_v2_0 = {
|
||||
PC_I440FX_2_0_MACHINE_OPTIONS,
|
||||
.name = "pc-i440fx-2.0",
|
||||
.alias = "pc",
|
||||
.init = pc_init_pci,
|
||||
.is_default = 1,
|
||||
.init = pc_init_pci_2_0,
|
||||
};
|
||||
|
||||
#define PC_I440FX_1_7_MACHINE_OPTIONS PC_I440FX_MACHINE_OPTIONS
|
||||
@@ -817,6 +838,7 @@ static QEMUMachine xenfv_machine = {
|
||||
|
||||
static void pc_machine_init(void)
|
||||
{
|
||||
qemu_register_machine(&pc_i440fx_machine_v2_1);
|
||||
qemu_register_machine(&pc_i440fx_machine_v2_0);
|
||||
qemu_register_machine(&pc_i440fx_machine_v1_7);
|
||||
qemu_register_machine(&pc_i440fx_machine_v1_6);
|
||||
|
||||
+30
-8
@@ -50,7 +50,8 @@
|
||||
|
||||
static bool has_pci_info;
|
||||
static bool has_acpi_build = true;
|
||||
static bool smbios_type1_defaults = true;
|
||||
static bool smbios_defaults = true;
|
||||
static bool smbios_legacy_mode;
|
||||
/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
|
||||
* host addresses aligned at 1Gbyte boundaries. This way we can use 1GByte
|
||||
* pages in the host.
|
||||
@@ -130,10 +131,10 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
|
||||
guest_info->isapc_ram_fw = false;
|
||||
guest_info->has_acpi_build = has_acpi_build;
|
||||
|
||||
if (smbios_type1_defaults) {
|
||||
if (smbios_defaults) {
|
||||
/* These values are guest ABI, do not change */
|
||||
smbios_set_type1_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
|
||||
args->machine->name);
|
||||
smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
|
||||
args->machine->name, smbios_legacy_mode);
|
||||
}
|
||||
|
||||
/* allocate ram and load rom/bios */
|
||||
@@ -240,9 +241,15 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
|
||||
}
|
||||
}
|
||||
|
||||
static void pc_compat_2_0(QEMUMachineInitArgs *args)
|
||||
{
|
||||
smbios_legacy_mode = true;
|
||||
}
|
||||
|
||||
static void pc_compat_1_7(QEMUMachineInitArgs *args)
|
||||
{
|
||||
smbios_type1_defaults = false;
|
||||
pc_compat_2_0(args);
|
||||
smbios_defaults = false;
|
||||
gigabyte_align = false;
|
||||
option_rom_has_mr = true;
|
||||
x86_cpu_compat_disable_kvm_features(FEAT_1_ECX, CPUID_EXT_X2APIC);
|
||||
@@ -268,6 +275,12 @@ static void pc_compat_1_4(QEMUMachineInitArgs *args)
|
||||
x86_cpu_compat_set_features("Westmere", FEAT_1_ECX, 0, CPUID_EXT_PCLMULQDQ);
|
||||
}
|
||||
|
||||
static void pc_q35_init_2_0(QEMUMachineInitArgs *args)
|
||||
{
|
||||
pc_compat_2_0(args);
|
||||
pc_q35_init(args);
|
||||
}
|
||||
|
||||
static void pc_q35_init_1_7(QEMUMachineInitArgs *args)
|
||||
{
|
||||
pc_compat_1_7(args);
|
||||
@@ -297,15 +310,23 @@ static void pc_q35_init_1_4(QEMUMachineInitArgs *args)
|
||||
.desc = "Standard PC (Q35 + ICH9, 2009)", \
|
||||
.hot_add_cpu = pc_hot_add_cpu
|
||||
|
||||
#define PC_Q35_2_0_MACHINE_OPTIONS \
|
||||
#define PC_Q35_2_1_MACHINE_OPTIONS \
|
||||
PC_Q35_MACHINE_OPTIONS, \
|
||||
.default_machine_opts = "firmware=bios-256k.bin"
|
||||
|
||||
static QEMUMachine pc_q35_machine_v2_1 = {
|
||||
PC_Q35_2_1_MACHINE_OPTIONS,
|
||||
.name = "pc-q35-2.1",
|
||||
.alias = "q35",
|
||||
.init = pc_q35_init,
|
||||
};
|
||||
|
||||
#define PC_Q35_2_0_MACHINE_OPTIONS PC_Q35_2_1_MACHINE_OPTIONS
|
||||
|
||||
static QEMUMachine pc_q35_machine_v2_0 = {
|
||||
PC_Q35_2_0_MACHINE_OPTIONS,
|
||||
.name = "pc-q35-2.0",
|
||||
.alias = "q35",
|
||||
.init = pc_q35_init,
|
||||
.init = pc_q35_init_2_0,
|
||||
};
|
||||
|
||||
#define PC_Q35_1_7_MACHINE_OPTIONS PC_Q35_MACHINE_OPTIONS
|
||||
@@ -358,6 +379,7 @@ static QEMUMachine pc_q35_machine_v1_4 = {
|
||||
|
||||
static void pc_q35_machine_init(void)
|
||||
{
|
||||
qemu_register_machine(&pc_q35_machine_v2_1);
|
||||
qemu_register_machine(&pc_q35_machine_v2_0);
|
||||
qemu_register_machine(&pc_q35_machine_v1_7);
|
||||
qemu_register_machine(&pc_q35_machine_v1_6);
|
||||
|
||||
+729
-60
File diff suppressed because it is too large
Load Diff
@@ -239,6 +239,8 @@ uint16_t pvpanic_port(void);
|
||||
#define E820_UNUSABLE 5
|
||||
|
||||
int e820_add_entry(uint64_t, uint64_t, uint32_t);
|
||||
int e820_get_num_entries(void);
|
||||
bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||
|
||||
#define PC_Q35_COMPAT_1_7 \
|
||||
PC_COMPAT_1_7, \
|
||||
|
||||
+74
-25
@@ -15,15 +15,40 @@
|
||||
|
||||
#include "qemu/option.h"
|
||||
|
||||
#define SMBIOS_MAX_TYPE 127
|
||||
|
||||
void smbios_entry_add(QemuOpts *opts);
|
||||
void smbios_set_type1_defaults(const char *manufacturer,
|
||||
const char *product, const char *version);
|
||||
uint8_t *smbios_get_table(size_t *length);
|
||||
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);
|
||||
uint8_t *smbios_get_table_legacy(size_t *length);
|
||||
void smbios_get_tables(uint8_t **tables, size_t *tables_len,
|
||||
uint8_t **anchor, size_t *anchor_len);
|
||||
|
||||
/*
|
||||
* SMBIOS spec defined tables
|
||||
*/
|
||||
|
||||
/* SMBIOS entry point (anchor).
|
||||
* BIOS must place this at a 16-bit-aligned address between 0xf0000 and 0xfffff.
|
||||
*/
|
||||
struct smbios_entry_point {
|
||||
uint8_t anchor_string[4];
|
||||
uint8_t checksum;
|
||||
uint8_t length;
|
||||
uint8_t smbios_major_version;
|
||||
uint8_t smbios_minor_version;
|
||||
uint16_t max_structure_size;
|
||||
uint8_t entry_point_revision;
|
||||
uint8_t formatted_area[5];
|
||||
uint8_t intermediate_anchor_string[5];
|
||||
uint8_t intermediate_checksum;
|
||||
uint16_t structure_table_length;
|
||||
uint32_t structure_table_address;
|
||||
uint16_t number_of_structures;
|
||||
uint8_t smbios_bcd_revision;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* This goes at the beginning of every SMBIOS structure. */
|
||||
struct smbios_structure_header {
|
||||
uint8_t type;
|
||||
@@ -60,7 +85,23 @@ struct smbios_type_1 {
|
||||
uint8_t family_str;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 3 - System Enclosure (v2.3) */
|
||||
/* SMBIOS type 2 - Base Board */
|
||||
struct smbios_type_2 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t manufacturer_str;
|
||||
uint8_t product_str;
|
||||
uint8_t version_str;
|
||||
uint8_t serial_number_str;
|
||||
uint8_t asset_tag_number_str;
|
||||
uint8_t feature_flags;
|
||||
uint8_t location_str;
|
||||
uint16_t chassis_handle;
|
||||
uint8_t board_type;
|
||||
uint8_t contained_element_count;
|
||||
/* contained elements follow */
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 3 - System Enclosure (v2.7) */
|
||||
struct smbios_type_3 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t manufacturer_str;
|
||||
@@ -76,10 +117,11 @@ struct smbios_type_3 {
|
||||
uint8_t height;
|
||||
uint8_t number_of_power_cords;
|
||||
uint8_t contained_element_count;
|
||||
// contained elements follow
|
||||
uint8_t sku_number_str;
|
||||
/* contained elements follow */
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 4 - Processor Information (v2.0) */
|
||||
/* SMBIOS type 4 - Processor Information (v2.6) */
|
||||
struct smbios_type_4 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t socket_designation_str;
|
||||
@@ -97,11 +139,17 @@ struct smbios_type_4 {
|
||||
uint16_t l1_cache_handle;
|
||||
uint16_t l2_cache_handle;
|
||||
uint16_t l3_cache_handle;
|
||||
uint8_t serial_number_str;
|
||||
uint8_t asset_tag_number_str;
|
||||
uint8_t part_number_str;
|
||||
uint8_t core_count;
|
||||
uint8_t core_enabled;
|
||||
uint8_t thread_count;
|
||||
uint16_t processor_characteristics;
|
||||
uint16_t processor_family2;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 16 - Physical Memory Array
|
||||
* Associated with one type 17 (Memory Device).
|
||||
*/
|
||||
/* SMBIOS type 16 - Physical Memory Array (v2.7) */
|
||||
struct smbios_type_16 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t location;
|
||||
@@ -110,10 +158,10 @@ struct smbios_type_16 {
|
||||
uint32_t maximum_capacity;
|
||||
uint16_t memory_error_information_handle;
|
||||
uint16_t number_of_memory_devices;
|
||||
uint64_t extended_maximum_capacity;
|
||||
} QEMU_PACKED;
|
||||
/* SMBIOS type 17 - Memory Device
|
||||
* Associated with one type 19
|
||||
*/
|
||||
|
||||
/* SMBIOS type 17 - Memory Device (v2.8) */
|
||||
struct smbios_type_17 {
|
||||
struct smbios_structure_header header;
|
||||
uint16_t physical_memory_array_handle;
|
||||
@@ -127,27 +175,28 @@ struct smbios_type_17 {
|
||||
uint8_t bank_locator_str;
|
||||
uint8_t memory_type;
|
||||
uint16_t type_detail;
|
||||
uint16_t speed;
|
||||
uint8_t manufacturer_str;
|
||||
uint8_t serial_number_str;
|
||||
uint8_t asset_tag_number_str;
|
||||
uint8_t part_number_str;
|
||||
uint8_t attributes;
|
||||
uint32_t extended_size;
|
||||
uint32_t configured_clock_speed;
|
||||
uint32_t minimum_voltage;
|
||||
uint32_t maximum_voltage;
|
||||
uint32_t configured_voltage;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 19 - Memory Array Mapped Address */
|
||||
/* SMBIOS type 19 - Memory Array Mapped Address (v2.7) */
|
||||
struct smbios_type_19 {
|
||||
struct smbios_structure_header header;
|
||||
uint32_t starting_address;
|
||||
uint32_t ending_address;
|
||||
uint16_t memory_array_handle;
|
||||
uint8_t partition_width;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 20 - Memory Device Mapped Address */
|
||||
struct smbios_type_20 {
|
||||
struct smbios_structure_header header;
|
||||
uint32_t starting_address;
|
||||
uint32_t ending_address;
|
||||
uint16_t memory_device_handle;
|
||||
uint16_t memory_array_mapped_address_handle;
|
||||
uint8_t partition_row_position;
|
||||
uint8_t interleave_position;
|
||||
uint8_t interleaved_data_depth;
|
||||
uint64_t extended_starting_address;
|
||||
uint64_t extended_ending_address;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 32 - System Boot Information */
|
||||
|
||||
Reference in New Issue
Block a user