exec.h cleanup
Move softmmu_exec.h include directives from target-*/exec.h to target-*/op_helper.c. Move also various other stuff only used in op_helper.c there. Define global env in dyngen-exec.h. For i386, move wrappers for segment and FPU helpers from user-exec.c to op_helper.c. Implement raise_exception_err_env() to handle dynamic CPUState. Move the function declarations to cpu.h since they can be used outside of op_helper.c context. LM32, s390x, UniCore32: remove unused cpu_halted(), regs_to_env() and env_to_regs(). ARM: make raise_exception() static. Convert #include "exec.h" to #include "cpu.h" #include "dyngen-exec.h" and remove now unused target-*/exec.h. Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
104bf02eb5
commit
3e4571724f
@ -64,6 +64,8 @@ typedef void * host_reg_t;
|
||||
#error unsupported CPU
|
||||
#endif
|
||||
|
||||
register CPUState *env asm(AREG0);
|
||||
|
||||
#define xglue(x, y) x ## y
|
||||
#define glue(x, y) xglue(x, y)
|
||||
#define stringify(s) tostring(s)
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include "sysemu.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "qemu-char.h"
|
||||
#include "sysemu.h"
|
||||
#include "qemu-char.h"
|
||||
#include "exec.h"
|
||||
#include "helper_regs.h"
|
||||
#include "hw/spapr.h"
|
||||
|
||||
|
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Alpha emulation cpu run-time definitions for qemu.
|
||||
*
|
||||
* Copyright (c) 2007 Jocelyn Mayer
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if !defined (__ALPHA_EXEC_H__)
|
||||
#define __ALPHA_EXEC_H__
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
#define TARGET_LONG_BITS 64
|
||||
|
||||
register struct CPUAlphaState *env asm(AREG0);
|
||||
|
||||
#define FP_STATUS (env->fp_status)
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#endif /* !defined (__ALPHA_EXEC_H__) */
|
@ -17,12 +17,15 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "host-utils.h"
|
||||
#include "softfloat.h"
|
||||
#include "helper.h"
|
||||
#include "qemu-timer.h"
|
||||
|
||||
#define FP_STATUS (env->fp_status)
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Exceptions processing helpers */
|
||||
|
||||
@ -1311,6 +1314,8 @@ void QEMU_NORETURN cpu_unassigned_access(CPUState *env1,
|
||||
dynamic_excp(EXCP_MCHK, 0);
|
||||
}
|
||||
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
#define ALIGNED_ONLY
|
||||
|
||||
|
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* ARM execution defines
|
||||
*
|
||||
* Copyright (c) 2003 Fabrice Bellard
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUARMState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
||||
|
||||
void raise_exception(int);
|
@ -16,17 +16,20 @@
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helper.h"
|
||||
|
||||
#define SIGNBIT (uint32_t)0x80000000
|
||||
#define SIGNBIT64 ((uint64_t)1 << 63)
|
||||
|
||||
void raise_exception(int tt)
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
static void raise_exception(int tt)
|
||||
{
|
||||
env->exception_index = tt;
|
||||
cpu_loop_exit(env);
|
||||
}
|
||||
#endif
|
||||
|
||||
uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def,
|
||||
uint32_t rn, uint32_t maxindex)
|
||||
@ -52,6 +55,8 @@ uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def,
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
|
||||
#define SHIFT 0
|
||||
|
@ -1,28 +0,0 @@
|
||||
/*
|
||||
* CRIS execution defines
|
||||
*
|
||||
* Copyright (c) 2007 AXIS Communications AB
|
||||
* Written by Edgar E. Iglesias
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUCRISState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
@ -18,7 +18,8 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "mmu.h"
|
||||
#include "helper.h"
|
||||
#include "host-utils.h"
|
||||
@ -35,6 +36,7 @@
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
|
||||
|
@ -1050,6 +1050,9 @@ void cpu_x86_inject_mce(Monitor *mon, CPUState *cenv, int bank,
|
||||
/* op_helper.c */
|
||||
void do_interrupt(CPUState *env);
|
||||
void do_interrupt_x86_hardirq(CPUState *env, int intno, int is_hw);
|
||||
void QEMU_NORETURN raise_exception_env(int exception_index, CPUState *nenv);
|
||||
void QEMU_NORETURN raise_exception_err_env(CPUState *nenv, int exception_index,
|
||||
int error_code);
|
||||
|
||||
void do_smm_enter(CPUState *env1);
|
||||
|
||||
|
@ -1,142 +0,0 @@
|
||||
/*
|
||||
* i386 execution defines
|
||||
*
|
||||
* Copyright (c) 2003 Fabrice Bellard
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
/* XXX: factorize this mess */
|
||||
#ifdef TARGET_X86_64
|
||||
#define TARGET_LONG_BITS 64
|
||||
#else
|
||||
#define TARGET_LONG_BITS 32
|
||||
#endif
|
||||
|
||||
#include "cpu-defs.h"
|
||||
|
||||
register struct CPUX86State *env asm(AREG0);
|
||||
|
||||
#include "qemu-common.h"
|
||||
#include "qemu-log.h"
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
/* op_helper.c */
|
||||
void QEMU_NORETURN raise_exception_err(int exception_index, int error_code);
|
||||
void QEMU_NORETURN raise_exception(int exception_index);
|
||||
void QEMU_NORETURN raise_exception_env(int exception_index, CPUState *nenv);
|
||||
|
||||
/* n must be a constant to be efficient */
|
||||
static inline target_long lshift(target_long x, int n)
|
||||
{
|
||||
if (n >= 0)
|
||||
return x << n;
|
||||
else
|
||||
return x >> (-n);
|
||||
}
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#define RC_MASK 0xc00
|
||||
#define RC_NEAR 0x000
|
||||
#define RC_DOWN 0x400
|
||||
#define RC_UP 0x800
|
||||
#define RC_CHOP 0xc00
|
||||
|
||||
#define MAXTAN 9223372036854775808.0
|
||||
|
||||
/* the following deal with x86 long double-precision numbers */
|
||||
#define MAXEXPD 0x7fff
|
||||
#define EXPBIAS 16383
|
||||
#define EXPD(fp) (fp.l.upper & 0x7fff)
|
||||
#define SIGND(fp) ((fp.l.upper) & 0x8000)
|
||||
#define MANTD(fp) (fp.l.lower)
|
||||
#define BIASEXPONENT(fp) fp.l.upper = (fp.l.upper & ~(0x7fff)) | EXPBIAS
|
||||
|
||||
static inline void fpush(void)
|
||||
{
|
||||
env->fpstt = (env->fpstt - 1) & 7;
|
||||
env->fptags[env->fpstt] = 0; /* validate stack entry */
|
||||
}
|
||||
|
||||
static inline void fpop(void)
|
||||
{
|
||||
env->fptags[env->fpstt] = 1; /* invvalidate stack entry */
|
||||
env->fpstt = (env->fpstt + 1) & 7;
|
||||
}
|
||||
|
||||
static inline floatx80 helper_fldt(target_ulong ptr)
|
||||
{
|
||||
CPU_LDoubleU temp;
|
||||
|
||||
temp.l.lower = ldq(ptr);
|
||||
temp.l.upper = lduw(ptr + 8);
|
||||
return temp.d;
|
||||
}
|
||||
|
||||
static inline void helper_fstt(floatx80 f, target_ulong ptr)
|
||||
{
|
||||
CPU_LDoubleU temp;
|
||||
|
||||
temp.d = f;
|
||||
stq(ptr, temp.l.lower);
|
||||
stw(ptr + 8, temp.l.upper);
|
||||
}
|
||||
|
||||
#define FPUS_IE (1 << 0)
|
||||
#define FPUS_DE (1 << 1)
|
||||
#define FPUS_ZE (1 << 2)
|
||||
#define FPUS_OE (1 << 3)
|
||||
#define FPUS_UE (1 << 4)
|
||||
#define FPUS_PE (1 << 5)
|
||||
#define FPUS_SF (1 << 6)
|
||||
#define FPUS_SE (1 << 7)
|
||||
#define FPUS_B (1 << 15)
|
||||
|
||||
#define FPUC_EM 0x3f
|
||||
|
||||
static inline uint32_t compute_eflags(void)
|
||||
{
|
||||
return env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
|
||||
}
|
||||
|
||||
/* NOTE: CC_OP must be modified manually to CC_OP_EFLAGS */
|
||||
static inline void load_eflags(int eflags, int update_mask)
|
||||
{
|
||||
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
|
||||
DF = 1 - (2 * ((eflags >> 10) & 1));
|
||||
env->eflags = (env->eflags & ~update_mask) |
|
||||
(eflags & update_mask) | 0x2;
|
||||
}
|
||||
|
||||
/* load efer and update the corresponding hflags. XXX: do consistency
|
||||
checks with cpuid bits ? */
|
||||
static inline void cpu_load_efer(CPUState *env, uint64_t val)
|
||||
{
|
||||
env->efer = val;
|
||||
env->hflags &= ~(HF_LMA_MASK | HF_SVME_MASK);
|
||||
if (env->efer & MSR_EFER_LMA)
|
||||
env->hflags |= HF_LMA_MASK;
|
||||
if (env->efer & MSR_EFER_SVME)
|
||||
env->hflags |= HF_SVME_MASK;
|
||||
}
|
@ -1027,8 +1027,6 @@ int check_hw_breakpoints(CPUState *env, int force_dr6_update)
|
||||
|
||||
static CPUDebugExcpHandler *prev_debug_excp_handler;
|
||||
|
||||
void raise_exception_env(int exception_index, CPUState *env);
|
||||
|
||||
static void breakpoint_handler(CPUState *env)
|
||||
{
|
||||
CPUBreakpoint *bp;
|
||||
|
@ -18,13 +18,21 @@
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "host-utils.h"
|
||||
#include "ioport.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu-log.h"
|
||||
#include "cpu-defs.h"
|
||||
#include "helper.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
//#define DEBUG_PCALL
|
||||
|
||||
|
||||
#ifdef DEBUG_PCALL
|
||||
# define LOG_PCALL(...) qemu_log_mask(CPU_LOG_PCALL, ## __VA_ARGS__)
|
||||
# define LOG_PCALL_STATE(env) \
|
||||
@ -34,6 +42,101 @@
|
||||
# define LOG_PCALL_STATE(env) do { } while (0)
|
||||
#endif
|
||||
|
||||
/* n must be a constant to be efficient */
|
||||
static inline target_long lshift(target_long x, int n)
|
||||
{
|
||||
if (n >= 0) {
|
||||
return x << n;
|
||||
} else {
|
||||
return x >> (-n);
|
||||
}
|
||||
}
|
||||
|
||||
#define RC_MASK 0xc00
|
||||
#define RC_NEAR 0x000
|
||||
#define RC_DOWN 0x400
|
||||
#define RC_UP 0x800
|
||||
#define RC_CHOP 0xc00
|
||||
|
||||
#define MAXTAN 9223372036854775808.0
|
||||
|
||||
/* the following deal with x86 long double-precision numbers */
|
||||
#define MAXEXPD 0x7fff
|
||||
#define EXPBIAS 16383
|
||||
#define EXPD(fp) (fp.l.upper & 0x7fff)
|
||||
#define SIGND(fp) ((fp.l.upper) & 0x8000)
|
||||
#define MANTD(fp) (fp.l.lower)
|
||||
#define BIASEXPONENT(fp) fp.l.upper = (fp.l.upper & ~(0x7fff)) | EXPBIAS
|
||||
|
||||
static inline void fpush(void)
|
||||
{
|
||||
env->fpstt = (env->fpstt - 1) & 7;
|
||||
env->fptags[env->fpstt] = 0; /* validate stack entry */
|
||||
}
|
||||
|
||||
static inline void fpop(void)
|
||||
{
|
||||
env->fptags[env->fpstt] = 1; /* invvalidate stack entry */
|
||||
env->fpstt = (env->fpstt + 1) & 7;
|
||||
}
|
||||
|
||||
static inline floatx80 helper_fldt(target_ulong ptr)
|
||||
{
|
||||
CPU_LDoubleU temp;
|
||||
|
||||
temp.l.lower = ldq(ptr);
|
||||
temp.l.upper = lduw(ptr + 8);
|
||||
return temp.d;
|
||||
}
|
||||
|
||||
static inline void helper_fstt(floatx80 f, target_ulong ptr)
|
||||
{
|
||||
CPU_LDoubleU temp;
|
||||
|
||||
temp.d = f;
|
||||
stq(ptr, temp.l.lower);
|
||||
stw(ptr + 8, temp.l.upper);
|
||||
}
|
||||
|
||||
#define FPUS_IE (1 << 0)
|
||||
#define FPUS_DE (1 << 1)
|
||||
#define FPUS_ZE (1 << 2)
|
||||
#define FPUS_OE (1 << 3)
|
||||
#define FPUS_UE (1 << 4)
|
||||
#define FPUS_PE (1 << 5)
|
||||
#define FPUS_SF (1 << 6)
|
||||
#define FPUS_SE (1 << 7)
|
||||
#define FPUS_B (1 << 15)
|
||||
|
||||
#define FPUC_EM 0x3f
|
||||
|
||||
static inline uint32_t compute_eflags(void)
|
||||
{
|
||||
return env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
|
||||
}
|
||||
|
||||
/* NOTE: CC_OP must be modified manually to CC_OP_EFLAGS */
|
||||
static inline void load_eflags(int eflags, int update_mask)
|
||||
{
|
||||
CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
|
||||
DF = 1 - (2 * ((eflags >> 10) & 1));
|
||||
env->eflags = (env->eflags & ~update_mask) |
|
||||
(eflags & update_mask) | 0x2;
|
||||
}
|
||||
|
||||
/* load efer and update the corresponding hflags. XXX: do consistency
|
||||
checks with cpuid bits ? */
|
||||
static inline void cpu_load_efer(CPUState *env, uint64_t val)
|
||||
{
|
||||
env->efer = val;
|
||||
env->hflags &= ~(HF_LMA_MASK | HF_SVME_MASK);
|
||||
if (env->efer & MSR_EFER_LMA) {
|
||||
env->hflags |= HF_LMA_MASK;
|
||||
}
|
||||
if (env->efer & MSR_EFER_SVME) {
|
||||
env->hflags |= HF_SVME_MASK;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
#define raise_exception_err(a, b)\
|
||||
@ -43,6 +146,9 @@ do {\
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static void QEMU_NORETURN raise_exception_err(int exception_index,
|
||||
int error_code);
|
||||
|
||||
static const uint8_t parity_table[256] = {
|
||||
CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
|
||||
0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
|
||||
@ -1381,12 +1487,20 @@ static void QEMU_NORETURN raise_interrupt(int intno, int is_int, int error_code,
|
||||
|
||||
/* shortcuts to generate exceptions */
|
||||
|
||||
void raise_exception_err(int exception_index, int error_code)
|
||||
static void QEMU_NORETURN raise_exception_err(int exception_index,
|
||||
int error_code)
|
||||
{
|
||||
raise_interrupt(exception_index, 0, error_code, 0);
|
||||
}
|
||||
|
||||
void raise_exception(int exception_index)
|
||||
void raise_exception_err_env(CPUState *nenv, int exception_index,
|
||||
int error_code)
|
||||
{
|
||||
env = nenv;
|
||||
raise_interrupt(exception_index, 0, error_code, 0);
|
||||
}
|
||||
|
||||
static void QEMU_NORETURN raise_exception(int exception_index)
|
||||
{
|
||||
raise_interrupt(exception_index, 0, 0, 0);
|
||||
}
|
||||
@ -4426,6 +4540,49 @@ void helper_frstor(target_ulong ptr, int data32)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
|
||||
selector &= 0xffff;
|
||||
cpu_x86_load_seg_cache(env, seg_reg, selector,
|
||||
(selector << 4), 0xffff, 0);
|
||||
} else {
|
||||
helper_load_seg(seg_reg, selector);
|
||||
}
|
||||
env = saved_env;
|
||||
}
|
||||
|
||||
void cpu_x86_fsave(CPUX86State *s, target_ulong ptr, int data32)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
|
||||
helper_fsave(ptr, data32);
|
||||
|
||||
env = saved_env;
|
||||
}
|
||||
|
||||
void cpu_x86_frstor(CPUX86State *s, target_ulong ptr, int data32)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
|
||||
helper_frstor(ptr, data32);
|
||||
|
||||
env = saved_env;
|
||||
}
|
||||
#endif
|
||||
|
||||
void helper_fxsave(target_ulong ptr, int data64)
|
||||
{
|
||||
int fpus, fptag, i, nb_xmm_regs;
|
||||
|
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* LatticeMico32 execution defines.
|
||||
*
|
||||
* Copyright (c) 2010 Michael Walle <michael@walle.cc>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPULM32State *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
static inline int cpu_halted(CPUState *env)
|
||||
{
|
||||
if (!env->halted) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* IRQ execeptions wakes us up. */
|
||||
if (cpu_has_work(env)) {
|
||||
env->halted = 0;
|
||||
return 0;
|
||||
}
|
||||
return EXCP_HALTED;
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
#include <assert.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helper.h"
|
||||
#include "host-utils.h"
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
/*
|
||||
* m68k execution defines
|
||||
*
|
||||
* Copyright (c) 2005-2006 CodeSourcery
|
||||
* Written by Paul Brook
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUM68KState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
@ -16,7 +16,8 @@
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helpers.h"
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
@ -34,6 +35,8 @@ void do_interrupt_m68k_hardirq(CPUState *env1)
|
||||
|
||||
extern int semihosting_enabled;
|
||||
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
|
||||
#define SHIFT 0
|
||||
|
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Microblaze execution defines
|
||||
*
|
||||
* Copyright (c) 2009 Edgar E. Iglesias
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUMBState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
@ -18,13 +18,16 @@
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helper.h"
|
||||
#include "host-utils.h"
|
||||
|
||||
#define D(x)
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
#define SHIFT 0
|
||||
#include "softmmu_template.h"
|
||||
|
@ -1,6 +1,8 @@
|
||||
#if !defined (__MIPS_CPU_H__)
|
||||
#define __MIPS_CPU_H__
|
||||
|
||||
//#define DEBUG_OP
|
||||
|
||||
#define TARGET_HAS_ICE 1
|
||||
|
||||
#define ELF_MACHINE EM_MIPS
|
||||
|
@ -1,60 +0,0 @@
|
||||
#if !defined(__QEMU_MIPS_EXEC_H__)
|
||||
#define __QEMU_MIPS_EXEC_H__
|
||||
|
||||
//#define DEBUG_OP
|
||||
|
||||
#include "config.h"
|
||||
#include "mips-defs.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "cpu-defs.h"
|
||||
|
||||
register struct CPUMIPSState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
static inline void compute_hflags(CPUState *env)
|
||||
{
|
||||
env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 |
|
||||
MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU |
|
||||
MIPS_HFLAG_UX);
|
||||
if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
|
||||
!(env->CP0_Status & (1 << CP0St_ERL)) &&
|
||||
!(env->hflags & MIPS_HFLAG_DM)) {
|
||||
env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU;
|
||||
}
|
||||
#if defined(TARGET_MIPS64)
|
||||
if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) ||
|
||||
(env->CP0_Status & (1 << CP0St_PX)) ||
|
||||
(env->CP0_Status & (1 << CP0St_UX)))
|
||||
env->hflags |= MIPS_HFLAG_64;
|
||||
if (env->CP0_Status & (1 << CP0St_UX))
|
||||
env->hflags |= MIPS_HFLAG_UX;
|
||||
#endif
|
||||
if ((env->CP0_Status & (1 << CP0St_CU0)) ||
|
||||
!(env->hflags & MIPS_HFLAG_KSU))
|
||||
env->hflags |= MIPS_HFLAG_CP0;
|
||||
if (env->CP0_Status & (1 << CP0St_CU1))
|
||||
env->hflags |= MIPS_HFLAG_FPU;
|
||||
if (env->CP0_Status & (1 << CP0St_FR))
|
||||
env->hflags |= MIPS_HFLAG_F64;
|
||||
if (env->insn_flags & ISA_MIPS32R2) {
|
||||
if (env->active_fpu.fcr0 & (1 << FCR0_F64))
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
} else if (env->insn_flags & ISA_MIPS32) {
|
||||
if (env->hflags & MIPS_HFLAG_64)
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
} else if (env->insn_flags & ISA_MIPS4) {
|
||||
/* All supported MIPS IV CPUs use the XX (CU3) to enable
|
||||
and disable the MIPS IV extensions to the MIPS III ISA.
|
||||
Some other MIPS IV CPUs ignore the bit, so the check here
|
||||
would be too restrictive for them. */
|
||||
if (env->CP0_Status & (1 << CP0St_CU3))
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !defined(__QEMU_MIPS_EXEC_H__) */
|
@ -17,16 +17,70 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
#include "host-utils.h"
|
||||
|
||||
#include "helper.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static inline void cpu_mips_tlb_flush (CPUState *env, int flush_global);
|
||||
#endif
|
||||
|
||||
static inline void compute_hflags(CPUState *env)
|
||||
{
|
||||
env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 |
|
||||
MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU |
|
||||
MIPS_HFLAG_UX);
|
||||
if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
|
||||
!(env->CP0_Status & (1 << CP0St_ERL)) &&
|
||||
!(env->hflags & MIPS_HFLAG_DM)) {
|
||||
env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU;
|
||||
}
|
||||
#if defined(TARGET_MIPS64)
|
||||
if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) ||
|
||||
(env->CP0_Status & (1 << CP0St_PX)) ||
|
||||
(env->CP0_Status & (1 << CP0St_UX))) {
|
||||
env->hflags |= MIPS_HFLAG_64;
|
||||
}
|
||||
if (env->CP0_Status & (1 << CP0St_UX)) {
|
||||
env->hflags |= MIPS_HFLAG_UX;
|
||||
}
|
||||
#endif
|
||||
if ((env->CP0_Status & (1 << CP0St_CU0)) ||
|
||||
!(env->hflags & MIPS_HFLAG_KSU)) {
|
||||
env->hflags |= MIPS_HFLAG_CP0;
|
||||
}
|
||||
if (env->CP0_Status & (1 << CP0St_CU1)) {
|
||||
env->hflags |= MIPS_HFLAG_FPU;
|
||||
}
|
||||
if (env->CP0_Status & (1 << CP0St_FR)) {
|
||||
env->hflags |= MIPS_HFLAG_F64;
|
||||
}
|
||||
if (env->insn_flags & ISA_MIPS32R2) {
|
||||
if (env->active_fpu.fcr0 & (1 << FCR0_F64)) {
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
}
|
||||
} else if (env->insn_flags & ISA_MIPS32) {
|
||||
if (env->hflags & MIPS_HFLAG_64) {
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
}
|
||||
} else if (env->insn_flags & ISA_MIPS4) {
|
||||
/* All supported MIPS IV CPUs use the XX (CU3) to enable
|
||||
and disable the MIPS IV extensions to the MIPS III ISA.
|
||||
Some other MIPS IV CPUs ignore the bit, so the check here
|
||||
would be too restrictive for them. */
|
||||
if (env->CP0_Status & (1 << CP0St_CU3)) {
|
||||
env->hflags |= MIPS_HFLAG_COP1X;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Exceptions processing helpers */
|
||||
|
||||
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* PowerPC emulation definitions for qemu.
|
||||
*
|
||||
* Copyright (c) 2003-2007 Jocelyn Mayer
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#if !defined (__PPC_H__)
|
||||
#define __PPC_H__
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
register struct CPUPPCState *env asm(AREG0);
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#endif /* !defined (__PPC_H__) */
|
@ -17,12 +17,17 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "host-utils.h"
|
||||
#include "helper.h"
|
||||
|
||||
#include "helper_regs.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
//#define DEBUG_OP
|
||||
//#define DEBUG_EXCEPTIONS
|
||||
//#define DEBUG_SOFTWARE_TLB
|
||||
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* S/390 execution defines
|
||||
*
|
||||
* Copyright (c) 2009 Ulrich Hecht
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUS390XState *env asm(AREG0);
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
static inline void regs_to_env(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void env_to_regs(void)
|
||||
{
|
||||
}
|
@ -18,7 +18,8 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "host-utils.h"
|
||||
#include "helpers.h"
|
||||
#include <string.h>
|
||||
@ -31,6 +32,7 @@
|
||||
/*****************************************************************************/
|
||||
/* Softmmu support */
|
||||
#if !defined (CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
|
||||
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* SH4 emulation
|
||||
*
|
||||
* Copyright (c) 2005 Samuel Tardieu
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _EXEC_SH4_H
|
||||
#define _EXEC_SH4_H
|
||||
|
||||
#include "config.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUSH4State *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
||||
|
||||
#endif /* _EXEC_SH4_H */
|
@ -18,7 +18,8 @@
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helper.h"
|
||||
|
||||
static void cpu_restore_state_from_retaddr(void *retaddr)
|
||||
@ -38,6 +39,7 @@ static void cpu_restore_state_from_retaddr(void *retaddr)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include "softmmu_exec.h"
|
||||
|
||||
#define MMUSUFFIX _mmu
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
#ifndef EXEC_SPARC_H
|
||||
#define EXEC_SPARC_H 1
|
||||
#include "config.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUSPARCState *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
#include "exec-all.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||
|
||||
#endif
|
@ -1,8 +1,13 @@
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "host-utils.h"
|
||||
#include "helper.h"
|
||||
#include "sysemu.h"
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
#include "softmmu_exec.h"
|
||||
#endif
|
||||
|
||||
//#define DEBUG_MMU
|
||||
//#define DEBUG_MXCC
|
||||
//#define DEBUG_UNALIGNED
|
||||
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* UniCore32 execution defines
|
||||
*
|
||||
* Copyright (C) 2010-2011 GUAN Xue-tao
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __UC32_EXEC_H__
|
||||
#define __UC32_EXEC_H__
|
||||
|
||||
#include "config.h"
|
||||
#include "dyngen-exec.h"
|
||||
|
||||
register struct CPUState_UniCore32 *env asm(AREG0);
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
static inline void env_to_regs(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void regs_to_env(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int cpu_halted(CPUState *env)
|
||||
{
|
||||
if (!env->halted) {
|
||||
return 0;
|
||||
}
|
||||
/* An interrupt wakes the CPU even if the I and R ASR bits are
|
||||
set. We use EXITTB to silently wake CPU without causing an
|
||||
actual interrupt. */
|
||||
if (cpu_has_work(env)) {
|
||||
env->halted = 0;
|
||||
return 0;
|
||||
}
|
||||
return EXCP_HALTED;
|
||||
}
|
||||
|
||||
#endif /* __UC32_EXEC_H__ */
|
@ -7,7 +7,8 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "helper.h"
|
||||
|
||||
#define SIGNBIT (uint32_t)0x80000000
|
||||
|
49
user-exec.c
49
user-exec.c
@ -17,7 +17,8 @@
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "exec.h"
|
||||
#include "cpu.h"
|
||||
#include "dyngen-exec.h"
|
||||
#include "disas.h"
|
||||
#include "tcg.h"
|
||||
|
||||
@ -40,7 +41,7 @@
|
||||
static void exception_action(CPUState *env1)
|
||||
{
|
||||
#if defined(TARGET_I386)
|
||||
raise_exception_err(env1->exception_index, env1->error_code);
|
||||
raise_exception_err_env(env1, env1->exception_index, env1->error_code);
|
||||
#else
|
||||
cpu_loop_exit(env1);
|
||||
#endif
|
||||
@ -628,47 +629,3 @@ int cpu_signal_handler(int host_signum, void *pinfo,
|
||||
#error host CPU specific signal handler needed
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(TARGET_I386)
|
||||
|
||||
void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
|
||||
selector &= 0xffff;
|
||||
cpu_x86_load_seg_cache(env, seg_reg, selector,
|
||||
(selector << 4), 0xffff, 0);
|
||||
} else {
|
||||
helper_load_seg(seg_reg, selector);
|
||||
}
|
||||
env = saved_env;
|
||||
}
|
||||
|
||||
void cpu_x86_fsave(CPUX86State *s, target_ulong ptr, int data32)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
|
||||
helper_fsave(ptr, data32);
|
||||
|
||||
env = saved_env;
|
||||
}
|
||||
|
||||
void cpu_x86_frstor(CPUX86State *s, target_ulong ptr, int data32)
|
||||
{
|
||||
CPUX86State *saved_env;
|
||||
|
||||
saved_env = env;
|
||||
env = s;
|
||||
|
||||
helper_frstor(ptr, data32);
|
||||
|
||||
env = saved_env;
|
||||
}
|
||||
|
||||
#endif /* TARGET_I386 */
|
||||
|
Loading…
Reference in New Issue
Block a user