@@ -657,63 +657,61 @@ impl HardwareIsolatedBacking for TdxBacked {
657657 ) ;
658658 }
659659
660- fn handle_cross_vtl_interrupts (
660+ fn is_interrupt_pending (
661661 this : & mut UhProcessor < ' _ , Self > ,
662+ vtl : GuestVtl ,
663+ check_rflags : bool ,
662664 dev : & impl CpuIo ,
663- ) -> Result < bool , UhRunVpError > {
664- this. cvm_handle_cross_vtl_interrupts ( |this, vtl, check_rflags| {
665- let backing_vtl = & this. backing . vtls [ vtl] ;
666- if backing_vtl. interruption_information . valid ( )
667- && backing_vtl. interruption_information . interruption_type ( ) == INTERRUPT_TYPE_NMI
668- {
669- return true ;
670- }
665+ ) -> bool {
666+ let backing_vtl = & this. backing . vtls [ vtl] ;
667+ if backing_vtl. interruption_information . valid ( )
668+ && backing_vtl. interruption_information . interruption_type ( ) == INTERRUPT_TYPE_NMI
669+ {
670+ return true ;
671+ }
671672
672- let ( vector, ppr) = if this. backing . cvm . lapics [ vtl] . lapic . is_offloaded ( ) {
673- let vector = backing_vtl. private_regs . rvi ;
674- let ppr = std:: cmp:: max (
675- backing_vtl. private_regs . svi . into ( ) ,
676- this. runner . tdx_apic_page ( vtl) . tpr . value ,
677- ) ;
678- ( vector, ppr)
679- } else {
680- let lapic = & mut this. backing . cvm . lapics [ vtl] . lapic ;
681- let vector = lapic. next_irr ( ) . unwrap_or ( 0 ) ;
682- let ppr = lapic
683- . access ( & mut TdxApicClient {
684- partition : this. partition ,
685- apic_page : this. runner . tdx_apic_page_mut ( vtl) ,
686- dev,
687- vmtime : & this. vmtime ,
688- vtl,
689- } )
690- . get_ppr ( ) ;
691- ( vector, ppr)
692- } ;
693- let vector_priority = ( vector as u32 ) >> 4 ;
694- let ppr_priority = ppr >> 4 ;
673+ let ( vector, ppr) = if this. backing . cvm . lapics [ vtl] . lapic . is_offloaded ( ) {
674+ let vector = backing_vtl. private_regs . rvi ;
675+ let ppr = std:: cmp:: max (
676+ backing_vtl. private_regs . svi . into ( ) ,
677+ this. runner . tdx_apic_page ( vtl) . tpr . value ,
678+ ) ;
679+ ( vector, ppr)
680+ } else {
681+ let lapic = & mut this. backing . cvm . lapics [ vtl] . lapic ;
682+ let vector = lapic. next_irr ( ) . unwrap_or ( 0 ) ;
683+ let ppr = lapic
684+ . access ( & mut TdxApicClient {
685+ partition : this. partition ,
686+ apic_page : this. runner . tdx_apic_page_mut ( vtl) ,
687+ dev,
688+ vmtime : & this. vmtime ,
689+ vtl,
690+ } )
691+ . get_ppr ( ) ;
692+ ( vector, ppr)
693+ } ;
694+ let vector_priority = ( vector as u32 ) >> 4 ;
695+ let ppr_priority = ppr >> 4 ;
695696
696- if vector_priority <= ppr_priority {
697- return false ;
698- }
697+ if vector_priority <= ppr_priority {
698+ return false ;
699+ }
699700
700- if check_rflags
701- && !RFlags :: from_bits ( backing_vtl. private_regs . rflags ) . interrupt_enable ( )
702- {
703- return false ;
704- }
701+ if check_rflags && !RFlags :: from_bits ( backing_vtl. private_regs . rflags ) . interrupt_enable ( ) {
702+ return false ;
703+ }
705704
706- let interruptibility: Interruptibility = this
707- . runner
708- . read_vmcs32 ( vtl, VmcsField :: VMX_VMCS_GUEST_INTERRUPTIBILITY )
709- . into ( ) ;
705+ let interruptibility: Interruptibility = this
706+ . runner
707+ . read_vmcs32 ( vtl, VmcsField :: VMX_VMCS_GUEST_INTERRUPTIBILITY )
708+ . into ( ) ;
710709
711- if interruptibility. blocked_by_sti ( ) || interruptibility. blocked_by_movss ( ) {
712- return false ;
713- }
710+ if interruptibility. blocked_by_sti ( ) || interruptibility. blocked_by_movss ( ) {
711+ return false ;
712+ }
714713
715- true
716- } )
714+ true
717715 }
718716
719717 fn untrusted_synic_mut ( & mut self ) -> Option < & mut ProcessorSynic > {
0 commit comments