diff options
author | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-03-30 09:38:04 +0000 |
---|---|---|
committer | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-03-30 09:38:04 +0000 |
commit | 471035729088e3aa7f69140ac0ad0b248ff7ec07 (patch) | |
tree | fe468ba8c22505dcdc9c5f41d8a83f2cda77f8ad /cpu-exec.c | |
parent | de270b3c7c0c9b15e6c2f3d5e7f5c96673711dad (diff) | |
download | qemu-471035729088e3aa7f69140ac0ad0b248ff7ec07.zip qemu-471035729088e3aa7f69140ac0ad0b248ff7ec07.tar.gz qemu-471035729088e3aa7f69140ac0ad0b248ff7ec07.tar.bz2 |
New model for PowerPC CPU hardware interrupt events:
move all PowerPC specific code into target-ppc/helper.c to avoid polluting
the common code in cpu-exec.c. This makes implementation of new features
(ie embedded PowerPC timers, critical interrupts, ...) easier.
This also avoid hardcoding the IRQ callback in the OpenPIC controller,
making it more easily reusable and allowing cascading.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2542 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'cpu-exec.c')
-rw-r--r-- | cpu-exec.c | 26 |
1 files changed, 6 insertions, 20 deletions
@@ -256,8 +256,7 @@ int cpu_exec(CPUState *env1) #elif defined(TARGET_PPC) if (env1->halted) { if (env1->msr[MSR_EE] && - (env1->interrupt_request & - (CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER))) { + (env1->interrupt_request & CPU_INTERRUPT_HARD)) { env1->halted = 0; } else { return EXCP_HALTED; @@ -448,24 +447,11 @@ int cpu_exec(CPUState *env1) cpu_ppc_reset(env); } #endif - if (msr_ee != 0) { - if ((interrupt_request & CPU_INTERRUPT_HARD)) { - /* Raise it */ - env->exception_index = EXCP_EXTERNAL; - env->error_code = 0; - do_interrupt(env); - env->interrupt_request &= ~CPU_INTERRUPT_HARD; -#if defined(__sparc__) && !defined(HOST_SOLARIS) - tmp_T0 = 0; -#else - T0 = 0; -#endif - } else if ((interrupt_request & CPU_INTERRUPT_TIMER)) { - /* Raise it */ - env->exception_index = EXCP_DECR; - env->error_code = 0; - do_interrupt(env); - env->interrupt_request &= ~CPU_INTERRUPT_TIMER; + if (interrupt_request & CPU_INTERRUPT_HARD) { + if (ppc_hw_interrupt(env) == 1) { + /* Some exception was raised */ + if (env->pending_interrupts == 0) + env->interrupt_request &= ~CPU_INTERRUPT_HARD; #if defined(__sparc__) && !defined(HOST_SOLARIS) tmp_T0 = 0; #else |