mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-05-08 01:12:12 +00:00
target/arm: Decode PAuth within disas_data_proc_1src
Backports commit 95ebd99dcd37b8574426c876502bfcc7c299584b from qemu
This commit is contained in:
parent
967e6a1e90
commit
999222f0a1
|
@ -4655,6 +4655,8 @@ static void handle_rev16(DisasContext *s, unsigned int sf,
|
||||||
static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
|
static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
|
||||||
{
|
{
|
||||||
unsigned int sf, opcode, opcode2, rn, rd;
|
unsigned int sf, opcode, opcode2, rn, rd;
|
||||||
|
TCGv_i64 tcg_rd;
|
||||||
|
TCGContext *tcg_ctx;
|
||||||
|
|
||||||
if (extract32(insn, 29, 1)) {
|
if (extract32(insn, 29, 1)) {
|
||||||
unallocated_encoding(s);
|
unallocated_encoding(s);
|
||||||
|
@ -4666,6 +4668,7 @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
|
||||||
opcode2 = extract32(insn, 16, 5);
|
opcode2 = extract32(insn, 16, 5);
|
||||||
rn = extract32(insn, 5, 5);
|
rn = extract32(insn, 5, 5);
|
||||||
rd = extract32(insn, 0, 5);
|
rd = extract32(insn, 0, 5);
|
||||||
|
tcg_ctx = s->uc->tcg_ctx;
|
||||||
|
|
||||||
#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
|
#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
|
||||||
|
|
||||||
|
@ -4693,7 +4696,152 @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
|
||||||
case MAP(1, 0x00, 0x05):
|
case MAP(1, 0x00, 0x05):
|
||||||
handle_cls(s, sf, rn, rd);
|
handle_cls(s, sf, rn, rd);
|
||||||
break;
|
break;
|
||||||
|
case MAP(1, 0x01, 0x00): /* PACIA */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacia(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x01): /* PACIB */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacib(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x02): /* PACDA */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacda(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x03): /* PACDB */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacdb(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x04): /* AUTIA */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autia(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x05): /* AUTIB */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autib(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x06): /* AUTDA */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autda(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x07): /* AUTDB */
|
||||||
|
if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autdb(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, cpu_reg_sp(s, rn));
|
||||||
|
} else if (!dc_isar_feature(aa64_pauth, s)) {
|
||||||
|
goto do_unallocated;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x08): /* PACIZA */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacia(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x09): /* PACIZB */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacib(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0a): /* PACDZA */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacda(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0b): /* PACDZB */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_pacdb(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0c): /* AUTIZA */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autia(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0d): /* AUTIZB */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autib(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0e): /* AUTDZA */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autda(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x0f): /* AUTDZB */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_autdb(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd, new_tmp_a64_zero(s));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x10): /* XPACI */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_xpaci(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAP(1, 0x01, 0x11): /* XPACD */
|
||||||
|
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
|
||||||
|
goto do_unallocated;
|
||||||
|
} else if (s->pauth_active) {
|
||||||
|
tcg_rd = cpu_reg(s, rd);
|
||||||
|
gen_helper_xpacd(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rd);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
do_unallocated:
|
||||||
unallocated_encoding(s);
|
unallocated_encoding(s);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue