diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 6582da21..54698d4a 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_aarch64 #define arm_cpu_list arm_cpu_list_aarch64 #define cpu_loop_exit cpu_loop_exit_aarch64 +#define cpu_loop_exit_restore cpu_loop_exit_restore_aarch64 #define arm_cpu_post_init arm_cpu_post_init_aarch64 #define arm_cpu_realizefn arm_cpu_realizefn_aarch64 #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index a908c3ee..786e6da9 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_aarch64eb #define arm_cpu_list arm_cpu_list_aarch64eb #define cpu_loop_exit cpu_loop_exit_aarch64eb +#define cpu_loop_exit_restore cpu_loop_exit_restore_aarch64eb #define arm_cpu_post_init arm_cpu_post_init_aarch64eb #define arm_cpu_realizefn arm_cpu_realizefn_aarch64eb #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_aarch64eb diff --git a/qemu/arm.h b/qemu/arm.h index fce617e7..59dc53b4 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_arm #define arm_cpu_list arm_cpu_list_arm #define cpu_loop_exit cpu_loop_exit_arm +#define cpu_loop_exit_restore cpu_loop_exit_restore_arm #define arm_cpu_post_init arm_cpu_post_init_arm #define arm_cpu_realizefn arm_cpu_realizefn_arm #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_arm diff --git a/qemu/armeb.h b/qemu/armeb.h index 2c82c886..661da8ec 100644 --- a/qemu/armeb.h +++ b/qemu/armeb.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_armeb #define arm_cpu_list arm_cpu_list_armeb #define cpu_loop_exit cpu_loop_exit_armeb +#define cpu_loop_exit_restore cpu_loop_exit_restore_armeb #define arm_cpu_post_init arm_cpu_post_init_armeb #define arm_cpu_realizefn arm_cpu_realizefn_armeb #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_armeb diff --git a/qemu/cpu-exec.c b/qemu/cpu-exec.c index ea9c953a..0b9dfe81 100644 --- a/qemu/cpu-exec.c +++ b/qemu/cpu-exec.c @@ -39,6 +39,15 @@ void cpu_loop_exit(CPUState *cpu) siglongjmp(cpu->jmp_env, 1); } +void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc) +{ + if (pc) { + cpu_restore_state(cpu, pc); + } + cpu->current_tb = NULL; + siglongjmp(cpu->jmp_env, 1); +} + /* exit the current TB from a signal handler. The host registers are restored in a state compatible with the CPU emulator */ diff --git a/qemu/header_gen.py b/qemu/header_gen.py index 30d59592..7e3da461 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -133,6 +133,7 @@ symbols = ( 'arm_cpu_initfn', 'arm_cpu_list', 'cpu_loop_exit', + 'cpu_loop_exit_restore', 'arm_cpu_post_init', 'arm_cpu_realizefn', 'arm_cpu_register_gdb_regs_for_features', diff --git a/qemu/include/exec/exec-all.h b/qemu/include/exec/exec-all.h index b8cade34..bc0d84de 100644 --- a/qemu/include/exec/exec-all.h +++ b/qemu/include/exec/exec-all.h @@ -86,6 +86,8 @@ TranslationBlock *tb_gen_code(CPUState *cpu, void cpu_exec_init(CPUState *env, void *opaque); void QEMU_NORETURN cpu_loop_exit(CPUState *cpu); +void QEMU_NORETURN cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc); + #if !defined(CONFIG_USER_ONLY) void cpu_reload_memory_map(CPUState *cpu); void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as); diff --git a/qemu/m68k.h b/qemu/m68k.h index 9d55d079..81a3305c 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_m68k #define arm_cpu_list arm_cpu_list_m68k #define cpu_loop_exit cpu_loop_exit_m68k +#define cpu_loop_exit_restore cpu_loop_exit_restore_m68k #define arm_cpu_post_init arm_cpu_post_init_m68k #define arm_cpu_realizefn arm_cpu_realizefn_m68k #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 94015af9..c0a57724 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_mips #define arm_cpu_list arm_cpu_list_mips #define cpu_loop_exit cpu_loop_exit_mips +#define cpu_loop_exit_restore cpu_loop_exit_restore_mips #define arm_cpu_post_init arm_cpu_post_init_mips #define arm_cpu_realizefn arm_cpu_realizefn_mips #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index f474e195..1546e8f6 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_mips64 #define arm_cpu_list arm_cpu_list_mips64 #define cpu_loop_exit cpu_loop_exit_mips64 +#define cpu_loop_exit_restore cpu_loop_exit_restore_mips64 #define arm_cpu_post_init arm_cpu_post_init_mips64 #define arm_cpu_realizefn arm_cpu_realizefn_mips64 #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index c6d7b256..bc31e96a 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_mips64el #define arm_cpu_list arm_cpu_list_mips64el #define cpu_loop_exit cpu_loop_exit_mips64el +#define cpu_loop_exit_restore cpu_loop_exit_restore_mips64el #define arm_cpu_post_init arm_cpu_post_init_mips64el #define arm_cpu_realizefn arm_cpu_realizefn_mips64el #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index 2feb167c..6149fd4e 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_mipsel #define arm_cpu_list arm_cpu_list_mipsel #define cpu_loop_exit cpu_loop_exit_mipsel +#define cpu_loop_exit_restore cpu_loop_exit_restore_mipsel #define arm_cpu_post_init arm_cpu_post_init_mipsel #define arm_cpu_realizefn arm_cpu_realizefn_mipsel #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index 6d0d2ed5..fb50960c 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_powerpc #define arm_cpu_list arm_cpu_list_powerpc #define cpu_loop_exit cpu_loop_exit_powerpc +#define cpu_loop_exit_restore cpu_loop_exit_restore_powerpc #define arm_cpu_post_init arm_cpu_post_init_powerpc #define arm_cpu_realizefn arm_cpu_realizefn_powerpc #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index 471ee07f..90a24ca9 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_sparc #define arm_cpu_list arm_cpu_list_sparc #define cpu_loop_exit cpu_loop_exit_sparc +#define cpu_loop_exit_restore cpu_loop_exit_restore_sparc #define arm_cpu_post_init arm_cpu_post_init_sparc #define arm_cpu_realizefn arm_cpu_realizefn_sparc #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index 27efeb72..21734306 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_sparc64 #define arm_cpu_list arm_cpu_list_sparc64 #define cpu_loop_exit cpu_loop_exit_sparc64 +#define cpu_loop_exit_restore cpu_loop_exit_restore_sparc64 #define arm_cpu_post_init arm_cpu_post_init_sparc64 #define arm_cpu_realizefn arm_cpu_realizefn_sparc64 #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_sparc64 diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 061e6655..af2ae310 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -127,6 +127,7 @@ #define arm_cpu_initfn arm_cpu_initfn_x86_64 #define arm_cpu_list arm_cpu_list_x86_64 #define cpu_loop_exit cpu_loop_exit_x86_64 +#define cpu_loop_exit_restore cpu_loop_exit_restore_x86_64 #define arm_cpu_post_init arm_cpu_post_init_x86_64 #define arm_cpu_realizefn arm_cpu_realizefn_x86_64 #define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_x86_64