All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sriram Nambakam <snambakam@linux.microsoft.com>
To: kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Subject: [RFC PATCH v1 16/42] vbs: Add HEKI kernel sealing and fix KVM plane memory attribute guards
Date: Wed,  5 Aug 2026 04:02:58 -0700	[thread overview]
Message-ID: <20260805110324.25067-17-snambakam@linux.microsoft.com> (raw)
In-Reply-To: <20260805110324.25067-1-snambakam@linux.microsoft.com>

Implement Hypervisor-Enforced Kernel Integrity (HEKI) — the plane-0
guest kernel automatically seals its text and rodata sections at
late_initcall time by sending their GPAs to QEMU via the VBS VTL
call mechanism.

Guest-side changes:
- security/vbs/core.c: Add vbs_heki_late_init() as a late_initcall
  that calls ops->init() to set up the VBS backend (allocate the
  shared CAA page, send VBS_CALL_INIT), then calls vbs_seal_kernel()
  to request kernel text/rodata protection.

- security/vbs/kvm_planes.c: Implement kvm_planes_seal_kernel() to
  build a vbs_seal_kernel_req with page-aligned text/rodata GPAs
  and CR3, sent via VBS_CALL_SEAL_KERNEL to QEMU.

- security/vbs/heki.h (new): Shared HEKI data structures
  (vbs_seal_kernel_req, vbs_protect_memory_req) and x86-64 page
  table walker callback interface.

- security/vbs/heki.c (new): x86-64 4-level page table walker
  for plane-1 auditing of plane-0 mappings. Classifies pages as
  TEXT/RODATA/DATA_RW/DATA_RX based on PTE permission bits.

- security/vbs/Kconfig: Add CONFIG_VBS_HEKI option.
- security/vbs/Makefile: Build heki.o when CONFIG_VBS_HEKI=y.

Host-side fix:
- virt/kvm/kvm_main.c: Replace CONFIG_KVM_MAX_NR_VCPU_PLANES
  (which had no Kconfig definition and was never set) with
  CONFIG_VM_PLANES in the three #ifdef guards protecting
  KVM_SET_PLANE_MEMORY_ATTRIBUTES ioctl and NO_WRITE/NO_EXEC
  attribute support. Without this fix the ioctl returned -ENOTTY.

Signed-off-by: Sriram Nambakam <snambakam@linux.microsoft.com>
---
 security/vbs/Kconfig      |  14 ++
 security/vbs/Makefile     |   1 +
 security/vbs/core.c       |  32 +++++
 security/vbs/heki.c       | 287 ++++++++++++++++++++++++++++++++++++++
 security/vbs/heki.h       |  83 +++++++++++
 security/vbs/kvm_planes.c |  19 ++-
 6 files changed, 435 insertions(+), 1 deletion(-)
 create mode 100644 security/vbs/heki.c
 create mode 100644 security/vbs/heki.h

diff --git a/security/vbs/Kconfig b/security/vbs/Kconfig
index 3d9fb104b1fc..0fdbfbc7a795 100644
--- a/security/vbs/Kconfig
+++ b/security/vbs/Kconfig
@@ -15,6 +15,20 @@ config VBS
 
 	  If unsure, say N.
 
+config VBS_HEKI
+	bool "HEKI: Hypervisor-Enforced Kernel Integrity"
+	depends on VBS && X86_64
+	help
+	  Enable the HEKI subsystem which provides:
+	  - x86-64 page table walker for auditing guest kernel mappings
+	  - Kernel seal support (make kernel text/rodata immutable via
+	    EPT permission enforcement)
+
+	  This code runs in plane-1 (secure kernel) to inspect and
+	  protect plane-0's address space.
+
+	  If unsure, say N.
+
 config VBS_KVM_PLANES
 	bool "VBS backend: KVM software planes"
 	depends on VBS && KVM_GUEST
diff --git a/security/vbs/Makefile b/security/vbs/Makefile
index 4f0f26ef4f71..e33052ccde2d 100644
--- a/security/vbs/Makefile
+++ b/security/vbs/Makefile
@@ -2,6 +2,7 @@
 obj-$(CONFIG_VBS) += vbs.o
 vbs-y := core.o probe.o
 
+vbs-$(CONFIG_VBS_HEKI)		+= heki.o
 obj-$(CONFIG_VBS_KVM_PLANES)	+= kvm_planes.o
 obj-$(CONFIG_VBS_SEV_SNP)	+= sev_snp.o
 obj-$(CONFIG_VBS_TDX)		+= tdx.o
diff --git a/security/vbs/core.c b/security/vbs/core.c
index 352590d88136..16b5329964f9 100644
--- a/security/vbs/core.c
+++ b/security/vbs/core.c
@@ -164,3 +164,35 @@ int vbs_kexec_invalidate(void)
 	return ops->kexec_invalidate();
 }
 EXPORT_SYMBOL_GPL(vbs_kexec_invalidate);
+
+/* ── HEKI: automatic kernel sealing at late init ──────────────────────── */
+
+static int __init vbs_heki_late_init(void)
+{
+	const struct vbs_ops *ops = READ_ONCE(vbs_backend);
+	int ret;
+
+	if (!ops) {
+		pr_debug("vbs: HEKI: no backend, skipping kernel seal\n");
+		return 0;
+	}
+
+	/* Initialize the backend (allocates shared memory, etc.) */
+	if (ops->init) {
+		ret = ops->init();
+		if (ret) {
+			pr_warn("vbs: HEKI: backend init failed (%d)\n", ret);
+			return 0;
+		}
+	}
+
+	pr_info("vbs: HEKI: sealing kernel text and rodata\n");
+	ret = vbs_seal_kernel();
+	if (ret)
+		pr_warn("vbs: HEKI: seal_kernel failed (%d)\n", ret);
+	else
+		pr_info("vbs: HEKI: kernel sealed successfully\n");
+
+	return 0;
+}
+late_initcall(vbs_heki_late_init);
diff --git a/security/vbs/heki.c b/security/vbs/heki.c
new file mode 100644
index 000000000000..8b4c4e3b170b
--- /dev/null
+++ b/security/vbs/heki.c
@@ -0,0 +1,287 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * HEKI — Hypervisor-Enforced Kernel Integrity
+ *
+ * x86-64 page table walker and kernel protection logic.
+ *
+ * The page table walker is designed to be called from plane-1 (the secure
+ * kernel) to audit plane-0's page tables.  It is parameterised with a
+ * read_gpa() callback so it can work both in-kernel (for plane-1 with
+ * direct GPA access) and from QEMU (future, for host-side auditing).
+ *
+ * The seal_kernel helper runs in plane-0 and sends the kernel text/rodata
+ * GPA ranges to the secure side via the VBS VTL call mechanism.
+ */
+
+#include "heki.h"
+#include "internal.h"
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <asm/sections.h>
+
+#ifdef CONFIG_X86_64
+#include <asm/page.h>
+
+/* ── x86-64 page table constants ──────────────────────────────────────── */
+
+#define PT_ENTRIES		512
+#define PT_ENTRY_SIZE		8
+
+/* PTE bit positions */
+#define PTE_PRESENT		BIT_ULL(0)
+#define PTE_WRITABLE		BIT_ULL(1)
+#define PTE_USER		BIT_ULL(2)
+#define PTE_PS			BIT_ULL(7)	/* page size (huge page) */
+#define PTE_NX			BIT_ULL(63)	/* no-execute */
+
+/* Physical address mask for 4-level paging (bits 12..51) */
+#define PTE_ADDR_MASK		0x000FFFFFFFFFF000ULL
+
+/* Page sizes */
+#define PAGE_SIZE_4K		(1UL << 12)
+#define PAGE_SIZE_2M		(1UL << 21)
+#define PAGE_SIZE_1G		(1UL << 30)
+
+/* Virtual address extraction helpers */
+static inline unsigned int pml4_index(unsigned long va)
+{
+	return (va >> 39) & 0x1FF;
+}
+
+static inline unsigned int pdpt_index(unsigned long va)
+{
+	return (va >> 30) & 0x1FF;
+}
+
+static inline unsigned int pd_index(unsigned long va)
+{
+	return (va >> 21) & 0x1FF;
+}
+
+static inline unsigned int pt_index(unsigned long va)
+{
+	return (va >> 12) & 0x1FF;
+}
+
+/*
+ * Classify a page based on its PTE permission bits.
+ */
+static enum heki_page_class classify_pte(u64 pte)
+{
+	bool writable = !!(pte & PTE_WRITABLE);
+	bool executable = !(pte & PTE_NX);
+
+	if (executable && !writable)
+		return HEKI_PAGE_TEXT;
+	if (!executable && !writable)
+		return HEKI_PAGE_RODATA;
+	if (!executable && writable)
+		return HEKI_PAGE_DATA_RW;
+	/* executable + writable — W^X violation */
+	return HEKI_PAGE_DATA_RX;
+}
+
+/*
+ * Read a single page table entry from guest physical memory.
+ */
+static int read_pte(u64 table_gpa, unsigned int index,
+		    int (*read_gpa)(u64, void *, size_t, void *),
+		    void *ctx, u64 *pte_out)
+{
+	u64 entry_gpa = table_gpa + (u64)index * PT_ENTRY_SIZE;
+
+	return read_gpa(entry_gpa, pte_out, sizeof(*pte_out), ctx);
+}
+
+/*
+ * Walk a page table (PT) level — 4K pages.
+ */
+static int walk_pt(u64 pt_gpa, unsigned long va_base,
+		   int (*read_gpa)(u64, void *, size_t, void *), void *ctx,
+		   unsigned long va_start, unsigned long va_end,
+		   heki_walk_cb cb, void *priv)
+{
+	unsigned int start_idx, end_idx, i;
+	int ret;
+
+	start_idx = (va_start > va_base) ? pt_index(va_start) : 0;
+	end_idx   = (va_end && va_end < va_base + PT_ENTRIES * PAGE_SIZE_4K)
+		    ? pt_index(va_end - 1) : PT_ENTRIES - 1;
+
+	for (i = start_idx; i <= end_idx; i++) {
+		u64 pte;
+		unsigned long va = va_base + (unsigned long)i * PAGE_SIZE_4K;
+
+		ret = read_pte(pt_gpa, i, read_gpa, ctx, &pte);
+		if (ret)
+			return ret;
+		if (!(pte & PTE_PRESENT))
+			continue;
+
+		ret = cb(va, pte & PTE_ADDR_MASK, PAGE_SIZE_4K,
+			 classify_pte(pte), priv);
+		if (ret)
+			return ret;
+	}
+	return 0;
+}
+
+/*
+ * Walk a page directory (PD) level — 2M huge pages or recurse into PT.
+ */
+static int walk_pd(u64 pd_gpa, unsigned long va_base,
+		   int (*read_gpa)(u64, void *, size_t, void *), void *ctx,
+		   unsigned long va_start, unsigned long va_end,
+		   heki_walk_cb cb, void *priv)
+{
+	unsigned int start_idx, end_idx, i;
+	int ret;
+
+	start_idx = (va_start > va_base) ? pd_index(va_start) : 0;
+	end_idx   = (va_end && va_end < va_base + (unsigned long)PT_ENTRIES * PAGE_SIZE_2M)
+		    ? pd_index(va_end - 1) : PT_ENTRIES - 1;
+
+	for (i = start_idx; i <= end_idx; i++) {
+		u64 pde;
+		unsigned long va = va_base + (unsigned long)i * PAGE_SIZE_2M;
+
+		ret = read_pte(pd_gpa, i, read_gpa, ctx, &pde);
+		if (ret)
+			return ret;
+		if (!(pde & PTE_PRESENT))
+			continue;
+
+		if (pde & PTE_PS) {
+			/* 2M huge page */
+			ret = cb(va, pde & PTE_ADDR_MASK, PAGE_SIZE_2M,
+				 classify_pte(pde), priv);
+			if (ret)
+				return ret;
+		} else {
+			ret = walk_pt(pde & PTE_ADDR_MASK, va,
+				      read_gpa, ctx, va_start, va_end,
+				      cb, priv);
+			if (ret)
+				return ret;
+		}
+	}
+	return 0;
+}
+
+/*
+ * Walk a page directory pointer table (PDPT) — 1G huge pages or recurse.
+ */
+static int walk_pdpt(u64 pdpt_gpa, unsigned long va_base,
+		     int (*read_gpa)(u64, void *, size_t, void *), void *ctx,
+		     unsigned long va_start, unsigned long va_end,
+		     heki_walk_cb cb, void *priv)
+{
+	unsigned int start_idx, end_idx, i;
+	int ret;
+
+	start_idx = (va_start > va_base) ? pdpt_index(va_start) : 0;
+	end_idx   = (va_end && va_end < va_base + (unsigned long)PT_ENTRIES * PAGE_SIZE_1G)
+		    ? pdpt_index(va_end - 1) : PT_ENTRIES - 1;
+
+	for (i = start_idx; i <= end_idx; i++) {
+		u64 pdpte;
+		unsigned long va = va_base + (unsigned long)i * PAGE_SIZE_1G;
+
+		ret = read_pte(pdpt_gpa, i, read_gpa, ctx, &pdpte);
+		if (ret)
+			return ret;
+		if (!(pdpte & PTE_PRESENT))
+			continue;
+
+		if (pdpte & PTE_PS) {
+			/* 1G huge page */
+			ret = cb(va, pdpte & PTE_ADDR_MASK, PAGE_SIZE_1G,
+				 classify_pte(pdpte), priv);
+			if (ret)
+				return ret;
+		} else {
+			ret = walk_pd(pdpte & PTE_ADDR_MASK, va,
+				      read_gpa, ctx, va_start, va_end,
+				      cb, priv);
+			if (ret)
+				return ret;
+		}
+	}
+	return 0;
+}
+
+/**
+ * heki_walk_x86_tables - walk x86-64 4-level page tables
+ * @cr3:        value of CR3 (page table root physical address)
+ * @read_gpa:   callback to read bytes from a guest physical address
+ * @read_ctx:   opaque context passed to read_gpa
+ * @va_start:   start of virtual address range (0 = from beginning)
+ * @va_end:     end of virtual address range (0 = to end)
+ * @cb:         callback invoked for each present page
+ * @priv:       opaque context passed to cb
+ *
+ * Walks the full PML4 → PDPT → PD → PT hierarchy, invoking @cb for
+ * every present page (4K, 2M, or 1G) within [va_start, va_end).
+ *
+ * Returns 0 on success, or the first non-zero return from @cb / @read_gpa.
+ */
+int heki_walk_x86_tables(unsigned long cr3,
+			 int (*read_gpa)(u64 gpa, void *buf, size_t len,
+					 void *ctx),
+			 void *read_ctx,
+			 unsigned long va_start, unsigned long va_end,
+			 heki_walk_cb cb, void *priv)
+{
+	u64 pml4_gpa = cr3 & PTE_ADDR_MASK;
+	unsigned int i;
+	int ret;
+
+	if (!read_gpa || !cb)
+		return -EINVAL;
+
+	/*
+	 * Walk PML4 entries.  Each PML4 entry covers 512 GB.
+	 * For the kernel half of the address space on x86-64,
+	 * entries 256..511 map the kernel virtual addresses
+	 * (0xffff800000000000 and above).
+	 */
+	for (i = 0; i < PT_ENTRIES; i++) {
+		u64 pml4e;
+		/* Each PML4 entry covers 512 GiB */
+		unsigned long va_base = (unsigned long)i << 39;
+
+		/*
+		 * Sign-extend for canonical addresses: entries 256..511
+		 * map the upper half (kernel space).
+		 */
+		if (i >= 256)
+			va_base |= 0xFFFF000000000000UL;
+
+		/* Skip entries outside the requested range */
+		if (va_end && va_base >= va_end)
+			break;
+		if (va_start) {
+			unsigned long entry_end = va_base +
+				(1UL << 39) - 1;
+			if (entry_end < va_start)
+				continue;
+		}
+
+		ret = read_pte(pml4_gpa, i, read_gpa, read_ctx, &pml4e);
+		if (ret)
+			return ret;
+		if (!(pml4e & PTE_PRESENT))
+			continue;
+
+		ret = walk_pdpt(pml4e & PTE_ADDR_MASK, va_base,
+				read_gpa, read_ctx, va_start, va_end,
+				cb, priv);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+#endif /* CONFIG_X86_64 */
diff --git a/security/vbs/heki.h b/security/vbs/heki.h
new file mode 100644
index 000000000000..fee986de351a
--- /dev/null
+++ b/security/vbs/heki.h
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * HEKI — Hypervisor-Enforced Kernel Integrity
+ *
+ * Shared data structures between the guest kernel (plane-0) and the
+ * VBS secure kernel / QEMU dispatcher.  These structs are placed in
+ * the VBS CAA page buffer and must be kept in sync with the QEMU-side
+ * definitions.
+ */
+#ifndef _VBS_HEKI_H
+#define _VBS_HEKI_H
+
+#include <linux/types.h>
+
+/*
+ * VBS_CALL_PROTECT_MEMORY payload — request EPT permission changes on
+ * a contiguous GPA range from the perspective of the calling plane.
+ */
+struct vbs_protect_memory_req {
+	__u64	gpa;		/* guest-physical address (page-aligned)  */
+	__u64	size;		/* region size in bytes (page-aligned)    */
+	__u32	perms;		/* desired permissions: VBS_MEM_* flags   */
+	__u32	flags;		/* reserved, must be 0                   */
+} __packed;
+
+/*
+ * VBS_CALL_SEAL_KERNEL payload — plane-0 sends the GPAs of its kernel
+ * text and rodata sections so that the secure side can make them
+ * immutable (NO_WRITE in the lower plane's EPT).
+ */
+struct vbs_seal_kernel_req {
+	__u64	text_gpa;	/* _stext physical address               */
+	__u64	text_size;	/* _etext - _stext                       */
+	__u64	rodata_gpa;	/* __start_rodata physical address        */
+	__u64	rodata_size;	/* __end_rodata - __start_rodata          */
+	__u64	cr3;		/* plane-0 kernel CR3 for verification    */
+} __packed;
+
+/* ── x86-64 page table walker (for plane-1 auditing) ─────────────────── */
+
+/* Classification of a guest-physical page based on page table walk */
+enum heki_page_class {
+	HEKI_PAGE_UNMAPPED	= 0,
+	HEKI_PAGE_TEXT		= 1,	/* executable, read-only  (kernel text) */
+	HEKI_PAGE_RODATA	= 2,	/* non-executable, read-only            */
+	HEKI_PAGE_DATA_RW	= 3,	/* non-executable, read-write           */
+	HEKI_PAGE_DATA_RX	= 4,	/* executable, read-write (DANGEROUS)   */
+};
+
+/*
+ * Callback invoked for each mapped page during a page table walk.
+ * @va:    virtual address of the page
+ * @pa:    guest-physical address of the page
+ * @size:  page size (4K, 2M, or 1G)
+ * @pclass: classification based on PTE permission bits
+ * @priv:  opaque context from the caller
+ *
+ * Return 0 to continue walking, non-zero to stop.
+ */
+typedef int (*heki_walk_cb)(unsigned long va, unsigned long pa,
+			    unsigned long size, enum heki_page_class pclass,
+			    void *priv);
+
+#ifdef CONFIG_X86_64
+/*
+ * Walk x86-64 4-level page tables starting from @cr3.
+ * @read_gpa: function to read @len bytes from guest physical address @gpa
+ *            into @buf.  Returns 0 on success.
+ * @va_start, @va_end: virtual address range to walk (0 for full walk)
+ * @cb:     callback invoked for each mapped page
+ * @priv:   opaque context passed to the callback
+ *
+ * Returns 0 on success, negative errno on failure.
+ */
+int heki_walk_x86_tables(unsigned long cr3,
+			 int (*read_gpa)(u64 gpa, void *buf, size_t len,
+					 void *ctx),
+			 void *read_ctx,
+			 unsigned long va_start, unsigned long va_end,
+			 heki_walk_cb cb, void *priv);
+#endif /* CONFIG_X86_64 */
+
+#endif /* _VBS_HEKI_H */
diff --git a/security/vbs/kvm_planes.c b/security/vbs/kvm_planes.c
index 07a004712e9f..293c960c0968 100644
--- a/security/vbs/kvm_planes.c
+++ b/security/vbs/kvm_planes.c
@@ -23,7 +23,11 @@
 #include <linux/mm.h>
 #include <linux/io.h>
 #include <linux/kvm_para.h>
+#include <asm/sections.h>
 #include <asm/kvm_para.h>
+#include <asm/processor.h>
+
+#include "heki.h"
 
 /* ── shared-memory calling area (modelled after the SVSM CAA) ─────── */
 
@@ -122,7 +126,20 @@ static int kvm_planes_protect_memory(unsigned long pfn,
 
 static int kvm_planes_seal_kernel(void)
 {
-	return kvm_planes_vtl_call(VBS_CALL_SEAL_KERNEL, NULL, 0, NULL, 0);
+	struct vbs_seal_kernel_req req = {
+		.text_gpa    = __pa_symbol(_stext),
+		.text_size   = PAGE_ALIGN((u64)(_etext - _stext)),
+		.rodata_gpa  = __pa_symbol(__start_rodata),
+		.rodata_size = PAGE_ALIGN((u64)(__end_rodata - __start_rodata)),
+		.cr3         = read_cr3_pa(),
+	};
+
+	pr_info("vbs-kvm: seal_kernel text=[0x%llx+0x%llx] rodata=[0x%llx+0x%llx] cr3=0x%llx\n",
+		req.text_gpa, req.text_size,
+		req.rodata_gpa, req.rodata_size, req.cr3);
+
+	return kvm_planes_vtl_call(VBS_CALL_SEAL_KERNEL,
+				   &req, sizeof(req), NULL, 0);
 }
 
 /* ── module authentication ────────────────────────────────────────────── */
-- 
2.55.0


  parent reply	other threads:[~2026-08-05 11:03 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05 11:02 [RFC PATCH v1 00/42] VBS/VSM-on-KVM: VBS integration for KVM VM planes Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 01/42] Fix merge issue - Remove duplicate definition for kvm_arch_has_irq_bypass Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 02/42] Fix compilation Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 03/42] Fix compile error Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 04/42] Fix compile errors Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 05/42] Initial support for VM Planes - Add kernel config for CONFIG_VM_PLANES - Parse vm plane config from initrd for plane configuration - Make hypercalls to allocate memory for the vm planes Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 06/42] Use vcpu count from the plane configuration Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 07/42] skip processing plane configuration for plane 0 - plane 0 is the boot plane Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 08/42] Add plane config param to specify kernel image format Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 09/42] Activate the VM Planes through the Hypervisor - Using KVM as the VMM Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 10/42] allow the command line to be specified for kernels in other planes Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 11/42] Various changes to support VM Planes Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 12/42] Add a Virtualization Based Security (VBS) framework. - Add backends for AMD SEV-SNP, Intel TDX, Arm CCA and KVM Planes. - Support VTL on Hyper-V in addition to Planes on KVM Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 13/42] Add a inter-plane communication mechanism through KVM. - model this to use a single page similar to SEV-SNP Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 14/42] KVM: Add per-plane memory attribute support for cross-plane EPT protection Sriram Nambakam
2026-08-05 11:02 ` [RFC PATCH v1 15/42] KVM: x86: Add KVM_HC_VBS_VTL_CALL hypercall for VBS inter-plane calls Sriram Nambakam
2026-08-05 11:02 ` Sriram Nambakam [this message]
2026-08-05 11:02 ` [RFC PATCH v1 17/42] vbs: Add module authentication via VBS/HEKI Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 18/42] vbs: Add kexec validation and make module auth non-fatal Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 19/42] Merge branch 'master' into vm-planes Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 20/42] kvm: x86: fix merged plane API/stat build regressions Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 21/42] KVM: x86: exit VM planes and VBS hypercalls to userspace Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 22/42] kexec: block legacy kexec_load when VBS is active Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 23/42] kvm: x86: fix merged plane API/stat build regressions Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 24/42] KVM: planes: expose memory-attribute setting to in-kernel callers Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 25/42] vm_planes: drop unused per-plane vcpu_count Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 26/42] drivers/virt: add VBS secure-plane park loop Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 27/42] KVM: planes: add arch-neutral in-kernel plane switch helper Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 28/42] KVM: x86: add VBS VTL call/return and cross-plane set-mem-attrs hypercalls Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 29/42] init/vm_planes: set up planes from rootfs_initcall and load ELF payloads Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 30/42] security/vbs: run backend probe and HEKI seal at rootfs_initcall Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 31/42] security/vbs: pin the VTL call hypercall to CPU0 Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 32/42] security/vbs: add secure-plane monitor backend Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 33/42] drivers/virt: rename VBS park loop to secure_monitor Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 34/42] x86/realmode: skip the sub-1M trampoline for the VBS secure plane Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 35/42] KVM: x86: deny normal-plane access to secure-plane memory Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 36/42] KVM: plane: handle KVM_CHECK_EXTENSION on the plane fd Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 37/42] KVM: selftests: run plane tests with a split IRQ chip Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 38/42] kvm: x86: drop obsolete kvm_cache_regs.h Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 39/42] kvm: arch: finalize plane hooks and kvm_arch_vcpu_create signature Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 40/42] kvm: x86: use kvm_vcpu scheduling-state accessors and struct stat fields Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 41/42] kvm: x86: finalize per-plane APIC state and CPUID placement Sriram Nambakam
2026-08-05 11:03 ` [RFC PATCH v1 42/42] kvm: planes: reconcile core plane state, UAPI and hypercall exit Sriram Nambakam

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=20260805110324.25067-17-snambakam@linux.microsoft.com \
    --to=snambakam@linux.microsoft.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

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

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