wok annotate grub/stuff/gpt.diff @ rev 24987

grub: add gpt support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu May 12 07:08:39 2022 +0000 (2022-05-12)
parents
children
rev   line source
pascal@24987 1 --- grub-0.97/stage2/builtins.c
pascal@24987 2 +++ grub-0.97/stage2/builtins.c
pascal@24987 3 @@ -1233,14 +1233,15 @@ find_func (char *arg, int flags)
pascal@24987 4 for (drive = 0x80; drive < 0x88; drive++)
pascal@24987 5 {
pascal@24987 6 unsigned long part = 0xFFFFFF;
pascal@24987 7 - unsigned long start, len, offset, ext_offset;
pascal@24987 8 - int type, entry;
pascal@24987 9 + unsigned long start, len, offset, ext_offset, gpt_offset;
pascal@24987 10 + int type, entry, gpt_count, gpt_size;
pascal@24987 11 char buf[SECTOR_SIZE];
pascal@24987 12
pascal@24987 13 current_drive = drive;
pascal@24987 14 while (next_partition (drive, 0xFFFFFF, &part, &type,
pascal@24987 15 &start, &len, &offset, &entry,
pascal@24987 16 - &ext_offset, buf))
pascal@24987 17 + &ext_offset, &gpt_offset,
pascal@24987 18 + &gpt_count, &gpt_size, buf))
pascal@24987 19 {
pascal@24987 20 if (type != PC_SLICE_TYPE_NONE
pascal@24987 21 && ! IS_PC_SLICE_TYPE_BSD (type)
pascal@24987 22 @@ -2815,8 +2816,8 @@ parttype_func (char *arg, int flags)
pascal@24987 23 {
pascal@24987 24 int new_type;
pascal@24987 25 unsigned long part = 0xFFFFFF;
pascal@24987 26 - unsigned long start, len, offset, ext_offset;
pascal@24987 27 - int entry, type;
pascal@24987 28 + unsigned long start, len, offset, ext_offset, gpt_offset;
pascal@24987 29 + int entry, type, gpt_count, gpt_size;
pascal@24987 30 char mbr[512];
pascal@24987 31
pascal@24987 32 /* Get the drive and the partition. */
pascal@24987 33 @@ -2853,7 +2854,14 @@ parttype_func (char *arg, int flags)
pascal@24987 34 /* Look for the partition. */
pascal@24987 35 while (next_partition (current_drive, 0xFFFFFF, &part, &type,
pascal@24987 36 &start, &len, &offset, &entry,
pascal@24987 37 - &ext_offset, mbr))
pascal@24987 38 + &ext_offset, &gpt_offset, &gpt_count, &gpt_size, mbr))
pascal@24987 39 + /* The partition may not be a GPT partition. */
pascal@24987 40 + if (gpt_offset != 0)
pascal@24987 41 + {
pascal@24987 42 + errnum = ERR_BAD_ARGUMENT;
pascal@24987 43 + return 1;
pascal@24987 44 + }
pascal@24987 45 +
pascal@24987 46 {
pascal@24987 47 if (part == current_partition)
pascal@24987 48 {
pascal@24987 49 --- grub-0.97/stage2/disk_io.c
pascal@24987 50 +++ grub-0.97/stage2/disk_io.c
pascal@24987 51 @@ -21,6 +21,7 @@
pascal@24987 52
pascal@24987 53 #include <shared.h>
pascal@24987 54 #include <filesys.h>
pascal@24987 55 +#include <gpt.h>
pascal@24987 56
pascal@24987 57 #ifdef SUPPORT_NETBOOT
pascal@24987 58 # define GRUB 1
pascal@24987 59 @@ -502,8 +503,8 @@ int
pascal@24987 60 set_partition_hidden_flag (int hidden)
pascal@24987 61 {
pascal@24987 62 unsigned long part = 0xFFFFFF;
pascal@24987 63 - unsigned long start, len, offset, ext_offset;
pascal@24987 64 - int entry, type;
pascal@24987 65 + unsigned long start, len, offset, ext_offset, gpt_offset;
pascal@24987 66 + int entry, type, gpt_count, gpt_size;
pascal@24987 67 char mbr[512];
pascal@24987 68
pascal@24987 69 /* The drive must be a hard disk. */
pascal@24987 70 @@ -524,7 +525,14 @@ set_partition_hidden_flag (int hidden)
pascal@24987 71 /* Look for the partition. */
pascal@24987 72 while (next_partition (current_drive, 0xFFFFFF, &part, &type,
pascal@24987 73 &start, &len, &offset, &entry,
pascal@24987 74 - &ext_offset, mbr))
pascal@24987 75 + &ext_offset, &gpt_offset, &gpt_count, &gpt_size, mbr))
pascal@24987 76 + /* The partition may not be a GPT partition. */
pascal@24987 77 + if (gpt_offset != 0)
pascal@24987 78 + {
pascal@24987 79 + errnum = ERR_BAD_ARGUMENT;
pascal@24987 80 + return 1;
pascal@24987 81 + }
pascal@24987 82 +
pascal@24987 83 {
pascal@24987 84 if (part == current_partition)
pascal@24987 85 {
pascal@24987 86 @@ -577,11 +585,14 @@ next_partition (unsigned long drive, uns
pascal@24987 87 unsigned long *partition, int *type,
pascal@24987 88 unsigned long *start, unsigned long *len,
pascal@24987 89 unsigned long *offset, int *entry,
pascal@24987 90 - unsigned long *ext_offset, char *buf)
pascal@24987 91 + unsigned long *ext_offset,
pascal@24987 92 + unsigned long *gpt_offset, int *gpt_count,
pascal@24987 93 + int *gpt_size, char *buf)
pascal@24987 94 {
pascal@24987 95 /* Forward declarations. */
pascal@24987 96 auto int next_bsd_partition (void);
pascal@24987 97 auto int next_pc_slice (void);
pascal@24987 98 + auto int next_gpt_slice(void);
pascal@24987 99
pascal@24987 100 /* Get next BSD partition in current PC slice. */
pascal@24987 101 int next_bsd_partition (void)
pascal@24987 102 @@ -666,6 +677,40 @@ next_partition (unsigned long drive, uns
pascal@24987 103 return 0;
pascal@24987 104 }
pascal@24987 105
pascal@24987 106 + /* If this is a GPT partition table, read it as such. */
pascal@24987 107 + if (*entry == -1 && *offset == 0 && PC_SLICE_TYPE (buf, 0) == PC_SLICE_TYPE_GPT)
pascal@24987 108 + {
pascal@24987 109 + struct grub_gpt_header *hdr = (struct grub_gpt_header *) buf;
pascal@24987 110 +
pascal@24987 111 + /* Read in the GPT Partition table header. */
pascal@24987 112 + if (! rawread (drive, 1, 0, SECTOR_SIZE, buf))
pascal@24987 113 + return 0;
pascal@24987 114 +
pascal@24987 115 + if (hdr->magic == GPT_HEADER_MAGIC && hdr->version == 0x10000)
pascal@24987 116 + {
pascal@24987 117 + /* Let gpt_offset point to the first entry in the GPT
pascal@24987 118 + partition table. This can also be used by callers of
pascal@24987 119 + next_partition to determine if a entry comes from a
pascal@24987 120 + GPT partition table or not. */
pascal@24987 121 + *gpt_offset = hdr->partitions;
pascal@24987 122 + *gpt_count = hdr->maxpart;
pascal@24987 123 + *gpt_size = hdr->partentry_size;
pascal@24987 124 +
pascal@24987 125 + return next_gpt_slice();
pascal@24987 126 + }
pascal@24987 127 + else
pascal@24987 128 + {
pascal@24987 129 + /* This is not a valid header for a GPT partition table.
pascal@24987 130 + Re-read the MBR or the boot sector of the extended
pascal@24987 131 + partition. */
pascal@24987 132 + if (! rawread (drive, *offset, 0, SECTOR_SIZE, buf))
pascal@24987 133 + return 0;
pascal@24987 134 + }
pascal@24987 135 + }
pascal@24987 136 +
pascal@24987 137 + /* Not a GPT partition. */
pascal@24987 138 + *gpt_offset = 0;
pascal@24987 139 +
pascal@24987 140 /* Increase the entry number. */
pascal@24987 141 (*entry)++;
pascal@24987 142
pascal@24987 143 @@ -710,6 +755,43 @@ next_partition (unsigned long drive, uns
pascal@24987 144 return 1;
pascal@24987 145 }
pascal@24987 146
pascal@24987 147 + /* Get the next GPT slice. */
pascal@24987 148 + int next_gpt_slice (void)
pascal@24987 149 + {
pascal@24987 150 + struct grub_gpt_partentry *gptentry = (struct grub_gpt_partentry *) buf;
pascal@24987 151 + /* Make GPT partitions show up as PC slices. */
pascal@24987 152 + int pc_slice_no = (*partition & 0xFF0000) >> 16;
pascal@24987 153 +
pascal@24987 154 + /* If this is the first time... */
pascal@24987 155 + if (pc_slice_no == 0xFF)
pascal@24987 156 + {
pascal@24987 157 + pc_slice_no = -1;
pascal@24987 158 + *entry = -1;
pascal@24987 159 + }
pascal@24987 160 +
pascal@24987 161 + do {
pascal@24987 162 + (*entry)++;
pascal@24987 163 +
pascal@24987 164 + if (*entry >= *gpt_count)
pascal@24987 165 + {
pascal@24987 166 + errnum = ERR_NO_PART;
pascal@24987 167 + return 0;
pascal@24987 168 + }
pascal@24987 169 + /* Read in the GPT Partition table entry. */
pascal@24987 170 + if (! rawread (drive, (*gpt_offset) + GPT_ENTRY_SECTOR (*gpt_size, *entry), GPT_ENTRY_INDEX (*gpt_size, *entry), *gpt_size, buf))
pascal@24987 171 + return 0;
pascal@24987 172 + } while (! (gptentry->type1 && gptentry->type2));
pascal@24987 173 +
pascal@24987 174 + pc_slice_no++;
pascal@24987 175 + *start = gptentry->start;
pascal@24987 176 + *len = gptentry->end - gptentry->start + 1;
pascal@24987 177 + *type = PC_SLICE_TYPE_EXT2FS;
pascal@24987 178 + *entry = pc_slice_no;
pascal@24987 179 + *partition = (*entry << 16) | 0xFFFF;
pascal@24987 180 +
pascal@24987 181 + return 1;
pascal@24987 182 + }
pascal@24987 183 +
pascal@24987 184 /* Start the body of this function. */
pascal@24987 185
pascal@24987 186 #ifndef STAGE1_5
pascal@24987 187 @@ -717,6 +799,9 @@ next_partition (unsigned long drive, uns
pascal@24987 188 return 0;
pascal@24987 189 #endif
pascal@24987 190
pascal@24987 191 + if (*partition != 0xFFFFFF && *gpt_offset != 0)
pascal@24987 192 + return next_gpt_slice ();
pascal@24987 193 +
pascal@24987 194 /* If previous partition is a BSD partition or a PC slice which
pascal@24987 195 contains BSD partitions... */
pascal@24987 196 if ((*partition != 0xFFFFFF && IS_PC_SLICE_TYPE_BSD (*type & 0xff))
pascal@24987 197 @@ -755,6 +840,9 @@ real_open_partition (int flags)
pascal@24987 198 unsigned long dest_partition = current_partition;
pascal@24987 199 unsigned long part_offset;
pascal@24987 200 unsigned long ext_offset;
pascal@24987 201 + unsigned long gpt_offset;
pascal@24987 202 + int gpt_count;
pascal@24987 203 + int gpt_size;
pascal@24987 204 int entry;
pascal@24987 205 char buf[SECTOR_SIZE];
pascal@24987 206 int bsd_part, pc_slice;
pascal@24987 207 @@ -766,7 +854,8 @@ real_open_partition (int flags)
pascal@24987 208 int ret = next_partition (current_drive, dest_partition,
pascal@24987 209 &current_partition, &current_slice,
pascal@24987 210 &part_start, &part_length,
pascal@24987 211 - &part_offset, &entry, &ext_offset, buf);
pascal@24987 212 + &part_offset, &entry, &ext_offset,
pascal@24987 213 + &gpt_offset, &gpt_count, &gpt_size, buf);
pascal@24987 214 bsd_part = (current_partition >> 8) & 0xFF;
pascal@24987 215 pc_slice = current_partition >> 16;
pascal@24987 216 return ret;
pascal@24987 217 --- grub-0.97/stage2/gpt.h
pascal@24987 218 +++ grub-0.97/stage2/gpt.h
pascal@24987 219 @@ -0,0 +1,68 @@
pascal@24987 220 +/*
pascal@24987 221 + * GRUB -- GRand Unified Bootloader
pascal@24987 222 + * Copyright (C) 2002,2005,2006 Free Software Foundation, Inc.
pascal@24987 223 + *
pascal@24987 224 + * This program is free software; you can redistribute it and/or modify
pascal@24987 225 + * it under the terms of the GNU General Public License as published by
pascal@24987 226 + * the Free Software Foundation; either version 2 of the License, or
pascal@24987 227 + * (at your option) any later version.
pascal@24987 228 + *
pascal@24987 229 + * This program is distributed in the hope that it will be useful,
pascal@24987 230 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
pascal@24987 231 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
pascal@24987 232 + * GNU General Public License for more details.
pascal@24987 233 + *
pascal@24987 234 + * You should have received a copy of the GNU General Public License
pascal@24987 235 + * along with this program; if not, write to the Free Software
pascal@24987 236 + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
pascal@24987 237 + */
pascal@24987 238 +
pascal@24987 239 +#ifndef _GPT_H
pascal@24987 240 +#define _GPT_H
pascal@24987 241 +
pascal@24987 242 +typedef signed char grub_int8_t;
pascal@24987 243 +typedef signed short grub_int16_t;
pascal@24987 244 +typedef signed int grub_int32_t;
pascal@24987 245 +typedef signed long long int grub_int64_t;
pascal@24987 246 +typedef unsigned char grub_uint8_t;
pascal@24987 247 +typedef unsigned short grub_uint16_t;
pascal@24987 248 +typedef unsigned int grub_uint32_t;
pascal@24987 249 +typedef unsigned long long int grub_uint64_t;
pascal@24987 250 +
pascal@24987 251 +struct grub_gpt_header
pascal@24987 252 +{
pascal@24987 253 + grub_uint64_t magic;
pascal@24987 254 + grub_uint32_t version;
pascal@24987 255 + grub_uint32_t headersize;
pascal@24987 256 + grub_uint32_t crc32;
pascal@24987 257 + grub_uint32_t unused1;
pascal@24987 258 + grub_uint64_t primary;
pascal@24987 259 + grub_uint64_t backup;
pascal@24987 260 + grub_uint64_t start;
pascal@24987 261 + grub_uint64_t end;
pascal@24987 262 + grub_uint8_t guid[16];
pascal@24987 263 + grub_uint64_t partitions;
pascal@24987 264 + grub_uint32_t maxpart;
pascal@24987 265 + grub_uint32_t partentry_size;
pascal@24987 266 + grub_uint32_t partentry_crc32;
pascal@24987 267 +} __attribute__ ((packed));
pascal@24987 268 +
pascal@24987 269 +struct grub_gpt_partentry
pascal@24987 270 +{
pascal@24987 271 + grub_uint64_t type1;
pascal@24987 272 + grub_uint64_t type2;
pascal@24987 273 + grub_uint8_t guid[16];
pascal@24987 274 + grub_uint64_t start;
pascal@24987 275 + grub_uint64_t end;
pascal@24987 276 + grub_uint8_t attrib;
pascal@24987 277 + char name[72];
pascal@24987 278 +} __attribute__ ((packed));
pascal@24987 279 +
pascal@24987 280 +#define GPT_HEADER_MAGIC 0x5452415020494645UL
pascal@24987 281 +
pascal@24987 282 +#define GPT_ENTRY_SECTOR(size,entry) \
pascal@24987 283 + ((((entry) * (size) + 1) & ~(SECTOR_SIZE - 1)) >> SECTOR_BITS)
pascal@24987 284 +#define GPT_ENTRY_INDEX(size,entry) \
pascal@24987 285 + ((((entry) * (size) + 1) & (SECTOR_SIZE - 1)) - 1)
pascal@24987 286 +
pascal@24987 287 +#endif /* _GPT_H */
pascal@24987 288 --- grub-0.97/stage2/pc_slice.h
pascal@24987 289 +++ grub-0.97/stage2/pc_slice.h
pascal@24987 290 @@ -115,6 +115,7 @@
pascal@24987 291 #define PC_SLICE_TYPE_LINUX_EXTENDED 0x85
pascal@24987 292 #define PC_SLICE_TYPE_VSTAFS 0x9e
pascal@24987 293 #define PC_SLICE_TYPE_DELL_UTIL 0xde
pascal@24987 294 +#define PC_SLICE_TYPE_GPT 0xee
pascal@24987 295 #define PC_SLICE_TYPE_LINUX_RAID 0xfd
pascal@24987 296
pascal@24987 297
pascal@24987 298 --- grub-0.97/stage2/shared.h
pascal@24987 299 +++ grub-0.97/stage2/shared.h
pascal@24987 300 @@ -934,7 +934,9 @@ int next_partition (unsigned long drive,
pascal@24987 301 unsigned long *partition, int *type,
pascal@24987 302 unsigned long *start, unsigned long *len,
pascal@24987 303 unsigned long *offset, int *entry,
pascal@24987 304 - unsigned long *ext_offset, char *buf);
pascal@24987 305 + unsigned long *ext_offset,
pascal@24987 306 + unsigned long *gpt_offset, int *gpt_count,
pascal@24987 307 + int *gpt_size, char *buf);
pascal@24987 308
pascal@24987 309 /* Sets device to the one represented by the SAVED_* parameters. */
pascal@24987 310 int make_saved_active (void);