Commit ba96394e authored by Richard Henderson's avatar Richard Henderson
Browse files

target-alpha: Implement call_pal without an exception



The destination of the call_pal, and the cpu state, is very predictable;
there's no need for exiting the cpu loop.

Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent f2020398
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ DEF_HELPER_FLAGS_2(ieee_input_cmp, TCG_CALL_NO_WG, void, env, i64)

#if !defined (CONFIG_USER_ONLY)
DEF_HELPER_2(hw_ret, void, env, i64)
DEF_HELPER_3(call_pal, void, env, i64, i64)

DEF_HELPER_1(ldl_phys, i64, i64)
DEF_HELPER_1(ldq_phys, i64, i64)
+12 −0
Original line number Diff line number Diff line
@@ -51,6 +51,17 @@ void helper_hw_ret(CPUAlphaState *env, uint64_t a)
    }
}

void helper_call_pal(CPUAlphaState *env, uint64_t pc, uint64_t entry_ofs)
{
    int pal_mode = env->pal_mode;
    env->exc_addr = pc | pal_mode;
    env->pc = env->palbr + entry_ofs;
    if (!pal_mode) {
        env->pal_mode = 1;
        swap_shadow_regs(env);
    }
}

void helper_tbia(CPUAlphaState *env)
{
    tlb_flush(env, 1);
@@ -91,4 +102,5 @@ void helper_set_alarm(CPUAlphaState *env, uint64_t expire)
        qemu_del_timer(cpu->alarm_timer);
    }
}

#endif /* CONFIG_USER_ONLY */
+22 −3
Original line number Diff line number Diff line
@@ -1521,7 +1521,8 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode)
            tcg_gen_mov_i64(cpu_unique, cpu_ir[IR_A0]);
            break;
        default:
            return gen_excp(ctx, EXCP_CALL_PAL, palcode & 0xbf);
            palcode &= 0xbf;
            goto do_call_pal;
        }
        return NO_EXIT;
    }
@@ -1586,13 +1587,31 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode)
            break;

        default:
            return gen_excp(ctx, EXCP_CALL_PAL, palcode & 0x3f);
            palcode &= 0x3f;
            goto do_call_pal;
        }
        return NO_EXIT;
    }
#endif

    return gen_invalid(ctx);

 do_call_pal:
#ifdef CONFIG_USER_ONLY
    return gen_excp(ctx, EXCP_CALL_PAL, palcode);
#else
    {
        TCGv pc = tcg_const_i64(ctx->pc);
        TCGv entry = tcg_const_i64(palcode & 0x80
                                   ? 0x2000 + (palcode - 0x80) * 64
                                   : 0x1000 + palcode * 64);

        gen_helper_call_pal(cpu_env, pc, entry);

        tcg_temp_free(entry);
        tcg_temp_free(pc);
        return EXIT_PC_UPDATED;
    }
#endif
}

#ifndef CONFIG_USER_ONLY