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:
Michael S. Tsirkin 2014-11-17 07:51:50 +02:00
parent 60786ef339
commit a1666142db
4 changed files with 32 additions and 12 deletions

View File

@ -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;
} }

View File

@ -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));

View File

@ -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)

View File

@ -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