From nobody Sat Sep 26 12:26:50 2026 Received: from mta0.migadu.com (out-247.mta0.migadu.com [91.218.175.247]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AF51330D4C for ; Tue, 1 Sep 2026 14:03:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.247 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271419; cv=none; b=Z+4HFQ1v1aizM6ujU0eMD3udjOOANjLONUCJ4+Ad+MrvCMjPVlJbeZvWCLTYMascTZj0WT64bpKE6s3XVLMFFCB+6flqngHuZrKdfBik6o5uZC5Qj1nsuuLYquORJw6D0TdLYsfbEihEW9gU9GjG/9nqqOSmU5O0omRBsEwxUxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271419; c=relaxed/simple; bh=YdyDvE3tN60IKzKfKyZI9bbbKb+LrCKA/IsBMvtv8gM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kJgStsTOPB4Ls7ALxpHUo3qrt9wy8NnnEY6kI5h4XQMZRHo9n9BcooJ1H2DPpkOiZ4XSS0BPwUCOze3x7bCK+HxpYYce414aF45Np60b3neOWOj+2H4aLdGnw+URYQALfqKgYme1dX7Qb8BwI0GzvLNJk6oAksLPtwXCd3C2JzA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=QN3PvCMk; arc=none smtp.client-ip=91.218.175.247 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="QN3PvCMk" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=YdyDvE3tN60IKzKfKyZI9bbbKb+LrCKA/IsBMvtv8gM=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271415; v=1; x=1788876215; b=QN3PvCMkOmsnmsmxBsIxKWh1MLXPGkcc3sbyM9io/bH23fIOXCRcUoS72aabrWAeWufWz+FK 7N231+KncTNWxFC9NEuJvZwrdGoI9JhYQGm8cHp7cJ4u75pbpU2k5jYkV1Q4eUV5j4Tn2TLmHHq MW9MXItXe5+ge8aOxCstOfto= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id ef121039728df9a3; Tue, 01 Sep 2026 14:03:34 +0000 X-Mizu-Trace-ID: ef121039728df9a3 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 01/11] tracing: Include linux/types.h in trace_remote_event.h Date: Tue, 1 Sep 2026 15:03:16 +0100 Message-Id: <20260901140326.3812068-2-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" trace_remote_event.h uses bool without including linux/types.h, so a translation unit that includes it ahead of anything else that pulls types.h in fails to build, as with nvhe/trace.h at EL2. Reviewed-by: Vincent Donnefort Reviewed-by: Marc Zyngier Acked-by: Steven Rostedt Signed-off-by: Fuad Tabba --- include/linux/trace_remote_event.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/trace_remote_event.h b/include/linux/trace_remot= e_event.h index c8ae1e1f5e721..e4cc2d4497bcf 100644 --- a/include/linux/trace_remote_event.h +++ b/include/linux/trace_remote_event.h @@ -3,6 +3,8 @@ #ifndef _LINUX_TRACE_REMOTE_EVENTS_H #define _LINUX_TRACE_REMOTE_EVENTS_H =20 +#include + struct trace_remote; struct trace_event_fields; struct trace_seq; --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-56.mta1.migadu.com [95.215.58.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A1FEC330D4C for ; Tue, 1 Sep 2026 14:03:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271425; cv=none; b=TMeDdjUFGG3jf8fKEOlgaugvnK5F8pZD9Y/WkF+jMvUIXoOAM7QuKsMO62O+VgkiYR7DTg0P/WVNTR6slv1kXoaASswdErDsr0unoTTbU5LYspXV4EzWrsgN5DlY/+9QkeI9gGYOCYyAH3xHhWRbUiaEPFKEdMmMVWKGlt4CQDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271425; c=relaxed/simple; bh=Xa6Kq1v4hXNOqZBVImzJqeYJPb/TLqmgh6LUUUVzTz0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qws/LUnhsvH35+7vSuy5DTAYGYnKFK8s9jKf8HgxavMxUEI0vTkQT0H7zO88UQbTHScqY2JFOiIjsVCRrvM5+pC78emUjKqS3NFcWLnOaj3iXXUBpJP+vp9KHPCgrkKH64DLYGGyfGO9/y9OWkewAtSN7wsmMuNfsshsLi+KD80= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=kAkv1oal; arc=none smtp.client-ip=95.215.58.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="kAkv1oal" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=Xa6Kq1v4hXNOqZBVImzJqeYJPb/TLqmgh6LUUUVzTz0=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271421; v=1; x=1788876221; b=kAkv1oalOozkUy+YKVq7fbszCcBvNpxgzII7f0ummXHgRLgCU/wzRRT4Ts7jHnH7sF+h5qX2 0D7FULNR3aqpdi8xWPXvIK0YfkMoDdHIhO1iwJPwYaiuPx7QBolqS4jMMxjj+82znqT4HdRGnxy e7rYw8JSMvEahAucqLXya4ts= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 3bdfeb0c7760ac87; Tue, 01 Sep 2026 14:03:41 +0000 X-Mizu-Trace-ID: 3bdfeb0c7760ac87 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 02/11] KVM: arm64: nVHE: Share the stacktrace per-CPU declarations with EL2 Date: Tue, 1 Sep 2026 15:03:17 +0100 Message-Id: <20260901140326.3812068-3-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The declarations for overflow_stack, kvm_stacktrace_info and pkvm_stacktrace are only visible to the host (the first two sit in the host-only section of stacktrace/nvhe.h, the last is private to kvm/stacktrace.c), so the definitions in nvhe/stacktrace.c compile with no declaration in sight and sparse suggests making them static. DECLARE_KVM_NVHE_PER_CPU() resolves to the right symbol name on both sides of the build: move the declarations where both can see them and include the header from the EL2 side unconditionally. No functional change intended. Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/stacktrace/nvhe.h | 10 ++++++++-- arch/arm64/kvm/hyp/nvhe/stacktrace.c | 3 +-- arch/arm64/kvm/stacktrace.c | 3 --- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/stacktrace/nvhe.h b/arch/arm64/include/= asm/stacktrace/nvhe.h index 171f9edef49fc..a631a577cbe5d 100644 --- a/arch/arm64/include/asm/stacktrace/nvhe.h +++ b/arch/arm64/include/asm/stacktrace/nvhe.h @@ -37,6 +37,14 @@ static inline void kvm_nvhe_unwind_init(struct unwind_st= ate *state, state->pc =3D pc; } =20 +DECLARE_KVM_NVHE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)],= overflow_stack); +DECLARE_KVM_NVHE_PER_CPU(struct kvm_nvhe_stacktrace_info, kvm_stacktrace_i= nfo); + +#ifdef CONFIG_PKVM_STACKTRACE +DECLARE_KVM_NVHE_PER_CPU(unsigned long [NVHE_STACKTRACE_SIZE/sizeof(long)], + pkvm_stacktrace); +#endif + #ifndef __KVM_NVHE_HYPERVISOR__ /* * Conventional (non-protected) nVHE HYP stack unwinder @@ -45,8 +53,6 @@ static inline void kvm_nvhe_unwind_init(struct unwind_sta= te *state, * (by the host in EL1). */ =20 -DECLARE_KVM_NVHE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)],= overflow_stack); -DECLARE_KVM_NVHE_PER_CPU(struct kvm_nvhe_stacktrace_info, kvm_stacktrace_i= nfo); DECLARE_PER_CPU(unsigned long, kvm_arm_hyp_stack_base); =20 void kvm_nvhe_dump_backtrace(unsigned long hyp_offset); diff --git a/arch/arm64/kvm/hyp/nvhe/stacktrace.c b/arch/arm64/kvm/hyp/nvhe= /stacktrace.c index 7c832d60d22bb..11fadbebbf1d6 100644 --- a/arch/arm64/kvm/hyp/nvhe/stacktrace.c +++ b/arch/arm64/kvm/hyp/nvhe/stacktrace.c @@ -8,6 +8,7 @@ #include #include #include +#include =20 DEFINE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_= stack) __aligned(16); @@ -35,8 +36,6 @@ static void hyp_prepare_backtrace(unsigned long fp, unsig= ned long pc) } =20 #ifdef CONFIG_PKVM_STACKTRACE -#include - DEFINE_PER_CPU(unsigned long [NVHE_STACKTRACE_SIZE/sizeof(long)], pkvm_sta= cktrace); =20 static struct stack_info stackinfo_get_overflow(void) diff --git a/arch/arm64/kvm/stacktrace.c b/arch/arm64/kvm/stacktrace.c index 9724c320126b7..69377195e18b7 100644 --- a/arch/arm64/kvm/stacktrace.c +++ b/arch/arm64/kvm/stacktrace.c @@ -198,9 +198,6 @@ static void hyp_dump_backtrace(unsigned long hyp_offset) } =20 #ifdef CONFIG_PKVM_STACKTRACE -DECLARE_KVM_NVHE_PER_CPU(unsigned long [NVHE_STACKTRACE_SIZE/sizeof(long)], - pkvm_stacktrace); - /* * pkvm_dump_backtrace - Dump the protected nVHE HYP backtrace. * --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta0.migadu.com (out-6.mta0.migadu.com [91.218.175.6]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFB3538AC8C for ; Tue, 1 Sep 2026 14:03:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.6 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271427; cv=none; b=FRm3XkRRIB2uDWniYq/8YuEtPao4fdi4jeQrVYR/JVXl72vLdVRR/HTDO+EiFxD+Af0/o4BOmwGJxkWWJ0E26oK0276vb7Y4o0KHSv2LxS0HJ2hYs8ZEnm5kz7ElYdI8gaUy2z4n9X9ADmiSA0+rcMczuyTTaRafcVK47UxoOZ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271427; c=relaxed/simple; bh=OVNe98vubbbTaN+IclJcwO0viGj4aPmde+BOllis7HY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=i5rTtBRuIImWXM790NXw1hG7a7KtzcoH28GtEdmvQkeTm82rPghgL73hmuTjZiKsg5DcCGVbynmLBPoy2PLwdnUYikg3JgBJU0Ygf/FDt6XvJwYUOVdLUPYw+A++vfMiaptHcJ9M41xXipPBoOVG04vrrgyes19Gfj4DIEs6184= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=SPREFmMz; arc=none smtp.client-ip=91.218.175.6 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="SPREFmMz" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=OVNe98vubbbTaN+IclJcwO0viGj4aPmde+BOllis7HY=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271423; v=1; x=1788876223; b=SPREFmMz9ERsVI/0Osbk6FbC9l11v9e5eetogDze18l67FCMOEy70FmaDl76+Z7pvHS5TuY0 bwYJ1X9sZVRo3DpGfJdXRlKqjTMjpmeipXsygGok2F1rU9kVb+GOV0In/PbO//XDilmYHS5eNZD fqnkuQWFH5tEg7WS/HQvezLE= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 230a545285999ef8; Tue, 01 Sep 2026 14:03:43 +0000 X-Mizu-Trace-ID: 230a545285999ef8 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 03/11] KVM: arm64: nVHE: Declare the hyp event IDs before defining them Date: Tue, 1 Sep 2026 15:03:18 +0100 Message-Id: <20260901140326.3812068-4-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The defining expansion of HYP_EVENT() in events.c is the first time its translation unit meets hyp_event_id_, so sparse suggests making the symbols static. Include kvm_hypevents.h ahead of define_events.h so the extern declarations come first, as with the tracepoint headers. No functional change intended. Reviewed-by: Vincent Donnefort Tested-by: Vincent Donnefort Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/nvhe/events.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/kvm/hyp/nvhe/events.c b/arch/arm64/kvm/hyp/nvhe/eve= nts.c index add9383aadb5a..b845be0acd117 100644 --- a/arch/arm64/kvm/hyp/nvhe/events.c +++ b/arch/arm64/kvm/hyp/nvhe/events.c @@ -7,6 +7,8 @@ #include #include =20 +#include + #include =20 int __tracing_enable_event(unsigned short id, bool enable) --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-65.mta1.migadu.com [95.215.58.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 20F16391825 for ; Tue, 1 Sep 2026 14:03:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271429; cv=none; b=JdQpF4Z3lW2sYg55mH0r8dQ41yyRlLQLHe0jWzzwJcDTGV4hHRpLbe1NV6VeK4sg8eTq7dG25eeUbuF3le3Qh1GNg7Sj16Aygsz/0yHMZATFEsneD8lNvOOsRfabUgBl6021A2KXY+7srHSK7kIVCEmoZlbI/8kGzqJbK757n+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271429; c=relaxed/simple; bh=uDsuAnLNnU/9FbomYpxDpdOtNj5Fp6L1FTXJrLSwlZA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rGWSIH7lWPPqjIos57BFwwdxG2WL0KIKe2OIaTgOH1DXwJwe1oZ+bZvUvjyv41oJvoiMU6eIjLjvNJVtKkbV8vXK3cAHOMf9kOMr9EGyv7PZjwhEu+prEN0/dF1PCCR6FTsj5poMWcGomJMdz/SQZkbIH7WilNBoFeoMu2hpEOA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=p1oz/paa; arc=none smtp.client-ip=95.215.58.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="p1oz/paa" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=uDsuAnLNnU/9FbomYpxDpdOtNj5Fp6L1FTXJrLSwlZA=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271426; v=1; x=1788876226; b=p1oz/paajAhGNzLBmF4XylwgnW/7Yu/qoh9wkZx1qEGK8OKOnrMUBfuUZPWqN+4fFUp4F55V UTGu9CPiL2phIMefKowiFzsvTyY5bzrFGehq5flVQR0+3FyhCzH6TWv7gn90rYdcVY2TtuGI63P Eow6vgi+R8KGo5xBY29hGi6M= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 075fd54c7f0e61d6; Tue, 01 Sep 2026 14:03:45 +0000 X-Mizu-Trace-ID: 075fd54c7f0e61d6 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 04/11] KVM: arm64: nVHE: Use NULL to reset the trace buffer backing pointer Date: Tue, 1 Sep 2026 15:03:19 +0100 Message-Id: <20260901140326.3812068-5-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" bpages_backing_start is a pointer; resetting it to plain 0 triggers a sparse warning. No functional change intended. Reviewed-by: Vincent Donnefort Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/nvhe/trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/nvhe/trace.c b/arch/arm64/kvm/hyp/nvhe/trac= e.c index 65be6c9fb379d..5437ebb6dbd67 100644 --- a/arch/arm64/kvm/hyp/nvhe/trace.c +++ b/arch/arm64/kvm/hyp/nvhe/trace.c @@ -93,7 +93,7 @@ static void hyp_trace_buffer_unload_bpage_backing(struct = hyp_trace_buffer *trace =20 __release_host_mem(start, size); =20 - trace_buffer->bpages_backing_start =3D 0; + trace_buffer->bpages_backing_start =3D NULL; trace_buffer->bpages_backing_size =3D 0; } =20 --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-76.mta1.migadu.com [95.215.58.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0177C3911C9 for ; Tue, 1 Sep 2026 14:04:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271447; cv=none; b=gfcy7upx6pwIJJWbmmYhFV0hPv65sNjfU9flwmZiW8TxmoPk+OkxKI4wS7Iut8WKbohYhuaHWf4KXfwyS9J9uGLnsmFts+Shnbzl7xoCG/xjgOdy683TxJ0HUQ5XdCw0tjOsDBkC2cVuYcTiiwGREE7ne+ziniRZZiLcpwS0tVk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271447; c=relaxed/simple; bh=nf9m83+hrKqgn8YWup9R6VRwseln6uhzrpOiLyHdB7Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=knSsCjw3xQSwC6qMFPFVXSxR7HTppLjAOfPzY6LAU2hwZlJiyxLlpddFst+XIYXlGL9HOMvXbBw2Dr3I7mKv6n1CrBd4FPss9X5VIJyh8spJt3P2n6F5yNhRlJIaxs20CzpOR7DbYP1O58PzwBsUYr3qqVUNOeYxTFL0VbNS8jk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Zncaz+Aq; arc=none smtp.client-ip=95.215.58.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Zncaz+Aq" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=nf9m83+hrKqgn8YWup9R6VRwseln6uhzrpOiLyHdB7Q=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271443; v=1; x=1788876243; b=Zncaz+Aq55l6zKrKuKdZ9uKk58puDA7hTL/UKDk6P7pYoBnaEJ0YSWVtMA5fjysMXq4ZWmPq awgIUS0qeD5/xME7YU8zd4pjevZQ4nTHsk6FzMjjOkvH4tUFWaflpN16Ihl6Qk+Y2YdioeExYoI ofGonMD0is4hR1k2Id2rKmD4= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 652305927580f4db; Tue, 01 Sep 2026 14:04:03 +0000 X-Mizu-Trace-ID: 652305927580f4db X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 05/11] KVM: arm64: nVHE: Run the source checker under C=2 Date: Tue, 1 Sep 2026 15:03:20 +0100 Message-Id: <20260901140326.3812068-6-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The custom %.nvhe.o rule reuses rule_cc_o_c, which hooks the source checker only for C=3D1, and that only when the object is rebuilt. The C=3D2 hook, cmd_force_checksrc, hangs off the standard %.o rule that nVHE objects do not use, so "make C=3D2" silently skips every nVHE source file. Call cmd_force_checksrc after the compile rule, as the standard rule does. Fixes: 7621712918ad4 ("KVM: arm64: Add build rules for separate VHE/nVHE ob= ject files") Reviewed-by: Vincent Donnefort Tested-by: Vincent Donnefort Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/nvhe/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/kvm/hyp/nvhe/Makefile b/arch/arm64/kvm/hyp/nvhe/Mak= efile index f57450ebcb498..ccc1fe8394094 100644 --- a/arch/arm64/kvm/hyp/nvhe/Makefile +++ b/arch/arm64/kvm/hyp/nvhe/Makefile @@ -49,6 +49,7 @@ targets +=3D $(hyp-obj) kvm_nvhe.tmp.o kvm_nvhe.rel.o hyp= .lds hyp-reloc.S hyp-relo # avoids file name clashes for files shared with VHE. $(obj)/%.nvhe.o: $(src)/%.c FORCE $(call if_changed_rule,cc_o_c) + $(call cmd,force_checksrc) $(obj)/%.nvhe.o: $(src)/%.S FORCE $(call if_changed_rule,as_o_S) =20 --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-79.mta1.migadu.com [95.215.58.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F4DD3C3F6A for ; Tue, 1 Sep 2026 14:04:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.79 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271449; cv=none; b=cwH0W+X/PM3Wi65vXcmh9ZHy7+LEl01A6VhBIliDx8hcZpLeOzRDSMyM23t8Cx6e5kfxVEaEjV24olH76XAJmN1pKf4PhjIfA4yTkRH1nTloBNIy27UxG7n4uXNfLJAh33Bnzr1vNN8DY+4KMKJqktm6hNw+0Oo6tmxTM6CSq8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271449; c=relaxed/simple; bh=aVU75XT42/hoFARBw3KCuAe4snE6JpMOO83ThRddGtE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kdQ9mzkCfcSvk3DFxgsFKcF5XG/snxViTh63n+2UKsdYSdRbUg4/+EuxHskoSkRePvMgWLORBbareBmj0/SkG+YkD0mm7nmvOop2Lo98h71lijt8a0RdrLF00IDiAv1tXQ/t4JGjE5AobBHGrfer7V/PHyJc7aD4CX8OypUWF3g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=TEJK32QA; arc=none smtp.client-ip=95.215.58.79 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="TEJK32QA" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=aVU75XT42/hoFARBw3KCuAe4snE6JpMOO83ThRddGtE=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271444; v=1; x=1788876244; b=TEJK32QAnVRKxxgM2CoHvbaPH9Kc+9fhgwbcM+HlvyMfIXeMtZJYxWLc/caeCyl+lCtAo0ob TILOD7ee4F0/yyi37wfHx6F/xoht47y2RTgEAk/SL4Zg6cEwrUyd2Mxa5kYPHybM61BcUvJie8v 7pRLsCfp84LHxf5qG8/khgFc= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 64e57d984ad2e962; Tue, 01 Sep 2026 14:04:04 +0000 X-Mizu-Trace-ID: 64e57d984ad2e962 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 06/11] arm64: pi: Run the source checker on the libfdt objects under C=2 Date: Tue, 1 Sep 2026 15:03:21 +0100 Message-Id: <20260901140326.3812068-7-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The custom lib-%.o rule reuses rule_cc_o_c, which hooks the source checker only for C=3D1, and that only when the object is rebuilt. The C=3D2 hook, cmd_force_checksrc, hangs off the standard %.o rule, so "make C=3D2" silently skips the two libfdt objects. Call cmd_force_checksrc after the compile rule, as the standard rule does. Fixes: aacd149b6238 ("arm64: head: avoid relocating the kernel twice for KA= SLR") Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/kernel/pi/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/kernel/pi/Makefile b/arch/arm64/kernel/pi/Makefile index be92d73c25b21..96243c291e39d 100644 --- a/arch/arm64/kernel/pi/Makefile +++ b/arch/arm64/kernel/pi/Makefile @@ -34,6 +34,7 @@ $(obj)/lib-%.pi.o: OBJCOPYFLAGS +=3D --prefix-alloc-secti= ons=3D.init =20 $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE $(call if_changed_rule,cc_o_c) + $(call cmd,force_checksrc) =20 obj-y :=3D idreg-override.pi.o \ map_kernel.pi.o map_range.pi.o \ --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta0.migadu.com (out-38.mta0.migadu.com [91.218.175.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86D5B37F739 for ; Tue, 1 Sep 2026 14:04:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.38 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271452; cv=none; b=AkP+pYl6FOOzT6kHgkK8jEFJ3rrvT+SRi++nUcNI7KBgFQJwbkd1Bf6KjN0yaUTjygsYWdFfU4Qgr7kSxgdxuC5pAVDOzu9ff5JRAGCEyXwbi2xDkwoahkTP9ZlisTwO25091qeOTzqcfGsWsJwdKbNS3CQwLSnt8EYvtoEZVEA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271452; c=relaxed/simple; bh=V7VKhJ0Cy68x2iasZRjsMlN1vnasqko203kWZGLZAHM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=SuKLwwIBGen6necA7rgGB8XuKgj8ezDXuHXc4H9N7MDG9LzGeeFeW1j4WxWNFst4dK/w4ZO2cu+08tFBQUvn0nYbvPVx6eGmuAF0zTfXX7wo6u2OwhI4TYczSHVM9lT/Au3oCFUEBxrc++k6ABsL5sMpDEGgnGUgHfbBawr0144= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=mL1KkVbE; arc=none smtp.client-ip=91.218.175.38 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="mL1KkVbE" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=V7VKhJ0Cy68x2iasZRjsMlN1vnasqko203kWZGLZAHM=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271447; v=1; x=1788876247; b=mL1KkVbEkMLA7Ch3glFKMjkrphGaP2CI0GIR9hhsA/ZzBZsCDiabxpJ0p1ETmSSS8BhwdC8W H+Ig/5rwRqWtUzIe7zVtPdn0VOrOXEUSojh7XucTzLQgLrAoFvkFWymrNGbp8lnCvjPLar2wuKP gx/+mShjLPHT1iipFTtRIM40= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 225d5575bd02847a; Tue, 01 Sep 2026 14:04:07 +0000 X-Mizu-Trace-ID: 225d5575bd02847a X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 07/11] KVM: arm64: nVHE: Pass host VA arguments as pointers Date: Tue, 1 Sep 2026 15:03:22 +0100 Message-Id: <20260901140326.3812068-8-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Four hypercalls take host VAs as unsigned long: the donated vm, pgd and vcpu regions, and the tracing descriptor. Retype the arguments and their EL2 consumers as void *, so that the typed hypercall declarations introduced later in the series can attach a sparse address space to them; an address space attaches only to pointers. No functional change intended. Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 5 ++--- arch/arm64/kvm/hyp/include/nvhe/trace.h | 4 ++-- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 8 ++++---- arch/arm64/kvm/hyp/nvhe/pkvm.c | 11 +++++------ arch/arm64/kvm/hyp/nvhe/trace.c | 4 ++-- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h b/arch/arm64/kvm/hyp/in= clude/nvhe/pkvm.h index c904647d2f760..2643a1a819668 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h @@ -69,10 +69,9 @@ void pkvm_hyp_vm_table_init(void *tbl); =20 int __pkvm_reserve_vm(void); void __pkvm_unreserve_vm(pkvm_handle_t handle); -int __pkvm_init_vm(struct kvm *host_kvm, unsigned long vm_hva, - unsigned long pgd_hva); +int __pkvm_init_vm(struct kvm *host_kvm, void *vm_hva, void *pgd_hva); int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, - unsigned long vcpu_hva); + void *vcpu_hva); =20 int __pkvm_reclaim_dying_guest_page(pkvm_handle_t handle, u64 gfn); int __pkvm_start_teardown_vm(pkvm_handle_t handle); diff --git a/arch/arm64/kvm/hyp/include/nvhe/trace.h b/arch/arm64/kvm/hyp/i= nclude/nvhe/trace.h index 8813ff250f8e0..4aa36fd76b9e2 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/trace.h +++ b/arch/arm64/kvm/hyp/include/nvhe/trace.h @@ -46,7 +46,7 @@ static inline pid_t __tracing_get_vcpu_pid(struct kvm_cpu= _context *host_ctxt) void *tracing_reserve_entry(unsigned long length); void tracing_commit_entry(void); =20 -int __tracing_load(unsigned long desc_va, size_t desc_size); +int __tracing_load(void *desc_va, size_t desc_size); void __tracing_unload(void); int __tracing_enable(bool enable); int __tracing_swap_reader(unsigned int cpu); @@ -59,7 +59,7 @@ static inline void tracing_commit_entry(void) { } #define HYP_EVENT(__name, __proto, __struct, __assign, __printk) \ static inline void trace_##__name(__proto) {} =20 -static inline int __tracing_load(unsigned long desc_va, size_t desc_size) = { return -ENODEV; } +static inline int __tracing_load(void *desc_va, size_t desc_size) { return= -ENODEV; } static inline void __tracing_unload(void) { } static inline int __tracing_enable(bool enable) { return -ENODEV; } static inline int __tracing_swap_reader(unsigned int cpu) { return -ENODEV= ; } diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/h= yp-main.c index 9a3b92e626adb..61fcb382197d9 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -771,8 +771,8 @@ static void handle___pkvm_unreserve_vm(struct kvm_cpu_c= ontext *host_ctxt) static void handle___pkvm_init_vm(struct kvm_cpu_context *host_ctxt) { DECLARE_REG(struct kvm *, host_kvm, host_ctxt, 1); - DECLARE_REG(unsigned long, vm_hva, host_ctxt, 2); - DECLARE_REG(unsigned long, pgd_hva, host_ctxt, 3); + DECLARE_REG(void *, vm_hva, host_ctxt, 2); + DECLARE_REG(void *, pgd_hva, host_ctxt, 3); =20 host_kvm =3D kern_hyp_va(host_kvm); cpu_reg(host_ctxt, 1) =3D __pkvm_init_vm(host_kvm, vm_hva, pgd_hva); @@ -782,7 +782,7 @@ static void handle___pkvm_init_vcpu(struct kvm_cpu_cont= ext *host_ctxt) { DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); DECLARE_REG(struct kvm_vcpu *, host_vcpu, host_ctxt, 2); - DECLARE_REG(unsigned long, vcpu_hva, host_ctxt, 3); + DECLARE_REG(void *, vcpu_hva, host_ctxt, 3); =20 host_vcpu =3D kern_hyp_va(host_vcpu); cpu_reg(host_ctxt, 1) =3D __pkvm_init_vcpu(handle, host_vcpu, vcpu_hva); @@ -828,7 +828,7 @@ static void handle___pkvm_finalize_teardown_vm(struct k= vm_cpu_context *host_ctxt =20 static void handle___tracing_load(struct kvm_cpu_context *host_ctxt) { - DECLARE_REG(unsigned long, desc_hva, host_ctxt, 1); + DECLARE_REG(void *, desc_hva, host_ctxt, 1); DECLARE_REG(size_t, desc_size, host_ctxt, 2); =20 cpu_reg(host_ctxt, 1) =3D __tracing_load(desc_hva, desc_size); diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 459bd9eb7e4bc..6c8e33ebf8bb6 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -657,9 +657,9 @@ static size_t pkvm_get_hyp_vm_size(unsigned int nr_vcpu= s) size_mul(sizeof(struct pkvm_hyp_vcpu *), nr_vcpus)); } =20 -static void *map_donated_memory_noclear(unsigned long host_va, size_t size) +static void *map_donated_memory_noclear(void *host_va, size_t size) { - void *va =3D (void *)kern_hyp_va(host_va); + void *va =3D kern_hyp_va(host_va); =20 if (!PAGE_ALIGNED(va)) return NULL; @@ -671,7 +671,7 @@ static void *map_donated_memory_noclear(unsigned long h= ost_va, size_t size) return va; } =20 -static void *map_donated_memory(unsigned long host_va, size_t size) +static void *map_donated_memory(void *host_va, size_t size) { void *va =3D map_donated_memory_noclear(host_va, size); =20 @@ -818,8 +818,7 @@ void teardown_selftest_vm(void) * * Return 0 success, negative error code on failure. */ -int __pkvm_init_vm(struct kvm *host_kvm, unsigned long vm_hva, - unsigned long pgd_hva) +int __pkvm_init_vm(struct kvm *host_kvm, void *vm_hva, void *pgd_hva) { struct pkvm_hyp_vm *hyp_vm =3D NULL; size_t vm_size, pgd_size; @@ -910,7 +909,7 @@ static int register_hyp_vcpu(struct pkvm_hyp_vm *hyp_vm, } =20 int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, - unsigned long vcpu_hva) + void *vcpu_hva) { struct pkvm_hyp_vcpu *hyp_vcpu; struct pkvm_hyp_vm *hyp_vm; diff --git a/arch/arm64/kvm/hyp/nvhe/trace.c b/arch/arm64/kvm/hyp/nvhe/trac= e.c index 5437ebb6dbd67..eaa63b06a286c 100644 --- a/arch/arm64/kvm/hyp/nvhe/trace.c +++ b/arch/arm64/kvm/hyp/nvhe/trace.c @@ -206,9 +206,9 @@ static bool hyp_trace_desc_is_valid(struct hyp_trace_de= sc *desc, size_t desc_siz return true; } =20 -int __tracing_load(unsigned long desc_hva, size_t desc_size) +int __tracing_load(void *desc_hva, size_t desc_size) { - struct hyp_trace_desc *desc =3D (struct hyp_trace_desc *)kern_hyp_va(desc= _hva); + struct hyp_trace_desc *desc =3D kern_hyp_va(desc_hva); int ret; =20 ret =3D __admit_host_mem(desc, desc_size); --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta0.migadu.com (out-48.mta0.migadu.com [91.218.175.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A5FF432E95 for ; Tue, 1 Sep 2026 14:04:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271455; cv=none; b=cGP4vZBMvq5e+74TAevC1MedZIsYIDKBxSjIZqStqhQTJ0wuEQF+ZqzlYvqAb8co9sm2PvsOOZl6S5daDfc/yo1B9vSydlt7IuV9f/FMRVNlD4MtOY7d6gsQQQkGy3TVbv2Vb5bf+uPqLcRoWZnPzXzu6ZEnuYMC9lYaR1GCuqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271455; c=relaxed/simple; bh=gMjU6HxUBqyOmVsH7kx/51tONrnIBME16hAsrOyuaWY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZbTsO6D3ZqqCp2OX0r/Z62raQgIytjXj0Gy+Lm9L9CySPhRyKlMxBgwvE08o9i72c4SycWByRneDRaijdLD/RGvUmp+VJXUJtHb0JihTsdWdTCjuGJ+ePt8tr6U6/zKxgqWCl7A/bbKnHDUiFQ3tkNuhz7durC3ALoCwDs2+nMQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=d8mhu340; arc=none smtp.client-ip=91.218.175.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="d8mhu340" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=gMjU6HxUBqyOmVsH7kx/51tONrnIBME16hAsrOyuaWY=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271450; v=1; x=1788876250; b=d8mhu340rSlSPxVn63W/cAnfIcDn92TxhdxuBlFCAlFncHsByS2ChBGKwUCBN/su9th6pSD6 sOsMLNXJm1PYmbLck6lbltdXtQGUivMmp45X40gu7qdpaka42b6NjoBKgOxDTnVSgylq9b19SL4 XtFm6AV6nTIlBi/ZQGJfhq78= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 094541539e69b34e; Tue, 01 Sep 2026 14:04:10 +0000 X-Mizu-Trace-ID: 094541539e69b34e X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 08/11] KVM: arm64: Move the host hypercall interface to its own header Date: Tue, 1 Sep 2026 15:03:23 +0100 Message-Id: <20260901140326.3812068-9-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the kvm_call_hyp() dispatch macros and pkvm_handle_t out of kvm_host.h into a new kvm_hcall.h, giving the host<->hyp hypercall interface a single home that subsequent patches build on to restore type-checking across the boundary. The only adjustment to the moved code is the checkpatch-mandated space in "while (0)". No functional change intended. Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_hcall.h | 68 ++++++++++++++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 48 +-------------------- 2 files changed, 69 insertions(+), 47 deletions(-) create mode 100644 arch/arm64/include/asm/kvm_hcall.h diff --git a/arch/arm64/include/asm/kvm_hcall.h b/arch/arm64/include/asm/kv= m_hcall.h new file mode 100644 index 0000000000000..d925b2c28a3d8 --- /dev/null +++ b/arch/arm64/include/asm/kvm_hcall.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * The host<->hyp hypercall interface. + * + * Copyright (C) 2026 Google LLC + * Author: Fuad Tabba + */ + +#ifndef __ARM64_KVM_HCALL_H__ +#define __ARM64_KVM_HCALL_H__ + +#include +#include +#include +#include + +#include +#include +#include + +typedef u16 pkvm_handle_t; + +#ifndef __KVM_NVHE_HYPERVISOR__ +#define kvm_call_hyp_nvhe(f, ...) \ + ({ \ + struct arm_smccc_res res; \ + \ + arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(f), \ + ##__VA_ARGS__, &res); \ + if (WARN_ON(res.a0 !=3D SMCCC_RET_SUCCESS)) \ + res.a1 =3D -EOPNOTSUPP; \ + \ + res.a1; \ + }) + +/* + * The isb() below is there to guarantee the same behaviour on VHE as on != VHE, + * where the eret to EL1 acts as a context synchronization event. + */ +#define kvm_call_hyp(f, ...) \ + do { \ + if (has_vhe()) { \ + f(__VA_ARGS__); \ + isb(); \ + } else { \ + kvm_call_hyp_nvhe(f, ##__VA_ARGS__); \ + } \ + } while (0) + +#define kvm_call_hyp_ret(f, ...) \ + ({ \ + typeof(f(__VA_ARGS__)) ret; \ + \ + if (has_vhe()) { \ + ret =3D f(__VA_ARGS__); \ + } else { \ + ret =3D kvm_call_hyp_nvhe(f, ##__VA_ARGS__); \ + } \ + \ + ret; \ + }) +#else /* __KVM_NVHE_HYPERVISOR__ */ +#define kvm_call_hyp(f, ...) f(__VA_ARGS__) +#define kvm_call_hyp_ret(f, ...) f(__VA_ARGS__) +#define kvm_call_hyp_nvhe(f, ...) f(__VA_ARGS__) +#endif /* __KVM_NVHE_HYPERVISOR__ */ + +#endif /* __ARM64_KVM_HCALL_H__ */ diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index 27fe0cd5b2d7a..fc1a82777ed48 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #define __KVM_HAVE_ARCH_INTC_INITIALIZED @@ -251,8 +252,6 @@ struct kvm_smccc_features { unsigned long vendor_hyp_bmap_2; /* Function numbers 64-127 */ }; =20 -typedef u16 pkvm_handle_t; - struct kvm_protected_vm { pkvm_handle_t handle; struct kvm_hyp_memcache teardown_mc; @@ -1258,51 +1257,6 @@ void kvm_arm_resume_guest(struct kvm *kvm); =20 #define vcpu_has_run_once(vcpu) (!!READ_ONCE((vcpu)->pid)) =20 -#ifndef __KVM_NVHE_HYPERVISOR__ -#define kvm_call_hyp_nvhe(f, ...) \ - ({ \ - struct arm_smccc_res res; \ - \ - arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(f), \ - ##__VA_ARGS__, &res); \ - if (WARN_ON(res.a0 !=3D SMCCC_RET_SUCCESS)) \ - res.a1 =3D -EOPNOTSUPP; \ - \ - res.a1; \ - }) - -/* - * The isb() below is there to guarantee the same behaviour on VHE as on != VHE, - * where the eret to EL1 acts as a context synchronization event. - */ -#define kvm_call_hyp(f, ...) \ - do { \ - if (has_vhe()) { \ - f(__VA_ARGS__); \ - isb(); \ - } else { \ - kvm_call_hyp_nvhe(f, ##__VA_ARGS__); \ - } \ - } while(0) - -#define kvm_call_hyp_ret(f, ...) \ - ({ \ - typeof(f(__VA_ARGS__)) ret; \ - \ - if (has_vhe()) { \ - ret =3D f(__VA_ARGS__); \ - } else { \ - ret =3D kvm_call_hyp_nvhe(f, ##__VA_ARGS__); \ - } \ - \ - ret; \ - }) -#else /* __KVM_NVHE_HYPERVISOR__ */ -#define kvm_call_hyp(f, ...) f(__VA_ARGS__) -#define kvm_call_hyp_ret(f, ...) f(__VA_ARGS__) -#define kvm_call_hyp_nvhe(f, ...) f(__VA_ARGS__) -#endif /* __KVM_NVHE_HYPERVISOR__ */ - int handle_exit(struct kvm_vcpu *vcpu, int exception_index); void handle_exit_early(struct kvm_vcpu *vcpu, int exception_index); =20 --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-101.mta1.migadu.com [95.215.58.101]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 118E243BDC7 for ; Tue, 1 Sep 2026 14:04:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.101 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271456; cv=none; b=mOIMn/TA4AWlz9ndNXobE8OEPW5B+NfpJynScdWKaPaeVNJwSfubg7RqHeY3hkgR09sre5C+B+dyttwcE5tAhXGXn0A8GndbLklrRJhJXqtkF1FRT42Mxf+v125QwTk5XXinglhLkHl5EQU74rXNsB9dAa/oiIKourWlh6dB+cU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271456; c=relaxed/simple; bh=a7xyJsByfTivb0jMyL/MYZ2UZcV+uOUY1idBfcRftu4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=O3pm8IY/Hb3gpZrXlHcM1kcjmpIqU+a70UKIjMeg8Nx8DWmb0UCkSqMiqoRu46wq/kiwUdTV0tUUYkVDx/YFvMAsXgLAwRYwWljQEu/oZIcoNXj/ySOh+ljeJZ6BOpbkpSiYiTEN4lYVThSPq7vwY1fa9crfIVx1a7ePdLiDVto= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=GARZ1cPB; arc=none smtp.client-ip=95.215.58.101 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="GARZ1cPB" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=a7xyJsByfTivb0jMyL/MYZ2UZcV+uOUY1idBfcRftu4=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271452; v=1; x=1788876252; b=GARZ1cPBmUbca8YJVU2llykvwYYmZV2kdJC3LotkyHKKPsC2SKkz4JW7YOv4p05CzSkFHCBH TiPsJhKmq4Zi0wyRTaaVZ1dOUsU6cwf757lur9Jy1hPTsHq2M8fvxLxQm1QfvMxM4moeZgLegXU APdetnTWBl5W8+wMtvmo3xW8= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 4f38c450b1d7d3f9; Tue, 01 Sep 2026 14:04:11 +0000 X-Mizu-Trace-ID: 4f38c450b1d7d3f9 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 09/11] KVM: arm64: Type-check hypercall arguments at the caller Date: Tue, 1 Sep 2026 15:03:24 +0100 Message-Id: <20260901140326.3812068-10-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" kvm_call_hyp_nvhe() reduces its target to an SMCCC function number, so the compiler never sees a callable: arguments that are wrong in number, type or order are silently marshalled into registers. The kvm_call_hyp() wrappers only catch this on the VHE branch, and the pKVM-only hypercalls have no such branch. Declare each hypercall's signature once in kvm_hcall.h and generate a typed stub from it, in the mold of the syscall wrappers. Make kvm_call_hyp_nvhe() resolve to the stub so every caller is checked against the declared signature; a stale or mistyped call now fails to compile. The stubs inline to the same SMCCC call the untyped macro used to make: the compiled callers are unchanged, apart from hypercall returns now being tested at their declared width. The stage-2 protection arguments are declared u64 rather than enum kvm_pgtable_prot, as kvm_pgtable.h includes linux/kvm_host.h and the enum cannot be completed here. Assisted-by: Antigravity:gemini-3.1-pro Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_hcall.h | 153 ++++++++++++++++++++++++++++- arch/arm64/kvm/hyp_trace.c | 2 +- 2 files changed, 153 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hcall.h b/arch/arm64/include/asm/kv= m_hcall.h index d925b2c28a3d8..c2efcb89e6e70 100644 --- a/arch/arm64/include/asm/kvm_hcall.h +++ b/arch/arm64/include/asm/kvm_hcall.h @@ -9,6 +9,7 @@ #ifndef __ARM64_KVM_HCALL_H__ #define __ARM64_KVM_HCALL_H__ =20 +#include #include #include #include @@ -16,12 +17,37 @@ =20 #include #include +#include #include =20 typedef u16 pkvm_handle_t; =20 +struct kvm; +struct kvm_s2_mmu; +struct kvm_vcpu; +struct vgic_v3_cpu_if; +struct vgic_v5_cpu_if; + +/* + * Hypercall signatures are declared as (type, name) argument pairs. + * __KVM_HCALL_MAP() applies a macro to each pair, in the mold of __MAP() + * in . The ladder is indexed by list entries, two per + * argument; __KVM_HCALL_MAP_N() takes that count explicitly. + */ +#define __KVM_HCALL_MAP2(m, t, a, ...) m(t, a) +#define __KVM_HCALL_MAP4(m, t, a, ...) m(t, a), __KVM_HCALL_MAP2(m, __VA_A= RGS__) +#define __KVM_HCALL_MAP6(m, t, a, ...) m(t, a), __KVM_HCALL_MAP4(m, __VA_A= RGS__) +#define __KVM_HCALL_MAP8(m, t, a, ...) m(t, a), __KVM_HCALL_MAP6(m, __VA_A= RGS__) +#define __KVM_HCALL_MAP10(m, t, a, ...) m(t, a), __KVM_HCALL_MAP8(m, __VA_= ARGS__) +#define __KVM_HCALL_MAP12(m, t, a, ...) m(t, a), __KVM_HCALL_MAP10(m, __VA= _ARGS__) +#define __KVM_HCALL_MAP_N(n, m, ...) CONCATENATE(__KVM_HCALL_MAP, n)(m, __= VA_ARGS__) +#define __KVM_HCALL_MAP(m, ...) __KVM_HCALL_MAP_N(COUNT_ARGS(__VA_ARGS__),= m, __VA_ARGS__) + +#define __KVM_HCALL_DECL(t, a) t a +#define __KVM_HCALL_ARGS(t, a) a + #ifndef __KVM_NVHE_HYPERVISOR__ -#define kvm_call_hyp_nvhe(f, ...) \ +#define __kvm_call_hyp_nvhe(f, ...) \ ({ \ struct arm_smccc_res res; \ \ @@ -33,6 +59,29 @@ typedef u16 pkvm_handle_t; res.a1; \ }) =20 +/* + * Generate a typed stub for each declared hypercall. kvm_call_hyp_nvhe() + * resolves to the stub, so a call with the wrong argument count or types + * fails to compile instead of being silently truncated to an SMCCC functi= on + * number and a pile of registers. The stub inlines to the same SMCCC call + * the untyped macro used to make. + */ +#define DECLARE_KVM_HOST_HCALL(ret, name, ...) \ + static __always_inline \ + ret nvhe_hvc_##name(__KVM_HCALL_MAP(__KVM_HCALL_DECL, __VA_ARGS__)) \ + { \ + return (ret)__kvm_call_hyp_nvhe(name, \ + __KVM_HCALL_MAP(__KVM_HCALL_ARGS, __VA_ARGS__));\ + } + +#define DECLARE_KVM_HOST_HCALL0(ret, name) \ + static __always_inline ret nvhe_hvc_##name(void) \ + { \ + return (ret)__kvm_call_hyp_nvhe(name); \ + } + +#define kvm_call_hyp_nvhe(f, ...) nvhe_hvc_##f(__VA_ARGS__) + /* * The isb() below is there to guarantee the same behaviour on VHE as on != VHE, * where the eret to EL1 acts as a context synchronization event. @@ -63,6 +112,108 @@ typedef u16 pkvm_handle_t; #define kvm_call_hyp(f, ...) f(__VA_ARGS__) #define kvm_call_hyp_ret(f, ...) f(__VA_ARGS__) #define kvm_call_hyp_nvhe(f, ...) f(__VA_ARGS__) + +#define DECLARE_KVM_HOST_HCALL(ret, name, ...) +#define DECLARE_KVM_HOST_HCALL0(ret, name) #endif /* __KVM_NVHE_HYPERVISOR__ */ =20 +/* Hypercalls that are unavailable once pKVM has finalised. */ +DECLARE_KVM_HOST_HCALL(int, __pkvm_init, + phys_addr_t, phys, unsigned long, size, + unsigned long *, per_cpu_base, u32, hyp_va_bits) +DECLARE_KVM_HOST_HCALL(ulong, __pkvm_create_private_mapping, + phys_addr_t, phys, size_t, size, u64, prot) +DECLARE_KVM_HOST_HCALL(int, __pkvm_cpu_set_vector, + enum arm64_hyp_spectre_vector, slot) +DECLARE_KVM_HOST_HCALL0(void, __kvm_enable_ssbs) +DECLARE_KVM_HOST_HCALL0(void, __vgic_v3_init_lrs) +DECLARE_KVM_HOST_HCALL0(u64, __vgic_v3_get_gic_config) + +DECLARE_KVM_HOST_HCALL0(int, __pkvm_prot_finalize) + +/* Hypercalls that are always available and common to [nh]VHE/pKVM. */ +DECLARE_KVM_HOST_HCALL(void, __kvm_adjust_pc, + struct kvm_vcpu *, vcpu) +DECLARE_KVM_HOST_HCALL(int, __kvm_vcpu_run, + struct kvm_vcpu *, vcpu) +DECLARE_KVM_HOST_HCALL0(void, __kvm_flush_vm_context) +DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa, + struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) +DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa_nsh, + struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) +DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid, + struct kvm_s2_mmu *, mmu) +DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_range, + struct kvm_s2_mmu *, mmu, phys_addr_t, start, unsigned long, pages) +DECLARE_KVM_HOST_HCALL(void, __kvm_flush_cpu_context, + struct kvm_s2_mmu *, mmu) +DECLARE_KVM_HOST_HCALL(void, __kvm_timer_set_cntvoff, + u64, cntvoff) +DECLARE_KVM_HOST_HCALL(int, __tracing_load, + void *, desc_hva, size_t, desc_size) +DECLARE_KVM_HOST_HCALL0(void, __tracing_unload) +DECLARE_KVM_HOST_HCALL(int, __tracing_enable, + bool, enable) +DECLARE_KVM_HOST_HCALL(int, __tracing_swap_reader, + unsigned int, cpu) +DECLARE_KVM_HOST_HCALL(void, __tracing_update_clock, + u32, mult, u32, shift, u64, epoch_ns, u64, epoch_cyc) +DECLARE_KVM_HOST_HCALL(int, __tracing_reset, + unsigned int, cpu) +DECLARE_KVM_HOST_HCALL(int, __tracing_enable_event, + unsigned short, id, bool, enable) +DECLARE_KVM_HOST_HCALL(void, __tracing_write_event, + u64, id) +DECLARE_KVM_HOST_HCALL(void, __vgic_v3_save_aprs, + struct vgic_v3_cpu_if *, cpu_if) +DECLARE_KVM_HOST_HCALL(void, __vgic_v3_restore_vmcr_aprs, + struct vgic_v3_cpu_if *, cpu_if) +DECLARE_KVM_HOST_HCALL(void, __vgic_v5_save_apr, + struct vgic_v5_cpu_if *, cpu_if) +DECLARE_KVM_HOST_HCALL(void, __vgic_v5_restore_vmcr_apr, + struct vgic_v5_cpu_if *, cpu_if) + +/* Hypercalls that are available only when pKVM has finalised. */ +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_share_hyp, + u64, pfn) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_unshare_hyp, + u64, pfn) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_donate_guest, + u64, pfn, u64, gfn) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_share_guest, + u64, pfn, u64, gfn, u64, nr_pages, u64, prot) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_unshare_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_relax_perms_guest, + u64, gfn, u64, prot) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_wrprotect_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_test_clear_young_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages, bool, mkold) +DECLARE_KVM_HOST_HCALL(int, __pkvm_host_mkyoung_guest, + u64, gfn) +DECLARE_KVM_HOST_HCALL0(int, __pkvm_reserve_vm) +DECLARE_KVM_HOST_HCALL(void, __pkvm_unreserve_vm, + pkvm_handle_t, handle) +DECLARE_KVM_HOST_HCALL(int, __pkvm_init_vm, + struct kvm *, host_kvm, void *, vm_hva, void *, pgd_hva) +DECLARE_KVM_HOST_HCALL(int, __pkvm_init_vcpu, + pkvm_handle_t, handle, struct kvm_vcpu *, host_vcpu, + void *, vcpu_hva) +DECLARE_KVM_HOST_HCALL0(int, __pkvm_vcpu_in_poison_fault) +DECLARE_KVM_HOST_HCALL(int, __pkvm_force_reclaim_guest_page, + phys_addr_t, phys) +DECLARE_KVM_HOST_HCALL(int, __pkvm_reclaim_dying_guest_page, + pkvm_handle_t, handle, u64, gfn) +DECLARE_KVM_HOST_HCALL(int, __pkvm_start_teardown_vm, + pkvm_handle_t, handle) +DECLARE_KVM_HOST_HCALL(int, __pkvm_finalize_teardown_vm, + pkvm_handle_t, handle) +DECLARE_KVM_HOST_HCALL(void, __pkvm_vcpu_load, + pkvm_handle_t, handle, unsigned int, vcpu_idx, u64, hcr_el2) +DECLARE_KVM_HOST_HCALL0(void, __pkvm_vcpu_put) +DECLARE_KVM_HOST_HCALL0(void, __pkvm_vcpu_sync_state) +DECLARE_KVM_HOST_HCALL(void, __pkvm_tlb_flush_vmid, + pkvm_handle_t, handle) + #endif /* __ARM64_KVM_HCALL_H__ */ diff --git a/arch/arm64/kvm/hyp_trace.c b/arch/arm64/kvm/hyp_trace.c index 9644c424819b7..44937e257375a 100644 --- a/arch/arm64/kvm/hyp_trace.c +++ b/arch/arm64/kvm/hyp_trace.c @@ -269,7 +269,7 @@ static struct trace_buffer_desc *hyp_trace_load(unsigne= d long size, void *priv) if (ret) goto err_free_buffer; =20 - ret =3D kvm_call_hyp_nvhe(__tracing_load, (unsigned long)desc, desc_size); + ret =3D kvm_call_hyp_nvhe(__tracing_load, desc, desc_size); if (ret) goto err_unload_pages; =20 --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta1.migadu.com (out-114.mta1.migadu.com [95.215.58.114]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B59C38E8CC for ; Tue, 1 Sep 2026 14:04:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.114 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271472; cv=none; b=o13PMVW1aBxapwZK8vgP4mQTBSqXU8xLi7szDLSMy6qJqZIPF0HxMdEbl+Wf5rupnL0PyNHloMQPYd+fSlFtqg9TOB0hNGzZTde3q8v/d+BL3k4zGR5jk+7Xe2Muk6W9NpJp28QjdeOqdahiXeo0lJ2d088Bn4t+Q4hLK5IH8PI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271472; c=relaxed/simple; bh=FpWtl4wzXI7XdGDv8U/q1SNyBuYdvIbrrIp7Sw8K448=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=g8/ehPB0SnWW6Yb2QmrqN5jJaH06w5iOaFohzK4cTxYVE8HCO/t8975t18J5AdjCGd+vXyGQEYT4pKqzfCtDXnKKxwgmV/iQdTCXJa54EExdIIGTfGzBnMZmPeMs2MkgKEkLVhzK4dBzKAaLFb2KIh6I4NYkuCPdqHXyvn9Or/A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Kc3D/FEH; arc=none smtp.client-ip=95.215.58.114 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Kc3D/FEH" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=FpWtl4wzXI7XdGDv8U/q1SNyBuYdvIbrrIp7Sw8K448=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271468; v=1; x=1788876268; b=Kc3D/FEHm3olWu0+bykbgeeJhbDZTCkshrDv/NxzgvNHTGW6vZzjt/WjarbDu3x1nubX8Hre r+2ZyAN8xyqV2uuTM6iTNyTh35m1m8Vwgh5pQCH6LVEiKIdC3Zz/dSptr6JOQjC1qqveaTYxiaU dbWeBFY21YxtlbhpS4oopiHg= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 9003767039424a1a; Tue, 01 Sep 2026 14:04:28 +0000 X-Mizu-Trace-ID: 9003767039424a1a X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 10/11] KVM: arm64: nVHE: Check hypercall handlers against the declared ABI Date: Tue, 1 Sep 2026 15:03:25 +0100 Message-Id: <20260901140326.3812068-11-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Each hypercall handler unmarshals its arguments from the host context with hand-written DECLARE_REG() casts that nothing ties to what the caller passed: a handler can disagree with its caller in argument type, count or register index without a diagnostic. Generate the unmarshalling instead. DEFINE_KVM_HOST_HCALL() expands to the handle_() glue, modelled on the syscall wrappers, and checks the handler's parameter list against the signature declared in kvm_hcall.h, so both ends of every hypercall are now compiled against the same declaration. Handler bodies keep their logic and lose the DECLARE_REG() and return-register boilerplate. The two get_host_hyp_vcpus() macros existed only to wrap DECLARE_REG(), so one is dropped and the other becomes a function. The compiled handlers are instruction-for-instruction identical, apart from flush_hyp_vcpu() and sync_hyp_vcpu() now being inlined into their only caller. The return-register store is picked by the declared return type, so a void handler needs no macro of its own. The type is pasted into the store's name, which has to be a single word, so __pkvm_create_private_mapping is declared ulong. Assisted-by: Antigravity:gemini-3.1-pro Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_hcall.h | 13 +- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 438 +++++++++++++---------------- 2 files changed, 209 insertions(+), 242 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hcall.h b/arch/arm64/include/asm/kv= m_hcall.h index c2efcb89e6e70..c709991d10cda 100644 --- a/arch/arm64/include/asm/kvm_hcall.h +++ b/arch/arm64/include/asm/kvm_hcall.h @@ -44,6 +44,8 @@ struct vgic_v5_cpu_if; #define __KVM_HCALL_MAP(m, ...) __KVM_HCALL_MAP_N(COUNT_ARGS(__VA_ARGS__),= m, __VA_ARGS__) =20 #define __KVM_HCALL_DECL(t, a) t a +#define __KVM_HCALL_LONG(t, a) unsigned long a +#define __KVM_HCALL_CAST(t, a) (__force t) a #define __KVM_HCALL_ARGS(t, a) a =20 #ifndef __KVM_NVHE_HYPERVISOR__ @@ -113,8 +115,15 @@ struct vgic_v5_cpu_if; #define kvm_call_hyp_ret(f, ...) f(__VA_ARGS__) #define kvm_call_hyp_nvhe(f, ...) f(__VA_ARGS__) =20 -#define DECLARE_KVM_HOST_HCALL(ret, name, ...) -#define DECLARE_KVM_HOST_HCALL0(ret, name) +/* + * At EL2 each declaration emits the canonical signature of the hypercall, + * which DEFINE_KVM_HOST_HCALL() in hyp-main.c checks the handler + * definition against. + */ +#define DECLARE_KVM_HOST_HCALL(ret, name, ...) \ + typedef ret kvm_host_hcall_sig_##name(__KVM_HCALL_MAP(__KVM_HCALL_DECL, _= _VA_ARGS__)); +#define DECLARE_KVM_HOST_HCALL0(ret, name) \ + typedef ret kvm_host_hcall_sig_##name(void); #endif /* __KVM_NVHE_HYPERVISOR__ */ =20 /* Hypercalls that are unavailable once pKVM has finalised. */ diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/h= yp-main.c index 61fcb382197d9..9085f46c2880f 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -26,6 +26,48 @@ =20 DEFINE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); =20 +/* + * Define a hypercall handler: handle_ unmarshals the arguments from + * the host context and hands them, correctly typed, to the body that + * follows the macro. The parameter list is type-checked against the + * signature declared in , so the handler cannot drift + * from what the typed caller stubs marshal in. Modelled on the syscall + * wrappers. + */ +/* Truncate the fixed list of argument registers to the declared signature= . */ +#define KVM_HOST_HCALL_REGS(...) \ + __KVM_HCALL_MAP_N(COUNT_ARGS(__VA_ARGS__), __KVM_HCALL_ARGS \ + ,, cpu_reg(host_ctxt, 1),, cpu_reg(host_ctxt, 2) \ + ,, cpu_reg(host_ctxt, 3),, cpu_reg(host_ctxt, 4) \ + ,, cpu_reg(host_ctxt, 5),, cpu_reg(host_ctxt, 6)) + +#define set_cpu_reg_ulong(ctxt, r, v) { cpu_reg(ctxt, r) =3D v; } +#define set_cpu_reg_u64(ctxt, r, v) { cpu_reg(ctxt, r) =3D v; } +#define set_cpu_reg_int(ctxt, r, v) { cpu_reg(ctxt, r) =3D v; } +#define set_cpu_reg_void(ctxt, r, v) { v; } +#define set_cpu_reg(ctxt, r, t, v) set_cpu_reg_##t(ctxt, r, v) + +#define DEFINE_KVM_HOST_HCALL(ret, name, ...) \ + static kvm_host_hcall_sig_##name __do_##name; \ + static __always_inline \ + ret __se_##name(__KVM_HCALL_MAP(__KVM_HCALL_LONG, __VA_ARGS__)) \ + { \ + return __do_##name(__KVM_HCALL_MAP(__KVM_HCALL_CAST, __VA_ARGS__)); \ + } \ + static void handle_##name(struct kvm_cpu_context *host_ctxt) \ + { \ + set_cpu_reg(host_ctxt, 1, ret, __se_##name(KVM_HOST_HCALL_REGS(__VA_ARGS= __))); \ + } \ + static ret __do_##name(__KVM_HCALL_MAP(__KVM_HCALL_DECL, __VA_ARGS__)) + +#define DEFINE_KVM_HOST_HCALL0(ret, name) \ + static kvm_host_hcall_sig_##name __do_##name; \ + static void handle_##name(struct kvm_cpu_context *host_ctxt) \ + { \ + set_cpu_reg(host_ctxt, 1, ret, __do_##name()); \ + } \ + static ret __do_##name(void) + /* Number of implemented GICv3 LRs. Used by flush_hyp_vcpu(). */ unsigned int hyp_gicv3_nr_lr; =20 @@ -279,11 +321,9 @@ static void sync_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vc= pu) sync_hyp_vgic_state(hyp_vcpu); } =20 -static void handle___pkvm_vcpu_load(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __pkvm_vcpu_load, + pkvm_handle_t, handle, unsigned int, vcpu_idx, u64, hcr_el2) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(unsigned int, vcpu_idx, host_ctxt, 2); - DECLARE_REG(u64, hcr_el2, host_ctxt, 3); struct pkvm_hyp_vcpu *hyp_vcpu; =20 hyp_vcpu =3D pkvm_load_hyp_vcpu(handle, vcpu_idx); @@ -300,7 +340,7 @@ static void handle___pkvm_vcpu_load(struct kvm_cpu_cont= ext *host_ctxt) } } =20 -static void handle___pkvm_vcpu_put(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(void, __pkvm_vcpu_put) { struct pkvm_hyp_vcpu *hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); =20 @@ -316,7 +356,7 @@ static void handle___pkvm_vcpu_put(struct kvm_cpu_conte= xt *host_ctxt) } } =20 -static void handle___pkvm_vcpu_sync_state(struct kvm_cpu_context *host_ctx= t) +DEFINE_KVM_HOST_HCALL0(void, __pkvm_vcpu_sync_state) { struct pkvm_hyp_vcpu *hyp_vcpu; =20 @@ -346,34 +386,26 @@ static struct kvm_vcpu *__get_host_hyp_vcpus(struct k= vm_vcpu *arg, return host_vcpu; } =20 -#define get_host_hyp_vcpus(ctxt, regnr, hyp_vcpup) \ - ({ \ - DECLARE_REG(struct kvm_vcpu *, __vcpu, ctxt, regnr); \ - __get_host_hyp_vcpus(__vcpu, hyp_vcpup); \ - }) +static struct kvm_vcpu * +__get_host_hyp_vcpus_from_vgic_v3_cpu_if(struct vgic_v3_cpu_if *cpu_if, + struct pkvm_hyp_vcpu **hyp_vcpup) +{ + struct kvm_vcpu *vcpu =3D container_of(cpu_if, struct kvm_vcpu, + arch.vgic_cpu.vgic_v3); =20 -#define get_host_hyp_vcpus_from_vgic_v3_cpu_if(ctxt, regnr, hyp_vcpup) \ - ({ \ - DECLARE_REG(struct vgic_v3_cpu_if *, cif, ctxt, regnr);\ - struct kvm_vcpu *__vcpu =3D container_of(cif, \ - struct kvm_vcpu, \ - arch.vgic_cpu.vgic_v3); \ - \ - __get_host_hyp_vcpus(__vcpu, hyp_vcpup); \ - }) + return __get_host_hyp_vcpus(vcpu, hyp_vcpup); +} =20 -static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __kvm_vcpu_run, + struct kvm_vcpu *, vcpu) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; int ret; =20 - host_vcpu =3D get_host_hyp_vcpus(host_ctxt, 1, &hyp_vcpu); - - if (!host_vcpu) { - ret =3D -EINVAL; - goto out; - } + host_vcpu =3D __get_host_hyp_vcpus(vcpu, &hyp_vcpu); + if (!host_vcpu) + return -EINVAL; =20 if (unlikely(hyp_vcpu)) { /* @@ -382,10 +414,8 @@ static void handle___kvm_vcpu_run(struct kvm_cpu_conte= xt *host_ctxt) * loading a vcpu. Therefore, if SME features enabled the host * is misbehaving. */ - if (unlikely(system_supports_sme() && read_sysreg_s(SYS_SVCR))) { - ret =3D -EINVAL; - goto out; - } + if (unlikely(system_supports_sme() && read_sysreg_s(SYS_SVCR))) + return -EINVAL; =20 flush_hyp_vcpu(hyp_vcpu); =20 @@ -398,8 +428,8 @@ static void handle___kvm_vcpu_run(struct kvm_cpu_contex= t *host_ctxt) ret =3D __kvm_vcpu_run(host_vcpu); fpsimd_lazy_switch_to_host(host_vcpu); } -out: - cpu_reg(host_ctxt, 1) =3D ret; + + return ret; } =20 static int pkvm_refill_memcache(struct pkvm_hyp_vcpu *hyp_vcpu) @@ -411,184 +441,150 @@ static int pkvm_refill_memcache(struct pkvm_hyp_vcp= u *hyp_vcpu) &host_vcpu->arch.pkvm_memcache); } =20 -static void handle___pkvm_host_donate_guest(struct kvm_cpu_context *host_c= txt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_donate_guest, + u64, pfn, u64, gfn) { - DECLARE_REG(u64, pfn, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); struct pkvm_hyp_vcpu *hyp_vcpu; - int ret =3D -EINVAL; + int ret; =20 hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); if (!hyp_vcpu || !pkvm_hyp_vcpu_is_protected(hyp_vcpu)) - goto out; + return -EINVAL; =20 ret =3D pkvm_refill_memcache(hyp_vcpu); if (ret) - goto out; + return ret; =20 - ret =3D __pkvm_host_donate_guest(pfn, gfn, hyp_vcpu); -out: - cpu_reg(host_ctxt, 1) =3D ret; + return __pkvm_host_donate_guest(pfn, gfn, hyp_vcpu); } =20 -static void handle___pkvm_host_share_guest(struct kvm_cpu_context *host_ct= xt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_share_guest, + u64, pfn, u64, gfn, u64, nr_pages, u64, prot) { - DECLARE_REG(u64, pfn, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); - DECLARE_REG(u64, nr_pages, host_ctxt, 3); - DECLARE_REG(enum kvm_pgtable_prot, prot, host_ctxt, 4); struct pkvm_hyp_vcpu *hyp_vcpu; - int ret =3D -EINVAL; + int ret; =20 hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); if (!hyp_vcpu || pkvm_hyp_vcpu_is_protected(hyp_vcpu)) - goto out; + return -EINVAL; =20 ret =3D pkvm_refill_memcache(hyp_vcpu); if (ret) - goto out; + return ret; =20 - ret =3D __pkvm_host_share_guest(pfn, gfn, nr_pages, hyp_vcpu, prot); -out: - cpu_reg(host_ctxt, 1) =3D ret; + return __pkvm_host_share_guest(pfn, gfn, nr_pages, hyp_vcpu, prot); } =20 -static void handle___pkvm_host_unshare_guest(struct kvm_cpu_context *host_= ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_unshare_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); - DECLARE_REG(u64, nr_pages, host_ctxt, 3); struct pkvm_hyp_vm *hyp_vm; - int ret =3D -EINVAL; + int ret; =20 hyp_vm =3D get_np_pkvm_hyp_vm(handle); if (!hyp_vm) - goto out; + return -EINVAL; =20 ret =3D __pkvm_host_unshare_guest(gfn, nr_pages, hyp_vm); put_pkvm_hyp_vm(hyp_vm); -out: - cpu_reg(host_ctxt, 1) =3D ret; + + return ret; } =20 -static void handle___pkvm_host_relax_perms_guest(struct kvm_cpu_context *h= ost_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_relax_perms_guest, + u64, gfn, u64, prot) { - DECLARE_REG(u64, gfn, host_ctxt, 1); - DECLARE_REG(enum kvm_pgtable_prot, prot, host_ctxt, 2); struct pkvm_hyp_vcpu *hyp_vcpu; - int ret =3D -EINVAL; =20 hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); if (!hyp_vcpu || pkvm_hyp_vcpu_is_protected(hyp_vcpu)) - goto out; + return -EINVAL; =20 - ret =3D __pkvm_host_relax_perms_guest(gfn, hyp_vcpu, prot); -out: - cpu_reg(host_ctxt, 1) =3D ret; + return __pkvm_host_relax_perms_guest(gfn, hyp_vcpu, prot); } =20 -static void handle___pkvm_host_wrprotect_guest(struct kvm_cpu_context *hos= t_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_wrprotect_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); - DECLARE_REG(u64, nr_pages, host_ctxt, 3); struct pkvm_hyp_vm *hyp_vm; - int ret =3D -EINVAL; + int ret; =20 hyp_vm =3D get_np_pkvm_hyp_vm(handle); if (!hyp_vm) - goto out; + return -EINVAL; =20 ret =3D __pkvm_host_wrprotect_guest(gfn, nr_pages, hyp_vm); put_pkvm_hyp_vm(hyp_vm); -out: - cpu_reg(host_ctxt, 1) =3D ret; + + return ret; } =20 -static void handle___pkvm_host_test_clear_young_guest(struct kvm_cpu_conte= xt *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_test_clear_young_guest, + pkvm_handle_t, handle, u64, gfn, u64, nr_pages, bool, mkold) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); - DECLARE_REG(u64, nr_pages, host_ctxt, 3); - DECLARE_REG(bool, mkold, host_ctxt, 4); struct pkvm_hyp_vm *hyp_vm; - int ret =3D -EINVAL; + int ret; =20 hyp_vm =3D get_np_pkvm_hyp_vm(handle); if (!hyp_vm) - goto out; + return -EINVAL; =20 ret =3D __pkvm_host_test_clear_young_guest(gfn, nr_pages, mkold, hyp_vm); put_pkvm_hyp_vm(hyp_vm); -out: - cpu_reg(host_ctxt, 1) =3D ret; + + return ret; } =20 -static void handle___pkvm_host_mkyoung_guest(struct kvm_cpu_context *host_= ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_mkyoung_guest, + u64, gfn) { - DECLARE_REG(u64, gfn, host_ctxt, 1); struct pkvm_hyp_vcpu *hyp_vcpu; - int ret =3D -EINVAL; =20 hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); if (!hyp_vcpu || pkvm_hyp_vcpu_is_protected(hyp_vcpu)) - goto out; + return -EINVAL; =20 - ret =3D __pkvm_host_mkyoung_guest(gfn, hyp_vcpu); -out: - cpu_reg(host_ctxt, 1) =3D ret; + return __pkvm_host_mkyoung_guest(gfn, hyp_vcpu); } =20 -static void handle___kvm_adjust_pc(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __kvm_adjust_pc, + struct kvm_vcpu *, vcpu) { - DECLARE_REG(struct kvm_vcpu *, vcpu, host_ctxt, 1); - __kvm_adjust_pc(kern_hyp_va(vcpu)); } =20 -static void handle___kvm_flush_vm_context(struct kvm_cpu_context *host_ctx= t) +DEFINE_KVM_HOST_HCALL0(void, __kvm_flush_vm_context) { __kvm_flush_vm_context(); } =20 -static void handle___kvm_tlb_flush_vmid_ipa(struct kvm_cpu_context *host_c= txt) +DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa, + struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) { - DECLARE_REG(struct kvm_s2_mmu *, mmu, host_ctxt, 1); - DECLARE_REG(phys_addr_t, ipa, host_ctxt, 2); - DECLARE_REG(int, level, host_ctxt, 3); - __kvm_tlb_flush_vmid_ipa(kern_hyp_va(mmu), ipa, level); } =20 -static void handle___kvm_tlb_flush_vmid_ipa_nsh(struct kvm_cpu_context *ho= st_ctxt) +DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa_nsh, + struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) { - DECLARE_REG(struct kvm_s2_mmu *, mmu, host_ctxt, 1); - DECLARE_REG(phys_addr_t, ipa, host_ctxt, 2); - DECLARE_REG(int, level, host_ctxt, 3); - __kvm_tlb_flush_vmid_ipa_nsh(kern_hyp_va(mmu), ipa, level); } =20 -static void -handle___kvm_tlb_flush_vmid_range(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_range, + struct kvm_s2_mmu *, mmu, phys_addr_t, start, unsigned long, pages) { - DECLARE_REG(struct kvm_s2_mmu *, mmu, host_ctxt, 1); - DECLARE_REG(phys_addr_t, start, host_ctxt, 2); - DECLARE_REG(unsigned long, pages, host_ctxt, 3); - __kvm_tlb_flush_vmid_range(kern_hyp_va(mmu), start, pages); } =20 -static void handle___kvm_tlb_flush_vmid(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid, + struct kvm_s2_mmu *, mmu) { - DECLARE_REG(struct kvm_s2_mmu *, mmu, host_ctxt, 1); - __kvm_tlb_flush_vmid(kern_hyp_va(mmu)); } =20 -static void handle___pkvm_tlb_flush_vmid(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __pkvm_tlb_flush_vmid, + pkvm_handle_t, handle) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); struct pkvm_hyp_vm *hyp_vm =3D get_np_pkvm_hyp_vm(handle); =20 if (!hyp_vm) @@ -598,19 +594,19 @@ static void handle___pkvm_tlb_flush_vmid(struct kvm_c= pu_context *host_ctxt) put_pkvm_hyp_vm(hyp_vm); } =20 -static void handle___kvm_flush_cpu_context(struct kvm_cpu_context *host_ct= xt) +DEFINE_KVM_HOST_HCALL(void, __kvm_flush_cpu_context, + struct kvm_s2_mmu *, mmu) { - DECLARE_REG(struct kvm_s2_mmu *, mmu, host_ctxt, 1); - __kvm_flush_cpu_context(kern_hyp_va(mmu)); } =20 -static void handle___kvm_timer_set_cntvoff(struct kvm_cpu_context *host_ct= xt) +DEFINE_KVM_HOST_HCALL(void, __kvm_timer_set_cntvoff, + u64, cntvoff) { - __kvm_timer_set_cntvoff(cpu_reg(host_ctxt, 1)); + __kvm_timer_set_cntvoff(cntvoff); } =20 -static void handle___kvm_enable_ssbs(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(void, __kvm_enable_ssbs) { u64 tmp; =20 @@ -619,23 +615,23 @@ static void handle___kvm_enable_ssbs(struct kvm_cpu_c= ontext *host_ctxt) write_sysreg_el2(tmp, SYS_SCTLR); } =20 -static void handle___vgic_v3_get_gic_config(struct kvm_cpu_context *host_c= txt) +DEFINE_KVM_HOST_HCALL0(u64, __vgic_v3_get_gic_config) { - cpu_reg(host_ctxt, 1) =3D __vgic_v3_get_gic_config(); + return __vgic_v3_get_gic_config(); } =20 -static void handle___vgic_v3_init_lrs(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(void, __vgic_v3_init_lrs) { __vgic_v3_init_lrs(); } =20 -static void handle___vgic_v3_save_aprs(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __vgic_v3_save_aprs, + struct vgic_v3_cpu_if *, cpu_if) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; =20 - host_vcpu =3D get_host_hyp_vcpus_from_vgic_v3_cpu_if(host_ctxt, 1, - &hyp_vcpu); + host_vcpu =3D __get_host_hyp_vcpus_from_vgic_v3_cpu_if(cpu_if, &hyp_vcpu); if (!host_vcpu) return; =20 @@ -657,13 +653,13 @@ static void handle___vgic_v3_save_aprs(struct kvm_cpu= _context *host_ctxt) } } =20 -static void handle___vgic_v3_restore_vmcr_aprs(struct kvm_cpu_context *hos= t_ctxt) +DEFINE_KVM_HOST_HCALL(void, __vgic_v3_restore_vmcr_aprs, + struct vgic_v3_cpu_if *, cpu_if) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; =20 - host_vcpu =3D get_host_hyp_vcpus_from_vgic_v3_cpu_if(host_ctxt, 1, - &hyp_vcpu); + host_vcpu =3D __get_host_hyp_vcpus_from_vgic_v3_cpu_if(cpu_if, &hyp_vcpu); if (!host_vcpu) return; =20 @@ -690,48 +686,39 @@ static void handle___vgic_v3_restore_vmcr_aprs(struct= kvm_cpu_context *host_ctxt } } =20 -static void handle___pkvm_init(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_init, + phys_addr_t, phys, unsigned long, size, + unsigned long *, per_cpu_base, u32, hyp_va_bits) { - DECLARE_REG(phys_addr_t, phys, host_ctxt, 1); - DECLARE_REG(unsigned long, size, host_ctxt, 2); - DECLARE_REG(unsigned long *, per_cpu_base, host_ctxt, 3); - DECLARE_REG(u32, hyp_va_bits, host_ctxt, 4); - /* * __pkvm_init() will return only if an error occurred, otherwise it * will tail-call in __pkvm_init_finalise() which will have to deal * with the host context directly. */ - cpu_reg(host_ctxt, 1) =3D __pkvm_init(phys, size, per_cpu_base, hyp_va_bi= ts); + return __pkvm_init(phys, size, per_cpu_base, hyp_va_bits); } =20 -static void handle___pkvm_cpu_set_vector(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_cpu_set_vector, + enum arm64_hyp_spectre_vector, slot) { - DECLARE_REG(enum arm64_hyp_spectre_vector, slot, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D pkvm_cpu_set_vector(slot); + return pkvm_cpu_set_vector(slot); } =20 -static void handle___pkvm_host_share_hyp(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_share_hyp, + u64, pfn) { - DECLARE_REG(u64, pfn, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __pkvm_host_share_hyp(pfn); + return __pkvm_host_share_hyp(pfn); } =20 -static void handle___pkvm_host_unshare_hyp(struct kvm_cpu_context *host_ct= xt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_host_unshare_hyp, + u64, pfn) { - DECLARE_REG(u64, pfn, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __pkvm_host_unshare_hyp(pfn); + return __pkvm_host_unshare_hyp(pfn); } =20 -static void handle___pkvm_create_private_mapping(struct kvm_cpu_context *h= ost_ctxt) +DEFINE_KVM_HOST_HCALL(ulong, __pkvm_create_private_mapping, + phys_addr_t, phys, size_t, size, u64, prot) { - DECLARE_REG(phys_addr_t, phys, host_ctxt, 1); - DECLARE_REG(size_t, size, host_ctxt, 2); - DECLARE_REG(enum kvm_pgtable_prot, prot, host_ctxt, 3); - /* * __pkvm_create_private_mapping() populates a pointer with the * hypervisor start address of the allocation. @@ -742,160 +729,131 @@ static void handle___pkvm_create_private_mapping(st= ruct kvm_cpu_context *host_ct * Instead pass the allocation address as the return value (or return * ERR_PTR() on failure). */ - unsigned long haddr; + ulong haddr; int err =3D __pkvm_create_private_mapping(phys, size, prot, &haddr); =20 if (err) - haddr =3D (unsigned long)ERR_PTR(err); + haddr =3D (ulong)ERR_PTR(err); =20 - cpu_reg(host_ctxt, 1) =3D haddr; + return haddr; } =20 -static void handle___pkvm_prot_finalize(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(int, __pkvm_prot_finalize) { - cpu_reg(host_ctxt, 1) =3D __pkvm_prot_finalize(); + return __pkvm_prot_finalize(); } =20 -static void handle___pkvm_reserve_vm(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(int, __pkvm_reserve_vm) { - cpu_reg(host_ctxt, 1) =3D __pkvm_reserve_vm(); + return __pkvm_reserve_vm(); } =20 -static void handle___pkvm_unreserve_vm(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __pkvm_unreserve_vm, + pkvm_handle_t, handle) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - __pkvm_unreserve_vm(handle); } =20 -static void handle___pkvm_init_vm(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_init_vm, + struct kvm *, host_kvm, void *, vm_hva, void *, pgd_hva) { - DECLARE_REG(struct kvm *, host_kvm, host_ctxt, 1); - DECLARE_REG(void *, vm_hva, host_ctxt, 2); - DECLARE_REG(void *, pgd_hva, host_ctxt, 3); - - host_kvm =3D kern_hyp_va(host_kvm); - cpu_reg(host_ctxt, 1) =3D __pkvm_init_vm(host_kvm, vm_hva, pgd_hva); + return __pkvm_init_vm(kern_hyp_va(host_kvm), vm_hva, pgd_hva); } =20 -static void handle___pkvm_init_vcpu(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_init_vcpu, + pkvm_handle_t, handle, struct kvm_vcpu *, host_vcpu, + void *, vcpu_hva) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(struct kvm_vcpu *, host_vcpu, host_ctxt, 2); - DECLARE_REG(void *, vcpu_hva, host_ctxt, 3); - - host_vcpu =3D kern_hyp_va(host_vcpu); - cpu_reg(host_ctxt, 1) =3D __pkvm_init_vcpu(handle, host_vcpu, vcpu_hva); + return __pkvm_init_vcpu(handle, kern_hyp_va(host_vcpu), vcpu_hva); } =20 -static void handle___pkvm_vcpu_in_poison_fault(struct kvm_cpu_context *hos= t_ctxt) +DEFINE_KVM_HOST_HCALL0(int, __pkvm_vcpu_in_poison_fault) { - int ret; struct pkvm_hyp_vcpu *hyp_vcpu =3D pkvm_get_loaded_hyp_vcpu(); =20 - ret =3D hyp_vcpu ? __pkvm_vcpu_in_poison_fault(hyp_vcpu) : -EINVAL; - cpu_reg(host_ctxt, 1) =3D ret; + return hyp_vcpu ? __pkvm_vcpu_in_poison_fault(hyp_vcpu) : -EINVAL; } =20 -static void handle___pkvm_force_reclaim_guest_page(struct kvm_cpu_context = *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_force_reclaim_guest_page, + phys_addr_t, phys) { - DECLARE_REG(phys_addr_t, phys, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __pkvm_host_force_reclaim_page_guest(phys); + return __pkvm_host_force_reclaim_page_guest(phys); } =20 -static void handle___pkvm_reclaim_dying_guest_page(struct kvm_cpu_context = *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_reclaim_dying_guest_page, + pkvm_handle_t, handle, u64, gfn) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - DECLARE_REG(u64, gfn, host_ctxt, 2); - - cpu_reg(host_ctxt, 1) =3D __pkvm_reclaim_dying_guest_page(handle, gfn); + return __pkvm_reclaim_dying_guest_page(handle, gfn); } =20 -static void handle___pkvm_start_teardown_vm(struct kvm_cpu_context *host_c= txt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_start_teardown_vm, + pkvm_handle_t, handle) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __pkvm_start_teardown_vm(handle); + return __pkvm_start_teardown_vm(handle); } =20 -static void handle___pkvm_finalize_teardown_vm(struct kvm_cpu_context *hos= t_ctxt) +DEFINE_KVM_HOST_HCALL(int, __pkvm_finalize_teardown_vm, + pkvm_handle_t, handle) { - DECLARE_REG(pkvm_handle_t, handle, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __pkvm_finalize_teardown_vm(handle); + return __pkvm_finalize_teardown_vm(handle); } =20 -static void handle___tracing_load(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __tracing_load, + void *, desc_hva, size_t, desc_size) { - DECLARE_REG(void *, desc_hva, host_ctxt, 1); - DECLARE_REG(size_t, desc_size, host_ctxt, 2); - - cpu_reg(host_ctxt, 1) =3D __tracing_load(desc_hva, desc_size); + return __tracing_load(desc_hva, desc_size); } =20 -static void handle___tracing_unload(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL0(void, __tracing_unload) { __tracing_unload(); } =20 -static void handle___tracing_enable(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __tracing_enable, + bool, enable) { - DECLARE_REG(bool, enable, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __tracing_enable(enable); + return __tracing_enable(enable); } =20 -static void handle___tracing_swap_reader(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __tracing_swap_reader, + unsigned int, cpu) { - DECLARE_REG(unsigned int, cpu, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __tracing_swap_reader(cpu); + return __tracing_swap_reader(cpu); } =20 -static void handle___tracing_update_clock(struct kvm_cpu_context *host_ctx= t) +DEFINE_KVM_HOST_HCALL(void, __tracing_update_clock, + u32, mult, u32, shift, u64, epoch_ns, u64, epoch_cyc) { - DECLARE_REG(u32, mult, host_ctxt, 1); - DECLARE_REG(u32, shift, host_ctxt, 2); - DECLARE_REG(u64, epoch_ns, host_ctxt, 3); - DECLARE_REG(u64, epoch_cyc, host_ctxt, 4); - __tracing_update_clock(mult, shift, epoch_ns, epoch_cyc); } =20 -static void handle___tracing_reset(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(int, __tracing_reset, + unsigned int, cpu) { - DECLARE_REG(unsigned int, cpu, host_ctxt, 1); - - cpu_reg(host_ctxt, 1) =3D __tracing_reset(cpu); + return __tracing_reset(cpu); } =20 -static void handle___tracing_enable_event(struct kvm_cpu_context *host_ctx= t) +DEFINE_KVM_HOST_HCALL(int, __tracing_enable_event, + unsigned short, id, bool, enable) { - DECLARE_REG(unsigned short, id, host_ctxt, 1); - DECLARE_REG(bool, enable, host_ctxt, 2); - - cpu_reg(host_ctxt, 1) =3D __tracing_enable_event(id, enable); + return __tracing_enable_event(id, enable); } =20 -static void handle___tracing_write_event(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __tracing_write_event, + u64, id) { - DECLARE_REG(u64, id, host_ctxt, 1); - trace_selftest(id); } =20 -static void handle___vgic_v5_save_apr(struct kvm_cpu_context *host_ctxt) +DEFINE_KVM_HOST_HCALL(void, __vgic_v5_save_apr, + struct vgic_v5_cpu_if *, cpu_if) { - DECLARE_REG(struct vgic_v5_cpu_if *, cpu_if, host_ctxt, 1); - __vgic_v5_save_apr(kern_hyp_va(cpu_if)); } =20 -static void handle___vgic_v5_restore_vmcr_apr(struct kvm_cpu_context *host= _ctxt) +DEFINE_KVM_HOST_HCALL(void, __vgic_v5_restore_vmcr_apr, + struct vgic_v5_cpu_if *, cpu_if) { - DECLARE_REG(struct vgic_v5_cpu_if *, cpu_if, host_ctxt, 1); - __vgic_v5_restore_vmcr_apr(kern_hyp_va(cpu_if)); } =20 --=20 2.39.5 From nobody Sat Sep 26 12:26:50 2026 Received: from mta0.migadu.com (out-77.mta0.migadu.com [91.218.175.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E6EEE3859C2 for ; Tue, 1 Sep 2026 14:04:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.77 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271474; cv=none; b=RnxeiO0Qy3O1kHUHX0qFiXDfhwi8O6m5pL0I1Ro28pSnC4cpA20/AaAl54spKUhD6td4749DUKA1nLH1v0SkAWMDONiJNgPO3yHZ9VBZ21+pLsmwg8eTw9nxYO5DGsPiIIkXQBmUhUzTLKMDZIaDK6c/o4RJic3exJcPaRFDUEY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788271474; c=relaxed/simple; bh=EmBrff3D5aKQ+1O826oGPmf6bhg6A6SYCKNGDvonFpY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=rSoeGUFrPj1uYI81uVij+fTACsSMIeEnwq3rJ8t7ssc05Bt4+cnMkCh/mgL/0ZolZh6uEmvVtLWEhXGrZa2MuUBf88rQAkSuu0iLdhw6J3OxnTFhaH+D28cDqZ+7fizeIEGiVtQGjjpairmrFodjkfR6hnxQdvi5jIVX5JlAqio= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=k77kAtkF; arc=none smtp.client-ip=91.218.175.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="k77kAtkF" X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=EmBrff3D5aKQ+1O826oGPmf6bhg6A6SYCKNGDvonFpY=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1788271469; v=1; x=1788876269; b=k77kAtkFx+2NY090Tn9bwq5g5klXmWySFyjf1peFcLNatcwDNreS6wFCOrInAFLk4PDw+V3D pmk70BUyFGc2d3IZGUoNrd8jYFSdPzrhR2YtRH1HV4MS+znkciti03w2r9SBEfjBeApIZin9xsi 4D/Wq06ZiPc5sDxSx7cpEciw= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 4a82a460faf35186; Tue, 01 Sep 2026 14:04:29 +0000 X-Mizu-Trace-ID: 4a82a460faf35186 X-Migadu-Flow: FLOW_OUT From: Fuad Tabba To: Marc Zyngier , Oliver Upton , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Will Deacon , Steven Rostedt , Masami Hiramatsu , Alexandru Elisei , Vincent Donnefort , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Quentin Perret , Ard Biesheuvel , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, Fuad Tabba , Fuad Tabba Subject: [PATCH v4 11/11] KVM: arm64: Tag host-VA hypercall parameters __kern Date: Tue, 1 Sep 2026 15:03:26 +0100 Message-Id: <20260901140326.3812068-12-fuad.tabba@linux.dev> In-Reply-To: <20260901140326.3812068-1-fuad.tabba@linux.dev> References: <20260901140326.3812068-1-fuad.tabba@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The nVHE hypervisor takes host virtual addresses as hypercall arguments and translates each with kern_hyp_va() before use. Nothing marks them as host-owned, so dereferencing one untranslated at EL2 - a recurring bug class - is invisible to the compiler. Add a __kern sparse address space, active only for EL2 code, and tag the host-VA parameters in the hypercall declarations. kern_hyp_va_host() is the only sanctioned unwrap: it translates the address, preserves the pointee type (stripped of qualifiers, as with the percpu accessors) and drops the tag with a __force cast, so an untranslated host VA fails sparse. The tag flows from the shared declaration into the generated handler and on into the donated-memory and tracing-descriptor helpers, so a handler cannot extract a host VA without it. Host code sees plain pointers, and the tag is checker-only: no code is generated. container_of() casts through void * and drops the address space, so __get_host_hyp_vcpus() now takes an already translated vCPU and its callers unwrap. Translating a vgic_v3_cpu_if before taking its container is equivalent, since va_mask spans every bit in which two linear-map addresses differ. Reviewed-by: Marc Zyngier Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_hcall.h | 43 ++++++++++------ arch/arm64/include/asm/kvm_mmu.h | 10 ++++ arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 6 ++- arch/arm64/kvm/hyp/include/nvhe/trace.h | 5 +- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 65 +++++++++++++------------ arch/arm64/kvm/hyp/nvhe/pkvm.c | 11 +++-- arch/arm64/kvm/hyp/nvhe/trace.c | 4 +- 7 files changed, 86 insertions(+), 58 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hcall.h b/arch/arm64/include/asm/kv= m_hcall.h index c709991d10cda..9f06af58a4b00 100644 --- a/arch/arm64/include/asm/kvm_hcall.h +++ b/arch/arm64/include/asm/kvm_hcall.h @@ -28,6 +28,18 @@ struct kvm_vcpu; struct vgic_v3_cpu_if; struct vgic_v5_cpu_if; =20 +/* + * A host VA carried by a hypercall argument. At EL2 such a pointer must n= ot + * be dereferenced until it is translated with kern_hyp_va_host(); sparse + * flags any use that skips the translation. The tag describes the EL2 view + * only: the host dereferences its own VAs freely. + */ +#if defined(__KVM_NVHE_HYPERVISOR__) && defined(__CHECKER__) +#define __kern __attribute__((noderef, address_space(__kern))) +#else +#define __kern +#endif + /* * Hypercall signatures are declared as (type, name) argument pairs. * __KVM_HCALL_MAP() applies a macro to each pair, in the mold of __MAP() @@ -142,24 +154,24 @@ DECLARE_KVM_HOST_HCALL0(int, __pkvm_prot_finalize) =20 /* Hypercalls that are always available and common to [nh]VHE/pKVM. */ DECLARE_KVM_HOST_HCALL(void, __kvm_adjust_pc, - struct kvm_vcpu *, vcpu) + struct kvm_vcpu __kern *, vcpu) DECLARE_KVM_HOST_HCALL(int, __kvm_vcpu_run, - struct kvm_vcpu *, vcpu) + struct kvm_vcpu __kern *, vcpu) DECLARE_KVM_HOST_HCALL0(void, __kvm_flush_vm_context) DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa, - struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, ipa, int, level) DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa_nsh, - struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, ipa, int, level) DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid, - struct kvm_s2_mmu *, mmu) + struct kvm_s2_mmu __kern *, mmu) DECLARE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_range, - struct kvm_s2_mmu *, mmu, phys_addr_t, start, unsigned long, pages) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, start, unsigned long, pages) DECLARE_KVM_HOST_HCALL(void, __kvm_flush_cpu_context, - struct kvm_s2_mmu *, mmu) + struct kvm_s2_mmu __kern *, mmu) DECLARE_KVM_HOST_HCALL(void, __kvm_timer_set_cntvoff, u64, cntvoff) DECLARE_KVM_HOST_HCALL(int, __tracing_load, - void *, desc_hva, size_t, desc_size) + void __kern *, desc_hva, size_t, desc_size) DECLARE_KVM_HOST_HCALL0(void, __tracing_unload) DECLARE_KVM_HOST_HCALL(int, __tracing_enable, bool, enable) @@ -174,13 +186,13 @@ DECLARE_KVM_HOST_HCALL(int, __tracing_enable_event, DECLARE_KVM_HOST_HCALL(void, __tracing_write_event, u64, id) DECLARE_KVM_HOST_HCALL(void, __vgic_v3_save_aprs, - struct vgic_v3_cpu_if *, cpu_if) + struct vgic_v3_cpu_if __kern *, cpu_if) DECLARE_KVM_HOST_HCALL(void, __vgic_v3_restore_vmcr_aprs, - struct vgic_v3_cpu_if *, cpu_if) + struct vgic_v3_cpu_if __kern *, cpu_if) DECLARE_KVM_HOST_HCALL(void, __vgic_v5_save_apr, - struct vgic_v5_cpu_if *, cpu_if) + struct vgic_v5_cpu_if __kern *, cpu_if) DECLARE_KVM_HOST_HCALL(void, __vgic_v5_restore_vmcr_apr, - struct vgic_v5_cpu_if *, cpu_if) + struct vgic_v5_cpu_if __kern *, cpu_if) =20 /* Hypercalls that are available only when pKVM has finalised. */ DECLARE_KVM_HOST_HCALL(int, __pkvm_host_share_hyp, @@ -205,10 +217,11 @@ DECLARE_KVM_HOST_HCALL0(int, __pkvm_reserve_vm) DECLARE_KVM_HOST_HCALL(void, __pkvm_unreserve_vm, pkvm_handle_t, handle) DECLARE_KVM_HOST_HCALL(int, __pkvm_init_vm, - struct kvm *, host_kvm, void *, vm_hva, void *, pgd_hva) + struct kvm __kern *, host_kvm, void __kern *, vm_hva, + void __kern *, pgd_hva) DECLARE_KVM_HOST_HCALL(int, __pkvm_init_vcpu, - pkvm_handle_t, handle, struct kvm_vcpu *, host_vcpu, - void *, vcpu_hva) + pkvm_handle_t, handle, struct kvm_vcpu __kern *, host_vcpu, + void __kern *, vcpu_hva) DECLARE_KVM_HOST_HCALL0(int, __pkvm_vcpu_in_poison_fault) DECLARE_KVM_HOST_HCALL(int, __pkvm_force_reclaim_guest_page, phys_addr_t, phys) diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_= mmu.h index 6eae7e7e2a684..57f65257bb56d 100644 --- a/arch/arm64/include/asm/kvm_mmu.h +++ b/arch/arm64/include/asm/kvm_mmu.h @@ -7,6 +7,8 @@ #ifndef __ARM64_KVM_MMU_H__ #define __ARM64_KVM_MMU_H__ =20 +#include + #include #include #include @@ -140,6 +142,14 @@ static __always_inline unsigned long __kern_hyp_va(uns= igned long v) =20 #define kern_hyp_va(v) ((typeof(v))(__kern_hyp_va((unsigned long)(v)))) =20 +/* + * Translate a __kern-tagged host VA, dropping the tag: the only sanctioned + * unwrap. Translation only, no ownership or bounds validation; the result + * carries the pointee type stripped of the tag and of any cv-qualifiers. + */ +#define kern_hyp_va_host(v) \ + ((TYPEOF_UNQUAL(*(v)) *)__kern_hyp_va((unsigned long)(__force void *)(v))) + extern u32 __hyp_va_bits; =20 /* diff --git a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h b/arch/arm64/kvm/hyp/in= clude/nvhe/pkvm.h index 2643a1a819668..c1171451e1be7 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h @@ -7,6 +7,7 @@ #ifndef __ARM64_KVM_NVHE_PKVM_H__ #define __ARM64_KVM_NVHE_PKVM_H__ =20 +#include #include =20 #include @@ -69,9 +70,10 @@ void pkvm_hyp_vm_table_init(void *tbl); =20 int __pkvm_reserve_vm(void); void __pkvm_unreserve_vm(pkvm_handle_t handle); -int __pkvm_init_vm(struct kvm *host_kvm, void *vm_hva, void *pgd_hva); +int __pkvm_init_vm(struct kvm *host_kvm, void __kern *vm_hva, + void __kern *pgd_hva); int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, - void *vcpu_hva); + void __kern *vcpu_hva); =20 int __pkvm_reclaim_dying_guest_page(pkvm_handle_t handle, u64 gfn); int __pkvm_start_teardown_vm(pkvm_handle_t handle); diff --git a/arch/arm64/kvm/hyp/include/nvhe/trace.h b/arch/arm64/kvm/hyp/i= nclude/nvhe/trace.h index 4aa36fd76b9e2..c2db9f70ea265 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/trace.h +++ b/arch/arm64/kvm/hyp/include/nvhe/trace.h @@ -4,6 +4,7 @@ =20 #include =20 +#include #include =20 static inline pid_t __tracing_get_vcpu_pid(struct kvm_cpu_context *host_ct= xt) @@ -46,7 +47,7 @@ static inline pid_t __tracing_get_vcpu_pid(struct kvm_cpu= _context *host_ctxt) void *tracing_reserve_entry(unsigned long length); void tracing_commit_entry(void); =20 -int __tracing_load(void *desc_va, size_t desc_size); +int __tracing_load(void __kern *desc_va, size_t desc_size); void __tracing_unload(void); int __tracing_enable(bool enable); int __tracing_swap_reader(unsigned int cpu); @@ -59,7 +60,7 @@ static inline void tracing_commit_entry(void) { } #define HYP_EVENT(__name, __proto, __struct, __assign, __printk) \ static inline void trace_##__name(__proto) {} =20 -static inline int __tracing_load(void *desc_va, size_t desc_size) { return= -ENODEV; } +static inline int __tracing_load(void __kern *desc_va, size_t desc_size) {= return -ENODEV; } static inline void __tracing_unload(void) { } static inline int __tracing_enable(bool enable) { return -ENODEV; } static inline int __tracing_swap_reader(unsigned int cpu) { return -ENODEV= ; } diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/h= yp-main.c index 9085f46c2880f..91e74a1a334f0 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -367,10 +367,9 @@ DEFINE_KVM_HOST_HCALL0(void, __pkvm_vcpu_sync_state) sync_hyp_vcpu_state(hyp_vcpu); } =20 -static struct kvm_vcpu *__get_host_hyp_vcpus(struct kvm_vcpu *arg, +static struct kvm_vcpu *__get_host_hyp_vcpus(struct kvm_vcpu *host_vcpu, struct pkvm_hyp_vcpu **hyp_vcpup) { - struct kvm_vcpu *host_vcpu =3D kern_hyp_va(arg); struct pkvm_hyp_vcpu *hyp_vcpu =3D NULL; =20 if (unlikely(is_protected_kvm_enabled())) { @@ -387,23 +386,24 @@ static struct kvm_vcpu *__get_host_hyp_vcpus(struct k= vm_vcpu *arg, } =20 static struct kvm_vcpu * -__get_host_hyp_vcpus_from_vgic_v3_cpu_if(struct vgic_v3_cpu_if *cpu_if, +__get_host_hyp_vcpus_from_vgic_v3_cpu_if(struct vgic_v3_cpu_if __kern *cpu= _if, struct pkvm_hyp_vcpu **hyp_vcpup) { - struct kvm_vcpu *vcpu =3D container_of(cpu_if, struct kvm_vcpu, - arch.vgic_cpu.vgic_v3); + struct vgic_v3_cpu_if *host_cpu_if =3D kern_hyp_va_host(cpu_if); + struct kvm_vcpu *host_vcpu =3D container_of(host_cpu_if, struct kvm_vcpu, + arch.vgic_cpu.vgic_v3); =20 - return __get_host_hyp_vcpus(vcpu, hyp_vcpup); + return __get_host_hyp_vcpus(host_vcpu, hyp_vcpup); } =20 DEFINE_KVM_HOST_HCALL(int, __kvm_vcpu_run, - struct kvm_vcpu *, vcpu) + struct kvm_vcpu __kern *, vcpu) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; int ret; =20 - host_vcpu =3D __get_host_hyp_vcpus(vcpu, &hyp_vcpu); + host_vcpu =3D __get_host_hyp_vcpus(kern_hyp_va_host(vcpu), &hyp_vcpu); if (!host_vcpu) return -EINVAL; =20 @@ -548,9 +548,9 @@ DEFINE_KVM_HOST_HCALL(int, __pkvm_host_mkyoung_guest, } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_adjust_pc, - struct kvm_vcpu *, vcpu) + struct kvm_vcpu __kern *, vcpu) { - __kvm_adjust_pc(kern_hyp_va(vcpu)); + __kvm_adjust_pc(kern_hyp_va_host(vcpu)); } =20 DEFINE_KVM_HOST_HCALL0(void, __kvm_flush_vm_context) @@ -559,27 +559,27 @@ DEFINE_KVM_HOST_HCALL0(void, __kvm_flush_vm_context) } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa, - struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, ipa, int, level) { - __kvm_tlb_flush_vmid_ipa(kern_hyp_va(mmu), ipa, level); + __kvm_tlb_flush_vmid_ipa(kern_hyp_va_host(mmu), ipa, level); } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_ipa_nsh, - struct kvm_s2_mmu *, mmu, phys_addr_t, ipa, int, level) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, ipa, int, level) { - __kvm_tlb_flush_vmid_ipa_nsh(kern_hyp_va(mmu), ipa, level); + __kvm_tlb_flush_vmid_ipa_nsh(kern_hyp_va_host(mmu), ipa, level); } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid_range, - struct kvm_s2_mmu *, mmu, phys_addr_t, start, unsigned long, pages) + struct kvm_s2_mmu __kern *, mmu, phys_addr_t, start, unsigned long, pages) { - __kvm_tlb_flush_vmid_range(kern_hyp_va(mmu), start, pages); + __kvm_tlb_flush_vmid_range(kern_hyp_va_host(mmu), start, pages); } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_tlb_flush_vmid, - struct kvm_s2_mmu *, mmu) + struct kvm_s2_mmu __kern *, mmu) { - __kvm_tlb_flush_vmid(kern_hyp_va(mmu)); + __kvm_tlb_flush_vmid(kern_hyp_va_host(mmu)); } =20 DEFINE_KVM_HOST_HCALL(void, __pkvm_tlb_flush_vmid, @@ -595,9 +595,9 @@ DEFINE_KVM_HOST_HCALL(void, __pkvm_tlb_flush_vmid, } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_flush_cpu_context, - struct kvm_s2_mmu *, mmu) + struct kvm_s2_mmu __kern *, mmu) { - __kvm_flush_cpu_context(kern_hyp_va(mmu)); + __kvm_flush_cpu_context(kern_hyp_va_host(mmu)); } =20 DEFINE_KVM_HOST_HCALL(void, __kvm_timer_set_cntvoff, @@ -626,7 +626,7 @@ DEFINE_KVM_HOST_HCALL0(void, __vgic_v3_init_lrs) } =20 DEFINE_KVM_HOST_HCALL(void, __vgic_v3_save_aprs, - struct vgic_v3_cpu_if *, cpu_if) + struct vgic_v3_cpu_if __kern *, cpu_if) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; @@ -654,7 +654,7 @@ DEFINE_KVM_HOST_HCALL(void, __vgic_v3_save_aprs, } =20 DEFINE_KVM_HOST_HCALL(void, __vgic_v3_restore_vmcr_aprs, - struct vgic_v3_cpu_if *, cpu_if) + struct vgic_v3_cpu_if __kern *, cpu_if) { struct pkvm_hyp_vcpu *hyp_vcpu; struct kvm_vcpu *host_vcpu; @@ -755,16 +755,17 @@ DEFINE_KVM_HOST_HCALL(void, __pkvm_unreserve_vm, } =20 DEFINE_KVM_HOST_HCALL(int, __pkvm_init_vm, - struct kvm *, host_kvm, void *, vm_hva, void *, pgd_hva) + struct kvm __kern *, host_kvm, void __kern *, vm_hva, + void __kern *, pgd_hva) { - return __pkvm_init_vm(kern_hyp_va(host_kvm), vm_hva, pgd_hva); + return __pkvm_init_vm(kern_hyp_va_host(host_kvm), vm_hva, pgd_hva); } =20 DEFINE_KVM_HOST_HCALL(int, __pkvm_init_vcpu, - pkvm_handle_t, handle, struct kvm_vcpu *, host_vcpu, - void *, vcpu_hva) + pkvm_handle_t, handle, struct kvm_vcpu __kern *, host_vcpu, + void __kern *, vcpu_hva) { - return __pkvm_init_vcpu(handle, kern_hyp_va(host_vcpu), vcpu_hva); + return __pkvm_init_vcpu(handle, kern_hyp_va_host(host_vcpu), vcpu_hva); } =20 DEFINE_KVM_HOST_HCALL0(int, __pkvm_vcpu_in_poison_fault) @@ -799,7 +800,7 @@ DEFINE_KVM_HOST_HCALL(int, __pkvm_finalize_teardown_vm, } =20 DEFINE_KVM_HOST_HCALL(int, __tracing_load, - void *, desc_hva, size_t, desc_size) + void __kern *, desc_hva, size_t, desc_size) { return __tracing_load(desc_hva, desc_size); } @@ -846,15 +847,15 @@ DEFINE_KVM_HOST_HCALL(void, __tracing_write_event, } =20 DEFINE_KVM_HOST_HCALL(void, __vgic_v5_save_apr, - struct vgic_v5_cpu_if *, cpu_if) + struct vgic_v5_cpu_if __kern *, cpu_if) { - __vgic_v5_save_apr(kern_hyp_va(cpu_if)); + __vgic_v5_save_apr(kern_hyp_va_host(cpu_if)); } =20 DEFINE_KVM_HOST_HCALL(void, __vgic_v5_restore_vmcr_apr, - struct vgic_v5_cpu_if *, cpu_if) + struct vgic_v5_cpu_if __kern *, cpu_if) { - __vgic_v5_restore_vmcr_apr(kern_hyp_va(cpu_if)); + __vgic_v5_restore_vmcr_apr(kern_hyp_va_host(cpu_if)); } =20 typedef void (*hcall_t)(struct kvm_cpu_context *); diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 6c8e33ebf8bb6..5cdb0318fa7ba 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -657,9 +657,9 @@ static size_t pkvm_get_hyp_vm_size(unsigned int nr_vcpu= s) size_mul(sizeof(struct pkvm_hyp_vcpu *), nr_vcpus)); } =20 -static void *map_donated_memory_noclear(void *host_va, size_t size) +static void *map_donated_memory_noclear(void __kern *host_va, size_t size) { - void *va =3D kern_hyp_va(host_va); + void *va =3D kern_hyp_va_host(host_va); =20 if (!PAGE_ALIGNED(va)) return NULL; @@ -671,7 +671,7 @@ static void *map_donated_memory_noclear(void *host_va, = size_t size) return va; } =20 -static void *map_donated_memory(void *host_va, size_t size) +static void *map_donated_memory(void __kern *host_va, size_t size) { void *va =3D map_donated_memory_noclear(host_va, size); =20 @@ -818,7 +818,8 @@ void teardown_selftest_vm(void) * * Return 0 success, negative error code on failure. */ -int __pkvm_init_vm(struct kvm *host_kvm, void *vm_hva, void *pgd_hva) +int __pkvm_init_vm(struct kvm *host_kvm, void __kern *vm_hva, + void __kern *pgd_hva) { struct pkvm_hyp_vm *hyp_vm =3D NULL; size_t vm_size, pgd_size; @@ -909,7 +910,7 @@ static int register_hyp_vcpu(struct pkvm_hyp_vm *hyp_vm, } =20 int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, - void *vcpu_hva) + void __kern *vcpu_hva) { struct pkvm_hyp_vcpu *hyp_vcpu; struct pkvm_hyp_vm *hyp_vm; diff --git a/arch/arm64/kvm/hyp/nvhe/trace.c b/arch/arm64/kvm/hyp/nvhe/trac= e.c index eaa63b06a286c..47680a949f61f 100644 --- a/arch/arm64/kvm/hyp/nvhe/trace.c +++ b/arch/arm64/kvm/hyp/nvhe/trace.c @@ -206,9 +206,9 @@ static bool hyp_trace_desc_is_valid(struct hyp_trace_de= sc *desc, size_t desc_siz return true; } =20 -int __tracing_load(void *desc_hva, size_t desc_size) +int __tracing_load(void __kern *desc_hva, size_t desc_size) { - struct hyp_trace_desc *desc =3D kern_hyp_va(desc_hva); + struct hyp_trace_desc *desc =3D kern_hyp_va_host(desc_hva); int ret; =20 ret =3D __admit_host_mem(desc, desc_size); --=20 2.39.5