| 1 |  | # Copyright 1999-2024 Gentoo Authors | 
  |  | 1 | # Copyright 1999-2025 Gentoo Authors | 
  | 2 | 2 | # Distributed under the terms of the GNU General Public License v2 | 
  | 3 | 3 |  | 
  | 4 | 4 | EAPI=8 | 
  | 5 | 5 |  | 
  | 6 | 6 | PYTHON_REQ_USE="sqlite" | 
  | 7 |  | PYTHON_COMPAT=( python3_{10..11} ) | 
  |  | 7 | PYTHON_COMPAT=( python3_{12..13} ) | 
  | 8 | 8 |  | 
  | 9 |  | inherit python-any-r1 readme.gentoo-r1 secureboot | 
  |  | 9 | inherit edo prefix python-any-r1 readme.gentoo-r1 secureboot toolchain-funcs | 
  | 10 | 10 |  | 
  | 11 |  | DESCRIPTION="UEFI firmware for 64-bit x86 virtual machines" | 
  |  | 11 | DESCRIPTION="TianoCore EDK II UEFI firmware for virtual machines" | 
  | 12 | 12 | HOMEPAGE="https://github.com/tianocore/edk2" | 
  | 13 | 13 |  | 
  | 14 |  | BUNDLED_OPENSSL_SUBMODULE_SHA="d82e959e621a3d597f1e0d50ff8c2d8b96915fd7" | 
  |  | 14 | DBXDATE="05092023" # MMDDYYYY | 
  | 15 | 15 | BUNDLED_BROTLI_SUBMODULE_SHA="f4153a09f87cbb9c826d8fc12c74642bb2d879ea" | 
  |  | 16 | BUNDLED_LIBFDT_SUBMODULE_SHA="cfff805481bdea27f900c32698171286542b8d3c" | 
  |  | 17 | BUNDLED_LIBSPDM_SUBMODULE_SHA="50924a4c8145fc721e17208f55814d2b38766fe6" | 
  |  | 18 | BUNDLED_MBEDTLS_SUBMODULE_SHA="8c89224991adff88d53cd380f42a2baa36f91454" | 
  |  | 19 | BUNDLED_MIPI_SYS_T_SUBMODULE_SHA="370b5944c046bab043dd8b133727b2135af7747a" | 
  |  | 20 | BUNDLED_OPENSSL_SUBMODULE_SHA="de90e54bbe82e5be4fb9608b6f5c308bb837d355" | 
  |  | 21 |  | 
  |  | 22 | SRC_URI=" | 
  |  | 23 | 	https://github.com/tianocore/${PN}/archive/${PN}-stable${PV}.tar.gz | 
  |  | 24 | 		-> ${P}.tar.gz | 
  |  | 25 | 	https://github.com/google/brotli/archive/${BUNDLED_BROTLI_SUBMODULE_SHA}.tar.gz | 
  |  | 26 | 		-> brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}.tar.gz | 
  |  | 27 | 	https://github.com/DMTF/libspdm/archive/${BUNDLED_LIBSPDM_SUBMODULE_SHA}.tar.gz | 
  |  | 28 | 		-> libspdm-${BUNDLED_LIBSPDM_SUBMODULE_SHA}.tar.gz | 
  |  | 29 | 	https://github.com/Mbed-TLS/mbedtls/archive/${BUNDLED_MBEDTLS_SUBMODULE_SHA}.tar.gz | 
  |  | 30 | 		-> mbedtls-${BUNDLED_MBEDTLS_SUBMODULE_SHA}.tar.gz | 
  |  | 31 | 	https://github.com/MIPI-Alliance/public-mipi-sys-t/archive/${BUNDLED_MIPI_SYS_T_SUBMODULE_SHA}.tar.gz | 
  |  | 32 | 		-> mipi-sys-t-${BUNDLED_MIPI_SYS_T_SUBMODULE_SHA}.tar.gz | 
  |  | 33 | 	https://github.com/openssl/openssl/archive/${BUNDLED_OPENSSL_SUBMODULE_SHA}.tar.gz | 
  |  | 34 | 		-> openssl-${BUNDLED_OPENSSL_SUBMODULE_SHA}.tar.gz | 
  |  | 35 |  | 
  |  | 36 | 	amd64? ( | 
  |  | 37 | 		https://uefi.org/sites/default/files/resources/x64_DBXUpdate_${DBXDATE}.bin | 
  |  | 38 | 		https://uefi.org/sites/default/files/resources/x64_DBXUpdate.bin -> x64_DBXUpdate_${DBXDATE}.bin | 
  |  | 39 | 	) | 
  |  | 40 |  | 
  |  | 41 | 	arm64? ( | 
  |  | 42 | 		https://uefi.org/sites/default/files/resources/arm64_DBXUpdate_${DBXDATE}.bin | 
  |  | 43 | 		https://uefi.org/sites/default/files/resources/arm64_DBXUpdate.bin -> arm64_DBXUpdate_${DBXDATE}.bin | 
  |  | 44 | 		https://github.com/devicetree-org/pylibfdt/archive/${BUNDLED_LIBFDT_SUBMODULE_SHA}.tar.gz | 
  |  | 45 | 			-> pylibfdt-${BUNDLED_LIBFDT_SUBMODULE_SHA}.tar.gz | 
  |  | 46 | 	) | 
  |  | 47 | " | 
  | 16 | 48 |  | 
  | 17 |  | # TODO: talk with tamiko about unbundling (mva) | 
  | 18 |  |  | 
  | 19 |  | # TODO: the binary 202105 package currently lacks the preseeded | 
  | 20 |  | #       OVMF_VARS.secboot.fd file (that we typically get from fedora) | 
  | 21 |  |  | 
  | 22 |  | SRC_URI="https://github.com/tianocore/edk2/archive/edk2-stable${PV}.tar.gz -> edk2-ovmf-${PV}.tar.gz | 
  | 23 |  | 	https://github.com/openssl/openssl/archive/${BUNDLED_OPENSSL_SUBMODULE_SHA}.tar.gz -> openssl-${BUNDLED_OPENSSL_SUBMODULE_SHA}.tar.gz | 
  | 24 |  | 	https://github.com/google/brotli/archive/${BUNDLED_BROTLI_SUBMODULE_SHA}.tar.gz -> brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}.tar.gz | 
  | 25 |  | 	https://dev.gentoo.org/~ajak/distfiles/edk2-ovmf-${PV}-qemu-firmware.tar.xz" | 
  | 26 |  |  | 
  |  | 49 | S="${WORKDIR}/${PN}-${PN}-stable${PV}" | 
  | 27 | 50 | LICENSE="BSD-2-with-patent MIT" | 
  | 28 | 51 | SLOT="0" | 
  | 29 |  | KEYWORDS="-* amd64" | 
  |  | 52 | KEYWORDS="-* amd64 arm64" | 
  | 30 | 53 |  | 
  | 31 |  | BDEPEND="app-emulation/qemu | 
  | 32 |  | 	>=dev-lang/nasm-2.0.7 | 
  | 33 |  | 	sys-apps/which | 
  |  | 54 | BDEPEND=" | 
  |  | 55 | 	${PYTHON_DEPS} | 
  |  | 56 | 	app-emulation/qemu | 
  |  | 57 | 	app-emulation/virt-firmware | 
  | 34 | 58 | 	>=sys-power/iasl-20160729 | 
  | 35 |  | 	${PYTHON_DEPS}" | 
  | 36 |  | RDEPEND="!sys-firmware/edk2-bin" | 
  |  | 59 | 	amd64? ( >=dev-lang/nasm-2.0.7 ) | 
  |  | 60 | " | 
  |  | 61 |  | 
  |  | 62 | RDEPEND=" | 
  |  | 63 | 	!sys-firmware/edk2-bin | 
  |  | 64 | " | 
  | 37 | 65 |  | 
  | 38 | 66 | PATCHES=( | 
  | 39 |  | 	"${FILESDIR}/${PN}-202105-werror.patch" | 
  | 40 |  | 	"${FILESDIR}/${PN}-202202-lld-textrels.patch" | 
  | 41 |  | 	"${FILESDIR}/${PN}-202202-binutils-2.41-textrels.patch" | 
  |  | 67 | 	"${FILESDIR}/${PN}-202408-werror.patch" | 
  |  | 68 | 	"${FILESDIR}/${PN}-202408-binutils-2.41-textrels.patch" | 
  | 42 | 69 | ) | 
  | 43 | 70 |  | 
  | 44 |  | S="${WORKDIR}/edk2-edk2-stable${PV}" | 
  |  | 71 | DISABLE_AUTOFORMATTING="true" | 
  |  | 72 | DIR="/usr/share/${PN}" | 
  | 45 | 73 |  | 
  | 46 |  | DISABLE_AUTOFORMATTING=true | 
  | 47 |  | DOC_CONTENTS="This package contains the tianocore edk2 UEFI firmware for 64-bit x86 | 
  | 48 |  | virtual machines. The firmware is located under | 
  | 49 |  | 	/usr/share/edk2-ovmf/OVMF_CODE.fd | 
  | 50 |  | 	/usr/share/edk2-ovmf/OVMF_VARS.fd | 
  | 51 |  | 	/usr/share/edk2-ovmf/OVMF_CODE.secboot.fd | 
  | 52 |  |  | 
  | 53 |  | To use Secure Boot, you need to either populate the necessary EFI | 
  | 54 |  | variables by booting: | 
  | 55 |  | 	/usr/share/edk2-ovmf/UefiShell.img | 
  | 56 |  | or creating OVMF_VARS.secboot.fd by hand: | 
  | 57 |  | 	https://github.com/rhuefi/qemu-ovmf-secureboot | 
  | 58 |  |  | 
  | 59 |  | The firmware does not support csm (due to no free csm implementation | 
  | 60 |  | available). If you need a firmware with csm support you have to download | 
  | 61 |  | one for yourself. Firmware blobs are commonly labeled | 
  | 62 |  | 	OVMF{,_CODE,_VARS}-with-csm.fd | 
  |  | 74 | pkg_setup() { | 
  |  | 75 | 	python-any-r1_pkg_setup | 
  |  | 76 | 	secureboot_pkg_setup | 
  | 63 | 77 |  | 
  | 64 |  | In order to use the firmware you can run qemu the following way | 
  |  | 78 | 	local QEMU_ARCH ARCH_DIRS UNIT0 UNIT1 FMT | 
  | 65 | 79 |  | 
  | 66 |  | 	$ qemu-system-x86_64 \ | 
  | 67 |  | 		-drive file=/usr/share/edk2-ovmf/OVMF.fd,if=pflash,format=raw,unit=0,readonly=on \ | 
  |  | 80 | 	case "${ARCH}" in | 
  |  | 81 | 	amd64) | 
  |  | 82 | 		TARGET_ARCH="X64" | 
  |  | 83 | 		QEMU_ARCH="x86_64" | 
  |  | 84 | 		ARCH_DIRS="${DIR}/OvmfX64" | 
  |  | 85 | 		UNIT0="OVMF_CODE.fd" | 
  |  | 86 | 		UNIT1="OVMF_VARS.fd" | 
  |  | 87 | 		FMT="raw" | 
  |  | 88 | 		;; | 
  |  | 89 | 	arm64) | 
  |  | 90 | 		TARGET_ARCH="AARCH64" | 
  |  | 91 | 		QEMU_ARCH="aarch64" | 
  |  | 92 | 		ARCH_DIRS="${DIR}/ArmVirtQemu-AARCH64" | 
  |  | 93 | 		UNIT0="QEMU_EFI.qcow2" | 
  |  | 94 | 		UNIT1="QEMU_VARS.qcow2" | 
  |  | 95 | 		FMT="qcow2" | 
  |  | 96 | 		;; | 
  |  | 97 | 	esac | 
  |  | 98 |  | 
  |  | 99 | 	DOC_CONTENTS="This package includes the TianoCore EDK II UEFI firmware for ${QEMU_ARCH} | 
  |  | 100 | virtual machines. The firmware is located under ${ARCH_DIRS}. | 
  |  | 101 |  | 
  |  | 102 | In order to use the firmware, you can run QEMU like so: | 
  |  | 103 |  | 
  |  | 104 | 	$ qemu-system-${QEMU_ARCH} \\ | 
  |  | 105 | 		-drive file=${EPREFIX}${ARCH_DIRS%% *}/${UNIT0},if=pflash,format=${FMT},unit=0,readonly=on \\ | 
  |  | 106 | 		-drive file=/path/to/the/copy/of/${UNIT1},if=pflash,format=${FMT},unit=1 \\ | 
  | 68 | 107 | 		..." | 
  | 69 | 108 |  | 
  | 70 |  | pkg_setup() { | 
  | 71 |  | 	python-any-r1_pkg_setup | 
  | 72 |  | 	secureboot_pkg_setup | 
  |  | 109 | 	case "${ARCH}" in | 
  |  | 110 | 	amd64) DOC_CONTENTS+=" | 
  |  | 111 |  | 
  |  | 112 | The firmware does not support CSM due to the lack of a free | 
  |  | 113 | implementation. If you need a firmware with CSM support, you have to | 
  |  | 114 | download one for yourself. Firmware blobs are commonly labelled: | 
  |  | 115 |  | 
  |  | 116 | 	OVMF_CODE-with-csm.fd | 
  |  | 117 | 	OVMF_VARS-with-csm.fd" | 
  |  | 118 | 		;; | 
  |  | 119 | 	arm64) DOC_CONTENTS+=" | 
  |  | 120 |  | 
  |  | 121 | WARNING! QEMU_EFI.secboot_INSECURE.qcow2 does have Secure Boot | 
  |  | 122 | enabled, but it must not be used in production. The lack of an SMM | 
  |  | 123 | implementation for arm64 in this firmware means that the EFI | 
  |  | 124 | variable store is unprotected, making the firmware unsafe." | 
  |  | 125 | 		;; | 
  |  | 126 | 	esac | 
  |  | 127 | } | 
  |  | 128 |  | 
  |  | 129 | link_mod() { | 
  |  | 130 | 	rmdir "$2" && ln -sfT "$1" "$2" || die "linking ${2##*/} failed" | 
  | 73 | 131 | } | 
  | 74 | 132 |  | 
  | 75 | 133 | src_prepare() { | 
  | 76 | 134 | 	# Bundled submodules | 
  | 77 |  | 	cp -rl "${WORKDIR}/openssl-${BUNDLED_OPENSSL_SUBMODULE_SHA}"/* "CryptoPkg/Library/OpensslLib/openssl/" | 
  | 78 |  | 	cp -rl "${WORKDIR}/brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}"/* "BaseTools/Source/C/BrotliCompress/brotli/" | 
  | 79 |  | 	cp -rl "${WORKDIR}/brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}"/* "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli/" | 
  | 80 |  |  | 
  | 81 |  | 	sed -i -r \ | 
  | 82 |  | 		-e "/function SetupPython3/,/\}/{s,\\\$\(whereis python3\),${EPYTHON},g}" \ | 
  | 83 |  | 		"${S}"/edksetup.sh || die "Fixing for correct Python3 support failed" | 
  |  | 135 | 	link_mod "${WORKDIR}/brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}" \ | 
  |  | 136 | 		BaseTools/Source/C/BrotliCompress/brotli | 
  |  | 137 | 	link_mod "${WORKDIR}/brotli-${BUNDLED_BROTLI_SUBMODULE_SHA}" \ | 
  |  | 138 | 		MdeModulePkg/Library/BrotliCustomDecompressLib/brotli | 
  |  | 139 | 	link_mod "${WORKDIR}/libspdm-${BUNDLED_LIBSPDM_SUBMODULE_SHA}" \ | 
  |  | 140 | 		SecurityPkg/DeviceSecurity/SpdmLib/libspdm | 
  |  | 141 | 	link_mod "${WORKDIR}/mbedtls-${BUNDLED_MBEDTLS_SUBMODULE_SHA}" \ | 
  |  | 142 | 		CryptoPkg/Library/MbedTlsLib/mbedtls | 
  |  | 143 | 	link_mod "${WORKDIR}/public-mipi-sys-t-${BUNDLED_MIPI_SYS_T_SUBMODULE_SHA}" \ | 
  |  | 144 | 		MdePkg/Library/MipiSysTLib/mipisyst | 
  |  | 145 | 	link_mod "${WORKDIR}/openssl-${BUNDLED_OPENSSL_SUBMODULE_SHA}" \ | 
  |  | 146 | 		CryptoPkg/Library/OpensslLib/openssl | 
  |  | 147 |  | 
  |  | 148 | 	use arm64 && | 
  |  | 149 | 		link_mod "${WORKDIR}/pylibfdt-${BUNDLED_LIBFDT_SUBMODULE_SHA}" \ | 
  |  | 150 | 			MdePkg/Library/BaseFdtLib/libfdt | 
  | 84 | 151 |  | 
  | 85 | 152 | 	default | 
  | 86 |  | } | 
  | 87 | 153 |  | 
  | 88 |  | src_compile() { | 
  | 89 |  | 	TARGET_ARCH=X64 | 
  | 90 |  | 	TARGET_NAME=RELEASE | 
  | 91 |  | 	TARGET_TOOLS=GCC49 | 
  |  | 154 | 	# Fix descriptor paths for prefix. | 
  |  | 155 | 	hprefixify "${FILESDIR}"/descriptors/*.json | 
  |  | 156 | } | 
  | 92 | 157 |  | 
  | 93 |  | 	BUILD_FLAGS="-D TLS_ENABLE \ | 
  | 94 |  | 		-D HTTP_BOOT_ENABLE \ | 
  |  | 158 | mybuild() { | 
  |  | 159 | 	edo build \ | 
  |  | 160 | 		-t "${TOOLCHAIN}" \ | 
  |  | 161 | 		-b "${BUILD_TARGET}" \ | 
  |  | 162 | 		-D NETWORK_HTTP_BOOT_ENABLE \ | 
  | 95 | 163 | 		-D NETWORK_IP6_ENABLE \ | 
  | 96 |  | 		-D TPM_ENABLE \ | 
  | 97 |  | 		-D TPM2_ENABLE -D TPM2_CONFIG_ENABLE \ | 
  | 98 |  | 		-D FD_SIZE_2MB" | 
  | 99 |  |  | 
  | 100 |  | 	SECUREBOOT_BUILD_FLAGS="${BUILD_FLAGS} \ | 
  | 101 |  | 		-D SECURE_BOOT_ENABLE \ | 
  | 102 |  | 		-D SMM_REQUIRE \ | 
  | 103 |  | 		-D EXCLUDE_SHELL_FROM_FD" | 
  | 104 |  |  | 
  | 105 |  | 	export LDFLAGS="-z notext" | 
  | 106 |  | 	export EXTRA_LDFLAGS="-z notext" | 
  | 107 |  | 	export DLINK_FLAGS="-z notext" | 
  | 108 |  |  | 
  | 109 |  | 	emake ARCH=${TARGET_ARCH} -C BaseTools | 
  | 110 |  |  | 
  | 111 |  | 	. ./edksetup.sh | 
  | 112 |  |  | 
  | 113 |  | 	# Build all EFI firmware blobs: | 
  | 114 |  |  | 
  | 115 |  | 	mkdir -p ovmf | 
  |  | 164 | 		-D NETWORK_TLS_ENABLE \ | 
  |  | 165 | 		-D TPM1_ENABLE \ | 
  |  | 166 | 		-D TPM2_ENABLE \ | 
  |  | 167 | 		-D TPM2_CONFIG_ENABLE \ | 
  |  | 168 | 		"${BUILD_ARGS[@]}" \ | 
  |  | 169 | 		"${@}" | 
  |  | 170 | } | 
  | 116 | 171 |  | 
  | 117 |  | 	./OvmfPkg/build.sh \ | 
  | 118 |  | 		-a "${TARGET_ARCH}" -b "${TARGET_NAME}" -t "${TARGET_TOOLS}" \ | 
  | 119 |  | 		${BUILD_FLAGS} || die "OvmfPkg/build.sh failed" | 
  |  | 172 | # Add the MS and Red Hat Secure Boot certificates and update the revocation list | 
  |  | 173 | # for the given architecture in the given raw variables image. | 
  |  | 174 | mk_fw_vars() { | 
  |  | 175 | 	edo virt-fw-vars \ | 
  |  | 176 | 		--set-dbx "${DISTDIR}/$1_DBXUpdate_${DBXDATE}.bin" \ | 
  |  | 177 | 		--secure-boot --enroll-redhat --inplace "$2" | 
  |  | 178 | } | 
  | 120 | 179 |  | 
  | 121 |  | 	cp Build/OvmfX64/*/FV/OVMF_*.fd ovmf/ | 
  | 122 |  | 	rm -rf Build/OvmfX64 | 
  |  | 180 | # Convert the given images from raw to QCOW2 and resize them to the amount given | 
  |  | 181 | # as the first argument. Specify 0 to not resize. | 
  |  | 182 | raw_to_qcow2() { | 
  |  | 183 | 	local SIZE=$1 RAW | 
  |  | 184 | 	shift | 
  |  | 185 |  | 
  |  | 186 | 	for RAW in "${@}"; do | 
  |  | 187 | 		edo qemu-img convert -f raw -O qcow2 -o cluster_size=4096 -S 4096 "${RAW}" "${RAW%.fd}.qcow2" | 
  |  | 188 | 		[[ ${SIZE} != 0 ]] && edo qemu-img resize -f qcow2 "${RAW%.fd}.qcow2" "${SIZE}" | 
  |  | 189 | 		rm "${RAW}" || die | 
  |  | 190 | 	done | 
  |  | 191 | } | 
  | 123 | 192 |  | 
  | 124 |  | 	./OvmfPkg/build.sh \ | 
  | 125 |  | 		-a "${TARGET_ARCH}" -b "${TARGET_NAME}" -t "${TARGET_TOOLS}" \ | 
  | 126 |  | 		${SECUREBOOT_BUILD_FLAGS} || die "OvmfPkg/build.sh failed" | 
  |  | 193 | src_compile() { | 
  |  | 194 | 	TOOLCHAIN="GCC5" | 
  |  | 195 | 	BUILD_TARGET="RELEASE" | 
  |  | 196 | 	BUILD_DIR="${BUILD_TARGET}_${TOOLCHAIN}" | 
  |  | 197 | 	BUILD_ARGS=() | 
  |  | 198 |  | 
  |  | 199 | 	tc-export_build_env | 
  |  | 200 | 	emake -C BaseTools \ | 
  |  | 201 | 		CC="$(tc-getBUILD_CC)" \ | 
  |  | 202 | 		CXX="$(tc-getBUILD_CXX)" \ | 
  |  | 203 | 		EXTRA_OPTFLAGS="${BUILD_CFLAGS}" \ | 
  |  | 204 | 		EXTRA_LDFLAGS="${BUILD_LDFLAGS}" | 
  |  | 205 |  | 
  |  | 206 | 	export \ | 
  |  | 207 | 		"${TOOLCHAIN}_${TARGET_ARCH}_PREFIX=${CHOST}-" \ | 
  |  | 208 | 		"${TOOLCHAIN}_BIN=${CHOST}-" | 
  | 127 | 209 |  | 
  | 128 |  | 	cp Build/OvmfX64/*/FV/OVMF_CODE.fd ovmf/OVMF_CODE.secboot.fd || die "cp failed" | 
  | 129 |  | 	cp Build/OvmfX64/*/X64/Shell.efi ovmf/ || die "cp failed" | 
  | 130 |  | 	cp Build/OvmfX64/*/X64/EnrollDefaultKeys.efi ovmf || die "cp failed" | 
  |  | 210 | 	. ./edksetup.sh | 
  | 131 | 211 |  | 
  | 132 |  | 	# Build a convenience UefiShell.img: | 
  |  | 212 | 	# DO NOT enable the shell with Secure Boot as it can be used as a bypass! | 
  | 133 | 213 |  | 
  | 134 |  | 	mkdir -p iso_image/efi/boot || die "mkdir failed" | 
  | 135 |  | 	cp ovmf/Shell.efi iso_image/efi/boot/bootx64.efi || die "cp failed" | 
  | 136 |  | 	cp ovmf/EnrollDefaultKeys.efi iso_image || die "cp failed" | 
  | 137 |  | 	qemu-img convert --image-opts \ | 
  | 138 |  | 		driver=vvfat,floppy=on,fat-type=12,label=UEFI_SHELL,dir=iso_image \ | 
  | 139 |  | 		ovmf/UefiShell.img || die "qemu-img failed" | 
  |  | 214 | 	case "${ARCH}" in | 
  |  | 215 | 	amd64) | 
  |  | 216 | 		local SIZE | 
  |  | 217 | 		for SIZE in _2M _4M; do | 
  |  | 218 | 			mybuild -a X64 -p OvmfPkg/OvmfPkgX64.dsc \ | 
  |  | 219 | 				-D FD_SIZE${SIZE}B \ | 
  |  | 220 | 				-D BUILD_SHELL=FALSE \ | 
  |  | 221 | 				-D SECURE_BOOT_ENABLE \ | 
  |  | 222 | 				-D SMM_REQUIRE | 
  |  | 223 |  | 
  |  | 224 | 			mv -T Build/OvmfX64 Build/OvmfX64${SIZE}.secboot || die | 
  |  | 225 |  | 
  |  | 226 | 			mybuild -a X64 -p OvmfPkg/OvmfPkgX64.dsc \ | 
  |  | 227 | 				-D FD_SIZE${SIZE}B | 
  |  | 228 |  | 
  |  | 229 | 			mv -T Build/OvmfX64 Build/OvmfX64${SIZE} || die | 
  |  | 230 |  | 
  |  | 231 | 			mk_fw_vars x64 Build/OvmfX64${SIZE}.secboot/"${BUILD_DIR}"/FV/OVMF_VARS.fd | 
  |  | 232 | 		done | 
  |  | 233 |  | 
  |  | 234 | 		# Fedora only converts newer images to QCOW2. 2MB images are raw. | 
  |  | 235 | 		raw_to_qcow2 0 Build/OvmfX64_4M*/"${BUILD_DIR}"/FV/OVMF_{CODE,VARS}.fd | 
  |  | 236 | 		;; | 
  |  | 237 | 	arm64) | 
  |  | 238 | 		BUILD_ARGS+=( | 
  |  | 239 | 			# grub.efi uses EfiLoaderData for code | 
  |  | 240 | 			--pcd PcdDxeNxMemoryProtectionPolicy=0xC000000000007FD1 | 
  |  | 241 | 			# shim.efi has broken MemAttr code | 
  |  | 242 | 			--pcd PcdUninstallMemAttrProtocol=TRUE | 
  |  | 243 | 		) | 
  |  | 244 |  | 
  |  | 245 | 		mybuild -a AARCH64 -p ArmVirtPkg/ArmVirtQemu.dsc \ | 
  |  | 246 | 			-D BUILD_SHELL=FALSE \ | 
  |  | 247 | 			-D SECURE_BOOT_ENABLE | 
  |  | 248 |  | 
  |  | 249 | 		mv -T Build/ArmVirtQemu-AARCH64 Build/ArmVirtQemu-AARCH64.secboot_INSECURE || die | 
  |  | 250 |  | 
  |  | 251 | 		mybuild -a AARCH64 -p ArmVirtPkg/ArmVirtQemu.dsc | 
  |  | 252 |  | 
  |  | 253 | 		mk_fw_vars arm64 Build/ArmVirtQemu-AARCH64.secboot_INSECURE/"${BUILD_DIR}"/FV/QEMU_VARS.fd | 
  |  | 254 | 		raw_to_qcow2 64m Build/ArmVirtQemu-AARCH64*/"${BUILD_DIR}"/FV/QEMU_{EFI,VARS}.fd | 
  |  | 255 | 		;; | 
  |  | 256 | 	esac | 
  | 140 | 257 | } | 
  | 141 | 258 |  | 
  | 142 | 259 | src_install() { | 
  | 143 |  | 	insinto /usr/share/edk2-ovmf | 
  | 144 |  | 	doins ovmf/* | 
  |  | 260 | 	local SIZE TYPE FMT | 
  |  | 261 |  | 
  |  | 262 | 	case "${ARCH}" in | 
  |  | 263 | 	amd64) | 
  |  | 264 | 		insinto ${DIR}/OvmfX64 | 
  |  | 265 | 		doins Build/OvmfX64_2M/"${BUILD_DIR}"/X64/Shell.efi | 
  |  | 266 |  | 
  |  | 267 | 		for SIZE in _2M _4M; do | 
  |  | 268 | 			for TYPE in "" .secboot; do | 
  |  | 269 | 				[[ ${SIZE} = _4M ]] && FMT=qcow2 || FMT=fd | 
  |  | 270 | 				newins Build/OvmfX64${SIZE}${TYPE}/"${BUILD_DIR}"/FV/OVMF_CODE.${FMT} OVMF_CODE${SIZE#_2M}${TYPE}.${FMT} | 
  |  | 271 | 				newins Build/OvmfX64${SIZE}${TYPE}/"${BUILD_DIR}"/FV/OVMF_VARS.${FMT} OVMF_VARS${SIZE#_2M}${TYPE}.${FMT} | 
  |  | 272 | 			done | 
  |  | 273 | 		done | 
  |  | 274 |  | 
  |  | 275 | 		# Compatibility with older package versions. | 
  |  | 276 | 		dosym ${PN}/OvmfX64 /usr/share/edk2-ovmf | 
  |  | 277 | 		;; | 
  |  | 278 | 	arm64) | 
  |  | 279 | 		insinto ${DIR}/ArmVirtQemu-AARCH64 | 
  |  | 280 |  | 
  |  | 281 | 		for TYPE in "" .secboot_INSECURE; do | 
  |  | 282 | 			newins Build/ArmVirtQemu-AARCH64${TYPE}/"${BUILD_DIR}"/FV/QEMU_EFI.qcow2 QEMU_EFI${TYPE}.qcow2 | 
  |  | 283 | 			newins Build/ArmVirtQemu-AARCH64${TYPE}/"${BUILD_DIR}"/FV/QEMU_VARS.qcow2 QEMU_VARS${TYPE}.qcow2 | 
  |  | 284 | 		done | 
  |  | 285 | 		;; | 
  |  | 286 | 	esac | 
  | 145 | 287 |  | 
  | 146 | 288 | 	insinto /usr/share/qemu/firmware | 
  | 147 |  | 	doins qemu/* | 
  | 148 |  | 	rm "${ED}"/usr/share/qemu/firmware/40-edk2-ovmf-x64-sb-enrolled.json || die "rm failed" | 
  |  | 289 | 	doins "${FILESDIR}"/descriptors/*"${TARGET_ARCH,,}"*.json | 
  | 149 | 290 |  | 
  | 150 | 291 | 	secureboot_auto_sign --in-place | 
  | 151 |  |  | 
  | 152 | 292 | 	readme.gentoo_create_doc | 
  | 153 | 293 | } | 
  | 154 | 294 |  | 
  |  | 295 | pkg_preinst() { | 
  |  | 296 | 	local OLD=${EROOT}/usr/share/edk2-ovmf NEW=${EROOT}/${DIR}/OvmfX64 | 
  |  | 297 | 	if [[ -d ${OLD} && ! -L ${OLD} ]]; then | 
  |  | 298 | 		{ | 
  |  | 299 | 			rm -vf "${OLD}"/{OVMF_{CODE,CODE.secboot,VARS}.fd,EnrollDefaultKeys.efi,Shell.efi,UefiShell.img} && | 
  |  | 300 | 			mkdir -p "${NEW}" && | 
  |  | 301 | 			find "${OLD}" -mindepth 1 -maxdepth 1 -execdir mv --update=none-fail -vt "${NEW}"/ {} + && | 
  |  | 302 | 			rmdir "${OLD}" | 
  |  | 303 | 		} || die "unable to replace old directory with compatibility symlink" | 
  |  | 304 | 	fi | 
  |  | 305 | } | 
  |  | 306 |  | 
  | 155 | 307 | pkg_postinst() { | 
  | 156 | 308 | 	readme.gentoo_print_elog | 
  | 157 | 309 | } |