diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/Makefile | 2 | ||||
-rw-r--r-- | utils/isohybrid.c | 64 |
2 files changed, 55 insertions, 11 deletions
diff --git a/utils/Makefile b/utils/Makefile index 44cb54fb..be739935 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -51,7 +51,7 @@ isohdpfx.c: $(ISOHDPFX) isohdpfxarray.pl $(PERL) isohdpfxarray.pl $(ISOHDPFX) > $@ isohybrid: isohybrid.o isohdpfx.o - $(CC) $(LDFLAGS) -luuid -o $@ $^ + $(CC) $(LDFLAGS) -o $@ $^ -luuid gethostip: gethostip.o $(CC) $(LDFLAGS) -o $@ $^ diff --git a/utils/isohybrid.c b/utils/isohybrid.c index 1dcbaa11..97d43b86 100644 --- a/utils/isohybrid.c +++ b/utils/isohybrid.c @@ -54,7 +54,7 @@ enum { VERBOSE = 1 , EFI = 2 , MAC = 4}; uint16_t head = 64; /* 1 <= head <= 256 */ uint8_t sector = 32; /* 1 <= sector <= 63 */ -uint8_t entry = 1; /* partition number: 1 <= entry <= 4 */ +uint8_t entry = 0; /* partition number: 1 <= entry <= 4 */ uint8_t offset = 0; /* partition offset: 0 <= offset <= 64 */ uint16_t type = 0x17; /* partition type: 0 <= type <= 255 */ uint32_t id = 0; /* MBR: 0 <= id <= 0xFFFFFFFF(4294967296) */ @@ -300,6 +300,8 @@ check_option(int argc, char *argv[]) entry = strtoul(optarg, &err, 0); if (entry < 1 || entry > 4) errx(1, "invalid entry: `%s', 1 <= entry <= 4", optarg); + if (mode & MAC || mode & EFI) + errx(1, "setting an entry is unsupported with EFI or Mac"); break; case 'o': @@ -334,10 +336,14 @@ check_option(int argc, char *argv[]) case 'u': mode |= EFI; + if (entry) + errx(1, "setting an entry is unsupported with EFI or Mac"); break; case 'm': mode |= MAC; + if (entry) + errx(1, "setting an entry is unsupported with EFI or Mac"); break; case 'v': @@ -428,10 +434,10 @@ lendian_64(const uint64_t s) if (*(uint8_t *)&r) return s; - r = (s & 0x00000000000000FF) << 56 | (s & 0xFF00000000000000) >> 56 - | (s & 0x000000000000FF00) << 40 | (s & 0x00FF000000000000) >> 40 - | (s & 0x0000000000FF0000) << 24 | (s & 0x0000FF0000000000) >> 24 - | (s & 0x00000000FF000000) << 8 | (s & 0x000000FF00000000) >> 8; + r = (s & 0x00000000000000FFull) << 56 | (s & 0xFF00000000000000ull) >> 56 + | (s & 0x000000000000FF00ull) << 40 | (s & 0x00FF000000000000ull) >> 40 + | (s & 0x0000000000FF0000ull) << 24 | (s & 0x0000FF0000000000ull) >> 24 + | (s & 0x00000000FF000000ull) << 8 | (s & 0x000000FF00000000ull) >> 8; return r; } @@ -581,6 +587,12 @@ initialise_mbr(uint8_t *mbr) memcpy(mbr, afp_header, sizeof(afp_header)); } + if (!entry) + entry = 1; + + if (mode & EFI) + type = 0; + mbr += MBRSIZE; /* offset 432 */ tmp = lendian_int(de_lba * 4); @@ -633,6 +645,40 @@ initialise_mbr(uint8_t *mbr) tmp = lendian_int(psize); memcpy(&mbr[12], &tmp, sizeof(tmp)); } + if (i == 2 && (mode & EFI)) + { + mbr[0] = 0x0; + mbr[1] = 0xfe; + mbr[2] = 0xff; + mbr[3] = 0xff; + mbr[4] = 0xef; + mbr[5] = 0xfe; + mbr[6] = 0xff; + mbr[7] = 0xff; + + tmp = lendian_int(efi_lba * 4); + memcpy(&mbr[8], &tmp, sizeof(tmp)); + + tmp = lendian_int(efi_count); + memcpy(&mbr[12], &tmp, sizeof(tmp)); + } + if (i == 3 && (mode & MAC)) + { + mbr[0] = 0x0; + mbr[1] = 0xfe; + mbr[2] = 0xff; + mbr[3] = 0xff; + mbr[4] = 0x0; + mbr[5] = 0xfe; + mbr[6] = 0xff; + mbr[7] = 0xff; + + tmp = lendian_int(mac_lba * 4); + memcpy(&mbr[8], &tmp, sizeof(tmp)); + + tmp = lendian_int(mac_count); + memcpy(&mbr[12], &tmp, sizeof(tmp)); + } mbr += 16; } mbr[0] = 0x55; @@ -713,7 +759,7 @@ initialise_gpt(uint8_t *gpt, uint32_t current, uint32_t alternate, int primary) reverse_uuid(disk_uuid); } - header->signature = lendian_64(0x5452415020494645); + header->signature = lendian_64(0x5452415020494645ull); header->revision = lendian_int(0x010000); header->headerSize = lendian_int(0x5c); header->currentLBA = lendian_64(current); @@ -908,8 +954,7 @@ main(int argc, char *argv[]) if (!read_efi_section(buf)) { buf += 32; if (!read_efi_catalogue(buf, &efi_count, &efi_lba) && efi_lba) { - offset = 1; - type = 0xee; + offset = 0; } else { errx(1, "%s: invalid efi catalogue", argv[0]); } @@ -925,8 +970,7 @@ main(int argc, char *argv[]) if (!read_efi_section(buf)) { buf += 32; if (!read_efi_catalogue(buf, &mac_count, &mac_lba) && mac_lba) { - offset = 1; - type = 0xee; + offset = 0; } else { errx(1, "%s: invalid efi catalogue", argv[0]); } |