All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@intel.com>,
	"Kirill A. Shutemov" <kirill@shutemov.name>,
	Andy Lutomirski <luto@kernel.org>,
	Kuppuswamy Sathyanarayanan 
	<sathyanarayanan.kuppuswamy@linux.intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Andi Kleen <ak@linux.intel.com>,
	Kirill Shutemov <kirill.shutemov@linux.intel.com>,
	Kuppuswamy Sathyanarayanan <knsathya@kernel.org>,
	Dan Williams <dan.j.williams@intel.com>,
	Raj Ashok <ashok.raj@intel.com>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [RFC v1 09/26] x86/tdx: Handle CPUID via #VE
Date: Mon, 8 Feb 2021 09:10:59 -0800	[thread overview]
Message-ID: <YCFwo5tD3Jad6F69@google.com> (raw)
In-Reply-To: <0A886D87-1979-419C-86DE-EA2FABDFF3EB@amacapital.net>

On Sun, Feb 07, 2021, Andy Lutomirski wrote:
> 
> > On Feb 7, 2021, at 2:31 PM, Dave Hansen <dave.hansen@intel.com> wrote:
> > 
> > On 2/7/21 12:29 PM, Kirill A. Shutemov wrote:
> >>> Couldn't you just have one big helper that takes *all* the registers
> >>> that get used in any TDVMCALL and sets all the rcx bits?  The users
> >>> could just pass 0's for the things they don't use.

IIRC, having exactly one helper is a big mess (my original code used a single
main helper).  CPUID has a large number of outputs, and because outputs are
handled as pointers, the assembly routine needs to check output params for NULL.

And if we want to write up port I/O directly to TDVMCALL to avoid the #VE, IN
and OUT need separate helpers to implement a non-standard register ABI in order
to play nice with ALTERANTIVES.

This also has my vote, mainly because gcc doesn't allow directly specifying
r8-r15 as register constraints to inline asm.  That creates a nasty hole where
a register can get corrupted if code is inserted between writing the local
variable and passing it to the inline asm.

Case in point, patch 08 has this exact bug.

> +static u64 tdx_read_msr_safe(unsigned int msr, int *err)
> +{
> +       register long r10 asm("r10") = TDVMCALL_STANDARD;
> +       register long r11 asm("r11") = EXIT_REASON_MSR_READ;
> +       register long r12 asm("r12") = msr;
> +       register long rcx asm("rcx");
> +       long ret;
> +
> +       WARN_ON_ONCE(tdx_is_context_switched_msr(msr));

This can corrupt r10, r11 and/or r12, e.g. if tdx_is_context_switched_msr() is
not inlined, it can use r10 and r11 as scratch registers, and gcc isn't smart
enough to know it needs to save registers before the call.

Even if the code as committed is guaranteed to work, IMO this approach is
hostile toward future debuggers/developers, e.g. adding a printk() in here to
debug can introduce a completely different failure.

> +
> +       if (msr == MSR_CSTAR)
> +               return 0;
> +
> +       /* Allow to pass R10, R11 and R12 down to the VMM */
> +       rcx = BIT(10) | BIT(11) | BIT(12);
> +
> +       asm volatile(TDCALL
> +                       : "=a"(ret), "=r"(r10), "=r"(r11), "=r"(r12)
> +                       : "a"(TDVMCALL), "r"(rcx), "r"(r10), "r"(r11), "r"(r12)
> +                       : );
> +
> +       /* XXX: Better error handling needed? */
> +       *err = (ret || r10) ? -EIO : 0;
> +
> +       return r11;
> +}

> >>> Then you've got the ugly inline asm in one place.  It also makes it
> >>> harder to screw up the 'rcx' mask and end up passing registers you
> >>> didn't want into a malicious VMM.
> >> For now we only pass down R10-R15, but the interface allows to pass down
> >> much wider set of registers, including XMM. How far do we want to get it?
> > 
> > Just do what we immediately need: R10-R15
> > .
> > 
> 
> How much of the register state is revealed to the VMM when we do a TDVMCALL?
> Presumably we should fully sanitize all register state that shows up in
> cleartext on the other end, and we should treat all regs that can be modified
> by the VMM as clobbered.

The guest gets to choose, with a few restrictions.  RSP cannot be exposed to the
host.  RAX, RCX, R10, and R11 are always exposed as they hold mandatory info
about the TDVMCALL (TDCALL fn, GPR mask, GHCI vs. vendor, and TDVMCALL fn).  All
other GPRs are exposed and clobbered if their bit in RCX is set, otherwise they
are saved/restored by the TDX-Module.

I agree with Dave, pass everything required by the GHCI in the main routine, and
sanitize and save/restore all such GPRs.

  reply	other threads:[~2021-02-08 18:57 UTC|newest]

Thread overview: 161+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-05 23:38 [RFC v1 00/26] Add TDX Guest Support Kuppuswamy Sathyanarayanan
2021-02-05 23:38 ` Kuppuswamy Sathyanarayanan
2021-02-06  6:24   ` sathyanarayanan.kuppuswamy
2021-02-06  3:04   ` Test Email sathyanarayanan.kuppuswamy
2021-02-06  3:02   ` sathyanarayanan.kuppuswamy
2021-02-05 23:38   ` [RFC v1 01/26] x86/paravirt: Introduce CONFIG_PARAVIRT_XL Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 02/26] x86/cpufeatures: Add TDX Guest CPU feature Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 03/26] x86/cpufeatures: Add is_tdx_guest() interface Kuppuswamy Sathyanarayanan
2021-04-01 21:08     ` Dave Hansen
2021-04-01 21:15       ` Kuppuswamy, Sathyanarayanan
2021-04-01 21:19         ` Dave Hansen
2021-04-01 22:25           ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 04/26] x86/tdx: Get TD execution environment information via TDINFO Kuppuswamy Sathyanarayanan
2021-02-08 10:00     ` Peter Zijlstra
2021-02-08 19:10       ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 05/26] x86/traps: Add #VE support for TDX guest Kuppuswamy Sathyanarayanan
2021-02-08 10:20     ` Peter Zijlstra
2021-02-08 16:23       ` Andi Kleen
2021-02-08 16:33         ` Peter Zijlstra
2021-02-08 16:46           ` Sean Christopherson
2021-02-08 16:59             ` Peter Zijlstra
2021-02-08 19:05               ` Kuppuswamy, Sathyanarayanan
2021-02-08 16:46           ` Andi Kleen
2021-02-12 19:20     ` Dave Hansen
2021-02-12 19:47     ` Andy Lutomirski
2021-02-12 20:06       ` Sean Christopherson
2021-02-12 20:17         ` Dave Hansen
2021-02-12 20:37           ` Sean Christopherson
2021-02-12 20:46             ` Dave Hansen
2021-02-12 20:54               ` Sean Christopherson
2021-02-12 21:06                 ` Dave Hansen
2021-02-12 21:37                   ` Sean Christopherson
2021-02-12 21:47                     ` Andy Lutomirski
2021-02-12 21:48                       ` Dave Hansen
2021-02-14 19:33                         ` Andi Kleen
2021-02-14 19:54                           ` Andy Lutomirski
2021-02-12 20:20         ` Andy Lutomirski
2021-02-12 20:44           ` Sean Christopherson
2021-02-05 23:38   ` [RFC v1 06/26] x86/tdx: Add HLT " Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 07/26] x86/tdx: Wire up KVM hypercalls Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 08/26] x86/tdx: Add MSR support for TDX guest Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 09/26] x86/tdx: Handle CPUID via #VE Kuppuswamy Sathyanarayanan
2021-02-05 23:42     ` Andy Lutomirski
2021-02-07 14:13       ` Kirill A. Shutemov
2021-02-07 16:01         ` Dave Hansen
2021-02-07 20:29           ` Kirill A. Shutemov
2021-02-07 22:31             ` Dave Hansen
2021-02-07 22:45               ` Andy Lutomirski
2021-02-08 17:10                 ` Sean Christopherson [this message]
2021-02-08 17:35                   ` Andy Lutomirski
2021-02-08 17:47                     ` Sean Christopherson
2021-03-18 21:30                 ` [PATCH v1 1/1] x86/tdx: Add tdcall() and tdvmcall() helper functions Kuppuswamy Sathyanarayanan
2021-03-19 16:55                   ` Sean Christopherson
2021-03-19 17:42                     ` Kuppuswamy, Sathyanarayanan
2021-03-19 18:22                       ` Dave Hansen
2021-03-19 19:58                         ` Kuppuswamy, Sathyanarayanan
2021-03-26 23:38                           ` [PATCH v2 1/1] x86/tdx: Add __tdcall() and __tdvmcall() " Kuppuswamy Sathyanarayanan
2021-04-20 17:36                             ` Dave Hansen
2021-04-20 19:20                               ` Kuppuswamy, Sathyanarayanan
2021-04-20 19:59                                 ` Dave Hansen
2021-04-20 23:12                                   ` Kuppuswamy, Sathyanarayanan
2021-04-20 23:42                                     ` Dave Hansen
2021-04-23  1:09                                       ` Kuppuswamy, Sathyanarayanan
2021-04-23  1:21                                         ` Dave Hansen
2021-04-23  1:35                                           ` Andi Kleen
2021-04-23 15:15                                             ` Sean Christopherson
2021-04-23 15:28                                               ` Dan Williams
2021-04-23 15:38                                                 ` Andi Kleen
2021-04-23 15:50                                                 ` Sean Christopherson
2021-04-23 15:47                                               ` Andi Kleen
2021-04-23 18:18                                               ` Kuppuswamy, Sathyanarayanan
2021-04-20 23:53                                     ` Dan Williams
2021-04-20 23:59                                       ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 10/26] x86/io: Allow to override inX() and outX() implementation Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 11/26] x86/tdx: Handle port I/O Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 12/26] x86/tdx: Handle in-kernel MMIO Kuppuswamy Sathyanarayanan
2021-04-01 19:56     ` Dave Hansen
2021-04-01 22:26       ` Sean Christopherson
2021-04-01 22:53         ` Dave Hansen
2021-02-05 23:38   ` [RFC v1 13/26] x86/tdx: Handle MWAIT, MONITOR and WBINVD Kuppuswamy Sathyanarayanan
2021-02-05 23:43     ` Andy Lutomirski
2021-02-05 23:54       ` Kuppuswamy, Sathyanarayanan
2021-02-06  1:05         ` Andy Lutomirski
2021-03-27  0:18           ` [PATCH v1 1/1] " Kuppuswamy Sathyanarayanan
2021-03-27  2:40             ` Andy Lutomirski
2021-03-27  3:40               ` Kuppuswamy, Sathyanarayanan
2021-03-27 16:03                 ` Andy Lutomirski
2021-03-27 22:54                   ` [PATCH v2 " Kuppuswamy Sathyanarayanan
2021-03-29 17:14                     ` Dave Hansen
2021-03-29 21:55                       ` Kuppuswamy, Sathyanarayanan
2021-03-29 22:02                         ` Dave Hansen
2021-03-29 22:09                           ` Kuppuswamy, Sathyanarayanan
2021-03-29 22:12                             ` Dave Hansen
2021-03-29 22:42                               ` Kuppuswamy, Sathyanarayanan
2021-03-29 23:16                               ` [PATCH v3 " Kuppuswamy Sathyanarayanan
2021-03-29 23:23                                 ` Andy Lutomirski
2021-03-29 23:37                                   ` Kuppuswamy, Sathyanarayanan
2021-03-29 23:42                                     ` Sean Christopherson
2021-03-29 23:58                                       ` Andy Lutomirski
2021-03-30  2:04                                         ` Andi Kleen
2021-03-30  2:58                                           ` Andy Lutomirski
2021-03-30 15:14                                             ` Sean Christopherson
2021-03-30 16:37                                               ` Andy Lutomirski
2021-03-30 16:57                                                 ` Sean Christopherson
2021-04-07 15:24                                                   ` Andi Kleen
2021-03-31 21:09                                             ` [PATCH v4 " Kuppuswamy Sathyanarayanan
2021-03-31 21:49                                               ` Dave Hansen
2021-03-31 22:29                                                 ` Kuppuswamy, Sathyanarayanan
2021-03-31 21:53                                               ` Sean Christopherson
2021-03-31 22:00                                                 ` Dave Hansen
2021-03-31 22:06                                                   ` Sean Christopherson
2021-03-31 22:11                                                     ` Dave Hansen
2021-03-31 22:28                                                       ` Kuppuswamy, Sathyanarayanan
2021-03-31 22:32                                                         ` Sean Christopherson
2021-03-31 22:34                                                         ` Dave Hansen
2021-04-01  3:28                                                           ` Andi Kleen
2021-04-01  3:46                                                             ` Dave Hansen
2021-04-01  4:24                                                               ` Andi Kleen
2021-04-01  4:51                                                                 ` [PATCH v5 " Kuppuswamy Sathyanarayanan
2021-03-29 23:39                                   ` [PATCH v3 " Sean Christopherson
2021-03-29 23:38                                 ` Dave Hansen
2021-03-30  4:56             ` [PATCH v1 " Xiaoyao Li
2021-03-30 15:00               ` Andi Kleen
2021-03-30 15:10                 ` Dave Hansen
2021-03-30 17:02                   ` Kuppuswamy, Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 14/26] ACPI: tables: Add multiprocessor wake-up support Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 15/26] x86/boot: Add a trampoline for APs booting in 64-bit mode Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 16/26] x86/boot: Avoid #VE during compressed boot for TDX platforms Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 17/26] x86/boot: Avoid unnecessary #VE during boot process Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 18/26] x86/topology: Disable CPU hotplug support for TDX platforms Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 19/26] x86/tdx: Forcefully disable legacy PIC for TDX guests Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 20/26] x86/tdx: Introduce INTEL_TDX_GUEST config option Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 21/26] x86/mm: Move force_dma_unencrypted() to common code Kuppuswamy Sathyanarayanan
2021-04-01 20:06     ` Dave Hansen
2021-04-06 15:37       ` Kirill A. Shutemov
2021-04-06 16:11         ` Dave Hansen
2021-04-06 16:37           ` Kirill A. Shutemov
2021-02-05 23:38   ` [RFC v1 22/26] x86/tdx: Exclude Shared bit from __PHYSICAL_MASK Kuppuswamy Sathyanarayanan
2021-04-01 20:13     ` Dave Hansen
2021-04-06 15:54       ` Kirill A. Shutemov
2021-04-06 16:12         ` Dave Hansen
2021-02-05 23:38   ` [RFC v1 23/26] x86/tdx: Make pages shared in ioremap() Kuppuswamy Sathyanarayanan
2021-04-01 20:26     ` Dave Hansen
2021-04-06 16:00       ` Kirill A. Shutemov
2021-04-06 16:14         ` Dave Hansen
2021-02-05 23:38   ` [RFC v1 24/26] x86/tdx: Add helper to do MapGPA TDVMALL Kuppuswamy Sathyanarayanan
2021-02-05 23:38   ` [RFC v1 25/26] x86/tdx: Make DMA pages shared Kuppuswamy Sathyanarayanan
2021-04-01 21:01     ` Dave Hansen
2021-04-06 16:31       ` Kirill A. Shutemov
2021-04-06 16:38         ` Dave Hansen
2021-04-06 17:16           ` Sean Christopherson
2021-02-05 23:38   ` [RFC v1 26/26] x86/kvm: Use bounce buffers for TD guest Kuppuswamy Sathyanarayanan
2021-04-01 21:17     ` Dave Hansen
2021-03-31 21:38   ` [RFC v1 00/26] Add TDX Guest Support Kuppuswamy, Sathyanarayanan
2021-04-02  0:02   ` Dave Hansen
2021-04-02  2:48     ` Andi Kleen
2021-04-02 15:27       ` Dave Hansen
2021-04-02 21:32         ` Andi Kleen
2021-04-03 16:26           ` Dave Hansen
2021-04-03 17:28             ` Andi Kleen
2021-04-04 15:02   ` Dave Hansen
2021-04-12 17:24     ` Dan Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YCFwo5tD3Jad6F69@google.com \
    --to=seanjc@google.com \
    --cc=ak@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kirill@shutemov.name \
    --cc=knsathya@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=peterz@infradead.org \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.