summaryrefslogtreecommitdiffstats
path: root/drivers/zorro/names.c
diff options
context:
space:
mode:
authorSean Christopherson <seanjc@google.com>2026-09-23 09:37:21 -0700
committerPaolo Bonzini <pbonzini@redhat.com>2026-09-26 00:39:55 -0400
commit93de2a6a4b91b72607136dd656edf03fb399d27f (patch)
tree9220c76eb23cb39a146fac9692ee69afa4aa3135 /drivers/zorro/names.c
downloadlinux-stable-93de2a6a4b91b72607136dd656edf03fb399d27f.tar.gz
linux-stable-93de2a6a4b91b72607136dd656edf03fb399d27f.zip
KVM: SEV: Do cache maintenance on the source VM during intra-host migrationgrafted
Manually perform cache maintenance on the source VM during intra-host migration to ensure no stale data is left in CPU caches after the VM is destroyed. Because the source VM is "converted" to a non-SEV VM, KVM's memory reclaim flows won't trigger cache maintenance, e.g. when all guest memory is reclaimed in response to detaching from the mmu_notifier. Note, relying on the destination VM to do cache maintenance isn't an option as KVM doesn't require identical guest memory configurations, i.e. the source VM may have access to memory that the destination VM does not. Enforcing equivalent memory configurations is infeasible, as it would require a *deep* comparison of memslots, e.g. to verify that not only are the memslot identical, but what the memslots point at is also identical. Fixes: b56639318bb2 ("KVM: SEV: Add support for SEV intra host migration") Cc: stable@vger.kernel.org Reported-by: Stefan Teodorescu <fane@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-ID: <20260923163721.1584779-3-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'drivers/zorro/names.c')
-rw-r--r--drivers/zorro/names.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/drivers/zorro/names.c b/drivers/zorro/names.c
new file mode 100644
index 000000000..b44f90989
--- /dev/null
+++ b/drivers/zorro/names.c
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Zorro Device Name Tables
+ *
+ * Copyright (C) 1999--2000 Geert Uytterhoeven
+ *
+ * Based on the PCI version:
+ *
+ * Copyright 1992--1999 Drew Eckhardt, Frederic Potter,
+ * David Mosberger-Tang, Martin Mares
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/zorro.h>
+
+#include "zorro.h"
+
+struct zorro_prod_info {
+ __u16 prod;
+ unsigned short seen;
+ const char *name;
+};
+
+struct zorro_manuf_info {
+ __u16 manuf;
+ unsigned short nr;
+ const char *name;
+ struct zorro_prod_info *prods;
+};
+
+/*
+ * This is ridiculous, but we want the strings in
+ * the .init section so that they don't take up
+ * real memory.. Parse the same file multiple times
+ * to get all the info.
+ */
+#define MANUF(manuf, name) static char __manufstr_##manuf[] __initdata = name;
+#define ENDMANUF()
+#define PRODUCT(manuf, prod, name) static char __prodstr_##manuf##prod[] __initdata = name;
+#include "devlist.h"
+
+
+#define MANUF(manuf, name) static struct zorro_prod_info __prods_##manuf[] __initdata = {
+#define ENDMANUF() };
+#define PRODUCT(manuf, prod, name) { 0x##prod, 0, __prodstr_##manuf##prod },
+#include "devlist.h"
+
+static struct zorro_manuf_info __initdata zorro_manuf_list[] = {
+#define MANUF(manuf, name) { 0x##manuf, ARRAY_SIZE(__prods_##manuf), __manufstr_##manuf, __prods_##manuf },
+#define ENDMANUF()
+#define PRODUCT(manuf, prod, name)
+#include "devlist.h"
+};
+
+#define MANUFS ARRAY_SIZE(zorro_manuf_list)
+
+void __init zorro_name_device(struct zorro_dev *dev)
+{
+ const struct zorro_manuf_info *manuf_p = zorro_manuf_list;
+ int i = MANUFS;
+ char *name = dev->name;
+
+ do {
+ if (manuf_p->manuf == ZORRO_MANUF(dev->id))
+ goto match_manuf;
+ manuf_p++;
+ } while (--i);
+
+ /* Couldn't find either the manufacturer nor the product */
+ return;
+
+ match_manuf: {
+ struct zorro_prod_info *prod_p = manuf_p->prods;
+ int i = manuf_p->nr;
+
+ while (i > 0) {
+ if (prod_p->prod ==
+ ((ZORRO_PROD(dev->id)<<8) | ZORRO_EPC(dev->id)))
+ goto match_prod;
+ prod_p++;
+ i--;
+ }
+
+ /* Ok, found the manufacturer, but unknown product */
+ sprintf(name, "Zorro device %08x (%s)", dev->id, manuf_p->name);
+ return;
+
+ /* Full match */
+ match_prod: {
+ char *n = name + sprintf(name, "%s %s", manuf_p->name, prod_p->name);
+ int nr = prod_p->seen + 1;
+ prod_p->seen = nr;
+ if (nr > 1)
+ sprintf(n, " (#%d)", nr);
+ }
+ }
+}