On 09/18/20 15:41, Philippe Mathieu-Daudé wrote: > Cc'ing firmware experts. > > On 9/18/20 2:26 PM, haibinzhang(寮犳捣鏂�) wrote: >> 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. > > Flash#0 is a device because eventually its model will handle > sector/block protection, so firmware can do CapsuleUpdate > (updating itself). Meanwhile you could treat flash#0 as a pure > ROM device... But this wouldn't be the 'arm-virt' machine anymore. > >> >> Signed-off-by: Haibin Zhang <haibinzh...@tencent.com> >> --- >> hw/arm/virt.c | 22 ++++++++++++++++++++-- >> 1 file changed, 20 insertions(+), 2 deletions(-) >> >> diff --git a/hw/arm/virt.c b/hw/arm/virt.c >> index acf9bfbece..3545e12865 100644 >> --- a/hw/arm/virt.c >> +++ b/hw/arm/virt.c >> @@ -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; >> + } > > Stefan recently posted "nvdimm: read-only file support" which > might be a better way to achieve what you want: > https://www.mail-archive.com/qemu-devel@nongnu.org/msg741137.html > >> + >> + 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); >> } >> >> -- >> 2.23.0 >> >
We've been here before. [Qemu-devel] [RFC PATCH] hw/arm/virt: use variable size of flash device to save memory https://lists.gnu.org/archive/html/qemu-devel/2019-03/msg06773.html http://mid.mail-archive.com/20190325125142.11628-1-zhengxiang9@huawei.com I don't have anything to add. Laszlo