acpi-build: make ROMs RAM blocks resizeable
Use resizeable ram API so we can painlessly extend ROMs in the future. Note: migration is not affected, as we are not actually changing the used length for RAM, which is the part that's migrated. Use this in acpi: reserve x16 more RAM space. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
60786ef339
commit
a1666142db
@ -712,12 +712,22 @@ static void rom_insert(Rom *rom)
|
|||||||
QTAILQ_INSERT_TAIL(&roms, rom, next);
|
QTAILQ_INSERT_TAIL(&roms, rom, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fw_cfg_resized(const char *id, uint64_t length, void *host)
|
||||||
|
{
|
||||||
|
if (fw_cfg) {
|
||||||
|
fw_cfg_modify_file(fw_cfg, id + strlen("/rom@"), host, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void *rom_set_mr(Rom *rom, Object *owner, const char *name)
|
static void *rom_set_mr(Rom *rom, Object *owner, const char *name)
|
||||||
{
|
{
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
rom->mr = g_malloc(sizeof(*rom->mr));
|
rom->mr = g_malloc(sizeof(*rom->mr));
|
||||||
memory_region_init_ram(rom->mr, owner, name, rom->datasize, &error_abort);
|
memory_region_init_resizeable_ram(rom->mr, owner, name,
|
||||||
|
rom->datasize, rom->romsize,
|
||||||
|
fw_cfg_resized,
|
||||||
|
&error_abort);
|
||||||
memory_region_set_readonly(rom->mr, true);
|
memory_region_set_readonly(rom->mr, true);
|
||||||
vmstate_register_ram_global(rom->mr);
|
vmstate_register_ram_global(rom->mr);
|
||||||
|
|
||||||
@ -812,7 +822,7 @@ err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
hwaddr addr, const char *fw_file_name,
|
size_t max_len, hwaddr addr, const char *fw_file_name,
|
||||||
FWCfgReadCallback fw_callback, void *callback_opaque)
|
FWCfgReadCallback fw_callback, void *callback_opaque)
|
||||||
{
|
{
|
||||||
Rom *rom;
|
Rom *rom;
|
||||||
@ -821,7 +831,7 @@ ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
|||||||
rom = g_malloc0(sizeof(*rom));
|
rom = g_malloc0(sizeof(*rom));
|
||||||
rom->name = g_strdup(name);
|
rom->name = g_strdup(name);
|
||||||
rom->addr = addr;
|
rom->addr = addr;
|
||||||
rom->romsize = len;
|
rom->romsize = max_len ? max_len : len;
|
||||||
rom->datasize = len;
|
rom->datasize = len;
|
||||||
rom->data = g_malloc0(rom->datasize);
|
rom->data = g_malloc0(rom->datasize);
|
||||||
memcpy(rom->data, blob, len);
|
memcpy(rom->data, blob, len);
|
||||||
@ -841,7 +851,7 @@ ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
|||||||
|
|
||||||
fw_cfg_add_file_callback(fw_cfg, fw_file_name,
|
fw_cfg_add_file_callback(fw_cfg, fw_file_name,
|
||||||
fw_callback, callback_opaque,
|
fw_callback, callback_opaque,
|
||||||
data, rom->romsize);
|
data, rom->datasize);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,9 @@
|
|||||||
|
|
||||||
#define ACPI_BUILD_TABLE_SIZE 0x20000
|
#define ACPI_BUILD_TABLE_SIZE 0x20000
|
||||||
|
|
||||||
|
/* Reserve RAM space for tables: add another order of magnitude. */
|
||||||
|
#define ACPI_BUILD_TABLE_MAX_SIZE 0x200000
|
||||||
|
|
||||||
/* #define DEBUG_ACPI_BUILD */
|
/* #define DEBUG_ACPI_BUILD */
|
||||||
#ifdef DEBUG_ACPI_BUILD
|
#ifdef DEBUG_ACPI_BUILD
|
||||||
#define ACPI_BUILD_DPRINTF(fmt, ...) \
|
#define ACPI_BUILD_DPRINTF(fmt, ...) \
|
||||||
@ -1718,6 +1721,11 @@ static void acpi_build_update(void *build_opaque, uint32_t offset)
|
|||||||
acpi_build(build_state->guest_info, &tables);
|
acpi_build(build_state->guest_info, &tables);
|
||||||
|
|
||||||
assert(acpi_data_len(tables.table_data) == build_state->table_size);
|
assert(acpi_data_len(tables.table_data) == build_state->table_size);
|
||||||
|
|
||||||
|
/* Make sure RAM size is correct - in case it got changed by migration */
|
||||||
|
qemu_ram_resize(build_state->table_ram, build_state->table_size,
|
||||||
|
&error_abort);
|
||||||
|
|
||||||
memcpy(qemu_get_ram_ptr(build_state->table_ram), tables.table_data->data,
|
memcpy(qemu_get_ram_ptr(build_state->table_ram), tables.table_data->data,
|
||||||
build_state->table_size);
|
build_state->table_size);
|
||||||
|
|
||||||
@ -1734,10 +1742,10 @@ static void acpi_build_reset(void *build_opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ram_addr_t acpi_add_rom_blob(AcpiBuildState *build_state, GArray *blob,
|
static ram_addr_t acpi_add_rom_blob(AcpiBuildState *build_state, GArray *blob,
|
||||||
const char *name)
|
const char *name, uint64_t max_size)
|
||||||
{
|
{
|
||||||
return rom_add_blob(name, blob->data, acpi_data_len(blob), -1, name,
|
return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1,
|
||||||
acpi_build_update, build_state);
|
name, acpi_build_update, build_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_acpi_build = {
|
static const VMStateDescription vmstate_acpi_build = {
|
||||||
@ -1781,11 +1789,12 @@ void acpi_setup(PcGuestInfo *guest_info)
|
|||||||
|
|
||||||
/* Now expose it all to Guest */
|
/* Now expose it all to Guest */
|
||||||
build_state->table_ram = acpi_add_rom_blob(build_state, tables.table_data,
|
build_state->table_ram = acpi_add_rom_blob(build_state, tables.table_data,
|
||||||
ACPI_BUILD_TABLE_FILE);
|
ACPI_BUILD_TABLE_FILE,
|
||||||
|
ACPI_BUILD_TABLE_MAX_SIZE);
|
||||||
assert(build_state->table_ram != RAM_ADDR_MAX);
|
assert(build_state->table_ram != RAM_ADDR_MAX);
|
||||||
build_state->table_size = acpi_data_len(tables.table_data);
|
build_state->table_size = acpi_data_len(tables.table_data);
|
||||||
|
|
||||||
acpi_add_rom_blob(NULL, tables.linker, "etc/table-loader");
|
acpi_add_rom_blob(NULL, tables.linker, "etc/table-loader", 0);
|
||||||
|
|
||||||
fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
|
fw_cfg_add_file(guest_info->fw_cfg, ACPI_BUILD_TPMLOG_FILE,
|
||||||
tables.tcpalog->data, acpi_data_len(tables.tcpalog));
|
tables.tcpalog->data, acpi_data_len(tables.tcpalog));
|
||||||
|
@ -73,7 +73,8 @@ static inline void hwsetup_free(HWSetup *hw)
|
|||||||
static inline void hwsetup_create_rom(HWSetup *hw,
|
static inline void hwsetup_create_rom(HWSetup *hw,
|
||||||
hwaddr base)
|
hwaddr base)
|
||||||
{
|
{
|
||||||
rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base, NULL, NULL, NULL);
|
rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE,
|
||||||
|
TARGET_PAGE_SIZE, base, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
|
static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
|
||||||
|
@ -60,7 +60,7 @@ int rom_add_file(const char *file, const char *fw_dir,
|
|||||||
hwaddr addr, int32_t bootindex,
|
hwaddr addr, int32_t bootindex,
|
||||||
bool option_rom);
|
bool option_rom);
|
||||||
ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
ram_addr_t rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
hwaddr addr, const char *fw_file_name,
|
size_t max_len, hwaddr addr, const char *fw_file_name,
|
||||||
FWCfgReadCallback fw_callback, void *callback_opaque);
|
FWCfgReadCallback fw_callback, void *callback_opaque);
|
||||||
int rom_add_elf_program(const char *name, void *data, size_t datasize,
|
int rom_add_elf_program(const char *name, void *data, size_t datasize,
|
||||||
size_t romsize, hwaddr addr);
|
size_t romsize, hwaddr addr);
|
||||||
@ -74,7 +74,7 @@ void do_info_roms(Monitor *mon, const QDict *qdict);
|
|||||||
#define rom_add_file_fixed(_f, _a, _i) \
|
#define rom_add_file_fixed(_f, _a, _i) \
|
||||||
rom_add_file(_f, NULL, _a, _i, false)
|
rom_add_file(_f, NULL, _a, _i, false)
|
||||||
#define rom_add_blob_fixed(_f, _b, _l, _a) \
|
#define rom_add_blob_fixed(_f, _b, _l, _a) \
|
||||||
rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL)
|
rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL)
|
||||||
|
|
||||||
#define PC_ROM_MIN_VGA 0xc0000
|
#define PC_ROM_MIN_VGA 0xc0000
|
||||||
#define PC_ROM_MIN_OPTION 0xc8000
|
#define PC_ROM_MIN_OPTION 0xc8000
|
||||||
|
Loading…
Reference in New Issue
Block a user