From: Nikos Nikoleris <nikos.nikoleris@arm.com>
To: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: kvm@vger.kernel.org, andrew.jones@linux.dev, drjones@redhat.com,
pbonzini@redhat.com, jade.alglave@arm.com, ricarkol@google.com,
seanjc@google.com, zixuanwang@google.com
Subject: Re: [kvm-unit-tests PATCH v3 00/27] EFI and ACPI support for arm64
Date: Tue, 9 Aug 2022 17:09:42 +0100 [thread overview]
Message-ID: <d93612b3-5fca-48ee-4c80-94e11c045dcd@arm.com> (raw)
In-Reply-To: <YvJB/KCLSQK836ae@monolith.localdoman>
Hi,
On 09/08/2022 12:16, Alexandru Elisei wrote:
> Hi,
>
> Adding Sean and Zixuan, as they were involved in the initial x86 UEFI
> support.
>
> This version of the UEFI support for arm64 jumps to lib/efi.c::efi_main
> after performing the relocation. I'll post an abbreviated/simplified
> version of efi_main() for reference:
>
> efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab)
> {
> /* Get image, cmdline and memory map parameters from UEFI */
>
> efi_exit_boot_services(handle, &efi_bootinfo.mem_map);
>
> /* Set up arch-specific resources */
> setup_efi(&efi_bootinfo);
>
> /* Run the test case */
> ret = main(__argc, __argv, __environ);
>
> /* Shutdown the guest VM */
> efi_exit(ret);
>
> /* Unreachable */
> return EFI_UNSUPPORTED;
> }
>
> Note that the assumption that efi_main() makes is that setup_efi() doesn't
> change the stack from the stack that the UEFI implementation allocated, in
> order for setup_efi() to be able to return to efi_main().
>
> arm64 requires explicit data cache maintenance to keep the contents of the
> caches in sync with memory when writing with MMU off/reading with MMU on
> and viceversa. More details of what is needed is why here [1] and here [2].
> These operations must also be performed for the stack because the stack is
> always used when running C code.
>
> What this means is that if arm64 wants to be able to run C code when the
> MMU is disabled and when it is enabled, then it must perform data cache
> operations for the stack memory. Which is impossible if the stack has been
> allocated by UEFI, as kvm-unit-tests has no way of knowing its size, as it
> isn't specified in the UEFI spec*. As a result, either efi_main needs to be
> changed such that setup_efi() never returns, or arm64 must implement its
> own version of efi_main() (or however it will end up being called).
>
I think it's possible to know the size of the stack. In 22/27 "arm64:
Use code from the gnu-efi when booting with EFI", we change the top of
the stack we start executing C code. Then at any point we can get the
bottom of the stack.
But I doubt cleaning the stack is sufficient. What about the .data
segment. Take for example, mem_regions. We populate them with the MMU
on. We then use them to create page tables. We will need to clean them
too. I won't be surprised if there is more data we would need to clean.
Thanks,
Nikos
> One way to get around this is never to run C code with the MMU off. That's
> relatively easy to do in the boot code, as the translation tables can be
> constructed with the MMU on, and then a fairly small assembly sequence is
> required to install them.
>
> But arm64 also has two mechanisms for disabling the MMU:
>
> 1. At compile time, the user can request a test to start with the MMU off,
> by setting the flag AUXINFO_MMU_OFF. So when booting as an UEFI app,
> kvm-unit-tests must disable the MMU.
>
> 2. A function called mmu_disable() which allows a test to explicitly
> disable the MMU.
>
> If we want to keep the UEFI allocated stack, then both mechanism must be
> forbidden when running under UEFI. I dislike this idea, because those two
> mechanisms allow kvm-unit-tests to run tests which otherwise wouldn't have
> been possible with a normal operating system, which, except for the early
> boot code, runs with the MMU enabled.
>
> Any thoughts or comments about this?
>
> *UEFI v2.8 states about the stack: "128 KiB or more of available stack
> space" (page 35), but EDK2 allocates 64KiB [3]. So without any firmware
> call to query the size of the stack, kvm-unit-tests cannot rely on it being
> a specific size.
>
> [1] https://lore.kernel.org/kvm/20220809091558.14379-19-alexandru.elisei@arm.com/
> [2] https://lore.kernel.org/kvm/20220809091558.14379-20-alexandru.elisei@arm.com/
> [3] https://github.com/tianocore/edk2/blob/master/ArmPlatformPkg/ArmPlatformPkg.dec#L71
>
> Thanks,
> Alex
>
> On Thu, Jun 30, 2022 at 11:02:57AM +0100, Nikos Nikoleris wrote:
>> Hello,
>>
>> This patch series adds initial support for building arm64 tests as EFI
>> tests and running them under QEMU. Much like x86_64 we import external
>> dependencies from gnu-efi and adapt them to work with types and other
>> assumptions from kvm-unit-tests. In addition, this series adds support
>> for enumerating parts of the system using ACPI.
>>
>> The first set of patches moves the existing ACPI code to the common
>> lib path. Then, it extends definitions and functions to allow for more
>> robust discovery of ACPI tables. In arm64, we add support for setting
>> up the PSCI conduit, discovering the UART, timers and cpus via
>> ACPI. The code retains existing behavior and gives priority to
>> discovery through DT when one has been provided.
>>
>> In the second set of patches, we add support for getting the command
>> line from the EFI shell. This is a requirement for many of the
>> existing arm64 tests.
>>
>> In the third set of patches, we import code from gnu-efi, make minor
>> changes and add an alternative setup sequence from arm64 systems that
>> boot through EFI. Finally, we add support in the build system and a
>> run script which is used to run an EFI app.
>>
>> After this set of patches one can build arm64 EFI tests:
>>
>> $> ./configure --enable-efi
>> $> make
>>
>> And use the run script to run an EFI tests:
>>
>> $> ./arm/efi/run ./arm/selftest.efi -smp 2 -m 256 -append "setup smp=2 mem=256"
>>
>> Or all tests:
>>
>> $> ./run_tests.sh
>>
>> There are a few items that this series does not address but they would
>> be useful to have:
>> - Support for booting the system from EL2. Currently, we assume that a
>> tests starts running at EL1. This the case when we run with EFI, it's
>> not always the case in hardware.
>> - Support for reading environment variables and populating __envp.
>> - Support for discovering the PCI subsystem using ACPI.
>> - Get rid of other assumptions (e.g., vmalloc area) that don't hold on real HW.
>>
>> git branch: https://github.com/relokin/kvm-unit-tests/pull/new/target-efi-upstream-v3-rebased
>>
>> v2: https://lore.kernel.org/kvm/20220506205605.359830-1-nikos.nikoleris@arm.com/
>>
>> Changes in v3:
>> - Addressed feedback from Drew, Alex and Ricardo. Many thanks for the reviews!
>> - Added support for discovering the GIC through ACPI
>> - Added a missing header file (<elf.h>)
>> - Added support for correctly parsing the outcome of tests (./run_tests)
>>
>> Thanks,
>>
>> Nikos
>>
>> Alexandru Elisei (1):
>> lib: arm: Print test exit status
>>
>> Andrew Jones (3):
>> arm/arm64: mmu_disable: Clean and invalidate before disabling
>> arm/arm64: Rename etext to _etext
>> arm64: Add a new type of memory type flag MR_F_RESERVED
>>
>> Nikos Nikoleris (23):
>> lib: Fix style for acpi.{c,h}
>> x86: Avoid references to fields of ACPI tables
>> lib: Ensure all struct definition for ACPI tables are packed
>> lib: Add support for the XSDT ACPI table
>> lib: Extend the definition of the ACPI table FADT
>> devicetree: Check if fdt is NULL before returning that a DT is
>> available
>> arm/arm64: Add support for setting up the PSCI conduit through ACPI
>> arm/arm64: Add support for discovering the UART through ACPI
>> arm/arm64: Add support for timer initialization through ACPI
>> arm/arm64: Add support for cpu initialization through ACPI
>> arm/arm64: Add support for gic initialization through ACPI
>> lib/printf: Support for precision modifier in printf
>> lib/printf: Add support for printing wide strings
>> lib/efi: Add support for getting the cmdline
>> lib: Avoid ms_abi for calls related to EFI on arm64
>> arm/arm64: Add a setup sequence for systems that boot through EFI
>> arm64: Copy code from GNU-EFI
>> arm64: Change GNU-EFI imported file to use defined types
>> arm64: Use code from the gnu-efi when booting with EFI
>> lib: Avoid external dependency in libelf
>> x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile
>> arm64: Add support for efi in Makefile
>> arm64: Add an efi/run script
>>
>> scripts/runtime.bash | 14 +-
>> arm/efi/run | 61 +++++++
>> arm/run | 14 +-
>> configure | 15 +-
>> Makefile | 4 -
>> arm/Makefile.arm | 6 +
>> arm/Makefile.arm64 | 18 +-
>> arm/Makefile.common | 48 +++--
>> x86/Makefile.x86_64 | 4 +
>> lib/linux/efi.h | 25 +++
>> lib/arm/asm/setup.h | 3 +
>> lib/arm/asm/timer.h | 2 +
>> lib/acpi.h | 348 ++++++++++++++++++++++++++++--------
>> lib/argv.h | 1 +
>> lib/elf.h | 57 ++++++
>> lib/libcflat.h | 1 +
>> lib/acpi.c | 129 ++++++++-----
>> lib/argv.c | 2 +-
>> lib/arm/gic.c | 127 ++++++++++++-
>> lib/arm/io.c | 29 ++-
>> lib/arm/mmu.c | 4 +
>> lib/arm/psci.c | 25 ++-
>> lib/arm/setup.c | 247 ++++++++++++++++++++-----
>> lib/arm/timer.c | 79 ++++++++
>> lib/devicetree.c | 2 +-
>> lib/efi.c | 102 +++++++++++
>> lib/printf.c | 194 ++++++++++++++++++--
>> arm/efi/elf_aarch64_efi.lds | 63 +++++++
>> arm/flat.lds | 2 +-
>> arm/cstart.S | 29 ++-
>> arm/cstart64.S | 28 ++-
>> arm/efi/crt0-efi-aarch64.S | 143 +++++++++++++++
>> arm/dummy.c | 4 +
>> arm/efi/reloc_aarch64.c | 93 ++++++++++
>> arm/micro-bench.c | 4 +-
>> arm/timer.c | 10 +-
>> x86/s3.c | 19 +-
>> x86/vmexit.c | 2 +-
>> 38 files changed, 1700 insertions(+), 258 deletions(-)
>> create mode 100755 arm/efi/run
>> create mode 100644 lib/elf.h
>> create mode 100644 lib/arm/timer.c
>> create mode 100644 arm/efi/elf_aarch64_efi.lds
>> create mode 100644 arm/efi/crt0-efi-aarch64.S
>> create mode 100644 arm/dummy.c
>> create mode 100644 arm/efi/reloc_aarch64.c
>>
>> --
>> 2.25.1
>>
next prev parent reply other threads:[~2022-08-09 16:10 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-30 10:02 [kvm-unit-tests PATCH v3 00/27] EFI and ACPI support for arm64 Nikos Nikoleris
2022-06-30 10:02 ` [kvm-unit-tests PATCH v3 01/27] lib: Fix style for acpi.{c,h} Nikos Nikoleris
2022-07-01 9:27 ` Andrew Jones
2022-07-01 9:52 ` Nikos Nikoleris
2022-07-01 10:12 ` Andrew Jones
2022-06-30 10:02 ` [kvm-unit-tests PATCH v3 02/27] x86: Avoid references to fields of ACPI tables Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 03/27] lib: Ensure all struct definition for ACPI tables are packed Nikos Nikoleris
2022-07-01 9:35 ` Andrew Jones
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 04/27] lib: Add support for the XSDT ACPI table Nikos Nikoleris
2022-07-01 9:49 ` Andrew Jones
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 05/27] lib: Extend the definition of the ACPI table FADT Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 06/27] devicetree: Check if fdt is NULL before returning that a DT is available Nikos Nikoleris
2022-07-01 9:55 ` Andrew Jones
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 07/27] arm/arm64: Add support for setting up the PSCI conduit through ACPI Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 08/27] arm/arm64: Add support for discovering the UART " Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 09/27] arm/arm64: Add support for timer initialization " Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 10/27] arm/arm64: Add support for cpu " Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 11/27] arm/arm64: Add support for gic " Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 12/27] lib/printf: Support for precision modifier in printf Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 13/27] lib/printf: Add support for printing wide strings Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 14/27] lib/efi: Add support for getting the cmdline Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 15/27] arm/arm64: mmu_disable: Clean and invalidate before disabling Nikos Nikoleris
2022-06-30 10:20 ` Alexandru Elisei
2022-06-30 11:08 ` Nikos Nikoleris
2022-06-30 11:24 ` Alexandru Elisei
2022-06-30 15:16 ` Nikos Nikoleris
2022-06-30 15:57 ` Alexandru Elisei
2022-07-01 9:12 ` Andrew Jones
2022-07-01 10:24 ` Alexandru Elisei
2022-07-01 11:16 ` Andrew Jones
2022-07-11 14:23 ` Alexandru Elisei
2022-07-01 11:34 ` Nikos Nikoleris
2022-07-01 14:39 ` Alexandru Elisei
2022-07-01 10:36 ` Andrew Jones
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 16/27] arm/arm64: Rename etext to _etext Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 17/27] lib: Avoid ms_abi for calls related to EFI on arm64 Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 18/27] arm64: Add a new type of memory type flag MR_F_RESERVED Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 19/27] arm/arm64: Add a setup sequence for systems that boot through EFI Nikos Nikoleris
2022-06-30 10:54 ` Alexandru Elisei
2022-07-19 14:08 ` Alexandru Elisei
2022-08-12 14:34 ` Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 20/27] arm64: Copy code from GNU-EFI Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 21/27] arm64: Change GNU-EFI imported file to use defined types Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 22/27] arm64: Use code from the gnu-efi when booting with EFI Nikos Nikoleris
2022-07-01 0:43 ` Ricardo Koller
2022-07-04 9:18 ` Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 23/27] lib: Avoid external dependency in libelf Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 24/27] x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 25/27] arm64: Add support for efi in Makefile Nikos Nikoleris
2022-07-12 13:39 ` Alexandru Elisei
2022-07-12 20:50 ` Nikos Nikoleris
2022-07-13 8:46 ` Alexandru Elisei
2022-07-13 9:17 ` Nikos Nikoleris
2022-07-15 13:59 ` Nikos Nikoleris
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 26/27] lib: arm: Print test exit status Nikos Nikoleris
2022-07-01 10:48 ` Andrew Jones
2022-06-30 10:03 ` [kvm-unit-tests PATCH v3 27/27] arm64: Add an efi/run script Nikos Nikoleris
2022-07-19 15:28 ` [kvm-unit-tests PATCH v3 00/27] EFI and ACPI support for arm64 Alexandru Elisei
2022-07-22 10:57 ` Nikos Nikoleris
2022-07-22 14:41 ` Alexandru Elisei
2022-08-01 18:23 ` Nikos Nikoleris
2022-08-02 10:19 ` Alexandru Elisei
2022-08-02 10:46 ` Andrew Jones
2022-08-03 12:51 ` Nikos Nikoleris
2022-08-09 11:16 ` Alexandru Elisei
2022-08-09 15:29 ` Sean Christopherson
2022-08-10 9:17 ` Alexandru Elisei
2022-08-10 14:58 ` Sean Christopherson
2022-08-10 15:04 ` Alexandru Elisei
2022-08-09 16:09 ` Nikos Nikoleris [this message]
2022-08-12 14:55 ` Alexandru Elisei
2022-08-12 15:49 ` Nikos Nikoleris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d93612b3-5fca-48ee-4c80-94e11c045dcd@arm.com \
--to=nikos.nikoleris@arm.com \
--cc=alexandru.elisei@arm.com \
--cc=andrew.jones@linux.dev \
--cc=drjones@redhat.com \
--cc=jade.alglave@arm.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=ricarkol@google.com \
--cc=seanjc@google.com \
--cc=zixuanwang@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).