Re: [PATCHv2 07/29] x86/tdx: Handle CPUID via #VE

From: Thomas Gleixner
Date: Tue Feb 01 2022 - 16:39:39 EST


On Mon, Jan 24 2022 at 18:01, Kirill A. Shutemov wrote:
> +static bool tdx_handle_cpuid(struct pt_regs *regs)
> +{
> + struct tdx_hypercall_output out;
> +
> + /*
> + * Emulate the CPUID instruction via a hypercall. More info about
> + * ABI can be found in TDX Guest-Host-Communication Interface
> + * (GHCI), section titled "VP.VMCALL<Instruction.CPUID>".
> + */
> + if (_tdx_hypercall(EXIT_REASON_CPUID, regs->ax, regs->cx, 0, 0, &out))
> + return false;
> +
> + /*
> + * As per TDX GHCI CPUID ABI, r12-r15 registers contain contents of
> + * EAX, EBX, ECX, EDX registers after the CPUID instruction execution.
> + * So copy the register contents back to pt_regs.
> + */
> + regs->ax = out.r12;
> + regs->bx = out.r13;
> + regs->cx = out.r14;
> + regs->dx = out.r15;
> +
> + return true;
> +}

Ack.

> bool tdx_get_ve_info(struct ve_info *ve)
> {
> struct tdx_module_output out;
> @@ -157,8 +182,18 @@ bool tdx_get_ve_info(struct ve_info *ve)
> */
> static bool tdx_virt_exception_user(struct pt_regs *regs, struct ve_info *ve)
> {
> - pr_warn("Unexpected #VE: %lld\n", ve->exit_reason);
> - return false;
> + bool ret = false;
> +
> + switch (ve->exit_reason) {
> + case EXIT_REASON_CPUID:
> + ret = tdx_handle_cpuid(regs);
> + break;

Comment about ret and break applies accordingly.

Thanks,

tglx