On Sat, Sep 13, 2014 at 09:45:21AM -0700, Richard Henderson wrote: > Cc: Edgar E. Iglesias <edgar.igles...@gmail.com> > Signed-off-by: Richard Henderson <r...@twiddle.net>
Both CRIS and MicroBlaze look good, thanks. Reviewed-by: Edgar E. Iglesias <edgar.igles...@xilinx.com> > --- > cpu-exec.c | 21 --------------------- > target-cris/cpu-qom.h | 1 + > target-cris/cpu.c | 1 + > target-cris/helper.c | 31 +++++++++++++++++++++++++++++++ > 4 files changed, 33 insertions(+), 21 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index 8ff85ba..7efcf27 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -629,27 +629,6 @@ int cpu_exec(CPUArchState *env) > next_tb = 0; > } > } > -#elif defined(TARGET_CRIS) > - if (interrupt_request & CPU_INTERRUPT_HARD > - && (env->pregs[PR_CCS] & I_FLAG) > - && !env->locked_irq) { > - cpu->exception_index = EXCP_IRQ; > - cc->do_interrupt(cpu); > - next_tb = 0; > - } > - if (interrupt_request & CPU_INTERRUPT_NMI) { > - unsigned int m_flag_archval; > - if (env->pregs[PR_VR] < 32) { > - m_flag_archval = M_FLAG_V10; > - } else { > - m_flag_archval = M_FLAG_V32; > - } > - if ((env->pregs[PR_CCS] & m_flag_archval)) { > - cpu->exception_index = EXCP_NMI; > - cc->do_interrupt(cpu); > - next_tb = 0; > - } > - } > #endif > /* The target hook has 3 exit conditions: > False when the interrupt isn't processed, > diff --git a/target-cris/cpu-qom.h b/target-cris/cpu-qom.h > index 7559366..6fc30c2 100644 > --- a/target-cris/cpu-qom.h > +++ b/target-cris/cpu-qom.h > @@ -75,6 +75,7 @@ static inline CRISCPU *cris_env_get_cpu(CPUCRISState *env) > > void cris_cpu_do_interrupt(CPUState *cpu); > void crisv10_cpu_do_interrupt(CPUState *cpu); > +bool cris_cpu_exec_interrupt(CPUState *cpu, int int_req); > > void cris_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, > int flags); > diff --git a/target-cris/cpu.c b/target-cris/cpu.c > index 20d8809..528e458 100644 > --- a/target-cris/cpu.c > +++ b/target-cris/cpu.c > @@ -279,6 +279,7 @@ static void cris_cpu_class_init(ObjectClass *oc, void > *data) > cc->class_by_name = cris_cpu_class_by_name; > cc->has_work = cris_cpu_has_work; > cc->do_interrupt = cris_cpu_do_interrupt; > + cc->cpu_exec_interrupt = cris_cpu_exec_interrupt; > cc->dump_state = cris_cpu_dump_state; > cc->set_pc = cris_cpu_set_pc; > cc->gdb_read_register = cris_cpu_gdb_read_register; > diff --git a/target-cris/helper.c b/target-cris/helper.c > index e8b8261..e901c3a 100644 > --- a/target-cris/helper.c > +++ b/target-cris/helper.c > @@ -283,3 +283,34 @@ hwaddr cris_cpu_get_phys_page_debug(CPUState *cs, vaddr > addr) > return phy; > } > #endif > + > +bool cris_cpu_exec_interrupt(CPUState *cs, int interrupt_request) > +{ > + CPUClass *cc = CPU_GET_CLASS(cs); > + CRISCPU *cpu = CRIS_CPU(cs); > + CPUCRISState *env = &cpu->env; > + bool ret = false; > + > + if (interrupt_request & CPU_INTERRUPT_HARD > + && (env->pregs[PR_CCS] & I_FLAG) > + && !env->locked_irq) { > + cs->exception_index = EXCP_IRQ; > + cc->do_interrupt(cs); > + ret = true; > + } > + if (interrupt_request & CPU_INTERRUPT_NMI) { > + unsigned int m_flag_archval; > + if (env->pregs[PR_VR] < 32) { > + m_flag_archval = M_FLAG_V10; > + } else { > + m_flag_archval = M_FLAG_V32; > + } > + if ((env->pregs[PR_CCS] & m_flag_archval)) { > + cs->exception_index = EXCP_NMI; > + cc->do_interrupt(cs); > + ret = true; > + } > + } > + > + return ret; > +} > -- > 1.9.3 >