00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _SYS_DISKLABEL_H_
00038 #define _SYS_DISKLABEL_H_
00039
00040 #ifndef _KERNEL
00041 #include <sys/types.h>
00042 #endif
00043 #include <sys/ioccom.h>
00044
00045
00046
00047
00048 #define _PATH_DISKTAB "/etc/disktab"
00049 #define DISKTAB "/etc/disktab"
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #ifdef __i386__
00060 #define LABELSECTOR 1
00061 #define LABELOFFSET 0
00062 #endif
00063
00064 #ifdef __alpha__
00065 #define LABELSECTOR 0
00066 #define LABELOFFSET 64
00067 #endif
00068
00069 #ifndef LABELSECTOR
00070 #define LABELSECTOR 0
00071 #endif
00072
00073 #ifndef LABELOFFSET
00074 #define LABELOFFSET 64
00075 #endif
00076
00077 #define DISKMAGIC ((u_int32_t)0x82564557)
00078 #ifndef MAXPARTITIONS
00079 #define MAXPARTITIONS 8
00080 #endif
00081
00082 #define LABEL_PART 2
00083 #define RAW_PART 2
00084 #define SWAP_PART 1
00085
00086 #ifndef LOCORE
00087 struct disklabel {
00088 u_int32_t d_magic;
00089 u_int16_t d_type;
00090 u_int16_t d_subtype;
00091 char d_typename[16];
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 union {
00102 char un_d_packname[16];
00103 struct {
00104 char *un_d_boot0;
00105 char *un_d_boot1;
00106 } un_b;
00107 } d_un;
00108 #define d_packname d_un.un_d_packname
00109 #define d_boot0 d_un.un_b.un_d_boot0
00110 #define d_boot1 d_un.un_b.un_d_boot1
00111
00112
00113 u_int32_t d_secsize;
00114 u_int32_t d_nsectors;
00115 u_int32_t d_ntracks;
00116 u_int32_t d_ncylinders;
00117 u_int32_t d_secpercyl;
00118 u_int32_t d_secperunit;
00119
00120
00121
00122
00123
00124
00125
00126 u_int16_t d_sparespertrack;
00127 u_int16_t d_sparespercyl;
00128
00129
00130
00131
00132 u_int32_t d_acylinders;
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 u_int16_t d_rpm;
00152 u_int16_t d_interleave;
00153 u_int16_t d_trackskew;
00154 u_int16_t d_cylskew;
00155 u_int32_t d_headswitch;
00156 u_int32_t d_trkseek;
00157 u_int32_t d_flags;
00158 #define NDDATA 5
00159 u_int32_t d_drivedata[NDDATA];
00160 #define NSPARE 5
00161 u_int32_t d_spare[NSPARE];
00162 u_int32_t d_magic2;
00163 u_int16_t d_checksum;
00164
00165
00166 u_int16_t d_npartitions;
00167 u_int32_t d_bbsize;
00168 u_int32_t d_sbsize;
00169 struct partition {
00170 u_int32_t p_size;
00171 u_int32_t p_offset;
00172 u_int32_t p_fsize;
00173 u_int8_t p_fstype;
00174 u_int8_t p_frag;
00175 union {
00176 u_int16_t cpg;
00177 u_int16_t sgs;
00178 } __partition_u1;
00179 #define p_cpg __partition_u1.cpg
00180 #define p_sgs __partition_u1.sgs
00181 } d_partitions[MAXPARTITIONS];
00182 };
00183
00184 static u_int16_t dkcksum(struct disklabel *lp);
00185
00186 static __inline u_int16_t
00187 dkcksum(struct disklabel *lp)
00188 {
00189 u_int16_t *start, *end;
00190 u_int16_t sum = 0;
00191
00192 start = (u_int16_t *)lp;
00193 end = (u_int16_t *)&lp->d_partitions[lp->d_npartitions];
00194 while (start < end)
00195 sum ^= *start++;
00196 return (sum);
00197 }
00198
00199 #else
00200
00201
00202
00203 .set d_secsize,40
00204 .set d_nsectors,44
00205 .set d_ntracks,48
00206 .set d_ncylinders,52
00207 .set d_secpercyl,56
00208 .set d_secperunit,60
00209 .set d_end_,276
00210 #endif
00211
00212
00213 #define DTYPE_SMD 1
00214 #define DTYPE_MSCP 2
00215 #define DTYPE_DEC 3
00216 #define DTYPE_SCSI 4
00217 #define DTYPE_ESDI 5
00218 #define DTYPE_ST506 6
00219 #define DTYPE_HPIB 7
00220 #define DTYPE_HPFL 8
00221 #define DTYPE_FLOPPY 10
00222 #define DTYPE_CCD 11
00223 #define DTYPE_VINUM 12
00224 #define DTYPE_DOC2K 13
00225
00226 #if defined(PC98) && !defined(PC98_ATCOMPAT)
00227 #define DSTYPE_SEC256 0x80
00228 #endif
00229
00230 #ifdef DKTYPENAMES
00231 static char *dktypenames[] = {
00232 "unknown",
00233 "SMD",
00234 "MSCP",
00235 "old DEC",
00236 "SCSI",
00237 "ESDI",
00238 "ST506",
00239 "HP-IB",
00240 "HP-FL",
00241 "type 9",
00242 "floppy",
00243 "CCD",
00244 "Vinum",
00245 "DOC2K",
00246 NULL
00247 };
00248 #define DKMAXTYPES (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
00249 #endif
00250
00251
00252
00253
00254
00255
00256 #define FS_UNUSED 0
00257 #define FS_SWAP 1
00258 #define FS_V6 2
00259 #define FS_V7 3
00260 #define FS_SYSV 4
00261 #define FS_V71K 5
00262 #define FS_V8 6
00263 #define FS_BSDFFS 7
00264 #define FS_MSDOS 8
00265 #define FS_BSDLFS 9
00266 #define FS_OTHER 10
00267 #define FS_HPFS 11
00268 #define FS_ISO9660 12
00269 #define FS_BOOT 13
00270 #define FS_VINUM 14
00271
00272 #ifdef DKTYPENAMES
00273 static char *fstypenames[] = {
00274 "unused",
00275 "swap",
00276 "Version 6",
00277 "Version 7",
00278 "System V",
00279 "4.1BSD",
00280 "Eighth Edition",
00281 "4.2BSD",
00282 "MSDOS",
00283 "4.4LFS",
00284 "unknown",
00285 "HPFS",
00286 "ISO9660",
00287 "boot",
00288 "vinum",
00289 NULL
00290 };
00291 #define FSMAXTYPES (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
00292 #endif
00293
00294
00295
00296
00297 #define D_REMOVABLE 0x01
00298 #define D_ECC 0x02
00299 #define D_BADSECT 0x04
00300 #define D_RAMDISK 0x08
00301 #define D_CHAIN 0x10
00302
00303
00304
00305
00306 #define d_smdflags d_drivedata[0]
00307 #define D_SSE 0x1
00308 #define d_mindist d_drivedata[1]
00309 #define d_maxdist d_drivedata[2]
00310 #define d_sdist d_drivedata[3]
00311
00312
00313
00314
00315 #define d_precompcyl d_drivedata[0]
00316 #define d_gap3 d_drivedata[1]
00317
00318
00319
00320
00321 #define d_blind d_drivedata[0]
00322
00323 #ifndef LOCORE
00324
00325
00326
00327
00328
00329 struct format_op {
00330 char *df_buf;
00331 int df_count;
00332 daddr_t df_startblk;
00333 int df_reg[8];
00334 };
00335
00336
00337
00338
00339
00340 struct partinfo {
00341 struct disklabel *disklab;
00342 struct partition *part;
00343 };
00344
00345
00346
00347 #if defined(PC98) && !defined(PC98_ATCOMPAT)
00348 #define DOSBBSECTOR 0
00349 #define DOSLABELSECTOR 1
00350 #define DOSPARTOFF 0
00351 #define NDOSPART 16
00352 #define DOSPTYP_386BSD 0x94
00353 #define MBR_PTYPE_FreeBSD 0x94
00354
00355 struct dos_partition {
00356 unsigned char dp_mid;
00357 #define DOSMID_386BSD (0x14|0x80)
00358 unsigned char dp_sid;
00359 #define DOSSID_386BSD (0x44|0x80)
00360 unsigned char dp_dum1;
00361 unsigned char dp_dum2;
00362 unsigned char dp_ipl_sct;
00363 unsigned char dp_ipl_head;
00364 unsigned short dp_ipl_cyl;
00365 unsigned char dp_ssect;
00366 unsigned char dp_shd;
00367 unsigned short dp_scyl;
00368 unsigned char dp_esect;
00369 unsigned char dp_ehd;
00370 unsigned short dp_ecyl;
00371 unsigned char dp_name[16];
00372 };
00373
00374 #else
00375 #define DOSBBSECTOR 0
00376 #define DOSPARTOFF 446
00377 #define NDOSPART 4
00378 #define DOSPTYP_386BSD 0xa5
00379 #define DOSPTYP_LINSWP 0x82
00380 #define DOSPTYP_LINUX 0x83
00381 #define DOSPTYP_EXT 5
00382
00383 struct dos_partition {
00384 unsigned char dp_flag;
00385 unsigned char dp_shd;
00386 unsigned char dp_ssect;
00387 unsigned char dp_scyl;
00388 unsigned char dp_typ;
00389 unsigned char dp_ehd;
00390 unsigned char dp_esect;
00391 unsigned char dp_ecyl;
00392 u_int32_t dp_start;
00393 u_int32_t dp_size;
00394 };
00395 #endif
00396
00397 #define DPSECT(s) ((s) & 0x3f)
00398 #define DPCYL(c, s) ((c) + (((s) & 0xc0)<<2))
00399
00400
00401
00402
00403
00404 #define DIOCGDINFO _IOR('d', 101, struct disklabel)
00405 #define DIOCSDINFO _IOW('d', 102, struct disklabel)
00406 #define DIOCWDINFO _IOW('d', 103, struct disklabel)
00407 #define DIOCGPART _IOW('d', 104, struct partinfo)
00408 #define DIOCGDVIRGIN _IOR('d', 105, struct disklabel)
00409
00410 #define DIOCWLABEL _IOW('d', 109, int)
00411
00412 #ifdef _KERNEL
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435 #define DKMAXUNIT 0x1ff
00436
00437 #define dkmakeminor(unit, slice, part) \
00438 (((slice) << 16) | (((unit) & 0x1e0) << 16) | \
00439 (((unit) & 0x1f) << 3) | (part))
00440 static __inline dev_t
00441 dkmodpart(dev_t dev, int part)
00442 {
00443 return (makedev(major(dev), (minor(dev) & ~7) | part));
00444 }
00445
00446 static __inline dev_t
00447 dkmodslice(dev_t dev, int slice)
00448 {
00449 return (makedev(major(dev), (minor(dev) & ~0x1f0000) | (slice << 16)));
00450 }
00451
00452 #define dkpart(dev) (minor(dev) & 7)
00453 #define dkslice(dev) ((minor(dev) >> 16) & 0x1f)
00454 #define dktype(dev) ((minor(dev) >> 25) & 0x7f)
00455
00456 static __inline u_int
00457 dkunit(dev_t dev)
00458 {
00459 return (((minor(dev) >> 16) & 0x1e0) | ((minor(dev) >> 3) & 0x1f));
00460 }
00461
00462 struct buf;
00463 struct buf_queue_head;
00464
00465 int bounds_check_with_label __P((struct buf *bp, struct disklabel *lp,
00466 int wlabel));
00467 void diskerr __P((struct buf *bp, char *what, int pri, int blkdone,
00468 struct disklabel *lp));
00469 void disksort __P((struct buf *ap, struct buf *bp));
00470 char *readdisklabel __P((dev_t dev, struct disklabel *lp));
00471 void bufqdisksort __P((struct buf_queue_head *ap, struct buf *bp));
00472 int setdisklabel __P((struct disklabel *olp, struct disklabel *nlp,
00473 u_long openmask));
00474 int writedisklabel __P((dev_t dev, struct disklabel *lp));
00475 #ifdef __alpha__
00476 void alpha_fix_srm_checksum __P((struct buf *bp));
00477 #endif
00478
00479 #endif
00480
00481 #endif
00482
00483 #ifndef _KERNEL
00484 __BEGIN_DECLS
00485 struct disklabel *getdiskbyname __P((const char *));
00486 __END_DECLS
00487 #endif
00488
00489 #endif