xen/arm: Introduce choice to enable 64/32 bit physical addressing

Some Arm based hardware platforms which does not support LPAE
(eg Cortex-R52), uses 32 bit physical addresses.
Also, users may choose to use 32 bits to represent physical addresses
for optimization.

To support the above use cases, we have introduced arch independent
config to choose if the physical address can be represented using
32 bits (PHYS_ADDR_T_32) or 64 bits (!PHYS_ADDR_T_32).
For now only ARM_32 provides support to enable 32 bit physical
addressing.

When PHYS_ADDR_T_32 is defined, PADDR_BITS is set to 32. Note that we
use "unsigned long" (not "uint32_t") to denote the datatype of physical
address. This is done to avoid using a cast each time PAGE_* macros are
used on paddr_t. For eg PAGE_SIZE is defined as unsigned long. Thus,
each time PAGE_SIZE is used with paddr_t, the result will be
"unsigned long".
On 32-bit architecture, "unsigned long" is 32-bit wide. Thus, it can be
used to denote physical address.

When PHYS_ADDR_T_32 is not defined for ARM_32, PADDR_BITS is set to 40.
For ARM_64, PADDR_BITS is set to 48.
The last two are same as the current configuration used today on Xen.

Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
Acked-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Ayan Kumar Halder authored and Julien Grall committed 2023-06-16 21:36:35 +01:00
1 parent 6d44fb48bd
commit b6733ed0cb
5 files changed
+56 -5

No files matched your search

+3
View File
@@ -1,6 +1,9 @@
config 64BIT
bool
config PHYS_ADDR_T_32
bool
config NR_CPUS
int "Maximum number of CPUs"
range 1 4095
+33
View File
@@ -26,6 +26,39 @@ config ARCH_DEFCONFIG
menu "Architecture Features"
choice
prompt "Physical address space size" if ARM_32
default ARM_PA_BITS_40 if ARM_32
help
User can choose to represent the width of physical address. This can
sometimes help in optimizing the size of image when user chooses a
smaller size to represent physical address.
config ARM_PA_BITS_32
bool "32-bit"
depends on ARM_32
select PHYS_ADDR_T_32
help
On platforms where any physical address can be represented within 32 bits,
user should choose this option. This will help in reduced size of the
binary.
Xen uses "unsigned long" and not "uint32_t" to denote the datatype of
physical address. This is done to avoid using a cast each time PAGE_*
macros are used on paddr_t. For eg PAGE_SIZE is defined as unsigned long.
On 32-bit architecture, "unsigned long" is 32-bit wide. Thus, it can be
used to denote physical address.
config ARM_PA_BITS_40
bool "40-bit"
depends on ARM_32
endchoice
config PADDR_BITS
int
default 32 if ARM_PA_BITS_32
default 40 if ARM_PA_BITS_40
default 48 if ARM_64
source "arch/Kconfig"
config ACPI
+1 -5
View File
@@ -3,10 +3,6 @@
#define PAGE_SHIFT 12
#ifdef CONFIG_ARM_64
#define PADDR_BITS 48
#else
#define PADDR_BITS 40
#endif
#define PADDR_BITS CONFIG_PADDR_BITS
#endif /* __ARM_PAGE_SHIFT_H__ */
+14
View File
@@ -34,9 +34,23 @@ typedef signed long long s64;
typedef unsigned long long u64;
typedef u32 vaddr_t;
#define PRIvaddr PRIx32
#if defined(CONFIG_PHYS_ADDR_T_32)
/*
* We use "unsigned long" and not "uint32_t" to denote the type. This is done
* to avoid having a cast each time PAGE_* macros are used on paddr_t. For eg
* PAGE_SIZE is defined as unsigned long.
* On 32-bit architecture, "unsigned long" is 32-bit wide. Thus, we can use it
* to denote physical address.
*/
typedef unsigned long paddr_t;
#define INVALID_PADDR (~0UL)
#define PRIpaddr "08lx"
#else
typedef u64 paddr_t;
#define INVALID_PADDR (~0ULL)
#define PRIpaddr "016llx"
#endif
typedef u32 register_t;
#define PRIregister "08x"
#elif defined (CONFIG_ARM_64)
+5
View File
@@ -703,6 +703,11 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32);
int rc;
/*
* The size of paddr_t should be sufficient for the complete range of
* physical address.
*/
BUILD_BUG_ON((sizeof(paddr_t) * BITS_PER_BYTE) < PADDR_BITS);
BUILD_BUG_ON(sizeof(struct page_info) != PAGE_INFO_SIZE);
if ( frametable_size > FRAMETABLE_SIZE )
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.