tcg: Merge cpu_gen_code into tb_gen_code
As it's only caller, this tidies things a bit. Reviewed-by: Aurelien Jarno <aurelien@aurel32.net> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
		
							parent
							
								
									a3d5ad761c
								
							
						
					
					
						commit
						fec88f64bd
					
				| 
						 | 
					@ -78,8 +78,6 @@ void restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb,
 | 
				
			||||||
                          int pc_pos);
 | 
					                          int pc_pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cpu_gen_init(void);
 | 
					void cpu_gen_init(void);
 | 
				
			||||||
int cpu_gen_code(CPUArchState *env, struct TranslationBlock *tb,
 | 
					 | 
				
			||||||
                 int *gen_code_size_ptr);
 | 
					 | 
				
			||||||
bool cpu_restore_state(CPUState *cpu, uintptr_t searched_pc);
 | 
					bool cpu_restore_state(CPUState *cpu, uintptr_t searched_pc);
 | 
				
			||||||
void page_size_init(void);
 | 
					void page_size_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										131
									
								
								translate-all.c
								
								
								
								
							
							
						
						
									
										131
									
								
								translate-all.c
								
								
								
								
							| 
						 | 
					@ -168,73 +168,7 @@ void cpu_gen_init(void)
 | 
				
			||||||
    tcg_context_init(&tcg_ctx); 
 | 
					    tcg_context_init(&tcg_ctx); 
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* return non zero if the very first instruction is invalid so that
 | 
					/* The cpu state corresponding to 'searched_pc' is restored.  */
 | 
				
			||||||
 * the virtual CPU can trigger an exception.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * '*gen_code_size_ptr' contains the size of the generated code (host
 | 
					 | 
				
			||||||
 * code).
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Called with mmap_lock held for user-mode emulation.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    TCGContext *s = &tcg_ctx;
 | 
					 | 
				
			||||||
    tcg_insn_unit *gen_code_buf;
 | 
					 | 
				
			||||||
    int gen_code_size;
 | 
					 | 
				
			||||||
#ifdef CONFIG_PROFILER
 | 
					 | 
				
			||||||
    int64_t ti;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_PROFILER
 | 
					 | 
				
			||||||
    s->tb_count1++; /* includes aborted translations because of
 | 
					 | 
				
			||||||
                       exceptions */
 | 
					 | 
				
			||||||
    ti = profile_getclock();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    tcg_func_start(s);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gen_intermediate_code(env, tb);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    trace_translate_block(tb, tb->pc, tb->tc_ptr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* generate machine code */
 | 
					 | 
				
			||||||
    gen_code_buf = tb->tc_ptr;
 | 
					 | 
				
			||||||
    tb->tb_next_offset[0] = 0xffff;
 | 
					 | 
				
			||||||
    tb->tb_next_offset[1] = 0xffff;
 | 
					 | 
				
			||||||
    s->tb_next_offset = tb->tb_next_offset;
 | 
					 | 
				
			||||||
#ifdef USE_DIRECT_JUMP
 | 
					 | 
				
			||||||
    s->tb_jmp_offset = tb->tb_jmp_offset;
 | 
					 | 
				
			||||||
    s->tb_next = NULL;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    s->tb_jmp_offset = NULL;
 | 
					 | 
				
			||||||
    s->tb_next = tb->tb_next;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_PROFILER
 | 
					 | 
				
			||||||
    s->tb_count++;
 | 
					 | 
				
			||||||
    s->interm_time += profile_getclock() - ti;
 | 
					 | 
				
			||||||
    s->code_time -= profile_getclock();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    gen_code_size = tcg_gen_code(s, gen_code_buf);
 | 
					 | 
				
			||||||
    *gen_code_size_ptr = gen_code_size;
 | 
					 | 
				
			||||||
#ifdef CONFIG_PROFILER
 | 
					 | 
				
			||||||
    s->code_time += profile_getclock();
 | 
					 | 
				
			||||||
    s->code_in_len += tb->size;
 | 
					 | 
				
			||||||
    s->code_out_len += gen_code_size;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef DEBUG_DISAS
 | 
					 | 
				
			||||||
    if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
 | 
					 | 
				
			||||||
        qemu_log("OUT: [size=%d]\n", gen_code_size);
 | 
					 | 
				
			||||||
        log_disas(tb->tc_ptr, gen_code_size);
 | 
					 | 
				
			||||||
        qemu_log("\n");
 | 
					 | 
				
			||||||
        qemu_log_flush();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* The cpu state corresponding to 'searched_pc' is restored.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
 | 
					static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
 | 
				
			||||||
                                     uintptr_t searched_pc)
 | 
					                                     uintptr_t searched_pc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1034,7 +968,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
 | 
				
			||||||
    TranslationBlock *tb;
 | 
					    TranslationBlock *tb;
 | 
				
			||||||
    tb_page_addr_t phys_pc, phys_page2;
 | 
					    tb_page_addr_t phys_pc, phys_page2;
 | 
				
			||||||
    target_ulong virt_page2;
 | 
					    target_ulong virt_page2;
 | 
				
			||||||
    int code_gen_size;
 | 
					    tcg_insn_unit *gen_code_buf;
 | 
				
			||||||
 | 
					    int gen_code_size;
 | 
				
			||||||
 | 
					#ifdef CONFIG_PROFILER
 | 
				
			||||||
 | 
					    int64_t ti;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    phys_pc = get_page_addr_code(env, pc);
 | 
					    phys_pc = get_page_addr_code(env, pc);
 | 
				
			||||||
    if (use_icount) {
 | 
					    if (use_icount) {
 | 
				
			||||||
| 
						 | 
					@ -1049,13 +987,62 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
 | 
				
			||||||
        /* Don't forget to invalidate previous TB info.  */
 | 
					        /* Don't forget to invalidate previous TB info.  */
 | 
				
			||||||
        tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
 | 
					        tcg_ctx.tb_ctx.tb_invalidated_flag = 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    tb->tc_ptr = tcg_ctx.code_gen_ptr;
 | 
					
 | 
				
			||||||
 | 
					    gen_code_buf = tcg_ctx.code_gen_ptr;
 | 
				
			||||||
 | 
					    tb->tc_ptr = gen_code_buf;
 | 
				
			||||||
    tb->cs_base = cs_base;
 | 
					    tb->cs_base = cs_base;
 | 
				
			||||||
    tb->flags = flags;
 | 
					    tb->flags = flags;
 | 
				
			||||||
    tb->cflags = cflags;
 | 
					    tb->cflags = cflags;
 | 
				
			||||||
    cpu_gen_code(env, tb, &code_gen_size);
 | 
					
 | 
				
			||||||
    tcg_ctx.code_gen_ptr = (void *)(((uintptr_t)tcg_ctx.code_gen_ptr +
 | 
					#ifdef CONFIG_PROFILER
 | 
				
			||||||
            code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
 | 
					    tcg_ctx.tb_count1++; /* includes aborted translations because of
 | 
				
			||||||
 | 
					                       exceptions */
 | 
				
			||||||
 | 
					    ti = profile_getclock();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tcg_func_start(&tcg_ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gen_intermediate_code(env, tb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    trace_translate_block(tb, tb->pc, tb->tc_ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* generate machine code */
 | 
				
			||||||
 | 
					    tb->tb_next_offset[0] = 0xffff;
 | 
				
			||||||
 | 
					    tb->tb_next_offset[1] = 0xffff;
 | 
				
			||||||
 | 
					    tcg_ctx.tb_next_offset = tb->tb_next_offset;
 | 
				
			||||||
 | 
					#ifdef USE_DIRECT_JUMP
 | 
				
			||||||
 | 
					    tcg_ctx.tb_jmp_offset = tb->tb_jmp_offset;
 | 
				
			||||||
 | 
					    tcg_ctx.tb_next = NULL;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    tcg_ctx.tb_jmp_offset = NULL;
 | 
				
			||||||
 | 
					    tcg_ctx.tb_next = tb->tb_next;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PROFILER
 | 
				
			||||||
 | 
					    tcg_ctx.tb_count++;
 | 
				
			||||||
 | 
					    tcg_ctx.interm_time += profile_getclock() - ti;
 | 
				
			||||||
 | 
					    tcg_ctx.code_time -= profile_getclock();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gen_code_size = tcg_gen_code(&tcg_ctx, gen_code_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PROFILER
 | 
				
			||||||
 | 
					    tcg_ctx.code_time += profile_getclock();
 | 
				
			||||||
 | 
					    tcg_ctx.code_in_len += tb->size;
 | 
				
			||||||
 | 
					    tcg_ctx.code_out_len += gen_code_size;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG_DISAS
 | 
				
			||||||
 | 
					    if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
 | 
				
			||||||
 | 
					        qemu_log("OUT: [size=%d]\n", gen_code_size);
 | 
				
			||||||
 | 
					        log_disas(tb->tc_ptr, gen_code_size);
 | 
				
			||||||
 | 
					        qemu_log("\n");
 | 
				
			||||||
 | 
					        qemu_log_flush();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tcg_ctx.code_gen_ptr = (void *)(((uintptr_t)gen_code_buf +
 | 
				
			||||||
 | 
					            gen_code_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* check next page if needed */
 | 
					    /* check next page if needed */
 | 
				
			||||||
    virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
 | 
					    virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue