git: f5a43e10fe4d - stable/12 - fix big-endian platforms after 6733401935f8

Warner Losh imp at FreeBSD.org
Sat Jul 31 00:21:33 UTC 2021


The branch stable/12 has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=f5a43e10fe4d0fcc13f64d14e4c6c7ba285d8b3c

commit f5a43e10fe4d0fcc13f64d14e4c6c7ba285d8b3c
Author:     Chuck Tuffli <chuck at FreeBSD.org>
AuthorDate: 2021-01-08 22:36:37 +0000
Commit:     Warner Losh <imp at FreeBSD.org>
CommitDate: 2021-07-31 00:02:53 +0000

    fix big-endian platforms after 6733401935f8
    
    The NVMe byte-swap routines for big-endian platforms used memcpy() to
    move the unaligned 64-bit value into a temp register to byte swap it.
    Instead of introducing a dependency, manually byte-swap the values in
    place.
    
    Point hat:      me
    
    (cherry picked from commit e83fdf8bb391579fa422d34663cd8c1f82a00dc0)
---
 sys/dev/nvme/nvme.h | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h
index f42d1e9caa3b..2caf8171be5b 100644
--- a/sys/dev/nvme/nvme.h
+++ b/sys/dev/nvme/nvme.h
@@ -2053,16 +2053,20 @@ static inline void
 nvme_device_self_test_swapbytes(struct nvme_device_self_test_page *s __unused)
 {
 #if _BYTE_ORDER != _LITTLE_ENDIAN
-	uint64_t failing_lba;
-	uint32_t r;
+	uint8_t *tmp;
+	uint32_t r, i;
+	uint8_t b;
 
 	for (r = 0; r < 20; r++) {
 		s->result[r].poh = le64toh(s->result[r].poh);
 		s->result[r].nsid = le32toh(s->result[r].nsid);
 		/* Unaligned 64-bit loads fail on some architectures */
-		memcpy(&failing_lba, s->result[r].failing_lba, sizeof(failing_lba));
-		failing_lba = le64toh(failing_lba);
-		memcpy(s->result[r].failing_lba, &failing_lba, sizeof(failing_lba));
+		tmp = s->result[r].failing_lba;
+		for (i = 0; i < 4; i++) {
+			b = tmp[i];
+			tmp[i] = tmp[7-i];
+			tmp[7-i] = b;
+		}
 	}
 #endif
 }


More information about the dev-commits-src-all mailing list