1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-15 10:17:20 +00:00

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.

MFC after:	1 month
This commit is contained in:
Toomas Soome 2019-04-30 17:45:22 +00:00
parent be1ef9be42
commit 3a1f80e2d7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=346969

View File

@ -459,6 +459,33 @@ copy_dsk(struct zfsdsk *zdsk)
return (newdsk); 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 * 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 * because 0x4800 may not be available and we would like to get more
@ -475,6 +502,11 @@ drvsize_ext(struct zfsdsk *zdsk)
dskp = &zdsk->dsk; dskp = &zdsk->dsk;
/* Try to read disk size from GPT */
size = drvsize_gpt(dskp);
if (size != 0)
return (size);
v86.ctl = V86_FLAGS; v86.ctl = V86_FLAGS;
v86.addr = 0x13; v86.addr = 0x13;
v86.eax = 0x800; v86.eax = 0x800;