[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v1] x86/nestedsvm: honour L2's EFLAGS.IF when L1 clears V_INTR_MASKING


  • To: Chunjie Zhu (朱春杰) <chunjie.zhu@xxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
  • Date: Thu, 29 Oct 2026 17:20:50 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GbT830pLYAscc7TFwa+jWCqOWo8Y9+8zwFKojsnqdxw=; b=pFZAznbmwBjQonEm7MyhWNiWPs0yVgiyvPJwXG5QoAKJdSOeF8EPkZSAqcTjM/mFUpXgQkYupIOE7kruguD8bqsNvXV6K9xS4TuMzCGS3kHzw+/U8R9ScwhVlGNMxEsCzFU75ITEGuROjjTLjGrWzftQRPZdAika/LTIeYBB8XXuhadw6EMowPTsgpHUc8xuGQGRGgLhS1jM1MNPAEGU6w2DUR+J8zD+AT7Z++X88guyGI1hTZANTQgWKl1z8FeMTHBumG6dyEmd5HRpIjIyKOFbm6FvoXtprGml3C6O7YN5PAAccdq8amcNDolwqw3UcQ6UWcRmWsXZEE7OHrgAFw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KQH+prNia2ZfWTcfEvdW8abTbWH4S10KHVNDOlqdckZhXE9vw0r894zqsdyKybW/6elaIK66yDm3cDCJY4H/rxz/cyi0Kn0IeCojBxroqnfjdN1fmV7cmJWqU9hcrWhfSfRd+3t8bFkNChZAKr0GJJasN9jCG+hiSAIy3z17MMfrsl6UlhGP7OZbA5QUQZgOXTpPYXuuv/p33xfZTb2+DX/GvYWllOT8I52xYI3hxjuFPbP+qzjjqmCF8bZJFNkx+yXVtEE73/MHFzBP6Tprk/fQucz8fpvkCa7HOxIBxE8iodT5SXuAlpIRe4Rpvg78LZuIA0U9Nb1AprCgTPXsnw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: "jbeulich@xxxxxxxx" <jbeulich@xxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, "roger@xxxxxxxxxxxxxx" <roger@xxxxxxxxxxxxxx>, "jason.andryuk@xxxxxxx" <jason.andryuk@xxxxxxx>, "teddy.astie@xxxxxxxxxx" <teddy.astie@xxxxxxxxxx>
  • Delivery-date: Thu, 29 Oct 2026 17:21:01 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Msip_labels:
  • Thread-index: AQHdXVVTRd+tP+KIck2rlzcwmbytZrcU2N01
  • Thread-topic: [PATCH v1] x86/nestedsvm: honour L2's EFLAGS.IF when L1 clears V_INTR_MASKING

> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of 
> chunjie.zhu@xxxxxxxxxx <chunjie.zhu@xxxxxxxxxx>
> Sent: Friday, October 16, 2026 11:00
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx <xen-devel@xxxxxxxxxxxxxxxxxxxx>
> Cc: jbeulich@xxxxxxxx <jbeulich@xxxxxxxx>; Andrew Cooper 
> <andrew.cooper3@xxxxxxxxxx>; roger@xxxxxxxxxxxxxx <roger@xxxxxxxxxxxxxx>; 
> jason.andryuk@xxxxxxx <jason.andryuk@xxxxxxx>; teddy.astie@xxxxxxxxxx 
> <teddy.astie@xxxxxxxxxx>; Chunjie Zhu (朱春杰) <chunjie.zhu@xxxxxxxxxx>
> Subject: [PATCH v1] x86/nestedsvm: honour L2's EFLAGS.IF when L1 clears 
> V_INTR_MASKING
>
>
> From: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>
>
> L0 always runs L2 with V_INTR_MASKING set, so a physical interrupt exits to
> L0 regardless of L2's EFLAGS.IF.  nsvm_intr_blocked() only blocks when L1
> requested V_INTR_MASKING=1 and L1's IF was clear.  With V_INTR_MASKING=0
> and L2's IF clear, nestedsvm_vcpu_interrupt() would still inject
> VMEXIT(INTR) into L1.
>
> Per the APM (vol.2 rev 3.44 "Physical Interrupt Masking in EFLAGS"), with
> V_INTR_MASKING=0 L2's IF masks physical interrupts, and a masked interrupt
> must stay pending.  Return NSVM_INTR_MASKED for external interrupts in
> that case.
>
> Signed-off-by: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>
> ---
>  xen/arch/x86/hvm/svm/nestedsvm.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c 
> b/xen/arch/x86/hvm/svm/nestedsvm.c
> index faacfe007832..a419b47eb5f6 100644
> --- a/xen/arch/x86/hvm/svm/nestedsvm.c
> +++ b/xen/arch/x86/hvm/svm/nestedsvm.c
> @@ -1514,6 +1514,17 @@ nestedsvm_vcpu_interrupt(struct vcpu *v, const struct 
> hvm_intack intack)
>      case hvm_intsrc_pic:
>      case hvm_intsrc_lapic:
>      case hvm_intsrc_vector:
> +        /*
> +         * Without V_INTR_MASKING, L2's EFLAGS.IF masks physical interrupts
> +         * (APM vol.2 rev 3.44 "Physical Interrupt Masking in EFLAGS").  L0
> +         * always runs L2 with V_INTR_MASKING set, so the interrupt would
> +         * otherwise exit to L0 and be forwarded to L1 even with L2's IF
> +         * clear.  Leave it pending instead.
> +         */
> +        if ( !vcpu_nestedsvm(v).ns_hostflags.fields.vintrmask &&
> +             !(guest_cpu_user_regs()->eflags & X86_EFLAGS_IF) )
> +            return NSVM_INTR_MASKED;
> +
>          exitcode = VMEXIT_INTR;
>          exitinfo2 = intack.vector;
>          break;
> --
> 2.34.1
>

Would it not make sense to check this in nsvm_intr_blocked() instead?
There is already a similar (inverse) check there so extending that seems
more logical to me.

E.g. something like this (untested):

diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index b192be0d56b1..8bded8b9a9c2 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1213,8 +1213,9 @@ enum hvm_intblk cf_check nsvm_intr_blocked(struct vcpu *v)
     {
         struct vmcb_struct *n2vmcb = nv->nv_n2vmcx;

-        if ( svm->ns_hostflags.fields.vintrmask &&
-             !svm->ns_hostflags.fields.rflagsif )
+        if ( svm->ns_hostflags.fields.vintrmask ?
+             !svm->ns_hostflags.fields.rflagsif :
+             !(guest_cpu_user_regs()->eflags & X86_EFLAGS_IF) )
             return hvm_intblk_rflags_ie;

         /* when l1 guest passes its devices through to the l2 guest

Ross

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.