qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Juan Quintela <quintela@redhat.com>,
	dgilbert@redhat.com, Michael Walle <michael@walle.cc>,
	Anthony Liguori <aliguori@amazon.com>,
	pbonzini@redhat.com, Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 5/5] acpi-build: make ROMs device RAM, make them resizeable
Date: Mon, 17 Nov 2014 22:09:02 +0200	[thread overview]
Message-ID: <1416254843-16859-6-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1416254843-16859-1-git-send-email-mst@redhat.com>

Use device rom API so we can painlessly extend ROMs in the
future.  Note: migration is not affected, as we are
not actually allocating the RAM.

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 1aac980..7c88a1a 100644
--- a/include/hw/loader.h
+++ b/include/hw/loader.h
@@ -58,7 +58,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);
@@ -72,7 +72,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 bee208f..c4ce311 100644
--- a/hw/core/loader.c
+++ b/hw/core/loader.c
@@ -696,12 +696,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_device_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);
 
@@ -790,7 +800,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;
@@ -799,7 +809,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);
@@ -819,7 +829,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 92a36e3..0e82205 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
+
 typedef struct AcpiCpuInfo {
     DECLARE_BITMAP(found_cpus, ACPI_CPU_HOTPLUG_ID_LIMIT);
 } AcpiCpuInfo;
@@ -1717,6 +1720,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);
+
     memcpy(qemu_get_ram_ptr(build_state->table_ram), tables.table_data->data,
            build_state->table_size);
 
@@ -1733,10 +1741,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 = {
@@ -1780,11 +1788,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));
-- 
MST

  parent reply	other threads:[~2014-11-17 20:09 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-17 20:08 [Qemu-devel] [PATCH 0/5] pc: make ROMs resizeable Michael S. Tsirkin
2014-11-17 20:08 ` [Qemu-devel] [PATCH 1/5] cpu: add cpu_physical_memory_clear_dirty_range_nocode Michael S. Tsirkin
2014-11-19  9:10   ` Juan Quintela
2014-11-17 20:08 ` [Qemu-devel] [PATCH 2/5] exec: qemu_ram_alloc_device, qemu_ram_resize Michael S. Tsirkin
2014-11-17 20:15   ` Michael S. Tsirkin
2014-11-18  6:03   ` Paolo Bonzini
2014-11-18  7:49     ` Michael S. Tsirkin
2014-11-19  9:19       ` Juan Quintela
2014-11-19  9:33         ` Michael S. Tsirkin
2014-11-19 10:11           ` Juan Quintela
2014-11-19 10:21             ` Michael S. Tsirkin
2014-11-19 10:45               ` Juan Quintela
2014-11-19 13:28                 ` Michael S. Tsirkin
2014-11-19 13:44                   ` Paolo Bonzini
2014-11-19 13:57                     ` Juan Quintela
2014-11-19 14:13                       ` Dr. David Alan Gilbert
2014-11-19 14:22                         ` Paolo Bonzini
2014-11-19 14:26                           ` Dr. David Alan Gilbert
2014-11-19 14:28                             ` Paolo Bonzini
2014-11-19 14:59                               ` Dr. David Alan Gilbert
2014-11-19 15:38                                 ` Michael S. Tsirkin
2014-11-19 15:53                                   ` Dr. David Alan Gilbert
2014-11-19 14:22                         ` Juan Quintela
2014-11-19 14:20                       ` Paolo Bonzini
2014-11-19 16:39                         ` Juan Quintela
2014-11-19 16:56                           ` Paolo Bonzini
2014-11-19 16:27                     ` Kevin O'Connor
2014-11-19 17:01                       ` Paolo Bonzini
2014-11-20  8:12                         ` Gerd Hoffmann
2014-11-20 10:00                           ` Paolo Bonzini
2014-11-19 13:49                   ` Juan Quintela
2014-11-19 13:51                     ` Paolo Bonzini
2014-11-19 14:03                       ` Juan Quintela
2014-11-19 14:11                         ` Paolo Bonzini
2014-11-19 14:16                           ` Dr. David Alan Gilbert
2014-11-19 14:28                             ` Paolo Bonzini
2014-11-19 14:20                           ` Juan Quintela
2014-11-19 15:43                             ` Michael S. Tsirkin
2014-11-19 10:16           ` Markus Armbruster
2014-11-19 10:30             ` Michael S. Tsirkin
2014-11-19 10:50               ` Juan Quintela
2014-11-19 13:36                 ` Michael S. Tsirkin
2014-11-19 13:51                   ` Juan Quintela
2014-11-19 15:46                     ` Michael S. Tsirkin
2014-11-19 16:45                       ` Juan Quintela
2014-11-19 18:28                         ` Paolo Bonzini
2014-11-20 13:35               ` Markus Armbruster
2014-11-20 14:04                 ` Michael S. Tsirkin
2014-11-24 13:48                   ` Paolo Bonzini
2014-11-19 13:58   ` Peter Maydell
2014-11-19 14:07     ` Juan Quintela
2014-11-19 14:10       ` Peter Maydell
2014-11-19 14:18         ` Juan Quintela
2014-11-19 16:08           ` Stefan Hajnoczi
2014-11-19 14:19         ` Paolo Bonzini
2014-11-19 14:21           ` Peter Maydell
2014-11-19 14:30             ` Paolo Bonzini
2014-11-19 15:16               ` Michael S. Tsirkin
2014-11-19 16:50           ` Juan Quintela
2014-11-19 15:12         ` Michael S. Tsirkin
2014-11-19 15:04     ` Michael S. Tsirkin
2014-11-17 20:08 ` [Qemu-devel] [PATCH 3/5] arch_init: support resizing on incoming migration Michael S. Tsirkin
2014-11-17 20:08 ` [Qemu-devel] [PATCH 4/5] memory: interface to allocate device ram Michael S. Tsirkin
2014-11-17 20:21   ` Peter Maydell
2014-11-18 11:54     ` Michael S. Tsirkin
2014-11-17 20:09 ` Michael S. Tsirkin [this message]
2014-11-17 20:11 ` [Qemu-devel] [PATCH 0/5] pc: make ROMs resizeable Michael S. Tsirkin
2014-11-19  7:29   ` Amit Shah
2014-11-18 14:47 ` Markus Armbruster
2014-11-18 15:00   ` Michael S. Tsirkin
2014-11-19  8:16     ` Markus Armbruster
2014-11-19 13:41       ` Michael S. Tsirkin
2014-11-19  7:31 ` Amit Shah
2014-11-19  8:15   ` Michael S. Tsirkin
2014-11-19  8:22     ` Amit Shah
2014-11-19 13:33       ` Michael S. Tsirkin
2014-11-19 13:52         ` Juan Quintela
2014-11-19 16:01           ` Michael S. Tsirkin
2014-11-19 13:52   ` Peter Maydell
2014-11-19 14:41     ` Paolo Bonzini
2014-11-19 15:34       ` Michael S. Tsirkin
2014-11-19 16:40       ` Juan Quintela

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=1416254843-16859-6-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=aliguori@amazon.com \
    --cc=dgilbert@redhat.com \
    --cc=michael@walle.cc \
    --cc=pbonzini@redhat.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).