summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
authorxl222276 <none@none>2008-06-16 21:30:50 -0700
committerxl222276 <none@none>2008-06-16 21:30:50 -0700
commit987e90dc68863b34c6e37d54acc6ae971386547d (patch)
treea9d4242896671adac03582f17bdddb1c28a368ce /usr/src/lib
parente33b3e6c8793812e1695af15ea0bf0fdf7993ce9 (diff)
downloadillumos-joyent-987e90dc68863b34c6e37d54acc6ae971386547d.tar.gz
6613137 write_pmbr() puts garbage in first 446 bytes on disk
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libefi/common/rdwr_efi.c14
1 files changed, 13 insertions, 1 deletions
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 */