[06/20] target/arm: Fix arm_current_el for user-only

Message ID 20180809042206.15726-7-richard.henderson@linaro.org
State New
Headers show
Series
  • target/arm: sve system mode patches
Related show

Commit Message

Richard Henderson Aug. 9, 2018, 4:21 a.m.
Saves about 12k code size in qemu-aarch64.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/arm/cpu.h | 4 ++++
 1 file changed, 4 insertions(+)

-- 
2.17.1

Comments

Peter Maydell Aug. 17, 2018, 4:03 p.m. | #1
On 9 August 2018 at 05:21, Richard Henderson
<richard.henderson@linaro.org> wrote:
> Saves about 12k code size in qemu-aarch64.

>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/arm/cpu.h | 4 ++++

>  1 file changed, 4 insertions(+)

>

> diff --git a/target/arm/cpu.h b/target/arm/cpu.h

> index 2d6d7d03aa..aedaf2631e 100644

> --- a/target/arm/cpu.h

> +++ b/target/arm/cpu.h

> @@ -1958,6 +1958,9 @@ static inline bool arm_v7m_is_handler_mode(CPUARMState *env)

>   */

>  static inline int arm_current_el(CPUARMState *env)

>  {

> +#ifdef CONFIG_USER_ONLY

> +    return 0;

> +#else

>      if (arm_feature(env, ARM_FEATURE_M)) {

>          return arm_v7m_is_handler_mode(env) ||

>              !(env->v7m.control[env->v7m.secure] & 1);

> @@ -1984,6 +1987,7 @@ static inline int arm_current_el(CPUARMState *env)

>

>          return 1;

>      }

> +#endif


Again, the #ifdeffery here should be unnecessary ? env->pstate,
env->uncached_cpsr, etc should be set so that we return the
right thing.

thanks
-- PMM
Richard Henderson Aug. 17, 2018, 4:51 p.m. | #2
On 08/17/2018 09:03 AM, Peter Maydell wrote:
> On 9 August 2018 at 05:21, Richard Henderson

> <richard.henderson@linaro.org> wrote:

>> Saves about 12k code size in qemu-aarch64.

>>

>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

>> ---

>>  target/arm/cpu.h | 4 ++++

>>  1 file changed, 4 insertions(+)

>>

>> diff --git a/target/arm/cpu.h b/target/arm/cpu.h

>> index 2d6d7d03aa..aedaf2631e 100644

>> --- a/target/arm/cpu.h

>> +++ b/target/arm/cpu.h

>> @@ -1958,6 +1958,9 @@ static inline bool arm_v7m_is_handler_mode(CPUARMState *env)

>>   */

>>  static inline int arm_current_el(CPUARMState *env)

>>  {

>> +#ifdef CONFIG_USER_ONLY

>> +    return 0;

>> +#else

>>      if (arm_feature(env, ARM_FEATURE_M)) {

>>          return arm_v7m_is_handler_mode(env) ||

>>              !(env->v7m.control[env->v7m.secure] & 1);

>> @@ -1984,6 +1987,7 @@ static inline int arm_current_el(CPUARMState *env)

>>

>>          return 1;

>>      }

>> +#endif

> 

> Again, the #ifdeffery here should be unnecessary ? env->pstate,

> env->uncached_cpsr, etc should be set so that we return the

> right thing.


We get the right result, but you should have a look at how large the expansion
of this function is.


r~

Patch

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 2d6d7d03aa..aedaf2631e 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -1958,6 +1958,9 @@  static inline bool arm_v7m_is_handler_mode(CPUARMState *env)
  */
 static inline int arm_current_el(CPUARMState *env)
 {
+#ifdef CONFIG_USER_ONLY
+    return 0;
+#else
     if (arm_feature(env, ARM_FEATURE_M)) {
         return arm_v7m_is_handler_mode(env) ||
             !(env->v7m.control[env->v7m.secure] & 1);
@@ -1984,6 +1987,7 @@  static inline int arm_current_el(CPUARMState *env)
 
         return 1;
     }
+#endif
 }
 
 typedef struct ARMCPRegInfo ARMCPRegInfo;