From: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
To: "Michael S. Tsirkin" <mst@redhat.com>, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Juan Quintela <quintela@redhat.com>,
dgilbert@redhat.com, Michael Walle <michael@walle.cc>,
Anthony Liguori <aliguori@amazon.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PULL 8/8] acpi-build: make ROMs RAM blocks resizeable
Date: Tue, 30 Dec 2014 15:47:44 +0200 [thread overview]
Message-ID: <54A2AD00.3070807@gmail.com> (raw)
In-Reply-To: <1419421800-27505-9-git-send-email-mst@redhat.com>
On 12/24/2014 01:51 PM, Michael S. Tsirkin wrote:
> 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>
> ---
> hw/lm32/lm32_hwsetup.h | 3 ++-
> include/hw/loader.h | 4 ++--
> hw/core/loader.c | 18 ++++++++++++++----
> hw/i386/acpi-build.c | 19 ++++++++++++++-----
> 4 files changed, 32 insertions(+), 12 deletions(-)
>
> diff --git a/hw/lm32/lm32_hwsetup.h b/hw/lm32/lm32_hwsetup.h
> index 9fd5e69..838754d 100644
> --- a/hw/lm32/lm32_hwsetup.h
> +++ b/hw/lm32/lm32_hwsetup.h
> @@ -73,7 +73,8 @@ static inline void hwsetup_free(HWSetup *hw)
> static inline void hwsetup_create_rom(HWSetup *hw,
> 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)
> diff --git a/include/hw/loader.h b/include/hw/loader.h
> index 6481639..1d76108 100644
> --- a/include/hw/loader.h
> +++ b/include/hw/loader.h
> @@ -60,7 +60,7 @@ int rom_add_file(const char *file, const char *fw_dir,
> hwaddr addr, int32_t bootindex,
> bool option_rom);
> 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);
> int rom_add_elf_program(const char *name, void *data, size_t datasize,
> 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) \
> rom_add_file(_f, NULL, _a, _i, false)
> #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_OPTION 0xc8000
> diff --git a/hw/core/loader.c b/hw/core/loader.c
> index 7527fd3..d3f8501 100644
> --- a/hw/core/loader.c
> +++ b/hw/core/loader.c
> @@ -712,12 +712,22 @@ static void rom_insert(Rom *rom)
> 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)
> {
> void *data;
>
> 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);
> 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,
> - hwaddr addr, const char *fw_file_name,
> + size_t max_len, hwaddr addr, const char *fw_file_name,
> FWCfgReadCallback fw_callback, void *callback_opaque)
> {
> 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->name = g_strdup(name);
> rom->addr = addr;
> - rom->romsize = len;
> + rom->romsize = max_len ? max_len : len;
> rom->datasize = len;
> rom->data = g_malloc0(rom->datasize);
> 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_callback, callback_opaque,
> - data, rom->romsize);
> + data, rom->datasize);
> }
> return ret;
> }
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index a4d0c0c..6a2e9c5 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -68,6 +68,9 @@
>
> #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 */
> #ifdef DEBUG_ACPI_BUILD
> #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);
>
> 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);
I also need this functionality for an ongoing series, in which the SSDT
table changes its size between the first "build" and after the bios computes
the io/mem regions.
> +
> memcpy(qemu_get_ram_ptr(build_state->table_ram), tables.table_data->data,
> 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,
> - const char *name)
> + const char *name, uint64_t max_size)
> {
> - return rom_add_blob(name, blob->data, acpi_data_len(blob), -1, name,
> - acpi_build_update, build_state);
> + return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1,
> + name, acpi_build_update, build_state);
> }
>
> static const VMStateDescription vmstate_acpi_build = {
> @@ -1781,11 +1789,12 @@ void acpi_setup(PcGuestInfo *guest_info)
>
> /* Now expose it all to Guest */
> 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);
> 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,
> tables.tcpalog->data, acpi_data_len(tables.tcpalog));
>
Acked-by: Marcel Apfelbaum <marcel@redhat.com>
next prev parent reply other threads:[~2014-12-30 13:47 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-24 11:51 [Qemu-devel] [PULL 0/8] pc: resizeable ROM blocks Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 1/8] cpu: add cpu_physical_memory_clear_dirty_range_nocode Michael S. Tsirkin
2015-01-07 7:16 ` Paolo Bonzini
2014-12-24 11:51 ` [Qemu-devel] [PULL 2/8] memory: add memory_region_set_size Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 3/8] exec: cpu_physical_memory_set/clear_dirty_range Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 4/8] exec: split length -> used_length/max_length Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 5/8] exec: qemu_ram_alloc_resizeable, qemu_ram_resize Michael S. Tsirkin
2015-01-07 7:18 ` Paolo Bonzini
2015-01-07 9:55 ` Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 6/8] arch_init: support resizing on incoming migration Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 7/8] memory: API to allocate resizeable RAM MR Michael S. Tsirkin
2014-12-24 11:51 ` [Qemu-devel] [PULL 8/8] acpi-build: make ROMs RAM blocks resizeable Michael S. Tsirkin
2014-12-30 13:47 ` Marcel Apfelbaum [this message]
2014-12-24 12:25 ` [Qemu-devel] [PULL 0/8] pc: resizeable ROM blocks Paolo Bonzini
2014-12-24 12:40 ` Peter Maydell
2014-12-24 12:41 ` Michael S. Tsirkin
2015-01-07 7:33 ` Paolo Bonzini
2015-01-07 10:03 ` Michael S. Tsirkin
2015-01-07 10:52 ` Paolo Bonzini
2015-01-07 12:37 ` Michael S. Tsirkin
2015-01-07 12:59 ` Paolo Bonzini
2015-01-19 14:04 ` Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54A2AD00.3070807@gmail.com \
--to=marcel.apfelbaum@gmail.com \
--cc=aliguori@amazon.com \
--cc=dgilbert@redhat.com \
--cc=marcel@redhat.com \
--cc=michael@walle.cc \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.