From 290bff3f3e491e8b523d90cd25637e85ccc863a7 Mon Sep 17 00:00:00 2001 From: Denis Drakhnya Date: Sat, 28 Nov 2020 11:32:50 +0200 Subject: [PATCH] target: e2k: Fix instr return. --- target/e2k/helper.c | 19 +++++++++++++++++++ target/e2k/helper.h | 1 + target/e2k/translate.c | 1 - target/e2k/translate/control.c | 11 ++++++++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/target/e2k/helper.c b/target/e2k/helper.c index 0578621641..00c0a41dad 100644 --- a/target/e2k/helper.c +++ b/target/e2k/helper.c @@ -192,6 +192,25 @@ static inline void do_call(CPUE2KState *env, int wbs, target_ulong pc_next) reset_ctprs(env); } +uint64_t helper_prep_return(CPUE2KState *env, int ipd) +{ + uint64_t pc, ret = 0; + void *p; + + if (env->pcsp.index < 32) { + helper_raise_exception(env, E2K_EXCP_MAPERR); + return 0; + } + + p = (void *) env->pcsp.base + env->pcsp.index - 24; + memcpy(&pc, p, 8); + ret |= deposit64(ret, CTPR_BASE_OFF, CTPR_BASE_LEN, pc); + ret |= deposit64(ret, CTPR_TAG_OFF, CTPR_TAG_LEN, CTPR_TAG_RETURN); + ret |= deposit64(ret, CTPR_IPD_OFF, CTPR_IPD_LEN, ipd); + + return ret; +} + void helper_return(CPUE2KState *env) { uint32_t new_wd_size, new_wd_base, offset; diff --git a/target/e2k/helper.h b/target/e2k/helper.h index 1381c11331..e13e331a71 100644 --- a/target/e2k/helper.h +++ b/target/e2k/helper.h @@ -1,5 +1,6 @@ DEF_HELPER_2(raise_exception, noreturn, env, int) DEF_HELPER_1(debug, void, env) +DEF_HELPER_2(prep_return, i64, env, int) DEF_HELPER_1(return, void, env) DEF_HELPER_4(call, void, env, i64, int, tl) DEF_HELPER_2(sxt, i64, i64, i64) diff --git a/target/e2k/translate.c b/target/e2k/translate.c index deb59d1bcd..b223209958 100644 --- a/target/e2k/translate.c +++ b/target/e2k/translate.c @@ -382,7 +382,6 @@ static inline void do_branch(DisasContext *ctx, target_ulong pc_next) gen_goto_ctpr_disp(ctx->ct.u.ctpr); gen_set_label(l1); - // FIXME: gdb does not see IP change gen_helper_return(cpu_env); tcg_gen_lookup_and_goto_ptr(); break; diff --git a/target/e2k/translate/control.c b/target/e2k/translate/control.c index 34a2b450ba..1e36fd81a3 100644 --- a/target/e2k/translate/control.c +++ b/target/e2k/translate/control.c @@ -296,9 +296,14 @@ static void gen_cs0(DisasContext *dc) lowermost ones are undefined, while the latter also known as "type" field should be filled in with zeroes. */ if (type == RETURN) { - uint64_t reg = ((uint64_t) CTPR_TAG_RETURN << CTPR_TAG_OFF) | - ((uint64_t) ipd << CTPR_IPD_OFF); - tcg_gen_movi_tl(e2k_cs.ctprs[ctpr - 1], reg); + TCGv_i32 t0 = tcg_const_i32(ipd); + + if (ctpr != 3) { + e2k_tr_gen_exception(dc, E2K_EXCP_ILLOPN); + } + + gen_helper_prep_return(e2k_cs.ctprs[2], cpu_env, t0); + tcg_temp_free_i32(t0); } /* GETTSD has as meaningless `CS0.param' as RETURN. The only