Lines Matching full:db
24 static void set_can_do_io(DisasContextBase *db, bool val) in set_can_do_io() argument
32 bool translator_io_start(DisasContextBase *db) in translator_io_start() argument
38 if (db->is_jmp == DISAS_NEXT) { in translator_io_start()
39 db->is_jmp = DISAS_TOO_MANY; in translator_io_start()
44 static TCGOp *gen_tb_start(DisasContextBase *db, uint32_t cflags) in gen_tb_start() argument
107 bool translator_is_same_page(const DisasContextBase *db, vaddr addr) in translator_is_same_page() argument
109 return ((addr ^ db->pc_first) & TARGET_PAGE_MASK) == 0; in translator_is_same_page()
112 bool translator_use_goto_tb(DisasContextBase *db, vaddr dest) in translator_use_goto_tb() argument
115 if (tb_cflags(db->tb) & CF_NO_GOTO_TB) { in translator_use_goto_tb()
120 return translator_is_same_page(db, dest); in translator_use_goto_tb()
125 DisasContextBase *db) in translator_loop() argument
133 db->tb = tb; in translator_loop()
134 db->pc_first = pc; in translator_loop()
135 db->pc_next = pc; in translator_loop()
136 db->is_jmp = DISAS_NEXT; in translator_loop()
137 db->num_insns = 0; in translator_loop()
138 db->max_insns = *max_insns; in translator_loop()
139 db->insn_start = NULL; in translator_loop()
140 db->fake_insn = false; in translator_loop()
141 db->host_addr[0] = host_pc; in translator_loop()
142 db->host_addr[1] = NULL; in translator_loop()
143 db->record_start = 0; in translator_loop()
144 db->record_len = 0; in translator_loop()
146 ops->init_disas_context(db, cpu); in translator_loop()
147 tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */ in translator_loop()
150 icount_start_insn = gen_tb_start(db, cflags); in translator_loop()
151 ops->tb_start(db, cpu); in translator_loop()
152 tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */ in translator_loop()
154 plugin_enabled = plugin_gen_tb_start(cpu, db); in translator_loop()
155 db->plugin_enabled = plugin_enabled; in translator_loop()
158 *max_insns = ++db->num_insns; in translator_loop()
159 ops->insn_start(db, cpu); in translator_loop()
160 db->insn_start = tcg_last_op(); in translator_loop()
162 first_insn_start = db->insn_start; in translator_loop()
164 tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */ in translator_loop()
167 plugin_gen_insn_start(cpu, db); in translator_loop()
172 * update db->pc_next and db->is_jmp to indicate what should be in translator_loop()
176 ops->translate_insn(db, cpu); in translator_loop()
192 if (db->is_jmp != DISAS_NEXT) { in translator_loop()
198 if (tcg_op_buf_full() || db->num_insns >= db->max_insns) { in translator_loop()
199 db->is_jmp = DISAS_TOO_MANY; in translator_loop()
204 /* Emit code to exit the TB, as indicated by db->is_jmp. */ in translator_loop()
205 ops->tb_stop(db, cpu); in translator_loop()
206 gen_tb_end(tb, cflags, icount_start_insn, db->num_insns); in translator_loop()
212 if (db->num_insns == 1) { in translator_loop()
213 tcg_debug_assert(first_insn_start == db->insn_start); in translator_loop()
215 tcg_debug_assert(first_insn_start != db->insn_start); in translator_loop()
217 set_can_do_io(db, false); in translator_loop()
219 tcg_ctx->emit_before_op = db->insn_start; in translator_loop()
220 set_can_do_io(db, true); in translator_loop()
224 tb->size = db->pc_next - db->pc_first; in translator_loop()
225 tb->icount = db->num_insns; in translator_loop()
228 plugin_gen_tb_end(cpu, db->num_insns); in translator_loop()
232 && qemu_log_in_addr_range(db->pc_first)) { in translator_loop()
238 !ops->disas_log(db, cpu, logfile)) { in translator_loop()
239 fprintf(logfile, "IN: %s\n", lookup_symbol(db->pc_first)); in translator_loop()
240 target_disas(logfile, cpu, db); in translator_loop()
248 static bool translator_ld(CPUArchState *env, DisasContextBase *db, in translator_ld() argument
251 TranslationBlock *tb = db->tb; in translator_ld()
259 tcg_debug_assert(db->max_insns == 1); in translator_ld()
263 host = db->host_addr[0]; in translator_ld()
264 base = db->pc_first; in translator_ld()
294 host = db->host_addr[1]; in translator_ld()
299 new_page1 = get_page_addr_code_hostp(env, base, &db->host_addr[1]); in translator_ld()
309 db->max_insns = db->num_insns; in translator_ld()
329 host = db->host_addr[1]; in translator_ld()
336 static void record_save(DisasContextBase *db, vaddr pc, in record_save() argument
342 if (pc < db->pc_first) { in record_save()
350 offset = pc - db->pc_first; in record_save()
357 if (db->record_len == 0) { in record_save()
358 db->record_start = offset; in record_save()
359 db->record_len = size; in record_save()
361 assert(offset == db->record_start + db->record_len); in record_save()
362 assert(db->record_len + size <= sizeof(db->record)); in record_save()
363 db->record_len += size; in record_save()
366 memcpy(db->record + (offset - db->record_start), from, size); in record_save()
369 size_t translator_st_len(const DisasContextBase *db) in translator_st_len() argument
371 return db->fake_insn ? db->record_len : db->tb->size; in translator_st_len()
374 bool translator_st(const DisasContextBase *db, void *dest, in translator_st() argument
379 if (addr < db->pc_first) { in translator_st()
382 offset = addr - db->pc_first; in translator_st()
384 if (offset_end > translator_st_len(db)) { in translator_st()
388 if (!db->fake_insn) { in translator_st()
389 size_t offset_page1 = -(db->pc_first | TARGET_PAGE_MASK); in translator_st()
392 if (db->host_addr[0]) { in translator_st()
394 memcpy(dest, db->host_addr[0] + offset, len); in translator_st()
399 memcpy(dest, db->host_addr[0] + offset, len0); in translator_st()
406 if (db->host_addr[1] && offset >= offset_page1) { in translator_st()
407 memcpy(dest, db->host_addr[1] + (offset - offset_page1), in translator_st()
414 if (db->record_len != 0 && in translator_st()
415 offset >= db->record_start && in translator_st()
416 offset_end <= db->record_start + db->record_len) { in translator_st()
417 memcpy(dest, db->record + (offset - db->record_start), in translator_st()
424 uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc) in translator_ldub() argument
428 if (!translator_ld(env, db, &raw, pc, sizeof(raw))) { in translator_ldub()
430 record_save(db, pc, &raw, sizeof(raw)); in translator_ldub()
435 uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc) in translator_lduw() argument
439 if (translator_ld(env, db, &raw, pc, sizeof(raw))) { in translator_lduw()
444 record_save(db, pc, &raw, sizeof(raw)); in translator_lduw()
449 uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc) in translator_ldl() argument
453 if (translator_ld(env, db, &raw, pc, sizeof(raw))) { in translator_ldl()
458 record_save(db, pc, &raw, sizeof(raw)); in translator_ldl()
463 uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc) in translator_ldq() argument
467 if (translator_ld(env, db, &raw, pc, sizeof(raw))) { in translator_ldq()
472 record_save(db, pc, &raw, sizeof(raw)); in translator_ldq()
477 void translator_fake_ld(DisasContextBase *db, const void *data, size_t len) in translator_fake_ld() argument
479 db->fake_insn = true; in translator_fake_ld()
480 record_save(db, db->pc_first, data, len); in translator_fake_ld()