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,7 +670,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, | ||
670 | #endif | 670 | #endif |
671 | { | 671 | { |
672 | /* XXX: load them when cr3 is loaded ? */ | 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 | env->a20_mask; | 674 | env->a20_mask; |
675 | pdpe = ldq_phys(pdpe_addr); | 675 | pdpe = ldq_phys(pdpe_addr); |
676 | if (!(pdpe & PG_PRESENT_MASK)) { | 676 | if (!(pdpe & PG_PRESENT_MASK)) { |
@@ -765,7 +765,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, | @@ -765,7 +765,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr, | ||
765 | uint32_t pde; | 765 | uint32_t pde; |
766 | 766 | ||
767 | /* page directory entry */ | 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 | env->a20_mask; | 769 | env->a20_mask; |
770 | pde = ldl_phys(pde_addr); | 770 | pde = ldl_phys(pde_addr); |
771 | if (!(pde & PG_PRESENT_MASK)) { | 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,7 +910,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | ||
910 | } else | 910 | } else |
911 | #endif | 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 | env->a20_mask; | 914 | env->a20_mask; |
915 | pdpe = ldl_phys(pdpe_addr); | 915 | pdpe = ldl_phys(pdpe_addr); |
916 | if (!(pdpe & PG_PRESENT_MASK)) | 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,7 +940,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | ||
940 | page_size = 4096; | 940 | page_size = 4096; |
941 | } else { | 941 | } else { |
942 | /* page directory entry */ | 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 | pde = ldl_phys(pde_addr); | 944 | pde = ldl_phys(pde_addr); |
945 | if (!(pde & PG_PRESENT_MASK)) | 945 | if (!(pde & PG_PRESENT_MASK)) |
946 | return -1; | 946 | return -1; |