mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
target/i386: Added MSRPM and IOPM size check
The address of the last entry in the MSRPM and in the IOPM must be smaller than the largest physical address. (APM2 15.10-15.11) Signed-off-by: Lara Lazier <laramglazier@gmail.com> Message-Id: <20210705081802.18960-2-laramglazier@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bca6eb34f0
commit
481077b28b
2 changed files with 18 additions and 0 deletions
|
@ -68,6 +68,7 @@ static inline void svm_load_seg_cache(CPUX86State *env, hwaddr addr,
|
|||
void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
X86CPU *cpu = env_archcpu(env);
|
||||
target_ulong addr;
|
||||
uint64_t nested_ctl;
|
||||
uint32_t event_inj;
|
||||
|
@ -159,6 +160,20 @@ void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend)
|
|||
asid = x86_ldq_phys(cs, env->vm_vmcb + offsetof(struct vmcb,
|
||||
control.asid));
|
||||
|
||||
uint64_t msrpm_base_pa = x86_ldq_phys(cs, env->vm_vmcb +
|
||||
offsetof(struct vmcb,
|
||||
control.msrpm_base_pa));
|
||||
uint64_t iopm_base_pa = x86_ldq_phys(cs, env->vm_vmcb +
|
||||
offsetof(struct vmcb, control.iopm_base_pa));
|
||||
|
||||
if ((msrpm_base_pa & ~0xfff) >= (1ull << cpu->phys_bits) - SVM_MSRPM_SIZE) {
|
||||
cpu_vmexit(env, SVM_EXIT_ERR, 0, GETPC());
|
||||
}
|
||||
|
||||
if ((iopm_base_pa & ~0xfff) >= (1ull << cpu->phys_bits) - SVM_IOPM_SIZE) {
|
||||
cpu_vmexit(env, SVM_EXIT_ERR, 0, GETPC());
|
||||
}
|
||||
|
||||
env->nested_pg_mode = 0;
|
||||
|
||||
if (!cpu_svm_has_intercept(env, SVM_EXIT_VMRUN)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue