aboutsummaryrefslogtreecommitdiffstats
path: root/sysutils
diff options
context:
space:
mode:
authormw <mw@FreeBSD.org>2018-03-09 02:43:41 +0800
committermw <mw@FreeBSD.org>2018-03-09 02:43:41 +0800
commitdb05cd9353da2b12326ae817c2f8f047e1b10c08 (patch)
treeb47f8acb4714052e9f8ee764f61f2512b534138f /sysutils
parent87e1b8f8c3212932b2e1a7dff04a96bbc16feb2c (diff)
downloadfreebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.tar.gz
freebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.tar.zst
freebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.zip
Display NVMe data properly on Big Endian hosts with sysutils/smartmontools
smartctl can now be used with NVMe drives on BE hosts. Submitted by: Michal Stanek <mst@semihalf.com> Reviewed by: cy Obtained from: Semihalf Sponsored by: IBM, QCM Technologies Differential Revision: https://reviews.freebsd.org/D14543
Diffstat (limited to 'sysutils')
-rw-r--r--sysutils/smartmontools/files/patch-os__freebsd.cpp44
1 files changed, 35 insertions, 9 deletions
diff --git a/sysutils/smartmontools/files/patch-os__freebsd.cpp b/sysutils/smartmontools/files/patch-os__freebsd.cpp
index d174a536668a..87e960a3f22b 100644
--- a/sysutils/smartmontools/files/patch-os__freebsd.cpp
+++ b/sysutils/smartmontools/files/patch-os__freebsd.cpp
@@ -1,14 +1,15 @@
--- os_freebsd.cpp.orig 2017-04-24 09:34:16.000000000 -0700
-+++ os_freebsd.cpp 2018-02-22 23:01:44.118712000 -0800
-@@ -15,6 +15,7 @@
- *
++++ os_freebsd.cpp 2018-02-27 19:15:54.338861000 +0000
+@@ -16,6 +16,8 @@
*/
-+#include <sys/param.h>
#include <stdio.h>
++#include <sys/endian.h>
++#include <sys/param.h>
#include <sys/types.h>
#include <dirent.h>
-@@ -484,7 +485,7 @@
+ #include <fcntl.h>
+@@ -484,7 +486,7 @@
}
nsid = 0xFFFFFFFF; // broadcast id
}
@@ -17,16 +18,41 @@
&ctrlid, &nsid, &tmp) == 2)
{
if(ctrlid < 0 || nsid < 0) {
-@@ -521,7 +522,11 @@
+@@ -521,16 +523,20 @@
struct nvme_pt_command pt;
memset(&pt, 0, sizeof(pt));
-- pt.cmd.opc = in.opcode;
+#if __FreeBSD_version >= 1200058
+ pt.cmd.opc_fuse = NVME_CMD_SET_OPC(in.opcode);
+#else
-+ pt.cmd.opc = in.opcode;
+ pt.cmd.opc = in.opcode;
+#endif
- pt.cmd.nsid = in.nsid;
+- pt.cmd.nsid = in.nsid;
++ pt.cmd.nsid = htole32(in.nsid);
pt.buf = in.buffer;
pt.len = in.size;
+- pt.cmd.cdw10 = in.cdw10;
+- pt.cmd.cdw11 = in.cdw11;
+- pt.cmd.cdw12 = in.cdw12;
+- pt.cmd.cdw13 = in.cdw13;
+- pt.cmd.cdw14 = in.cdw14;
+- pt.cmd.cdw15 = in.cdw15;
++ pt.cmd.cdw10 = htole32(in.cdw10);
++ pt.cmd.cdw11 = htole32(in.cdw11);
++ pt.cmd.cdw12 = htole32(in.cdw12);
++ pt.cmd.cdw13 = htole32(in.cdw13);
++ pt.cmd.cdw14 = htole32(in.cdw14);
++ pt.cmd.cdw15 = htole32(in.cdw15);
+ pt.is_read = 1; // should we use in.direction()?
+
+ int status = ioctl(get_fd(), NVME_PASSTHROUGH_CMD, &pt);
+@@ -538,6 +544,9 @@
+ if (status < 0)
+ return set_err(errno, "NVME_PASSTHROUGH_CMD: %s", strerror(errno));
+
++#if __FreeBSD_version >= 1200058
++ nvme_completion_swapbytes(&pt.cpl);
++#endif
+ out.result=pt.cpl.cdw0; // Command specific result (DW0)
+
+ if (nvme_completion_is_error(&pt.cpl))