summaryrefslogtreecommitdiff
path: root/usr/src/lib/libefi
diff options
context:
space:
mode:
authorJohn Levon <john.levon@joyent.com>2019-03-15 17:34:12 +0000
committerJohn Levon <john.levon@joyent.com>2019-04-23 09:49:06 -0700
commitfd7977362aae2eaa5dcb89671159f4fd82f22ca1 (patch)
tree2d4c3b3c8e0480c575ccf91e3054d637d207d7ca /usr/src/lib/libefi
parent995a963f85d39c82ddd55378042f53b3a58c2519 (diff)
downloadillumos-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.c26
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) {