On Tue, Aug 20, 2024 at 2:00 PM Alvin Che-Chia Chang(張哲嘉)
<alvi...@andestech.com> wrote:
>
> Hi Alistair,
>
> > -----Original Message-----
> > From: Alvin Che-Chia Chang(張哲嘉) <alvi...@andestech.com>
> > Sent: Sunday, July 21, 2024 3:24 PM
> > To: qemu-ri...@nongnu.org; qemu-devel@nongnu.org
> > Cc: alistair.fran...@wdc.com; bin.m...@windriver.com;
> > liwei1...@gmail.com; dbarb...@ventanamicro.com;
> > zhiwei_...@linux.alibaba.com; Alvin Che-Chia Chang(張哲嘉)
> > <alvi...@andestech.com>
> > Subject: [PATCH v3 2/2] target/riscv: Add textra matching condition for the
> > triggers
> >
> > According to RISC-V Debug specification, the optional textra32 and
> > textra64 trigger CSRs can be used to configure additional matching 
> > conditions
> > for the triggers. For example, if the textra.MHSELECT field is set to 4
> > (mcontext), this trigger will only match or fire if the low bits of
> > mcontext/hcontext equal textra.MHVALUE field.
> >
> > This commit adds the aforementioned matching condition as common trigger
> > matching conditions. Currently, the only legal values of textra.MHSELECT 
> > are 0
> > (ignore) and 4 (mcontext). When textra.MHSELECT is 0, we pass the checking.
> > When textra.MHSELECT is 4, we compare textra.MHVALUE with mcontext CSR.
> > The remaining fields, such as textra.SBYTEMASK, textra.SVALUE, and
> > textra.SSELECT, are hardwired to zero for now. Thus, we skip checking them
> > here.
> >
> > Signed-off-by: Alvin Chang <alvi...@andestech.com>
> > Reviewed-by: Alistair Francis <alistair.fran...@wdc.com>
> > ---
> >  target/riscv/debug.c | 63
> > +++++++++++++++++++++++++++++++++++++++++++-
> >  target/riscv/debug.h |  3 +++
> >  2 files changed, 65 insertions(+), 1 deletion(-)
> >
> > diff --git a/target/riscv/debug.c b/target/riscv/debug.c index
> > d6b4a06144..62bb758860 100644
> > --- a/target/riscv/debug.c
> > +++ b/target/riscv/debug.c
> > @@ -364,11 +364,72 @@ static bool trigger_priv_match(CPURISCVState *env,
> > trigger_type_t type,
> >      return false;
> >  }
> >
> > +static bool trigger_textra_match(CPURISCVState *env, trigger_type_t type,
> > +                                 int trigger_index) {
> > +    target_ulong textra = env->tdata3[trigger_index];
> > +    target_ulong mhvalue, mhselect;
> > +
> > +    if (type < TRIGGER_TYPE_AD_MATCH || type >
> > TRIGGER_TYPE_AD_MATCH6) {
> > +        /* textra checking is only applicable when type is 2, 3, 4, 5, or 
> > 6 */
> > +        return true;
> > +    }
> > +
> > +    switch (riscv_cpu_mxl(env)) {
> > +    case MXL_RV32:
> > +        mhvalue  = get_field(textra, TEXTRA32_MHVALUE);
> > +        mhselect = get_field(textra, TEXTRA32_MHSELECT);
> > +        break;
> > +    case MXL_RV64:
> > +    case MXL_RV128:
> > +        mhvalue  = get_field(textra, TEXTRA64_MHVALUE);
> > +        mhselect = get_field(textra, TEXTRA64_MHSELECT);
> > +        break;
> > +    default:
> > +        g_assert_not_reached();
> > +    }
> > +
> > +    /* Check mhvalue and mhselect. */
> > +    switch (mhselect) {
> > +    case MHSELECT_IGNORE:
> > +        break;
> > +    case MHSELECT_MCONTEXT:
> > +        /* Match or fire if the low bits of mcontext/hcontext equal 
> > mhvalue.
> > */
> > +        if (riscv_has_ext(env, RVH)) {
> > +            if (mhvalue != env->mcontext) {
> > +                return false;
> > +            }
> > +        } else {
> > +            switch (riscv_cpu_mxl(env)) {
> > +            case MXL_RV32:
> > +                if (mhvalue != (env->mcontext & MCONTEXT32)) {
> > +                    return false;
> > +                }
> > +                break;
> > +            case MXL_RV64:
> > +            case MXL_RV128:
> > +                if (mhvalue != (env->mcontext & MCONTEXT64)) {
> > +                    return false;
> > +                }
> > +                break;
> > +            default:
> > +                g_assert_not_reached();
> > +            }
> > +        }
>
> I have some new ideas on this part.
> Should we replace this whole if-else with just the following simple code ?
>
>     case MHSELECT_MCONTEXT:
>         /* Match if the low bits of mcontext/hcontext equal mhvalue. */
>         if (mhvalue != env->mcontext) {
>             return false;
>         }
>         break;
>
> Those masks on mcontext have been applied in write_mcontext().
> I think we can skip the masks here.
> What do you think ?

Yep, that would be much better

Alistair

>
>
> Regards,
> Alvin Chang
>
> > +        break;
> > +    default:
> > +        break;
> > +    }
> > +
> > +    return true;
> > +}
> > +
> >  /* Common matching conditions for all types of the triggers. */  static 
> > bool
> > trigger_common_match(CPURISCVState *env, trigger_type_t type,
> >                                   int trigger_index)  {
> > -    return trigger_priv_match(env, type, trigger_index);
> > +    return trigger_priv_match(env, type, trigger_index) &&
> > +           trigger_textra_match(env, type, trigger_index);
> >  }
> >
> >  /* type 2 trigger */
> > diff --git a/target/riscv/debug.h b/target/riscv/debug.h index
> > c347863578..f76b8f944a 100644
> > --- a/target/riscv/debug.h
> > +++ b/target/riscv/debug.h
> > @@ -131,6 +131,9 @@ enum {
> >  #define ITRIGGER_VU           BIT(25)
> >  #define ITRIGGER_VS           BIT(26)
> >
> > +#define MHSELECT_IGNORE       0
> > +#define MHSELECT_MCONTEXT     4
> > +
> >  bool tdata_available(CPURISCVState *env, int tdata_index);
> >
> >  target_ulong tselect_csr_read(CPURISCVState *env);
> > --
> > 2.34.1
>
> CONFIDENTIALITY NOTICE:
>
> This e-mail (and its attachments) may contain confidential and legally 
> privileged information or information protected from disclosure. If you are 
> not the intended recipient, you are hereby notified that any disclosure, 
> copying, distribution, or use of the information contained herein is strictly 
> prohibited. In this case, please immediately notify the sender by return 
> e-mail, delete the message (and any accompanying documents) and destroy all 
> printed hard copies. Thank you for your cooperation.
>
> Copyright ANDES TECHNOLOGY CORPORATION - All Rights Reserved.

Reply via email to