mirror of https://github.com/xemu-project/xemu.git
target/ppc: extend eieio for POWER9
POWER9 introduced a new variant of the eieio instruction using bit 6 as a hint to tell the CPU it is a store-forwarding barrier. The usage of this eieio extension was recently added in Linux 4.17 which activated the "support for a store forwarding barrier at kernel entry/exit". Unfortunately, it is not possible to insert this new eieio instruction without considerable change in ppc_tr_translate_insn(). So instead we loosen the QEMU eieio instruction mask and modify the gen_eieio() helper to test for bit6. On non-POWER9 CPUs, the bit6 is just ignored but a warning is emitted as this is not an instruction software should be using. Signed-off-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
3431bdf5a3
commit
c8fd8373e4
|
@ -2967,7 +2967,28 @@ static void gen_stswx(DisasContext *ctx)
|
||||||
/* eieio */
|
/* eieio */
|
||||||
static void gen_eieio(DisasContext *ctx)
|
static void gen_eieio(DisasContext *ctx)
|
||||||
{
|
{
|
||||||
tcg_gen_mb(TCG_MO_LD_ST | TCG_BAR_SC);
|
TCGBar bar = TCG_MO_LD_ST;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* POWER9 has a eieio instruction variant using bit 6 as a hint to
|
||||||
|
* tell the CPU it is a store-forwarding barrier.
|
||||||
|
*/
|
||||||
|
if (ctx->opcode & 0x2000000) {
|
||||||
|
/*
|
||||||
|
* ISA says that "Reserved fields in instructions are ignored
|
||||||
|
* by the processor". So ignore the bit 6 on non-POWER9 CPU but
|
||||||
|
* as this is not an instruction software should be using,
|
||||||
|
* complain to the user.
|
||||||
|
*/
|
||||||
|
if (!(ctx->insns_flags2 & PPC2_ISA300)) {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR, "invalid eieio using bit 6 at @"
|
||||||
|
TARGET_FMT_lx "\n", ctx->base.pc_next - 4);
|
||||||
|
} else {
|
||||||
|
bar = TCG_MO_ST_LD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tcg_gen_mb(bar | TCG_BAR_SC);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
@ -6483,7 +6504,7 @@ GEN_HANDLER(lswi, 0x1F, 0x15, 0x12, 0x00000001, PPC_STRING),
|
||||||
GEN_HANDLER(lswx, 0x1F, 0x15, 0x10, 0x00000001, PPC_STRING),
|
GEN_HANDLER(lswx, 0x1F, 0x15, 0x10, 0x00000001, PPC_STRING),
|
||||||
GEN_HANDLER(stswi, 0x1F, 0x15, 0x16, 0x00000001, PPC_STRING),
|
GEN_HANDLER(stswi, 0x1F, 0x15, 0x16, 0x00000001, PPC_STRING),
|
||||||
GEN_HANDLER(stswx, 0x1F, 0x15, 0x14, 0x00000001, PPC_STRING),
|
GEN_HANDLER(stswx, 0x1F, 0x15, 0x14, 0x00000001, PPC_STRING),
|
||||||
GEN_HANDLER(eieio, 0x1F, 0x16, 0x1A, 0x03FFF801, PPC_MEM_EIEIO),
|
GEN_HANDLER(eieio, 0x1F, 0x16, 0x1A, 0x01FFF801, PPC_MEM_EIEIO),
|
||||||
GEN_HANDLER(isync, 0x13, 0x16, 0x04, 0x03FFF801, PPC_MEM),
|
GEN_HANDLER(isync, 0x13, 0x16, 0x04, 0x03FFF801, PPC_MEM),
|
||||||
GEN_HANDLER_E(lbarx, 0x1F, 0x14, 0x01, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
|
GEN_HANDLER_E(lbarx, 0x1F, 0x14, 0x01, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
|
||||||
GEN_HANDLER_E(lharx, 0x1F, 0x14, 0x03, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
|
GEN_HANDLER_E(lharx, 0x1F, 0x14, 0x03, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
|
||||||
|
|
Loading…
Reference in New Issue