mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-02 10:51:06 +00:00
target-i386: introduce new raise_exception functions
This patch introduces new versions of raise_exception functions that receive TB return address as an argument. Backports commit 9198009529d06b6489b68a7505942cca3a50893f from qemu
This commit is contained in:
parent
4c726ca49b
commit
56615596e4
|
@ -1271,8 +1271,12 @@ void do_cpu_sipi(X86CPU *cpu);
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
||||||
|
|
|
@ -24,14 +24,6 @@
|
||||||
|
|
||||||
#include "uc_priv.h"
|
#include "uc_priv.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);
|
||||||
|
@ -94,7 +86,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));
|
||||||
|
|
||||||
|
@ -110,7 +103,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 */
|
||||||
|
@ -118,16 +111,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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue