mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
target-i386: QOM'ify CPU reset
Move code from cpu_state_reset() into QOM x86_cpu_reset(), fixing style issues for FPU init. Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
de024815e3
commit
c1958aea51
2 changed files with 72 additions and 71 deletions
|
@ -1374,10 +1374,80 @@ static void x86_cpu_reset(CPUState *s)
|
||||||
X86CPU *cpu = X86_CPU(s);
|
X86CPU *cpu = X86_CPU(s);
|
||||||
X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
|
X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
|
||||||
CPUX86State *env = &cpu->env;
|
CPUX86State *env = &cpu->env;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (qemu_loglevel_mask(CPU_LOG_RESET)) {
|
||||||
|
qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
|
||||||
|
log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
|
||||||
|
}
|
||||||
|
|
||||||
xcc->parent_reset(s);
|
xcc->parent_reset(s);
|
||||||
|
|
||||||
cpu_state_reset(env);
|
|
||||||
|
memset(env, 0, offsetof(CPUX86State, breakpoints));
|
||||||
|
|
||||||
|
tlb_flush(env, 1);
|
||||||
|
|
||||||
|
env->old_exception = -1;
|
||||||
|
|
||||||
|
/* init to reset state */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
|
env->hflags |= HF_SOFTMMU_MASK;
|
||||||
|
#endif
|
||||||
|
env->hflags2 |= HF2_GIF_MASK;
|
||||||
|
|
||||||
|
cpu_x86_update_cr0(env, 0x60000010);
|
||||||
|
env->a20_mask = ~0x0;
|
||||||
|
env->smbase = 0x30000;
|
||||||
|
|
||||||
|
env->idt.limit = 0xffff;
|
||||||
|
env->gdt.limit = 0xffff;
|
||||||
|
env->ldt.limit = 0xffff;
|
||||||
|
env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
|
||||||
|
env->tr.limit = 0xffff;
|
||||||
|
env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
|
||||||
|
|
||||||
|
cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
|
||||||
|
DESC_R_MASK | DESC_A_MASK);
|
||||||
|
cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
||||||
|
DESC_A_MASK);
|
||||||
|
cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
||||||
|
DESC_A_MASK);
|
||||||
|
cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
||||||
|
DESC_A_MASK);
|
||||||
|
cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
||||||
|
DESC_A_MASK);
|
||||||
|
cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
|
||||||
|
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
||||||
|
DESC_A_MASK);
|
||||||
|
|
||||||
|
env->eip = 0xfff0;
|
||||||
|
env->regs[R_EDX] = env->cpuid_version;
|
||||||
|
|
||||||
|
env->eflags = 0x2;
|
||||||
|
|
||||||
|
/* FPU init */
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
env->fptags[i] = 1;
|
||||||
|
}
|
||||||
|
env->fpuc = 0x37f;
|
||||||
|
|
||||||
|
env->mxcsr = 0x1f80;
|
||||||
|
|
||||||
|
env->pat = 0x0007040600070406ULL;
|
||||||
|
env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
|
||||||
|
|
||||||
|
memset(env->dr, 0, sizeof(env->dr));
|
||||||
|
env->dr[6] = DR6_FIXED_1;
|
||||||
|
env->dr[7] = DR7_FIXED_1;
|
||||||
|
cpu_breakpoint_remove_all(env, BP_CPU);
|
||||||
|
cpu_watchpoint_remove_all(env, BP_CPU);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mce_init(X86CPU *cpu)
|
static void mce_init(X86CPU *cpu)
|
||||||
|
|
|
@ -29,76 +29,7 @@
|
||||||
/* NOTE: must be called outside the CPU execute loop */
|
/* NOTE: must be called outside the CPU execute loop */
|
||||||
void cpu_state_reset(CPUX86State *env)
|
void cpu_state_reset(CPUX86State *env)
|
||||||
{
|
{
|
||||||
int i;
|
cpu_reset(ENV_GET_CPU(env));
|
||||||
|
|
||||||
if (qemu_loglevel_mask(CPU_LOG_RESET)) {
|
|
||||||
qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
|
|
||||||
log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(env, 0, offsetof(CPUX86State, breakpoints));
|
|
||||||
|
|
||||||
tlb_flush(env, 1);
|
|
||||||
|
|
||||||
env->old_exception = -1;
|
|
||||||
|
|
||||||
/* init to reset state */
|
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
|
||||||
env->hflags |= HF_SOFTMMU_MASK;
|
|
||||||
#endif
|
|
||||||
env->hflags2 |= HF2_GIF_MASK;
|
|
||||||
|
|
||||||
cpu_x86_update_cr0(env, 0x60000010);
|
|
||||||
env->a20_mask = ~0x0;
|
|
||||||
env->smbase = 0x30000;
|
|
||||||
|
|
||||||
env->idt.limit = 0xffff;
|
|
||||||
env->gdt.limit = 0xffff;
|
|
||||||
env->ldt.limit = 0xffff;
|
|
||||||
env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
|
|
||||||
env->tr.limit = 0xffff;
|
|
||||||
env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
|
|
||||||
|
|
||||||
cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
|
|
||||||
DESC_R_MASK | DESC_A_MASK);
|
|
||||||
cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
|
||||||
DESC_A_MASK);
|
|
||||||
cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
|
||||||
DESC_A_MASK);
|
|
||||||
cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
|
||||||
DESC_A_MASK);
|
|
||||||
cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
|
||||||
DESC_A_MASK);
|
|
||||||
cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
|
|
||||||
DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
|
|
||||||
DESC_A_MASK);
|
|
||||||
|
|
||||||
env->eip = 0xfff0;
|
|
||||||
env->regs[R_EDX] = env->cpuid_version;
|
|
||||||
|
|
||||||
env->eflags = 0x2;
|
|
||||||
|
|
||||||
/* FPU init */
|
|
||||||
for(i = 0;i < 8; i++)
|
|
||||||
env->fptags[i] = 1;
|
|
||||||
env->fpuc = 0x37f;
|
|
||||||
|
|
||||||
env->mxcsr = 0x1f80;
|
|
||||||
|
|
||||||
env->pat = 0x0007040600070406ULL;
|
|
||||||
env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
|
|
||||||
|
|
||||||
memset(env->dr, 0, sizeof(env->dr));
|
|
||||||
env->dr[6] = DR6_FIXED_1;
|
|
||||||
env->dr[7] = DR7_FIXED_1;
|
|
||||||
cpu_breakpoint_remove_all(env, BP_CPU);
|
|
||||||
cpu_watchpoint_remove_all(env, BP_CPU);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_x86_version(CPUX86State *env, int *family, int *model)
|
static void cpu_x86_version(CPUX86State *env, int *family, int *model)
|
||||||
|
|
Loading…
Reference in a new issue