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