From: Sriram Nambakam <snambakam@linux.microsoft.com>
To: kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Subject: [RFC PATCH v1 34/42] x86/realmode: skip the sub-1M trampoline for the VBS secure plane
Date: Wed, 5 Aug 2026 04:03:16 -0700 [thread overview]
Message-ID: <20260805110324.25067-35-snambakam@linux.microsoft.com> (raw)
In-Reply-To: <20260805110324.25067-1-snambakam@linux.microsoft.com>
The VBS secure plane (plane >0) boots from a single high-memory region
carved out of the normal plane's address space and therefore has no
sub-1M RAM for the x86 real-mode AP trampoline. reserve_real_mode()
followed by init_real_mode() then panics with "Real mode trampoline was
not allocated".
The secure plane is uniprocessor, enters directly in long mode and never
uses the trampoline, so point x86_platform.realmode_reserve/realmode_init
at x86_init_noop for it. This mirrors how the Hyper-V VTL (hv_vtl.c) and
Xen PV ports disable the trampoline.
Gated at compile time on CONFIG_VBS_SECURE_MONITOR (only the secure-plane
kernel sets it) and at runtime on the "secure_monitor" early param (the
normal plane never passes it), so plane 0 is unaffected.
---
arch/x86/include/asm/kvm_host.h | 17 +++++--
arch/x86/kvm/mmu/mmu.c | 36 ++++++++++++++
arch/x86/kvm/mmu/spte.h | 12 +++--
arch/x86/kvm/x86.c | 85 +++++++++++++++++++++++++++++----
arch/x86/realmode/init.c | 26 ++++++++++
include/linux/kvm_host.h | 35 ++++++++++++++
include/uapi/linux/kvm.h | 1 +
virt/kvm/kvm_main.c | 6 +++
8 files changed, 202 insertions(+), 16 deletions(-)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index b7d478dcc1a5..bbccb9d3d801 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -380,15 +380,24 @@ union kvm_mmu_page_role {
*/
unsigned cr4_smep:1;
- unsigned:3;
+ /*
+ * Plane (privilege level) that owns this shadow page. VM
+ * planes share memslots but must have independent page
+ * tables so that a higher-privilege plane can restrict a
+ * lower plane's access (e.g. deny reads of secure-plane
+ * memory). Tagging the role keeps each plane's roots and
+ * SPTEs separate. Always 0 when CONFIG_VM_PLANES is off.
+ */
+ unsigned plane:4;
/*
* This is left at the top of the word so that
* kvm_memslots_for_spte_role can extract it with a
- * simple shift. While there is room, give it a whole
- * byte so it is also faster to load it from memory.
+ * simple shift. smm is only ever used as a boolean, so it
+ * is reduced to 7 bits (from a full byte) to make room for
+ * cr4_smep and the VM-planes plane tag above.
*/
- unsigned smm:8;
+ unsigned smm:7;
};
};
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 6e41c5df72ed..960e212c5ee3 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -4708,6 +4708,34 @@ static int kvm_mmu_faultin_pfn(struct kvm_vcpu *vcpu,
return -EFAULT;
}
+ /*
+ * A higher-privilege plane may forbid this plane from accessing a gfn
+ * (e.g. to hide secure-plane memory from the normal plane). Two cases
+ * cannot be represented as a present SPTE and must be denied outright,
+ * exiting to userspace with a memory fault rather than (re)building an
+ * SPTE the access will immediately re-fault on:
+ *
+ * - NO_READ: there is no present-but-unreadable EPT entry, so leave the
+ * gfn unmapped for this plane.
+ *
+ * - NO_WRITE on a write fault: make_spte() strips ACC_WRITE_MASK and
+ * builds a read-only SPTE, so a guest write would re-fault forever
+ * (an unresolvable EPT write-violation livelock). Deny it instead so
+ * the violation is visible and can be mediated (e.g. HEKI text_poke
+ * is routed through the secure plane rather than written directly).
+ */
+ {
+ unsigned long plane_attrs =
+ kvm_plane_access_attributes(vcpu->plane, fault->gfn);
+
+ if ((plane_attrs & KVM_MEMORY_ATTRIBUTE_NO_READ) ||
+ (fault->write &&
+ (plane_attrs & KVM_MEMORY_ATTRIBUTE_NO_WRITE))) {
+ kvm_mmu_prepare_memory_fault_exit(vcpu, fault);
+ return -EFAULT;
+ }
+ }
+
if (unlikely(!slot))
return kvm_handle_noslot_fault(vcpu, fault, access);
@@ -5884,6 +5912,14 @@ kvm_calc_tdp_mmu_root_page_role(struct kvm_vcpu *vcpu,
role.direct = true;
role.has_4_byte_gpte = false;
+ /*
+ * Give each VM plane its own TDP root. Planes share memslots but
+ * need independent page tables so a higher-privilege plane can
+ * restrict a lower plane's access to a GFN. plane_level is 0 (and
+ * thus a no-op) on non-plane VMs and when CONFIG_VM_PLANES is off.
+ */
+ role.plane = vcpu->plane_level;
+
/* All TDP pages are supervisor-executable */
role.access = ACC_ALL;
if (role.cr4_smep && shadow_user_mask)
diff --git a/arch/x86/kvm/mmu/spte.h b/arch/x86/kvm/mmu/spte.h
index 144f7c5a1040..ed03bcdbf82d 100644
--- a/arch/x86/kvm/mmu/spte.h
+++ b/arch/x86/kvm/mmu/spte.h
@@ -580,9 +580,13 @@ void __init kvm_mmu_spte_module_init(void);
void kvm_mmu_reset_all_pte_masks(void);
/*
- * Apply memory protection attributes to pte_access.
- * If memory attributes have NO_WRITE or NO_EXEC set for a GFN,
- * strip the corresponding access bits before building the SPTE.
+ * Apply cross-plane access restrictions to pte_access when building an SPTE
+ * for the faulting plane. A higher-privilege plane may downgrade a lower
+ * plane's access to a GFN via its per-plane access_attr_array. NO_WRITE and
+ * NO_EXEC are enforced here by stripping the corresponding access bits.
+ * NO_READ cannot be expressed as a present-but-unreadable SPTE on EPT, so it
+ * is enforced earlier in the fault handler (kvm_mmu_faultin_pfn) by refusing
+ * to map the page.
*/
#ifdef CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES
static inline unsigned int kvm_plane_filter_pte_access(struct kvm_vcpu *vcpu,
@@ -591,7 +595,7 @@ static inline unsigned int kvm_plane_filter_pte_access(struct kvm_vcpu *vcpu,
{
unsigned long attrs;
- attrs = kvm_get_memory_attributes(vcpu->kvm, gfn);
+ attrs = kvm_plane_access_attributes(vcpu->plane, gfn);
if (attrs & KVM_MEMORY_ATTRIBUTE_NO_WRITE)
pte_access &= ~ACC_WRITE_MASK;
if (attrs & KVM_MEMORY_ATTRIBUTE_NO_EXEC)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3c73ab1dcfe8..c8c37d569023 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -10494,6 +10494,61 @@ static int complete_hypercall_exit(struct kvm_vcpu *vcpu)
return kvm_skip_emulated_instruction(vcpu);
}
+#if defined(CONFIG_VM_PLANES) && defined(CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES)
+/*
+ * Apply cross-plane access restrictions requested by a higher-privilege plane.
+ * Stores @attrs (NO_READ/NO_WRITE/NO_EXEC) for [@start, @end) in @plane's
+ * access_attr_array and zaps the range so any pages already mapped in @plane's
+ * EPT re-fault and pick up the restriction. @attrs == 0 clears the
+ * restriction for the range.
+ */
+static int kvm_plane_set_access_attrs(struct kvm *kvm, struct kvm_plane *plane,
+ gfn_t start, gfn_t end, unsigned long attrs)
+{
+ void *entry = attrs ? xa_mk_value(attrs) : NULL;
+ gfn_t gfn;
+ int r = 0;
+
+ mutex_lock(&kvm->slots_lock);
+
+ /*
+ * Reserve slots up front so the store loop below cannot fail partway
+ * through and leave a gap (a still-readable page) in the protected
+ * range. Clearing a restriction (entry == NULL) never allocates.
+ */
+ if (entry) {
+ for (gfn = start; gfn < end; gfn++) {
+ r = xa_reserve(&plane->access_attr_array, gfn,
+ GFP_KERNEL_ACCOUNT);
+ if (r)
+ goto out_unlock;
+
+ cond_resched();
+ }
+ }
+
+ for (gfn = start; gfn < end; gfn++) {
+ r = xa_err(xa_store(&plane->access_attr_array, gfn, entry,
+ GFP_KERNEL_ACCOUNT));
+ if (KVM_BUG_ON(r, kvm))
+ goto out_unlock;
+
+ cond_resched();
+ }
+
+ /*
+ * Re-fault the affected gfns in the plane's EPT so the new restriction
+ * takes effect on existing mappings. Zapping all roots is harmless;
+ * other planes simply rebuild identical entries on next access.
+ */
+ kvm_zap_gfn_range(kvm, start, end);
+
+out_unlock:
+ mutex_unlock(&kvm->slots_lock);
+ return r;
+}
+#endif /* CONFIG_VM_PLANES && CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */
+
int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, int cpl,
int (*complete_hypercall)(struct kvm_vcpu *))
{
@@ -10683,16 +10738,21 @@ int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, int cpl,
case KVM_HC_VBS_SET_MEM_ATTRS:
#if defined(CONFIG_VM_PLANES) && defined(CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES)
/*
- * The secure plane (plane >0) enforces EPT permissions on the
- * normal plane's memory. It cannot issue the host
+ * The secure plane (plane >0) enforces EPT permissions on a
+ * lower plane's memory. It cannot issue the host
* KVM_SET_MEMORY_ATTRIBUTES ioctl, so it asks KVM to do it via
- * this hypercall. Only a higher-privilege plane may call it.
+ * this hypercall. Only a higher-privilege plane may call it;
+ * the restriction is applied to the plane directly below the
+ * caller.
*
* a0 = guest-physical address (page aligned)
* a1 = region size in bytes (page aligned)
- * a2 = access bits to retain for lower planes:
- * bit0 read (implicit), bit1 write, bit2 exec
- * (matches VBS_MEM_READ/WRITE/EXEC)
+ * a2 = access bits to retain for the lower plane:
+ * bit0 read, bit1 write, bit2 exec
+ * (matches VBS_MEM_READ/WRITE/EXEC). A cleared bit adds
+ * the corresponding NO_READ/NO_WRITE/NO_EXEC restriction;
+ * a2 = 0 hides the range entirely (e.g. secure-plane
+ * memory that the normal plane must not read).
*/
if (vcpu->plane_level == 0) {
ret = -KVM_EPERM;
@@ -10704,17 +10764,26 @@ int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, int cpl,
ret = -KVM_EINVAL;
goto out;
} else {
+ struct kvm_plane *target;
unsigned long attrs = 0;
gfn_t start = a0 >> PAGE_SHIFT;
gfn_t end = (a0 + a1) >> PAGE_SHIFT;
+ target = vcpu->kvm->planes[vcpu->plane_level - 1];
+ if (!target) {
+ ret = -KVM_EINVAL;
+ goto out;
+ }
+
+ if (!(a2 & BIT(0)))
+ attrs |= KVM_MEMORY_ATTRIBUTE_NO_READ;
if (!(a2 & BIT(1)))
attrs |= KVM_MEMORY_ATTRIBUTE_NO_WRITE;
if (!(a2 & BIT(2)))
attrs |= KVM_MEMORY_ATTRIBUTE_NO_EXEC;
- if (kvm_vm_set_mem_attributes(vcpu->kvm, start, end,
- attrs))
+ if (kvm_plane_set_access_attrs(vcpu->kvm, target, start,
+ end, attrs))
ret = -KVM_EINVAL;
else
ret = 0;
diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c
index 694d80a5c68e..01855a913b10 100644
--- a/arch/x86/realmode/init.c
+++ b/arch/x86/realmode/init.c
@@ -11,6 +11,7 @@
#include <asm/crash.h>
#include <asm/msr.h>
#include <asm/sev.h>
+#include <asm/x86_init.h>
struct real_mode_header *real_mode_header;
u32 *trampoline_cr4_features;
@@ -44,6 +45,31 @@ void load_trampoline_pgtable(void)
__flush_tlb_all();
}
+#ifdef CONFIG_VBS_SECURE_MONITOR
+/*
+ * A KVM VM-planes secure plane (plane > 0) is entered directly in 64-bit long
+ * mode and boots from a single carved-out high-memory region that contains no
+ * RAM below 1 MiB. It runs uniprocessor with no firmware, ACPI sleep, or
+ * hibernation, so the 16-bit real-mode trampoline can neither be allocated
+ * (there is no sub-1M memory) nor is it ever used (no AP bringup or wakeup).
+ *
+ * Disable the real-mode setup the same way Hyper-V VTL and Xen PV do, by
+ * pointing the x86_platform real-mode hooks at the no-op handler. This is
+ * installed from an early_param so it takes effect before setup_arch() calls
+ * x86_platform.realmode_reserve(). Triggered by the "secure_monitor"
+ * command-line option, the same switch that activates the in-kernel
+ * secure-plane monitor.
+ */
+static int __init secure_plane_no_real_mode(char *arg)
+{
+ x86_platform.realmode_reserve = x86_init_noop;
+ x86_platform.realmode_init = x86_init_noop;
+ pr_info("realmode: secure plane: skipping sub-1M trampoline\n");
+ return 0;
+}
+early_param("secure_monitor", secure_plane_no_real_mode);
+#endif /* CONFIG_VBS_SECURE_MONITOR */
+
void __init reserve_real_mode(void)
{
phys_addr_t mem, limit = x86_init.resources.realmode_limit;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index f14d78fd8cd3..05c9edd4a73d 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -895,6 +895,18 @@ struct kvm_plane {
/* Per-Plane VCPU array */
struct xarray vcpu_array;
+#ifdef CONFIG_VM_PLANES
+ /*
+ * Cross-plane access restrictions imposed on THIS plane by a
+ * higher-privilege plane. Each entry holds NO_READ/NO_WRITE/NO_EXEC
+ * bits for a gfn and is enforced when building this plane's SPTEs
+ * (planes have independent EPT roots). Distinct from
+ * kvm->mem_attr_array, which holds VM-wide PRIVATE/CoCo attributes.
+ * Protected by kvm->slots_lock for writes, RCU for reads.
+ */
+ struct xarray access_attr_array;
+#endif
+
struct kvm_arch_plane arch;
};
@@ -2739,6 +2751,29 @@ static inline bool kvm_mem_is_private(struct kvm *kvm, gfn_t gfn)
}
#endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */
+#ifdef CONFIG_VM_PLANES
+/*
+ * Cross-plane access restrictions: a higher-privilege plane downgrades a
+ * lower plane's access (NO_READ/NO_WRITE/NO_EXEC) to a gfn by storing bits in
+ * that lower plane's access_attr_array. Enforced when building the lower
+ * plane's SPTEs (planes have independent EPT roots). Returns 0 when no
+ * restriction applies.
+ */
+static inline unsigned long kvm_plane_access_attributes(struct kvm_plane *plane,
+ gfn_t gfn)
+{
+ if (!plane)
+ return 0;
+ return xa_to_value(xa_load(&plane->access_attr_array, gfn));
+}
+#else
+static inline unsigned long kvm_plane_access_attributes(struct kvm_plane *plane,
+ gfn_t gfn)
+{
+ return 0;
+}
+#endif /* CONFIG_VM_PLANES */
+
#ifdef CONFIG_KVM_GUEST_MEMFD
int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
gfn_t gfn, kvm_pfn_t *pfn, struct page **page,
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 348628c7b17e..3118b31d13f6 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -1688,6 +1688,7 @@ struct kvm_memory_attributes {
#define KVM_MEMORY_ATTRIBUTE_PRIVATE (1ULL << 3)
#define KVM_MEMORY_ATTRIBUTE_NO_WRITE (1ULL << 4)
#define KVM_MEMORY_ATTRIBUTE_NO_EXEC (1ULL << 5)
+#define KVM_MEMORY_ATTRIBUTE_NO_READ (1ULL << 6)
#define KVM_CREATE_GUEST_MEMFD _IOWR(KVMIO, 0xd4, struct kvm_create_guest_memfd)
#define GUEST_MEMFD_FLAG_MMAP (1ULL << 0)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 553c282500fd..3a1a09f26340 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1236,6 +1236,9 @@ static struct kvm_plane *kvm_create_plane(struct kvm *kvm, unsigned plane_level)
plane->level = plane_level;
xa_init(&plane->vcpu_array);
+#ifdef CONFIG_VM_PLANES
+ xa_init(&plane->access_attr_array);
+#endif
if (kvm_arch_plane_init(kvm, plane, plane_level))
goto out_free_plane;
@@ -1254,6 +1257,9 @@ static struct kvm_plane *kvm_create_plane(struct kvm *kvm, unsigned plane_level)
static void kvm_destroy_one_plane(struct kvm_plane *plane)
{
kvm_arch_plane_destroy(plane);
+#ifdef CONFIG_VM_PLANES
+ xa_destroy(&plane->access_attr_array);
+#endif
kvm_free_plane(plane);
}
--
2.55.0
next prev parent reply other threads:[~2026-08-05 11:04 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 ` [RFC PATCH v1 16/42] vbs: Add HEKI kernel sealing and fix KVM plane memory attribute guards Sriram Nambakam
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 ` Sriram Nambakam [this message]
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-35-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.