Message ID | 20210721152651.14683-1-laramglazier@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/i386: Added V_INTR_PRIO check to virtual interrupts | expand |
On 21/07/21 17:26, Lara Lazier wrote: > +static inline bool ctl_has_irq(uint32_t int_ctl) > +{ > + uint32_t int_prio; > + uint32_t tpr; > + > + int_prio = (int_ctl & V_INTR_PRIO_MASK) >> V_INTR_MASKING_SHIFT; Oops, I missed that this should be V_INTR_PRIO_SHIFT. Can you send the correction please? Thanks, Paolo > + tpr = int_ctl & V_TPR_MASK; > + return (int_ctl & V_IRQ_MASK) && (int_prio >= tpr); > +} > +
diff --git a/target/i386/tcg/sysemu/svm_helper.c b/target/i386/tcg/sysemu/svm_helper.c index 2e66b05729..7ce85d1515 100644 --- a/target/i386/tcg/sysemu/svm_helper.c +++ b/target/i386/tcg/sysemu/svm_helper.c @@ -118,6 +118,16 @@ static inline void svm_vmrun_canonicalization(CPUX86State *env) env->tr.base = (long) ((uint32_t) env->tr.base); } +static inline bool ctl_has_irq(uint32_t int_ctl) +{ + uint32_t int_prio; + uint32_t tpr; + + int_prio = (int_ctl & V_INTR_PRIO_MASK) >> V_INTR_MASKING_SHIFT; + tpr = int_ctl & V_TPR_MASK; + return (int_ctl & V_IRQ_MASK) && (int_prio >= tpr); +} + static inline bool virtual_gif_enabled(CPUX86State *env, uint32_t int_ctl) { return (int_ctl & V_GIF_ENABLED_MASK) && (env->features[FEAT_SVM] & CPUID_SVM_VGIF); @@ -363,7 +373,7 @@ void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend) } else { env->hflags2 |= HF2_GIF_MASK; } - if (int_ctl & V_IRQ_MASK) { + if (ctl_has_irq(int_ctl)) { CPUState *cs = env_cpu(env); cs->interrupt_request |= CPU_INTERRUPT_VIRQ;
The APM2 states that The processor takes a virtual INTR interrupt if V_IRQ and V_INTR_PRIO indicate that there is a virtual interrupt pending whose priority is greater than the value in V_TPR. Signed-off-by: Lara Lazier <laramglazier@gmail.com> --- target/i386/tcg/sysemu/svm_helper.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)