Hi Alistair, On Tue, Apr 25, 2023 at 03:55:45PM +0530, Sunil V L wrote: > Currently, virt machine supports two pflash instances each with > 32MB size. However, the first pflash is always assumed to > contain M-mode firmware and reset vector is set to this if > enabled. Hence, for S-mode payloads like EDK2, only one pflash > instance is available for use. This means both code and NV variables > of EDK2 will need to use the same pflash. > > The OS distros keep the EDK2 FW code as readonly. When non-volatile > variables also need to share the same pflash, it is not possible > to keep it as readonly since variables need write access. > > To resolve this issue, the code and NV variables need to be separated. > But in that case we need an extra flash. Hence, modify the convention > such that pflash0 will contain the M-mode FW only when "-bios none" > option is used. Otherwise, pflash0 will contain the S-mode payload FW. > This enables both pflash instances available for EDK2 use. > > Example usage: > 1) pflash0 containing M-mode FW > qemu-system-riscv64 -bios none -pflash <mmode_fw> -machine virt > or > qemu-system-riscv64 -bios none \ > -drive file=<mmode_fw>,if=pflash,format=raw,unit=0 -machine virt > > 2) pflash0 containing S-mode payload like EDK2 > qemu-system-riscv64 -pflash <smode_fw_vars> -pflash <smode_fw_code> -machine > virt > or > qemu-system-riscv64 -bios <opensbi_fw> \ > -pflash <smode_fw_vars> \ > -pflash <smode_fw_code> \ > -machine virt > or > qemu-system-riscv64 -bios <opensbi_fw> \ > -drive file=<smode_fw_vars>,if=pflash,format=raw,unit=0 \ > -drive file=<smode_fw_code>,if=pflash,format=raw,unit=1,readonly=on \ > -machine virt > > Signed-off-by: Sunil V L <suni...@ventanamicro.com> > Reported-by: Heinrich Schuchardt <xypron.g...@gmx.de> > --- > The issue is reported at > https://salsa.debian.org/qemu-team/edk2/-/commit/c345655a0149f64c5020bfc1e53c619ce60587f6 > > The patch is based on Alistair's riscv-to-apply.next branch. > > Changes since v1: > 1) Simplified the fix such that it doesn't break current EDK2. > Could you please help reviewing this patch? This was sent when you were out of office.
Thanks, Sunil > hw/riscv/virt.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 4e3efbee16..ca445d3d02 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -1296,10 +1296,11 @@ static void virt_machine_done(Notifier *notifier, > void *data) > kernel_entry = 0; > } > > - if (drive_get(IF_PFLASH, 0, 0)) { > + if (drive_get(IF_PFLASH, 0, 0) && > + machine->firmware && !strcmp(machine->firmware, "none")) { > /* > - * Pflash was supplied, let's overwrite the address we jump to after > - * reset to the base of the flash. > + * Pflash0 was supplied with "-bios none", let's overwrite the > address > + * we jump to after reset to the base of the flash. > */ > start_addr = virt_memmap[VIRT_FLASH].base; > } > -- > 2.34.1 >