Currently we fill the VIRT_FLASH space with two 64MB NOR images when using persistent UEFI variables on QEMU. Actually we only use a very small part of the memory while the rest significant large part of memory is wasted.
This patch creates and maps a variable size of flash device instead of a mandatory 64MB one to save memory. Signed-off-by: Xiang Zheng <zhengxia...@huawei.com> --- This patch might be insufficient since it also needs to modify the flash size in ACPI and DTB. BTW, I don't understand why it requires the two NOR images to be exactly 64MB in size when using -pflash. --- hw/arm/virt.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index ce2664a..8269532 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -44,6 +44,7 @@ #include "sysemu/numa.h" #include "sysemu/sysemu.h" #include "sysemu/kvm.h" +#include "sysemu/block-backend.h" #include "hw/loader.h" #include "exec/address-spaces.h" #include "qemu/bitops.h" @@ -881,14 +882,18 @@ static void create_one_flash(const char *name, hwaddr flashbase, DriveInfo *dinfo = drive_get_next(IF_PFLASH); DeviceState *dev = qdev_create(NULL, TYPE_PFLASH_CFI01); SysBusDevice *sbd = SYS_BUS_DEVICE(dev); + BlockBackend *blk_backend = NULL; const uint64_t sectorlength = 256 * 1024; + hwaddr real_size = flashsize; if (dinfo) { - qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo), - &error_abort); + blk_backend = blk_by_legacy_dinfo(dinfo); + qdev_prop_set_drive(dev, "drive", blk_backend, &error_abort); + real_size = blk_getlength(blk_backend); + real_size = flashsize > real_size ? real_size : flashsize; } - qdev_prop_set_uint32(dev, "num-blocks", flashsize / sectorlength); + qdev_prop_set_uint32(dev, "num-blocks", real_size / sectorlength); qdev_prop_set_uint64(dev, "sector-length", sectorlength); qdev_prop_set_uint8(dev, "width", 4); qdev_prop_set_uint8(dev, "device-width", 2); -- 1.8.3.1