bool openrisc_cpu_exec_interrupt(CPUState *cs, int interrupt_request) { OpenRISCCPU *cpu = OPENRISC_CPU(cs); CPUOpenRISCState *env = &cpu->env; int idx = -1; if ((interrupt_request & CPU_INTERRUPT_HARD) && (env->sr & SR_IEE)) { idx = EXCP_INT; } if ((interrupt_request & CPU_INTERRUPT_TIMER) && (env->sr & SR_TEE)) { idx = EXCP_TICK; } // Here's where we set our custom interrupt; I can trace execution to here in GDB, // but FreeRTOS doesn't know what to do with this interrupt so it freaks out - DRM if ((interrupt_request & CPU_INTERRUPT_CUSTOM) && (env->sr & SR_IEE)) { idx = EXCP_CUSTOM; } if (idx >= 0) { cs->exception_index = idx; openrisc_cpu_do_interrupt(cs); return true; } return false; }
bool openrisc_cpu_exec_interrupt(CPUState *cs, int interrupt_request) { OpenRISCCPU *cpu = OPENRISC_CPU(cs); CPUOpenRISCState *env = &cpu->env; int idx = -1; if ((interrupt_request & CPU_INTERRUPT_HARD) && (env->sr & SR_IEE)) { idx = EXCP_INT; } if ((interrupt_request & CPU_INTERRUPT_TIMER) && (env->sr & SR_TEE)) { idx = EXCP_TICK; } // Set up custom interrupts -- make sure to disable the interrupt here, // or it will get thrown multiple times if ((interrupt_request & CPU_INTERRUPT_FFS_WRITE) && (env->sr & SR_IEE)) { idx = EXCP_FFS_WRITE; cs->interrupt_request &= ~(CPU_INTERRUPT_FFS_WRITE); } if ((interrupt_request & CPU_INTERRUPT_FFS_ACK) && (env->sr & SR_IEE)) { idx = EXCP_FFS_ACK; cs->interrupt_request &= ~(CPU_INTERRUPT_FFS_ACK); } if (idx >= 0) { cs->exception_index = idx; openrisc_cpu_do_interrupt(cs); return true; } return false; }
bool openrisc_cpu_exec_interrupt(CPUState *cs, int interrupt_request) { OpenRISCCPU *cpu = OPENRISC_CPU(cs); CPUOpenRISCState *env = &cpu->env; int idx = -1; if ((interrupt_request & CPU_INTERRUPT_HARD) && (env->sr & SR_IEE)) { idx = EXCP_INT; } if ((interrupt_request & CPU_INTERRUPT_TIMER) && (env->sr & SR_TEE)) { idx = EXCP_TICK; } if (idx >= 0) { cs->exception_index = idx; openrisc_cpu_do_interrupt(cs); return true; } return false; }