Skip to content

Commit

Permalink
xen/arm: mpu: Define Xen start address for MPU systems
Browse files Browse the repository at this point in the history
On Armv8-A, Xen has a fixed virtual start address (link address too) for all
Armv8-A platforms. In an MMU based system, Xen can map its loaded address to
this virtual start address. So, on Armv8-A platforms, the Xen start address does
not need to be configurable. But on Armv8-R platforms, there is no MMU to map
loaded address to a fixed virtual address and different platforms will have very
different address space layout. So Xen cannot use a fixed physical address on
MPU based system and need to have it configurable.

So, we introduce a Kconfig option for users to set the start address. The start
address needs to be aligned to 4KB. We have a check for this alignment.

MPU allows us to define regions which are 64 bits aligned. This restriction
comes from the bitfields of PRBAR, PRLAR (the lower 6 bits are 0 extended to
provide the base and limit address of a region). This means that the start
address of Xen needs to be at least 64 bits aligned (as it will correspond to
the start address of memory protection region).

As for now Xen on MPU tries to use the same memory alignment restrictions as it
has been for MMU. We have added a build assertion to ensure that the page size
is 4KB. Unlike MMU where the starting virtual address is 2MB, Xen on MPU needs
the start address to be 4KB (ie page size) aligned.

In case if the user forgets to set the start address, then 0xffffffff is used
as default. This is to trigger the error (on alignment check) and thereby prompt
user to set the start address.

Also updated config.h so that it includes mpu/layout.h when CONFIG_MPU is
defined.

Signed-off-by: Wei Chen <[email protected]>
Signed-off-by: Jiamei.Xie <[email protected]>
Signed-off-by: Ayan Kumar Halder <[email protected]>
Reviewed-by: Julien Grall <[email protected]>
Reviewed-by: Luca Fancellu <[email protected]>
  • Loading branch information
Weichen81 authored and Julien Grall committed Nov 1, 2024
1 parent 0388a59 commit d736b6e
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 1 deletion.
10 changes: 10 additions & 0 deletions xen/arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ config ARCH_DEFCONFIG
default "arch/arm/configs/arm32_defconfig" if ARM_32
default "arch/arm/configs/arm64_defconfig" if ARM_64

config XEN_START_ADDRESS
hex "Xen start address: keep default to use platform defined address"
default 0xFFFFFFFF
depends on MPU
help
Used to set customized address at which which Xen will be linked on MPU
systems. Must be aligned to 4KB.
0xFFFFFFFF is used as default value to indicate that user has not
customized this address.

menu "Architecture Features"

choice
Expand Down
1 change: 1 addition & 0 deletions xen/arch/arm/arm64/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
obj-y += lib/
obj-$(CONFIG_MMU) += mmu/
obj-$(CONFIG_MPU) += mpu/

obj-y += cache.o
obj-y += cpufeature.o
Expand Down
1 change: 1 addition & 0 deletions xen/arch/arm/arm64/mpu/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
obj-y += mm.o
15 changes: 15 additions & 0 deletions xen/arch/arm/arm64/mpu/mm.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* SPDX-License-Identifier: GPL-2.0-only */

#include <xen/lib.h>
#include <xen/init.h>
#include <xen/sizes.h>

static void __init __maybe_unused build_assertions(void)
{
/*
* Unlike MMU, MPU does not use pages for translation. However, we continue
* to use PAGE_SIZE to denote 4KB. This is so that the existing memory
* management based on pages, continue to work for now.
*/
BUILD_BUG_ON(PAGE_SIZE != SZ_4K);
}
4 changes: 3 additions & 1 deletion xen/arch/arm/include/asm/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,10 @@
#include <xen/const.h>
#include <xen/page-size.h>

#ifdef CONFIG_MMU
#if defined(CONFIG_MMU)
#include <asm/mmu/layout.h>
#elif defined(CONFIG_MPU)
#include <asm/mpu/layout.h>
#else
# error "Unknown memory management layout"
#endif
Expand Down
33 changes: 33 additions & 0 deletions xen/arch/arm/include/asm/mpu/layout.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef __ARM_MPU_LAYOUT_H__
#define __ARM_MPU_LAYOUT_H__

#define XEN_START_ADDRESS CONFIG_XEN_START_ADDRESS

/*
* All MPU platforms need to provide a XEN_START_ADDRESS for linker. This
* address indicates where Xen image will be loaded and run from. This
* address must be aligned to a PAGE_SIZE.
*/
#if (XEN_START_ADDRESS % PAGE_SIZE) != 0
#error "XEN_START_ADDRESS must be aligned to 4KB"
#endif

/*
* For MPU, XEN's virtual start address is same as the physical address.
* The reason being MPU treats VA == PA. IOW, it cannot map the physical
* address to a different fixed virtual address. So, the virtual start
* address is determined by the physical address at which Xen is loaded.
*/
#define XEN_VIRT_START _AT(paddr_t, XEN_START_ADDRESS)

#endif /* __ARM_MPU_LAYOUT_H__ */
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
7 changes: 7 additions & 0 deletions xen/arch/arm/xen.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,13 @@ SECTIONS
* match the context.
*/
ASSERT(_start == XEN_VIRT_START, "_start != XEN_VIRT_START")
#ifdef CONFIG_MPU
/*
* On MPU based platforms, the starting address is to be provided by user.
* One need to check that it is 4KB aligned.
*/
ASSERT(IS_ALIGNED(_start, 4096), "starting address should be aligned to 4KB")
#endif

/*
* We require that Xen is loaded at a page boundary, so this ensures that any
Expand Down

0 comments on commit d736b6e

Please sign in to comment.