From nobody Tue Oct 17 17:17:18 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4S90z25MZqz4xmFp; Tue, 17 Oct 2023 17:17:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4S90z24tBfz4WlS; Tue, 17 Oct 2023 17:17:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1697563038; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xImLEE7T8cP9ZSGnPJeLAllalnoqfR7Gth5I9+icoTE=; b=PQj+I9rgu6JKzF3M92Ig7vvTn1GmSa46+sAOWrsLwdh9wGU3z3sLcTevdKZdDmpfi/kVLb HEHB41gw/YOKAAci30OsuO995JbnsIj4moVEb3CxPswedw7VdloHfs+CWE8OmKOG/wUP69 Zakng3gHhnSjWxEdYfm32+9rGhV3WfdSI51tbzFduRvq0JCmRuNDmSQrp5VpfNmJYtvb0N VY+64mhAUPjxWX+kMoYKozStgaoBrPMvR759G8VZutkFgD+EEUVg0S2wi1lo8/v2wgbB6T 9lHXwZhWLQ8fuSGDAgvA8u7c1+GDyxrGB4LDvnWrRU8hmTqpzHVOo01DkGlQRQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1697563038; a=rsa-sha256; cv=none; b=gfbAp5GPvcNXCKhniRCcSbFYse/JH0yXnnbcH/KgkExpNfgXmCw43s4lyAtjOSGJVlTaCH GiZhPpReOp0o+PWcgLCRO8in3mkCh6EFrazi3VZtbogbKcd1A6ocQbnIAytOa0/rnUNkGO 5sBBfMCODslXnax0L0Y3bH+trquxHr/OhZ49757ME0fqVI9Rj+1en2aSVvqT2aKgKsIXqF kM8pxdMacbK5pXO+SFyOZO+EAwFDT5DVtb6eBzgGtqIXyxDdwxVac1/UQK7Q/rC6lfbGZq vg/lWDCdTNaJHd/kw3fGYLwT0pgljcRzS3K88dXzNf9FfmvXEKaxEwx39mGgdw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1697563038; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xImLEE7T8cP9ZSGnPJeLAllalnoqfR7Gth5I9+icoTE=; b=Kr6IPsF861IceKB/1FRHIHsVj9sC369PqBQ7OMJ3rejy4t2v7AgWhlrCo73lrUyzDYHxR8 QS0msNPlmlaOPyl39aiX+CKlORa3bdmAkt9K11GgFOZmPkWuyiUvPajHxe8XbTSndgqQon 05SDy4b2/WfFpLp13VenJQ7/1mjRj4XuWVRSfvUQlxXLO/bVdjwGEDqKsbhzBg76Hme2Ka Tsmw4EXBaLKruJqmFxgfvv4GDhYUUjiTJzweIrQD9cpqAssLkSWP5FcYUWGhsRcuc9oLMs jimPNt21CCyqEMTkRr1II1wXZB5SMbZu3+xcLcvv/BB8aXYrk0KJAqiwAfGeCA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4S90z23dk7zYVy; Tue, 17 Oct 2023 17:17:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 39HHHIDV063320; Tue, 17 Oct 2023 17:17:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 39HHHIWD063317; Tue, 17 Oct 2023 17:17:18 GMT (envelope-from git) Date: Tue, 17 Oct 2023 17:17:18 GMT Message-Id: <202310171717.39HHHIWD063317@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 9b42d3e12ffc - main - mkimg: Ensure GPT Entry Array is at least 16k List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9b42d3e12ffc6896fcb4e60c1b239ddf60705831 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=9b42d3e12ffc6896fcb4e60c1b239ddf60705831 commit 9b42d3e12ffc6896fcb4e60c1b239ddf60705831 Author: Warner Losh AuthorDate: 2023-10-17 17:14:14 +0000 Commit: Warner Losh CommitDate: 2023-10-17 17:14:23 +0000 mkimg: Ensure GPT Entry Array is at least 16k UEFI v2.10 Section 5.3 documentes that the minimum reserved space after the GPT header be at least 16kB. Enforce this minimum. Before, we'd only set the number of entries to be the unpadded size. gpart's selective enforcement of aspects of the GPT standard meant that these images would work, but couldn't be changed (to add a partition or grow the size of a partition). This ensures that gpart's overly picky standards don't cause problems for people wishing to, for example, resize release images. MFC after: 1 day (we want this in 14.0) PR: 274312 Sponsored by: Netflix Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D42245 --- sys/sys/disk/gpt.h | 7 +++++++ usr.bin/mkimg/gpt.c | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sys/sys/disk/gpt.h b/sys/sys/disk/gpt.h index e48b13684814..596a5cba1681 100644 --- a/sys/sys/disk/gpt.h +++ b/sys/sys/disk/gpt.h @@ -82,6 +82,13 @@ struct gpt_hdr { CTASSERT(offsetof(struct gpt_hdr, padding) == 92); #endif +/* + * The GPT standard (section 5.3 of UEFI standard version 2.10) requires + * we reserve at least 16k after the PMBR and the GPT header for the GPT + * Array Entries. + */ +#define GPT_MIN_RESERVED 16384 + struct gpt_ent { gpt_uuid_t ent_type; gpt_uuid_t ent_uuid; diff --git a/usr.bin/mkimg/gpt.c b/usr.bin/mkimg/gpt.c index 59c51a6a177b..ed3f008c394f 100644 --- a/usr.bin/mkimg/gpt.c +++ b/usr.bin/mkimg/gpt.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. */ -#include +#include #include #include #include @@ -124,13 +124,21 @@ crc32(const void *buf, size_t sz) return (crc ^ ~0U); } +/* + * Return the number of sectors needed to store the partition table. + */ static u_int gpt_tblsz(void) { - u_int ents; + u_int eps; /* Entries per Sector */ - ents = secsz / sizeof(struct gpt_ent); - return ((nparts + ents - 1) / ents); + /* + * Count the number of sectors needed for the GPT Entry Array to store + * the number of partitions defined for this image. Enforce the 16kB + * minimum space for the GPT Entry Array per UEFI v2.10 Section 5.3. + */ + eps = secsz / sizeof(struct gpt_ent); + return (MAX(howmany(GPT_MIN_RESERVED, secsz), howmany(nparts, eps))); } static lba_t