From b580e1fe9fd70ad149373fb65bb6bb01016a3b3d Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Thu, 24 Oct 2019 02:49:13 +0000 Subject: [PATCH] MFC r346969: zfsboot: to detect disk size, use GPT information first If we do have GPT on disk, read the disk size from it and do not call int13. Since int13 does report bogus informatiopn too often, rather trust the partition table. We are using the same strategy with loader. --- stand/i386/zfsboot/zfsboot.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/stand/i386/zfsboot/zfsboot.c b/stand/i386/zfsboot/zfsboot.c index 4ba47da3289..d46934a4f05 100644 --- a/stand/i386/zfsboot/zfsboot.c +++ b/stand/i386/zfsboot/zfsboot.c @@ -477,6 +477,33 @@ copy_dsk(struct zfsdsk *zdsk) return (newdsk); } +/* + * Get disk size from GPT. + */ +static uint64_t +drvsize_gpt(struct dsk *dskp) +{ +#ifdef GPT + struct gpt_hdr hdr; + char *sec; + + sec = dmadat->secbuf; + if (drvread(dskp, sec, 1, 1)) + return (0); + + memcpy(&hdr, sec, sizeof(hdr)); + if (memcmp(hdr.hdr_sig, GPT_HDR_SIG, sizeof(hdr.hdr_sig)) != 0 || + hdr.hdr_lba_self != 1 || hdr.hdr_revision < 0x00010000 || + hdr.hdr_entsz < sizeof(struct gpt_ent) || + DEV_BSIZE % hdr.hdr_entsz != 0) { + return (0); + } + return (hdr.hdr_lba_alt + 1); +#else + return (0); +#endif +} + /* * Get disk size from eax=0x800 and 0x4800. We need to probe both * because 0x4800 may not be available and we would like to get more @@ -493,6 +520,11 @@ drvsize_ext(struct zfsdsk *zdsk) dskp = &zdsk->dsk; + /* Try to read disk size from GPT */ + size = drvsize_gpt(dskp); + if (size != 0) + return (size); + v86.ctl = V86_FLAGS; v86.addr = 0x13; v86.eax = 0x800; -- 2.45.0