diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-05-23 19:58:11 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-05-23 19:58:11 +0000 |
commit | 0633879f1ac38b18d84c46dda506300cc8329723 (patch) | |
tree | 8df64e0861c32132c7a08af16451629f1ec69112 /cpu-exec.c | |
parent | 9daea9067aae3e324f14c6b139621c10683fc550 (diff) | |
download | qemu-0633879f1ac38b18d84c46dda506300cc8329723.zip qemu-0633879f1ac38b18d84c46dda506300cc8329723.tar.gz qemu-0633879f1ac38b18d84c46dda506300cc8329723.tar.bz2 |
m68k/ColdFire system emulation.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2851 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'cpu-exec.c')
-rw-r--r-- | cpu-exec.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -196,7 +196,7 @@ static inline TranslationBlock *tb_find_fast(void) cs_base = 0; pc = env->PC; #elif defined(TARGET_M68K) - flags = env->fpcr & M68K_FPCR_PREC; + flags = (env->fpcr & M68K_FPCR_PREC) | (env->sr & SR_S); cs_base = 0; pc = env->pc; #elif defined(TARGET_SH4) @@ -297,7 +297,7 @@ int cpu_exec(CPUState *env1) return EXCP_HALTED; } } -#elif defined(TARGET_ALPHA) +#elif defined(TARGET_ALPHA) || defined(TARGET_M68K) if (env1->halted) { if (env1->interrupt_request & CPU_INTERRUPT_HARD) { env1->halted = 0; @@ -390,6 +390,8 @@ int cpu_exec(CPUState *env1) do_interrupt(env); #elif defined(TARGET_ALPHA) do_interrupt(env); +#elif defined(TARGET_M68K) + do_interrupt(0); #endif } env->exception_index = -1; @@ -542,6 +544,18 @@ int cpu_exec(CPUState *env1) if (interrupt_request & CPU_INTERRUPT_HARD) { do_interrupt(env); } +#elif defined(TARGET_M68K) + if (interrupt_request & CPU_INTERRUPT_HARD + && ((env->sr & SR_I) >> SR_I_SHIFT) + < env->pending_level) { + /* Real hardware gets the interrupt vector via an + IACK cycle at this point. Current emulated + hardware doesn't rely on this, so we + provide/save the vector when the interrupt is + first signalled. */ + env->exception_index = env->pending_vector; + do_interrupt(1); + } #endif /* Don't use the cached interupt_request value, do_interrupt may have updated the EXITTB flag. */ |