Skip to content

Commit

Permalink
target/hppa: Move diag argument handling to decodetree
Browse files Browse the repository at this point in the history
Split trans_diag into per-operation functions.

Reviewed-by: Helge Deller <deller@gmx.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Mar 29, 2024
1 parent 558c09b commit 3819312
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
8 changes: 7 additions & 1 deletion target/hppa/insns.decode
Original file line number Diff line number Diff line change
Expand Up @@ -634,4 +634,10 @@ fdiv_d 001110 ..... ..... 011 ..... ... ..... @f0e_d_3
xmpyu 001110 ..... ..... 010 .0111 .00 t:5 r1=%ra64 r2=%rb64

# diag
diag 000101 i:26
{
[
diag_btlb 000101 00 0000 0000 0000 0001 0000 0000
diag_cout 000101 00 0000 0000 0000 0001 0000 0001
]
diag_unimp 000101 i:26
}
34 changes: 21 additions & 13 deletions target/hppa/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -4572,23 +4572,31 @@ static bool trans_fmpyfadd_d(DisasContext *ctx, arg_fmpyfadd_d *a)
return nullify_end(ctx);
}

static bool trans_diag(DisasContext *ctx, arg_diag *a)
/* Emulate PDC BTLB, called by SeaBIOS-hppa */
static bool trans_diag_btlb(DisasContext *ctx, arg_diag_btlb *a)
{
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
#ifndef CONFIG_USER_ONLY
if (a->i == 0x100) {
/* emulate PDC BTLB, called by SeaBIOS-hppa */
nullify_over(ctx);
gen_helper_diag_btlb(tcg_env);
return nullify_end(ctx);
}
if (a->i == 0x101) {
/* print char in %r26 to first serial console, used by SeaBIOS-hppa */
nullify_over(ctx);
gen_helper_diag_console_output(tcg_env);
return nullify_end(ctx);
}
nullify_over(ctx);
gen_helper_diag_btlb(tcg_env);
return nullify_end(ctx);
#endif
}

/* Print char in %r26 to first serial console, used by SeaBIOS-hppa */
static bool trans_diag_cout(DisasContext *ctx, arg_diag_cout *a)
{
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
#ifndef CONFIG_USER_ONLY
nullify_over(ctx);
gen_helper_diag_console_output(tcg_env);
return nullify_end(ctx);
#endif
}

static bool trans_diag_unimp(DisasContext *ctx, arg_diag_unimp *a)
{
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
qemu_log_mask(LOG_UNIMP, "DIAG opcode 0x%04x ignored\n", a->i);
return true;
}
Expand Down

0 comments on commit 3819312

Please sign in to comment.