Commit af661ad11bbcd00b1eb437ab5032817e7ecf35fc
1 parent
c94655b0
Ptable calculation broken for 32bit code under x86_64, by Bernhard Kauer.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2697 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
4 additions
and
4 deletions
target-i386/helper2.c
| ... | ... | @@ -670,7 +670,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, |
| 670 | 670 | #endif |
| 671 | 671 | { |
| 672 | 672 | /* XXX: load them when cr3 is loaded ? */ |
| 673 | - pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 30) << 3)) & | |
| 673 | + pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & | |
| 674 | 674 | env->a20_mask; |
| 675 | 675 | pdpe = ldq_phys(pdpe_addr); |
| 676 | 676 | if (!(pdpe & PG_PRESENT_MASK)) { |
| ... | ... | @@ -765,7 +765,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, |
| 765 | 765 | uint32_t pde; |
| 766 | 766 | |
| 767 | 767 | /* page directory entry */ |
| 768 | - pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & ~3)) & | |
| 768 | + pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & | |
| 769 | 769 | env->a20_mask; |
| 770 | 770 | pde = ldl_phys(pde_addr); |
| 771 | 771 | if (!(pde & PG_PRESENT_MASK)) { |
| ... | ... | @@ -910,7 +910,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
| 910 | 910 | } else |
| 911 | 911 | #endif |
| 912 | 912 | { |
| 913 | - pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 30) << 3)) & | |
| 913 | + pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & | |
| 914 | 914 | env->a20_mask; |
| 915 | 915 | pdpe = ldl_phys(pdpe_addr); |
| 916 | 916 | if (!(pdpe & PG_PRESENT_MASK)) |
| ... | ... | @@ -940,7 +940,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
| 940 | 940 | page_size = 4096; |
| 941 | 941 | } else { |
| 942 | 942 | /* page directory entry */ |
| 943 | - pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & ~3)) & env->a20_mask; | |
| 943 | + pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & env->a20_mask; | |
| 944 | 944 | pde = ldl_phys(pde_addr); |
| 945 | 945 | if (!(pde & PG_PRESENT_MASK)) |
| 946 | 946 | return -1; | ... | ... |