]> git.ipfire.org Git - thirdparty/qemu.git/commit
target/i386: Fix legacy page table walk
authorAlexander Graf <graf@amazon.com>
Wed, 6 Nov 2024 15:43:29 +0000 (15:43 +0000)
committerMichael Tokarev <mjt@tls.msk.ru>
Mon, 18 Nov 2024 16:29:40 +0000 (19:29 +0300)
commitf7ff24a6e9259726db08e36cdc28645c0a3b1a70
tree9c5968ad257ba75a26f1e4b5d4f76a6a007c80bf
parent3d28b84487345b669d8afba972f8b64dd3f75098
target/i386: Fix legacy page table walk

Commit b56617bbcb4 ("target/i386: Walk NPT in guest real mode") added
logic to run the page table walker even in real mode if we are in NPT
mode.  That function then determined whether real mode or paging is
active based on whether the pg_mode variable was 0.

Unfortunately pg_mode is 0 in two situations:

  1) Paging is disabled (real mode)
  2) Paging is in 2-level paging mode (32bit without PAE)

That means the walker now assumed that 2-level paging mode was real
mode, breaking NetBSD as well as Windows XP.

To fix that, this patch adds a new PG flag to pg_mode which indicates
whether paging is active at all and uses that to determine whether we
are in real mode or not.

Cc: qemu-stable@nongnu.org
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2654
Fixes: b56617bbcb4 ("target/i386: Walk NPT in guest real mode")
Fixes: 01bfc2e2959 (commit b56617bbcb4 in stable-9.1.x series)
Signed-off-by: Alexander Graf <graf@amazon.com>
Reported-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Link: https://lore.kernel.org/r/20241106154329.67218-1-graf@amazon.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 8fa11a4df344f58375eb26b3b65004345f21ef37)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
target/i386/cpu.h
target/i386/tcg/seg_helper.c
target/i386/tcg/sysemu/excp_helper.c