xref: /freebsd/sbin/nvmecontrol/nvmecontrol.8 (revision 0d4ad64077bcddcff5a170ee97273db95b9cab55)
1.\"
2.\" Copyright (c) 2020 Warner Losh <imp@FreeBSD.org>
3.\" Copyright (c) 2018-2019 Alexander Motin <mav@FreeBSD.org>
4.\" Copyright (c) 2012 Intel Corporation
5.\" All rights reserved.
6.\"
7.\" Redistribution and use in source and binary forms, with or without
8.\" modification, are permitted provided that the following conditions
9.\" are met:
10.\" 1. Redistributions of source code must retain the above copyright
11.\"    notice, this list of conditions, and the following disclaimer,
12.\"    without modification.
13.\" 2. Redistributions in binary form must reproduce at minimum a disclaimer
14.\"    substantially similar to the "NO WARRANTY" disclaimer below
15.\"    ("Disclaimer") and any redistribution must be conditioned upon
16.\"    including a substantially similar Disclaimer requirement for further
17.\"    binary redistribution.
18.\"
19.\" NO WARRANTY
20.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21.\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
23.\" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24.\" HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30.\" POSSIBILITY OF SUCH DAMAGES.
31.\"
32.\" nvmecontrol man page.
33.\"
34.\" Author: Jim Harris <jimharris@FreeBSD.org>
35.\"
36.Dd April 17, 2024
37.Dt NVMECONTROL 8
38.Os
39.Sh NAME
40.Nm nvmecontrol
41.Nd NVM Express control utility
42.Sh SYNOPSIS
43.Nm
44.Ic devlist
45.Op Fl h
46.Nm
47.Ic identify
48.Op Fl v
49.Op Fl x
50.Op Fl n Ar nsid
51.Aq Ar device-id | Ar namespace-id
52.Nm
53.Ic perftest
54.Aq Fl n Ar num_threads
55.Aq Fl o Ar read|write
56.Op Fl p
57.Aq Fl s Ar size_in_bytes
58.Aq Fl t Ar time_in_sec
59.Aq Ar namespace-id
60.Nm
61.Ic reset
62.Aq Ar device-id
63.Nm
64.Ic logpage
65.Aq Fl p Ar page_id
66.Op Fl x
67.Op Fl v Ar vendor-string
68.Op Fl b
69.Op Fl f Ar LSP
70.Op Fl i Ar LSI
71.Op Fl r
72.Aq Ar device-id | Ar namespace-id
73.Nm
74.Ic ns active
75.Aq Ar device-id
76.Nm
77.Ic ns allocated
78.Aq Ar device-id
79.Nm
80.Ic ns attach
81.Aq Fl n Ar nsid
82.Aq Fl c Ar cntid
83.Aq Ar device-id
84.Nm
85.Ic ns attached
86.Aq Fl n Ar nsid
87.Aq Ar device-id
88.Nm
89.Ic ns controllers
90.Aq Ar device-id
91.Nm
92.Ic ns create
93.Aq Fl s Ar nsze
94.Op Fl c Ar ncap
95.Op Fl f Ar lbaf
96.Op Fl m Ar mset
97.Op Fl n Ar nmic
98.Op Fl p Ar pi
99.Op Fl l Ar pil
100.Op Fl L Ar flbas
101.Op Fl d Ar dps
102.Aq Ar device-id
103.Nm
104.Ic ns delete
105.Aq Fl n Ar nsid
106.Aq Ar device-id
107.Nm
108.Ic ns detach
109.Aq Fl n Ar nsid
110.Aq Fl c Ar cntid
111.Aq Ar device-id
112.Nm
113.Ic ns identify
114.Op Fl v
115.Op Fl x
116.Aq Fl n Ar nsid
117.Aq Ar device-id
118.Nm
119.Ic nsid
120.Aq Ar device-id | Ar namespace-id
121.Nm
122.Ic resv acquire
123.Aq Fl c Ar crkey
124.Op Fl p Ar prkey
125.Aq Fl t Ar rtype
126.Aq Fl a Ar racqa
127.Aq Ar namespace-id
128.Nm
129.Ic resv register
130.Op Fl i
131.Op Fl c Ar crkey
132.Aq Fl k Ar nrkey
133.Aq Fl r Ar rrega
134.Op Fl p Ar cptpl
135.Aq Ar namespace-id
136.Nm
137.Ic resv release
138.Aq Fl c Ar crkey
139.Aq Fl t Ar rtype
140.Aq Fl a Ar rrela
141.Aq Ar namespace-id
142.Nm
143.Ic resv report
144.Op Fl e
145.Op Fl v
146.Op Fl x
147.Aq Ar namespace-id
148.Nm
149.Ic firmware
150.Op Fl s Ar slot
151.Op Fl f Ar path_to_firmware
152.Op Fl a
153.Aq Ar device-id
154.Nm
155.Ic format
156.Op Fl f Ar fmt
157.Op Fl m Ar mset
158.Op Fl p Ar pi
159.Op Fl l Ar pil
160.Op Fl E
161.Op Fl C
162.Aq Ar device-id | Ar namespace-id
163.Nm
164.Ic sanitize
165.Aq Fl a Ar sanact
166.Op Fl c Ar owpass
167.Op Fl d
168.Op Fl p Ar ovrpat
169.Op Fl r
170.Op Fl I
171.Op Fl U
172.Aq Ar device-id
173.Nm
174.Ic power
175.Op Fl l
176.Op Fl p power_state
177.Op Fl w workload_hint
178.Nm
179.Ic selftest
180.Aq Fl c Ar code
181.Aq Ar device-id | Ar namespace-id
182.Nm
183.Ic wdc cap-diag
184.Op Fl o path_template
185.Aq Ar device-id
186.Nm
187.Ic wdc drive-log
188.Op Fl o path_template
189.Aq Ar device-id
190.Nm
191.Ic wdc get-crash-dump
192.Op Fl o path_template
193.Aq Ar device-id
194.\" .Nm
195.\" .Ic wdc purge
196.\" .Aq device-id
197.\" .Nm
198.\" .Ic wdc purge-monitor
199.\" .Aq device-id
200.Nm
201.Ic admin-passthru
202.Op args
203.Aq Ar device-id
204.Nm
205.Ic io-passthru
206.Op args
207.Aq Ar namespace-id
208.Sh DESCRIPTION
209NVM Express (NVMe) is a storage protocol standard, for SSDs and other
210high-speed storage devices over PCI Express.
211.Ss devlist
212List all NVMe controllers and namespaces along with their device nodes.
213With the
214.Fl h
215argument, use unit suffixes: Byte, Kibibyte, Mebibyte, Gibibyte, Tebibyte
216and Pebibyte (based on powers of 1024) when showing the disk space.
217By default, uses Mebibyte.
218.Ss identify
219The identify commands reports information from the drive's
220.Dv IDENTIFY_CONTROLLER
221if a
222.Ar device-id
223is specified.
224It reports
225.Dv IDENTIFY_NAMESPACE
226data if a
227.Ar namespace-id
228is specified.
229When used with disk names, the
230.Dv IDENTIFY_NAMESPACE
231data is reported, unless the namespace
232.Ar nsid
233is overridden with the
234.Fl n
235flag.
236Then that namespace's data is reported, if it exists.
237The command accepts the following parameters:
238.Bl -tag -width 6n
239.It Fl n
240The namespace
241.Aq nsid
242to use instead of the namespace associated with the device.
243A
244.Ar nsid
245of
246.Dq 0
247is used to retrieve the
248.Dv IDENTIFY_CONTROLLER
249data associated with that drive.
250.El
251.Ss logpage
252The logpage command knows how to print log pages of various types.
253It also knows about vendor specific log pages from hgst/wdc, samsung and intel.
254Note that some vendors use the same log page numbers for different data.
255.Pp
256.Bl -tag -compact -width "Page 0x00"
257.It Dv Page 0x01
258Drive Error Log
259.It Dv Page 0x02
260Health/SMART Data
261.It Dv Page 0x03
262Firmware Information
263.It Dv Page 0x04
264Changed Namespace List
265.It Dv Page 0x05
266Commands Supported and Effects
267.It Dv Page 0x06
268Device Self-test
269.It Dv Page 0x80
270Reservation Notification
271.It Dv Page 0x81
272Sanitize Status
273.It Dv Page 0xc1
274Advanced SMART information (WDC/HGST)
275.It Dv Page 0xc1
276Read latency stats (Intel)
277.It Dv Page 0xc2
278Wite latency stats (Intel)
279.It Dv Page 0xc5
280Temperature stats (Intel)
281.It Dv Page 0xca
282Advanced SMART information (Intel)
283.It Dv Page 0xca
284Extended SMART information (Samsung)
285.El
286.Pp
287Specifying
288.Fl v
289.Ic help
290will list all valid vendors and pages.
291.Fl x
292will print the page as hex.
293.Fl b
294will print the binary data for the page.
295.Fl s
296will set Log Specific Field.
297.Fl i
298will set Log Specific Identifier.
299.Fl r
300will set Retain Asynchronous Event.
301.Ss ns
302Various namespace management commands.
303If namespace management is supported by device, allow list, create and delete
304namespaces, list, attach and detach controllers to namespaces.
305Each NVM device consists of one or more NVM subsystems.
306Each NVM subsystem has one or more NVM ports.
307Each NVM port is attached to one or more NVM controllers (though typically 1).
308Each NVM controller is attached to one or more namespaces.
309.Pp
310After a namespace is created, it is considered
311.Dq allocated .
312All namespaces that have not been created are unallocated.
313An allocated namespace may be active or inactive.
314An active namespace is attached to the controller and may be interacted with.
315A namespace can move from active to inactive when detached.
316An allocated namespace may be deleted to become unallocated.
317For more details on the nuances of NVM namespaces, please see section 2
318.Em Theory of Operation
319and section 3
320.Em NVM Express Architecture
321of the latest NVM standard.
322.Ss ns active
323Provide a list of active namespace identifiers for the givne NVM controller.
324.Ss ns allocated
325Provide a list of allocated namespace identifiers for the givne NVM controller.
326.Ss ns attach
327Attach an nsid to a controller.
328The primary controller is used if one is not specified.
329.Ss ns attached
330Provide a list of controllers attached to a nsid.
331If only a nvme controller argument is provided, a nsid must also be specified.
332.Ss ns controllers
333Provide a list of all controllers in the NVM subsystem.
334.Ss ns create
335Creates a new namespace.
336.Ss ns delete
337Delete a namespace.
338It must be currently inactive.
339.Ss ns detach
340Detach a namespace from a controller.
341The namespace will become inaccessible, but its contents will remain if it is
342.Em activated
343again.
344.Ss ns identify
345Print detailed information about the namespace.
346.Ss nsid
347Reports the namespace id and controller device associated with the
348.Aq Ar namespace-id
349or
350.Aq Ar device-id
351argument.
352.Ss resv acquire
353Acquire or preempt namespace reservation, using specified parameters:
354.Bl -tag -width 6n
355.It Fl a
356Acquire action:
357.Bl -tag -compact -width 6n
358.It Dv 0
359Acquire
360.It Dv 1
361Preempt
362.It Dv 2
363Preempt and abort
364.El
365.It Fl c
366Current reservation key.
367.It Fl p
368Preempt reservation key.
369.It Fl t
370Reservation type:
371.Bl -tag -compact -width 6n
372.It Dv 1
373Write Exclusive
374.It Dv 2
375Exclusive Access
376.It Dv 3
377Write Exclusive - Registrants Only
378.It Dv 4
379Exclusive Access - Registrants Only
380.It Dv 5
381Write Exclusive - All Registrants
382.It Dv 6
383Exclusive Access - All Registrants
384.El
385.El
386.Ss resv register
387Register, unregister or replace reservation key, using specified parameters:
388.Bl -tag -width 6n
389.It Fl c
390Current reservation key.
391.It Fl k
392New reservation key.
393.It Fl r
394Register action:
395.Bl -tag -compact -width 6n
396.It Dv 0
397Register
398.It Dv 1
399Unregister
400.It Dv 2
401Replace
402.El
403.It Fl i
404Ignore Existing Key
405.It Fl p
406Change Persist Through Power Loss State:
407.Bl -tag -compact -width 6n
408.It Dv 0
409No change to PTPL state
410.It Dv 2
411Set PTPL state to ‘0’.
412Reservations are released and registrants are cleared on a power on.
413.It Dv 3
414Set PTPL state to ‘1’.
415Reservations and registrants persist across a power loss.
416.El
417.El
418.Ss resv release
419Release or clear reservation, using specified parameters:
420.Bl -tag -width 6n
421.It Fl c
422Current reservation key.
423.It Fl t
424Reservation type.
425.It Fl a
426Release action:
427.Bl -tag -compact -width 6n
428.It Dv 0
429Release
430.It Dv 1
431Clean
432.El
433.El
434.Ss resv report
435Print reservation status, using specified parameters:
436.Bl -tag -width 6n
437.It Fl x
438Print reservation status in hex.
439.It Fl e
440Use Extended Data Structure.
441.El
442.Ss format
443Format either specified namespace, or all namespaces of specified controller,
444using specified parameters:
445.Ar fmt
446LBA Format,
447.Ar mset
448Metadata Settings,
449.Ar pi
450Protection Information,
451.Ar pil
452Protection Information Location.
453When formatting specific namespace, existing values are used as defaults.
454When formatting all namespaces, all parameters should be specified.
455Some controllers may not support formatting or erasing specific or all
456namespaces.
457Option
458.Fl E
459enables User Data Erase during format.
460Option
461.Fl C
462enables Cryptographic Erase during format.
463.Ss sanitize
464Sanitize NVM subsystem of specified controller,
465using specified parameters:
466.Bl -tag -width 6n
467.It Fl a Ar operation
468Specify the sanitize operation to perform.
469.Bl -tag -width 16n
470.It overwrite
471Perform an overwrite operation by writing a user supplied
472data pattern to the device one or more times.
473The pattern is given by the
474.Fl p
475argument.
476The number of times is given by the
477.Fl c
478argument.
479.It block
480Perform a block erase operation.
481All the device's blocks are set to a vendor defined
482value, typically zero.
483.It crypto
484Perform a cryptographic erase operation.
485The encryption keys are changed to prevent the decryption
486of the data.
487.It exitfailure
488Exits a previously failed sanitize operation.
489A failed sanitize operation can only be exited if it was
490run in the unrestricted completion mode, as provided by the
491.Fl U
492argument.
493.El
494.It Fl c Ar passes
495The number of passes when performing an
496.Sq overwrite
497operation.
498Valid values are between 1 and 16.
499The default is 1.
500.It Fl d
501No Deallocate After Sanitize.
502.It Fl I
503When performing an
504.Sq overwrite
505operation, the pattern is inverted between consecutive passes.
506.It Fl p Ar pattern
50732 bits of pattern to use when performing an
508.Sq overwrite
509operation.
510The pattern is repeated as needed to fill each block.
511.It Fl U
512Perform the sanitize in the unrestricted completion mode.
513If the operation fails, it can later be exited with the
514.Sq exitfailure
515operation.
516.It Fl r
517Run in
518.Dq report only
519mode.
520This will report status on a sanitize that is already running on the drive.
521.El
522.Ss power
523Manage the power modes of the NVMe controller.
524.Bl -tag -width 6n
525.It Fl l
526List all supported power modes.
527.It Fl p Ar mode
528Set the power mode to
529.Ar mode .
530This must be a mode listed with the
531.Dl nvmecontrol power -l
532command.
533.It Fl w Ar hint
534Set the workload hint for automatic power mode control.
535.Bl -tag -compact -width 6n
536.It 0
537No workload hint is provided.
538.It 1
539Extended idle period workload.
540The device is often idle for minutes at a time.
541A burst of write commands comes in over a period of seconds.
542Then the device returns to being idle.
543.It 2
544Heavy sequential writes.
545A huge number of sequential writes will be submitted, filling the submission queues.
546.It Other
547All other values are reserved and have no standard meaning.
548.El
549Please see the
550.Dq NVM Subsystem Workloads
551section of the relevant NVM Express Base Standard for details.
552.El
553.Ss selftest
554Start the specified device self-test:
555.Bl -tag -width 6n
556.It Fl c Ar code
557Specify the device self-test command code.
558Common codes are:
559.Bl -tag -compact -width 6n
560.It Dv 0x1
561Start a short device self-test operation
562.It Dv 0x2
563Start an extended device self-test operation
564.It Dv 0xe
565Start a vendor specific device self-test operation
566.It Dv 0xf
567Abort the device self-test operation
568.El
569.El
570.Ss wdc
571The various wdc command retrieve log data from the wdc/hgst drives.
572The
573.Fl o
574flag specifies a path template to use to output the files.
575Each file takes the path template (which defaults to nothing), appends
576the drive's serial number and the type of dump it is followed
577by .bin.
578These logs must be sent to the vendor for analysis.
579This tool only provides a way to extract them.
580.Ss passthru
581The
582.Dq admin-passthru
583and
584.Dq io-passthru
585commands send NVMe commands to
586either the administrative or the data part of the device.
587These commands are expected to be compatible with nvme-cli.
588Please see the NVM Express Base Standard for details.
589.Bl -tag -width 16n
590.It Fl o -opcode Ar opcode
591Opcode to send.
592.It Fl 2 -cdw2 Ar value
59332-bit value for CDW2.
594.It Fl 3 -cdw3 Ar value
59532-bit value for CDW3.
596.It Fl 4 -cdw10 Ar value
59732-bit value for CDW10.
598.It Fl 5 -cdw11 Ar value
59932-bit value for CDW11.
600.It Fl 6 -cdw12 Ar value
60132-bit value for CDW12.
602.It Fl 7 -cdw13 Ar value
60332-bit value for CDW13.
604.It Fl 8 -cdw14 Ar value
60532-bit value for CDW14.
606.It Fl 9 -cdw15 Ar value
60732-bit value for CDW15.
608.It Fl l -data-len
609Length of the data for I/O (bytes).
610.It Fl m -metadata-len
611Length of the metadata segment for command (bytes).
612This is ignored and not implemented in
613.Xr nvme 4 .
614.It Fl f -flags
615Nvme command flags.
616.It Fl n -namespace-id
617Namespace ID for command (Ignored).
618.It Fl p -prefill
619Value to prefill payload with.
620.It Fl b -raw-binary
621Output in binary format (otherwise a hex dump is produced).
622.It Fl d -dry-run
623Do not actually execute the command, but perform sanity checks on it.
624.It Fl r -read
625Command reads data from the device.
626.It Fl s -show-command
627Show all the command values on stdout.
628.It Fl w -write
629Command writes data to the device.
630.El
631.Pp
632Send arbitrary commands to the device.
633Can be used to extract vendor specific logs.
634Transfers to/from the device possible, but limited to
635.Dv MAXPHYS
636bytes.
637Commands either read data or write it, but not both.
638Commands needing metadata are not supported by the
639.Xr nvme 4
640drive.
641.Sh DEVICE NAMES
642Where
643.Aq Ar namespace-id
644is required, you can use either the
645.Pa nvmeXnsY
646device, or the disk device such as
647.Pa ndaZ
648or
649.Pa nvdZ .
650The leading
651.Pa /dev/
652is omitted.
653Where
654.Aq Ar device-id
655is required, you can use either the
656.Pa nvmeX
657device, or the disk device such as
658.Pa ndaZ
659or
660.Pa nvdZ .
661For commands that take an optional
662.Aq nsid
663you can use it to get information on other namespaces, or to query the
664drive itself.
665A
666.Aq nsid
667of
668.Dq 0
669means query the drive itself.
670.Sh EXAMPLES
671.Dl nvmecontrol devlist
672.Pp
673Display a list of NVMe controllers and namespaces along with their device nodes.
674.Pp
675.Dl nvmecontrol identify nvme0
676.Dl nvmecontrol identify -n 0 nvd0
677.Pp
678Display a human-readable summary of the nvme0
679.Dv IDENTIFY_CONTROLLER
680data.
681In this example, nvd0 is connected to nvme0.
682.Pp
683.Dl nvmecontrol identify -x -v nvme0ns1
684.Dl nvmecontrol identify -x -v -n 1 nvme0
685.Pp
686Display an hexadecimal dump of the nvme0
687.Dv IDENTIFY_NAMESPACE
688data for namespace 1.
689.Pp
690.Dl nvmecontrol perftest -n 32 -o read -s 512 -t 30 nvme0ns1
691.Pp
692Run a performance test on nvme0ns1 using 32 kernel threads for 30 seconds.
693Each thread will issue a single 512 byte read command.
694Results are printed to stdout when 30 seconds expires.
695.Pp
696.Dl nvmecontrol reset nvme0
697.Dl nvmecontrol reset nda4
698.Pp
699Perform a controller-level reset of the nvme0 controller.
700In this example, nda4 is wired to nvme0.
701.Pp
702.Dl nvmecontrol logpage -p 1 nvme0
703.Pp
704Display a human-readable summary of the nvme0 controller's Error Information Log.
705Log pages defined by the NVMe specification include Error Information Log (ID=1),
706SMART/Health Information Log (ID=2), and Firmware Slot Log (ID=3).
707.Pp
708.Dl nvmecontrol logpage -p 0xc1 -v wdc nvme0
709.Pp
710Display a human-readable summary of the nvme0's wdc-specific advanced
711SMART data.
712.Pp
713.Dl nvmecontrol logpage -p 1 -x nvme0
714.Pp
715Display a hexadecimal dump of the nvme0 controller's Error Information Log.
716.Pp
717.Dl nvmecontrol logpage -p 0xcb -b nvme0 > /tmp/page-cb.bin
718.Pp
719Print the contents of vendor specific page 0xcb as binary data on
720standard out.
721Redirect it to a temporary file.
722.Pp
723.Dl nvmecontrol firmware -s 2 -f /tmp/nvme_firmware nvme0
724.Pp
725Download the firmware image contained in "/tmp/nvme_firmware" to slot 2 of the
726nvme0 controller, but do not activate the image.
727.Pp
728.Dl nvmecontrol firmware -s 4 -a nvme0
729.Pp
730Activate the firmware in slot 4 of the nvme0 controller on the next reset.
731.Pp
732.Dl nvmecontrol firmware -s 7 -f /tmp/nvme_firmware -a nvme0
733.Pp
734Download the firmware image contained in "/tmp/nvme_firmware" to slot 7 of the
735nvme0 controller and activate it on the next reset.
736.Pp
737.Dl nvmecontrol power -l nvme0
738.Pp
739List all the current power modes.
740.Pp
741.Dl nvmecontrol power -p 3 nvme0
742.Pp
743Set the current power mode.
744.Pp
745.Dl nvmecontrol power nvme0
746.Pp
747Get the current power mode.
748.Pp
749.Dl nvmecontrol identify -n 0 nda0
750.Pp
751Identify the drive data associated with the
752.Pa nda0
753device.
754The corresponding
755.Pa nvmeX
756devices is used automatically.
757.Pp
758.Dl nvmecontrol identify nda0
759.Pp
760Get the namespace parameters associated with the
761.Pa nda0
762device.
763The corresponding
764.Pa nvmeXnsY
765device is used automatically.
766.Sh DYNAMIC LOADING
767The directories
768.Pa /lib/nvmecontrol
769and
770.Pa /usr/local/lib/nvmecontrol
771are scanned for any .so files.
772These files are loaded.
773The members of the
774.Va top
775linker set are added to the top-level commands.
776The members of the
777.Va logpage
778linker set are added to the logpage parsers.
779.Sh SEE ALSO
780.Rs
781.%T The NVM Express Base Specification
782.%D June 10, 2019
783.%U https://nvmexpress.org/wp-content/uploads/NVM-Express-1_4-2019.06.10-Ratified.pdf
784.Re
785.Sh HISTORY
786The
787.Nm
788utility appeared in
789.Fx 9.2 .
790.Sh AUTHORS
791.An -nosplit
792.Nm
793was developed by Intel and originally written by
794.An Jim Harris Aq Mt jimharris@FreeBSD.org .
795.Pp
796This man page was written by
797.An Jim Harris Aq Mt jimharris@FreeBSD.org .
798