qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: "Igor Mammedov" <imammedo@redhat.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Gerd Hoffmann <kraxel@redhat.com>,
	qemu devel list <qemu-devel@nongnu.org>,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] bundling edk2 platform firmware images with QEMU
Date: Fri, 8 Mar 2019 17:31:11 +0100	[thread overview]
Message-ID: <6e8862a7-774e-2660-43da-db37927f1e9e@redhat.com> (raw)
In-Reply-To: <20190308165143.441a59db@redhat.com>

On 03/08/19 16:51, Igor Mammedov wrote:
> On Fri, 8 Mar 2019 15:06:12 +0000
> Daniel P. Berrangé <berrange@redhat.com> wrote:
> 
>> On Fri, Mar 08, 2019 at 03:48:07PM +0100, Laszlo Ersek wrote:
>>> On 03/08/19 14:42, Daniel P. Berrangé wrote:  
>>>>>  pc-bios/edk2-aarch64-code.fd                   | Bin 0 -> 67108864 bytes
>>>>>  pc-bios/edk2-arm-code.fd                       | Bin 0 -> 67108864 bytes
>>>>>  pc-bios/edk2-arm-vars.fd                       | Bin 0 -> 67108864 bytes
>>>>>  pc-bios/edk2-i386-code.fd                      | Bin 0 -> 3653632 bytes
>>>>>  pc-bios/edk2-i386-secure-code.fd               | Bin 0 -> 3653632 bytes
>>>>>  pc-bios/edk2-i386-vars.fd                      | Bin 0 -> 540672 bytes
>>>>>  pc-bios/edk2-licenses.txt                      | 209 +++++++++++++++
>>>>>  pc-bios/edk2-x86_64-code.fd                    | Bin 0 -> 3653632 bytes
>>>>>  pc-bios/edk2-x86_64-secure-code.fd             | Bin 0 -> 3653632 bytes  
>>>>
>>>>
>>>> Yikes, am I really reading those sizes right ? The biggest ROMs there
>>>> are 64 MB, so this is proposing to add ~206 MB of binaries to the
>>>> pc-bios directory ?  
>>>
>>> Sort of.
>>>
>>> This is because of how the "virt" machine type's pflash chips are sized.
>>> The edk2 build produces a 2MB firmware executable and a 768KB varstore
>>> template for each of aarch64 and arm, but (a) QEMU doesn't auto-pad
>>> either [*], and (b) if we used qcow2 with compression, then libvirt
>>> couldn't deal with the images [**]. Hence we have to pad the files
>>> manually, after the edk2 build completes.
>>>
>>> [*] We've just been discussing auto-padding in a parallel patch from
>>> Alex and Markus (the latest version is "[PATCH v7] pflash: Require
>>> backend size to match device, improve errors", in which the padding has
>>> already been dropped). But such padding would only work for read-only
>>> pflash mappings anyway, not for variable store files.
>>>
>>> [**] The root cause for not using qcow2 with pflash images is that qcow2
>>> would make them candidates for "savevm" to dump live memory contents
>>> into them, which is Very Bad (TM).  
>>
>> If using  qcow2 compressed images for ROMs is the desired best answer,
>> then surely we can figure out a way to fix this savevm problem ? Even
>> if it is just an internal hack there must be a way we can mark a qcow2
>> file as being used by the ROM so savevm ignores it.
>>
>> We've not been very motivated to solve this before since "savevm" command
>> is supposedly deprecated to be replaced by a sane QMP variant, but we've
>> been waiting 5 years for that to happen, so in the mean time a hack to
>> resolve the problem with firmware images feels prudent.
>>
>>>> Consider that we'll need to refresh those ROMs multiple times a year to
>>>> track updates or security fixes. It will result in our .git repo size
>>>> growing massively over time.  
>>>
>>> Actually, it's not *that* bad. Earlier I investigated how the formatted
>>> variant of the patch (adding these blobs) would look like.
>>>
>>> First, I compressed all the "edk2-*fd" files (individually) with "gzip
>>> --best", just to get a byte count. That yielded almost precisely 9MB, in
>>> total.
>>>
>>> Second, the formatted patch, adding these blobs, is 12.6MB. Taking the
>>> 4/3 blowup factor from base64 encoding, the "unexplained overhead" is
>>> not that huge (0.6 MB).  
>>
>> Ok, that's less alarming.
>>
>> Though we're still basically doubling the size of the pc-bios dir
>> which is already significant.
>>
>> I wonder how much of out .git/objects 230 MB size is due to the current
>> ROMs.
>>
>>> - "git checkout" is smart enough to punch holes into the files in the
>>> working directory.
>>>
>>> $ du -csh edk2-{arm,aarch64}-code.fd edk2-arm-vars.fd
>>> 2.1M    edk2-arm-code.fd
>>> 2.1M    edk2-aarch64-code.fd
>>> 772K    edk2-arm-vars.fd
>>> 4.8M    total  
>>
>> That's nice.
>>
>>> This happens despite the fact that the Makefile performs the padding
>>> with "cat /dev/zero" and "head".  
>>
>> You can resize a file using holes with dd if you set count=0 and
>> tell it to seek in output eg something like this probably works:
>>
>>   dd if=/dev/zero of=firmware.img seek=64 bs=1M count=0
>>
>>
>>
>>> I'm 100% fine with not bundling any firmware binaries for end-users;
>>> however I've been doing this work because Igor needs full platform
>>> firmware binaries for ACPI unit tests. In particular, in aarch64 guests,
>>> there is no ACPI without UEFI, and in UEFI guests, finding the ACPI
>>> entry point (RSD PTR) is convoluted enough that it needs dedicated guest
>>> support.  
>>
>> Yes tricky. I don't have a particularly good answer for that, especially
>> if it is a test that you'd expect all developers to run every time. If
>> it is a rarely run test then it could be justified in having it download
>> large blobs from a lookaside cache similar to how we download disk images
>> for *BSD tests.
> 
> I'd say  it's intended to run on every 'make check' for bios-tables-test
> (arm/x86 variants) like we do now with Seabios. The goal is to catch
> regressions in ACPI table (as we have zero coverage there).
> Secondary motivation is to help with merging NEMU fork. Intel generalizes
> a bunch ACPI code across x86 and ARM boards and I'm not ready to manually
> test every iteration posted on list.
>  
> The last time we talked where to put firmware, we've got to consensus
> to bundle UEFI within qemu like we do with other firmware.
> Question of moving firmwares somewhere else is still open but it's
> a separate topic and shouldn't block us from properly testing arm board
> now (and other related projects that depend on it).
> 
> As for soft-freeze, maybe it's acceptable to merge this series during it
> as its primary(the only) user would be 'make check'. I'll respin tests
> after rebasing previous iteration on top of this series.

OK, let me try this tonight (hopefully):

(1) I'll employ "truncate" for padding the arm images,

(2) I'll follow Daniel's advice about moving forward to the current edk2
master HEAD (which is pretty close to the upcoming edk2-stable201903
release)

(3) I'll push the series to github or wherever for easy fetching, and
generate the patches (for posting) with --no-binary.

We can discuss better while seeing specifics.

Thanks!
Laszlo

  reply	other threads:[~2019-03-08 16:31 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-08 13:09 [Qemu-devel] bundling edk2 platform firmware images with QEMU Laszlo Ersek
2019-03-08 13:42 ` Daniel P. Berrangé
2019-03-08 14:20   ` Daniel P. Berrangé
2019-03-08 14:48   ` Laszlo Ersek
2019-03-08 15:06     ` Daniel P. Berrangé
2019-03-08 15:51       ` Igor Mammedov
2019-03-08 16:31         ` Laszlo Ersek [this message]
2019-03-08 16:28       ` Laszlo Ersek

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=6e8862a7-774e-2660-43da-db37927f1e9e@redhat.com \
    --to=lersek@redhat.com \
    --cc=berrange@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=mst@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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).