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);
|
||||
X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
|
||||
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);
|
||||
|
||||
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)
|
||||
|
|
|
@ -29,76 +29,7 @@
|
|||
/* NOTE: must be called outside the CPU execute loop */
|
||||
void cpu_state_reset(CPUX86State *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);
|
||||
}
|
||||
|
||||
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);
|
||||
cpu_reset(ENV_GET_CPU(env));
|
||||
}
|
||||
|
||||
static void cpu_x86_version(CPUX86State *env, int *family, int *model)
|
||||
|
|
Loading…
Reference in a new issue