Revision e6e5906b cpu-exec.c

b/cpu-exec.c
40 40
//#define DEBUG_EXEC
41 41
//#define DEBUG_SIGNAL
42 42

  
43
#if defined(TARGET_ARM) || defined(TARGET_SPARC)
43
#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_M68K)
44 44
/* XXX: unify with i386 target */
45 45
void cpu_loop_exit(void)
46 46
{
47 47
    longjmp(env->jmp_env, 1);
48 48
}
49 49
#endif
50
#if !(defined(TARGET_SPARC) || defined(TARGET_SH4))
50
#if !(defined(TARGET_SPARC) || defined(TARGET_SH4) || defined(TARGET_M68K))
51 51
#define reg_T2
52 52
#endif
53 53

  
......
194 194
    flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK);
195 195
    cs_base = 0;
196 196
    pc = env->PC;
197
#elif defined(TARGET_M68K)
198
    flags = env->fpcr & M68K_FPCR_PREC;
199
    cs_base = 0;
200
    pc = env->pc;
197 201
#elif defined(TARGET_SH4)
198 202
    flags = env->sr & (SR_MD | SR_RB);
199 203
    cs_base = 0;         /* XXXXX */
......
370 374
    saved_regwptr = REGWPTR;
371 375
#endif
372 376
#elif defined(TARGET_PPC)
377
#elif defined(TARGET_M68K)
378
    env->cc_op = CC_OP_FLAGS;
379
    env->cc_dest = env->sr & 0xf;
380
    env->cc_x = (env->sr >> 4) & 1;
373 381
#elif defined(TARGET_MIPS)
374 382
#elif defined(TARGET_SH4)
375 383
    /* XXXXX */
......
632 640
                    cpu_dump_state(env, logfile, fprintf, 0);
633 641
#elif defined(TARGET_PPC)
634 642
                    cpu_dump_state(env, logfile, fprintf, 0);
643
#elif defined(TARGET_M68K)
644
                    cpu_m68k_flush_flags(env, env->cc_op);
645
                    env->cc_op = CC_OP_FLAGS;
646
                    env->sr = (env->sr & 0xffe0)
647
                              | env->cc_dest | (env->cc_x << 4);
648
                    cpu_dump_state(env, logfile, fprintf, 0);
635 649
#elif defined(TARGET_MIPS)
636 650
                    cpu_dump_state(env, logfile, fprintf, 0);
637 651
#elif defined(TARGET_SH4)
......
846 860
    REGWPTR = saved_regwptr;
847 861
#endif
848 862
#elif defined(TARGET_PPC)
863
#elif defined(TARGET_M68K)
864
    cpu_m68k_flush_flags(env, env->cc_op);
865
    env->cc_op = CC_OP_FLAGS;
866
    env->sr = (env->sr & 0xffe0)
867
              | env->cc_dest | (env->cc_x << 4);
849 868
#elif defined(TARGET_MIPS)
850 869
#elif defined(TARGET_SH4)
851 870
    /* XXXXX */
......
1103 1122
    return 1;
1104 1123
}
1105 1124

  
1125
#elif defined(TARGET_M68K)
1126
static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
1127
                                    int is_write, sigset_t *old_set,
1128
                                    void *puc)
1129
{
1130
    TranslationBlock *tb;
1131
    int ret;
1132

  
1133
    if (cpu_single_env)
1134
        env = cpu_single_env; /* XXX: find a correct solution for multithread */
1135
#if defined(DEBUG_SIGNAL)
1136
    printf("qemu: SIGSEGV pc=0x%08lx address=%08lx w=%d oldset=0x%08lx\n", 
1137
           pc, address, is_write, *(unsigned long *)old_set);
1138
#endif
1139
    /* XXX: locking issue */
1140
    if (is_write && page_unprotect(address, pc, puc)) {
1141
        return 1;
1142
    }
1143
    /* see if it is an MMU fault */
1144
    ret = cpu_m68k_handle_mmu_fault(env, address, is_write, 1, 0);
1145
    if (ret < 0)
1146
        return 0; /* not an MMU fault */
1147
    if (ret == 0)
1148
        return 1; /* the MMU fault was handled without causing real CPU fault */
1149
    /* now we have a real cpu fault */
1150
    tb = tb_find_pc(pc);
1151
    if (tb) {
1152
        /* the PC is inside the translated code. It means that we have
1153
           a virtual CPU fault */
1154
        cpu_restore_state(tb, env, pc, puc);
1155
    }
1156
    /* we restore the process signal mask as the sigreturn should
1157
       do it (XXX: use sigsetjmp) */
1158
    sigprocmask(SIG_SETMASK, old_set, NULL);
1159
    cpu_loop_exit();
1160
    /* never comes here */
1161
    return 1;
1162
}
1163

  
1106 1164
#elif defined (TARGET_MIPS)
1107 1165
static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
1108 1166
                                    int is_write, sigset_t *old_set,

Also available in: Unified diff