Skip to content

Commit

Permalink
OvmfPkg: QemuBootOrder: handle QEMU's "-boot strict=on" option
Browse files Browse the repository at this point in the history
When this option is passed to qemu, it appends the word HALT to the
"bootorder" fw_cfg file, as last entry. For example,

  /pci@i0cf8/ethernet@3/ethernet-phy@0
  /pci@i0cf8/scsi@4/disk@0,0
  HALT

The option's purpose is to prevent SeaBIOS from booting from devices that
have not been specified explicitly (with bootindex=N device properties nor
-boot options). When SeaBIOS sees HALT, it doesn't proceed to boot from
default locations (after boot fails from all of the listed locations).

The HALT string currently causes OVMF to reject the entire "bootorder"
fw_cfg contents, with "parse error". This is not good, because since a
recent libvirt commit, libvirt unconditionally passes "-boot strict=on" to
qemu. Consequently, the boot order logic in QemuBootOrder.c has stopped
working for libvirt users.

OVMF's SetBootOrderFromQemu() function actually implements the idea behind
"-boot strict=on": it drops all boot options not in the fw_cfg list. (*)
Therefore, let's recognize HALT, and just do what we've been doing all
along.

(*) Except the UEFI shell, according to the survival policy in
BootOrderComplete(), but the memory mapped UEFI shell is not expressible
via fw_cfg anyway, and its preservation has been requested on edk2-devel.
Hence it's a good boot option to keep in any case.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15197 6f19259b-4bc3-4df7-8a09-765794883524
  • Loading branch information
lersek authored and jljusten committed Jan 29, 2014
1 parent 869b17c commit c3cf8da
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c
Original file line number Diff line number Diff line change
Expand Up @@ -849,8 +849,11 @@ TranslateOfwNodes (
the current implementation. Further calls
to this function are possible.
@retval RETURN_NOT_FOUND Translation terminated, *Ptr was (and is)
pointing to an empty string.
@retval RETURN_NOT_FOUND Translation terminated. On input, *Ptr was
pointing to the empty string or "HALT". On
output, *Ptr points to the empty string
(ie. "HALT" is consumed transparently when
present).
@retval RETURN_INVALID_PARAMETER Parse error. This is a permanent error.
Expand All @@ -870,7 +873,12 @@ TranslateOfwPath (
OFW_NODE Skip;

NumNodes = 0;
Status = ParseOfwNode (Ptr, &Node[NumNodes], &IsFinal);
if (AsciiStrCmp (*Ptr, "HALT") == 0) {
*Ptr += 4;
Status = RETURN_NOT_FOUND;
} else {
Status = ParseOfwNode (Ptr, &Node[NumNodes], &IsFinal);
}

if (Status == RETURN_NOT_FOUND) {
DEBUG ((DEBUG_VERBOSE, "%a: no more nodes\n", __FUNCTION__));
Expand Down

0 comments on commit c3cf8da

Please sign in to comment.