[PATCH v3 30/33] target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only

Richard Henderson posted 33 patches 10 months, 4 weeks ago
Maintainers: Richard Henderson <richard.henderson@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Riku Voipio <riku.voipio@iki.fi>, Warner Losh <imp@bsdimp.com>, Kyle Evans <kevans@freebsd.org>, Stefan Berger <stefanb@linux.vnet.ibm.com>, Eduardo Habkost <eduardo@habkost.net>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Yanan Wang <wangyanan55@huawei.com>, Laurent Vivier <laurent@vivier.eu>, Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>, David Hildenbrand <david@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, Nicholas Piggin <npiggin@gmail.com>, Daniel Henrique Barboza <danielhb413@gmail.com>, "Cédric Le Goater" <clg@kaod.org>, "Alex Bennée" <alex.bennee@linaro.org>, Yoshinori Sato <ysato@users.sourceforge.jp>
There is a newer version of this series
[PATCH v3 30/33] target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only
Posted by Richard Henderson 10 months, 4 weeks ago
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>
---
 target/arm/cpu-param.h |  6 ++++-
 target/arm/cpu.c       | 51 ++++++++++++++++++++++++------------------
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
index f9b462a98f..da3243ab21 100644
--- a/target/arm/cpu-param.h
+++ b/target/arm/cpu-param.h
@@ -19,9 +19,13 @@
 #endif
 
 #ifdef CONFIG_USER_ONLY
-#define TARGET_PAGE_BITS 12
 # ifdef TARGET_AARCH64
 #  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
 #else
 /*
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 650e09b29c..55c2888f2c 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1788,7 +1788,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
     ARMCPU *cpu = ARM_CPU(dev);
     ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
     CPUARMState *env = &cpu->env;
-    int pagebits;
     Error *local_err = NULL;
 
     /* Use pc-relative instructions in system-mode */
@@ -2079,28 +2078,36 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
            !cpu_isar_feature(aa32_vfp_simd, cpu) ||
            !arm_feature(env, ARM_FEATURE_XSCALE));
 
-    if (arm_feature(env, ARM_FEATURE_V7) &&
-        !arm_feature(env, ARM_FEATURE_M) &&
-        !arm_feature(env, ARM_FEATURE_PMSA)) {
-        /* v7VMSA drops support for the old ARMv5 tiny pages, so we
-         * can use 4K pages.
-         */
-        pagebits = 12;
-    } else {
-        /* For CPUs which might have tiny 1K pages, or which have an
-         * MPU and might have small region sizes, stick with 1K pages.
-         */
-        pagebits = 10;
-    }
-    if (!set_preferred_target_page_bits(pagebits)) {
-        /* 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;
+#ifndef CONFIG_USER_ONLY
+    {
+        int pagebits;
+        if (arm_feature(env, ARM_FEATURE_V7) &&
+            !arm_feature(env, ARM_FEATURE_M) &&
+            !arm_feature(env, ARM_FEATURE_PMSA)) {
+            /*
+             * v7VMSA drops support for the old ARMv5 tiny pages,
+             * so we can use 4K pages.
+             */
+            pagebits = 12;
+        } else {
+            /*
+             * For CPUs which might have tiny 1K pages, or which have an
+             * MPU and might have small region sizes, stick with 1K pages.
+             */
+            pagebits = 10;
+        }
+        if (!set_preferred_target_page_bits(pagebits)) {
+            /*
+             * 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.
      * We don't support setting cluster ID ([16..23]) (known as Aff2
-- 
2.34.1
Re: [PATCH v3 30/33] target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only
Posted by Pierrick Bouvier 10 months, 3 weeks ago
On 1/2/24 05:58, Richard Henderson wrote:
> 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>
> ---
>   target/arm/cpu-param.h |  6 ++++-
>   target/arm/cpu.c       | 51 ++++++++++++++++++++++++------------------
>   2 files changed, 34 insertions(+), 23 deletions(-)
> 
> diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
> index f9b462a98f..da3243ab21 100644
> --- a/target/arm/cpu-param.h
> +++ b/target/arm/cpu-param.h
> @@ -19,9 +19,13 @@
>   #endif
>   
>   #ifdef CONFIG_USER_ONLY
> -#define TARGET_PAGE_BITS 12
>   # ifdef TARGET_AARCH64
>   #  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
>   #else
>   /*
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index 650e09b29c..55c2888f2c 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -1788,7 +1788,6 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
>       ARMCPU *cpu = ARM_CPU(dev);
>       ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
>       CPUARMState *env = &cpu->env;
> -    int pagebits;
>       Error *local_err = NULL;
>   
>       /* Use pc-relative instructions in system-mode */
> @@ -2079,28 +2078,36 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
>              !cpu_isar_feature(aa32_vfp_simd, cpu) ||
>              !arm_feature(env, ARM_FEATURE_XSCALE));
>   
> -    if (arm_feature(env, ARM_FEATURE_V7) &&
> -        !arm_feature(env, ARM_FEATURE_M) &&
> -        !arm_feature(env, ARM_FEATURE_PMSA)) {
> -        /* v7VMSA drops support for the old ARMv5 tiny pages, so we
> -         * can use 4K pages.
> -         */
> -        pagebits = 12;
> -    } else {
> -        /* For CPUs which might have tiny 1K pages, or which have an
> -         * MPU and might have small region sizes, stick with 1K pages.
> -         */
> -        pagebits = 10;
> -    }
> -    if (!set_preferred_target_page_bits(pagebits)) {
> -        /* 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;
> +#ifndef CONFIG_USER_ONLY
> +    {
> +        int pagebits;
> +        if (arm_feature(env, ARM_FEATURE_V7) &&
> +            !arm_feature(env, ARM_FEATURE_M) &&
> +            !arm_feature(env, ARM_FEATURE_PMSA)) {
> +            /*
> +             * v7VMSA drops support for the old ARMv5 tiny pages,
> +             * so we can use 4K pages.
> +             */
> +            pagebits = 12;
> +        } else {
> +            /*
> +             * For CPUs which might have tiny 1K pages, or which have an
> +             * MPU and might have small region sizes, stick with 1K pages.
> +             */
> +            pagebits = 10;
> +        }
> +        if (!set_preferred_target_page_bits(pagebits)) {
> +            /*
> +             * 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.
>        * We don't support setting cluster ID ([16..23]) (known as Aff2

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>