target-i386: introduce new raise_exception functions

This patch introduces new versions of raise_exception functions
that receive TB return address as an argument.

Reviewed-by: Aurelien Jarno <aurelien@aurel32.net>
Reviewed-by: Richard Henderson <rth@twiddle.net>

Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Pavel Dovgalyuk 2015-07-10 12:57:13 +03:00 committed by Richard Henderson
parent 619622424d
commit 9198009529
2 changed files with 21 additions and 13 deletions

View File

@ -1267,8 +1267,12 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
/* excp_helper.c */ /* excp_helper.c */
void QEMU_NORETURN raise_exception(CPUX86State *env, int exception_index); void QEMU_NORETURN raise_exception(CPUX86State *env, int exception_index);
void QEMU_NORETURN raise_exception_ra(CPUX86State *env, int exception_index,
uintptr_t retaddr);
void QEMU_NORETURN raise_exception_err(CPUX86State *env, int exception_index, void QEMU_NORETURN raise_exception_err(CPUX86State *env, int exception_index,
int error_code); int error_code);
void QEMU_NORETURN raise_exception_err_ra(CPUX86State *env, int exception_index,
int error_code, uintptr_t retaddr);
void QEMU_NORETURN raise_interrupt(CPUX86State *nenv, int intno, int is_int, void QEMU_NORETURN raise_interrupt(CPUX86State *nenv, int intno, int is_int,
int error_code, int next_eip_addend); int error_code, int next_eip_addend);

View File

@ -22,14 +22,6 @@
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "exec/helper-proto.h" #include "exec/helper-proto.h"
#if 0
#define raise_exception_err(env, a, b) \
do { \
qemu_log("raise_exception line=%d\n", __LINE__); \
(raise_exception_err)(env, a, b); \
} while (0)
#endif
void helper_raise_interrupt(CPUX86State *env, int intno, int next_eip_addend) void helper_raise_interrupt(CPUX86State *env, int intno, int next_eip_addend)
{ {
raise_interrupt(env, intno, 1, 0, next_eip_addend); raise_interrupt(env, intno, 1, 0, next_eip_addend);
@ -92,7 +84,8 @@ static int check_exception(CPUX86State *env, int intno, int *error_code)
*/ */
static void QEMU_NORETURN raise_interrupt2(CPUX86State *env, int intno, static void QEMU_NORETURN raise_interrupt2(CPUX86State *env, int intno,
int is_int, int error_code, int is_int, int error_code,
int next_eip_addend) int next_eip_addend,
uintptr_t retaddr)
{ {
CPUState *cs = CPU(x86_env_get_cpu(env)); CPUState *cs = CPU(x86_env_get_cpu(env));
@ -108,7 +101,7 @@ static void QEMU_NORETURN raise_interrupt2(CPUX86State *env, int intno,
env->error_code = error_code; env->error_code = error_code;
env->exception_is_int = is_int; env->exception_is_int = is_int;
env->exception_next_eip = env->eip + next_eip_addend; env->exception_next_eip = env->eip + next_eip_addend;
cpu_loop_exit(cs); cpu_loop_exit_restore(cs, retaddr);
} }
/* shortcuts to generate exceptions */ /* shortcuts to generate exceptions */
@ -116,16 +109,27 @@ static void QEMU_NORETURN raise_interrupt2(CPUX86State *env, int intno,
void QEMU_NORETURN raise_interrupt(CPUX86State *env, int intno, int is_int, void QEMU_NORETURN raise_interrupt(CPUX86State *env, int intno, int is_int,
int error_code, int next_eip_addend) int error_code, int next_eip_addend)
{ {
raise_interrupt2(env, intno, is_int, error_code, next_eip_addend); raise_interrupt2(env, intno, is_int, error_code, next_eip_addend, 0);
} }
void raise_exception_err(CPUX86State *env, int exception_index, void raise_exception_err(CPUX86State *env, int exception_index,
int error_code) int error_code)
{ {
raise_interrupt2(env, exception_index, 0, error_code, 0); raise_interrupt2(env, exception_index, 0, error_code, 0, 0);
}
void raise_exception_err_ra(CPUX86State *env, int exception_index,
int error_code, uintptr_t retaddr)
{
raise_interrupt2(env, exception_index, 0, error_code, 0, retaddr);
} }
void raise_exception(CPUX86State *env, int exception_index) void raise_exception(CPUX86State *env, int exception_index)
{ {
raise_interrupt2(env, exception_index, 0, 0, 0); raise_interrupt2(env, exception_index, 0, 0, 0, 0);
}
void raise_exception_ra(CPUX86State *env, int exception_index, uintptr_t retaddr)
{
raise_interrupt2(env, exception_index, 0, 0, 0, retaddr);
} }