@@ -50,6 +50,7 @@
#include "sysemu/sysemu.h"
#include "sysemu/tpm.h"
#include "sysemu/kvm.h"
+#include "sysemu/block-backend.h"
#include "hw/loader.h"
#include "exec/address-spaces.h"
#include "qemu/bitops.h"
@@ -1001,10 +1002,27 @@ static void virt_flash_map(VirtMachineState *vms,
*/
hwaddr flashsize = vms->memmap[VIRT_FLASH].size / 2;
hwaddr flashbase = vms->memmap[VIRT_FLASH].base;
+ int64_t realsize;
+ BlockBackend *blk;
- virt_flash_map1(vms->flash[0], flashbase, flashsize,
+ realsize = flashsize;
+ blk = pflash_cfi01_get_blk(vms->flash[0]);
+ if (blk) {
+ realsize = blk_getlength(blk);
+ realsize = realsize < flashsize ? realsize : flashsize;
+ }
+
+ virt_flash_map1(vms->flash[0], flashbase, realsize,
secure_sysmem);
- virt_flash_map1(vms->flash[1], flashbase + flashsize, flashsize,
+
+ realsize = flashsize;
+ blk = pflash_cfi01_get_blk(vms->flash[1]);
+ if (blk) {
+ realsize = blk_getlength(blk);
+ realsize = realsize < flashsize ? realsize : flashsize;
+ }
+
+ virt_flash_map1(vms->flash[1], flashbase + flashsize, realsize,
sysmem);
}
Default size of arm-virt pflash image is 64MB which will cost extra 128MB(64MBx2) memory per qemu process and 12.5GB for 100 qemu processes. Host memory is precious and it is valuable to reduce pflash image size. For compatibility arm-virt uses real size when mapping. Signed-off-by: Haibin Zhang <haibinzhang@tencent.com> --- hw/arm/virt.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) -- 2.23.0