Skip to content

Commit c1b9793

Browse files
committed
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: Ackerley Tng <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent d8c6380 commit c1b9793

23 files changed

+6
-69
lines changed

tools/testing/selftests/kvm/include/x86_64/processor.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,8 +1134,6 @@ struct idt_entry {
11341134
uint32_t offset2; uint32_t reserved;
11351135
};
11361136

1137-
void vm_init_descriptor_tables(struct kvm_vm *vm);
1138-
void vcpu_init_descriptor_tables(struct kvm_vcpu *vcpu);
11391137
void vm_install_exception_handler(struct kvm_vm *vm, int vector,
11401138
void (*handler)(struct ex_regs *));
11411139

tools/testing/selftests/kvm/lib/x86_64/processor.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ static void kvm_setup_tss_64bit(struct kvm_vm *vm, struct kvm_segment *segp,
541541
kvm_seg_fill_gdt_64bit(vm, segp);
542542
}
543543

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

587587
sregs.cr3 = vm->pgd;
588588
vcpu_sregs_set(vcpu, &sregs);
589+
590+
vcpu_init_descriptor_tables(vcpu);
589591
}
590592

591593
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)
639641
regs->vector, regs->rip);
640642
}
641643

642-
void vm_init_descriptor_tables(struct kvm_vm *vm)
644+
static void vm_init_descriptor_tables(struct kvm_vm *vm)
643645
{
644646
extern void *idt_handlers;
645647
int i;
@@ -671,6 +673,8 @@ void assert_on_unhandled_exception(struct kvm_vcpu *vcpu)
671673
void kvm_arch_vm_post_create(struct kvm_vm *vm)
672674
{
673675
vm_create_irqchip(vm);
676+
vm_init_descriptor_tables(vm);
677+
674678
sync_global_to_guest(vm, host_cpu_is_intel);
675679
sync_global_to_guest(vm, host_cpu_is_amd);
676680
sync_global_to_guest(vm, is_forced_emulation_enabled);

tools/testing/selftests/kvm/x86_64/amx_test.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,6 @@ int main(int argc, char *argv[])
244244
vcpu_regs_get(vcpu, &regs1);
245245

246246
/* Register #NM handler */
247-
vm_init_descriptor_tables(vm);
248-
vcpu_init_descriptor_tables(vcpu);
249247
vm_install_exception_handler(vm, NM_VECTOR, guest_nm_handler);
250248

251249
/* amx cfg for guest_code */

tools/testing/selftests/kvm/x86_64/fix_hypercall_test.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ static void test_fix_hypercall(struct kvm_vcpu *vcpu, bool disable_quirk)
110110
{
111111
struct kvm_vm *vm = vcpu->vm;
112112

113-
vm_init_descriptor_tables(vm);
114-
vcpu_init_descriptor_tables(vcpu);
115113
vm_install_exception_handler(vcpu->vm, UD_VECTOR, guest_ud_handler);
116114

117115
if (disable_quirk)

tools/testing/selftests/kvm/x86_64/hyperv_evmcs.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,6 @@ int main(int argc, char *argv[])
257257
vcpu_args_set(vcpu, 3, vmx_pages_gva, hv_pages_gva, addr_gva2gpa(vm, hcall_page));
258258
vcpu_set_msr(vcpu, HV_X64_MSR_VP_INDEX, vcpu->id);
259259

260-
vm_init_descriptor_tables(vm);
261-
vcpu_init_descriptor_tables(vcpu);
262260
vm_install_exception_handler(vm, UD_VECTOR, guest_ud_handler);
263261
vm_install_exception_handler(vm, NMI_VECTOR, guest_nmi_handler);
264262

tools/testing/selftests/kvm/x86_64/hyperv_features.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,6 @@ static void guest_test_msrs_access(void)
156156
vcpu_init_cpuid(vcpu, prev_cpuid);
157157
}
158158

159-
vm_init_descriptor_tables(vm);
160-
vcpu_init_descriptor_tables(vcpu);
161-
162159
/* TODO: Make this entire test easier to maintain. */
163160
if (stage >= 21)
164161
vcpu_enable_cap(vcpu, KVM_CAP_HYPERV_SYNIC2, 0);
@@ -532,9 +529,6 @@ static void guest_test_hcalls_access(void)
532529
while (true) {
533530
vm = vm_create_with_one_vcpu(&vcpu, guest_hcall);
534531

535-
vm_init_descriptor_tables(vm);
536-
vcpu_init_descriptor_tables(vcpu);
537-
538532
/* Hypercall input/output */
539533
hcall_page = vm_vaddr_alloc_pages(vm, 2);
540534
memset(addr_gva2hva(vm, hcall_page), 0x0, 2 * getpagesize());

tools/testing/selftests/kvm/x86_64/hyperv_ipi.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -254,16 +254,13 @@ int main(int argc, char *argv[])
254254
hcall_page = vm_vaddr_alloc_pages(vm, 2);
255255
memset(addr_gva2hva(vm, hcall_page), 0x0, 2 * getpagesize());
256256

257-
vm_init_descriptor_tables(vm);
258257

259258
vcpu[1] = vm_vcpu_add(vm, RECEIVER_VCPU_ID_1, receiver_code);
260-
vcpu_init_descriptor_tables(vcpu[1]);
261259
vcpu_args_set(vcpu[1], 2, hcall_page, addr_gva2gpa(vm, hcall_page));
262260
vcpu_set_msr(vcpu[1], HV_X64_MSR_VP_INDEX, RECEIVER_VCPU_ID_1);
263261
vcpu_set_hv_cpuid(vcpu[1]);
264262

265263
vcpu[2] = vm_vcpu_add(vm, RECEIVER_VCPU_ID_2, receiver_code);
266-
vcpu_init_descriptor_tables(vcpu[2]);
267264
vcpu_args_set(vcpu[2], 2, hcall_page, addr_gva2gpa(vm, hcall_page));
268265
vcpu_set_msr(vcpu[2], HV_X64_MSR_VP_INDEX, RECEIVER_VCPU_ID_2);
269266
vcpu_set_hv_cpuid(vcpu[2]);

tools/testing/selftests/kvm/x86_64/kvm_pv_test.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,6 @@ int main(void)
183183

184184
vcpu_clear_cpuid_entry(vcpu, KVM_CPUID_FEATURES);
185185

186-
vm_init_descriptor_tables(vm);
187-
vcpu_init_descriptor_tables(vcpu);
188-
189186
enter_guest(vcpu);
190187
kvm_vm_free(vm);
191188

tools/testing/selftests/kvm/x86_64/monitor_mwait_test.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ int main(int argc, char *argv[])
8080
vm = vm_create_with_one_vcpu(&vcpu, guest_code);
8181
vcpu_clear_cpuid_feature(vcpu, X86_FEATURE_MWAIT);
8282

83-
vm_init_descriptor_tables(vm);
84-
vcpu_init_descriptor_tables(vcpu);
85-
8683
while (1) {
8784
vcpu_run(vcpu);
8885
TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);

tools/testing/selftests/kvm/x86_64/platform_info_test.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ int main(int argc, char *argv[])
4949

5050
vm = vm_create_with_one_vcpu(&vcpu, guest_code);
5151

52-
vm_init_descriptor_tables(vm);
53-
vcpu_init_descriptor_tables(vcpu);
54-
5552
msr_platform_info = vcpu_get_msr(vcpu, MSR_PLATFORM_INFO);
5653
vcpu_set_msr(vcpu, MSR_PLATFORM_INFO,
5754
msr_platform_info | MSR_PLATFORM_INFO_MAX_TURBO_RATIO);

0 commit comments

Comments
 (0)