1*0a6a1f1dSLionel Sambuc /* $NetBSD: disklabel.h,v 1.118 2015/01/02 19:42:07 christos Exp $ */ 27f2d47d8SEvgeniy Ivanov 37f2d47d8SEvgeniy Ivanov /* 47f2d47d8SEvgeniy Ivanov * Copyright (c) 1987, 1988, 1993 57f2d47d8SEvgeniy Ivanov * The Regents of the University of California. All rights reserved. 67f2d47d8SEvgeniy Ivanov * 77f2d47d8SEvgeniy Ivanov * Redistribution and use in source and binary forms, with or without 87f2d47d8SEvgeniy Ivanov * modification, are permitted provided that the following conditions 97f2d47d8SEvgeniy Ivanov * are met: 107f2d47d8SEvgeniy Ivanov * 1. Redistributions of source code must retain the above copyright 117f2d47d8SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer. 127f2d47d8SEvgeniy Ivanov * 2. Redistributions in binary form must reproduce the above copyright 137f2d47d8SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer in the 147f2d47d8SEvgeniy Ivanov * documentation and/or other materials provided with the distribution. 157f2d47d8SEvgeniy Ivanov * 3. Neither the name of the University nor the names of its contributors 167f2d47d8SEvgeniy Ivanov * may be used to endorse or promote products derived from this software 177f2d47d8SEvgeniy Ivanov * without specific prior written permission. 187f2d47d8SEvgeniy Ivanov * 197f2d47d8SEvgeniy Ivanov * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 207f2d47d8SEvgeniy Ivanov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 217f2d47d8SEvgeniy Ivanov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 227f2d47d8SEvgeniy Ivanov * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 237f2d47d8SEvgeniy Ivanov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 247f2d47d8SEvgeniy Ivanov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 257f2d47d8SEvgeniy Ivanov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 267f2d47d8SEvgeniy Ivanov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 277f2d47d8SEvgeniy Ivanov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 287f2d47d8SEvgeniy Ivanov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 297f2d47d8SEvgeniy Ivanov * SUCH DAMAGE. 307f2d47d8SEvgeniy Ivanov * 317f2d47d8SEvgeniy Ivanov * @(#)disklabel.h 8.2 (Berkeley) 7/10/94 327f2d47d8SEvgeniy Ivanov */ 337f2d47d8SEvgeniy Ivanov 347f2d47d8SEvgeniy Ivanov #ifndef _SYS_DISKLABEL_H_ 357f2d47d8SEvgeniy Ivanov #define _SYS_DISKLABEL_H_ 367f2d47d8SEvgeniy Ivanov 377f2d47d8SEvgeniy Ivanov /* 387f2d47d8SEvgeniy Ivanov * We need <machine/types.h> for __HAVE_OLD_DISKLABEL 397f2d47d8SEvgeniy Ivanov */ 407f2d47d8SEvgeniy Ivanov #ifndef _LOCORE 417f2d47d8SEvgeniy Ivanov #include <sys/types.h> 427f2d47d8SEvgeniy Ivanov #endif 437f2d47d8SEvgeniy Ivanov 447f2d47d8SEvgeniy Ivanov /* 457f2d47d8SEvgeniy Ivanov * Each disk has a label which includes information about the hardware 467f2d47d8SEvgeniy Ivanov * disk geometry, filesystem partitions, and drive specific information. 477f2d47d8SEvgeniy Ivanov * The location of the label, as well as the number of partitions the 487f2d47d8SEvgeniy Ivanov * label can describe and the number of the "whole disk" (raw) 4984d9c625SLionel Sambuc * partition are machine dependent. 507f2d47d8SEvgeniy Ivanov */ 517f2d47d8SEvgeniy Ivanov #if HAVE_NBTOOL_CONFIG_H 5284d9c625SLionel Sambuc #undef MAXPARTITIONS 5384d9c625SLionel Sambuc #define MAXPARTITIONS MAXMAXPARTITIONS 547f2d47d8SEvgeniy Ivanov #else 557f2d47d8SEvgeniy Ivanov #include <machine/disklabel.h> 567f2d47d8SEvgeniy Ivanov #endif /* HAVE_NBTOOL_CONFIG_H */ 577f2d47d8SEvgeniy Ivanov 587f2d47d8SEvgeniy Ivanov /* 597f2d47d8SEvgeniy Ivanov * The absolute maximum number of disk partitions allowed. 607f2d47d8SEvgeniy Ivanov * This is the maximum value of MAXPARTITIONS for which 'struct disklabel' 617f2d47d8SEvgeniy Ivanov * is <= DEV_BSIZE bytes long. If MAXPARTITIONS is greater than this, beware. 627f2d47d8SEvgeniy Ivanov */ 637f2d47d8SEvgeniy Ivanov #define MAXMAXPARTITIONS 22 647f2d47d8SEvgeniy Ivanov #if MAXPARTITIONS > MAXMAXPARTITIONS 657f2d47d8SEvgeniy Ivanov #warning beware: MAXPARTITIONS bigger than MAXMAXPARTITIONS 667f2d47d8SEvgeniy Ivanov #endif 677f2d47d8SEvgeniy Ivanov 687f2d47d8SEvgeniy Ivanov /* 697f2d47d8SEvgeniy Ivanov * Ports can switch their MAXPARTITIONS once, as follows: 707f2d47d8SEvgeniy Ivanov * 717f2d47d8SEvgeniy Ivanov * - define OLDMAXPARTITIONS in <machine/disklabel.h> as the old number 727f2d47d8SEvgeniy Ivanov * - define MAXPARTITIONS as the new number 737f2d47d8SEvgeniy Ivanov * - define DISKUNIT, DISKPART and DISKMINOR macros in <machine/disklabel.h> 747f2d47d8SEvgeniy Ivanov * as appropriate for the port (see the i386 one for an example). 757f2d47d8SEvgeniy Ivanov * - define __HAVE_OLD_DISKLABEL in <machine/types.h> 767f2d47d8SEvgeniy Ivanov */ 777f2d47d8SEvgeniy Ivanov 787f2d47d8SEvgeniy Ivanov #if defined(_KERNEL) && defined(__HAVE_OLD_DISKLABEL) && \ 797f2d47d8SEvgeniy Ivanov (MAXPARTITIONS < OLDMAXPARTITIONS) 807f2d47d8SEvgeniy Ivanov #error "can only grow disklabel size" 817f2d47d8SEvgeniy Ivanov #endif 827f2d47d8SEvgeniy Ivanov 837f2d47d8SEvgeniy Ivanov 847f2d47d8SEvgeniy Ivanov /* 857f2d47d8SEvgeniy Ivanov * Translate between device numbers and major/disk unit/disk partition. 867f2d47d8SEvgeniy Ivanov */ 877f2d47d8SEvgeniy Ivanov #ifndef __HAVE_OLD_DISKLABEL 887f2d47d8SEvgeniy Ivanov #if !HAVE_NBTOOL_CONFIG_H 897f2d47d8SEvgeniy Ivanov #define DISKUNIT(dev) (minor(dev) / MAXPARTITIONS) 907f2d47d8SEvgeniy Ivanov #define DISKPART(dev) (minor(dev) % MAXPARTITIONS) 917f2d47d8SEvgeniy Ivanov #define DISKMINOR(unit, part) \ 927f2d47d8SEvgeniy Ivanov (((unit) * MAXPARTITIONS) + (part)) 937f2d47d8SEvgeniy Ivanov #endif /* !HAVE_NBTOOL_CONFIG_H */ 947f2d47d8SEvgeniy Ivanov #endif 957f2d47d8SEvgeniy Ivanov #define MAKEDISKDEV(maj, unit, part) \ 967f2d47d8SEvgeniy Ivanov (makedev((maj), DISKMINOR((unit), (part)))) 977f2d47d8SEvgeniy Ivanov 987f2d47d8SEvgeniy Ivanov #define DISKMAGIC ((uint32_t)0x82564557) /* The disk magic number */ 997f2d47d8SEvgeniy Ivanov 1007f2d47d8SEvgeniy Ivanov #ifndef _LOCORE 101*0a6a1f1dSLionel Sambuc struct partition { /* the partition table */ 102*0a6a1f1dSLionel Sambuc uint32_t p_size; /* number of sectors in partition */ 103*0a6a1f1dSLionel Sambuc uint32_t p_offset; /* starting sector */ 104*0a6a1f1dSLionel Sambuc union { 105*0a6a1f1dSLionel Sambuc uint32_t fsize; /* FFS, ADOS: filesystem basic fragment size */ 106*0a6a1f1dSLionel Sambuc uint32_t cdsession; /* ISO9660: session offset */ 107*0a6a1f1dSLionel Sambuc } __partition_u2; 108*0a6a1f1dSLionel Sambuc #define p_fsize __partition_u2.fsize 109*0a6a1f1dSLionel Sambuc #define p_cdsession __partition_u2.cdsession 110*0a6a1f1dSLionel Sambuc uint8_t p_fstype; /* filesystem type, see below */ 111*0a6a1f1dSLionel Sambuc uint8_t p_frag; /* filesystem fragments per block */ 112*0a6a1f1dSLionel Sambuc union { 113*0a6a1f1dSLionel Sambuc uint16_t cpg; /* UFS: FS cylinders per group */ 114*0a6a1f1dSLionel Sambuc uint16_t sgs; /* LFS: FS segment shift */ 115*0a6a1f1dSLionel Sambuc } __partition_u1; 116*0a6a1f1dSLionel Sambuc #define p_cpg __partition_u1.cpg 117*0a6a1f1dSLionel Sambuc #define p_sgs __partition_u1.sgs 118*0a6a1f1dSLionel Sambuc }; 1197f2d47d8SEvgeniy Ivanov struct disklabel { 1207f2d47d8SEvgeniy Ivanov uint32_t d_magic; /* the magic number */ 1217f2d47d8SEvgeniy Ivanov uint16_t d_type; /* drive type */ 1227f2d47d8SEvgeniy Ivanov uint16_t d_subtype; /* controller/d_type specific */ 1237f2d47d8SEvgeniy Ivanov char d_typename[16]; /* type name, e.g. "eagle" */ 1247f2d47d8SEvgeniy Ivanov 1257f2d47d8SEvgeniy Ivanov /* 1267f2d47d8SEvgeniy Ivanov * d_packname contains the pack identifier and is returned when 1277f2d47d8SEvgeniy Ivanov * the disklabel is read off the disk or in-core copy. 1287f2d47d8SEvgeniy Ivanov * d_boot0 and d_boot1 are the (optional) names of the 1297f2d47d8SEvgeniy Ivanov * primary (block 0) and secondary (block 1-15) bootstraps 1307f2d47d8SEvgeniy Ivanov * as found in /usr/mdec. These are returned when using 1317f2d47d8SEvgeniy Ivanov * getdiskbyname(3) to retrieve the values from /etc/disktab. 1327f2d47d8SEvgeniy Ivanov */ 1337f2d47d8SEvgeniy Ivanov union { 1347f2d47d8SEvgeniy Ivanov char un_d_packname[16]; /* pack identifier */ 1357f2d47d8SEvgeniy Ivanov struct { 1367f2d47d8SEvgeniy Ivanov char *un_d_boot0; /* primary bootstrap name */ 1377f2d47d8SEvgeniy Ivanov char *un_d_boot1; /* secondary bootstrap name */ 1387f2d47d8SEvgeniy Ivanov } un_b; 1397f2d47d8SEvgeniy Ivanov uint64_t un_d_pad; /* force 8 byte alignment */ 1407f2d47d8SEvgeniy Ivanov } d_un; 1417f2d47d8SEvgeniy Ivanov #define d_packname d_un.un_d_packname 1427f2d47d8SEvgeniy Ivanov #define d_boot0 d_un.un_b.un_d_boot0 1437f2d47d8SEvgeniy Ivanov #define d_boot1 d_un.un_b.un_d_boot1 1447f2d47d8SEvgeniy Ivanov 1457f2d47d8SEvgeniy Ivanov /* disk geometry: */ 1467f2d47d8SEvgeniy Ivanov uint32_t d_secsize; /* # of bytes per sector */ 1477f2d47d8SEvgeniy Ivanov uint32_t d_nsectors; /* # of data sectors per track */ 1487f2d47d8SEvgeniy Ivanov uint32_t d_ntracks; /* # of tracks per cylinder */ 1497f2d47d8SEvgeniy Ivanov uint32_t d_ncylinders; /* # of data cylinders per unit */ 1507f2d47d8SEvgeniy Ivanov uint32_t d_secpercyl; /* # of data sectors per cylinder */ 1517f2d47d8SEvgeniy Ivanov uint32_t d_secperunit; /* # of data sectors per unit */ 1527f2d47d8SEvgeniy Ivanov 1537f2d47d8SEvgeniy Ivanov /* 1547f2d47d8SEvgeniy Ivanov * Spares (bad sector replacements) below are not counted in 1557f2d47d8SEvgeniy Ivanov * d_nsectors or d_secpercyl. Spare sectors are assumed to 1567f2d47d8SEvgeniy Ivanov * be physical sectors which occupy space at the end of each 1577f2d47d8SEvgeniy Ivanov * track and/or cylinder. 1587f2d47d8SEvgeniy Ivanov */ 1597f2d47d8SEvgeniy Ivanov uint16_t d_sparespertrack; /* # of spare sectors per track */ 1607f2d47d8SEvgeniy Ivanov uint16_t d_sparespercyl; /* # of spare sectors per cylinder */ 1617f2d47d8SEvgeniy Ivanov /* 1627f2d47d8SEvgeniy Ivanov * Alternative cylinders include maintenance, replacement, 1637f2d47d8SEvgeniy Ivanov * configuration description areas, etc. 1647f2d47d8SEvgeniy Ivanov */ 1657f2d47d8SEvgeniy Ivanov uint32_t d_acylinders; /* # of alt. cylinders per unit */ 1667f2d47d8SEvgeniy Ivanov 1677f2d47d8SEvgeniy Ivanov /* hardware characteristics: */ 1687f2d47d8SEvgeniy Ivanov /* 1697f2d47d8SEvgeniy Ivanov * d_interleave, d_trackskew and d_cylskew describe perturbations 1707f2d47d8SEvgeniy Ivanov * in the media format used to compensate for a slow controller. 1717f2d47d8SEvgeniy Ivanov * Interleave is physical sector interleave, set up by the 1727f2d47d8SEvgeniy Ivanov * formatter or controller when formatting. When interleaving is 1737f2d47d8SEvgeniy Ivanov * in use, logically adjacent sectors are not physically 1747f2d47d8SEvgeniy Ivanov * contiguous, but instead are separated by some number of 1757f2d47d8SEvgeniy Ivanov * sectors. It is specified as the ratio of physical sectors 1767f2d47d8SEvgeniy Ivanov * traversed per logical sector. Thus an interleave of 1:1 1777f2d47d8SEvgeniy Ivanov * implies contiguous layout, while 2:1 implies that logical 1787f2d47d8SEvgeniy Ivanov * sector 0 is separated by one sector from logical sector 1. 1797f2d47d8SEvgeniy Ivanov * d_trackskew is the offset of sector 0 on track N relative to 1807f2d47d8SEvgeniy Ivanov * sector 0 on track N-1 on the same cylinder. Finally, d_cylskew 1817f2d47d8SEvgeniy Ivanov * is the offset of sector 0 on cylinder N relative to sector 0 1827f2d47d8SEvgeniy Ivanov * on cylinder N-1. 1837f2d47d8SEvgeniy Ivanov */ 1847f2d47d8SEvgeniy Ivanov uint16_t d_rpm; /* rotational speed */ 1857f2d47d8SEvgeniy Ivanov uint16_t d_interleave; /* hardware sector interleave */ 1867f2d47d8SEvgeniy Ivanov uint16_t d_trackskew; /* sector 0 skew, per track */ 1877f2d47d8SEvgeniy Ivanov uint16_t d_cylskew; /* sector 0 skew, per cylinder */ 1887f2d47d8SEvgeniy Ivanov uint32_t d_headswitch; /* head switch time, usec */ 1897f2d47d8SEvgeniy Ivanov uint32_t d_trkseek; /* track-to-track seek, usec */ 1907f2d47d8SEvgeniy Ivanov uint32_t d_flags; /* generic flags */ 1917f2d47d8SEvgeniy Ivanov #define NDDATA 5 1927f2d47d8SEvgeniy Ivanov uint32_t d_drivedata[NDDATA]; /* drive-type specific information */ 1937f2d47d8SEvgeniy Ivanov #define NSPARE 5 1947f2d47d8SEvgeniy Ivanov uint32_t d_spare[NSPARE]; /* reserved for future use */ 1957f2d47d8SEvgeniy Ivanov uint32_t d_magic2; /* the magic number (again) */ 1967f2d47d8SEvgeniy Ivanov uint16_t d_checksum; /* xor of data incl. partitions */ 1977f2d47d8SEvgeniy Ivanov 1987f2d47d8SEvgeniy Ivanov /* filesystem and partition information: */ 1997f2d47d8SEvgeniy Ivanov uint16_t d_npartitions; /* number of partitions in following */ 2007f2d47d8SEvgeniy Ivanov uint32_t d_bbsize; /* size of boot area at sn0, bytes */ 2017f2d47d8SEvgeniy Ivanov uint32_t d_sbsize; /* max size of fs superblock, bytes */ 202*0a6a1f1dSLionel Sambuc struct partition d_partitions[MAXPARTITIONS]; 203*0a6a1f1dSLionel Sambuc /* the partition table, actually may be more */ 2047f2d47d8SEvgeniy Ivanov }; 2057f2d47d8SEvgeniy Ivanov 2067f2d47d8SEvgeniy Ivanov #if defined(__HAVE_OLD_DISKLABEL) && !HAVE_NBTOOL_CONFIG_H 2077f2d47d8SEvgeniy Ivanov /* 2087f2d47d8SEvgeniy Ivanov * Same as above, but with OLDMAXPARTITIONS partitions. For use in 2097f2d47d8SEvgeniy Ivanov * the old DIOC* ioctl calls. 2107f2d47d8SEvgeniy Ivanov */ 2117f2d47d8SEvgeniy Ivanov struct olddisklabel { 2127f2d47d8SEvgeniy Ivanov uint32_t d_magic; 2137f2d47d8SEvgeniy Ivanov uint16_t d_type; 2147f2d47d8SEvgeniy Ivanov uint16_t d_subtype; 2157f2d47d8SEvgeniy Ivanov char d_typename[16]; 2167f2d47d8SEvgeniy Ivanov union { 2177f2d47d8SEvgeniy Ivanov char un_d_packname[16]; 2187f2d47d8SEvgeniy Ivanov struct { 2197f2d47d8SEvgeniy Ivanov char *un_d_boot0; 2207f2d47d8SEvgeniy Ivanov char *un_d_boot1; 2217f2d47d8SEvgeniy Ivanov } un_b; 2227f2d47d8SEvgeniy Ivanov } d_un; 2237f2d47d8SEvgeniy Ivanov uint32_t d_secsize; 2247f2d47d8SEvgeniy Ivanov uint32_t d_nsectors; 2257f2d47d8SEvgeniy Ivanov uint32_t d_ntracks; 2267f2d47d8SEvgeniy Ivanov uint32_t d_ncylinders; 2277f2d47d8SEvgeniy Ivanov uint32_t d_secpercyl; 2287f2d47d8SEvgeniy Ivanov uint32_t d_secperunit; 2297f2d47d8SEvgeniy Ivanov uint16_t d_sparespertrack; 2307f2d47d8SEvgeniy Ivanov uint16_t d_sparespercyl; 2317f2d47d8SEvgeniy Ivanov uint32_t d_acylinders; 2327f2d47d8SEvgeniy Ivanov uint16_t d_rpm; 2337f2d47d8SEvgeniy Ivanov uint16_t d_interleave; 2347f2d47d8SEvgeniy Ivanov uint16_t d_trackskew; 2357f2d47d8SEvgeniy Ivanov uint16_t d_cylskew; 2367f2d47d8SEvgeniy Ivanov uint32_t d_headswitch; 2377f2d47d8SEvgeniy Ivanov uint32_t d_trkseek; 2387f2d47d8SEvgeniy Ivanov uint32_t d_flags; 2397f2d47d8SEvgeniy Ivanov uint32_t d_drivedata[NDDATA]; 2407f2d47d8SEvgeniy Ivanov uint32_t d_spare[NSPARE]; 2417f2d47d8SEvgeniy Ivanov uint32_t d_magic2; 2427f2d47d8SEvgeniy Ivanov uint16_t d_checksum; 2437f2d47d8SEvgeniy Ivanov uint16_t d_npartitions; 2447f2d47d8SEvgeniy Ivanov uint32_t d_bbsize; 2457f2d47d8SEvgeniy Ivanov uint32_t d_sbsize; 2467f2d47d8SEvgeniy Ivanov struct opartition { 2477f2d47d8SEvgeniy Ivanov uint32_t p_size; 2487f2d47d8SEvgeniy Ivanov uint32_t p_offset; 2497f2d47d8SEvgeniy Ivanov union { 2507f2d47d8SEvgeniy Ivanov uint32_t fsize; 2517f2d47d8SEvgeniy Ivanov uint32_t cdsession; 2527f2d47d8SEvgeniy Ivanov } __partition_u2; 2537f2d47d8SEvgeniy Ivanov uint8_t p_fstype; 2547f2d47d8SEvgeniy Ivanov uint8_t p_frag; 2557f2d47d8SEvgeniy Ivanov union { 2567f2d47d8SEvgeniy Ivanov uint16_t cpg; 2577f2d47d8SEvgeniy Ivanov uint16_t sgs; 2587f2d47d8SEvgeniy Ivanov } __partition_u1; 2597f2d47d8SEvgeniy Ivanov } d_partitions[OLDMAXPARTITIONS]; 2607f2d47d8SEvgeniy Ivanov }; 2617f2d47d8SEvgeniy Ivanov #endif /* __HAVE_OLD_DISKLABEL */ 2627f2d47d8SEvgeniy Ivanov #else /* _LOCORE */ 2637f2d47d8SEvgeniy Ivanov /* 2647f2d47d8SEvgeniy Ivanov * offsets for asm boot files. 2657f2d47d8SEvgeniy Ivanov */ 2667f2d47d8SEvgeniy Ivanov .set d_secsize,40 2677f2d47d8SEvgeniy Ivanov .set d_nsectors,44 2687f2d47d8SEvgeniy Ivanov .set d_ntracks,48 2697f2d47d8SEvgeniy Ivanov .set d_ncylinders,52 2707f2d47d8SEvgeniy Ivanov .set d_secpercyl,56 2717f2d47d8SEvgeniy Ivanov .set d_secperunit,60 27284d9c625SLionel Sambuc .set d_end_,148+(MAXPARTITIONS*16) 2737f2d47d8SEvgeniy Ivanov #endif /* _LOCORE */ 2747f2d47d8SEvgeniy Ivanov 2757f2d47d8SEvgeniy Ivanov /* 2767f2d47d8SEvgeniy Ivanov * We normally use C99 initialisers (just in case the lists below are out 2777f2d47d8SEvgeniy Ivanov * of sequence, or have gaps), but lint doesn't grok them. 2787f2d47d8SEvgeniy Ivanov * Maybe some host compilers don't either, but many have for quite some time. 2797f2d47d8SEvgeniy Ivanov */ 2807f2d47d8SEvgeniy Ivanov 2817f2d47d8SEvgeniy Ivanov #ifndef lint 2827f2d47d8SEvgeniy Ivanov #define ARRAY_INIT(element,value) [element]=value 2837f2d47d8SEvgeniy Ivanov #else 2847f2d47d8SEvgeniy Ivanov #define ARRAY_INIT(element,value) value 2857f2d47d8SEvgeniy Ivanov #endif 2867f2d47d8SEvgeniy Ivanov 2877f2d47d8SEvgeniy Ivanov /* Use pre-processor magic to get all the parameters one one line... */ 2887f2d47d8SEvgeniy Ivanov 2897f2d47d8SEvgeniy Ivanov /* d_type values: */ 2907f2d47d8SEvgeniy Ivanov #define DKTYPE_DEFN(x) \ 2917f2d47d8SEvgeniy Ivanov x(UNKNOWN, 0, "unknown") \ 2927f2d47d8SEvgeniy Ivanov x(SMD, 1, "SMD") /* SMD, XSMD; VAX hp/up */ \ 2937f2d47d8SEvgeniy Ivanov x(MSCP, 2, "MSCP") /* MSCP */ \ 2947f2d47d8SEvgeniy Ivanov x(DEC, 3, "old DEC") /* other DEC (rk, rl) */ \ 2957f2d47d8SEvgeniy Ivanov x(SCSI, 4, "SCSI") /* SCSI */ \ 2967f2d47d8SEvgeniy Ivanov x(ESDI, 5, "ESDI") /* ESDI interface */ \ 2977f2d47d8SEvgeniy Ivanov x(ST506, 6, "ST506") /* ST506 etc. */ \ 2987f2d47d8SEvgeniy Ivanov x(HPIB, 7, "HP-IB") /* CS/80 on HP-IB */ \ 2997f2d47d8SEvgeniy Ivanov x(HPFL, 8, "HP-FL") /* HP Fiber-link */ \ 3007f2d47d8SEvgeniy Ivanov x(TYPE_9, 9, "type 9") \ 3017f2d47d8SEvgeniy Ivanov x(FLOPPY, 10, "floppy") /* floppy */ \ 3027f2d47d8SEvgeniy Ivanov x(CCD, 11, "ccd") /* concatenated disk device */ \ 3037f2d47d8SEvgeniy Ivanov x(VND, 12, "vnd") /* uvnode pseudo-disk */ \ 3047f2d47d8SEvgeniy Ivanov x(ATAPI, 13, "ATAPI") /* ATAPI */ \ 3057f2d47d8SEvgeniy Ivanov x(RAID, 14, "RAID") /* RAIDframe */ \ 3067f2d47d8SEvgeniy Ivanov x(LD, 15, "ld") /* logical disk */ \ 3077f2d47d8SEvgeniy Ivanov x(JFS2, 16, "jfs") /* IBM JFS2 */ \ 3087f2d47d8SEvgeniy Ivanov x(CGD, 17, "cgd") /* cryptographic pseudo-disk */ \ 3097f2d47d8SEvgeniy Ivanov x(VINUM, 18, "vinum") /* vinum volume */ \ 3107f2d47d8SEvgeniy Ivanov x(FLASH, 19, "flash") /* flash memory devices */ \ 3117f2d47d8SEvgeniy Ivanov x(DM, 20, "dm") /* device-mapper pseudo-disk devices */\ 3127f2d47d8SEvgeniy Ivanov x(RUMPD, 21, "rumpd") /* rump virtual disk */ \ 313*0a6a1f1dSLionel Sambuc x(MD, 22, "md") /* memory disk */ \ 3147f2d47d8SEvgeniy Ivanov 3157f2d47d8SEvgeniy Ivanov #ifndef _LOCORE 316*0a6a1f1dSLionel Sambuc #define DKTYPE_NUMS(tag, number, name) __CONCAT(DKTYPE_,tag=number), 3177f2d47d8SEvgeniy Ivanov #ifndef DKTYPE_ENUMNAME 3187f2d47d8SEvgeniy Ivanov #define DKTYPE_ENUMNAME 3197f2d47d8SEvgeniy Ivanov #endif 3207f2d47d8SEvgeniy Ivanov enum DKTYPE_ENUMNAME { DKTYPE_DEFN(DKTYPE_NUMS) DKMAXTYPES }; 3217f2d47d8SEvgeniy Ivanov #undef DKTYPE_NUMS 3227f2d47d8SEvgeniy Ivanov #endif 3237f2d47d8SEvgeniy Ivanov 3247f2d47d8SEvgeniy Ivanov #ifdef DKTYPENAMES 3257f2d47d8SEvgeniy Ivanov #define DKTYPE_NAMES(tag, number, name) ARRAY_INIT(number,name), 3267f2d47d8SEvgeniy Ivanov static const char *const dktypenames[] = { DKTYPE_DEFN(DKTYPE_NAMES) NULL }; 3277f2d47d8SEvgeniy Ivanov #undef DKTYPE_NAMES 3287f2d47d8SEvgeniy Ivanov #endif 3297f2d47d8SEvgeniy Ivanov 3307f2d47d8SEvgeniy Ivanov /* 3317f2d47d8SEvgeniy Ivanov * Partition type names, numbers, label-names, fsck prog, and mount prog 3327f2d47d8SEvgeniy Ivanov */ 3337f2d47d8SEvgeniy Ivanov #define FSTYPE_DEFN(x) \ 3347f2d47d8SEvgeniy Ivanov x(UNUSED, 0, "unused", NULL, NULL) /* unused */ \ 3357f2d47d8SEvgeniy Ivanov x(SWAP, 1, "swap", NULL, NULL) /* swap */ \ 3367f2d47d8SEvgeniy Ivanov x(V6, 2, "Version 6", NULL, NULL) /* Sixth Edition */ \ 3377f2d47d8SEvgeniy Ivanov x(V7, 3, "Version 7", "v7fs", "v7fs") /* Seventh Edition */ \ 3387f2d47d8SEvgeniy Ivanov x(SYSV, 4, "System V", NULL, NULL) /* System V */ \ 3397f2d47d8SEvgeniy Ivanov x(V71K, 5, "4.1BSD", NULL, NULL) /* V7, 1K blocks (4.1, 2.9) */ \ 3407f2d47d8SEvgeniy Ivanov x(V8, 6, "Eighth Edition",NULL, NULL) /* Eighth Edition, 4K blocks */ \ 3417f2d47d8SEvgeniy Ivanov x(BSDFFS, 7, "4.2BSD", "ffs", "ffs") /* 4.2BSD fast file system */ \ 3427f2d47d8SEvgeniy Ivanov x(MSDOS, 8, "MSDOS", "msdos", "msdos") /* MSDOS file system */ \ 3437f2d47d8SEvgeniy Ivanov x(BSDLFS, 9, "4.4LFS", "lfs", "lfs") /* 4.4BSD log-structured FS */ \ 3447f2d47d8SEvgeniy Ivanov x(OTHER, 10, "unknown", NULL, NULL) /* in use, unknown/unsupported */\ 3457f2d47d8SEvgeniy Ivanov x(HPFS, 11, "HPFS", NULL, NULL) /* OS/2 high-performance FS */ \ 3467f2d47d8SEvgeniy Ivanov x(ISO9660, 12, "ISO9660", NULL, "cd9660")/* ISO 9660, normally CD-ROM */ \ 3477f2d47d8SEvgeniy Ivanov x(BOOT, 13, "boot", NULL, NULL) /* bootstrap code in partition */\ 3487f2d47d8SEvgeniy Ivanov x(ADOS, 14, "ADOS", NULL, "ados") /* AmigaDOS fast file system */ \ 3497f2d47d8SEvgeniy Ivanov x(HFS, 15, "HFS", NULL, NULL) /* Macintosh HFS */ \ 3507f2d47d8SEvgeniy Ivanov x(FILECORE,16, "FILECORE", NULL, "filecore")/* Acorn Filecore FS */ \ 3517f2d47d8SEvgeniy Ivanov x(EX2FS, 17, "Linux Ext2","ext2fs","ext2fs")/* Linux Extended 2 FS */ \ 3527f2d47d8SEvgeniy Ivanov x(NTFS, 18, "NTFS", NULL, "ntfs") /* Windows/NT file system */ \ 3537f2d47d8SEvgeniy Ivanov x(RAID, 19, "RAID", NULL, NULL) /* RAIDframe component */ \ 3547f2d47d8SEvgeniy Ivanov x(CCD, 20, "ccd", NULL, NULL) /* concatenated disk component */\ 3557f2d47d8SEvgeniy Ivanov x(JFS2, 21, "jfs", NULL, NULL) /* IBM JFS2 */ \ 3567f2d47d8SEvgeniy Ivanov x(APPLEUFS,22, "Apple UFS", "ffs", "ffs") /* Apple UFS */ \ 3577f2d47d8SEvgeniy Ivanov /* XXX this is not the same as FreeBSD. How to solve? */ \ 3587f2d47d8SEvgeniy Ivanov x(VINUM, 23, "vinum", NULL, NULL) /* Vinum */ \ 3597f2d47d8SEvgeniy Ivanov x(UDF, 24, "UDF", NULL, "udf") /* UDF */ \ 3607f2d47d8SEvgeniy Ivanov x(SYSVBFS, 25, "SysVBFS", NULL, "sysvbfs")/* System V boot file system */ \ 3617f2d47d8SEvgeniy Ivanov x(EFS, 26, "EFS", NULL, "efs") /* SGI's Extent Filesystem */ \ 3627f2d47d8SEvgeniy Ivanov x(NILFS, 27, "NiLFS", NULL, "nilfs") /* NTT's NiLFS(2) */ \ 3637f2d47d8SEvgeniy Ivanov x(CGD, 28, "cgd", NULL, NULL) /* Cryptographic disk */ \ 3647f2d47d8SEvgeniy Ivanov x(MINIXFS3,29, "MINIX FSv3", NULL, NULL) /* MINIX file system v3 */ 3657f2d47d8SEvgeniy Ivanov 3667f2d47d8SEvgeniy Ivanov 3677f2d47d8SEvgeniy Ivanov #ifndef _LOCORE 3687f2d47d8SEvgeniy Ivanov #define FS_TYPENUMS(tag, number, name, fsck, mount) __CONCAT(FS_,tag=number), 3697f2d47d8SEvgeniy Ivanov #ifndef FSTYPE_ENUMNAME 3707f2d47d8SEvgeniy Ivanov #define FSTYPE_ENUMNAME 3717f2d47d8SEvgeniy Ivanov #endif 3727f2d47d8SEvgeniy Ivanov enum FSTYPE_ENUMNAME { FSTYPE_DEFN(FS_TYPENUMS) FSMAXTYPES }; 3737f2d47d8SEvgeniy Ivanov #undef FS_TYPENUMS 3747f2d47d8SEvgeniy Ivanov #endif 3757f2d47d8SEvgeniy Ivanov 3767f2d47d8SEvgeniy Ivanov #ifdef FSTYPENAMES 3777f2d47d8SEvgeniy Ivanov #define FS_TYPENAMES(tag, number, name, fsck, mount) ARRAY_INIT(number,name), 3787f2d47d8SEvgeniy Ivanov static const char *const fstypenames[] = { FSTYPE_DEFN(FS_TYPENAMES) NULL }; 3797f2d47d8SEvgeniy Ivanov #undef FS_TYPENAMES 3807f2d47d8SEvgeniy Ivanov #endif 3817f2d47d8SEvgeniy Ivanov 3827f2d47d8SEvgeniy Ivanov #ifdef FSCKNAMES 3837f2d47d8SEvgeniy Ivanov /* These are the names MOUNT_XXX from <sys/mount.h> */ 3847f2d47d8SEvgeniy Ivanov #define FS_FSCKNAMES(tag, number, name, fsck, mount) ARRAY_INIT(number,fsck), 3857f2d47d8SEvgeniy Ivanov static const char *const fscknames[] = { FSTYPE_DEFN(FS_FSCKNAMES) NULL }; 3867f2d47d8SEvgeniy Ivanov #undef FS_FSCKNAMES 3877f2d47d8SEvgeniy Ivanov #define FSMAXNAMES FSMAXTYPES 3887f2d47d8SEvgeniy Ivanov #endif 3897f2d47d8SEvgeniy Ivanov 3907f2d47d8SEvgeniy Ivanov #ifdef MOUNTNAMES 3917f2d47d8SEvgeniy Ivanov /* These are the names MOUNT_XXX from <sys/mount.h> */ 3927f2d47d8SEvgeniy Ivanov #define FS_MOUNTNAMES(tag, number, name, fsck, mount) ARRAY_INIT(number,mount), 3937f2d47d8SEvgeniy Ivanov static const char *const mountnames[] = { FSTYPE_DEFN(FS_MOUNTNAMES) NULL }; 3947f2d47d8SEvgeniy Ivanov #undef FS_MOUNTNAMES 3957f2d47d8SEvgeniy Ivanov #define FSMAXMOUNTNAMES FSMAXTYPES 3967f2d47d8SEvgeniy Ivanov #endif 3977f2d47d8SEvgeniy Ivanov 3987f2d47d8SEvgeniy Ivanov /* 3997f2d47d8SEvgeniy Ivanov * flags shared by various drives: 4007f2d47d8SEvgeniy Ivanov */ 4017f2d47d8SEvgeniy Ivanov #define D_REMOVABLE 0x01 /* removable media */ 4027f2d47d8SEvgeniy Ivanov #define D_ECC 0x02 /* supports ECC */ 4037f2d47d8SEvgeniy Ivanov #define D_BADSECT 0x04 /* supports bad sector forw. */ 4047f2d47d8SEvgeniy Ivanov #define D_RAMDISK 0x08 /* disk emulator */ 4057f2d47d8SEvgeniy Ivanov #define D_CHAIN 0x10 /* can do back-back transfers */ 4067f2d47d8SEvgeniy Ivanov #define D_SCSI_MMC 0x20 /* SCSI MMC sessioned media */ 4077f2d47d8SEvgeniy Ivanov 4087f2d47d8SEvgeniy Ivanov /* 4097f2d47d8SEvgeniy Ivanov * Drive data for SMD. 4107f2d47d8SEvgeniy Ivanov */ 4117f2d47d8SEvgeniy Ivanov #define d_smdflags d_drivedata[0] 4127f2d47d8SEvgeniy Ivanov #define D_SSE 0x1 /* supports skip sectoring */ 4137f2d47d8SEvgeniy Ivanov #define d_mindist d_drivedata[1] 4147f2d47d8SEvgeniy Ivanov #define d_maxdist d_drivedata[2] 4157f2d47d8SEvgeniy Ivanov #define d_sdist d_drivedata[3] 4167f2d47d8SEvgeniy Ivanov 4177f2d47d8SEvgeniy Ivanov /* 4187f2d47d8SEvgeniy Ivanov * Drive data for ST506. 4197f2d47d8SEvgeniy Ivanov */ 4207f2d47d8SEvgeniy Ivanov #define d_precompcyl d_drivedata[0] 4217f2d47d8SEvgeniy Ivanov #define d_gap3 d_drivedata[1] /* used only when formatting */ 4227f2d47d8SEvgeniy Ivanov 4237f2d47d8SEvgeniy Ivanov /* 4247f2d47d8SEvgeniy Ivanov * Drive data for SCSI. 4257f2d47d8SEvgeniy Ivanov */ 4267f2d47d8SEvgeniy Ivanov #define d_blind d_drivedata[0] 4277f2d47d8SEvgeniy Ivanov 4287f2d47d8SEvgeniy Ivanov #ifndef _LOCORE 4297f2d47d8SEvgeniy Ivanov /* 4307f2d47d8SEvgeniy Ivanov * Structure used to perform a format or other raw operation, 4317f2d47d8SEvgeniy Ivanov * returning data and/or register values. Register identification 4327f2d47d8SEvgeniy Ivanov * and format are device- and driver-dependent. Currently unused. 4337f2d47d8SEvgeniy Ivanov */ 4347f2d47d8SEvgeniy Ivanov struct format_op { 4357f2d47d8SEvgeniy Ivanov char *df_buf; 4367f2d47d8SEvgeniy Ivanov int df_count; /* value-result */ 4377f2d47d8SEvgeniy Ivanov daddr_t df_startblk; 4387f2d47d8SEvgeniy Ivanov int df_reg[8]; /* result */ 4397f2d47d8SEvgeniy Ivanov }; 4407f2d47d8SEvgeniy Ivanov 4417f2d47d8SEvgeniy Ivanov #ifdef _KERNEL 4427f2d47d8SEvgeniy Ivanov /* 4437f2d47d8SEvgeniy Ivanov * Structure used internally to retrieve information about a partition 4447f2d47d8SEvgeniy Ivanov * on a disk. 4457f2d47d8SEvgeniy Ivanov */ 4467f2d47d8SEvgeniy Ivanov struct partinfo { 4477f2d47d8SEvgeniy Ivanov struct disklabel *disklab; 4487f2d47d8SEvgeniy Ivanov struct partition *part; 4497f2d47d8SEvgeniy Ivanov }; 4507f2d47d8SEvgeniy Ivanov 4517f2d47d8SEvgeniy Ivanov struct disk; 4527f2d47d8SEvgeniy Ivanov 4537f2d47d8SEvgeniy Ivanov int disk_read_sectors(void (*)(struct buf *), const struct disklabel *, 4547f2d47d8SEvgeniy Ivanov struct buf *, unsigned int, int); 4557f2d47d8SEvgeniy Ivanov void diskerr(const struct buf *, const char *, const char *, int, 4567f2d47d8SEvgeniy Ivanov int, const struct disklabel *); 4577f2d47d8SEvgeniy Ivanov u_int dkcksum(struct disklabel *); 4587f2d47d8SEvgeniy Ivanov u_int dkcksum_sized(struct disklabel *, size_t); 4597f2d47d8SEvgeniy Ivanov int setdisklabel(struct disklabel *, struct disklabel *, u_long, 4607f2d47d8SEvgeniy Ivanov struct cpu_disklabel *); 4617f2d47d8SEvgeniy Ivanov const char *readdisklabel(dev_t, void (*)(struct buf *), 4627f2d47d8SEvgeniy Ivanov struct disklabel *, struct cpu_disklabel *); 4637f2d47d8SEvgeniy Ivanov int writedisklabel(dev_t, void (*)(struct buf *), struct disklabel *, 4647f2d47d8SEvgeniy Ivanov struct cpu_disklabel *); 4657f2d47d8SEvgeniy Ivanov const char *convertdisklabel(struct disklabel *, void (*)(struct buf *), 4667f2d47d8SEvgeniy Ivanov struct buf *, uint32_t); 4677f2d47d8SEvgeniy Ivanov int bounds_check_with_label(struct disk *, struct buf *, int); 4687f2d47d8SEvgeniy Ivanov int bounds_check_with_mediasize(struct buf *, int, uint64_t); 4697f2d47d8SEvgeniy Ivanov const char *getfstypename(int); 4707f2d47d8SEvgeniy Ivanov #endif 4717f2d47d8SEvgeniy Ivanov #endif /* _LOCORE */ 4727f2d47d8SEvgeniy Ivanov 4737f2d47d8SEvgeniy Ivanov #if !defined(_KERNEL) && !defined(_LOCORE) 4747f2d47d8SEvgeniy Ivanov 4757f2d47d8SEvgeniy Ivanov #include <sys/cdefs.h> 4767f2d47d8SEvgeniy Ivanov 4777f2d47d8SEvgeniy Ivanov #endif 4787f2d47d8SEvgeniy Ivanov 4797f2d47d8SEvgeniy Ivanov #endif /* !_SYS_DISKLABEL_H_ */ 480