| From | Thomas Gleixner <> | Subject | Re: [PATCHv2 13/29] x86/tdx: Add port I/O emulation | Date | Wed, 02 Feb 2022 00:01:23 +0100 |
| |
On Mon, Jan 24 2022 at 18:01, Kirill A. Shutemov wrote: > static bool intel_cc_platform_has(enum cc_attr attr) > { > + if (attr == CC_ATTR_GUEST_UNROLL_STRING_IO) > + return true; > +
switch (attr) perhaps as there are more coming, right?
> return false; > }
> +/* > + * Emulate I/O using hypercall. > + * > + * Assumes the IO instruction was using ax, which is enforced > + * by the standard io.h macros. > + * > + * Return True on success or False on failure. > + */ > +static bool tdx_handle_io(struct pt_regs *regs, u32 exit_qual) > +{ > + struct tdx_hypercall_output out; > + int size, port, ret; > + u64 mask; > + bool in; > + > + if (VE_IS_IO_STRING(exit_qual)) > + return false; > + > + in = VE_IS_IO_IN(exit_qual); > + size = VE_GET_IO_SIZE(exit_qual); > + port = VE_GET_PORT_NUM(exit_qual); > + mask = GENMASK(BITS_PER_BYTE * size, 0); > + > + /* > + * Emulate the I/O read/write via hypercall. More info about > + * ABI can be found in TDX Guest-Host-Communication Interface > + * (GHCI) sec titled "TDG.VP.VMCALL<Instruction.IO>". > + */ > + ret = _tdx_hypercall(EXIT_REASON_IO_INSTRUCTION, size, !in, port, > + in ? 0 : regs->ax, &out); > + if (!in) > + return !ret; > + > + regs->ax &= ~mask; > + regs->ax |= ret ? UINT_MAX : out.r11 & mask; > + > + return !ret; > +} > + > bool tdx_get_ve_info(struct ve_info *ve) > { > struct tdx_module_output out; > @@ -333,6 +378,9 @@ static bool tdx_virt_exception_kernel(struct pt_regs *regs, struct ve_info *ve) > if (!ret) > pr_warn_once("MMIO failed\n"); > break; > + case EXIT_REASON_IO_INSTRUCTION: > + ret = tdx_handle_io(regs, ve->exit_qual);
return ...
Other than that LGTM.
Thanks,
tglx
|