> -----Original Message-----
> From: ltaylorsimp...@gmail.com <ltaylorsimp...@gmail.com>
> Sent: Thursday, March 20, 2025 2:45 PM
> To: 'Brian Cain' <brian.c...@oss.qualcomm.com>; qemu-devel@nongnu.org
> Cc: richard.hender...@linaro.org; phi...@linaro.org; Matheus Bernardino
> (QUIC) <quic_mathb...@quicinc.com>; a...@rev.ng; a...@rev.ng; Marco
> Liebel (QUIC) <quic_mlie...@quicinc.com>; alex.ben...@linaro.org; Mark
> Burton (QUIC) <quic_mbur...@quicinc.com>; Sid Manning
> <sidn...@quicinc.com>; Brian Cain <bc...@quicinc.com>
> Subject: RE: [PATCH 22/39] target/hexagon: Implement setprio, resched
> 
> WARNING: This email originated from outside of Qualcomm. Please be wary
> of any links or attachments, and do not enable macros.
> 
> > -----Original Message-----
> > From: Brian Cain <brian.c...@oss.qualcomm.com>
> > Sent: Friday, February 28, 2025 11:28 PM
> > To: qemu-devel@nongnu.org
> > Cc: brian.c...@oss.qualcomm.com; richard.hender...@linaro.org;
> > phi...@linaro.org; quic_mathb...@quicinc.com; a...@rev.ng;
> a...@rev.ng;
> > quic_mlie...@quicinc.com; ltaylorsimp...@gmail.com;
> > alex.ben...@linaro.org; quic_mbur...@quicinc.com;
> sidn...@quicinc.com;
> > Brian Cain <bc...@quicinc.com>
> > Subject: [PATCH 22/39] target/hexagon: Implement setprio, resched
> >
> > From: Brian Cain <bc...@quicinc.com>
> >
> > The hardware-assisted scheduler helps manage tasks on the run queue
> > and interrupt steering.
> >
> > This instruction is defined in the Qualcomm Hexagon V71 Programmer's
> > Reference Manual -
> https://docs.qualcomm.com/bundle/publicresource/80-
> > N2040-51_REV_AB_Hexagon_V71_ProgrammerS_Reference_Manual.pdf
> > See ยง11.9.2 SYSTEM MONITOR.
> 
> See earlier discussion on references to documents.
> 
> >
> > Signed-off-by: Brian Cain <brian.c...@oss.qualcomm.com>
> > ---
> >  target/hexagon/op_helper.c | 65
> > ++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 65 insertions(+)
> >
> > diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
> > index 0dce133d3a..d0dc4afac7 100644
> > --- a/target/hexagon/op_helper.c
> > +++ b/target/hexagon/op_helper.c
> > @@ -1465,6 +1465,57 @@ void HELPER(stop)(CPUHexagonState *env)
> >      hexagon_stop_thread(env);
> >  }
> >
> > +static inline QEMU_ALWAYS_INLINE void resched(CPUHexagonState
> *env)
> > {
> > +    uint32_t schedcfg;
> > +    uint32_t schedcfg_en;
> > +    int int_number;
> > +    CPUState *cs;
> > +    uint32_t lowest_th_prio = 0; /* 0 is highest prio */
> > +    uint32_t bestwait_reg;
> > +    uint32_t best_prio;
> > +
> > +    BQL_LOCK_GUARD();
> > +    qemu_log_mask(CPU_LOG_INT, "%s: check resched\n", __func__);
> > +    schedcfg = arch_get_system_reg(env, HEX_SREG_SCHEDCFG);
> > +    schedcfg_en = GET_FIELD(SCHEDCFG_EN, schedcfg);
> > +    int_number = GET_FIELD(SCHEDCFG_INTNO, schedcfg);
> > +
> > +    if (!schedcfg_en) {
> > +        return;
> > +    }
> > +
> > +    CPU_FOREACH(cs) {
> > +        HexagonCPU *thread = HEXAGON_CPU(cs);
> > +        CPUHexagonState *thread_env = &(thread->env);
> > +        uint32_t th_prio = GET_FIELD(
> > +            STID_PRIO, arch_get_system_reg(thread_env, HEX_SREG_STID));
> > +        if (!hexagon_thread_is_enabled(thread_env)) {
> > +            continue;
> > +        }
> > +
> > +        lowest_th_prio = (lowest_th_prio > th_prio)
> > +            ? lowest_th_prio
> > +            : th_prio;
> > +    }
> > +
> > +    bestwait_reg = arch_get_system_reg(env, HEX_SREG_BESTWAIT);
> > +    best_prio = GET_FIELD(BESTWAIT_PRIO, bestwait_reg);
> > +
> > +    /*
> > +     * If the lowest priority thread is lower priority than the
> > +     * value in the BESTWAIT register, we must raise the reschedule
> > +     * interrupt on the lowest priority thread.
> > +     */
> > +    if (lowest_th_prio > best_prio) {
> > +        qemu_log_mask(CPU_LOG_INT,
> > +                "%s: raising resched int %d, cur PC 0x" TARGET_FMT_lx "\n",
> > +                __func__, int_number, arch_get_thread_reg(env,
> HEX_REG_PC));
> > +        SET_SYSTEM_FIELD(env, HEX_SREG_BESTWAIT, BESTWAIT_PRIO,
> > 0x1ff);
> 
> What is the significance of 0x1ff?  The field is 10 bits, so this isn't 
> setting all
> the bits.
> Should this be lowest_th_prio?
[Sid Manning] 

Hi Taylor,

The value 0x1ff is correct but it does look like BESTWAIT_PRIO is not, it 
should be 9 not 10
target/hexagon/reg_fields_def.h.inc

It looks like it was added in "PATCH 19/38 target/hexagon: Define register 
fields for system regs"
I will make a fixup to that patch and correct the value.

> 
> > +        hex_raise_interrupts(env, 1 << int_number, CPU_INTERRUPT_SWI);
> > +    }
> > +}
> > +
> 

Reply via email to