From 9002ec794e8154ff774270cf9fac5f850a1c5751 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 6 May 2010 08:50:41 -0700 Subject: tcg: Initialize the prologue after GUEST_BASE is fixed. This will allow backends to make intelligent choices about how to implement GUEST_BASE. Signed-off-by: Richard Henderson Signed-off-by: Aurelien Jarno --- bsd-user/main.c | 9 ++++++++- exec.c | 5 +++++ linux-user/main.c | 9 ++++++++- tcg/tcg.c | 3 +++ tcg/tcg.h | 1 + 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/bsd-user/main.c b/bsd-user/main.c index b1c438d895..05cc3d92b7 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -30,7 +30,7 @@ #include "qemu-common.h" /* For tb_lock */ #include "exec-all.h" - +#include "tcg.h" #include "qemu-timer.h" #include "envlist.h" @@ -970,6 +970,13 @@ int main(int argc, char **argv) syscall_init(); signal_init(); +#if defined(CONFIG_USE_GUEST_BASE) + /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay + generating the prologue until now so that the prologue can take + the real value of GUEST_BASE into account. */ + tcg_prologue_init(&tcg_ctx); +#endif + /* build Task State */ memset(ts, 0, sizeof(TaskState)); init_task_state(ts); diff --git a/exec.c b/exec.c index 56b5561884..bb3dcadcde 100644 --- a/exec.c +++ b/exec.c @@ -574,6 +574,11 @@ void cpu_exec_init_all(unsigned long tb_size) #if !defined(CONFIG_USER_ONLY) io_mem_init(); #endif +#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE) + /* There's no guest base to take into account, so go ahead and + initialize the prologue now. */ + tcg_prologue_init(&tcg_ctx); +#endif } #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY) diff --git a/linux-user/main.c b/linux-user/main.c index 5027a6d994..b240f290f7 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -31,7 +31,7 @@ #include "cache-utils.h" /* For tb_lock */ #include "exec-all.h" - +#include "tcg.h" #include "qemu-timer.h" #include "envlist.h" @@ -2984,6 +2984,13 @@ int main(int argc, char **argv, char **envp) syscall_init(); signal_init(); +#if defined(CONFIG_USE_GUEST_BASE) + /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay + generating the prologue until now so that the prologue can take + the real value of GUEST_BASE into account. */ + tcg_prologue_init(&tcg_ctx); +#endif + #if defined(TARGET_I386) cpu_x86_set_cpl(env, 3); diff --git a/tcg/tcg.c b/tcg/tcg.c index a99ecb9a9e..880e7ceef9 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -240,7 +240,10 @@ void tcg_context_init(TCGContext *s) } tcg_target_init(s); +} +void tcg_prologue_init(TCGContext *s) +{ /* init global prologue and epilogue */ s->code_buf = code_gen_prologue; s->code_ptr = s->code_buf; diff --git a/tcg/tcg.h b/tcg/tcg.h index 44856e1dd5..58538235de 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -346,6 +346,7 @@ static inline void *tcg_malloc(int size) } void tcg_context_init(TCGContext *s); +void tcg_prologue_init(TCGContext *s); void tcg_func_start(TCGContext *s); int tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf); -- cgit v1.2.1