public inbox for linux-coco@lists.linux.dev
 help / color / mirror / Atom feed
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
To: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	"K. Y. Srinivasan" <kys@microsoft.com>,
	Haiyang Zhang <haiyangz@microsoft.com>,
	Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
	Josh Poimboeuf <jpoimboe@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>
Cc: linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org,
	linux-hyperv@vger.kernel.org,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Subject: [PATCH 11/20] x86/tdx: Rewrite tdx_panic() without __tdx_hypercall()
Date: Fri, 17 May 2024 17:19:29 +0300	[thread overview]
Message-ID: <20240517141938.4177174-12-kirill.shutemov@linux.intel.com> (raw)
In-Reply-To: <20240517141938.4177174-1-kirill.shutemov@linux.intel.com>

tdx_panic() uses REPORT_FATAL_ERROR hypercall to deliver panic message
in ealy boot. Rewrite it without using __tdx_hypercall().

REPORT_FATAL_ERROR hypercall is special. It uses pretty much all
available registers to pass down the error message. TDVMCALL macros are
not usable here.

Implement the hypercall directly in assembly.

It cuts code bloat substantially:

Function                                     old     new   delta
tdx_panic                                    222      59    -163

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
---
 arch/x86/coco/tdx/tdcall.S | 28 ++++++++++++++++++++++++++++
 arch/x86/coco/tdx/tdx.c    | 31 +++----------------------------
 arch/x86/include/asm/tdx.h |  2 ++
 tools/objtool/noreturns.h  |  1 +
 4 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/arch/x86/coco/tdx/tdcall.S b/arch/x86/coco/tdx/tdcall.S
index 12185fbd33ba..269e5789672a 100644
--- a/arch/x86/coco/tdx/tdcall.S
+++ b/arch/x86/coco/tdx/tdcall.S
@@ -110,3 +110,31 @@ SYM_FUNC_START(tdvmcall_trampoline)
 	ud2
 SYM_FUNC_END(tdvmcall_trampoline)
 .popsection
+
+SYM_FUNC_START(tdvmcall_report_fatal_error)
+	movq	$TDX_HYPERCALL_STANDARD, %r10
+	movq	$TDVMCALL_REPORT_FATAL_ERROR, %r11
+	movq	%rdi, %r12
+	movq	$0, %r13
+
+	movq	%rsi, %rcx
+
+	/* Order according to the GHCI */
+	movq	0*8(%rcx), %r14
+	movq	1*8(%rcx), %r15
+	movq	2*8(%rcx), %rbx
+	movq	3*8(%rcx), %rdi
+	movq	4*8(%rcx), %rsi
+	movq	5*8(%rcx), %r8
+	movq	6*8(%rcx), %r9
+	movq	7*8(%rcx), %rdx
+
+	movq	$TDG_VP_VMCALL, %rax
+	movq	$(TDX_RDX | TDX_RBX | TDX_RSI | TDX_RDI | TDX_R8  | TDX_R9  | \
+		  TDX_R10 | TDX_R11 | TDX_R12 | TDX_R13 | TDX_R14 | TDX_R15), \
+		%rcx
+
+	tdcall
+
+	ud2
+SYM_FUNC_END(tdvmcall_report_fatal_error)
diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c
index 3f0be1d3cccb..b7299e668564 100644
--- a/arch/x86/coco/tdx/tdx.c
+++ b/arch/x86/coco/tdx/tdx.c
@@ -157,37 +157,12 @@ EXPORT_SYMBOL_GPL(tdx_hcall_get_quote);
 
 static void __noreturn tdx_panic(const char *msg)
 {
-	struct tdx_module_args args = {
-		.r10 = TDX_HYPERCALL_STANDARD,
-		.r11 = TDVMCALL_REPORT_FATAL_ERROR,
-		.r12 = 0, /* Error code: 0 is Panic */
-	};
-	union {
-		/* Define register order according to the GHCI */
-		struct { u64 r14, r15, rbx, rdi, rsi, r8, r9, rdx; };
-
-		char str[64];
-	} message;
+	char str[64];
 
 	/* VMM assumes '\0' in byte 65, if the message took all 64 bytes */
-	strtomem_pad(message.str, msg, '\0');
+	strtomem_pad(str, msg, '\0');
 
-	args.r8  = message.r8;
-	args.r9  = message.r9;
-	args.r14 = message.r14;
-	args.r15 = message.r15;
-	args.rdi = message.rdi;
-	args.rsi = message.rsi;
-	args.rbx = message.rbx;
-	args.rdx = message.rdx;
-
-	/*
-	 * This hypercall should never return and it is not safe
-	 * to keep the guest running. Call it forever if it
-	 * happens to return.
-	 */
-	while (1)
-		__tdx_hypercall(&args);
+	tdvmcall_report_fatal_error(0, str);
 }
 
 /*
diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
index eba178996d84..f67e5e6b66ad 100644
--- a/arch/x86/include/asm/tdx.h
+++ b/arch/x86/include/asm/tdx.h
@@ -54,6 +54,8 @@ struct ve_info {
 
 void __init tdx_early_init(void);
 
+void __noreturn tdvmcall_report_fatal_error(u64 error_code, const char str[64]);
+
 void tdx_get_ve_info(struct ve_info *ve);
 
 bool tdx_handle_virt_exception(struct pt_regs *regs, struct ve_info *ve);
diff --git a/tools/objtool/noreturns.h b/tools/objtool/noreturns.h
index 7ebf29c91184..0670cacf0734 100644
--- a/tools/objtool/noreturns.h
+++ b/tools/objtool/noreturns.h
@@ -39,6 +39,7 @@ NORETURN(sev_es_terminate)
 NORETURN(snp_abort)
 NORETURN(start_kernel)
 NORETURN(stop_this_cpu)
+NORETURN(tdvmcall_report_fatal_error)
 NORETURN(usercopy_abort)
 NORETURN(x86_64_start_kernel)
 NORETURN(x86_64_start_reservations)
-- 
2.43.0


  parent reply	other threads:[~2024-05-17 14:20 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-17 14:19 [PATCH 00/20] x86/tdx: Rewrite TDCALL wrappers Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 01/20] x86/tdx: Introduce tdvmcall_trampoline() Kirill A. Shutemov
2024-05-17 15:21   ` Dave Hansen
2024-05-20 10:32     ` Kirill A. Shutemov
2024-05-20 15:49       ` Dave Hansen
2024-05-17 17:02   ` Paolo Bonzini
2024-05-20 10:35     ` Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 02/20] x86/tdx: Add macros to generate TDVMCALL wrappers Kirill A. Shutemov
2024-05-17 16:54   ` Paolo Bonzini
2024-05-20 10:35     ` Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 03/20] x86/tdx: Convert port I/O handling to use new TDVMCALL macros Kirill A. Shutemov
2024-05-17 15:28   ` Dave Hansen
2024-05-17 17:37     ` Paolo Bonzini
2024-05-17 14:19 ` [PATCH 04/20] x86/tdx: Convert HLT handling to use new TDVMCALL_0() Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 05/20] x86/tdx: Convert MSR read handling to use new TDVMCALL_1() Kirill A. Shutemov
2024-05-28  5:33   ` Wei Liu
2024-05-17 14:19 ` [PATCH 06/20] x86/tdx: Convert MSR write handling to use new TDVMCALL_0() Kirill A. Shutemov
2024-05-28  5:33   ` Wei Liu
2024-05-17 14:19 ` [PATCH 07/20] x86/tdx: Convert CPUID handling to use new TDVMCALL_4() Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 08/20] x86/tdx: Convert MMIO handling to use new TDVMCALL macros Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 09/20] x86/tdx: Convert MAP_GPA hypercall " Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 10/20] x86/tdx: Convert GET_QUOTE " Kirill A. Shutemov
2024-05-17 14:19 ` Kirill A. Shutemov [this message]
2024-05-17 14:19 ` [PATCH 12/20] x86/tdx: Rewrite tdx_kvm_hypercall() without __tdx_hypercall() Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 13/20] x86/tdx: Rewrite hv_tdx_hypercall() " Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 14/20] x86/tdx: Add macros to generate TDCALL wrappers Kirill A. Shutemov
2024-05-17 17:04   ` Paolo Bonzini
2024-05-17 14:19 ` [PATCH 15/20] x86/tdx: Convert PAGE_ACCEPT tdcall to use new TDCALL_0() macro Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 16/20] x86/tdx: Convert VP_INFO tdcall to use new TDCALL_5() macro Kirill A. Shutemov
2024-05-17 15:57   ` Dave Hansen
2024-05-20 11:02     ` Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 17/20] x86/tdx: Convert VM_RD/VM_WR tdcalls to use new TDCALL macros Kirill A. Shutemov
2024-05-17 16:07   ` Dave Hansen
2024-05-17 14:19 ` [PATCH 18/20] x86/tdx: Convert VP_VEINFO_GET tdcall to use new TDCALL_5() macro Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 19/20] x86/tdx: Convert MR_REPORT tdcall to use new TDCALL_0() macro Kirill A. Shutemov
2024-05-17 14:19 ` [PATCH 20/20] x86/tdx: Remove old TDCALL wrappers Kirill A. Shutemov
2024-05-17 15:18 ` [PATCH 00/20] x86/tdx: Rewrite " Dave Hansen
2024-05-20 11:56   ` Huang, Kai

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=20240517141938.4177174-12-kirill.shutemov@linux.intel.com \
    --to=kirill.shutemov@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=decui@microsoft.com \
    --cc=haiyangz@microsoft.com \
    --cc=hpa@zytor.com \
    --cc=jpoimboe@kernel.org \
    --cc=kys@microsoft.com \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=wei.liu@kernel.org \
    --cc=x86@kernel.org \
    /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