@@ -745,7 +745,7 @@ bool tdx_interrupt_allowed(struct kvm_vcpu *vcpu)
745
745
!to_tdx (vcpu )-> vp_enter_args .r12 ;
746
746
}
747
747
748
- bool tdx_protected_apic_has_interrupt (struct kvm_vcpu * vcpu )
748
+ static bool tdx_protected_apic_has_interrupt (struct kvm_vcpu * vcpu )
749
749
{
750
750
u64 vcpu_state_details ;
751
751
@@ -1642,8 +1642,8 @@ static int tdx_mem_page_record_premap_cnt(struct kvm *kvm, gfn_t gfn,
1642
1642
return 0 ;
1643
1643
}
1644
1644
1645
- int tdx_sept_set_private_spte (struct kvm * kvm , gfn_t gfn ,
1646
- enum pg_level level , kvm_pfn_t pfn )
1645
+ static int tdx_sept_set_private_spte (struct kvm * kvm , gfn_t gfn ,
1646
+ enum pg_level level , kvm_pfn_t pfn )
1647
1647
{
1648
1648
struct kvm_tdx * kvm_tdx = to_kvm_tdx (kvm );
1649
1649
struct page * page = pfn_to_page (pfn );
@@ -1723,8 +1723,8 @@ static int tdx_sept_drop_private_spte(struct kvm *kvm, gfn_t gfn,
1723
1723
return 0 ;
1724
1724
}
1725
1725
1726
- int tdx_sept_link_private_spt (struct kvm * kvm , gfn_t gfn ,
1727
- enum pg_level level , void * private_spt )
1726
+ static int tdx_sept_link_private_spt (struct kvm * kvm , gfn_t gfn ,
1727
+ enum pg_level level , void * private_spt )
1728
1728
{
1729
1729
int tdx_level = pg_level_to_tdx_sept_level (level );
1730
1730
gpa_t gpa = gfn_to_gpa (gfn );
@@ -1859,8 +1859,8 @@ static void tdx_track(struct kvm *kvm)
1859
1859
kvm_make_all_cpus_request (kvm , KVM_REQ_OUTSIDE_GUEST_MODE );
1860
1860
}
1861
1861
1862
- int tdx_sept_free_private_spt (struct kvm * kvm , gfn_t gfn ,
1863
- enum pg_level level , void * private_spt )
1862
+ static int tdx_sept_free_private_spt (struct kvm * kvm , gfn_t gfn ,
1863
+ enum pg_level level , void * private_spt )
1864
1864
{
1865
1865
struct kvm_tdx * kvm_tdx = to_kvm_tdx (kvm );
1866
1866
@@ -1882,8 +1882,8 @@ int tdx_sept_free_private_spt(struct kvm *kvm, gfn_t gfn,
1882
1882
return tdx_reclaim_page (virt_to_page (private_spt ));
1883
1883
}
1884
1884
1885
- int tdx_sept_remove_private_spte (struct kvm * kvm , gfn_t gfn ,
1886
- enum pg_level level , kvm_pfn_t pfn )
1885
+ static int tdx_sept_remove_private_spte (struct kvm * kvm , gfn_t gfn ,
1886
+ enum pg_level level , kvm_pfn_t pfn )
1887
1887
{
1888
1888
struct page * page = pfn_to_page (pfn );
1889
1889
int ret ;
@@ -3606,10 +3606,14 @@ int __init tdx_bringup(void)
3606
3606
r = __tdx_bringup ();
3607
3607
if (r ) {
3608
3608
/*
3609
- * Disable TDX only but don't fail to load module if
3610
- * the TDX module could not be loaded. No need to print
3611
- * message saying "module is not loaded" because it was
3612
- * printed when the first SEAMCALL failed.
3609
+ * Disable TDX only but don't fail to load module if the TDX
3610
+ * module could not be loaded. No need to print message saying
3611
+ * "module is not loaded" because it was printed when the first
3612
+ * SEAMCALL failed. Don't bother unwinding the S-EPT hooks or
3613
+ * vm_size, as kvm_x86_ops have already been finalized (and are
3614
+ * intentionally not exported). The S-EPT code is unreachable,
3615
+ * and allocating a few more bytes per VM in a should-be-rare
3616
+ * failure scenario is a non-issue.
3613
3617
*/
3614
3618
if (r == - ENODEV )
3615
3619
goto success_disable_tdx ;
@@ -3623,3 +3627,18 @@ int __init tdx_bringup(void)
3623
3627
enable_tdx = 0 ;
3624
3628
return 0 ;
3625
3629
}
3630
+
3631
+ void __init tdx_hardware_setup (void )
3632
+ {
3633
+ /*
3634
+ * Note, if the TDX module can't be loaded, KVM TDX support will be
3635
+ * disabled but KVM will continue loading (see tdx_bringup()).
3636
+ */
3637
+ vt_x86_ops .vm_size = max_t (unsigned int , vt_x86_ops .vm_size , sizeof (struct kvm_tdx ));
3638
+
3639
+ vt_x86_ops .link_external_spt = tdx_sept_link_private_spt ;
3640
+ vt_x86_ops .set_external_spte = tdx_sept_set_private_spte ;
3641
+ vt_x86_ops .free_external_spt = tdx_sept_free_private_spt ;
3642
+ vt_x86_ops .remove_external_spte = tdx_sept_remove_private_spte ;
3643
+ vt_x86_ops .protected_apic_has_interrupt = tdx_protected_apic_has_interrupt ;
3644
+ }
0 commit comments