* [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling [not found] <cover.1780584300.git.kas@kernel.org> @ 2026-06-04 14:46 ` Kiryl Shutsemau (Meta) 2026-06-05 7:08 ` Binbin Wu 2026-07-01 0:06 ` Edgecombe, Rick P 2026-06-04 14:47 ` [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O Kiryl Shutsemau (Meta) 1 sibling, 2 replies; 6+ messages in thread From: Kiryl Shutsemau (Meta) @ 2026-06-04 14:46 UTC (permalink / raw) To: tglx, mingo, bp, dave.hansen Cc: seanjc, pbonzini, sathyanarayanan.kuppuswamy, kai.huang, xiaoyao.li, binbin.wu, rick.p.edgecombe, david.laight.linux, ak, djbw, tsyrulnikov.borys, x86, kvm, linux-coco, linux-kernel, Kiryl Shutsemau (Meta), stable handle_in() and handle_out() in arch/x86/coco/tdx/tdx.c use: u64 mask = GENMASK(BITS_PER_BYTE * size, 0); GENMASK(h, l) includes bit h. For size=1 (INB), this produces GENMASK(8, 0) = 0x1FF (9 bits) instead of GENMASK(7, 0) = 0xFF (8 bits). The mask is one bit too wide for all I/O sizes. Fix the mask calculation. Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org> Reviewed-by: Kai Huang <kai.huang@intel.com> Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Cc: stable@vger.kernel.org --- arch/x86/coco/tdx/tdx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 186915a17c50..65119362f9a2 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -693,7 +693,7 @@ static bool handle_in(struct pt_regs *regs, int size, int port) .r13 = PORT_READ, .r14 = port, }; - u64 mask = GENMASK(BITS_PER_BYTE * size, 0); + u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); bool success; /* @@ -713,7 +713,7 @@ static bool handle_in(struct pt_regs *regs, int size, int port) static bool handle_out(struct pt_regs *regs, int size, int port) { - u64 mask = GENMASK(BITS_PER_BYTE * size, 0); + u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); /* * Emulate the I/O write via hypercall. More info about ABI can be found -- 2.54.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling 2026-06-04 14:46 ` [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling Kiryl Shutsemau (Meta) @ 2026-06-05 7:08 ` Binbin Wu 2026-07-01 0:06 ` Edgecombe, Rick P 1 sibling, 0 replies; 6+ messages in thread From: Binbin Wu @ 2026-06-05 7:08 UTC (permalink / raw) To: Kiryl Shutsemau (Meta) Cc: tglx, mingo, bp, dave.hansen, seanjc, pbonzini, sathyanarayanan.kuppuswamy, kai.huang, xiaoyao.li, rick.p.edgecombe, david.laight.linux, ak, djbw, tsyrulnikov.borys, x86, kvm, linux-coco, linux-kernel, stable On 6/4/2026 10:46 PM, Kiryl Shutsemau (Meta) wrote: > handle_in() and handle_out() in arch/x86/coco/tdx/tdx.c use: > > u64 mask = GENMASK(BITS_PER_BYTE * size, 0); > > GENMASK(h, l) includes bit h. For size=1 (INB), this produces > GENMASK(8, 0) = 0x1FF (9 bits) instead of GENMASK(7, 0) = 0xFF (8 > bits). The mask is one bit too wide for all I/O sizes. > > Fix the mask calculation. > > Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") > Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> > Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ > Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org> > Reviewed-by: Kai Huang <kai.huang@intel.com> > Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Cc: stable@vger.kernel.org Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com> > --- > arch/x86/coco/tdx/tdx.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c > index 186915a17c50..65119362f9a2 100644 > --- a/arch/x86/coco/tdx/tdx.c > +++ b/arch/x86/coco/tdx/tdx.c > @@ -693,7 +693,7 @@ static bool handle_in(struct pt_regs *regs, int size, int port) > .r13 = PORT_READ, > .r14 = port, > }; > - u64 mask = GENMASK(BITS_PER_BYTE * size, 0); > + u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); > bool success; > > /* > @@ -713,7 +713,7 @@ static bool handle_in(struct pt_regs *regs, int size, int port) > > static bool handle_out(struct pt_regs *regs, int size, int port) > { > - u64 mask = GENMASK(BITS_PER_BYTE * size, 0); > + u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); > > /* > * Emulate the I/O write via hypercall. More info about ABI can be found ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling 2026-06-04 14:46 ` [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling Kiryl Shutsemau (Meta) 2026-06-05 7:08 ` Binbin Wu @ 2026-07-01 0:06 ` Edgecombe, Rick P 1 sibling, 0 replies; 6+ messages in thread From: Edgecombe, Rick P @ 2026-07-01 0:06 UTC (permalink / raw) To: mingo@redhat.com, kas@kernel.org, tglx@kernel.org, bp@alien8.de, dave.hansen@linux.intel.com Cc: linux-kernel@vger.kernel.org, ak@linux.intel.com, seanjc@google.com, binbin.wu@linux.intel.com, stable@vger.kernel.org, Li, Xiaoyao, sathyanarayanan.kuppuswamy@linux.intel.com, david.laight.linux@gmail.com, Huang, Kai, pbonzini@redhat.com, kvm@vger.kernel.org, tsyrulnikov.borys@gmail.com, djbw@kernel.org, linux-coco@lists.linux.dev, x86@kernel.org On Thu, 2026-06-04 at 15:46 +0100, Kiryl Shutsemau (Meta) wrote: > handle_in() and handle_out() in arch/x86/coco/tdx/tdx.c use: > > u64 mask = GENMASK(BITS_PER_BYTE * size, 0); > > GENMASK(h, l) includes bit h. For size=1 (INB), this produces > GENMASK(8, 0) = 0x1FF (9 bits) instead of GENMASK(7, 0) = 0xFF (8 > bits). The mask is one bit too wide for all I/O sizes. > > Fix the mask calculation. > > Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") > Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> > Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ > Signed-off-by: Kiryl Shutsemau (Meta) <kas@kernel.org> > Reviewed-by: Kai Huang <kai.huang@intel.com> > Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Cc: stable@vger.kernel.org Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O [not found] <cover.1780584300.git.kas@kernel.org> 2026-06-04 14:46 ` [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling Kiryl Shutsemau (Meta) @ 2026-06-04 14:47 ` Kiryl Shutsemau (Meta) 2026-06-05 7:10 ` Binbin Wu 1 sibling, 1 reply; 6+ messages in thread From: Kiryl Shutsemau (Meta) @ 2026-06-04 14:47 UTC (permalink / raw) To: tglx, mingo, bp, dave.hansen Cc: seanjc, pbonzini, sathyanarayanan.kuppuswamy, kai.huang, xiaoyao.li, binbin.wu, rick.p.edgecombe, david.laight.linux, ak, djbw, tsyrulnikov.borys, x86, kvm, linux-coco, linux-kernel, Kiryl Shutsemau (Meta), stable According to x86 architecture rules, 32-bit operations zero-extend the result to 64 bits. The current implementation of handle_in() only masks the lower 32 bits, which preserves the upper 32 bits of RAX when a 32-bit port IN instruction is emulated. Use insn_assign_reg() to write the result back into RAX with proper partial-register-write semantics: 1- and 2-byte forms leave the upper bits untouched, the 4-byte form zero-extends to the full register. Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ Signed-off-by: Kiryl Shutsemau <kas@kernel.org> Cc: stable@vger.kernel.org --- arch/x86/coco/tdx/tdx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c index 65119362f9a2..41cc23cc63dd 100644 --- a/arch/x86/coco/tdx/tdx.c +++ b/arch/x86/coco/tdx/tdx.c @@ -693,8 +693,8 @@ static bool handle_in(struct pt_regs *regs, int size, int port) .r13 = PORT_READ, .r14 = port, }; - u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); bool success; + u64 val; /* * Emulate the I/O read via hypercall. More info about ABI can be found @@ -702,11 +702,9 @@ static bool handle_in(struct pt_regs *regs, int size, int port) * "TDG.VP.VMCALL<Instruction.IO>". */ success = !__tdx_hypercall(&args); + val = success ? args.r11 : 0; - /* Update part of the register affected by the emulated instruction */ - regs->ax &= ~mask; - if (success) - regs->ax |= args.r11 & mask; + insn_assign_reg(®s->ax, val, size); return success; } -- 2.54.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O 2026-06-04 14:47 ` [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O Kiryl Shutsemau (Meta) @ 2026-06-05 7:10 ` Binbin Wu 2026-06-05 11:57 ` Kiryl Shutsemau 0 siblings, 1 reply; 6+ messages in thread From: Binbin Wu @ 2026-06-05 7:10 UTC (permalink / raw) To: Kiryl Shutsemau (Meta) Cc: tglx, mingo, bp, dave.hansen, seanjc, pbonzini, sathyanarayanan.kuppuswamy, kai.huang, xiaoyao.li, rick.p.edgecombe, david.laight.linux, ak, djbw, tsyrulnikov.borys, x86, kvm, linux-coco, linux-kernel, stable On 6/4/2026 10:47 PM, Kiryl Shutsemau (Meta) wrote: > According to x86 architecture rules, 32-bit operations zero-extend the > result to 64 bits. The current implementation of handle_in() only masks > the lower 32 bits, which preserves the upper 32 bits of RAX when a > 32-bit port IN instruction is emulated. > > Use insn_assign_reg() to write the result back into RAX with proper > partial-register-write semantics: 1- and 2-byte forms leave the upper > bits untouched, the 4-byte form zero-extends to the full register. > > Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") > Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> > Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ > Signed-off-by: Kiryl Shutsemau <kas@kernel.org> > Cc: stable@vger.kernel.org I think the concern sashiko commented in patch 2 is valid. But for this patch itself, Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com> > --- > arch/x86/coco/tdx/tdx.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c > index 65119362f9a2..41cc23cc63dd 100644 > --- a/arch/x86/coco/tdx/tdx.c > +++ b/arch/x86/coco/tdx/tdx.c > @@ -693,8 +693,8 @@ static bool handle_in(struct pt_regs *regs, int size, int port) > .r13 = PORT_READ, > .r14 = port, > }; > - u64 mask = GENMASK(BITS_PER_BYTE * size - 1, 0); > bool success; > + u64 val; > > /* > * Emulate the I/O read via hypercall. More info about ABI can be found > @@ -702,11 +702,9 @@ static bool handle_in(struct pt_regs *regs, int size, int port) > * "TDG.VP.VMCALL<Instruction.IO>". > */ > success = !__tdx_hypercall(&args); > + val = success ? args.r11 : 0; > > - /* Update part of the register affected by the emulated instruction */ > - regs->ax &= ~mask; > - if (success) > - regs->ax |= args.r11 & mask; > + insn_assign_reg(®s->ax, val, size); > > return success; > } ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O 2026-06-05 7:10 ` Binbin Wu @ 2026-06-05 11:57 ` Kiryl Shutsemau 0 siblings, 0 replies; 6+ messages in thread From: Kiryl Shutsemau @ 2026-06-05 11:57 UTC (permalink / raw) To: dave.hansen, Binbin Wu Cc: tglx, mingo, bp, seanjc, pbonzini, sathyanarayanan.kuppuswamy, kai.huang, xiaoyao.li, rick.p.edgecombe, david.laight.linux, ak, djbw, tsyrulnikov.borys, x86, kvm, linux-coco, linux-kernel, stable On Fri, Jun 05, 2026 at 03:10:39PM +0800, Binbin Wu wrote: > > > On 6/4/2026 10:47 PM, Kiryl Shutsemau (Meta) wrote: > > According to x86 architecture rules, 32-bit operations zero-extend the > > result to 64 bits. The current implementation of handle_in() only masks > > the lower 32 bits, which preserves the upper 32 bits of RAX when a > > 32-bit port IN instruction is emulated. > > > > Use insn_assign_reg() to write the result back into RAX with proper > > partial-register-write semantics: 1- and 2-byte forms leave the upper > > bits untouched, the 4-byte form zero-extends to the full register. > > > > Fixes: 03149948832a ("x86/tdx: Port I/O: Add runtime hypercalls") > > Reported-by: Borys Tsyrulnikov <tsyrulnikov.borys@gmail.com> > > Link: https://lore.kernel.org/all/CAKw_Dz96rfSQc6Rn+9QBcUFHhmkK+9zu+P=bxowfZwxrATCBRg@mail.gmail.com/ > > Signed-off-by: Kiryl Shutsemau <kas@kernel.org> > > Cc: stable@vger.kernel.org > > I think the concern sashiko commented in patch 2 is valid. Yeah. I guess I'll just use the KVM implementation verbatim. Dave, any objections? -- Kiryl Shutsemau / Kirill A. Shutemov ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-01 0:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <cover.1780584300.git.kas@kernel.org>
2026-06-04 14:46 ` [PATCH v4 1/3] x86/tdx: Fix off-by-one in port I/O handling Kiryl Shutsemau (Meta)
2026-06-05 7:08 ` Binbin Wu
2026-07-01 0:06 ` Edgecombe, Rick P
2026-06-04 14:47 ` [PATCH v4 3/3] x86/tdx: Fix zero-extension for 32-bit port I/O Kiryl Shutsemau (Meta)
2026-06-05 7:10 ` Binbin Wu
2026-06-05 11:57 ` Kiryl Shutsemau
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox