From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Nikos Nikoleris <nikos.nikoleris@arm.com>
Cc: kvm@vger.kernel.org, drjones@redhat.com, pbonzini@redhat.com,
jade.alglave@arm.com
Subject: Re: [kvm-unit-tests PATCH v2 16/23] arm/arm64: Add a setup sequence for systems that boot through EFI
Date: Fri, 13 May 2022 14:31:23 +0100 [thread overview]
Message-ID: <Yn5dhgVGoZUgYGUi@monolith.localdoman> (raw)
In-Reply-To: <20220506205605.359830-17-nikos.nikoleris@arm.com>
Hi,
On Fri, May 06, 2022 at 09:55:58PM +0100, Nikos Nikoleris wrote:
> This change implements an alternative setup sequence for the system
> when we are booting through EFI. The memory map is discovered through
> EFI boot services and devices through ACPI.
>
> This change is based on a change initially proposed by
> Andrew Jones <drjones@redhat.com>
>
> Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
> ---
> lib/linux/efi.h | 1 +
> lib/arm/asm/setup.h | 2 +
> lib/arm/setup.c | 181 +++++++++++++++++++++++++++++++++++++++++++-
> arm/cstart.S | 1 +
> arm/cstart64.S | 1 +
> 5 files changed, 184 insertions(+), 2 deletions(-)
>
> diff --git a/lib/linux/efi.h b/lib/linux/efi.h
> index 594eaca..9b77c39 100644
> --- a/lib/linux/efi.h
> +++ b/lib/linux/efi.h
> @@ -63,6 +63,7 @@ typedef guid_t efi_guid_t;
> (c) & 0xff, ((c) >> 8) & 0xff, d } }
>
> #define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
> +#define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
>
> #define LOADED_IMAGE_PROTOCOL_GUID EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
>
> diff --git a/lib/arm/asm/setup.h b/lib/arm/asm/setup.h
> index 64cd379..1a7e734 100644
> --- a/lib/arm/asm/setup.h
> +++ b/lib/arm/asm/setup.h
> @@ -5,6 +5,7 @@
> *
> * This work is licensed under the terms of the GNU LGPL, version 2.
> */
> +#include <efi.h>
> #include <libcflat.h>
> #include <asm/page.h>
> #include <asm/pgtable-hwdef.h>
> @@ -37,5 +38,6 @@ extern unsigned int mem_region_get_flags(phys_addr_t paddr);
> #define SMP_CACHE_BYTES L1_CACHE_BYTES
>
> void setup(const void *fdt, phys_addr_t freemem_start);
> +efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo);
>
> #endif /* _ASMARM_SETUP_H_ */
> diff --git a/lib/arm/setup.c b/lib/arm/setup.c
> index 2d67292..542e2ff 100644
> --- a/lib/arm/setup.c
> +++ b/lib/arm/setup.c
> @@ -34,7 +34,7 @@
> #define NR_EXTRA_MEM_REGIONS 16
> #define NR_INITIAL_MEM_REGIONS (MAX_DT_MEM_REGIONS + NR_EXTRA_MEM_REGIONS)
>
> -extern unsigned long _etext;
> +extern unsigned long _text, _etext, _data, _edata;
>
> char *initrd;
> u32 initrd_size;
> @@ -44,7 +44,10 @@ int nr_cpus;
>
> static struct mem_region __initial_mem_regions[NR_INITIAL_MEM_REGIONS + 1];
> struct mem_region *mem_regions = __initial_mem_regions;
> -phys_addr_t __phys_offset, __phys_end;
> +phys_addr_t __phys_offset = (phys_addr_t)-1, __phys_end = 0;
> +
> +extern void exceptions_init(void);
> +extern void asm_mmu_disable(void);
>
> int mpidr_to_cpu(uint64_t mpidr)
> {
> @@ -272,3 +275,177 @@ void setup(const void *fdt, phys_addr_t freemem_start)
> if (!(auxinfo.flags & AUXINFO_MMU_OFF))
> setup_vm();
> }
> +
> +#ifdef CONFIG_EFI
> +
> +#include <efi.h>
> +
> +static efi_status_t setup_rsdp(efi_bootinfo_t *efi_bootinfo)
> +{
> + efi_status_t status;
> + struct rsdp_descriptor *rsdp;
> +
> + /*
> + * RSDP resides in an EFI_ACPI_RECLAIM_MEMORY region, which is not used
> + * by kvm-unit-tests arm64 memory allocator. So it is not necessary to
> + * copy the data structure to another memory region to prevent
> + * unintentional overwrite.
> + */
> + status = efi_get_system_config_table(ACPI_20_TABLE_GUID, (void **)&rsdp);
> + if (status != EFI_SUCCESS)
> + return status;
> +
> + set_efi_rsdp(rsdp);
> +
> + return EFI_SUCCESS;
> +}
> +
> +static efi_status_t efi_mem_init(efi_bootinfo_t *efi_bootinfo)
> +{
> + int i;
> + unsigned long free_mem_pages = 0;
> + unsigned long free_mem_start = 0;
> + struct efi_boot_memmap *map = &(efi_bootinfo->mem_map);
> + efi_memory_desc_t *buffer = *map->map;
> + efi_memory_desc_t *d = NULL;
> + phys_addr_t base, top;
> + struct mem_region *r;
> + uintptr_t text = (uintptr_t)&_text, etext = __ALIGN((uintptr_t)&_etext, 4096);
> + uintptr_t data = (uintptr_t)&_data, edata = __ALIGN((uintptr_t)&_edata, 4096);
> +
> + /*
> + * Record the largest free EFI_CONVENTIONAL_MEMORY region
> + * which will be used to set up the memory allocator, so that
> + * the memory allocator can work in the largest free
> + * continuous memory region.
> + */
> + for (i = 0, r = &mem_regions[0]; i < *(map->map_size); i += *(map->desc_size), ++r) {
> + d = (efi_memory_desc_t *)(&((u8 *)buffer)[i]);
> +
> + r->start = d->phys_addr;
> + r->end = d->phys_addr + d->num_pages * EFI_PAGE_SIZE;
> +
> + switch (d->type) {
> + case EFI_RESERVED_TYPE:
> + case EFI_LOADER_DATA:
> + case EFI_BOOT_SERVICES_CODE:
> + case EFI_BOOT_SERVICES_DATA:
> + case EFI_RUNTIME_SERVICES_CODE:
> + case EFI_RUNTIME_SERVICES_DATA:
> + case EFI_UNUSABLE_MEMORY:
> + case EFI_ACPI_RECLAIM_MEMORY:
> + case EFI_ACPI_MEMORY_NVS:
> + case EFI_PAL_CODE:
> + r->flags = MR_F_RESERVED;
> + break;
> + case EFI_MEMORY_MAPPED_IO:
> + case EFI_MEMORY_MAPPED_IO_PORT_SPACE:
> + r->flags = MR_F_IO;
> + break;
> + case EFI_LOADER_CODE:
> + if (r->start <= text && r->end > text) {
> + /* This is the unit test region. Flag the code separately. */
> + phys_addr_t tmp = r->end;
> +
> + assert(etext <= data);
> + assert(edata <= r->end);
> + r->flags = MR_F_CODE;
> + r->end = data;
> + ++r;
> + r->start = data;
> + r->end = tmp;
> + } else {
> + r->flags = MR_F_RESERVED;
> + }
> + break;
> + case EFI_CONVENTIONAL_MEMORY:
> + if (free_mem_pages < d->num_pages) {
> + free_mem_pages = d->num_pages;
> + free_mem_start = d->phys_addr;
> + }
> + break;
> + }
> +
> + if (!(r->flags & MR_F_IO)) {
> + if (r->start < __phys_offset)
> + __phys_offset = r->start;
> + if (r->end > __phys_end)
> + __phys_end = r->end;
> + }
> + }
> + __phys_end &= PHYS_MASK;
> + asm_mmu_disable();
And here's why moving the dcache clean + invalidate *before* turning the MMU off
is fixing something: __phys_offset and __phys_end are written with MMU on and
are still in the cache; when the CPU reads them with the MMU off it gets back
stale values and the CMO doesn't execute correctly.
Doing a dcache clean for just those two variables should be enough and you can
drop patch #12 ("arm/arm64: mmu_disable: Clean and invalidate before
disabling").
Thanks,
Alex
next prev parent reply other threads:[~2022-05-13 13:39 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-06 20:55 [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 01/23] lib: Move acpi header and implementation to lib Nikos Nikoleris
2022-05-19 13:21 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 02/23] lib: Ensure all struct definition for ACPI tables are packed Nikos Nikoleris
2022-05-19 13:17 ` Andrew Jones
2022-05-19 15:52 ` Nikos Nikoleris
2022-05-19 17:14 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 03/23] lib: Add support for the XSDT ACPI table Nikos Nikoleris
2022-05-19 13:30 ` Andrew Jones
2022-06-18 0:38 ` Ricardo Koller
2022-06-20 8:53 ` Alexandru Elisei
2022-06-20 11:06 ` Nikos Nikoleris
2022-06-21 12:25 ` Alexandru Elisei
2022-06-21 11:26 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 04/23] lib: Extend the definition of the ACPI table FADT Nikos Nikoleris
2022-05-19 13:42 ` Andrew Jones
2022-06-18 1:00 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 05/23] arm/arm64: Add support for setting up the PSCI conduit through ACPI Nikos Nikoleris
2022-05-19 13:54 ` Andrew Jones
2022-06-21 16:06 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 06/23] arm/arm64: Add support for discovering the UART " Nikos Nikoleris
2022-05-19 13:59 ` Andrew Jones
2022-06-21 16:07 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 07/23] arm/arm64: Add support for timer initialization " Nikos Nikoleris
2022-05-19 14:10 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 08/23] arm/arm64: Add support for cpu " Nikos Nikoleris
2022-05-19 14:23 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 09/23] lib/printf: Support for precision modifier in printing strings Nikos Nikoleris
2022-05-19 14:52 ` Andrew Jones
2022-05-19 16:02 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 10/23] lib/printf: Add support for printing wide strings Nikos Nikoleris
2022-06-21 16:11 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 11/23] lib/efi: Add support for getting the cmdline Nikos Nikoleris
2022-06-21 16:33 ` Ricardo Koller
2022-06-27 16:12 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 12/23] arm/arm64: mmu_disable: Clean and invalidate before disabling Nikos Nikoleris
2022-05-13 13:15 ` Alexandru Elisei
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 13/23] arm/arm64: Rename etext to _etext Nikos Nikoleris
2022-06-21 16:42 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 14/23] lib: Avoid ms_abi for calls related to EFI on arm64 Nikos Nikoleris
2022-05-20 14:02 ` Andrew Jones
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 15/23] arm64: Add a new type of memory type flag MR_F_RESERVED Nikos Nikoleris
2022-06-21 16:44 ` Ricardo Koller
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 16/23] arm/arm64: Add a setup sequence for systems that boot through EFI Nikos Nikoleris
2022-05-13 13:31 ` Alexandru Elisei [this message]
2022-06-27 16:36 ` Nikos Nikoleris
2022-05-06 20:55 ` [kvm-unit-tests PATCH v2 17/23] arm64: Copy code from GNU-EFI Nikos Nikoleris
2022-06-21 17:59 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 18/23] arm64: Change gnu-efi imported file to use defined types Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 19/23] arm64: Use code from the gnu-efi when booting with EFI Nikos Nikoleris
2022-06-21 22:32 ` Ricardo Koller
2022-06-27 17:10 ` Nikos Nikoleris
2022-06-30 5:13 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 20/23] lib: Avoid external dependency in libelf Nikos Nikoleris
2022-06-21 22:39 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 21/23] x86: Move x86_64-specific EFI CFLAGS to x86_64 Makefile Nikos Nikoleris
2022-06-21 22:45 ` Ricardo Koller
2022-06-22 13:47 ` Nikos Nikoleris
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 22/23] arm64: Add support for efi in Makefile Nikos Nikoleris
2022-06-21 22:51 ` Ricardo Koller
2022-06-22 13:52 ` Nikos Nikoleris
2022-06-21 22:52 ` Ricardo Koller
2022-05-06 20:56 ` [kvm-unit-tests PATCH v2 23/23] arm64: Add an efi/run script Nikos Nikoleris
2022-06-21 23:09 ` Ricardo Koller
2022-06-22 14:13 ` Nikos Nikoleris
2022-06-30 5:22 ` Ricardo Koller
2022-05-13 14:09 ` [kvm-unit-tests PATCH v2 00/23] EFI and ACPI support for arm64 Alexandru Elisei
2022-05-18 9:00 ` Nikos Nikoleris
2022-05-20 9:58 ` Alexandru Elisei
2022-05-17 17:56 ` Ricardo Koller
2022-05-18 12:44 ` Nikos Nikoleris
2022-05-18 16:10 ` Ricardo Koller
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=Yn5dhgVGoZUgYGUi@monolith.localdoman \
--to=alexandru.elisei@arm.com \
--cc=drjones@redhat.com \
--cc=jade.alglave@arm.com \
--cc=kvm@vger.kernel.org \
--cc=nikos.nikoleris@arm.com \
--cc=pbonzini@redhat.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