[syslinux] [PATCH] isohybrid: Generate MBR even when in EFI mode
Geert Stappers
stappers at stappers.nl
Mon Mar 26 13:11:11 PDT 2012
Full quote, no new text, just a reminder
On Wed, Feb 15, 2012 at 12:12:17PM -0500, Matthew Garrett wrote:
> Various EFI systems insist that there be no active flag in the pMBR in
> order to parse the GPT. The only way around this is to also generate a
> valid MBR - the firmware will then pick that up and use the system
> partition provided there. In order to deal with other EFI "sanity" checks,
> the partition type for the non-EFI partitions is set to 0 to skip the
> firmware bailing because of overlapping partitions.
> ---
> utils/isohybrid.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/utils/isohybrid.c b/utils/isohybrid.c
> index 1dcbaa1..ac04bfd 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':
> @@ -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;
> @@ -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]);
> }
> --
> 1.7.7.6
>
> _______________________________________________
> Syslinux mailing list
> Submissions to Syslinux at zytor.com
> Unsubscribe or set options at:
> http://www.zytor.com/mailman/listinfo/syslinux
> Please do not send private replies to mailing list traffic.
--
Groeten
Geert Stappers
--
> And is there a policy on top-posting vs. bottom-posting?
Yes.
More information about the Syslinux
mailing list