From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52A8FC433EF for ; Mon, 18 Oct 2021 17:30:24 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3E4BF60EE9 for ; Mon, 18 Oct 2021 17:30:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 3E4BF60EE9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id A2CEB80691; Mon, 18 Oct 2021 19:30:20 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="S5x6Nu6O"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 5584580646; Mon, 18 Oct 2021 19:30:18 +0200 (CEST) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 2B04A80646 for ; Mon, 18 Oct 2021 19:30:13 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1634578210; bh=y3GIfyI4RUdEnSeMckzNojgZ5IXaVuixuhqoSUVPYRM=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=S5x6Nu6O61+uvlRurBgEUMyxE+OYfmmjN7o/zqqns0+AgqrGXQMwv/p4ZRJiPdRWH dzFJ5U82j3fio9dNo8yk0HTtT79RC9ICukJQnRgvF2XAjzbhZ8mHvj6IBzChVFZuv3 2bJgKq20oVUfxguVm9/VaEduuw20VGfiQtdI6kfk= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.123.35] ([88.152.144.157]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1McY8d-1n7zjQ2p3N-00d020; Mon, 18 Oct 2021 19:30:09 +0200 Subject: Re: [PATCH v2 07/39] efi: Add a script for building and testing U-Boot on UEFI To: Simon Glass Cc: Bin Meng , Christian Melki , Tom Rini , Ilias Apalodimas , Alexander Graf , U-Boot Mailing List References: <20210925003055.759305-1-sjg@chromium.org> <20210924183029.v2.7.Ic4d32c355c4baf5745ba07ba17c04d0726791618@changeid> From: Heinrich Schuchardt Message-ID: Date: Mon, 18 Oct 2021 19:30:08 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.14.0 MIME-Version: 1.0 In-Reply-To: <20210924183029.v2.7.Ic4d32c355c4baf5745ba07ba17c04d0726791618@changeid> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:YMPx653PyRFu2fv6+bnO+MZVjIDqOhRdpoLd+vdOmLnR1VE165Z TI+1pIF8UBCvHKQufwDFEfnsN95vgnLhamTTakIEeR76k1d/YaEtAfFepxu7O5wbOWDVWqX tBGKcDhzrfwbVV3ydM3OXVwOTST6d7d4mb1+8maM2/1ozkmmOhW4velxM8ESUb9PT+DCPr/ 0sMf260+agGR5aHHfatxw== X-UI-Out-Filterresults: notjunk:1;V03:K0:2wape0JQKb8=:tu7a+SRu5M7TMVO7+0kfAK ziGDc+iu7BrcZ0vucscbZElExI5VaaxR2ZnsUMlu4OV+lq3K+bLYzYj40YFh/W7tftOTH0Enp uXpZ7Cs/7OBc+uRq2Cdv/lKa1S5bbXYH0VHafy2hGM3gy8SxJlFkEHpmMDpsL5YiufWHZQmcQ qt+Y1D1oyQ+/hZUZAC42SmGupJSeg6mnlo6cA2g3g60LGZqSrkyg6AQJoIWj21zzLIWs4TlQk k7fjEVuzOib+r0sIVLQWwCTLlipKmwmBLf4BRX3vnsrZdvMzYsdfWpzUHuZ6TMo22GWafe6mR BFJanmCGUlGeyE+a8XR5DYrVEXor0K5AnukywyL0GC+FFvqS4PASeJi9K5oLIurBSrsEQFVd7 M5J8gRIIgWiPrWiceX3olfBHN1YR/fJg+HpmEDnFVVOPALqxyB6I7sOXqWSZRcBn0RKKAs1ic 5/R4aTSG/OSoe4ZuOkhw7KvTwqgq+SHj70sgslwGozVoWxS78kLRKpaSNaNx9b0lCsnQ3D6q2 5s+lHxzXkDcBGdQsrTZV3YdkKVyZmYzRgSL/e+K9XxfywPw0wQjkir2/6C42gJ/RAeIFs+Lxx 9+8iNkMnKWKQn2Ym0Op7N8RzDapBExQvF6NBOw/pHj8RPSCzR3FEYypvq68wgXmkKlIm3Hf+h sGhQDfmf3fZY/O7sB8W+dDUwrLkAOgjgFEUg5VgDr2hYhigeD24HIku6NR2cjCfxTxwQD57Pl fjxrFKM05wn57Xfi7UdekSEwhzxfMc/MQj6wFfOP5Ig6Qe0KjUJ9Uxprz70zHi9N7iYjAuHAB DhkShySJ1ppJACu/kUWKgiZfhesDQFhOKKI8Q5b2a5VXHkwTA2FVmC+weUiR6om5LpfbOBKkt g+LzI5guUuSFAMi2rgoi6IMiNSAlPTwXC68V1+7lnMDobRVDLGOJa2+8WW39B29YL+upUeXFe SKjyOMn3pEr4W86zi8uBMqY6fRKbhcT/DgWFkvOg2dYN7mUwqF3nMFpouoIuudgm6BLKYa2Hj FSKerQPVbkQSA4NxWLt7MFSQmBkDqSWlZXS0BKAjaDuG+j1jgOCfusmJ/gewp3zf8A72h7lji 6t3Yto19wM6F4aTjb17W8bL2v7PaE2lXw8g5UeFjJp8P8jyoaWVSQAuPzA/aZcpoEezw3jgRg AJAFvEXl7Kf+Fg2ePPrqLqVYFc X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean On 9/25/21 2:30 AM, Simon Glass wrote: > It is quite complicating to run U-Boot on qemu since we have four Nits: %s/complicating/complicated/ %/qemu/QEMU/ > different builds and they must use different versions of qemu and the QEMU > UEFI binaries. > > Add a script to help. > > Signed-off-by: Simon Glass > --- > > Changes in v2: > - Add MAINTAINERS entry > - Add support for creating a partition table with a filesystem inside > - Add support for running qemu with just a serial console (no display) > > MAINTAINERS | 1 + > doc/develop/uefi/u-boot_on_efi.rst | 62 ++++++++++ > scripts/build-efi.sh | 188 +++++++++++++++++++++++++++++ > 3 files changed, 251 insertions(+) > create mode 100755 scripts/build-efi.sh > > diff --git a/MAINTAINERS b/MAINTAINERS > index 019c87592c5..84750be81a9 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -706,6 +706,7 @@ M: Heinrich Schuchardt > S: Maintained > W: https://u-boot.readthedocs.io/en/latest/develop/uefi/u-boot_on_efi.= html > F: lib/efi/efi_app.c > +F: scripts/build-efi.sh > > EFI PAYLOAD > M: Heinrich Schuchardt > diff --git a/doc/develop/uefi/u-boot_on_efi.rst b/doc/develop/uefi/u-boo= t_on_efi.rst > index c9a41bc919f..4b2a733076d 100644 > --- a/doc/develop/uefi/u-boot_on_efi.rst > +++ b/doc/develop/uefi/u-boot_on_efi.rst > @@ -96,6 +96,11 @@ that EFI does not support booting a 64-bit applicatio= n from a 32-bit > EFI (or vice versa). Also it will often fail to print an error message= if > you get this wrong. > > +You may find the script `scripts/build-efi.sh` helpful for building and= testing > +U-Boot on UEFI on QEMU. It also includes links to UEFI binaries dating = from > +2021. > + > +See `Example run`_ for an example run. > > Inner workings > -------------- > @@ -191,6 +196,63 @@ of code is built this way (see the extra- line in l= ib/efi/Makefile). > Everything else is built as a normal U-Boot, so is always 32-bit on x8= 6 at > present. > > +Example run > +----------- > + > +This shows running with serial enabled (see `include/configs/efi-x86_ap= p.h`):: > + > + $ scripts/build-efi.sh -wsPr > + Packaging efi-x86_app32 > + Running qemu-system-i386 > + > + BdsDxe: failed to load Boot0001 "UEFI QEMU HARDDISK QM00005 " from P= ciRoot(0x0)/Pci(0x3,0x0)/Sata(0x0,0xFFFF,0x0): Not Found > + BdsDxe: loading Boot0002 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB-= 4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) > + BdsDxe: starting Boot0002 "EFI Internal Shell" from Fv(7CB8BDC9-F8EB= -4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) > + > + UEFI Interactive Shell v2.2 > + EDK II > + UEFI v2.70 (EDK II, 0x00010000) > + Mapping table > + FS0: Alias(s):HD0a65535a1:;BLK1: > + PciRoot(0x0)/Pci(0x3,0x0)/Sata(0x0,0xFFFF,0x0)/HD(1,GPT,0F= FD5E61-3B0C-4326-8049-BDCDC910AF72,0x800,0xB000) > + BLK0: Alias(s): > + PciRoot(0x0)/Pci(0x3,0x0)/Sata(0x0,0xFFFF,0x0) > + > + Press ESC in 5 seconds to skip startup.nsh or any other key to conti= nue. > + Shell> fs0:u-boot-app.efi > + U-Boot EFI App (using allocated RAM address 47d4000) key=3D8d4, imag= e=3D06a6f610 > + starting > + > + > + U-Boot 2022.01-rc4 (Sep 19 2021 - 14:03:20 -0600) > + > + CPU: x86, vendor Intel, device 663h > + DRAM: 32 MiB > + 0: efi_media_0 PciRoot(0x0)/Pci(0x3,0x0)/Sata(0x0,0xFFFF,0x0) > + 1: PciRoot(0x0)/Pci(0x3,0x0)/Sata(0x0,0xFFFF,0x0)/HD(1= ,GPT,0FFD5E61-3B0C-4326-8049-BDCDC910AF72,0x800,0xB000) > + Loading Environment from nowhere... OK > + Model: EFI x86 Application > + Hit any key to stop autoboot: 0 > + > + Partition Map for EFI device 0 -- Partition Type: EFI > + > + Part Start LBA End LBA Name > + Attributes > + Type GUID > + Partition GUID > + 1 0x00000800 0x0000b7ff "boot" > + attrs: 0x0000000000000000 > + type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 > + guid: 0ffd5e61-3b0c-4326-8049-bdcdc910af72 > + 19 startup.nsh > + 528384 u-boot-app.efi > + 10181 NvVars > + > + 3 file(s), 0 dir(s) > + > + =3D> QEMU: Terminated > + > + > Future work > ----------- > This work could be extended in a number of ways: > diff --git a/scripts/build-efi.sh b/scripts/build-efi.sh > new file mode 100755 > index 00000000000..e6c035a7495 > --- /dev/null > +++ b/scripts/build-efi.sh > @@ -0,0 +1,188 @@ > +#!/bin/bash > +# SPDX-License-Identifier: GPL-2.0+ > +# > +# Script to build an EFI thing suitable for booting with qemu, possibly= running > +# it also. > + > +# This just an example. It assumes that > + > +# - you build U-Boot in /tmp/b/ where is the U-Boot board = config > +# - /mnt/x is a directory used for mounting > +# - you have access to the 'pure UEFI' builds for qemu > +# > +# UEFI binaries for QEMU used for testing this script: > +# > +# OVMF-pure-efi.i386.fd at > +# https://drive.google.com/file/d/1jWzOAZfQqMmS2_dAK2G518GhIgj9r2RY/vie= w?usp=3Dsharing > + > +# OVMF-pure-efi.x64.fd at > +# https://drive.google.com/file/d/1c39YI9QtpByGQ4V0UNNQtGqttEzS-eFV/vie= w?usp=3Dsharing > + > +set -e > + > +usage() { > + echo "Usage: $0 [-a | -p] [other opts]" 1>&2 > + echo 1>&2 > + echo " -a - Package up the app" 1>&2 > + echo " -o - Use old EFI app build (before 32/64 split)" 1>&2 Why is this option needed? > + echo " -p - Package up the payload" 1>&2 > + echo " -P - Create a partition table" 1>&2 > + echo " -r - Run qemu with the image" 1>&2 QEMU > + echo " -s - Run qemu with serial only (no display)" 1>&2 QEMU Best regards Heinrich > + echo " -w - Use word version (32-bit)" 1>&2 > + exit 1 > +} > + > +# 32- or 64-bit EFI > +bitness=3D64 > + > +# app or payload ? > +type=3Dapp > + > +# create a partition table and put the filesystem in that (otherwise pu= t the > +# filesystem in the raw device) > +part=3D > + > +# run the image with qemu > +run=3D > + > +# run qemu without a display (U-Boot must be set to stdout=3Dserial) > +serial=3D > + > +# before the 32/64 split of the app > +old=3D > + > +while getopts "aopPrsw" opt; do > + case "${opt}" in > + a) > + type=3Dapp > + ;; > + p) > + type=3Dpayload > + ;; > + r) > + run=3D1 > + ;; > + s) > + serial=3D1 > + ;; > + w) > + bitness=3D32 > + ;; > + o) > + old=3D1 > + ;; > + P) > + part=3D1 > + ;; > + *) > + usage > + ;; > + esac > +done > + > +run_qemu() { > + extra=3D > + if [[ "${bitness}" =3D "64" ]]; then > + qemu=3Dqemu-system-x86_64 > + bios=3DOVMF-pure-efi.x64.fd > + else > + qemu=3Dqemu-system-i386 > + bios=3DOVMF-pure-efi.i386.fd > + fi > + if [[ -n "${serial}" ]]; then > + extra=3D"-display none -serial mon:stdio" > + fi > + echo "Running ${qemu}" > + "${qemu}" -bios "${bios}" \ > + -drive id=3Ddisk,file=3D"${IMG}",if=3Dnone,format=3Draw \ > + -nic none -device ahci,id=3Dahci \ > + -device ide-hd,drive=3Ddisk,bus=3Dahci.0 ${extra} > +} > + > +# Put files in /tmp/b/${BUILD} > +setup_files() { > + echo "Packaging ${BUILD}" > + mkdir -p $TMP > + cat >$TMP/startup.nsh < +fs0:u-boot-${type}.efi > +EOF > + sudo cp /tmp/b/$BUILD/u-boot-${type}.efi $TMP > + > + # Can copy in other files here: > + #sudo cp /tmp/b/$BUILD/image.bin $TMP/chromeos.rom > + #sudo cp /boot/vmlinuz-5.4.0-77-generic $TMP/vmlinuz > +} > + > +# Copy files into the filesystem > +copy_files() { > + sudo cp $TMP/* $MNT > +} > + > +# Create a filesystem on a raw device and copy in the files > +setup_raw() { > + mkfs.vfat "${IMG}" >/dev/null > + sudo mount -o loop "${IMG}" $MNT > + copy_files > + sudo umount $MNT > +} > + > +# Create a partition table and put the filesystem in the first partitio= n > +# then copy in the files > +setup_part() { > + # Create a gpt partition table with one parittion > + parted "${IMG}" mklabel gpt 2>/dev/null > + > + # This doesn't work correctly. It creates: > + # Number Start End Size File system Name Flags > + # 1 1049kB 24.1MB 23.1MB boot msftdata > + # Odd if the same is entered interactively it does set the FS type > + parted -s -a optimal -- "${IMG}" mkpart boot fat32 1MiB 23MiB > + > + # Map this partition to a loop device > + kp=3D"$(sudo kpartx -av ${IMG})" > + read boot_dev<<<$(grep -o 'loop.*p.' <<< "${kp}") > + test "${boot_dev}" > + dev=3D"/dev/mapper/${boot_dev}" > + > + mkfs.vfat "${dev}" >/dev/null > + > + sudo mount -o loop "${dev}" $MNT > + > + copy_files > + > + # Sync here since this makes kpartx more likely to work the first time > + sync > + sudo umount $MNT > + > + # For some reason this needs a sleep or it sometimes fails, if it was > + # run recently (in the last few seconds) > + if ! sudo kpartx -d "${IMG}" > /dev/null; then > + sleep .5 > + sudo kpartx -d "${IMG}" > /dev/null || \ > + echo "Failed to remove ${boot_dev}, use: sudo kpartx -d ${IMG}" > + fi > +} > + > +TMP=3D"/tmp/efi${bitness}${type}" > +MNT=3D/mnt/x > +BUILD=3D"efi-x86_${type}${bitness}" > +IMG=3Dtry.img > + > +if [[ -n "${old}" && "${bitness}" =3D "32" ]]; then > + BUILD=3D"efi-x86_${type}" > +fi > + > +setup_files > + > +qemu-img create "${IMG}" 24M >/dev/null > + > +if [[ -n "${part}" ]]; then > + setup_part > +else > + setup_raw > +fi > + > +if [[ -n "${run}" ]]; then > + run_qemu > +fi >