nvme-cli: prevent ARM64 VMs from crashing

Resolves: RHEL-88173

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
This commit is contained in:
Maurizio Lombardi 2026-02-25 15:28:54 +01:00
parent a8002a662b
commit 0affc5bf8a
2 changed files with 64 additions and 1 deletions

View File

@ -0,0 +1,58 @@
diff --git a/nvme-print.c b/nvme-print.c
index 2327674..cc27dc9 100644
--- a/nvme-print.c
+++ b/nvme-print.c
@@ -2452,23 +2452,45 @@ static void nvme_show_registers_pmrmscu(uint32_t pmrmscu)
pmrmscu);
}
-static inline uint32_t mmio_read32(void *addr)
+/*
+ * VMs on arm64 can only use a subset of instructions for MMIO that provide
+ * the hypervisor with a complete instruction decode. Provide assembly MMIO
+ * accessors to prevent the compiler from using a possibly unsupported
+ * instruction.
+ *
+ * See kernel commit c726200dd106 ("KVM: arm/arm64: Allow reporting non-ISV
+ * data aborts to userspace") for more details.
+ */
+#if defined(__aarch64__)
+static inline uint32_t __raw_readl(const volatile uint32_t *addr)
+{
+ uint32_t val;
+
+ asm volatile("ldr %w0, %1" : "=r" (val) : "Qo" (*addr));
+
+ return val;
+}
+#else
+static inline uint32_t __raw_readl(volatile uint32_t *addr)
{
- __le32 *p = addr;
+ return *addr;
+}
+#endif
- return le32_to_cpu(*p);
+static inline uint32_t mmio_read32(void *addr)
+{
+ return le32_to_cpu(__raw_readl(addr));
}
/* Access 64-bit registers as 2 32-bit; Some devices fail 64-bit MMIO. */
static inline __u64 mmio_read64(void *addr)
{
- const volatile __u32 *p = addr;
- __u32 low, high;
+ uint32_t low, high;
- low = le32_to_cpu(*p);
- high = le32_to_cpu(*(p + 1));
+ low = le32_to_cpu(__raw_readl(addr));
+ high = le32_to_cpu(__raw_readl(addr + sizeof(uint32_t)));
- return ((__u64) high << 32) | low;
+ return ((uint64_t)high << 32) | low;
}
static void json_ctrl_registers(void *bar)

View File

@ -3,7 +3,7 @@
Name: nvme-cli
Version: 1.16
Release: 9%{?dist}
Release: 10%{?dist}
Summary: NVMe management command line interface
License: GPLv2+
@ -29,6 +29,7 @@ Patch15: 0015-fix-firmware-log-page-frs-variable-sign.patch
Patch16: 0016-fix-file-permissions-nvme-print.c.patch
Patch17: 0017-fabrics-Fix-ordering-for-auto-connect-services.patch
Patch18: 0018-nvme-fix-rnlpt-to_string-values.patch
Patch19: 0019-nvme-avoid-using-unsupported-load-store.patch
BuildRequires: libuuid-devel
BuildRequires: gcc
@ -60,6 +61,7 @@ nvme-cli provides NVM-Express user space tooling for Linux.
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%build
@ -118,6 +120,9 @@ if [ $1 -eq 1 ] || [ $1 -eq 2 ]; then
fi
%changelog
* Wed Feb 25 2026 Maurizio Lombardi <mlombard@redhat.com> - 1.16-10
- Fix VM crash RHEL-88173
* Thu Apr 20 2023 Maurizio Lombardi <mlombard@redhat.com> - 1.16-9
- Fix BZ #2187288