[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Stable-8.2.2 72/78] target/i386: check validity of VMCB addresses
From: |
Michael Tokarev |
Subject: |
[Stable-8.2.2 72/78] target/i386: check validity of VMCB addresses |
Date: |
Thu, 29 Feb 2024 01:54:48 +0300 |
From: Paolo Bonzini <pbonzini@redhat.com>
MSR_VM_HSAVE_PA bits 0-11 are reserved, as are the bits above the
maximum physical address width of the processor. Setting them to
1 causes a #GP (see "15.30.4 VM_HSAVE_PA MSR" in the AMD manual).
The same is true of VMCB addresses passed to VMRUN/VMLOAD/VMSAVE,
even though the manual is not clear on that.
Cc: qemu-stable@nongnu.org
Fixes: 4a1e9d4d11c ("target/i386: Use atomic operations for pte updates",
2022-10-18)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit d09c79010ffd880dc69e7a21e3cfdef90b928fb8)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
diff --git a/target/i386/tcg/sysemu/misc_helper.c
b/target/i386/tcg/sysemu/misc_helper.c
index e1528b7f80..1901712ece 100644
--- a/target/i386/tcg/sysemu/misc_helper.c
+++ b/target/i386/tcg/sysemu/misc_helper.c
@@ -201,6 +201,9 @@ void helper_wrmsr(CPUX86State *env)
tlb_flush(cs);
break;
case MSR_VM_HSAVE_PA:
+ if (val & (0xfff | ((~0ULL) << env_archcpu(env)->phys_bits))) {
+ goto error;
+ }
env->vm_hsave = val;
break;
#ifdef TARGET_X86_64
diff --git a/target/i386/tcg/sysemu/svm_helper.c
b/target/i386/tcg/sysemu/svm_helper.c
index 32ff0dbb13..5d6de2294f 100644
--- a/target/i386/tcg/sysemu/svm_helper.c
+++ b/target/i386/tcg/sysemu/svm_helper.c
@@ -164,14 +164,19 @@ void helper_vmrun(CPUX86State *env, int aflag, int
next_eip_addend)
uint64_t new_cr3;
uint64_t new_cr4;
- cpu_svm_check_intercept_param(env, SVM_EXIT_VMRUN, 0, GETPC());
-
if (aflag == 2) {
addr = env->regs[R_EAX];
} else {
addr = (uint32_t)env->regs[R_EAX];
}
+ /* Exceptions are checked before the intercept. */
+ if (addr & (0xfff | ((~0ULL) << env_archcpu(env)->phys_bits))) {
+ raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
+ }
+
+ cpu_svm_check_intercept_param(env, SVM_EXIT_VMRUN, 0, GETPC());
+
qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmrun! " TARGET_FMT_lx "\n", addr);
env->vm_vmcb = addr;
@@ -463,14 +468,19 @@ void helper_vmload(CPUX86State *env, int aflag)
int mmu_idx = MMU_PHYS_IDX;
target_ulong addr;
- cpu_svm_check_intercept_param(env, SVM_EXIT_VMLOAD, 0, GETPC());
-
if (aflag == 2) {
addr = env->regs[R_EAX];
} else {
addr = (uint32_t)env->regs[R_EAX];
}
+ /* Exceptions are checked before the intercept. */
+ if (addr & (0xfff | ((~0ULL) << env_archcpu(env)->phys_bits))) {
+ raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
+ }
+
+ cpu_svm_check_intercept_param(env, SVM_EXIT_VMLOAD, 0, GETPC());
+
if (virtual_vm_load_save_enabled(env, SVM_EXIT_VMLOAD, GETPC())) {
mmu_idx = MMU_NESTED_IDX;
}
@@ -519,14 +529,19 @@ void helper_vmsave(CPUX86State *env, int aflag)
int mmu_idx = MMU_PHYS_IDX;
target_ulong addr;
- cpu_svm_check_intercept_param(env, SVM_EXIT_VMSAVE, 0, GETPC());
-
if (aflag == 2) {
addr = env->regs[R_EAX];
} else {
addr = (uint32_t)env->regs[R_EAX];
}
+ /* Exceptions are checked before the intercept. */
+ if (addr & (0xfff | ((~0ULL) << env_archcpu(env)->phys_bits))) {
+ raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
+ }
+
+ cpu_svm_check_intercept_param(env, SVM_EXIT_VMSAVE, 0, GETPC());
+
if (virtual_vm_load_save_enabled(env, SVM_EXIT_VMSAVE, GETPC())) {
mmu_idx = MMU_NESTED_IDX;
}
--
2.39.2
- [Stable-8.2.2 62/78] docs/system: Update description for input grab key, (continued)
- [Stable-8.2.2 62/78] docs/system: Update description for input grab key, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 64/78] .gitlab-ci.d/windows.yml: Drop msys2-32bit job, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 65/78] target/ppc: Fix lxv/stxv MSR facility check, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 69/78] hw/nvme: fix invalid endian conversion, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 66/78] target/ppc: Fix crash on machine check caused by ifetch, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 67/78] update edk2 submodule to edk2-stable202402, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 68/78] update edk2 binaries to edk2-stable202402, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 70/78] pl031: Update last RTCLR value on write in case it's read back, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 71/78] target/i386: mask high bits of CR3 in 32-bit mode, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 73/78] target/i386: Fix physical address truncation, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 72/78] target/i386: check validity of VMCB addresses,
Michael Tokarev <=
- [Stable-8.2.2 74/78] target/i386: remove unnecessary/wrong application of the A20 mask, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 75/78] target/i386: leave the A20 bit set in the final NPT walk, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 76/78] tests/vm: update openbsd image to 7.4, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 78/78] gitlab: force allow use of pip in Cirrus jobs, Michael Tokarev, 2024/02/28
- [Stable-8.2.2 77/78] tests/vm: avoid re-building the VM images all the time, Michael Tokarev, 2024/02/28