Skip to content

Commit 9a2d415

Browse files
authored
use newest arm64 UEFI and amd64 OVMF CODE/VARS firmware (#81)
it updates the arm64 UEFI firmware to a version newer than 2023.11, as running on qemu >= 9.0 can trigger a bug in the older versions of the EDK2 guest firmware, causing Synchronous Exception and potential bootloops. While doing so it updates the amd64 OVMF firmware, which now has removed support for the 2M firmware and only supports the 4M one. The 4M OVMF firmware comes with split CODE and VARS images, which need to be loaded as pflash drives in the qemu vm, rather than via the -bios flag. For more details on the migration see: https://salsa.debian.org/qemu-team/edk2/-/blob/debian/latest/debian/howto-2M-to-4M-migration.md Fixes #80
1 parent 28d96f8 commit 9a2d415

File tree

9 files changed

+31
-11
lines changed

9 files changed

+31
-11
lines changed

Dockerfile

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
FROM debian:bookworm
1+
# pinned for reproducibility purposes
2+
# to get the most recent testing goodies
3+
# update the tag to the most recent tag
4+
# https://hub.docker.com/_/debian/tags?name=testing&ordering=-name
5+
FROM debian:testing-20250113
26

37
RUN apt-get update && apt-get install -y qemu-efi-aarch64 ovmf

Makefile

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: test install cover
1+
.PHONY: test install cover efi
22

33
all: install
44

@@ -15,6 +15,8 @@ cover:
1515
install:
1616
go install github.com/gokrazy/tools/cmd/...
1717

18-
third_party/edk2-2022.11-6/QEMU_EFI.fd: Dockerfile
19-
docker build --rm -t gokrazy-edk2 .
20-
docker run --rm -v $$(pwd)/third_party/edk2-2022.11-6:/tmp/bins gokrazy-edk2 cp /usr/share/qemu-efi-aarch64/QEMU_EFI.fd /usr/share/OVMF/OVMF_CODE.fd /tmp/bins
18+
19+
efi: Dockerfile
20+
rm -rf thirdparty/edk2-2024.11-4 && \
21+
docker build --rm -t gokrazy-edk2 . && \
22+
docker run --rm -v $$(pwd)/third_party/edk2-2024.11-4:/tmp/bins gokrazy-edk2 cp /usr/share/qemu-efi-aarch64/QEMU_EFI.fd /usr/share/OVMF/OVMF_CODE_4M.fd /usr/share/OVMF/OVMF_VARS_4M.fd /tmp/bins

internal/gok/vmrun.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"github.com/gokrazy/internal/config"
1515
"github.com/gokrazy/internal/instanceflag"
1616
"github.com/gokrazy/tools/internal/packer"
17-
edk "github.com/gokrazy/tools/third_party/edk2-2022.11-6"
17+
edk "github.com/gokrazy/tools/third_party/edk2-2024.11-4"
1818
"github.com/spf13/cobra"
1919
)
2020

@@ -136,8 +136,12 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error {
136136
return err
137137
}
138138
defer os.RemoveAll(tmp)
139-
amd64EFI := filepath.Join(tmp, "amd64-OVMF_CODE.fd")
140-
if err := os.WriteFile(amd64EFI, edk.Amd64EFI, 0644); err != nil {
139+
amd64OVMFCODE4M := filepath.Join(tmp, "amd64-OVMF_CODE_4M.fd")
140+
if err := os.WriteFile(amd64OVMFCODE4M, edk.Amd64OVMFCODE4M, 0644); err != nil {
141+
return err
142+
}
143+
amd64OVMFVARS4M := filepath.Join(tmp, "amd64-OVMF_VARS_4M.fd")
144+
if err := os.WriteFile(amd64OVMFVARS4M, edk.Amd64OVMFVARS4M, 0644); err != nil {
141145
return err
142146
}
143147
arm64EFI := filepath.Join(tmp, "arm64-QEMU_EFI.fd")
@@ -175,7 +179,14 @@ func (r *vmRunConfig) runQEMU(ctx context.Context, fullDiskImage string) error {
175179
"-bios", arm64EFI)
176180

177181
case "amd64":
178-
qemu.Args = append(qemu.Args, "-bios", amd64EFI)
182+
qemu.Args = append(qemu.Args,
183+
// -bios with unified 2M firmware images was deprecated in favor of
184+
// two pflash -drive lines with separated CODE/VARS 4M images.
185+
// for details see:
186+
// https://salsa.debian.org/qemu-team/edk2/-/blob/debian/latest/debian/howto-2M-to-4M-migration.md
187+
"-drive", "if=pflash,format=raw,unit=0,readonly=on,file="+amd64OVMFCODE4M,
188+
"-drive", "if=pflash,format=raw,unit=1,readonly=off,file="+amd64OVMFVARS4M,
189+
)
179190
}
180191

181192
if goarch == runtime.GOARCH {
-1.88 MB
Binary file not shown.
-2 MB
Binary file not shown.
3.48 MB
Binary file not shown.
528 KB
Binary file not shown.
2 MB
Binary file not shown.

third_party/edk2-2022.11-6/edk.go third_party/edk2-2024.11-4/edk.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ import _ "embed"
66
//go:embed QEMU_EFI.fd
77
var Arm64EFI []byte
88

9-
//go:embed OVMF_CODE.fd
10-
var Amd64EFI []byte
9+
//go:embed OVMF_CODE_4M.fd
10+
var Amd64OVMFCODE4M []byte
11+
12+
//go:embed OVMF_VARS_4M.fd
13+
var Amd64OVMFVARS4M []byte

0 commit comments

Comments
 (0)