mirror of https://github.com/xqemu/xqemu.git
target-arm: Don't use cpu_single_env in bank_number()
Avoid using cpu_single_env in bank_number() -- if we were called via the gdb stub reading or writing the CPSR then it is NULL and we will segfault if we take the cpu_abort(). Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
c47f322365
commit
1b9e01c110
|
@ -642,7 +642,7 @@ uint32_t HELPER(get_r13_banked)(CPUState *env, uint32_t mode)
|
||||||
extern int semihosting_enabled;
|
extern int semihosting_enabled;
|
||||||
|
|
||||||
/* Map CPU modes onto saved register banks. */
|
/* Map CPU modes onto saved register banks. */
|
||||||
static inline int bank_number (int mode)
|
static inline int bank_number(CPUState *env, int mode)
|
||||||
{
|
{
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case ARM_CPU_MODE_USR:
|
case ARM_CPU_MODE_USR:
|
||||||
|
@ -659,7 +659,7 @@ static inline int bank_number (int mode)
|
||||||
case ARM_CPU_MODE_FIQ:
|
case ARM_CPU_MODE_FIQ:
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
cpu_abort(cpu_single_env, "Bad mode %x\n", mode);
|
cpu_abort(env, "Bad mode %x\n", mode);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,12 +680,12 @@ void switch_mode(CPUState *env, int mode)
|
||||||
memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
|
memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
i = bank_number(old_mode);
|
i = bank_number(env, old_mode);
|
||||||
env->banked_r13[i] = env->regs[13];
|
env->banked_r13[i] = env->regs[13];
|
||||||
env->banked_r14[i] = env->regs[14];
|
env->banked_r14[i] = env->regs[14];
|
||||||
env->banked_spsr[i] = env->spsr;
|
env->banked_spsr[i] = env->spsr;
|
||||||
|
|
||||||
i = bank_number(mode);
|
i = bank_number(env, mode);
|
||||||
env->regs[13] = env->banked_r13[i];
|
env->regs[13] = env->banked_r13[i];
|
||||||
env->regs[14] = env->banked_r14[i];
|
env->regs[14] = env->banked_r14[i];
|
||||||
env->spsr = env->banked_spsr[i];
|
env->spsr = env->banked_spsr[i];
|
||||||
|
@ -2125,7 +2125,7 @@ void HELPER(set_r13_banked)(CPUState *env, uint32_t mode, uint32_t val)
|
||||||
if ((env->uncached_cpsr & CPSR_M) == mode) {
|
if ((env->uncached_cpsr & CPSR_M) == mode) {
|
||||||
env->regs[13] = val;
|
env->regs[13] = val;
|
||||||
} else {
|
} else {
|
||||||
env->banked_r13[bank_number(mode)] = val;
|
env->banked_r13[bank_number(env, mode)] = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2134,7 +2134,7 @@ uint32_t HELPER(get_r13_banked)(CPUState *env, uint32_t mode)
|
||||||
if ((env->uncached_cpsr & CPSR_M) == mode) {
|
if ((env->uncached_cpsr & CPSR_M) == mode) {
|
||||||
return env->regs[13];
|
return env->regs[13];
|
||||||
} else {
|
} else {
|
||||||
return env->banked_r13[bank_number(mode)];
|
return env->banked_r13[bank_number(env, mode)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue