Revision 3b46e624 target-i386/helper2.c

b/target-i386/helper2.c
75 75
        ldt.seg_not_present = 0;
76 76
        ldt.useable = 1;
77 77
        modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */
78
       
78

  
79 79
        asm volatile ("movl %0, %%fs" : : "r" ((1 << 3) | 7));
80 80
    }
81 81
#endif
......
173 173
    env->ldt.flags = DESC_P_MASK;
174 174
    env->tr.limit = 0xffff;
175 175
    env->tr.flags = DESC_P_MASK;
176
   
176

  
177 177
    cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff, 0);
178 178
    cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, 0);
179 179
    cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, 0);
180 180
    cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, 0);
181 181
    cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff, 0);
182 182
    cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff, 0);
183
   
183

  
184 184
    env->eip = 0xfff0;
185 185
    env->regs[R_EDX] = 0x600; /* indicate P6 processor */
186
   
186

  
187 187
    env->eflags = 0x2;
188
   
188

  
189 189
    /* FPU init */
190 190
    for(i = 0;i < 8; i++)
191 191
        env->fptags[i] = 1;
......
516 516
    }
517 517
#endif
518 518
    env->cr[0] = new_cr0 | CR0_ET_MASK;
519
   
519

  
520 520
    /* update PE flag in hidden flags */
521 521
    pe_state = (env->cr[0] & CR0_PE_MASK);
522 522
    env->hflags = (env->hflags & ~HF_PE_MASK) | (pe_state << HF_PE_SHIFT);
......
603 603
    int error_code, is_dirty, prot, page_size, ret, is_write;
604 604
    unsigned long paddr, page_offset;
605 605
    target_ulong vaddr, virt_addr;
606
   
606

  
607 607
#if defined(DEBUG_MMU)
608 608
    printf("MMU fault: addr=" TARGET_FMT_lx " w=%d u=%d eip=" TARGET_FMT_lx "\n",
609 609
           addr, is_write1, is_user, env->eip);
610 610
#endif
611 611
    is_write = is_write1 & 1;
612
   
612

  
613 613
    if (!(env->cr[0] & CR0_PG_MASK)) {
614 614
        pte = addr;
615 615
        virt_addr = addr & TARGET_PAGE_MASK;
......
635 635
                env->exception_index = EXCP0D_GPF;
636 636
                return 1;
637 637
            }
638
           
638

  
639 639
            pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) &
640 640
                env->a20_mask;
641 641
            pml4e = ldq_phys(pml4e_addr);
......
794 794
                    pde |= PG_DIRTY_MASK;
795 795
                stl_phys_notdirty(pde_addr, pde);
796 796
            }
797
       
797

  
798 798
            pte = pde & ~( (page_size - 1) & ~0xfff); /* align to page_size */
799 799
            ptep = pte;
800 800
            virt_addr = addr & ~(page_size - 1);
......
859 859
    page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
860 860
    paddr = (pte & TARGET_PAGE_MASK) + page_offset;
861 861
    vaddr = virt_addr + page_offset;
862
   
862

  
863 863
    ret = tlb_set_page_exec(env, vaddr, paddr, prot, is_user, is_softmmu);
864 864
    return ret;
865 865
 do_fault_protect:
......
897 897
            sext = (int64_t)addr >> 47;
898 898
            if (sext != 0 && sext != -1)
899 899
                return -1;
900
           
900

  
901 901
            pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) &
902 902
                env->a20_mask;
903 903
            pml4e = ldl_phys(pml4e_addr);
904 904
            if (!(pml4e & PG_PRESENT_MASK))
905 905
                return -1;
906
           
906

  
907 907
            pdpe_addr = ((pml4e & ~0xfff) + (((addr >> 30) & 0x1ff) << 3)) &
908 908
                env->a20_mask;
909 909
            pdpe = ldl_phys(pdpe_addr);
......
987 987
{
988 988
    int fptag, i, j;
989 989
    struct fpstate fp1, *fp = &fp1;
990
   
990

  
991 991
    fp->fpuc = env->fpuc;
992 992
    fp->fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
993 993
    fptag = 0;

Also available in: Unified diff