qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Chinmay Rath <rathc@linux.vnet.ibm.com>
To: Nicholas Piggin <npiggin@gmail.com>, qemu-ppc@nongnu.org
Cc: qemu-devel@nongnu.org,
	Daniel Henrique Barboza <danielhb413@gmail.com>,
	Chinmay Rath <rathc@linux.ibm.com>
Subject: Re: [PATCH 1/3] target/ppc: Move sync instructions to decodetree
Date: Tue, 7 May 2024 12:11:35 +0530	[thread overview]
Message-ID: <fba61833-faeb-4c3e-bab2-87d1a99e7644@linux.vnet.ibm.com> (raw)
In-Reply-To: <20240501130435.941189-2-npiggin@gmail.com>



On 5/1/24 18:34, Nicholas Piggin wrote:
> This tries to faithfully reproduce the odd BookE logic.
>
> It does change the handling of non-zero reserved bits outside the
> defined fields from being illegal to being ignored, which the
> architecture specifies ot help with backward compatibility of new
> fields. The existing behaviour causes illegal instruction exceptions
> when using new POWER10 sync variants that add new fields, after this
> the instructions are accepted and are implemented as supersets of
> the new behaviour, as intended.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Chinmay Rath <rathc@linux.ibm.com>
> ---
>   target/ppc/insn32.decode             |   7 ++
>   target/ppc/translate.c               | 102 +-------------------
>   target/ppc/translate/misc-impl.c.inc | 135 +++++++++++++++++++++++++++
>   3 files changed, 144 insertions(+), 100 deletions(-)
>   create mode 100644 target/ppc/translate/misc-impl.c.inc
>
> diff --git a/target/ppc/insn32.decode b/target/ppc/insn32.decode
> index eada59f59f..6b89804b15 100644
> --- a/target/ppc/insn32.decode
> +++ b/target/ppc/insn32.decode
> @@ -998,3 +998,10 @@ MSGSND          011111 ----- ----- ..... 0011001110 -   @X_rb
>   MSGCLRP         011111 ----- ----- ..... 0010101110 -   @X_rb
>   MSGSNDP         011111 ----- ----- ..... 0010001110 -   @X_rb
>   MSGSYNC         011111 ----- ----- ----- 1101110110 -
> +
> +# Memory Barrier Instructions
> +
> +&X_sync         l
> +@X_sync         ...... ... l:2 ..... ..... .......... .           &X_sync
> +SYNC            011111 --- ..  ----- ----- 1001010110 -           @X_sync
> +EIEIO           011111 ----- ----- ----- 1101010110 -
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 93ffec787c..bb2cabae10 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -3423,59 +3423,6 @@ static void gen_stswx(DisasContext *ctx)
>       gen_helper_stsw(tcg_env, t0, t1, t2);
>   }
>   
> -/***                        Memory synchronisation                         ***/
> -/* eieio */
> -static void gen_eieio(DisasContext *ctx)
> -{
> -    TCGBar bar = TCG_MO_ALL;
> -
> -    /*
> -     * eieio has complex semanitcs. It provides memory ordering between
> -     * operations in the set:
> -     * - loads from CI memory.
> -     * - stores to CI memory.
> -     * - stores to WT memory.
> -     *
> -     * It separately also orders memory for operations in the set:
> -     * - stores to cacheble memory.
> -     *
> -     * It also serializes instructions:
> -     * - dcbt and dcbst.
> -     *
> -     * It separately serializes:
> -     * - tlbie and tlbsync.
> -     *
> -     * And separately serializes:
> -     * - slbieg, slbiag, and slbsync.
> -     *
> -     * The end result is that CI memory ordering requires TCG_MO_ALL
> -     * and it is not possible to special-case more relaxed ordering for
> -     * cacheable accesses. TCG_BAR_SC is required to provide this
> -     * serialization.
> -     */
> -
> -    /*
> -     * 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->cia);
> -        } else {
> -            bar = TCG_MO_ST_LD;
> -        }
> -    }
> -
> -    tcg_gen_mb(bar | TCG_BAR_SC);
> -}
> -
>   #if !defined(CONFIG_USER_ONLY)
>   static inline void gen_check_tlb_flush(DisasContext *ctx, bool global)
>   {
> @@ -3877,31 +3824,6 @@ static void gen_stqcx_(DisasContext *ctx)
>   }
>   #endif /* defined(TARGET_PPC64) */
>   
> -/* sync */
> -static void gen_sync(DisasContext *ctx)
> -{
> -    TCGBar bar = TCG_MO_ALL;
> -    uint32_t l = (ctx->opcode >> 21) & 3;
> -
> -    if ((l == 1) && (ctx->insns_flags2 & PPC2_MEM_LWSYNC)) {
> -        bar = TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST;
> -    }
> -
> -    /*
> -     * We may need to check for a pending TLB flush.
> -     *
> -     * We do this on ptesync (l == 2) on ppc64 and any sync pn ppc32.
> -     *
> -     * Additionally, this can only happen in kernel mode however so
> -     * check MSR_PR as well.
> -     */
> -    if (((l == 2) || !(ctx->insns_flags & PPC_64B)) && !ctx->pr) {
> -        gen_check_tlb_flush(ctx, true);
> -    }
> -
> -    tcg_gen_mb(bar | TCG_BAR_SC);
> -}
> -
>   /* wait */
>   static void gen_wait(DisasContext *ctx)
>   {
> @@ -6010,23 +5932,6 @@ static void gen_dlmzb(DisasContext *ctx)
>                        cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0);
>   }
>   
> -/* mbar replaces eieio on 440 */
> -static void gen_mbar(DisasContext *ctx)
> -{
> -    /* interpreted as no-op */
> -}
> -
> -/* msync replaces sync on 440 */
> -static void gen_msync_4xx(DisasContext *ctx)
> -{
> -    /* Only e500 seems to treat reserved bits as invalid */
> -    if ((ctx->insns_flags2 & PPC2_BOOKE206) &&
> -        (ctx->opcode & 0x03FFF801)) {
> -        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
> -    }
> -    /* otherwise interpreted as no-op */
> -}
> -
>   /* icbt */
>   static void gen_icbt_440(DisasContext *ctx)
>   {
> @@ -6364,6 +6269,8 @@ static bool resolve_PLS_D(DisasContext *ctx, arg_D *d, arg_PLS_D *a)
>   
>   #include "translate/storage-ctrl-impl.c.inc"
>   
> +#include "translate/misc-impl.c.inc"
> +
>   /* Handles lfdp */
>   static void gen_dform39(DisasContext *ctx)
>   {
> @@ -6492,7 +6399,6 @@ GEN_HANDLER(lswi, 0x1F, 0x15, 0x12, 0x00000001, PPC_STRING),
>   GEN_HANDLER(lswx, 0x1F, 0x15, 0x10, 0x00000001, PPC_STRING),
>   GEN_HANDLER(stswi, 0x1F, 0x15, 0x16, 0x00000001, PPC_STRING),
>   GEN_HANDLER(stswx, 0x1F, 0x15, 0x14, 0x00000001, PPC_STRING),
> -GEN_HANDLER(eieio, 0x1F, 0x16, 0x1A, 0x01FFF801, PPC_MEM_EIEIO),
>   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(lharx, 0x1F, 0x14, 0x03, 0, PPC_NONE, PPC2_ATOMIC_ISA206),
> @@ -6510,7 +6416,6 @@ GEN_HANDLER_E(lqarx, 0x1F, 0x14, 0x08, 0, PPC_NONE, PPC2_LSQ_ISA207),
>   GEN_HANDLER2(stdcx_, "stdcx.", 0x1F, 0x16, 0x06, 0x00000000, PPC_64B),
>   GEN_HANDLER_E(stqcx_, 0x1F, 0x16, 0x05, 0, PPC_NONE, PPC2_LSQ_ISA207),
>   #endif
> -GEN_HANDLER(sync, 0x1F, 0x16, 0x12, 0x039FF801, PPC_MEM_SYNC),
>   /* ISA v3.0 changed the extended opcode from 62 to 30 */
>   GEN_HANDLER(wait, 0x1F, 0x1E, 0x01, 0x039FF801, PPC_WAIT),
>   GEN_HANDLER_E(wait, 0x1F, 0x1E, 0x00, 0x039CF801, PPC_NONE, PPC2_ISA300),
> @@ -6633,9 +6538,6 @@ GEN_HANDLER2_E(tlbilx_booke206, "tlbilx", 0x1F, 0x12, 0x00, 0x03800001,
>   GEN_HANDLER(wrtee, 0x1F, 0x03, 0x04, 0x000FFC01, PPC_WRTEE),
>   GEN_HANDLER(wrteei, 0x1F, 0x03, 0x05, 0x000E7C01, PPC_WRTEE),
>   GEN_HANDLER(dlmzb, 0x1F, 0x0E, 0x02, 0x00000000, PPC_440_SPEC),
> -GEN_HANDLER_E(mbar, 0x1F, 0x16, 0x1a, 0x001FF801,
> -              PPC_BOOKE, PPC2_BOOKE206),
> -GEN_HANDLER(msync_4xx, 0x1F, 0x16, 0x12, 0x039FF801, PPC_BOOKE),
>   GEN_HANDLER2_E(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001,
>                  PPC_BOOKE, PPC2_BOOKE206),
>   GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x06, 0x08, 0x03E00001,
> diff --git a/target/ppc/translate/misc-impl.c.inc b/target/ppc/translate/misc-impl.c.inc
> new file mode 100644
> index 0000000000..f58bf8b848
> --- /dev/null
> +++ b/target/ppc/translate/misc-impl.c.inc
> @@ -0,0 +1,135 @@
> +/*
> + * Power ISA decode for misc instructions
> + *
> + * Copyright (c) 2024, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +/*
> + * Memory Barrier Instructions
> + */
> +
> +static bool trans_SYNC(DisasContext *ctx, arg_X_sync *a)
> +{
> +    TCGBar bar = TCG_MO_ALL;
> +    uint32_t l = a->l;
> +
> +    /*
> +     * BookE uses the msync mnemonic. This means hwsync, except in the
> +     * 440, where it an execution serialisation point that requires all
> +     * previous storage accesses to have been performed to memory (which
> +     * doesn't matter for TCG).
> +     */
> +    if (!(ctx->insns_flags & PPC_MEM_SYNC)) {
> +        if (ctx->insns_flags & PPC_BOOKE) {
> +            /* msync replaces sync on 440, interpreted as nop */
> +            /* XXX: this also catches e200 */
> +            return true;
> +        }
> +
> +        return false;
> +    }
> +
> +    /* e500 family seems to treat reserved bits as invalid, this enforces l=0 */
> +    if ((ctx->insns_flags2 & PPC2_BOOKE206) && (ctx->opcode & 0x03FFF801)) {
> +        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
> +    }
> +
> +    if ((l == 1) && (ctx->insns_flags2 & PPC2_MEM_LWSYNC)) {
> +        bar = TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST;
> +    }
> +
> +    /*
> +     * We may need to check for a pending TLB flush.
> +     *
> +     * We do this on ptesync (l == 2) on ppc64 and any sync on ppc32.
> +     *
> +     * Additionally, this can only happen in kernel mode however so
> +     * check MSR_PR as well.
> +     */
> +    if (((l == 2) || !(ctx->insns_flags & PPC_64B)) && !ctx->pr) {
> +        gen_check_tlb_flush(ctx, true);
> +    }
> +
> +    tcg_gen_mb(bar | TCG_BAR_SC);
> +
> +    return true;
> +}
> +
> +static bool trans_EIEIO(DisasContext *ctx, arg_EIEIO *a)
> +{
> +    TCGBar bar = TCG_MO_ALL;
> +
> +    /*
> +     * BookE uses the mbar instruction instead of eieio, which is basically
> +     * full hwsync memory barrier, but is not execution synchronising. For
> +     * the purpose of TCG the distinction is not relevant.
> +     */
> +    if (!(ctx->insns_flags & PPC_MEM_EIEIO)) {
> +        if ((ctx->insns_flags & PPC_BOOKE) ||
> +            (ctx->insns_flags2 & PPC2_BOOKE206)) {
> +            return true;
> +        }
> +        return false;
> +    }
> +
> +    /*
> +     * eieio has complex semanitcs. It provides memory ordering between
> +     * operations in the set:
> +     * - loads from CI memory.
> +     * - stores to CI memory.
> +     * - stores to WT memory.
> +     *
> +     * It separately also orders memory for operations in the set:
> +     * - stores to cacheble memory.
> +     *
> +     * It also serializes instructions:
> +     * - dcbt and dcbst.
> +     *
> +     * It separately serializes:
> +     * - tlbie and tlbsync.
> +     *
> +     * And separately serializes:
> +     * - slbieg, slbiag, and slbsync.
> +     *
> +     * The end result is that CI memory ordering requires TCG_MO_ALL
> +     * and it is not possible to special-case more relaxed ordering for
> +     * cacheable accesses. TCG_BAR_SC is required to provide this
> +     * serialization.
> +     */
> +
> +    /*
> +     * 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->cia);
> +        } else {
> +            bar = TCG_MO_ST_LD;
> +        }
> +    }
> +
> +    tcg_gen_mb(bar | TCG_BAR_SC);
> +
> +    return true;
> +}



  reply	other threads:[~2024-05-07  6:42 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-01 13:04 [PATCH 0/3] target/ppc: Fixes and updates for sync instructions Nicholas Piggin
2024-05-01 13:04 ` [PATCH 1/3] target/ppc: Move sync instructions to decodetree Nicholas Piggin
2024-05-07  6:41   ` Chinmay Rath [this message]
2024-05-01 13:04 ` [PATCH 2/3] target/ppc: Fix embedded memory barriers Nicholas Piggin
2024-05-07  7:24   ` Chinmay Rath
2024-05-01 13:04 ` [PATCH 3/3] target/ppc: Add ISA v3.1 variants of sync instruction Nicholas Piggin
2024-05-07  7:09   ` Chinmay Rath

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fba61833-faeb-4c3e-bab2-87d1a99e7644@linux.vnet.ibm.com \
    --to=rathc@linux.vnet.ibm.com \
    --cc=danielhb413@gmail.com \
    --cc=npiggin@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=rathc@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).