0,0 → 1,300 |
/*- |
* Copyright (c) 1987, 1988, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)disklabel.h 8.2 (Berkeley) 7/10/94 |
* $FreeBSD: src/sys/sys/disklabel.h,v 1.107 2005/04/07 22:09:02 cognet Exp $ |
*/ |
|
#ifndef _SYS_DISKLABEL_H_ |
#define _SYS_DISKLABEL_H_ |
|
#ifndef _KERNEL |
#include <sys/types.h> |
#endif |
#include <sys/ioccom.h> |
|
/* |
* Disk description table, see disktab(5) |
*/ |
#define _PATH_DISKTAB "/etc/disktab" |
|
/* |
* Each disk has a label which includes information about the hardware |
* disk geometry, filesystem partitions, and drive specific information. |
* The label is in block 0 or 1, possibly offset from the beginning |
* to leave room for a bootstrap, etc. |
*/ |
|
/* XXX these should be defined per controller (or drive) elsewhere, not here! */ |
#if defined(__i386__) || defined(__amd64__) || defined(__arm__) || \ |
defined(__ia64__) |
#define LABELSECTOR 1 /* sector containing label */ |
#define LABELOFFSET 0 /* offset of label in sector */ |
#endif |
|
#ifdef __alpha__ |
#define LABELSECTOR 0 |
#define LABELOFFSET 64 |
#endif |
|
#define DISKMAGIC ((u_int32_t)0x82564557) /* The disk magic number */ |
#define FREEBSD_MAXPARTITIONS 8 /* == MAXPARTITIONS in <sys/disklabel.h> */ |
#define NBSD_MAXPARTITIONS 16 |
|
#define MBR_FREEBSD 0xA5 |
#define MBR_OPENBSD 0xA6 |
#define MBR_NETBSD 0xA9 |
|
/* Size of bootblock area in sector-size neutral bytes */ |
#define BBSIZE 8192 |
|
#define LABEL_PART 2 /* partition containing label */ |
#define RAW_PART 2 /* partition containing whole disk */ |
#define SWAP_PART 1 /* partition normally containing swap */ |
|
struct disklabel { |
u_int32_t d_magic; /* the magic number */ |
u_int16_t d_type; /* drive type */ |
u_int16_t d_subtype; /* controller/d_type specific */ |
char d_typename[16]; /* type name, e.g. "eagle" */ |
|
char d_packname[16]; /* pack identifier */ |
|
/* disk geometry: */ |
u_int32_t d_secsize; /* # of bytes per sector */ |
u_int32_t d_nsectors; /* # of data sectors per track */ |
u_int32_t d_ntracks; /* # of tracks per cylinder */ |
u_int32_t d_ncylinders; /* # of data cylinders per unit */ |
u_int32_t d_secpercyl; /* # of data sectors per cylinder */ |
u_int32_t d_secperunit; /* # of data sectors per unit */ |
|
/* |
* Spares (bad sector replacements) below are not counted in |
* d_nsectors or d_secpercyl. Spare sectors are assumed to |
* be physical sectors which occupy space at the end of each |
* track and/or cylinder. |
*/ |
u_int16_t d_sparespertrack; /* # of spare sectors per track */ |
u_int16_t d_sparespercyl; /* # of spare sectors per cylinder */ |
/* |
* Alternate cylinders include maintenance, replacement, configuration |
* description areas, etc. |
*/ |
u_int32_t d_acylinders; /* # of alt. cylinders per unit */ |
|
/* hardware characteristics: */ |
/* |
* d_interleave, d_trackskew and d_cylskew describe perturbations |
* in the media format used to compensate for a slow controller. |
* Interleave is physical sector interleave, set up by the |
* formatter or controller when formatting. When interleaving is |
* in use, logically adjacent sectors are not physically |
* contiguous, but instead are separated by some number of |
* sectors. It is specified as the ratio of physical sectors |
* traversed per logical sector. Thus an interleave of 1:1 |
* implies contiguous layout, while 2:1 implies that logical |
* sector 0 is separated by one sector from logical sector 1. |
* d_trackskew is the offset of sector 0 on track N relative to |
* sector 0 on track N-1 on the same cylinder. Finally, d_cylskew |
* is the offset of sector 0 on cylinder N relative to sector 0 |
* on cylinder N-1. |
*/ |
u_int16_t d_rpm; /* rotational speed */ |
u_int16_t d_interleave; /* hardware sector interleave */ |
u_int16_t d_trackskew; /* sector 0 skew, per track */ |
u_int16_t d_cylskew; /* sector 0 skew, per cylinder */ |
u_int32_t d_headswitch; /* head switch time, usec */ |
u_int32_t d_trkseek; /* track-to-track seek, usec */ |
u_int32_t d_flags; /* generic flags */ |
#define NDDATA 5 |
u_int32_t d_drivedata[NDDATA]; /* drive-type specific information */ |
#define NSPARE 5 |
u_int32_t d_spare[NSPARE]; /* reserved for future use */ |
u_int32_t d_magic2; /* the magic number (again) */ |
u_int16_t d_checksum; /* xor of data incl. partitions */ |
|
/* filesystem and partition information: */ |
u_int16_t d_npartitions; /* number of partitions in following */ |
u_int32_t d_bbsize; /* size of boot area at sn0, bytes */ |
u_int32_t d_sbsize; /* max size of fs superblock, bytes */ |
struct partition { /* the partition table */ |
u_int32_t p_size; /* number of sectors in partition */ |
u_int32_t p_offset; /* starting sector */ |
u_int32_t p_fsize; /* filesystem basic fragment size */ |
u_int8_t p_fstype; /* filesystem type, see below */ |
u_int8_t p_frag; /* filesystem fragments per block */ |
u_int16_t p_cpg; /* filesystem cylinders per group */ |
} d_partitions[NBSD_MAXPARTITIONS]; /* actually may be more */ |
}; |
|
#ifdef CTASSERT |
CTASSERT(sizeof(struct disklabel) == 148 + NBSD_MAXPARTITIONS * 16); |
#endif |
|
static __inline u_int16_t dkcksum(struct disklabel *lp); |
static __inline u_int16_t |
dkcksum(struct disklabel *lp) |
{ |
u_int16_t *start, *end; |
u_int16_t sum = 0; |
|
start = (u_int16_t *)lp; |
end = (u_int16_t *)&lp->d_partitions[lp->d_npartitions]; |
while (start < end) |
sum ^= *start++; |
return (sum); |
} |
|
|
/* d_type values: */ |
#define DTYPE_SMD 1 /* SMD, XSMD; VAX hp/up */ |
#define DTYPE_MSCP 2 /* MSCP */ |
#define DTYPE_DEC 3 /* other DEC (rk, rl) */ |
#define DTYPE_SCSI 4 /* SCSI */ |
#define DTYPE_ESDI 5 /* ESDI interface */ |
#define DTYPE_ST506 6 /* ST506 etc. */ |
#define DTYPE_HPIB 7 /* CS/80 on HP-IB */ |
#define DTYPE_HPFL 8 /* HP Fiber-link */ |
#define DTYPE_FLOPPY 10 /* floppy */ |
#define DTYPE_CCD 11 /* concatenated disk */ |
#define DTYPE_VINUM 12 /* vinum volume */ |
#define DTYPE_DOC2K 13 /* Msys DiskOnChip */ |
#define DTYPE_RAID 14 /* CMU RAIDFrame */ |
#define DTYPE_JFS2 16 /* IBM JFS 2 */ |
|
#ifdef DKTYPENAMES |
static const char *dktypenames[] = { |
"unknown", |
"SMD", |
"MSCP", |
"old DEC", |
"SCSI", |
"ESDI", |
"ST506", |
"HP-IB", |
"HP-FL", |
"type 9", |
"floppy", |
"CCD", |
"Vinum", |
"DOC2K", |
"Raid", |
"?", |
"jfs", |
NULL |
}; |
#define DKMAXTYPES (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1) |
#endif |
|
/* |
* Filesystem type and version. |
* Used to interpret other filesystem-specific |
* per-partition information. |
*/ |
#define FS_UNUSED 0 /* unused */ |
#define FS_SWAP 1 /* swap */ |
#define FS_V6 2 /* Sixth Edition */ |
#define FS_V7 3 /* Seventh Edition */ |
#define FS_SYSV 4 /* System V */ |
#define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */ |
#define FS_V8 6 /* Eighth Edition, 4K blocks */ |
#define FS_BSDFFS 7 /* 4.2BSD fast filesystem */ |
#define FS_MSDOS 8 /* MSDOS filesystem */ |
#define FS_BSDLFS 9 /* 4.4BSD log-structured filesystem */ |
#define FS_OTHER 10 /* in use, but unknown/unsupported */ |
#define FS_HPFS 11 /* OS/2 high-performance filesystem */ |
#define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */ |
#define FS_BOOT 13 /* partition contains bootstrap */ |
#define FS_VINUM 14 /* Vinum drive */ |
#define FS_RAID 15 /* RAIDFrame drive */ |
#define FS_JFS2 21 /* IBM JFS2 */ |
|
#ifdef FSTYPENAMES |
static const char *fstypenames[] = { |
"unused", |
"swap", |
"Version 6", |
"Version 7", |
"System V", |
"4.1BSD", |
"Eighth Edition", |
"4.2BSD", |
"MSDOS", |
"4.4LFS", |
"unknown", |
"HPFS", |
"ISO9660", |
"boot", |
"vinum", |
"raid", |
"?", |
"?", |
"?", |
"?", |
"jfs", |
NULL |
}; |
#define FSMAXTYPES (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1) |
#endif |
|
/* |
* flags shared by various drives: |
*/ |
#define D_REMOVABLE 0x01 /* removable media */ |
#define D_ECC 0x02 /* supports ECC */ |
#define D_BADSECT 0x04 /* supports bad sector forw. */ |
#define D_RAMDISK 0x08 /* disk emulator */ |
#define D_CHAIN 0x10 /* can do back-back transfers */ |
|
/* |
* Disklabel-specific ioctls. |
* |
* NB: <sys/disk.h> defines ioctls from 'd'/128 and up. |
*/ |
/* get and set disklabel */ |
#define DIOCGDINFO _IOR('d', 101, struct disklabel)/* get */ |
#define DIOCSDINFO _IOW('d', 102, struct disklabel)/* set */ |
#define DIOCWDINFO _IOW('d', 103, struct disklabel)/* set, update disk */ |
#define DIOCBSDBB _IOW('d', 110, void *) /* write bootblocks */ |
|
/* |
* Functions for proper encoding/decoding of struct disklabel into/from |
* bytestring. |
*/ |
void nbsd_partition_le_dec(u_char *ptr, struct partition *d); |
int nbsd_disklabel_le_dec(u_char *ptr, struct disklabel *d, int maxpart); |
void nbsd_partition_le_enc(u_char *ptr, struct partition *d); |
void nbsd_disklabel_le_enc(u_char *ptr, struct disklabel *d); |
|
#ifndef _KERNEL |
__BEGIN_DECLS |
struct disklabel *getdiskbyname(const char *); |
__END_DECLS |
#endif |
|
#endif /* !_SYS_DISKLABEL_H_ */ |