target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only

Since aarch64 binaries are generally built for multiple
page sizes, it is trivial to allow the page size to vary.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Acked-by: Helge Deller <deller@gmx.de>
Message-Id: <20240102015808.132373-31-richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-01-02 12:58:05 +11:00
parent ff8a8bbc2a
commit a575230f95
2 changed files with 34 additions and 23 deletions

View file

@ -19,9 +19,13 @@
#endif #endif
#ifdef CONFIG_USER_ONLY #ifdef CONFIG_USER_ONLY
#define TARGET_PAGE_BITS 12
# ifdef TARGET_AARCH64 # ifdef TARGET_AARCH64
# define TARGET_TAGGED_ADDRESSES # define TARGET_TAGGED_ADDRESSES
/* Allow user-only to vary page size from 4k */
# define TARGET_PAGE_BITS_VARY
# define TARGET_PAGE_BITS_MIN 12
# else
# define TARGET_PAGE_BITS 12
# endif # endif
#else #else
/* /*

View file

@ -1809,7 +1809,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
ARMCPU *cpu = ARM_CPU(dev); ARMCPU *cpu = ARM_CPU(dev);
ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev); ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
CPUARMState *env = &cpu->env; CPUARMState *env = &cpu->env;
int pagebits;
Error *local_err = NULL; Error *local_err = NULL;
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
@ -2100,28 +2099,36 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
!cpu_isar_feature(aa32_vfp_simd, cpu) || !cpu_isar_feature(aa32_vfp_simd, cpu) ||
!arm_feature(env, ARM_FEATURE_XSCALE)); !arm_feature(env, ARM_FEATURE_XSCALE));
if (arm_feature(env, ARM_FEATURE_V7) && #ifndef CONFIG_USER_ONLY
!arm_feature(env, ARM_FEATURE_M) && {
!arm_feature(env, ARM_FEATURE_PMSA)) { int pagebits;
/* v7VMSA drops support for the old ARMv5 tiny pages, so we if (arm_feature(env, ARM_FEATURE_V7) &&
* can use 4K pages. !arm_feature(env, ARM_FEATURE_M) &&
*/ !arm_feature(env, ARM_FEATURE_PMSA)) {
pagebits = 12; /*
} else { * v7VMSA drops support for the old ARMv5 tiny pages,
/* For CPUs which might have tiny 1K pages, or which have an * so we can use 4K pages.
* MPU and might have small region sizes, stick with 1K pages. */
*/ pagebits = 12;
pagebits = 10; } else {
} /*
if (!set_preferred_target_page_bits(pagebits)) { * For CPUs which might have tiny 1K pages, or which have an
/* This can only ever happen for hotplugging a CPU, or if * MPU and might have small region sizes, stick with 1K pages.
* the board code incorrectly creates a CPU which it has */
* promised via minimum_page_size that it will not. pagebits = 10;
*/ }
error_setg(errp, "This CPU requires a smaller page size than the " if (!set_preferred_target_page_bits(pagebits)) {
"system is using"); /*
return; * This can only ever happen for hotplugging a CPU, or if
* the board code incorrectly creates a CPU which it has
* promised via minimum_page_size that it will not.
*/
error_setg(errp, "This CPU requires a smaller page size "
"than the system is using");
return;
}
} }
#endif
/* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it. /* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it.
* We don't support setting cluster ID ([16..23]) (known as Aff2 * We don't support setting cluster ID ([16..23]) (known as Aff2