On Fri, Oct 10, 2025 at 01:41:35PM +0200, Markus Armbruster wrote:
> Gerd Hoffmann <[email protected]> writes:
>
> > Starting with the edk2-stable202508 tag OVMF (and ArmVirt too) have
> > optional support for logging to a memory buffer. There is guest side
> > support -- for example in linux kernels v6.17+ -- to read that buffer.
> > But that might not helpful if your guest stops booting early enough that
> > guest tooling can not be used yet. So host side support to read that
> > log buffer is a useful thing to have.
> >
> > This patch implements both qmp and hmp monitor commands to read the
> > firmware log.
>
> So this is just for EDK2, at least for now.
Yes.
> > + char FirmwareVersion[128];
> > +} MEM_DEBUG_LOG_HDR;
>
> I understand this is a (close to) literal copy from EDK2, and adjusting
> it to QEMU style would be a bad idea.
>
> > +
> > +
> > +/* -----------------------------------------------------------------------
> > */
> > +/* qemu monitor command
> > */
> > +
> > +typedef struct {
> > + uint64_t Magic1;
> > + uint64_t Magic2;
> > +} MEM_DEBUG_LOG_MAGIC;
>
> Unusual capitalization for a typedef name. Why? To emphasize the
> relation to MEM_DEBUG_LOG_HDR?
Yes.
> > + if (header.DebugLogSize > MiB) {
> > + /* default size is 128k (32 pages), allow up to 1M */
> > + error_setg(errp, "firmware log: log buffer is too big");
>
> [*] We limit the buffer to 1MiB. No objection to the size.
>
> What do you mean by "default" in "default size"? Is the size
> configurable in EDK2?
Yes, there is an option for that.
> Should we try to cope more gracefully with oversized log buffers? It's
> a ring buffer. What about silently reading the latest 1MiB then?
> Behaves just as if the ring buffer was 1MiB.
See below.
> > +# @log: Firmware debug log, in base64 encoding.
>
> Can this have a partial line at the beginning and/or the end?
Yes.
> > +#
> > +# Since: 10.2
> > +##
> > +{ 'struct': 'FirmwareLog',
> > + 'data': { '*version': 'str',
> > + '*log': 'str' } }
>
> These aren't actually optional with the current code. See [**] above.
> I guess you make them optional just in case some other firmware can
> provide only one of them.
We could also make both mandatory. There is always the option to return
an empty string ...
> > +##
> > +# @query-firmware-log:
> > +#
> > +# Find firmware memory log buffer in guest memory, return content.
>
> Should we mention this is implemented only for EDK2 at this time?
>
> Have you considered an optional size argument to retrieve the tail of
> the log?
I'll have a look. If we implement the 1MB cap suggested above we would
get that (almost) for free.
take care,
Gerd