[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 2/7] translate-all: add out_size field to TranslationB
From: |
Emilio G. Cota |
Subject: |
[Qemu-devel] [RFC 2/7] translate-all: add out_size field to TranslationBlock |
Date: |
Thu, 29 Jun 2017 16:28:24 -0400 |
This paves the way for upcoming work: we need tb->out_size for
tb_find_pc to work with a binary search tree.
Note that due to the cacheline padding we are using, for
hosts with 64-byte cache lines this will not waste any
additional memory. Using a s16 would be ideal, since that
would plug an existing hole in the struct, but I see no
guarantee that a TB won't overflow it.
Signed-off-by: Emilio G. Cota <address@hidden>
---
include/exec/exec-all.h | 1 +
accel/tcg/translate-all.c | 16 ++++++++--------
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 35a75f1..df12338 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -363,6 +363,7 @@ struct TranslationBlock {
*/
uintptr_t jmp_list_next[2];
uintptr_t jmp_list_first;
+ int32_t out_size; /* size of host code for this block */
};
void tb_free(TranslationBlock *tb);
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index f6ad46b..da91482 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -1260,7 +1260,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
tb_page_addr_t phys_pc, phys_page2;
target_ulong virt_page2;
tcg_insn_unit *gen_code_buf;
- int gen_code_size, search_size;
+ int search_size;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
@@ -1327,11 +1327,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
the tcg optimization currently hidden inside tcg_gen_code. All
that should be required is to flush the TBs, allocate a new TB,
re-initialize it per above, and re-do the actual code generation. */
- gen_code_size = tcg_gen_code(&tcg_ctx, tb);
- if (unlikely(gen_code_size < 0)) {
+ tb->out_size = tcg_gen_code(&tcg_ctx, tb);
+ if (unlikely(tb->out_size < 0)) {
goto buffer_overflow;
}
- search_size = encode_search(tb, (void *)gen_code_buf + gen_code_size);
+ search_size = encode_search(tb, (void *)gen_code_buf + tb->out_size);
if (unlikely(search_size < 0)) {
goto buffer_overflow;
}
@@ -1339,7 +1339,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
#ifdef CONFIG_PROFILER
tcg_ctx.code_time += profile_getclock();
tcg_ctx.code_in_len += tb->size;
- tcg_ctx.code_out_len += gen_code_size;
+ tcg_ctx.code_out_len += tb->out_size;
tcg_ctx.search_out_len += search_size;
#endif
@@ -1347,8 +1347,8 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM) &&
qemu_log_in_addr_range(tb->pc)) {
qemu_log_lock();
- qemu_log("OUT: [size=%d]\n", gen_code_size);
- log_disas(tb->tc_ptr, gen_code_size);
+ qemu_log("OUT: [size=%d]\n", tb->out_size);
+ log_disas(tb->tc_ptr, tb->out_size);
qemu_log("\n");
qemu_log_flush();
qemu_log_unlock();
@@ -1356,7 +1356,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
#endif
tcg_ctx.code_gen_ptr = (void *)
- ROUND_UP((uintptr_t)gen_code_buf + gen_code_size + search_size,
+ ROUND_UP((uintptr_t)gen_code_buf + tb->out_size + search_size,
CODE_GEN_ALIGN);
/* init jump list */
--
2.7.4