mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
target/arm: Move arm_cpu_data_is_big_endian() etc to internals.h
The arm_cpu_data_is_big_endian() and related functions are now used only in target/arm; they can be moved to internals.h. The motivation here is that we would like to move arm_current_el() to internals.h. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
63d8b11d0a
commit
fefc1220ad
2 changed files with 48 additions and 48 deletions
|
@ -3032,47 +3032,6 @@ static inline bool arm_sctlr_b(CPUARMState *env)
|
||||||
|
|
||||||
uint64_t arm_sctlr(CPUARMState *env, int el);
|
uint64_t arm_sctlr(CPUARMState *env, int el);
|
||||||
|
|
||||||
static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
|
|
||||||
bool sctlr_b)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
|
||||||
/*
|
|
||||||
* In system mode, BE32 is modelled in line with the
|
|
||||||
* architecture (as word-invariant big-endianness), where loads
|
|
||||||
* and stores are done little endian but from addresses which
|
|
||||||
* are adjusted by XORing with the appropriate constant. So the
|
|
||||||
* endianness to use for the raw data access is not affected by
|
|
||||||
* SCTLR.B.
|
|
||||||
* In user mode, however, we model BE32 as byte-invariant
|
|
||||||
* big-endianness (because user-only code cannot tell the
|
|
||||||
* difference), and so we need to use a data access endianness
|
|
||||||
* that depends on SCTLR.B.
|
|
||||||
*/
|
|
||||||
if (sctlr_b) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* In 32bit endianness is determined by looking at CPSR's E bit */
|
|
||||||
return env->uncached_cpsr & CPSR_E;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool arm_cpu_data_is_big_endian_a64(int el, uint64_t sctlr)
|
|
||||||
{
|
|
||||||
return sctlr & (el ? SCTLR_EE : SCTLR_E0E);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true if the processor is in big-endian mode. */
|
|
||||||
static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
|
|
||||||
{
|
|
||||||
if (!is_a64(env)) {
|
|
||||||
return arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env));
|
|
||||||
} else {
|
|
||||||
int cur_el = arm_current_el(env);
|
|
||||||
uint64_t sctlr = arm_sctlr(env, cur_el);
|
|
||||||
return arm_cpu_data_is_big_endian_a64(cur_el, sctlr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "exec/cpu-all.h"
|
#include "exec/cpu-all.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3258,13 +3217,6 @@ static inline bool bswap_code(bool sctlr_b)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
|
||||||
static inline bool arm_cpu_bswap_data(CPUARMState *env)
|
|
||||||
{
|
|
||||||
return TARGET_BIG_ENDIAN ^ arm_cpu_data_is_big_endian(env);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void cpu_get_tb_cpu_state(CPUARMState *env, vaddr *pc,
|
void cpu_get_tb_cpu_state(CPUARMState *env, vaddr *pc,
|
||||||
uint64_t *cs_base, uint32_t *flags);
|
uint64_t *cs_base, uint32_t *flags);
|
||||||
|
|
||||||
|
|
|
@ -392,6 +392,54 @@ static inline FloatRoundMode arm_rmode_to_sf(ARMFPRounding rmode)
|
||||||
return arm_rmode_to_sf_map[rmode];
|
return arm_rmode_to_sf_map[rmode];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
|
||||||
|
bool sctlr_b)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
/*
|
||||||
|
* In system mode, BE32 is modelled in line with the
|
||||||
|
* architecture (as word-invariant big-endianness), where loads
|
||||||
|
* and stores are done little endian but from addresses which
|
||||||
|
* are adjusted by XORing with the appropriate constant. So the
|
||||||
|
* endianness to use for the raw data access is not affected by
|
||||||
|
* SCTLR.B.
|
||||||
|
* In user mode, however, we model BE32 as byte-invariant
|
||||||
|
* big-endianness (because user-only code cannot tell the
|
||||||
|
* difference), and so we need to use a data access endianness
|
||||||
|
* that depends on SCTLR.B.
|
||||||
|
*/
|
||||||
|
if (sctlr_b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* In 32bit endianness is determined by looking at CPSR's E bit */
|
||||||
|
return env->uncached_cpsr & CPSR_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool arm_cpu_data_is_big_endian_a64(int el, uint64_t sctlr)
|
||||||
|
{
|
||||||
|
return sctlr & (el ? SCTLR_EE : SCTLR_E0E);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return true if the processor is in big-endian mode. */
|
||||||
|
static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
|
||||||
|
{
|
||||||
|
if (!is_a64(env)) {
|
||||||
|
return arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env));
|
||||||
|
} else {
|
||||||
|
int cur_el = arm_current_el(env);
|
||||||
|
uint64_t sctlr = arm_sctlr(env, cur_el);
|
||||||
|
return arm_cpu_data_is_big_endian_a64(cur_el, sctlr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
static inline bool arm_cpu_bswap_data(CPUARMState *env)
|
||||||
|
{
|
||||||
|
return TARGET_BIG_ENDIAN ^ arm_cpu_data_is_big_endian(env);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline void aarch64_save_sp(CPUARMState *env, int el)
|
static inline void aarch64_save_sp(CPUARMState *env, int el)
|
||||||
{
|
{
|
||||||
if (env->pstate & PSTATE_SP) {
|
if (env->pstate & PSTATE_SP) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue