Commit c1b9793b authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: selftests: Init IDT and exception handlers for all VMs/vCPUs on x86



Initialize the IDT and exception handlers for all non-barebones VMs and
vCPUs on x86.  Forcing tests to manually configure the IDT just to save
8KiB of memory is a terrible tradeoff, and also leads to weird tests
(multiple tests have deliberately relied on shutdown to indicate success),
and hard-to-debug failures, e.g. instead of a precise unexpected exception
failure, tests see only shutdown.

Reviewed-by: default avatarAckerley Tng <ackerleytng@google.com>
Link: https://lore.kernel.org/r/20240314232637.2538648-11-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent d8c63805
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -1134,8 +1134,6 @@ struct idt_entry {
	uint32_t offset2; uint32_t reserved;
};

void vm_init_descriptor_tables(struct kvm_vm *vm);
void vcpu_init_descriptor_tables(struct kvm_vcpu *vcpu);
void vm_install_exception_handler(struct kvm_vm *vm, int vector,
			void (*handler)(struct ex_regs *));

+6 −2
Original line number Diff line number Diff line
@@ -541,7 +541,7 @@ static void kvm_setup_tss_64bit(struct kvm_vm *vm, struct kvm_segment *segp,
	kvm_seg_fill_gdt_64bit(vm, segp);
}

void vcpu_init_descriptor_tables(struct kvm_vcpu *vcpu)
static void vcpu_init_descriptor_tables(struct kvm_vcpu *vcpu)
{
	struct kvm_vm *vm = vcpu->vm;
	struct kvm_sregs sregs;
@@ -586,6 +586,8 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct kvm_vcpu *vcpu)

	sregs.cr3 = vm->pgd;
	vcpu_sregs_set(vcpu, &sregs);

	vcpu_init_descriptor_tables(vcpu);
}

static void set_idt_entry(struct kvm_vm *vm, int vector, unsigned long addr,
@@ -639,7 +641,7 @@ void route_exception(struct ex_regs *regs)
		     regs->vector, regs->rip);
}

void vm_init_descriptor_tables(struct kvm_vm *vm)
static void vm_init_descriptor_tables(struct kvm_vm *vm)
{
	extern void *idt_handlers;
	int i;
@@ -671,6 +673,8 @@ void assert_on_unhandled_exception(struct kvm_vcpu *vcpu)
void kvm_arch_vm_post_create(struct kvm_vm *vm)
{
	vm_create_irqchip(vm);
	vm_init_descriptor_tables(vm);

	sync_global_to_guest(vm, host_cpu_is_intel);
	sync_global_to_guest(vm, host_cpu_is_amd);
	sync_global_to_guest(vm, is_forced_emulation_enabled);
+0 −2
Original line number Diff line number Diff line
@@ -244,8 +244,6 @@ int main(int argc, char *argv[])
	vcpu_regs_get(vcpu, &regs1);

	/* Register #NM handler */
	vm_init_descriptor_tables(vm);
	vcpu_init_descriptor_tables(vcpu);
	vm_install_exception_handler(vm, NM_VECTOR, guest_nm_handler);

	/* amx cfg for guest_code */
+0 −2
Original line number Diff line number Diff line
@@ -110,8 +110,6 @@ static void test_fix_hypercall(struct kvm_vcpu *vcpu, bool disable_quirk)
{
	struct kvm_vm *vm = vcpu->vm;

	vm_init_descriptor_tables(vm);
	vcpu_init_descriptor_tables(vcpu);
	vm_install_exception_handler(vcpu->vm, UD_VECTOR, guest_ud_handler);

	if (disable_quirk)
+0 −2
Original line number Diff line number Diff line
@@ -257,8 +257,6 @@ int main(int argc, char *argv[])
	vcpu_args_set(vcpu, 3, vmx_pages_gva, hv_pages_gva, addr_gva2gpa(vm, hcall_page));
	vcpu_set_msr(vcpu, HV_X64_MSR_VP_INDEX, vcpu->id);

	vm_init_descriptor_tables(vm);
	vcpu_init_descriptor_tables(vcpu);
	vm_install_exception_handler(vm, UD_VECTOR, guest_ud_handler);
	vm_install_exception_handler(vm, NMI_VECTOR, guest_nmi_handler);

Loading