Commit c9bac22c7d2405d5d243717f4a6b2e85a99e62fe

Authored by pbrook
1 parent 06d92f40

M68K watchpoint hacks.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2969 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 0 deletions
target-m68k/translate.c
... ... @@ -51,6 +51,7 @@ typedef struct DisasContext {
51 51 uint32_t fpcr;
52 52 struct TranslationBlock *tb;
53 53 int singlestep_enabled;
  54 + int is_mem;
54 55 } DisasContext;
55 56  
56 57 #define DISAS_JUMP_NEXT 4
... ... @@ -129,6 +130,7 @@ typedef void (*disas_proc)(DisasContext *, uint16_t);
129 130 static inline int gen_load(DisasContext * s, int opsize, int addr, int sign)
130 131 {
131 132 int tmp;
  133 + s->is_mem = 1;
132 134 switch(opsize) {
133 135 case OS_BYTE:
134 136 tmp = gen_new_qreg(QMODE_I32);
... ... @@ -166,6 +168,7 @@ static inline int gen_load(DisasContext * s, int opsize, int addr, int sign)
166 168 /* Generate a store. */
167 169 static inline void gen_store(DisasContext *s, int opsize, int addr, int val)
168 170 {
  171 + s->is_mem = 1;
169 172 switch(opsize) {
170 173 case OS_BYTE:
171 174 gen_st(s, 8, addr, val);
... ... @@ -2205,6 +2208,7 @@ DISAS_INSN(fpu)
2205 2208 dest = QREG_F0;
2206 2209 while (mask) {
2207 2210 if (ext & mask) {
  2211 + s->is_mem = 1;
2208 2212 if (ext & (1 << 13)) {
2209 2213 /* store */
2210 2214 gen_st(s, f64, addr, dest);
... ... @@ -3169,6 +3173,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
3169 3173 dc->singlestep_enabled = env->singlestep_enabled;
3170 3174 dc->fpcr = env->fpcr;
3171 3175 dc->user = (env->sr & SR_S) == 0;
  3176 + dc->is_mem = 0;
3172 3177 nb_gen_labels = 0;
3173 3178 lj = -1;
3174 3179 do {
... ... @@ -3199,6 +3204,12 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb,
3199 3204 last_cc_op = dc->cc_op;
3200 3205 dc->insn_pc = dc->pc;
3201 3206 disas_m68k_insn(env, dc);
  3207 +
  3208 + /* Terminate the TB on memory ops if watchpoints are present. */
  3209 + /* FIXME: This should be replacd by the deterministic execution
  3210 + * IRQ raising bits. */
  3211 + if (dc->is_mem && env->nb_watchpoints)
  3212 + break;
3202 3213 } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
3203 3214 !env->singlestep_enabled &&
3204 3215 (pc_offset) < (TARGET_PAGE_SIZE - 32));
... ...