mirror of https://github.com/xemu-project/xemu.git
tcg: Add in_code_gen_buffer
Create a function to determine if a pointer is within the buffer. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
8b5c2b6260
commit
4846cd37df
|
@ -392,27 +392,18 @@ void tb_destroy(TranslationBlock *tb)
|
||||||
|
|
||||||
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
|
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
|
||||||
{
|
{
|
||||||
TranslationBlock *tb;
|
/*
|
||||||
bool r = false;
|
* The host_pc has to be in the region of the code buffer.
|
||||||
uintptr_t check_offset;
|
* If it is not we will not be able to resolve it here.
|
||||||
|
* The two cases where host_pc will not be correct are:
|
||||||
/* The host_pc has to be in the region of current code buffer. If
|
|
||||||
* it is not we will not be able to resolve it here. The two cases
|
|
||||||
* where host_pc will not be correct are:
|
|
||||||
*
|
*
|
||||||
* - fault during translation (instruction fetch)
|
* - fault during translation (instruction fetch)
|
||||||
* - fault from helper (not using GETPC() macro)
|
* - fault from helper (not using GETPC() macro)
|
||||||
*
|
*
|
||||||
* Either way we need return early as we can't resolve it here.
|
* Either way we need return early as we can't resolve it here.
|
||||||
*
|
|
||||||
* We are using unsigned arithmetic so if host_pc <
|
|
||||||
* tcg_init_ctx.code_gen_buffer check_offset will wrap to way
|
|
||||||
* above the code_gen_buffer_size
|
|
||||||
*/
|
*/
|
||||||
check_offset = host_pc - (uintptr_t) tcg_init_ctx.code_gen_buffer;
|
if (in_code_gen_buffer((const void *)host_pc)) {
|
||||||
|
TranslationBlock *tb = tcg_tb_lookup(host_pc);
|
||||||
if (check_offset < tcg_init_ctx.code_gen_buffer_size) {
|
|
||||||
tb = tcg_tb_lookup(host_pc);
|
|
||||||
if (tb) {
|
if (tb) {
|
||||||
cpu_restore_state_from_tb(cpu, tb, host_pc, will_exit);
|
cpu_restore_state_from_tb(cpu, tb, host_pc, will_exit);
|
||||||
if (tb_cflags(tb) & CF_NOCACHE) {
|
if (tb_cflags(tb) & CF_NOCACHE) {
|
||||||
|
@ -421,11 +412,10 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
|
||||||
tcg_tb_remove(tb);
|
tcg_tb_remove(tb);
|
||||||
tb_destroy(tb);
|
tb_destroy(tb);
|
||||||
}
|
}
|
||||||
r = true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void page_init(void)
|
static void page_init(void)
|
||||||
|
|
|
@ -680,6 +680,17 @@ extern __thread TCGContext *tcg_ctx;
|
||||||
extern void *tcg_code_gen_epilogue;
|
extern void *tcg_code_gen_epilogue;
|
||||||
extern TCGv_env cpu_env;
|
extern TCGv_env cpu_env;
|
||||||
|
|
||||||
|
static inline bool in_code_gen_buffer(const void *p)
|
||||||
|
{
|
||||||
|
const TCGContext *s = &tcg_init_ctx;
|
||||||
|
/*
|
||||||
|
* Much like it is valid to have a pointer to the byte past the
|
||||||
|
* end of an array (so long as you don't dereference it), allow
|
||||||
|
* a pointer to the byte past the end of the code gen buffer.
|
||||||
|
*/
|
||||||
|
return (size_t)(p - s->code_gen_buffer) <= s->code_gen_buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
static inline size_t temp_idx(TCGTemp *ts)
|
static inline size_t temp_idx(TCGTemp *ts)
|
||||||
{
|
{
|
||||||
ptrdiff_t n = ts - tcg_ctx->temps;
|
ptrdiff_t n = ts - tcg_ctx->temps;
|
||||||
|
|
Loading…
Reference in New Issue