target/hppa: Implement Fast TLB Insert instructions
These instructions are present on pcxl and pcxl2 machines, and are used by NetBSD and OpenBSD. See https://parisc.wiki.kernel.org/images-parisc/a/a9/Pcxl2_ers.pdf page 13-9 (195/206) Signed-off-by: Nick Hudson <skrll@netbsd.org> Message-Id: <20190423063621.8203-2-nick.hudson@gmx.co.uk> [rth: Use extending loads, locally managed temporaries.] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
82b2865e0d
commit
6797c31510
@ -133,6 +133,9 @@ ixtlbx 000001 b:5 r:5 sp:2 0100000 addr:1 0 00000 data=1
|
||||
ixtlbx 000001 b:5 r:5 ... 000000 addr:1 0 00000 \
|
||||
sp=%assemble_sr3x data=0
|
||||
|
||||
# pcxl and pcxl2 Fast TLB Insert instructions
|
||||
ixtlbxf 000001 00000 r:5 00 0 data:1 01000 addr:1 0 00000
|
||||
|
||||
pxtlbx 000001 b:5 x:5 sp:2 0100100 local:1 m:1 ----- data=1
|
||||
pxtlbx 000001 b:5 x:5 ... 000100 local:1 m:1 ----- \
|
||||
sp=%assemble_sr3x data=0
|
||||
|
@ -2518,6 +2518,60 @@ static bool trans_pxtlbx(DisasContext *ctx, arg_pxtlbx *a)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Implement the pcxl and pcxl2 Fast TLB Insert instructions.
|
||||
* See
|
||||
* https://parisc.wiki.kernel.org/images-parisc/a/a9/Pcxl2_ers.pdf
|
||||
* page 13-9 (195/206)
|
||||
*/
|
||||
static bool trans_ixtlbxf(DisasContext *ctx, arg_ixtlbxf *a)
|
||||
{
|
||||
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
TCGv_tl addr, atl, stl;
|
||||
TCGv_reg reg;
|
||||
|
||||
nullify_over(ctx);
|
||||
|
||||
/*
|
||||
* FIXME:
|
||||
* if (not (pcxl or pcxl2))
|
||||
* return gen_illegal(ctx);
|
||||
*
|
||||
* Note for future: these are 32-bit systems; no hppa64.
|
||||
*/
|
||||
|
||||
atl = tcg_temp_new_tl();
|
||||
stl = tcg_temp_new_tl();
|
||||
addr = tcg_temp_new_tl();
|
||||
|
||||
tcg_gen_ld32u_i64(stl, cpu_env,
|
||||
a->data ? offsetof(CPUHPPAState, cr[CR_ISR])
|
||||
: offsetof(CPUHPPAState, cr[CR_IIASQ]));
|
||||
tcg_gen_ld32u_i64(atl, cpu_env,
|
||||
a->data ? offsetof(CPUHPPAState, cr[CR_IOR])
|
||||
: offsetof(CPUHPPAState, cr[CR_IIAOQ]));
|
||||
tcg_gen_shli_i64(stl, stl, 32);
|
||||
tcg_gen_or_tl(addr, atl, stl);
|
||||
tcg_temp_free_tl(atl);
|
||||
tcg_temp_free_tl(stl);
|
||||
|
||||
reg = load_gpr(ctx, a->r);
|
||||
if (a->addr) {
|
||||
gen_helper_itlba(cpu_env, addr, reg);
|
||||
} else {
|
||||
gen_helper_itlbp(cpu_env, addr, reg);
|
||||
}
|
||||
tcg_temp_free_tl(addr);
|
||||
|
||||
/* Exit TB for TLB change if mmu is enabled. */
|
||||
if (ctx->tb_flags & PSW_C) {
|
||||
ctx->base.is_jmp = DISAS_IAQ_N_STALE;
|
||||
}
|
||||
return nullify_end(ctx);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool trans_lpa(DisasContext *ctx, arg_ldst *a)
|
||||
{
|
||||
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
|
||||
|
Loading…
Reference in New Issue
Block a user