|
| From: | Richard Henderson |
| Subject: | Re: [Qemu-devel] [PATCH v2 1/4] target-tricore: Add trap handling |
| Date: | Tue, 16 Feb 2016 07:52:14 +1100 |
| User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 |
On 02/16/2016 12:10 AM, Bastian Koppelmann wrote:
+
+void tricore_cpu_do_interrupt(CPUState *cs)
+{
+ TriCoreCPU *cpu = TRICORE_CPU(cs);
+ CPUTriCoreState *env = &cpu->env;
+
+ if (cs->exception_index <= TRAPC_NMI) {
+ /* The trap vector table is accessed to fetch the first instruction of
+ the trap handler. */
+ env->PC = env->BTV | (cs->exception_index << 5);
+ } else if (cs->exception_index == TRAPC_IRQ) {
+ /* The interrupt vector table is accessed to fetch the first
instruction
+ of the interrupt handler. */
+ env->PC = env->BIV | ((env->ICR & MASK_ICR_PIPN) >> 10);
+ }
+}
You've still got a path whereby you modify PC without saving the old one.I don't think you want to add the do_interrupt hook at all until you're ready to do real async interrupts.
+ /* PCXI.PCPN = ICR.CCPN */ + env->PCXI = (env->PCXI & 0xffffff) + + ((env->ICR & MASK_ICR_CCPN) << 24); + cs->exception_index = class; + cpu_loop_exit(cs); +} +
There's no reason you can't modify PC here at the end of raise_exception_sync_internal. If you omit the set of exception_index here, you'll simply exit the cpu loop and immediately re-enter it at the new PC, without having to go through the do_interrupt hook.
r~
| [Prev in Thread] | Current Thread | [Next in Thread] |