mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
target/ppc: Fix facility interrupt checks for VSX
Facility interrupt checks in general should come after the ISA version check, because the facility interrupt and facility type themselves are ISA dependent and should not appear on CPUs where the instruction does not exist at all. This resolves a QEMU crash booting NetBSD/macppc due to qemu: fatal: Raised an exception without defined vector 94 Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2741 Cc: Chinmay Rath <rathc@linux.ibm.com> Cc: qemu-stable@nongnu.org Debugged-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Fixes:aa0f34ec3f
("target/ppc: implement vrlq") Fixes:7419dc5b2b
("target/ppc: Move VSX vector storage access insns to decodetree.") Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
1490d0bcdf
commit
8defe9da08
2 changed files with 11 additions and 11 deletions
|
@ -994,8 +994,8 @@ static bool do_vector_rotl_quad(DisasContext *ctx, arg_VX *a, bool mask,
|
|||
{
|
||||
TCGv_i64 ah, al, vrb, n, t0, t1, zero = tcg_constant_i64(0);
|
||||
|
||||
REQUIRE_VECTOR(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
REQUIRE_VECTOR(ctx);
|
||||
|
||||
ah = tcg_temp_new_i64();
|
||||
al = tcg_temp_new_i64();
|
||||
|
|
|
@ -61,8 +61,8 @@ static bool trans_LXVD2X(DisasContext *ctx, arg_LXVD2X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 t0;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, VSX);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
t0 = tcg_temp_new_i64();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
|
@ -80,8 +80,8 @@ static bool trans_LXVW4X(DisasContext *ctx, arg_LXVW4X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 xth, xtl;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, VSX);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xth = tcg_temp_new_i64();
|
||||
xtl = tcg_temp_new_i64();
|
||||
|
@ -113,12 +113,12 @@ static bool trans_LXVWSX(DisasContext *ctx, arg_LXVWSX *a)
|
|||
TCGv EA;
|
||||
TCGv_i32 data;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
if (a->rt < 32) {
|
||||
REQUIRE_VSX(ctx);
|
||||
} else {
|
||||
REQUIRE_VECTOR(ctx);
|
||||
}
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||
|
@ -133,8 +133,8 @@ static bool trans_LXVDSX(DisasContext *ctx, arg_LXVDSX *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 data;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, VSX);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||
|
@ -185,8 +185,8 @@ static bool trans_LXVH8X(DisasContext *ctx, arg_LXVH8X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 xth, xtl;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xth = tcg_temp_new_i64();
|
||||
xtl = tcg_temp_new_i64();
|
||||
|
@ -208,8 +208,8 @@ static bool trans_LXVB16X(DisasContext *ctx, arg_LXVB16X *a)
|
|||
TCGv EA;
|
||||
TCGv_i128 data;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
data = tcg_temp_new_i128();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
|
@ -312,8 +312,8 @@ static bool trans_STXVD2X(DisasContext *ctx, arg_STXVD2X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 t0;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, VSX);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
t0 = tcg_temp_new_i64();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
|
@ -331,8 +331,8 @@ static bool trans_STXVW4X(DisasContext *ctx, arg_STXVW4X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 xsh, xsl;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, VSX);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xsh = tcg_temp_new_i64();
|
||||
xsl = tcg_temp_new_i64();
|
||||
|
@ -364,8 +364,8 @@ static bool trans_STXVH8X(DisasContext *ctx, arg_STXVH8X *a)
|
|||
TCGv EA;
|
||||
TCGv_i64 xsh, xsl;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xsh = tcg_temp_new_i64();
|
||||
xsl = tcg_temp_new_i64();
|
||||
|
@ -394,8 +394,8 @@ static bool trans_STXVB16X(DisasContext *ctx, arg_STXVB16X *a)
|
|||
TCGv EA;
|
||||
TCGv_i128 data;
|
||||
|
||||
REQUIRE_VSX(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
data = tcg_temp_new_i128();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue