From 987e90dc68863b34c6e37d54acc6ae971386547d Mon Sep 17 00:00:00 2001 From: xl222276 Date: Mon, 16 Jun 2008 21:30:50 -0700 Subject: 6613137 write_pmbr() puts garbage in first 446 bytes on disk --- usr/src/lib/libefi/common/rdwr_efi.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'usr/src/lib') diff --git a/usr/src/lib/libefi/common/rdwr_efi.c b/usr/src/lib/libefi/common/rdwr_efi.c index ddf96923c6..0f50628af0 100644 --- a/usr/src/lib/libefi/common/rdwr_efi.c +++ b/usr/src/lib/libefi/common/rdwr_efi.c @@ -540,7 +540,19 @@ write_pmbr(int fd, struct dk_gpt *vtoc) uchar_t *cp; diskaddr_t size_in_lba; - mb.signature = LE_16(MBB_MAGIC); + /* + * Preserve any boot code and disk signature if the first block is + * already an MBR. + */ + dk_ioc.dki_lba = 0; + dk_ioc.dki_length = sizeof (mb); + /* LINTED -- always longlong aligned */ + dk_ioc.dki_data = (efi_gpt_t *)&mb; + if (efi_ioctl(fd, DKIOCGETEFI, &dk_ioc) == -1 || + mb.signature != LE_16(MBB_MAGIC)) { + bzero(&mb, sizeof (mb)); + mb.signature = LE_16(MBB_MAGIC); + } bzero(&mb.parts, sizeof (mb.parts)); cp = (uchar_t *)&mb.parts[0]; /* bootable or not */ -- cgit v1.2.3