mirror of
https://github.com/qemu/qemu.git
synced 2025-08-17 16:03:30 +00:00
arm: cpu: handle BE32 user-mode as BE
endian with address manipulations on subword accesses (to give the illusion of BE). But user-mode cannot tell the difference and is already implemented as straight BE. So handle the difference in the endianess query, where USER mode is BE and system is not. Signed-off-by: Peter Crosthwaite <crosthwaite.peter@gmail.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ed50ff7875
commit
b2e62d9a7b
@ -1915,7 +1915,22 @@ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
|
|||||||
|
|
||||||
/* In 32bit endianness is determined by looking at CPSR's E bit */
|
/* In 32bit endianness is determined by looking at CPSR's E bit */
|
||||||
if (!is_a64(env)) {
|
if (!is_a64(env)) {
|
||||||
return (env->uncached_cpsr & CPSR_E) ? 1 : 0;
|
return
|
||||||
|
#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.
|
||||||
|
*/
|
||||||
|
arm_sctlr_b(env) ||
|
||||||
|
#endif
|
||||||
|
((env->uncached_cpsr & CPSR_E) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_el = arm_current_el(env);
|
cur_el = arm_current_el(env);
|
||||||
|
Loading…
Reference in New Issue
Block a user