1 /* 2 * GRUB -- GRand Unified Bootloader 3 * Copyright (C) 1999,2000,2001,2003 Free Software Foundation, Inc. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 */ 19 20 #ifndef _PC_SLICE_H 21 #define _PC_SLICE_H 22 23 /* 24 * These define the basic PC MBR sector characteristics 25 */ 26 27 #define PC_MBR_SECTOR 0 28 29 #define PC_MBR_SIG_OFFSET 510 30 #define PC_MBR_SIGNATURE 0xaa55 31 32 #define PC_SLICE_OFFSET 446 33 #define PC_SLICE_MAX 4 34 35 36 /* 37 * Defines to guarantee structural alignment. 38 */ 39 40 #define PC_MBR_CHECK_SIG(mbr_ptr) \ 41 ( *( (unsigned short *) (((int) mbr_ptr) + PC_MBR_SIG_OFFSET) ) \ 42 == PC_MBR_SIGNATURE ) 43 44 #define PC_MBR_SIG(mbr_ptr) \ 45 ( *( (unsigned short *) (((int) mbr_ptr) + PC_MBR_SIG_OFFSET) ) ) 46 47 #define PC_SLICE_FLAG(mbr_ptr, part) \ 48 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET \ 49 + (part << 4)) ) ) 50 51 #define PC_SLICE_HEAD(mbr_ptr, part) \ 52 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 1 \ 53 + (part << 4)) ) ) 54 55 #define PC_SLICE_SEC(mbr_ptr, part) \ 56 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 2 \ 57 + (part << 4)) ) ) 58 59 #define PC_SLICE_CYL(mbr_ptr, part) \ 60 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 3 \ 61 + (part << 4)) ) ) 62 63 #define PC_SLICE_TYPE(mbr_ptr, part) \ 64 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 4 \ 65 + (part << 4)) ) ) 66 67 #define PC_SLICE_EHEAD(mbr_ptr, part) \ 68 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 5 \ 69 + (part << 4)) ) ) 70 71 #define PC_SLICE_ESEC(mbr_ptr, part) \ 72 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 6 \ 73 + (part << 4)) ) ) 74 75 #define PC_SLICE_ECYL(mbr_ptr, part) \ 76 ( *( (unsigned char *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 7 \ 77 + (part << 4)) ) ) 78 79 #define PC_SLICE_START(mbr_ptr, part) \ 80 ( *( (unsigned long *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 8 \ 81 + (part << 4)) ) ) 82 83 #define PC_SLICE_LENGTH(mbr_ptr, part) \ 84 ( *( (unsigned long *) (((int) mbr_ptr) + PC_SLICE_OFFSET + 12 \ 85 + (part << 4)) ) ) 86 87 88 /* 89 * PC flag types are defined here. 90 */ 91 92 #define PC_SLICE_FLAG_NONE 0 93 #define PC_SLICE_FLAG_BOOTABLE 0x80 94 95 /* 96 * Known PC partition types are defined here. 97 */ 98 99 /* This is not a flag actually, but used as if it were a flag. */ 100 #define PC_SLICE_TYPE_HIDDEN_FLAG 0x10 101 102 #define PC_SLICE_TYPE_NONE 0 103 #define PC_SLICE_TYPE_FAT12 1 104 #define PC_SLICE_TYPE_FAT16_LT32M 4 105 #define PC_SLICE_TYPE_EXTENDED 5 106 #define PC_SLICE_TYPE_FAT16_GT32M 6 107 #define PC_SLICE_TYPE_FAT32 0xb 108 #define PC_SLICE_TYPE_FAT32_LBA 0xc 109 #define PC_SLICE_TYPE_FAT16_LBA 0xe 110 #define PC_SLICE_TYPE_WIN95_EXTENDED 0xf 111 #define PC_SLICE_TYPE_EZD 0x55 112 #define PC_SLICE_TYPE_MINIX 0x80 113 #define PC_SLICE_TYPE_LINUX_MINIX 0x81 114 #define PC_SLICE_TYPE_SOLARIS 0x82 /* also Linux swap! */ 115 #define PC_SLICE_TYPE_EXT2FS 0x83 116 #define PC_SLICE_TYPE_LINUX_EXTENDED 0x85 117 #define PC_SLICE_TYPE_VSTAFS 0x9e 118 #define PC_SLICE_TYPE_SOLARIS_BOOT 0xbe /* Solaris boot (fat) */ 119 #define PC_SLICE_TYPE_SOLARIS2 0xbf /* new Solaris type */ 120 #define PC_SLICE_TYPE_DELL_UTIL 0xde 121 #define PC_SLICE_TYPE_GPT 0xee 122 #define PC_SLICE_TYPE_LINUX_RAID 0xfd 123 124 125 /* For convinience. */ 126 /* Check if TYPE is a FAT partition type. Clear the hidden flag before 127 the check, to allow the user to mount a hidden partition in GRUB. */ 128 #define IS_PC_SLICE_TYPE_FAT(type) \ 129 ({ int _type = (type) & ~PC_SLICE_TYPE_HIDDEN_FLAG; \ 130 _type == PC_SLICE_TYPE_FAT12 \ 131 || _type == PC_SLICE_TYPE_FAT16_LT32M \ 132 || _type == PC_SLICE_TYPE_FAT16_GT32M \ 133 || _type == PC_SLICE_TYPE_FAT16_LBA \ 134 || _type == PC_SLICE_TYPE_FAT32 \ 135 || _type == PC_SLICE_TYPE_FAT32_LBA \ 136 || type == PC_SLICE_TYPE_SOLARIS_BOOT \ 137 || type == PC_SLICE_TYPE_DELL_UTIL; }) 138 139 #define IS_PC_SLICE_TYPE_EXTENDED(type) \ 140 (((type) == PC_SLICE_TYPE_EXTENDED) \ 141 || ((type) == PC_SLICE_TYPE_WIN95_EXTENDED) \ 142 || ((type) == PC_SLICE_TYPE_LINUX_EXTENDED)) 143 144 #define IS_PC_SLICE_TYPE_MINIX(type) \ 145 (((type) == PC_SLICE_TYPE_MINIX) \ 146 || ((type) == PC_SLICE_TYPE_LINUX_MINIX)) 147 148 /* these ones are special, as they use their own partitioning scheme 149 to subdivide the PC partitions from there. */ 150 #define PC_SLICE_TYPE_FREEBSD 0xa5 151 #define PC_SLICE_TYPE_OPENBSD 0xa6 152 #define PC_SLICE_TYPE_NETBSD 0xa9 153 154 /* For convenience. */ 155 #define IS_PC_SLICE_TYPE_BSD_WITH_FS(type,fs) \ 156 ((type) == (PC_SLICE_TYPE_FREEBSD | ((fs) << 8)) \ 157 || (type) == (PC_SLICE_TYPE_OPENBSD | ((fs) << 8)) \ 158 || (type) == (PC_SLICE_TYPE_NETBSD | (fs) << 8)) 159 160 #define IS_PC_SLICE_TYPE_BSD(type) IS_PC_SLICE_TYPE_BSD_WITH_FS(type,0) 161 162 #define IS_PC_SLICE_TYPE_SOLARIS(type) \ 163 (((type) == PC_SLICE_TYPE_SOLARIS) || ((type) == PC_SLICE_TYPE_SOLARIS2)) 164 165 /* 166 * *BSD-style disklabel & partition definitions. 167 * 168 * This is a subdivided slice of type 'PC_SLICE_TYPE_BSD', so all of 169 * these, except where noted, are relative to the slice in question. 170 */ 171 172 #define BSD_LABEL_SECTOR 1 173 #define BSD_LABEL_MAGIC 0x82564557 174 175 #define BSD_LABEL_MAG_OFFSET 0 176 #define BSD_LABEL_MAG2_OFFSET 132 177 #define BSD_LABEL_NPARTS_OFFSET 138 178 #define BSD_LABEL_NPARTS_MAX 8 179 180 #define BSD_PART_OFFSET 148 181 182 183 /* 184 * Defines to guarantee structural alignment. 185 */ 186 187 #define BSD_LABEL_CHECK_MAG(l_ptr) \ 188 ( *( (unsigned long *) (((int) l_ptr) + BSD_LABEL_MAG_OFFSET) ) \ 189 == ( (unsigned long) BSD_LABEL_MAGIC ) ) 190 191 #define BSD_LABEL_MAG(l_ptr) \ 192 ( *( (unsigned long *) (((int) l_ptr) + BSD_LABEL_MAG_OFFSET) ) ) 193 194 #define BSD_LABEL_DTYPE(l_ptr) \ 195 ( *( (unsigned short *) (((int) l_ptr) + BSD_LABEL_MAG_OFFSET + 4) ) ) 196 197 #define BSD_LABEL_NPARTS(l_ptr) \ 198 ( *( (unsigned short *) (((int) l_ptr) + BSD_LABEL_NPARTS_OFFSET) ) ) 199 200 #define BSD_PART_LENGTH(l_ptr, part) \ 201 ( *( (unsigned long *) (((int) l_ptr) + BSD_PART_OFFSET \ 202 + (part << 4)) ) ) 203 204 #define BSD_PART_START(l_ptr, part) \ 205 ( *( (unsigned long *) (((int) l_ptr) + BSD_PART_OFFSET + 4 \ 206 + (part << 4)) ) ) 207 208 #define BSD_PART_FRAG_SIZE(l_ptr, part) \ 209 ( *( (unsigned long *) (((int) l_ptr) + BSD_PART_OFFSET + 8 \ 210 + (part << 4)) ) ) 211 212 #define BSD_PART_TYPE(l_ptr, part) \ 213 ( *( (unsigned char *) (((int) l_ptr) + BSD_PART_OFFSET + 12 \ 214 + (part << 4)) ) ) 215 216 #define BSD_PART_FRAGS_PER_BLOCK(l_ptr, part) \ 217 ( *( (unsigned char *) (((int) l_ptr) + BSD_PART_OFFSET + 13 \ 218 + (part << 4)) ) ) 219 220 #define BSD_PART_EXTRA(l_ptr, part) \ 221 ( *( (unsigned short *) (((int) l_ptr) + BSD_PART_OFFSET + 14 \ 222 + (part << 4)) ) ) 223 224 225 /* possible values for the "DISKTYPE"... all essentially irrelevant 226 except for DTYPE_SCSI */ 227 #define DTYPE_SMD 1 /* SMD, XSMD; VAX hp/up */ 228 #define DTYPE_MSCP 2 /* MSCP */ 229 #define DTYPE_DEC 3 /* other DEC (rk, rl) */ 230 #define DTYPE_SCSI 4 /* SCSI */ 231 #define DTYPE_ESDI 5 /* ESDI interface */ 232 #define DTYPE_ST506 6 /* ST506 etc. */ 233 #define DTYPE_HPIB 7 /* CS/80 on HP-IB */ 234 #define DTYPE_HPFL 8 /* HP Fiber-link */ 235 #define DTYPE_FLOPPY 10 /* floppy */ 236 237 238 /* possible values for the *BSD-style partition type */ 239 #define FS_UNUSED 0 /* unused */ 240 #define FS_SWAP 1 /* swap */ 241 #define FS_V6 2 /* Sixth Edition */ 242 #define FS_V7 3 /* Seventh Edition */ 243 #define FS_SYSV 4 /* System V */ 244 #define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */ 245 #define FS_V8 6 /* Eighth Edition, 4K blocks */ 246 #define FS_BSDFFS 7 /* 4.2BSD fast file system */ 247 #define FS_MSDOS 8 /* MSDOS file system */ 248 #define FS_BSDLFS 9 /* 4.4BSD log-structured file system */ 249 #define FS_OTHER 10 /* in use, but unknown/unsupported */ 250 #define FS_HPFS 11 /* OS/2 high-performance file system */ 251 #define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */ 252 #define FS_BOOT 13 /* partition contains bootstrap */ 253 #define FS_ADOS 14 /* AmigaDOS fast file system */ 254 #define FS_HFS 15 /* Macintosh HFS */ 255 #define FS_FILECORE 16 /* Acorn Filecore Filing System */ 256 #define FS_EXT2FS 17 /* Linux Extended 2 file system */ 257 258 259 /* 260 * Solaris LABEL definitions. All definitions are relative to the 261 * current PC_SLICE. 262 */ 263 #define SOL_LABEL_LOC 1 264 #define SOL_LABEL_SIZE 512 265 #define SOL_LABEL_MAGIC 0xdabe 266 #define SOL_LABEL_MAGIC_OFFSET 0x1fc 267 #define SOL_LABEL_NPARTS 0x10 268 269 #define SOL_PART_OFFSET 0x48 270 271 #define SOL_LABEL_CHECK_MAG(l_ptr) \ 272 (*((unsigned short *) (((int) l_ptr) + SOL_LABEL_MAGIC_OFFSET)) \ 273 == ((unsigned short) SOL_LABEL_MAGIC )) 274 275 #define SOL_PART_START(l_ptr, p) \ 276 (*((unsigned long *) (((int) l_ptr) + SOL_PART_OFFSET + (p) * 0xc + 4))) 277 278 #define SOL_PART_LENGTH(l_ptr, p) \ 279 (*((unsigned long *) (((int) l_ptr) + SOL_PART_OFFSET + (p) * 0xc + 8))) 280 281 #define SOL_PART_EXISTS(l_ptr, p) (SOL_PART_LENGTH(l_ptr, p) != 0) 282 283 284 #endif /* _PC_SLICE_H */ 285