Home | History | Annotate | Download | only in qemu

Lines Matching refs:env

52 #  define LOG_INT_STATE(env) log_cpu_state_mask(CPU_LOG_INT, (env), 0)
55 # define LOG_INT_STATE(env) do { } while (0)
126 static void kqemu_update_cpuid(CPUState *env)
154 env->cpuid_features = (env->cpuid_features & ~critical_features_mask) |
156 env->cpuid_ext_features = (env->cpuid_ext_features & ~ext_features_mask) |
163 int kqemu_init(CPUState *env)
244 kqemu_update_cpuid(env);
245 env->kqemu_enabled = kqemu_allowed;
253 void kqemu_flush_page(CPUState *env, target_ulong addr)
262 void kqemu_flush(CPUState *env, int global)
268 void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr)
293 void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr)
404 static void restore_native_fp_frstor(CPUState *env)
409 fp->fpuc = env->fpuc;
410 fp->fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
414 if (env->fptags[i]) {
421 j = env->fpstt;
423 memcpy(&fp->fpregs1[i * 10], &env->fpregs[j].d, 10);
429 static void save_native_fp_fsave(CPUState *env)
436 env->fpuc = fp->fpuc;
437 env->fpstt = (fp->fpus >> 11) & 7;
438 env->fpus = fp->fpus & ~0x3800;
441 env->fptags[i] = ((fptag & 3) == 3);
444 j = env->fpstt;
446 memcpy(&env->fpregs[j].d, &fp->fpregs1[i * 10], 10);
450 fpuc = 0x037f | (env->fpuc & (3 << 10));
454 static void restore_native_fp_fxrstor(CPUState *env)
459 fp->fpuc = env->fpuc;
460 fp->fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
463 fptag |= (env->fptags[i] << i);
466 j = env->fpstt;
468 memcpy(&fp->fpregs1[i * 16], &env->fpregs[j].d, 10);
471 if (env->cpuid_features & CPUID_SSE) {
472 fp->mxcsr = env->mxcsr;
475 memcpy(fp->xmm_regs, env->xmm_regs, CPU_NB_REGS * 16);
480 static void save_native_fp_fxsave(CPUState *env)
487 env->fpuc = fp->fpuc;
488 env->fpstt = (fp->fpus >> 11) & 7;
489 env->fpus = fp->fpus & ~0x3800;
492 env->fptags[i] = (fptag >> i) & 1;
494 j = env->fpstt;
496 memcpy(&env->fpregs[j].d, &fp->fpregs1[i * 16], 10);
499 if (env->cpuid_features & CPUID_SSE) {
500 env->mxcsr = fp->mxcsr;
501 memcpy(env->xmm_regs, fp->xmm_regs, CPU_NB_REGS * 16);
506 fpuc = 0x037f | (env->fpuc & (3 << 10));
510 static int do_syscall(CPUState *env,
515 selector = (env->star >> 32) & 0xffff;
517 if (env->hflags & HF_LMA_MASK) {
520 env->regs[R_ECX] = kenv->next_eip;
521 env->regs[11] = env->eflags;
523 code64 = env->hflags & HF_CS64_MASK;
525 cpu_x86_set_cpl(env, 0);
526 cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc,
531 cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc,
536 env->eflags &= ~env->fmask;
538 env->eip = env->lstar;
540 env->eip = env->cstar;
544 env->regs[R_ECX] = (uint32_t)kenv->next_eip;
546 cpu_x86_set_cpl(env, 0);
547 cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc,
552 cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc,
557 env->eflags &= ~(IF_MASK | RF_MASK | VM_MASK);
558 env->eip = (uint32_t)env->star;
691 int kqemu_cpu_exec(CPUState *env)
706 LOG_INT_STATE(env);
708 kenv->regs[i] = env->regs[i];
709 kenv->eip = env->eip;
710 kenv->eflags = env->eflags;
712 kqemu_load_seg(&kenv->segs[i], &env->segs[i]);
713 kqemu_load_seg(&kenv->ldt, &env->ldt);
714 kqemu_load_seg(&kenv->tr, &env->tr);
715 kqemu_load_seg(&kenv->gdt, &env->gdt);
716 kqemu_load_seg(&kenv->idt, &env->idt);
717 kenv->cr0 = env->cr[0];
718 kenv->cr2 = env->cr[2];
719 kenv->cr3 = env->cr[3];
720 kenv->cr4 = env->cr[4];
721 kenv->a20_mask = env->a20_mask;
722 kenv->efer = env->efer;
724 kenv->star = env->star;
725 kenv->sysenter_cs = env->sysenter_cs;
726 kenv->sysenter_esp = env->sysenter_esp;
727 kenv->sysenter_eip = env->sysenter_eip;
729 kenv->lstar = env->lstar;
730 kenv->cstar = env->cstar;
731 kenv->fmask = env->fmask;
732 kenv->kernelgsbase = env->kernelgsbase;
734 if (env->dr[7] & 0xff) {
735 kenv->dr7 = env->dr[7];
736 kenv->dr0 = env->dr[0];
737 kenv->dr1 = env->dr[1];
738 kenv->dr2 = env->dr[2];
739 kenv->dr3 = env->dr[3];
743 kenv->dr6 = env->dr[6];
744 cpl = (env->hflags & HF_CPL_MASK);
747 kenv->user_only = (env->kqemu_enabled == 1);
754 if (env->cpuid_features & CPUID_FXSR)
755 restore_native_fp_fxrstor(env);
757 restore_native_fp_frstor(env);
772 if (env->cpuid_features & CPUID_FXSR)
773 save_native_fp_fxsave(env);
775 save_native_fp_fsave(env);
778 env->regs[i] = kenv->regs[i];
779 env->eip = kenv->eip;
780 env->eflags = kenv->eflags;
782 kqemu_save_seg(&env->segs[i], &kenv->segs[i]);
783 cpu_x86_set_cpl(env, kenv->cpl);
784 kqemu_save_seg(&env->ldt, &kenv->ldt);
785 env->cr[0] = kenv->cr0;
786 env->cr[4] = kenv->cr4;
787 env->cr[3] = kenv->cr3;
788 env->cr[2] = kenv->cr2;
789 env->dr[6] = kenv->dr6;
791 env->kernelgsbase = kenv->kernelgsbase;
796 tlb_flush(env, 1);
799 tlb_flush_page(env, pages_to_flush[i]);
810 cpu_tlb_update_dirty(env);
825 if ((env->hflags & HF_LMA_MASK) &&
826 (env->segs[R_CS].flags & DESC_L_MASK)) {
833 new_hflags = (env->segs[R_CS].flags & DESC_B_MASK)
835 new_hflags |= (env->segs[R_SS].flags & DESC_B_MASK)
837 if (!(env->cr[0] & CR0_PE_MASK) ||
838 (env->eflags & VM_MASK) ||
839 !(env->hflags & HF_CS32_MASK)) {
847 new_hflags |= ((env->segs[R_DS].base |
848 env->segs[R_ES].base |
849 env->segs[R_SS].base) != 0) <<
853 env->hflags = (env->hflags &
858 env->hflags = (env->hflags & ~(HF_MP_MASK | HF_EM_MASK | HF_TS_MASK)) |
859 ((env->cr[0] << (HF_MP_SHIFT - 1)) & (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK));
860 if (env->cr[4] & CR4_OSFXSR_MASK)
861 env->hflags |= HF_OSFXSR_MASK;
863 env->hflags &= ~HF_OSFXSR_MASK;
868 return do_syscall(env, kenv);
871 env->exception_index = ret & 0xff;
872 env->error_code = 0;
873 env->exception_is_int = 1;
874 env->exception_next_eip = kenv->next_eip;
878 LOG_INT("kqemu: interrupt v=%02x:\n", env->exception_index);
879 LOG_INT_STATE(env);
882 env->exception_index = ret & 0xff;
883 env->error_code = kenv->error_code;
884 env->exception_is_int = 0;
885 env->exception_next_eip = 0;
890 env->exception_index, env->error_code);
891 LOG_INT_STATE(env);
897 LOG_INT_STATE(env);
902 unsigned long pc = env->eip + env->segs[R_CS].base;
906 LOG_INT_STATE(env);
909 cpu_dump_state(env, stderr, fprintf, 0);
916 void kqemu_cpu_interrupt(CPUState *env)
956 CPUState *env;
958 env = cpu_single_env;
959 if (!env)
961 return env->eflags & (IF_MASK | IOPL_MASK);
969 CPUState *env;
971 env = cpu_single_env;
972 if (!env)
974 env->eflags = (env->eflags & ~(IF_MASK | IOPL_MASK)) |