Annotation of embedaddon/smartmontools/os_freebsd.h, revision 1.1.1.2
1.1 misho 1: /*
2: * os_freebsd.h
3: *
4: * Home page of code is: http://smartmontools.sourceforge.net
5: *
6: * Copyright (C) 2003-8 Eduard Martinescu <smartmontools-support@lists.sourceforge.net>
7: *
8: * This program is free software; you can redistribute it and/or modify
9: * it under the terms of the GNU General Public License as published by
10: * the Free Software Foundation; either version 2, or (at your option)
11: * any later version.
12: *
13: * You should have received a copy of the GNU General Public License
1.1.1.2 ! misho 14: * (for example COPYING); if not, write to the Free Software Foundation,
! 15: * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1.1 misho 16: *
17: * This code was originally developed as a Senior Thesis by Michael Cornwell
18: * at the Concurrent Systems Laboratory (now part of the Storage Systems
19: * Research Center), Jack Baskin School of Engineering, University of
20: * California, Santa Cruz. http://ssrc.soe.ucsc.edu/
21: *
22: */
23:
24: /*-
25: * Copyright (c) 2000 Michael Smith
26: * Copyright (c) 2003 Paul Saab
27: * Copyright (c) 2003 Vinod Kashyap
28: * Copyright (c) 2000 BSDi
29: * All rights reserved.
30: *
31: * Redistribution and use in source and binary forms, with or without
32: * modification, are permitted provided that the following conditions
33: * are met:
34: * 1. Redistributions of source code must retain the above copyright
35: * notice, this list of conditions and the following disclaimer.
36: * 2. Redistributions in binary form must reproduce the above copyright
37: * notice, this list of conditions and the following disclaimer in the
38: * documentation and/or other materials provided with the distribution.
39: *
40: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
41: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50: * SUCH DAMAGE.
51: *
52: */
53:
54: /*
55: * Copyright (c) 2004-05 Applied Micro Circuits Corporation.
56: * Copyright (c) 2004-05 Vinod Kashyap
57: * All rights reserved.
58: *
59: * Redistribution and use in source and binary forms, with or without
60: * modification, are permitted provided that the following conditions
61: * are met:
62: * 1. Redistributions of source code must retain the above copyright
63: * notice, this list of conditions and the following disclaimer.
64: * 2. Redistributions in binary form must reproduce the above copyright
65: * notice, this list of conditions and the following disclaimer in the
66: * documentation and/or other materials provided with the distribution.
67: *
68: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
69: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
70: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
71: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
72: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
73: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
74: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
75: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
76: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
77: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
78: * SUCH DAMAGE.
79: *
80: */
81:
82: #ifndef OS_FREEBSD_H_
83: #define OS_FREEBSD_H_
84:
1.1.1.2 ! misho 85: #define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h 3727 2012-12-13 17:23:06Z samm2 $"
1.1 misho 86:
87: #define MAX_NUM_DEV 26
88:
89: #ifdef HAVE_SYS_TWEREG_H
90: #include <sys/twereg.h>
91: #else
92: /**
93: * The following cut out of twereg.h
94: *
95: */
96: #if __FreeBSD_version < 500040
97: #define __packed __attribute__((__packed__))
98: #endif
99:
100: #define TWE_MAX_SGL_LENGTH 62
101: #define TWE_MAX_ATA_SGL_LENGTH 60
102: #define TWE_OP_ATA_PASSTHROUGH 0x11
103:
104: /* scatter/gather list entry */
105: typedef struct
106: {
107: u_int32_t address;
108: u_int32_t length;
109: } __packed TWE_SG_Entry;
110:
111: typedef struct {
112: u_int8_t opcode:5; /* TWE_OP_INITCONNECTION */
113: u_int8_t res1:3;
114: u_int8_t size;
115: u_int8_t request_id;
116: u_int8_t res2:4;
117: u_int8_t host_id:4;
118: u_int8_t status;
119: u_int8_t flags;
120: u_int16_t message_credits;
121: u_int32_t response_queue_pointer;
122: } __packed TWE_Command_INITCONNECTION;
123:
124: typedef struct
125: {
126: u_int8_t opcode:5; /* TWE_OP_READ/TWE_OP_WRITE */
127: u_int8_t res1:3;
128: u_int8_t size;
129: u_int8_t request_id;
130: u_int8_t unit:4;
131: u_int8_t host_id:4;
132: u_int8_t status;
133: u_int8_t flags;
134: u_int16_t block_count;
135: u_int32_t lba;
136: TWE_SG_Entry sgl[TWE_MAX_SGL_LENGTH];
137: } __packed TWE_Command_IO;
138:
139: typedef struct
140: {
141: u_int8_t opcode:5; /* TWE_OP_HOTSWAP */
142: u_int8_t res1:3;
143: u_int8_t size;
144: u_int8_t request_id;
145: u_int8_t unit:4;
146: u_int8_t host_id:4;
147: u_int8_t status;
148: u_int8_t flags;
149: u_int8_t action;
150: #define TWE_OP_HOTSWAP_REMOVE 0x00 /* remove assumed-degraded unit */
151: #define TWE_OP_HOTSWAP_ADD_CBOD 0x01 /* add CBOD to empty port */
152: #define TWE_OP_HOTSWAP_ADD_SPARE 0x02 /* add spare to empty port */
153: u_int8_t aport;
154: } __packed TWE_Command_HOTSWAP;
155:
156: typedef struct
157: {
158: u_int8_t opcode:5; /* TWE_OP_SETATAFEATURE */
159: u_int8_t res1:3;
160: u_int8_t size;
161: u_int8_t request_id;
162: u_int8_t unit:4;
163: u_int8_t host_id:4;
164: u_int8_t status;
165: u_int8_t flags;
166: u_int8_t feature;
167: #define TWE_OP_SETATAFEATURE_WCE 0x02
168: #define TWE_OP_SETATAFEATURE_DIS_WCE 0x82
169: u_int8_t feature_mode;
170: u_int16_t all_units;
171: u_int16_t persistence;
172: } __packed TWE_Command_SETATAFEATURE;
173:
174: typedef struct
175: {
176: u_int8_t opcode:5; /* TWE_OP_CHECKSTATUS */
177: u_int8_t res1:3;
178: u_int8_t size;
179: u_int8_t request_id;
180: u_int8_t unit:4;
181: u_int8_t res2:4;
182: u_int8_t status;
183: u_int8_t flags;
184: u_int16_t target_status; /* set low byte to target request's ID */
185: } __packed TWE_Command_CHECKSTATUS;
186:
187: typedef struct
188: {
189: u_int8_t opcode:5; /* TWE_OP_GETPARAM, TWE_OP_SETPARAM */
190: u_int8_t res1:3;
191: u_int8_t size;
192: u_int8_t request_id;
193: u_int8_t unit:4;
194: u_int8_t host_id:4;
195: u_int8_t status;
196: u_int8_t flags;
197: u_int16_t param_count;
198: TWE_SG_Entry sgl[TWE_MAX_SGL_LENGTH];
199: } __packed TWE_Command_PARAM;
200:
201: typedef struct
202: {
203: u_int8_t opcode:5; /* TWE_OP_REBUILDUNIT */
204: u_int8_t res1:3;
205: u_int8_t size;
206: u_int8_t request_id;
207: u_int8_t src_unit:4;
208: u_int8_t host_id:4;
209: u_int8_t status;
210: u_int8_t flags;
211: u_int8_t action:7;
212: #define TWE_OP_REBUILDUNIT_NOP 0
213: #define TWE_OP_REBUILDUNIT_STOP 2 /* stop all rebuilds */
214: #define TWE_OP_REBUILDUNIT_START 4 /* start rebuild with lowest unit */
215: #define TWE_OP_REBUILDUNIT_STARTUNIT 5 /* rebuild src_unit (not supported) */
216: u_int8_t cs:1; /* request state change on src_unit */
217: u_int8_t logical_subunit; /* for RAID10 rebuild of logical subunit */
218: } __packed TWE_Command_REBUILDUNIT;
219:
220: typedef struct
221: {
222: u_int8_t opcode:5;
223: u_int8_t sgl_offset:3;
224: u_int8_t size;
225: u_int8_t request_id;
226: u_int8_t unit;
227: u_int8_t status;
228: u_int8_t flags;
229: u_int16_t param;
230: u_int16_t features;
231: u_int16_t sector_count;
232: u_int16_t sector_num;
233: u_int16_t cylinder_lo;
234: u_int16_t cylinder_hi;
235: u_int8_t drive_head;
236: u_int8_t command;
237: TWE_SG_Entry sgl[TWE_MAX_ATA_SGL_LENGTH];
238: } __packed TWE_Command_ATA;
239:
240: typedef struct
241: {
242: u_int8_t opcode:5;
243: u_int8_t sgl_offset:3;
244: u_int8_t size;
245: u_int8_t request_id;
246: u_int8_t unit:4;
247: u_int8_t host_id:4;
248: u_int8_t status;
249: u_int8_t flags;
250: #define TWE_FLAGS_SUCCESS 0x00
251: #define TWE_FLAGS_INFORMATIONAL 0x01
252: #define TWE_FLAGS_WARNING 0x02
253: #define TWE_FLAGS_FATAL 0x03
254: #define TWE_FLAGS_PERCENTAGE (1<<8) /* bits 0-6 indicate completion percentage */
255: u_int16_t count; /* block count, parameter count, message credits */
256: } __packed TWE_Command_Generic;
257:
258: /* command packet - must be TWE_ALIGNMENT aligned */
259: typedef union
260: {
261: TWE_Command_INITCONNECTION initconnection;
262: TWE_Command_IO io;
263: TWE_Command_PARAM param;
264: TWE_Command_CHECKSTATUS checkstatus;
265: TWE_Command_REBUILDUNIT rebuildunit;
266: TWE_Command_SETATAFEATURE setatafeature;
267: TWE_Command_ATA ata;
268: TWE_Command_Generic generic;
269: u_int8_t pad[512];
270: } TWE_Command;
271:
272: /* response queue entry */
273: typedef union
274: {
275: struct
276: {
277: u_int32_t undefined_1:4;
278: u_int32_t response_id:8;
279: u_int32_t undefined_2:20;
280: } u;
281: u_int32_t value;
282: } TWE_Response_Queue;
283:
284: #endif
285:
286: #ifdef HAVE_SYS_TWEIO_H
287: #include <sys/tweio.h>
288: #else
289: /*
290: * Following cut out of tweio.h
291: *
292: */
293: /*
294: * User-space command
295: *
296: * Note that the command's scatter/gather list will be computed by the
297: * driver, and cannot be filled in by the consumer.
298: */
299: struct twe_usercommand {
300: TWE_Command tu_command; /* command ready for the controller */
301: void *tu_data; /* pointer to data in userspace */
302: size_t tu_size; /* userspace data length */
303: };
304:
305: #define TWEIO_COMMAND _IOWR('T', 100, struct twe_usercommand)
306:
307: #endif
308:
309: #ifdef HAVE_SYS_TW_OSL_IOCTL_H
310: #include <sys/tw_osl_ioctl.h>
311: #else
312: /*
313: * Following cut out of tw_osl_types.h
314: *
315: */
316:
317: typedef void TW_VOID;
318: typedef char TW_INT8;
319: typedef unsigned char TW_UINT8;
320: typedef short TW_INT16;
321: typedef unsigned short TW_UINT16;
322: typedef int TW_INT32;
323: typedef unsigned int TW_UINT32;
324: typedef long long TW_INT64;
325: typedef unsigned long long TW_UINT64;
326:
327: /*
328: * Following cut out of tw_cl_share.h
329: *
330: */
331:
332: #pragma pack(1)
333:
334: struct tw_cl_event_packet {
335: TW_UINT32 sequence_id;
336: TW_UINT32 time_stamp_sec;
337: TW_UINT16 aen_code;
338: TW_UINT8 severity;
339: TW_UINT8 retrieved;
340: TW_UINT8 repeat_count;
341: TW_UINT8 parameter_len;
342: TW_UINT8 parameter_data[98];
343: TW_UINT32 event_src;
344: TW_UINT8 severity_str[20];
345: };
346:
347: #pragma pack()
348:
349: /*
350: * Following cut out of tw_cl_fwif.h
351: *
352: */
353:
354: #define TWA_FW_CMD_ATA_PASSTHROUGH 0x11
355:
356: #define TWA_SENSE_DATA_LENGTH 18
357:
358: #pragma pack(1)
359: /* 7000 structures. */
360: struct tw_cl_command_init_connect {
361: TW_UINT8 res1__opcode; /* 3:5 */
362: TW_UINT8 size;
363: TW_UINT8 request_id;
364: TW_UINT8 res2;
365: TW_UINT8 status;
366: TW_UINT8 flags;
367: TW_UINT16 message_credits;
368: TW_UINT32 features;
369: TW_UINT16 fw_srl;
370: TW_UINT16 fw_arch_id;
371: TW_UINT16 fw_branch;
372: TW_UINT16 fw_build;
373: TW_UINT32 result;
374: };
375:
376:
377: /* Structure for downloading firmware onto the controller. */
378: struct tw_cl_command_download_firmware {
379: TW_UINT8 sgl_off__opcode;/* 3:5 */
380: TW_UINT8 size;
381: TW_UINT8 request_id;
382: TW_UINT8 unit;
383: TW_UINT8 status;
384: TW_UINT8 flags;
385: TW_UINT16 param;
386: TW_UINT8 sgl[1];
387: };
388:
389:
390: /* Structure for hard resetting the controller. */
391: struct tw_cl_command_reset_firmware {
392: TW_UINT8 res1__opcode; /* 3:5 */
393: TW_UINT8 size;
394: TW_UINT8 request_id;
395: TW_UINT8 unit;
396: TW_UINT8 status;
397: TW_UINT8 flags;
398: TW_UINT8 res2;
399: TW_UINT8 param;
400: };
401:
402:
403: /* Structure for sending get/set param commands. */
404: struct tw_cl_command_param {
405: TW_UINT8 sgl_off__opcode;/* 3:5 */
406: TW_UINT8 size;
407: TW_UINT8 request_id;
408: TW_UINT8 host_id__unit; /* 4:4 */
409: TW_UINT8 status;
410: TW_UINT8 flags;
411: TW_UINT16 param_count;
412: TW_UINT8 sgl[1];
413: };
414:
415:
416: /* Generic command packet. */
417: struct tw_cl_command_generic {
418: TW_UINT8 sgl_off__opcode;/* 3:5 */
419: TW_UINT8 size;
420: TW_UINT8 request_id;
421: TW_UINT8 host_id__unit; /* 4:4 */
422: TW_UINT8 status;
423: TW_UINT8 flags;
424: TW_UINT16 count; /* block cnt, parameter cnt, message credits */
425: };
426:
427:
428: /* Command packet header. */
429: struct tw_cl_command_header {
430: TW_UINT8 sense_data[TWA_SENSE_DATA_LENGTH];
431: struct {
432: TW_INT8 reserved[4];
433: TW_UINT16 error;
434: TW_UINT8 padding;
435: TW_UINT8 res__severity; /* 5:3 */
436: } status_block;
437: TW_UINT8 err_specific_desc[98];
438: struct {
439: TW_UINT8 size_header;
440: TW_UINT16 reserved;
441: TW_UINT8 size_sense;
442: } header_desc;
443: };
444:
445:
446: /* 7000 Command packet. */
447: union tw_cl_command_7k {
448: struct tw_cl_command_init_connect init_connect;
449: struct tw_cl_command_download_firmware download_fw;
450: struct tw_cl_command_reset_firmware reset_fw;
451: struct tw_cl_command_param param;
452: struct tw_cl_command_generic generic;
453: TW_UINT8 padding[1024 - sizeof(struct tw_cl_command_header)];
454: };
455:
456:
457: /* 9000 Command Packet. */
458: struct tw_cl_command_9k {
459: TW_UINT8 res__opcode; /* 3:5 */
460: TW_UINT8 unit;
461: TW_UINT16 lun_l4__req_id; /* 4:12 */
462: TW_UINT8 status;
463: TW_UINT8 sgl_offset; /* offset (in bytes) to sg_list, from the
464: end of sgl_entries */
465: TW_UINT16 lun_h4__sgl_entries;
466: TW_UINT8 cdb[16];
467: TW_UINT8 sg_list[872];/* total struct size =
468: 1024-sizeof(cmd_hdr) */
469: };
470:
471:
472: /* Full command packet. */
473: struct tw_cl_command_packet {
474: struct tw_cl_command_header cmd_hdr;
475: union {
476: union tw_cl_command_7k cmd_pkt_7k;
477: struct tw_cl_command_9k cmd_pkt_9k;
478: } command;
479: };
480:
481: #pragma pack()
482:
483: /*
484: * Following cut out of tw_cl_ioctl.h
485: *
486: */
487:
488: #pragma pack(1)
489:
490: /* Structure used to handle GET/RELEASE LOCK ioctls. */
491: struct tw_cl_lock_packet {
492: TW_UINT32 timeout_msec;
493: TW_UINT32 time_remaining_msec;
494: TW_UINT32 force_flag;
495: };
496:
497:
498: /* Structure used to handle GET COMPATIBILITY INFO ioctl. */
499: struct tw_cl_compatibility_packet {
500: TW_UINT8 driver_version[32];/* driver version */
501: TW_UINT16 working_srl; /* driver & firmware negotiated srl */
502: TW_UINT16 working_branch; /* branch # of the firmware that the
503: driver is compatible with */
504: TW_UINT16 working_build; /* build # of the firmware that the
505: driver is compatible with */
506: };
507:
508:
509: /* Driver understandable part of the ioctl packet built by the API. */
510: struct tw_cl_driver_packet {
511: TW_UINT32 control_code;
512: TW_UINT32 status;
513: TW_UINT32 unique_id;
514: TW_UINT32 sequence_id;
515: TW_UINT32 os_status;
516: TW_UINT32 buffer_length;
517: };
518:
519: #pragma pack()
520:
521: /*
522: * Following cut out of tw_osl_ioctl.h
523: *
524: */
525:
526: #pragma pack(1)
527: /*
528: * We need the structure below to ensure that the first byte of
529: * data_buf is not overwritten by the kernel, after we return
530: * from the ioctl call. Note that cmd_pkt has been reduced
531: * to an array of 1024 bytes even though it's actually 2048 bytes
532: * in size. This is because, we don't expect requests from user
533: * land requiring 2048 (273 sg elements) byte cmd pkts.
534: */
535: typedef struct tw_osli_ioctl_no_data_buf {
536: struct tw_cl_driver_packet driver_pkt;
537: TW_VOID *pdata; /* points to data_buf */
538: TW_INT8 padding[488 - sizeof(TW_VOID *)];
539: struct tw_cl_command_packet cmd_pkt;
540: } TW_OSLI_IOCTL_NO_DATA_BUF;
541:
542: #pragma pack()
543:
544: #define TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH \
545: _IOWR('T', 202, TW_OSLI_IOCTL_NO_DATA_BUF)
546:
547: #pragma pack(1)
548:
549: typedef struct tw_osli_ioctl_with_payload {
550: struct tw_cl_driver_packet driver_pkt;
551: TW_INT8 padding[488];
552: struct tw_cl_command_packet cmd_pkt;
553: union {
554: struct tw_cl_event_packet event_pkt;
555: struct tw_cl_lock_packet lock_pkt;
556: struct tw_cl_compatibility_packet compat_pkt;
557: TW_INT8 data_buf[1];
558: } payload;
559: } TW_OSLI_IOCTL_WITH_PAYLOAD;
560:
561: #pragma pack()
562:
563: #endif
564:
565: #define HPT_CTL_CODE(x) (x+0xFF00)
566: #define HPT_IOCTL_GET_CHANNEL_INFO HPT_CTL_CODE(3)
567: #define HPT_IOCTL_GET_CHANNEL_INFO_V2 HPT_CTL_CODE(53)
568: #define HPT_IOCTL_IDE_PASS_THROUGH HPT_CTL_CODE(24)
569:
570: #define HPT_READ 1
571: #define HPT_WRITE 2
572:
573: #define HPT_IOCTL_MAGIC 0xA1B2C3D4
574:
575: #define MAXDEV_PER_CHANNEL 2
576: #define PMPORT_PER_CHANNEL 15 /* max devices connected to this channel via pmport */
577:
578: #pragma pack(1)
579: typedef struct _HPT_CHANNEL_INFO {
580: unsigned int reserve1;
581: unsigned int reserve2;
582: unsigned int devices[MAXDEV_PER_CHANNEL];
583: } HPT_CHANNEL_INFO, *PHPT_CHANNEL_INFO;
584:
585: typedef struct _HPT_CHANNEL_INFO_V2 {
586: unsigned int reserve1;
587: unsigned int reserve2;
588: unsigned int devices[PMPORT_PER_CHANNEL];
589: } HPT_CHANNEL_INFO_V2, *PHPT_CHANNEL_INFO_V2;
590:
591: typedef struct _HPT_IOCTL_PARAM {
592: unsigned int magic; /* used to check if it's a valid ioctl packet */
593: unsigned int ctrl_code; /* operation control code */
594: void* in; /* input data buffer */
595: unsigned int in_size; /* size of input data buffer */
596: void* out; /* output data buffer */
597: unsigned int out_size; /* size of output data buffer */
598: void* returned_size; /* count of chars returned */
599: } HPT_IOCTL_PARAM, *PHPT_IOCTL_PARAM;
600: #define HPT_DO_IOCONTROL _IOW('H', 0, HPT_IOCTL_PARAM)
601:
602: typedef struct _HPT_PASS_THROUGH_HEADER {
603: unsigned int id; /* disk ID */
604: unsigned char feature;
605: unsigned char sectorcount;
606: unsigned char lbalow;
607: unsigned char lbamid;
608: unsigned char lbahigh;
609: unsigned char driverhead;
610: unsigned char command;
611: unsigned char sectors; /* data size in sectors, if the command has data transfer */
612: unsigned char protocol; /* HPT_(READ,WRITE) or zero for non-DATA */
613: unsigned char reserve[3];
614: }
615: HPT_PASS_THROUGH_HEADER, *PHPT_PASS_THROUGH_HEADER;
616: #pragma pack()
617:
618: #ifndef __unused
619: #define __unused __attribute__ ((__unused__))
620: #endif
621:
622: #endif /* OS_FREEBSD_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>