Message ID | 20221102091232.1092552-1-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/i386: Fix test for paging enabled | expand |
On 11/2/22 10:12, Richard Henderson wrote: > If CR0.PG is unset, pg_mode will be zero, but that is not the > only condition for which pg_mode will be zero. Restore the > correct test for paging enabled. > > Fixes: 98281984a37 ("target/i386: Add MMU_PHYS_IDX and MMU_NESTED_IDX") > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1269 > Reported-by: Andreas Gustafsson <gson@gson.org> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/i386/tcg/sysemu/excp_helper.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/excp_helper.c > index d51b5d7431..405a5d414a 100644 > --- a/target/i386/tcg/sysemu/excp_helper.c > +++ b/target/i386/tcg/sysemu/excp_helper.c > @@ -553,12 +553,12 @@ static bool get_physical_address(CPUX86State *env, vaddr addr, > break; > > default: > - in.cr3 = env->cr[3]; > - in.mmu_idx = mmu_idx; > - in.ptw_idx = use_stage2 ? MMU_NESTED_IDX : MMU_PHYS_IDX; > - in.pg_mode = get_pg_mode(env); > + if (likely(env->cr[0] & CR0_PG_MASK)) { > + in.cr3 = env->cr[3]; > + in.mmu_idx = mmu_idx; > + in.ptw_idx = use_stage2 ? MMU_NESTED_IDX : MMU_PHYS_IDX; > + in.pg_mode = get_pg_mode(env); > > - if (likely(in.pg_mode)) { > if (in.pg_mode & PG_MODE_LMA) { > /* test virtual address sign extension */ > int shift = in.pg_mode & PG_MODE_LA57 ? 56 : 47; Queued, thanks. Paolo
diff --git a/target/i386/tcg/sysemu/excp_helper.c b/target/i386/tcg/sysemu/excp_helper.c index d51b5d7431..405a5d414a 100644 --- a/target/i386/tcg/sysemu/excp_helper.c +++ b/target/i386/tcg/sysemu/excp_helper.c @@ -553,12 +553,12 @@ static bool get_physical_address(CPUX86State *env, vaddr addr, break; default: - in.cr3 = env->cr[3]; - in.mmu_idx = mmu_idx; - in.ptw_idx = use_stage2 ? MMU_NESTED_IDX : MMU_PHYS_IDX; - in.pg_mode = get_pg_mode(env); + if (likely(env->cr[0] & CR0_PG_MASK)) { + in.cr3 = env->cr[3]; + in.mmu_idx = mmu_idx; + in.ptw_idx = use_stage2 ? MMU_NESTED_IDX : MMU_PHYS_IDX; + in.pg_mode = get_pg_mode(env); - if (likely(in.pg_mode)) { if (in.pg_mode & PG_MODE_LMA) { /* test virtual address sign extension */ int shift = in.pg_mode & PG_MODE_LA57 ? 56 : 47;
If CR0.PG is unset, pg_mode will be zero, but that is not the only condition for which pg_mode will be zero. Restore the correct test for paging enabled. Fixes: 98281984a37 ("target/i386: Add MMU_PHYS_IDX and MMU_NESTED_IDX") Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1269 Reported-by: Andreas Gustafsson <gson@gson.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/i386/tcg/sysemu/excp_helper.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)