mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
target/alpha: Merge several flag bytes into ENV->FLAGS
The flags are arranged such that we can manipulate them either a whole, or as individual bytes. The computation within cpu_get_tb_cpu_state is now reduced to a single load and mask. Tested-by: Emilio G. Cota <cota@braap.org> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
489a0e6410
commit
bcd2625da5
7 changed files with 117 additions and 99 deletions
|
@ -242,13 +242,11 @@ struct CPUAlphaState {
|
|||
uint8_t fpcr_dyn_round;
|
||||
uint8_t fpcr_flush_to_zero;
|
||||
|
||||
/* The Internal Processor Registers. Some of these we assume always
|
||||
exist for use in user-mode. */
|
||||
uint8_t ps;
|
||||
uint8_t intr_flag;
|
||||
uint8_t pal_mode;
|
||||
uint8_t fen;
|
||||
/* Mask of PALmode, Processor State et al. Most of this gets copied
|
||||
into the TranslatorBlock flags and controls code generation. */
|
||||
uint32_t flags;
|
||||
|
||||
/* The high 32-bits of the processor cycle counter. */
|
||||
uint32_t pcc_ofs;
|
||||
|
||||
/* These pass data from the exception logic in the translator and
|
||||
|
@ -398,24 +396,37 @@ enum {
|
|||
};
|
||||
|
||||
/* Processor status constants. */
|
||||
enum {
|
||||
/* Low 3 bits are interrupt mask level. */
|
||||
PS_INT_MASK = 7,
|
||||
/* Low 3 bits are interrupt mask level. */
|
||||
#define PS_INT_MASK 7u
|
||||
|
||||
/* Bits 4 and 5 are the mmu mode. The VMS PALcode uses all 4 modes;
|
||||
The Unix PALcode only uses bit 4. */
|
||||
PS_USER_MODE = 8
|
||||
};
|
||||
/* Bits 4 and 5 are the mmu mode. The VMS PALcode uses all 4 modes;
|
||||
The Unix PALcode only uses bit 4. */
|
||||
#define PS_USER_MODE 8u
|
||||
|
||||
/* CPUAlphaState->flags constants. These are layed out so that we
|
||||
can set or reset the pieces individually by assigning to the byte,
|
||||
or manipulated as a whole. */
|
||||
|
||||
#define ENV_FLAG_PAL_SHIFT 0
|
||||
#define ENV_FLAG_PS_SHIFT 8
|
||||
#define ENV_FLAG_RX_SHIFT 16
|
||||
#define ENV_FLAG_FEN_SHIFT 24
|
||||
|
||||
#define ENV_FLAG_PAL_MODE (1u << ENV_FLAG_PAL_SHIFT)
|
||||
#define ENV_FLAG_PS_USER (PS_USER_MODE << ENV_FLAG_PS_SHIFT)
|
||||
#define ENV_FLAG_RX_FLAG (1u << ENV_FLAG_RX_SHIFT)
|
||||
#define ENV_FLAG_FEN (1u << ENV_FLAG_FEN_SHIFT)
|
||||
|
||||
#define ENV_FLAG_TB_MASK \
|
||||
(ENV_FLAG_PAL_MODE | ENV_FLAG_PS_USER | ENV_FLAG_FEN)
|
||||
|
||||
static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
|
||||
{
|
||||
if (env->pal_mode) {
|
||||
return MMU_KERNEL_IDX;
|
||||
} else if (env->ps & PS_USER_MODE) {
|
||||
return MMU_USER_IDX;
|
||||
} else {
|
||||
return MMU_KERNEL_IDX;
|
||||
int ret = env->flags & ENV_FLAG_PS_USER ? MMU_USER_IDX : MMU_KERNEL_IDX;
|
||||
if (env->flags & ENV_FLAG_PAL_MODE) {
|
||||
ret = MMU_KERNEL_IDX;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
enum {
|
||||
|
@ -482,31 +493,12 @@ QEMU_NORETURN void alpha_cpu_unassigned_access(CPUState *cpu, hwaddr addr,
|
|||
int unused, unsigned size);
|
||||
#endif
|
||||
|
||||
/* Bits in TB->FLAGS that control how translation is processed. */
|
||||
enum {
|
||||
TB_FLAGS_PAL_MODE = 1,
|
||||
TB_FLAGS_FEN = 2,
|
||||
TB_FLAGS_USER_MODE = 8,
|
||||
};
|
||||
|
||||
static inline void cpu_get_tb_cpu_state(CPUAlphaState *env, target_ulong *pc,
|
||||
target_ulong *cs_base, uint32_t *pflags)
|
||||
{
|
||||
int flags = 0;
|
||||
|
||||
*pc = env->pc;
|
||||
*cs_base = 0;
|
||||
|
||||
if (env->pal_mode) {
|
||||
flags = TB_FLAGS_PAL_MODE;
|
||||
} else {
|
||||
flags = env->ps & PS_USER_MODE;
|
||||
}
|
||||
if (env->fen) {
|
||||
flags |= TB_FLAGS_FEN;
|
||||
}
|
||||
|
||||
*pflags = flags;
|
||||
*pflags = env->flags & ENV_FLAG_TB_MASK;
|
||||
}
|
||||
|
||||
#endif /* ALPHA_CPU_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue