mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
Move interrupt_request and user_mode_only to common cpu state.
Save and restore env->interrupt_request and env->halted. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4817 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
a5cdf95220
commit
9656f324d2
@ -153,7 +153,8 @@ typedef struct icount_decr_u16 {
|
|||||||
accessed */ \
|
accessed */ \
|
||||||
target_ulong mem_io_vaddr; /* target virtual addr at which the \
|
target_ulong mem_io_vaddr; /* target virtual addr at which the \
|
||||||
memory was accessed */ \
|
memory was accessed */ \
|
||||||
int halted; /* TRUE if the CPU is in suspend state */ \
|
uint32_t halted; /* Nonzero if the CPU is in suspend state */ \
|
||||||
|
uint32_t interrupt_request; \
|
||||||
/* The meaning of the MMU modes is defined in the target code. */ \
|
/* The meaning of the MMU modes is defined in the target code. */ \
|
||||||
CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
||||||
target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
|
||||||
@ -188,6 +189,8 @@ typedef struct icount_decr_u16 {
|
|||||||
jmp_buf jmp_env; \
|
jmp_buf jmp_env; \
|
||||||
int exception_index; \
|
int exception_index; \
|
||||||
\
|
\
|
||||||
|
int user_mode_only; \
|
||||||
|
\
|
||||||
void *next_cpu; /* next CPU sharing TB cache */ \
|
void *next_cpu; /* next CPU sharing TB cache */ \
|
||||||
int cpu_index; /* CPU index (informative) */ \
|
int cpu_index; /* CPU index (informative) */ \
|
||||||
int running; /* Nonzero if cpu is currently running(usermode). */ \
|
int running; /* Nonzero if cpu is currently running(usermode). */ \
|
||||||
|
29
exec.c
29
exec.c
@ -443,6 +443,33 @@ void cpu_exec_init_all(unsigned long tb_size)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
|
#define CPU_COMMON_SAVE_VERSION 1
|
||||||
|
|
||||||
|
static void cpu_common_save(QEMUFile *f, void *opaque)
|
||||||
|
{
|
||||||
|
CPUState *env = opaque;
|
||||||
|
|
||||||
|
qemu_put_be32s(f, &env->halted);
|
||||||
|
qemu_put_be32s(f, &env->interrupt_request);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cpu_common_load(QEMUFile *f, void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
CPUState *env = opaque;
|
||||||
|
|
||||||
|
if (version_id != CPU_COMMON_SAVE_VERSION)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
qemu_get_be32s(f, &env->halted);
|
||||||
|
qemu_put_be32s(f, &env->interrupt_request);
|
||||||
|
tlb_flush(env, 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void cpu_exec_init(CPUState *env)
|
void cpu_exec_init(CPUState *env)
|
||||||
{
|
{
|
||||||
CPUState **penv;
|
CPUState **penv;
|
||||||
@ -459,6 +486,8 @@ void cpu_exec_init(CPUState *env)
|
|||||||
env->nb_watchpoints = 0;
|
env->nb_watchpoints = 0;
|
||||||
*penv = env;
|
*penv = env;
|
||||||
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
|
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
|
||||||
|
register_savevm("cpu_common", cpu_index, CPU_COMMON_SAVE_VERSION,
|
||||||
|
cpu_common_save, cpu_common_load, env);
|
||||||
register_savevm("cpu", cpu_index, CPU_SAVE_VERSION,
|
register_savevm("cpu", cpu_index, CPU_SAVE_VERSION,
|
||||||
cpu_save, cpu_load, env);
|
cpu_save, cpu_load, env);
|
||||||
#endif
|
#endif
|
||||||
|
@ -282,11 +282,9 @@ struct CPUAlphaState {
|
|||||||
/* Those resources are used only in Qemu core */
|
/* Those resources are used only in Qemu core */
|
||||||
CPU_COMMON
|
CPU_COMMON
|
||||||
|
|
||||||
int user_mode_only; /* user mode only simulation */
|
|
||||||
uint32_t hflags;
|
uint32_t hflags;
|
||||||
|
|
||||||
int error_code;
|
int error_code;
|
||||||
int interrupt_request;
|
|
||||||
|
|
||||||
uint32_t features;
|
uint32_t features;
|
||||||
uint32_t amask;
|
uint32_t amask;
|
||||||
|
@ -156,10 +156,6 @@ typedef struct CPUARMState {
|
|||||||
int (*get_irq_vector)(struct CPUARMState *);
|
int (*get_irq_vector)(struct CPUARMState *);
|
||||||
void *irq_opaque;
|
void *irq_opaque;
|
||||||
|
|
||||||
/* exception/interrupt handling */
|
|
||||||
int interrupt_request;
|
|
||||||
int user_mode_only;
|
|
||||||
|
|
||||||
/* VFP coprocessor state. */
|
/* VFP coprocessor state. */
|
||||||
struct {
|
struct {
|
||||||
float64 regs[32];
|
float64 regs[32];
|
||||||
|
@ -125,7 +125,6 @@ typedef struct CPUCRISState {
|
|||||||
/* X flag at the time of cc snapshot. */
|
/* X flag at the time of cc snapshot. */
|
||||||
int cc_x;
|
int cc_x;
|
||||||
|
|
||||||
int interrupt_request;
|
|
||||||
int interrupt_vector;
|
int interrupt_vector;
|
||||||
int fault_vector;
|
int fault_vector;
|
||||||
int trap_vector;
|
int trap_vector;
|
||||||
@ -156,8 +155,6 @@ typedef struct CPUCRISState {
|
|||||||
uint32_t lo;
|
uint32_t lo;
|
||||||
} tlbsets[2][4][16];
|
} tlbsets[2][4][16];
|
||||||
|
|
||||||
int user_mode_only;
|
|
||||||
|
|
||||||
CPU_COMMON
|
CPU_COMMON
|
||||||
} CPUCRISState;
|
} CPUCRISState;
|
||||||
|
|
||||||
|
@ -567,8 +567,6 @@ typedef struct CPUX86State {
|
|||||||
target_ulong exception_next_eip;
|
target_ulong exception_next_eip;
|
||||||
target_ulong dr[8]; /* debug registers */
|
target_ulong dr[8]; /* debug registers */
|
||||||
uint32_t smbase;
|
uint32_t smbase;
|
||||||
int interrupt_request;
|
|
||||||
int user_mode_only; /* user mode only simulation */
|
|
||||||
int old_exception; /* exception in flight */
|
int old_exception; /* exception in flight */
|
||||||
|
|
||||||
CPU_COMMON
|
CPU_COMMON
|
||||||
@ -726,7 +724,7 @@ static inline int cpu_get_time_fast(void)
|
|||||||
#define cpu_signal_handler cpu_x86_signal_handler
|
#define cpu_signal_handler cpu_x86_signal_handler
|
||||||
#define cpu_list x86_cpu_list
|
#define cpu_list x86_cpu_list
|
||||||
|
|
||||||
#define CPU_SAVE_VERSION 5
|
#define CPU_SAVE_VERSION 6
|
||||||
|
|
||||||
/* MMU modes definitions */
|
/* MMU modes definitions */
|
||||||
#define MMU_MODE0_SUFFIX _kernel
|
#define MMU_MODE0_SUFFIX _kernel
|
||||||
|
@ -123,7 +123,6 @@ void cpu_save(QEMUFile *f, void *opaque)
|
|||||||
|
|
||||||
qemu_put_be64s(f, &env->pat);
|
qemu_put_be64s(f, &env->pat);
|
||||||
qemu_put_be32s(f, &env->hflags2);
|
qemu_put_be32s(f, &env->hflags2);
|
||||||
qemu_put_be32s(f, (uint32_t *)&env->halted);
|
|
||||||
|
|
||||||
qemu_put_be64s(f, &env->vm_hsave);
|
qemu_put_be64s(f, &env->vm_hsave);
|
||||||
qemu_put_be64s(f, &env->vm_vmcb);
|
qemu_put_be64s(f, &env->vm_vmcb);
|
||||||
@ -169,7 +168,8 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
|
|||||||
uint16_t fpus, fpuc, fptag, fpregs_format;
|
uint16_t fpus, fpuc, fptag, fpregs_format;
|
||||||
int32_t a20_mask;
|
int32_t a20_mask;
|
||||||
|
|
||||||
if (version_id != 3 && version_id != 4 && version_id != 5)
|
if (version_id != 3 && version_id != 4 && version_id != 5
|
||||||
|
&& version_id != 6)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
for(i = 0; i < CPU_NB_REGS; i++)
|
for(i = 0; i < CPU_NB_REGS; i++)
|
||||||
qemu_get_betls(f, &env->regs[i]);
|
qemu_get_betls(f, &env->regs[i]);
|
||||||
@ -279,7 +279,8 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
|
|||||||
if (version_id >= 5) {
|
if (version_id >= 5) {
|
||||||
qemu_get_be64s(f, &env->pat);
|
qemu_get_be64s(f, &env->pat);
|
||||||
qemu_get_be32s(f, &env->hflags2);
|
qemu_get_be32s(f, &env->hflags2);
|
||||||
qemu_get_be32s(f, (uint32_t *)&env->halted);
|
if (version_id < 6)
|
||||||
|
qemu_get_be32s(f, &env->halted);
|
||||||
|
|
||||||
qemu_get_be64s(f, &env->vm_hsave);
|
qemu_get_be64s(f, &env->vm_hsave);
|
||||||
qemu_get_be64s(f, &env->vm_vmcb);
|
qemu_get_be64s(f, &env->vm_vmcb);
|
||||||
|
@ -103,10 +103,6 @@ typedef struct CPUM68KState {
|
|||||||
/* ??? remove this. */
|
/* ??? remove this. */
|
||||||
uint32_t t1;
|
uint32_t t1;
|
||||||
|
|
||||||
/* exception/interrupt handling */
|
|
||||||
int interrupt_request;
|
|
||||||
int user_mode_only;
|
|
||||||
|
|
||||||
int pending_vector;
|
int pending_vector;
|
||||||
int pending_level;
|
int pending_level;
|
||||||
|
|
||||||
|
@ -411,9 +411,7 @@ struct CPUMIPSState {
|
|||||||
/* We waste some space so we can handle shadow registers like TCs. */
|
/* We waste some space so we can handle shadow registers like TCs. */
|
||||||
TCState tcs[MIPS_SHADOW_SET_MAX];
|
TCState tcs[MIPS_SHADOW_SET_MAX];
|
||||||
/* Qemu */
|
/* Qemu */
|
||||||
int interrupt_request;
|
|
||||||
int error_code;
|
int error_code;
|
||||||
int user_mode_only; /* user mode only simulation */
|
|
||||||
uint32_t hflags; /* CPU State */
|
uint32_t hflags; /* CPU State */
|
||||||
/* TMASK defines different execution modes */
|
/* TMASK defines different execution modes */
|
||||||
#define MIPS_HFLAG_TMASK 0x01FF
|
#define MIPS_HFLAG_TMASK 0x01FF
|
||||||
|
@ -647,7 +647,6 @@ struct CPUPPCState {
|
|||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
int error_code;
|
int error_code;
|
||||||
int interrupt_request;
|
|
||||||
uint32_t pending_interrupts;
|
uint32_t pending_interrupts;
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
/* This is the IRQ controller, which is implementation dependant
|
/* This is the IRQ controller, which is implementation dependant
|
||||||
@ -671,7 +670,6 @@ struct CPUPPCState {
|
|||||||
opc_handler_t *opcodes[0x40];
|
opc_handler_t *opcodes[0x40];
|
||||||
|
|
||||||
/* Those resources are used only in Qemu core */
|
/* Those resources are used only in Qemu core */
|
||||||
int user_mode_only; /* user mode only simulation */
|
|
||||||
target_ulong hflags; /* hflags is a MSR & HFLAGS_MASK */
|
target_ulong hflags; /* hflags is a MSR & HFLAGS_MASK */
|
||||||
target_ulong hflags_nmsr; /* specific hflags, not comming from MSR */
|
target_ulong hflags_nmsr; /* specific hflags, not comming from MSR */
|
||||||
int mmu_idx; /* precomputed MMU index to speed up mem accesses */
|
int mmu_idx; /* precomputed MMU index to speed up mem accesses */
|
||||||
|
@ -114,8 +114,6 @@ typedef struct CPUSH4State {
|
|||||||
uint32_t expevt; /* exception event register */
|
uint32_t expevt; /* exception event register */
|
||||||
uint32_t intevt; /* interrupt event register */
|
uint32_t intevt; /* interrupt event register */
|
||||||
|
|
||||||
int user_mode_only;
|
|
||||||
int interrupt_request;
|
|
||||||
CPU_COMMON tlb_t utlb[UTLB_SIZE]; /* unified translation table */
|
CPU_COMMON tlb_t utlb[UTLB_SIZE]; /* unified translation table */
|
||||||
tlb_t itlb[ITLB_SIZE]; /* instruction translation table */
|
tlb_t itlb[ITLB_SIZE]; /* instruction translation table */
|
||||||
void *intc_handle;
|
void *intc_handle;
|
||||||
|
@ -215,9 +215,7 @@ typedef struct CPUSPARCState {
|
|||||||
uint32_t pil_in; /* incoming interrupt level bitmap */
|
uint32_t pil_in; /* incoming interrupt level bitmap */
|
||||||
int psref; /* enable fpu */
|
int psref; /* enable fpu */
|
||||||
target_ulong version;
|
target_ulong version;
|
||||||
int user_mode_only;
|
|
||||||
int interrupt_index;
|
int interrupt_index;
|
||||||
int interrupt_request;
|
|
||||||
uint32_t mmu_bm;
|
uint32_t mmu_bm;
|
||||||
uint32_t mmu_ctpr_mask;
|
uint32_t mmu_ctpr_mask;
|
||||||
uint32_t mmu_cxr_mask;
|
uint32_t mmu_cxr_mask;
|
||||||
|
Loading…
Reference in New Issue
Block a user