Skip to content

Commit b093f87

Browse files
committed
KVM: selftests: Drop @selector from segment helpers
Drop the @selector from the kernel code, data, and TSS builders and instead hardcode the respective selector in the helper. Accepting a selector but not a base makes the selector useless, e.g. the data helper can't create per-vCPU for FS or GS, and so loading GS with KERNEL_DS is the only logical choice. And for code and TSS, there is no known reason to ever want multiple segments, e.g. there are zero plans to support 32-bit kernel code (and again, that would require more than just the selector). If KVM selftests ever do add support for per-vCPU segments, it'd arguably be more readable to add a dedicated helper for building/setting the per-vCPU segment, and move the common data segment code to an inner helper. Lastly, hardcoding the selector reduces the probability of setting the wrong selector in the vCPU versus what was created by the VM in the GDT. Reviewed-by: Ackerley Tng <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent 0f53a02 commit b093f87

File tree

1 file changed

+14
-15
lines changed

1 file changed

+14
-15
lines changed

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

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,10 @@ static void kvm_seg_fill_gdt_64bit(struct kvm_vm *vm, struct kvm_segment *segp)
439439
desc->base3 = segp->base >> 32;
440440
}
441441

442-
static void kvm_seg_set_kernel_code_64bit(uint16_t selector, struct kvm_segment *segp)
442+
static void kvm_seg_set_kernel_code_64bit(struct kvm_segment *segp)
443443
{
444444
memset(segp, 0, sizeof(*segp));
445-
segp->selector = selector;
445+
segp->selector = KERNEL_CS;
446446
segp->limit = 0xFFFFFFFFu;
447447
segp->s = 0x1; /* kTypeCodeData */
448448
segp->type = 0x08 | 0x01 | 0x02; /* kFlagCode | kFlagCodeAccessed
@@ -453,10 +453,10 @@ static void kvm_seg_set_kernel_code_64bit(uint16_t selector, struct kvm_segment
453453
segp->present = 1;
454454
}
455455

456-
static void kvm_seg_set_kernel_data_64bit(uint16_t selector, struct kvm_segment *segp)
456+
static void kvm_seg_set_kernel_data_64bit(struct kvm_segment *segp)
457457
{
458458
memset(segp, 0, sizeof(*segp));
459-
segp->selector = selector;
459+
segp->selector = KERNEL_DS;
460460
segp->limit = 0xFFFFFFFFu;
461461
segp->s = 0x1; /* kTypeCodeData */
462462
segp->type = 0x00 | 0x01 | 0x02; /* kFlagData | kFlagDataAccessed
@@ -481,13 +481,12 @@ vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
481481
return vm_untag_gpa(vm, PTE_GET_PA(*pte)) | (gva & ~HUGEPAGE_MASK(level));
482482
}
483483

484-
static void kvm_seg_set_tss_64bit(vm_vaddr_t base, struct kvm_segment *segp,
485-
int selector)
484+
static void kvm_seg_set_tss_64bit(vm_vaddr_t base, struct kvm_segment *segp)
486485
{
487486
memset(segp, 0, sizeof(*segp));
488487
segp->base = base;
489488
segp->limit = 0x67;
490-
segp->selector = selector;
489+
segp->selector = KERNEL_TSS;
491490
segp->type = 0xb;
492491
segp->present = 1;
493492
}
@@ -511,11 +510,11 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
511510
sregs.efer |= (EFER_LME | EFER_LMA | EFER_NX);
512511

513512
kvm_seg_set_unusable(&sregs.ldt);
514-
kvm_seg_set_kernel_code_64bit(KERNEL_CS, &sregs.cs);
515-
kvm_seg_set_kernel_data_64bit(KERNEL_DS, &sregs.ds);
516-
kvm_seg_set_kernel_data_64bit(KERNEL_DS, &sregs.es);
517-
kvm_seg_set_kernel_data_64bit(KERNEL_DS, &sregs.gs);
518-
kvm_seg_set_tss_64bit(vm->arch.tss, &sregs.tr, KERNEL_TSS);
513+
kvm_seg_set_kernel_code_64bit(&sregs.cs);
514+
kvm_seg_set_kernel_data_64bit(&sregs.ds);
515+
kvm_seg_set_kernel_data_64bit(&sregs.es);
516+
kvm_seg_set_kernel_data_64bit(&sregs.gs);
517+
kvm_seg_set_tss_64bit(vm->arch.tss, &sregs.tr);
519518

520519
sregs.cr3 = vm->pgd;
521520
vcpu_sregs_set(vcpu, &sregs);
@@ -589,13 +588,13 @@ static void vm_init_descriptor_tables(struct kvm_vm *vm)
589588

590589
*(vm_vaddr_t *)addr_gva2hva(vm, (vm_vaddr_t)(&exception_handlers)) = vm->handlers;
591590

592-
kvm_seg_set_kernel_code_64bit(KERNEL_CS, &seg);
591+
kvm_seg_set_kernel_code_64bit(&seg);
593592
kvm_seg_fill_gdt_64bit(vm, &seg);
594593

595-
kvm_seg_set_kernel_data_64bit(KERNEL_DS, &seg);
594+
kvm_seg_set_kernel_data_64bit(&seg);
596595
kvm_seg_fill_gdt_64bit(vm, &seg);
597596

598-
kvm_seg_set_tss_64bit(vm->arch.tss, &seg, KERNEL_TSS);
597+
kvm_seg_set_tss_64bit(vm->arch.tss, &seg);
599598
kvm_seg_fill_gdt_64bit(vm, &seg);
600599
}
601600

0 commit comments

Comments
 (0)