target/arm: Share unallocated_encoding() and gen_exception_insn()
The unallocated_encoding() function is the same in both translate-a64.c and translate.c; make the translate.c function global and drop the translate-a64.c version. To do this we need to also share gen_exception_insn(), which currently exists in two slightly different versions for A32 and A64: merge those into a single function that can work for both. This will be useful for splitting up translate.c, which will require unallocated_encoding() to no longer be file-local. It's also hopefully less confusing to have only one version of the function rather than two. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210430132740.10391-3-peter.maydell@linaro.org
This commit is contained in:
parent
b5aa664679
commit
d9318a5f9c
@ -359,14 +359,6 @@ static void gen_exception_internal_insn(DisasContext *s, uint64_t pc, int excp)
|
|||||||
s->base.is_jmp = DISAS_NORETURN;
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_exception_insn(DisasContext *s, uint64_t pc, int excp,
|
|
||||||
uint32_t syndrome, uint32_t target_el)
|
|
||||||
{
|
|
||||||
gen_a64_set_pc_im(pc);
|
|
||||||
gen_exception(excp, syndrome, target_el);
|
|
||||||
s->base.is_jmp = DISAS_NORETURN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syndrome)
|
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syndrome)
|
||||||
{
|
{
|
||||||
TCGv_i32 tcg_syn;
|
TCGv_i32 tcg_syn;
|
||||||
@ -437,13 +429,6 @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void unallocated_encoding(DisasContext *s)
|
|
||||||
{
|
|
||||||
/* Unallocated and reserved encodings are uncategorized */
|
|
||||||
gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
|
|
||||||
default_exception_el(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_tmp_a64_array(DisasContext *s)
|
static void init_tmp_a64_array(DisasContext *s)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DEBUG_TCG
|
#ifdef CONFIG_DEBUG_TCG
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
#ifndef TARGET_ARM_TRANSLATE_A64_H
|
#ifndef TARGET_ARM_TRANSLATE_A64_H
|
||||||
#define TARGET_ARM_TRANSLATE_A64_H
|
#define TARGET_ARM_TRANSLATE_A64_H
|
||||||
|
|
||||||
void unallocated_encoding(DisasContext *s);
|
|
||||||
|
|
||||||
#define unsupported_encoding(s, insn) \
|
#define unsupported_encoding(s, insn) \
|
||||||
do { \
|
do { \
|
||||||
qemu_log_mask(LOG_UNIMP, \
|
qemu_log_mask(LOG_UNIMP, \
|
||||||
|
@ -1069,11 +1069,15 @@ static void gen_exception_internal_insn(DisasContext *s, uint32_t pc, int excp)
|
|||||||
s->base.is_jmp = DISAS_NORETURN;
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_exception_insn(DisasContext *s, uint32_t pc, int excp,
|
void gen_exception_insn(DisasContext *s, uint64_t pc, int excp,
|
||||||
int syn, uint32_t target_el)
|
uint32_t syn, uint32_t target_el)
|
||||||
{
|
{
|
||||||
|
if (s->aarch64) {
|
||||||
|
gen_a64_set_pc_im(pc);
|
||||||
|
} else {
|
||||||
gen_set_condexec(s);
|
gen_set_condexec(s);
|
||||||
gen_set_pc_im(s, pc);
|
gen_set_pc_im(s, pc);
|
||||||
|
}
|
||||||
gen_exception(excp, syn, target_el);
|
gen_exception(excp, syn, target_el);
|
||||||
s->base.is_jmp = DISAS_NORETURN;
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
@ -1090,7 +1094,7 @@ static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
|
|||||||
s->base.is_jmp = DISAS_NORETURN;
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unallocated_encoding(DisasContext *s)
|
void unallocated_encoding(DisasContext *s)
|
||||||
{
|
{
|
||||||
/* Unallocated and reserved encodings are uncategorized */
|
/* Unallocated and reserved encodings are uncategorized */
|
||||||
gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
|
gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
|
||||||
|
@ -229,6 +229,9 @@ void arm_free_cc(DisasCompare *cmp);
|
|||||||
void arm_jump_cc(DisasCompare *cmp, TCGLabel *label);
|
void arm_jump_cc(DisasCompare *cmp, TCGLabel *label);
|
||||||
void arm_gen_test_cc(int cc, TCGLabel *label);
|
void arm_gen_test_cc(int cc, TCGLabel *label);
|
||||||
MemOp pow2_align(unsigned i);
|
MemOp pow2_align(unsigned i);
|
||||||
|
void unallocated_encoding(DisasContext *s);
|
||||||
|
void gen_exception_insn(DisasContext *s, uint64_t pc, int excp,
|
||||||
|
uint32_t syn, uint32_t target_el);
|
||||||
|
|
||||||
/* Return state of Alternate Half-precision flag, caller frees result */
|
/* Return state of Alternate Half-precision flag, caller frees result */
|
||||||
static inline TCGv_i32 get_ahp_flag(void)
|
static inline TCGv_i32 get_ahp_flag(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user