diff options
author | John Levon <john.levon@joyent.com> | 2019-03-15 17:34:12 +0000 |
---|---|---|
committer | John Levon <john.levon@joyent.com> | 2019-04-23 09:49:06 -0700 |
commit | fd7977362aae2eaa5dcb89671159f4fd82f22ca1 (patch) | |
tree | 2d4c3b3c8e0480c575ccf91e3054d637d207d7ca /usr/src/lib/libefi | |
parent | 995a963f85d39c82ddd55378042f53b3a58c2519 (diff) | |
download | illumos-joyent-fd7977362aae2eaa5dcb89671159f4fd82f22ca1.tar.gz |
10570 Need workaround to EFI boot on AMI BIOS
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Andy Stormont <astormont@racktopsystems.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libefi')
-rw-r--r-- | usr/src/lib/libefi/common/rdwr_efi.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/usr/src/lib/libefi/common/rdwr_efi.c b/usr/src/lib/libefi/common/rdwr_efi.c index e0d866e3c4..0e87baeca3 100644 --- a/usr/src/lib/libefi/common/rdwr_efi.c +++ b/usr/src/lib/libefi/common/rdwr_efi.c @@ -24,7 +24,7 @@ * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright 2014 Toomas Soome <tsoome@me.com> * Copyright 2018 OmniOS Community Edition (OmniOSce) Association. - * Copyright (c) 2018, Joyent, Inc. + * Copyright 2019 Joyent, Inc. */ #include <stdio.h> @@ -341,9 +341,8 @@ check_label(int fd, dk_efi_t *dk_ioc) if (efi_debug) (void) fprintf(stderr, "Bad EFI CRC: 0x%x != 0x%x\n", - crc, - LE_32(efi_crc32((unsigned char *)efi, - sizeof (struct efi_gpt)))); + crc, LE_32(efi_crc32((unsigned char *)efi, + LE_32(efi->efi_gpt_HeaderSize)))); return (VT_EINVAL); } @@ -715,7 +714,7 @@ write_pmbr(int fd, struct dk_gpt *vtoc) hardware_workarounds(&slot, &active); len = (vtoc->efi_lbasize == 0) ? sizeof (mb) : vtoc->efi_lbasize; - buf = calloc(len, 1); + buf = calloc(1, len); /* * Preserve any boot code and disk signature if the first block is @@ -741,10 +740,10 @@ write_pmbr(int fd, struct dk_gpt *vtoc) cp = (uchar_t *)&mb.parts[slot * sizeof (struct ipart)]; /* bootable or not */ *cp++ = active ? ACTIVE : NOTACTIVE; - /* beginning CHS; 0xffffff if not representable */ - *cp++ = 0xff; - *cp++ = 0xff; - *cp++ = 0xff; + /* beginning CHS; same as starting LBA (but one-based) */ + *cp++ = 0x0; + *cp++ = 0x2; + *cp++ = 0x0; /* OS type */ *cp++ = EFI_PMBR; /* ending CHS; 0xffffff if not representable */ @@ -1029,7 +1028,7 @@ efi_write(int fd, struct dk_gpt *vtoc) /* stuff user's input into EFI struct */ efi->efi_gpt_Signature = LE_64(EFI_SIGNATURE); efi->efi_gpt_Revision = LE_32(vtoc->efi_version); /* 0x02000100 */ - efi->efi_gpt_HeaderSize = LE_32(sizeof (struct efi_gpt)); + efi->efi_gpt_HeaderSize = LE_32(EFI_HEADER_SIZE); efi->efi_gpt_Reserved1 = 0; efi->efi_gpt_MyLBA = LE_64(1ULL); efi->efi_gpt_AlternateLBA = LE_64(lba_backup_gpt_hdr); @@ -1094,8 +1093,8 @@ efi_write(int fd, struct dk_gpt *vtoc) efi->efi_gpt_PartitionEntryArrayCRC32 = LE_32(efi_crc32((unsigned char *)efi_parts, vtoc->efi_nparts * (int)sizeof (struct efi_gpe))); - efi->efi_gpt_HeaderCRC32 = - LE_32(efi_crc32((unsigned char *)efi, sizeof (struct efi_gpt))); + efi->efi_gpt_HeaderCRC32 = LE_32(efi_crc32((unsigned char *)efi, + EFI_HEADER_SIZE)); if (efi_ioctl(fd, DKIOCSETEFI, &dk_ioc) == -1) { free(dk_ioc.dki_data); @@ -1142,8 +1141,7 @@ efi_write(int fd, struct dk_gpt *vtoc) efi->efi_gpt_PartitionEntryLBA = LE_64(vtoc->efi_last_u_lba + 1); efi->efi_gpt_HeaderCRC32 = 0; efi->efi_gpt_HeaderCRC32 = - LE_32(efi_crc32((unsigned char *)dk_ioc.dki_data, - sizeof (struct efi_gpt))); + LE_32(efi_crc32((unsigned char *)dk_ioc.dki_data, EFI_HEADER_SIZE)); if (efi_ioctl(fd, DKIOCSETEFI, &dk_ioc) == -1) { if (efi_debug) { |