@@ -439,24 +439,7 @@ static void kvm_seg_fill_gdt_64bit(struct kvm_vm *vm, struct kvm_segment *segp)
439
439
desc -> base3 = segp -> base >> 32 ;
440
440
}
441
441
442
-
443
- /*
444
- * Set Long Mode Flat Kernel Code Segment
445
- *
446
- * Input Args:
447
- * vm - VM whose GDT is being filled, or NULL to only write segp
448
- * selector - selector value
449
- *
450
- * Output Args:
451
- * segp - Pointer to KVM segment
452
- *
453
- * Return: None
454
- *
455
- * Sets up the KVM segment pointed to by @segp, to be a code segment
456
- * with the selector value given by @selector.
457
- */
458
- static void kvm_seg_set_kernel_code_64bit (struct kvm_vm * vm , uint16_t selector ,
459
- struct kvm_segment * segp )
442
+ static void kvm_seg_set_kernel_code_64bit (uint16_t selector , struct kvm_segment * segp )
460
443
{
461
444
memset (segp , 0 , sizeof (* segp ));
462
445
segp -> selector = selector ;
@@ -468,27 +451,9 @@ static void kvm_seg_set_kernel_code_64bit(struct kvm_vm *vm, uint16_t selector,
468
451
segp -> g = true;
469
452
segp -> l = true;
470
453
segp -> present = 1 ;
471
- if (vm )
472
- kvm_seg_fill_gdt_64bit (vm , segp );
473
454
}
474
455
475
- /*
476
- * Set Long Mode Flat Kernel Data Segment
477
- *
478
- * Input Args:
479
- * vm - VM whose GDT is being filled, or NULL to only write segp
480
- * selector - selector value
481
- *
482
- * Output Args:
483
- * segp - Pointer to KVM segment
484
- *
485
- * Return: None
486
- *
487
- * Sets up the KVM segment pointed to by @segp, to be a data segment
488
- * with the selector value given by @selector.
489
- */
490
- static void kvm_seg_set_kernel_data_64bit (struct kvm_vm * vm , uint16_t selector ,
491
- struct kvm_segment * segp )
456
+ static void kvm_seg_set_kernel_data_64bit (uint16_t selector , struct kvm_segment * segp )
492
457
{
493
458
memset (segp , 0 , sizeof (* segp ));
494
459
segp -> selector = selector ;
@@ -499,8 +464,6 @@ static void kvm_seg_set_kernel_data_64bit(struct kvm_vm *vm, uint16_t selector,
499
464
*/
500
465
segp -> g = true;
501
466
segp -> present = true;
502
- if (vm )
503
- kvm_seg_fill_gdt_64bit (vm , segp );
504
467
}
505
468
506
469
vm_paddr_t addr_arch_gva2gpa (struct kvm_vm * vm , vm_vaddr_t gva )
@@ -518,16 +481,15 @@ vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
518
481
return vm_untag_gpa (vm , PTE_GET_PA (* pte )) | (gva & ~HUGEPAGE_MASK (level ));
519
482
}
520
483
521
- static void kvm_setup_tss_64bit ( struct kvm_vm * vm , struct kvm_segment * segp ,
522
- int selector )
484
+ static void kvm_seg_set_tss_64bit ( vm_vaddr_t base , struct kvm_segment * segp ,
485
+ int selector )
523
486
{
524
487
memset (segp , 0 , sizeof (* segp ));
525
- segp -> base = vm -> arch . tss ;
488
+ segp -> base = base ;
526
489
segp -> limit = 0x67 ;
527
490
segp -> selector = selector ;
528
491
segp -> type = 0xb ;
529
492
segp -> present = 1 ;
530
- kvm_seg_fill_gdt_64bit (vm , segp );
531
493
}
532
494
533
495
static void vcpu_init_sregs (struct kvm_vm * vm , struct kvm_vcpu * vcpu )
@@ -549,11 +511,11 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
549
511
sregs .efer |= (EFER_LME | EFER_LMA | EFER_NX );
550
512
551
513
kvm_seg_set_unusable (& sregs .ldt );
552
- kvm_seg_set_kernel_code_64bit (vm , KERNEL_CS , & sregs .cs );
553
- kvm_seg_set_kernel_data_64bit (vm , KERNEL_DS , & sregs .ds );
554
- kvm_seg_set_kernel_data_64bit (vm , KERNEL_DS , & sregs .es );
555
- kvm_seg_set_kernel_data_64bit (NULL , KERNEL_DS , & sregs .gs );
556
- kvm_setup_tss_64bit (vm , & sregs .tr , KERNEL_TSS );
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 );
557
519
558
520
sregs .cr3 = vm -> pgd ;
559
521
vcpu_sregs_set (vcpu , & sregs );
@@ -613,6 +575,7 @@ void route_exception(struct ex_regs *regs)
613
575
static void vm_init_descriptor_tables (struct kvm_vm * vm )
614
576
{
615
577
extern void * idt_handlers ;
578
+ struct kvm_segment seg ;
616
579
int i ;
617
580
618
581
vm -> arch .gdt = __vm_vaddr_alloc_page (vm , MEM_REGION_DATA );
@@ -625,6 +588,15 @@ static void vm_init_descriptor_tables(struct kvm_vm *vm)
625
588
set_idt_entry (vm , i , (unsigned long )(& idt_handlers )[i ], 0 , KERNEL_CS );
626
589
627
590
* (vm_vaddr_t * )addr_gva2hva (vm , (vm_vaddr_t )(& exception_handlers )) = vm -> handlers ;
591
+
592
+ kvm_seg_set_kernel_code_64bit (KERNEL_CS , & seg );
593
+ kvm_seg_fill_gdt_64bit (vm , & seg );
594
+
595
+ kvm_seg_set_kernel_data_64bit (KERNEL_DS , & seg );
596
+ kvm_seg_fill_gdt_64bit (vm , & seg );
597
+
598
+ kvm_seg_set_tss_64bit (vm -> arch .tss , & seg , KERNEL_TSS );
599
+ kvm_seg_fill_gdt_64bit (vm , & seg );
628
600
}
629
601
630
602
void vm_install_exception_handler (struct kvm_vm * vm , int vector ,
0 commit comments