linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: "Huang, Kai" <kai.huang@intel.com>
Cc: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"Raj, Ashok" <ashok.raj@intel.com>,
	"Hansen, Dave" <dave.hansen@intel.com>,
	"david@redhat.com" <david@redhat.com>,
	"bagasdotme@gmail.com" <bagasdotme@gmail.com>,
	"Luck, Tony" <tony.luck@intel.com>,
	"ak@linux.intel.com" <ak@linux.intel.com>,
	"Wysocki, Rafael J" <rafael.j.wysocki@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"Christopherson,, Sean" <seanjc@google.com>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"kirill.shutemov@linux.intel.com"
	<kirill.shutemov@linux.intel.com>,
	"Chatre, Reinette" <reinette.chatre@intel.com>,
	"Yamahata, Isaku" <isaku.yamahata@intel.com>,
	"nik.borisov@suse.com" <nik.borisov@suse.com>,
	"hpa@zytor.com" <hpa@zytor.com>,
	"Shahar, Sagi" <sagis@google.com>,
	"imammedo@redhat.com" <imammedo@redhat.com>,
	"bp@alien8.de" <bp@alien8.de>, "Gao, Chao" <chao.gao@intel.com>,
	"Brown, Len" <len.brown@intel.com>,
	"sathyanarayanan.kuppuswamy@linux.intel.com"
	<sathyanarayanan.kuppuswamy@linux.intel.com>,
	"Huang, Ying" <ying.huang@intel.com>,
	"Williams, Dan J" <dan.j.williams@intel.com>,
	"x86@kernel.org" <x86@kernel.org>
Subject: Re: [PATCH v12 20/22] x86/virt/tdx: Allow SEAMCALL to handle #UD and #GP
Date: Fri, 30 Jun 2023 12:06:59 +0200	[thread overview]
Message-ID: <20230630100659.GF2533791@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <42e13ccf7f27a68c0dd64640eed378c38ef40967.camel@intel.com>

On Thu, Jun 29, 2023 at 10:33:38AM +0000, Huang, Kai wrote:
> On Wed, 2023-06-28 at 22:38 +0200, Peter Zijlstra wrote:
> > On Wed, Jun 28, 2023 at 05:29:01PM +0200, Peter Zijlstra wrote:
> > > On Tue, Jun 27, 2023 at 02:12:50AM +1200, Kai Huang wrote:
> > > > diff --git a/arch/x86/virt/vmx/tdx/tdxcall.S b/arch/x86/virt/vmx/tdx/tdxcall.S
> > > > index 49a54356ae99..757b0c34be10 100644
> > > > --- a/arch/x86/virt/vmx/tdx/tdxcall.S
> > > > +++ b/arch/x86/virt/vmx/tdx/tdxcall.S
> > > > @@ -1,6 +1,7 @@
> > > >  /* SPDX-License-Identifier: GPL-2.0 */
> > > >  #include <asm/asm-offsets.h>
> > > >  #include <asm/tdx.h>
> > > > +#include <asm/asm.h>
> > > >  
> > > >  /*
> > > >   * TDCALL and SEAMCALL are supported in Binutils >= 2.36.
> > > > @@ -45,6 +46,7 @@
> > > >  	/* Leave input param 2 in RDX */
> > > >  
> > > >  	.if \host
> > > > +1:
> > > >  	seamcall
> > > 
> > > So what registers are actually clobbered by SEAMCALL ? There's a
> > > distinct lack of it in SDM Vol.2 instruction list :-(
> > 
> > With the exception of the abomination that is TDH.VP.ENTER all SEAMCALLs
> > seem to be limited to the set presented here (c,d,8,9,10,11) and all
> > other registers should be available.
> 
> RAX is also used as SEAMCALL return code.
> 
> Looking at the later versions of TDX spec (with TD live migration, etc), it
> seems they are already using R12-R13 as SEAMCALL output:
> 
> https://cdrdv2.intel.com/v1/dl/getContent/733579

Urgh.. I think I read an older versio because I got bleeding eyes from
all this colour coded crap.

All this red is unreadable :-( Have they been told about the glories of
TeX and diff ?

> E.g., 6.3.15. NEW: TDH.IMPORT.MEM Leaf
> 
> It uses R12 and R13 as input.

12 and 14. They skipped 13 for some mysterious raisin.

But also, 10,11 are frequently used as input with this new stuff, which
already suggests the setup from your patches is not tenable.

> > Can we please make that a hard requirement, SEAMCALL must not use
> > registers outside this? We can hardly program to random future
> > extentions; we need hard ABI guarantees here.
> 
> 
> I believe all other GPRs are just saved/restored in SEAMCALL/SEAMRET, so in
> practice all other GPRs not used as input/output should not be clobbered.  But I
> will confirm with TDX module guys.  And even it's true in practice it's better
> to document it.  
> 
> But I think we also want to ask them to stop adding more registers as
> input/output.
> 
> I'll talk to TDX module team on this.

Please, because 12,14 are callee-saved, which means we need to go add
push/pop to preserve them :-(

Then you end up with something like this...

/*
 * TDX_MODULE_CALL - common helper macro for both
 *                 TDCALL and SEAMCALL instructions.
 *
 * TDCALL   - used by TDX guests to make requests to the
 *            TDX module and hypercalls to the VMM.
 * SEAMCALL - used by TDX hosts to make requests to the
 *            TDX module.
 *
 *-------------------------------------------------------------------------
 * TDCALL/SEAMCALL ABI:
 *-------------------------------------------------------------------------
 * Input Registers:
 *
 * RAX                 - TDCALL Leaf number.
 * RCX,RDX,R8-R11      - TDCALL Leaf specific input registers.
 *
 * Output Registers:
 *
 * RAX                 - TDCALL instruction error code.
 * RCX,RDX,R8-R11      - TDCALL Leaf specific output registers.
 * R12-R14	       - extra output registers
 *
 *-------------------------------------------------------------------------
 *
 * __tdx_module_call() function ABI:
 *
 * @fn   (RDI)         - TDCALL Leaf ID,    moved to RAX
 * @regs (RSI)         - struct tdx_regs pointer
 *
 * Return status of TDCALL via RAX.
 */
.macro TDX_MODULE_CALL host:req ret:req extra:0
	FRAME_BEGIN

	movq	%rdi, %rax
	movq	$TDX_SEAMCALL_VMFAILINVALID, %rdi

	movq	TDX_MODULE_rcx(%rsi), %rcx
	movq	TDX_MODULE_rdx(%rsi), %rdx
	movq	TDX_MODULE_r8(%rsi),  %r8
	movq	TDX_MODULE_r9(%rsi),  %r9
	movq	TDX_MODULE_r10(%rsi), %r10
	movq	TDX_MODULE_r11(%rsi), %r11
.if \extra
	pushq	r12
	pushq	r13
	pushq	r14

//	movq	TDX_MODULE_r12(%rsi), %r12
//	movq	TDX_MODULE_r13(%rsi), %r13
//	movq	TDX_MODULE_r14(%rsi), %r14
.endif

.if \host
1:	seamcall
	/*
	 * SEAMCALL instruction is essentially a VMExit from VMX root
	 * mode to SEAM VMX root mode.  VMfailInvalid (CF=1) indicates
	 * that the targeted SEAM firmware is not loaded or disabled,
	 * or P-SEAMLDR is busy with another SEAMCALL.  %rax is not
	 * changed in this case.
	 *
	 * Set %rax to TDX_SEAMCALL_VMFAILINVALID for VMfailInvalid.
	 * This value will never be used as actual SEAMCALL error code as
	 * it is from the Reserved status code class.
	 */
	cmovc	%rdi, %rax
2:
.else
	tdcall
.endif

.if \ret
	movq	%rcx, TDX_MODULE_rcx(%rsi)
	movq	%rdx, TDX_MODULE_rdx(%rsi)
	movq	%r8,  TDX_MODULE_r8(%rsi)
	movq	%r9,  TDX_MODULE_r9(%rsi)
	movq	%r10, TDX_MODULE_r10(%rsi)
	movq	%r11, TDX_MODULE_r11(%rsi)
.endif
.if \extra
	movq	%r12, TDX_MODULE_r12(%rsi)
	movq	%r13, TDX_MODULE_r13(%rsi)
	movq	%r14, TDX_MODULE_r14(%rsi)

	popq	%r14
	popq	%r13
	popq	%r12
.endif

	FRAME_END
	RET

.if \host
3:
	mov	$TDX_SW_ERROR, %rdi
	or	%rdi, %rax
	jmp 2b

	_ASM_EXTABLE_FAULT(1b, 3b)
.endif
.endm


  reply	other threads:[~2023-06-30 10:07 UTC|newest]

Thread overview: 159+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-26 14:12 [PATCH v12 00/22] TDX host kernel support Kai Huang
2023-06-26 14:12 ` [PATCH v12 01/22] x86/tdx: Define TDX supported page sizes as macros Kai Huang
2023-06-26 14:12 ` [PATCH v12 02/22] x86/virt/tdx: Detect TDX during kernel boot Kai Huang
2023-06-26 14:12 ` [PATCH v12 03/22] x86/virt/tdx: Make INTEL_TDX_HOST depend on X86_X2APIC Kai Huang
2023-06-26 14:12 ` [PATCH v12 04/22] x86/cpu: Detect TDX partial write machine check erratum Kai Huang
2023-06-29 11:22   ` David Hildenbrand
2023-06-26 14:12 ` [PATCH v12 05/22] x86/virt/tdx: Add SEAMCALL infrastructure Kai Huang
2023-06-27  9:48   ` kirill.shutemov
2023-06-27 10:28     ` Huang, Kai
2023-06-27 11:36       ` kirill.shutemov
2023-06-28  0:19       ` Isaku Yamahata
2023-06-28  3:09   ` Chao Gao
2023-06-28  3:34     ` Huang, Kai
2023-06-28 11:50       ` kirill.shutemov
2023-06-28 23:31         ` Huang, Kai
2023-06-29 11:25       ` David Hildenbrand
2023-06-28 12:58   ` Peter Zijlstra
2023-06-28 13:54     ` Peter Zijlstra
2023-06-28 23:25       ` Huang, Kai
2023-06-29 10:15       ` kirill.shutemov
2023-06-28 23:21     ` Huang, Kai
2023-06-29  3:40       ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 06/22] x86/virt/tdx: Handle SEAMCALL running out of entropy error Kai Huang
2023-06-28 13:02   ` Peter Zijlstra
2023-06-28 23:30     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 07/22] x86/virt/tdx: Add skeleton to enable TDX on demand Kai Huang
2023-06-26 21:21   ` Sathyanarayanan Kuppuswamy
2023-06-27 10:37     ` Huang, Kai
2023-06-27  9:50   ` kirill.shutemov
2023-06-27 10:34     ` Huang, Kai
2023-06-27 12:18       ` kirill.shutemov
2023-06-27 22:37         ` Huang, Kai
2023-06-28  0:28           ` Huang, Kai
2023-06-28 11:55             ` kirill.shutemov
2023-06-28 13:35             ` Peter Zijlstra
2023-06-29  0:15               ` Huang, Kai
2023-06-30  9:22                 ` Peter Zijlstra
2023-06-30 10:09                   ` Huang, Kai
2023-06-30 18:42                     ` Isaku Yamahata
2023-07-01  8:15                     ` Huang, Kai
2023-06-28  0:31           ` Isaku Yamahata
2023-06-28 13:04   ` Peter Zijlstra
2023-06-29  0:00     ` Huang, Kai
2023-06-30  9:25       ` Peter Zijlstra
2023-06-30  9:48         ` Huang, Kai
2023-06-28 13:08   ` Peter Zijlstra
2023-06-29  0:08     ` Huang, Kai
2023-06-28 13:17   ` Peter Zijlstra
2023-06-29  0:10     ` Huang, Kai
2023-06-30  9:26       ` Peter Zijlstra
2023-06-30  9:55         ` Huang, Kai
2023-06-30 18:30           ` Peter Zijlstra
2023-06-30 19:05             ` Isaku Yamahata
2023-06-30 21:24               ` Sean Christopherson
2023-06-30 21:58                 ` Dan Williams
2023-06-30 23:13                 ` Dave Hansen
2023-07-03 10:38                   ` Peter Zijlstra
2023-07-03 10:49                 ` Peter Zijlstra
2023-07-03 14:40                   ` Dave Hansen
2023-07-03 15:03                     ` Peter Zijlstra
2023-07-03 15:26                       ` Dave Hansen
2023-07-03 17:55                       ` kirill.shutemov
2023-07-03 18:26                         ` Dave Hansen
2023-07-05  7:14                         ` Peter Zijlstra
2023-07-04 16:58                 ` Peter Zijlstra
2023-07-04 21:50                   ` Huang, Kai
2023-07-05  7:16                     ` Peter Zijlstra
2023-07-05  7:54                       ` Huang, Kai
2023-07-05 14:34                   ` Dave Hansen
2023-07-05 14:57                     ` Peter Zijlstra
2023-07-06 14:49                       ` Dave Hansen
2023-07-10 17:58                         ` Sean Christopherson
2023-06-29 11:31   ` David Hildenbrand
2023-06-29 22:58     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 08/22] x86/virt/tdx: Get information about TDX module and TDX-capable memory Kai Huang
2023-06-27  9:51   ` kirill.shutemov
2023-06-27 10:45     ` Huang, Kai
2023-06-27 11:37       ` kirill.shutemov
2023-06-27 11:46         ` Huang, Kai
2023-06-28 14:10   ` Peter Zijlstra
2023-06-29  9:15     ` Huang, Kai
2023-06-30  9:34       ` Peter Zijlstra
2023-06-30  9:58         ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 09/22] x86/virt/tdx: Use all system memory when initializing TDX module as TDX memory Kai Huang
2023-06-28 14:17   ` Peter Zijlstra
2023-06-29  0:57     ` Huang, Kai
2023-07-11 11:38   ` David Hildenbrand
2023-07-11 12:27     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 10/22] x86/virt/tdx: Add placeholder to construct TDMRs to cover all TDX memory regions Kai Huang
2023-06-26 14:12 ` [PATCH v12 11/22] x86/virt/tdx: Fill out " Kai Huang
2023-07-04  7:28   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 12/22] x86/virt/tdx: Allocate and set up PAMTs for TDMRs Kai Huang
2023-06-27  9:51   ` kirill.shutemov
2023-07-04  7:40   ` Yuan Yao
2023-07-04  8:59     ` Huang, Kai
2023-07-11 11:42   ` David Hildenbrand
2023-07-11 11:49     ` Huang, Kai
2023-07-11 11:55       ` David Hildenbrand
2023-06-26 14:12 ` [PATCH v12 13/22] x86/virt/tdx: Designate reserved areas for all TDMRs Kai Huang
2023-07-05  5:29   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 14/22] x86/virt/tdx: Configure TDX module with the TDMRs and global KeyID Kai Huang
2023-07-05  6:49   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 15/22] x86/virt/tdx: Configure global KeyID on all packages Kai Huang
2023-07-05  8:13   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 16/22] x86/virt/tdx: Initialize all TDMRs Kai Huang
2023-07-06  5:31   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 17/22] x86/kexec: Flush cache of TDX private memory Kai Huang
2023-06-26 14:12 ` [PATCH v12 18/22] x86/virt/tdx: Keep TDMRs when module initialization is successful Kai Huang
2023-06-28  9:04   ` Nikolay Borisov
2023-06-29  1:03     ` Huang, Kai
2023-06-28 12:23   ` kirill.shutemov
2023-06-28 12:48     ` Nikolay Borisov
2023-06-29  0:24       ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 19/22] x86/kexec(): Reset TDX private memory on platforms with TDX erratum Kai Huang
2023-06-28  9:20   ` Nikolay Borisov
2023-06-29  0:32     ` Dave Hansen
2023-06-29  0:58       ` Huang, Kai
2023-06-29  3:19     ` Huang, Kai
2023-06-29  5:38       ` Huang, Kai
2023-06-29  9:45         ` Huang, Kai
2023-06-29  9:48           ` Nikolay Borisov
2023-06-28 12:29   ` kirill.shutemov
2023-06-29  0:27     ` Huang, Kai
2023-07-07  4:01   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 20/22] x86/virt/tdx: Allow SEAMCALL to handle #UD and #GP Kai Huang
2023-06-28 12:32   ` kirill.shutemov
2023-06-28 15:29   ` Peter Zijlstra
2023-06-28 20:38     ` Peter Zijlstra
2023-06-28 21:11       ` Peter Zijlstra
2023-06-28 21:16         ` Peter Zijlstra
2023-06-30  9:03           ` kirill.shutemov
2023-06-30 10:02             ` Huang, Kai
2023-06-30 10:22               ` kirill.shutemov
2023-06-30 11:06                 ` Huang, Kai
2023-06-29 10:33       ` Huang, Kai
2023-06-30 10:06         ` Peter Zijlstra [this message]
2023-06-30 10:18           ` Huang, Kai
2023-06-30 15:16             ` Dave Hansen
2023-07-01  8:16               ` Huang, Kai
2023-06-30 10:21           ` Peter Zijlstra
2023-06-30 11:05             ` Huang, Kai
2023-06-30 12:06             ` Peter Zijlstra
2023-06-30 15:14               ` Peter Zijlstra
2023-07-03 12:15               ` Huang, Kai
2023-07-05 10:21                 ` Peter Zijlstra
2023-07-05 11:34                   ` Huang, Kai
2023-07-05 12:19                     ` Peter Zijlstra
2023-07-05 12:53                       ` Huang, Kai
2023-07-05 20:56                         ` Isaku Yamahata
2023-07-05 12:21                     ` Peter Zijlstra
2023-06-29 11:16       ` kirill.shutemov
2023-06-29 10:00     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 21/22] x86/mce: Improve error log of kernel space TDX #MC due to erratum Kai Huang
2023-06-28 12:38   ` kirill.shutemov
2023-07-07  7:26   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 22/22] Documentation/x86: Add documentation for TDX host support Kai Huang
2023-06-28  7:04 ` [PATCH v12 00/22] TDX host kernel support Yuan Yao
2023-06-28  8:12   ` Huang, Kai
2023-06-29  1:01     ` Yuan Yao

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=20230630100659.GF2533791@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=ak@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=bagasdotme@gmail.com \
    --cc=bp@alien8.de \
    --cc=chao.gao@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=david@redhat.com \
    --cc=hpa@zytor.com \
    --cc=imammedo@redhat.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kai.huang@intel.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=reinette.chatre@intel.com \
    --cc=sagis@google.com \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=ying.huang@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox