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
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox