From 9ae4c2a48d1c00624011ff4c92f3f22b638e84b8 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 5 Mar 2019 02:53:41 +0000 Subject: [PATCH 01/93] Fix grammar. Submitted by: Massimiliano Stucchi --- usr.sbin/rtadvctl/rtadvctl.8 | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/usr.sbin/rtadvctl/rtadvctl.8 b/usr.sbin/rtadvctl/rtadvctl.8 index 4b7c888b4b17..be1586daf9bb 100644 --- a/usr.sbin/rtadvctl/rtadvctl.8 +++ b/usr.sbin/rtadvctl/rtadvctl.8 @@ -40,7 +40,7 @@ daemon .Op Ar interface ... .Sh DESCRIPTION .Nm -is a utility that communicates with +is a utility that communicates with the .Xr rtadvd 8 daemon and displays information about Router Advertisement messages being sent on each interface. @@ -63,21 +63,22 @@ The subcommands are as follows: .Bl -tag -width indent .\" .It reload Op interfaces... -Specifies to reload the configuration file. If one or more -.Ar interface -is specified, configuration entries for the interfaces will be reloaded +Specifies to reload the configuration file. +If one or more +.Ar interfaces +are specified, configuration entries for the interfaces will be reloaded selectively. .It enable interfaces... -Specifies to mark the interface as enable and to try to reload the +Specifies to mark the interface as enabled and to tries to reload the configuration entry. This subcommand is useful for dynamically-added interfaces. .Pp The .Xr rtadvd 8 -daemon marks an interface as enable if the interface exists and the -configuration file has a valid entry for that when it is invoked. +daemon marks an interface as enabled if the interface exists and the +configuration file has a valid entry for it when it is invoked. .It disable interfaces... -Specifies to mark the interface as disable. +Specifies to mark the interface as disabled. .It shutdown Makes the .Xr rtadvd 8 @@ -88,7 +89,7 @@ daemon will send several RAs with zero lifetime to invalidate the old information on each interface. It will take at most nine seconds. .It show Op interfaces... -Displays information on Router Advertisement messages being sent +Displays information about the Router Advertisement messages being sent on each interface. .El .Sh SEE ALSO From 96937e3b23a041cee5e39e4b8d7bc3cc3603c846 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 5 Mar 2019 04:15:34 +0000 Subject: [PATCH 02/93] Revert revision 254095 In revision 254095, gpt_entries is not set to match the on-disk hdr_entries, but rather is computed based on available space. There are 2 problems with this: 1. The GPT backend respects hdr_entries and only reads and writes that number of partition entries. On top of that, CRC32 is computed over the table that has hdr_entries elements. When the common code works on what is possibly a larger number, the behaviour becomes inconsistent and problematic. In particular, it would be possible to add a new partition that on a reboot isn't there anymore. 2. The calculation of gpt_entries is based on flawed assumptions. The GPT specification does not dictate that sectors are layed out in a particular way that the available space can be determined by looking at LBAs. In practice, implementations do the same thing, because there's no reason to do it any other way. Still, GPT allows certain freedoms that can be exploited in some form or shape if the need arises. PR: 229977 MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D19438 --- sys/geom/part/g_part_gpt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c index 5c93e8c67a73..e1bea703a154 100644 --- a/sys/geom/part/g_part_gpt.c +++ b/sys/geom/part/g_part_gpt.c @@ -990,10 +990,9 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) basetable->gpt_first = table->hdr->hdr_lba_start; basetable->gpt_last = table->hdr->hdr_lba_end; - basetable->gpt_entries = (table->hdr->hdr_lba_start - 2) * - pp->sectorsize / table->hdr->hdr_entsz; + basetable->gpt_entries = table->hdr->hdr_entries; - for (index = table->hdr->hdr_entries - 1; index >= 0; index--) { + for (index = basetable->gpt_entries - 1; index >= 0; index--) { if (EQUUID(&tbl[index].ent_type, &gpt_uuid_unused)) continue; entry = (struct g_part_gpt_entry *)g_part_new_entry( From bc2b9c015f6091052d9e77a87bcf8ae4d735a784 Mon Sep 17 00:00:00 2001 From: Justin Hibbits Date: Tue, 5 Mar 2019 04:16:50 +0000 Subject: [PATCH 03/93] Fix binutils compilation error with Clang 8 Summary: This change fixes the following compilation error when using clang 8 to cross compile base to powerpc64: ``` /usr/src/gnu/usr.bin/binutils/libopcodes/../../../../contrib/binutils/opcodes/ppc-dis.c:100:35: error: arithmetic on a null pointer treated as a cast from integer to pointer is a GNU extension [-Werror,-Wnull-pointer-arithmetic] info->private_data = (char *) 0 + dialect; ~~~~~~~~~~ ^ 1 error generated. *** [ppc-dis.o] Error code 1 make[6]: stopped in /usr/src/gnu/usr.bin/binutils/libopcodes 1 error ``` Test Plan: - buildworld for x86_64 (native) - buildworld for powerpc64 (cross) - buildworld for powerpc64 (native) Submitted by: alfredo.junior_eldorado.org.br Reviewed By: emaste, pfg, brooks Differential Revision: https://reviews.freebsd.org/D19235 --- contrib/binutils/opcodes/ppc-dis.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/binutils/opcodes/ppc-dis.c b/contrib/binutils/opcodes/ppc-dis.c index 2545a36f21a5..3fe78163ad08 100644 --- a/contrib/binutils/opcodes/ppc-dis.c +++ b/contrib/binutils/opcodes/ppc-dis.c @@ -20,6 +20,7 @@ along with this file; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include +#include #include "sysdep.h" #include "dis-asm.h" #include "opcode/ppc.h" @@ -97,7 +98,7 @@ powerpc_dialect (struct disassemble_info *info) dialect |= PPC_OPCODE_64; } - info->private_data = (char *) 0 + dialect; + info->private_data = (void *)(uintptr_t)dialect; return dialect; } From 5ea5849a7b62ba530f4ac289d8c9594f65bf54bb Mon Sep 17 00:00:00 2001 From: Kristof Provost Date: Tue, 5 Mar 2019 13:21:07 +0000 Subject: [PATCH 04/93] tun: VIMAGE fix for if_tun cloner The if_tun cloner is not virtualised, but if_clone_attach() does use a virtualised list of cloners. The result is that we can't find the if_tun cloner when we try to remove a renamed tun interface. Virtualise the cloner, and move the final cleanup into a sysuninit so that we're sure this happens after all of the vnet_sysuninits Note that we need unit numbers to be system-unique (rather than unique per vnet, as is done by if_clone_simple()). The unit number is used to create the corresponding /dev/tunX device node, and this node must match with the interface. Switch to if_clone_advanced() so that we have control over the unit numbers. Reproduction scenario: jail -c -n foo persist vnet jexec test ifconfig tun create jexec test ifconfig tun0 name wg0 jexec test ifconfig wg0 destroy PR: 235704 Reviewed by: bz, hrs, hselasky MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D19248 --- sys/net/if_tun.c | 105 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 80 insertions(+), 25 deletions(-) diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index c62862c9f11f..d5e6cc4975a3 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -105,6 +106,7 @@ struct tun_softc { * which is static after setup. */ static struct mtx tunmtx; +static eventhandler_tag tag; static const char tunname[] = "tun"; static MALLOC_DEFINE(M_TUN, tunname, "Tunnel Interface"); static int tundebug = 0; @@ -129,9 +131,12 @@ static int tunoutput(struct ifnet *, struct mbuf *, const struct sockaddr *, struct route *ro); static void tunstart(struct ifnet *); -static int tun_clone_create(struct if_clone *, int, caddr_t); -static void tun_clone_destroy(struct ifnet *); -static struct if_clone *tun_cloner; +static int tun_clone_match(struct if_clone *ifc, const char *name); +static int tun_clone_create(struct if_clone *, char *, size_t, caddr_t); +static int tun_clone_destroy(struct if_clone *, struct ifnet *); +static struct unrhdr *tun_unrhdr; +VNET_DEFINE_STATIC(struct if_clone *, tun_cloner); +#define V_tun_cloner VNET(tun_cloner) static d_open_t tunopen; static d_close_t tunclose; @@ -173,10 +178,34 @@ static struct cdevsw tun_cdevsw = { }; static int -tun_clone_create(struct if_clone *ifc, int unit, caddr_t params) +tun_clone_match(struct if_clone *ifc, const char *name) +{ + if (strncmp(tunname, name, 3) == 0 && + (name[3] == '\0' || isdigit(name[3]))) + return (1); + + return (0); +} + +static int +tun_clone_create(struct if_clone *ifc, char *name, size_t len, caddr_t params) { struct cdev *dev; - int i; + int err, unit, i; + + err = ifc_name2unit(name, &unit); + if (err != 0) + return (err); + + if (unit != -1) { + /* If this unit number is still available that/s okay. */ + if (alloc_unr_specific(tun_unrhdr, unit) == -1) + return (EEXIST); + } else { + unit = alloc_unr(tun_unrhdr); + } + + snprintf(name, IFNAMSIZ, "%s%d", tunname, unit); /* find any existing device, or allocate new unit number */ i = clone_create(&tunclones, &tun_cdevsw, &unit, &dev, 0); @@ -252,6 +281,7 @@ tun_destroy(struct tun_softc *tp) dev = tp->tun_dev; bpfdetach(TUN2IFP(tp)); if_detach(TUN2IFP(tp)); + free_unr(tun_unrhdr, TUN2IFP(tp)->if_dunit); if_free(TUN2IFP(tp)); destroy_dev(dev); seldrain(&tp->tun_rsel); @@ -263,8 +293,8 @@ tun_destroy(struct tun_softc *tp) CURVNET_RESTORE(); } -static void -tun_clone_destroy(struct ifnet *ifp) +static int +tun_clone_destroy(struct if_clone *ifc, struct ifnet *ifp) { struct tun_softc *tp = ifp->if_softc; @@ -272,39 +302,64 @@ tun_clone_destroy(struct ifnet *ifp) TAILQ_REMOVE(&tunhead, tp, tun_list); mtx_unlock(&tunmtx); tun_destroy(tp); + + return (0); } +static void +vnet_tun_init(const void *unused __unused) +{ + V_tun_cloner = if_clone_advanced(tunname, 0, tun_clone_match, + tun_clone_create, tun_clone_destroy); +} +VNET_SYSINIT(vnet_tun_init, SI_SUB_PROTO_IF, SI_ORDER_ANY, + vnet_tun_init, NULL); + +static void +vnet_tun_uninit(const void *unused __unused) +{ + if_clone_detach(V_tun_cloner); +} +VNET_SYSUNINIT(vnet_tun_uninit, SI_SUB_PROTO_IF, SI_ORDER_ANY, + vnet_tun_uninit, NULL); + +static void +tun_uninit(const void *unused __unused) +{ + struct tun_softc *tp; + + EVENTHANDLER_DEREGISTER(dev_clone, tag); + drain_dev_clone_events(); + + mtx_lock(&tunmtx); + while ((tp = TAILQ_FIRST(&tunhead)) != NULL) { + TAILQ_REMOVE(&tunhead, tp, tun_list); + mtx_unlock(&tunmtx); + tun_destroy(tp); + mtx_lock(&tunmtx); + } + mtx_unlock(&tunmtx); + delete_unrhdr(tun_unrhdr); + clone_cleanup(&tunclones); + mtx_destroy(&tunmtx); +} +SYSUNINIT(tun_uninit, SI_SUB_PROTO_IF, SI_ORDER_ANY, tun_uninit, NULL); + static int tunmodevent(module_t mod, int type, void *data) { - static eventhandler_tag tag; - struct tun_softc *tp; switch (type) { case MOD_LOAD: mtx_init(&tunmtx, "tunmtx", NULL, MTX_DEF); clone_setup(&tunclones); + tun_unrhdr = new_unrhdr(0, IF_MAXUNIT, &tunmtx); tag = EVENTHANDLER_REGISTER(dev_clone, tunclone, 0, 1000); if (tag == NULL) return (ENOMEM); - tun_cloner = if_clone_simple(tunname, tun_clone_create, - tun_clone_destroy, 0); break; case MOD_UNLOAD: - if_clone_detach(tun_cloner); - EVENTHANDLER_DEREGISTER(dev_clone, tag); - drain_dev_clone_events(); - - mtx_lock(&tunmtx); - while ((tp = TAILQ_FIRST(&tunhead)) != NULL) { - TAILQ_REMOVE(&tunhead, tp, tun_list); - mtx_unlock(&tunmtx); - tun_destroy(tp); - mtx_lock(&tunmtx); - } - mtx_unlock(&tunmtx); - clone_cleanup(&tunclones); - mtx_destroy(&tunmtx); + /* See tun_uninit, so it's done after the vnet_sysuninit() */ break; default: return EOPNOTSUPP; From 1efeb40d1dd72a9ba96ad8527802d4810ee78dab Mon Sep 17 00:00:00 2001 From: Hans Petter Selasky Date: Tue, 5 Mar 2019 14:47:15 +0000 Subject: [PATCH 05/93] Fix typos in libusb. Found by: Denis Ahrens MFC after: 1 week Sponsored by: Mellanox Technologies --- lib/libusb/libusb10.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index 09f4795afaa1..43199c089e7c 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -539,7 +539,7 @@ libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, if (ctx == NULL) return (NULL); /* be NULL safe */ - DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_width_vid_pid enter"); + DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_with_vid_pid enter"); if ((i = libusb_get_device_list(ctx, &devs)) < 0) return (NULL); @@ -563,7 +563,7 @@ libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id, } libusb_free_device_list(devs, 1); - DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_width_vid_pid leave"); + DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_with_vid_pid leave"); return (pdev); } From 3df898baed1e75943432ea30db4a99d85dbf1a4a Mon Sep 17 00:00:00 2001 From: Alexander Leidinger Date: Tue, 5 Mar 2019 15:23:28 +0000 Subject: [PATCH 06/93] remove the removed-from-source drm/drm2 parts --- tools/kerneldoc/subsys/Doxyfile-dev_drm | 21 --------------------- tools/kerneldoc/subsys/Doxyfile-dev_drm2 | 21 --------------------- 2 files changed, 42 deletions(-) delete mode 100644 tools/kerneldoc/subsys/Doxyfile-dev_drm delete mode 100644 tools/kerneldoc/subsys/Doxyfile-dev_drm2 diff --git a/tools/kerneldoc/subsys/Doxyfile-dev_drm b/tools/kerneldoc/subsys/Doxyfile-dev_drm deleted file mode 100644 index 435113b66db1..000000000000 --- a/tools/kerneldoc/subsys/Doxyfile-dev_drm +++ /dev/null @@ -1,21 +0,0 @@ -# Doxyfile 1.5.2 - -# $FreeBSD$ - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = "FreeBSD kernel DRM device code" -OUTPUT_DIRECTORY = $(DOXYGEN_DEST_PATH)/dev_drm/ -EXTRACT_ALL = YES # for undocumented src, no warnings enabled -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = $(DOXYGEN_SRC_PATH)/dev/drm/ \ - $(NOTREVIEWED) - -GENERATE_TAGFILE = dev_drm/dev_drm.tag - -@INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH) -@INCLUDE = common-Doxyfile - diff --git a/tools/kerneldoc/subsys/Doxyfile-dev_drm2 b/tools/kerneldoc/subsys/Doxyfile-dev_drm2 deleted file mode 100644 index 832124359749..000000000000 --- a/tools/kerneldoc/subsys/Doxyfile-dev_drm2 +++ /dev/null @@ -1,21 +0,0 @@ -# Doxyfile 1.5.2 - -# $FreeBSD$ - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = "FreeBSD kernel drm2 device code" -OUTPUT_DIRECTORY = $(DOXYGEN_DEST_PATH)/dev_drm2/ -EXTRACT_ALL = YES # for undocumented src, no warnings enabled -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = $(DOXYGEN_SRC_PATH)/dev/drm2/ \ - $(NOTREVIEWED) - -GENERATE_TAGFILE = dev_drm2/dev_drm2.tag - -@INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH) -@INCLUDE = common-Doxyfile - From 3846e5755f01ff3fa2b4d9a30ba213efd8f52ced Mon Sep 17 00:00:00 2001 From: Kristof Provost Date: Tue, 5 Mar 2019 15:49:30 +0000 Subject: [PATCH 07/93] tun tests: Test renaming and destroying a tun interface in a vnet jail There was a problem destroying renamed tun interfaces in vnet jails. This was fixed in r344794. Test the previously failing scenario. PR: 235704 MFC after: 2 weeks --- tests/sys/net/Makefile | 1 + tests/sys/net/if_tun_test.sh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100755 tests/sys/net/if_tun_test.sh diff --git a/tests/sys/net/Makefile b/tests/sys/net/Makefile index 681a1408ab17..03e0631f6251 100644 --- a/tests/sys/net/Makefile +++ b/tests/sys/net/Makefile @@ -7,6 +7,7 @@ BINDIR= ${TESTSDIR} ATF_TESTS_SH+= if_lagg_test ATF_TESTS_SH+= if_clone_test +ATF_TESTS_SH+= if_tun_test # The tests are written to be run in parallel, but doing so leads to random # panics. I think it's because the kernel's list of interfaces isn't properly diff --git a/tests/sys/net/if_tun_test.sh b/tests/sys/net/if_tun_test.sh new file mode 100755 index 000000000000..64dc004e3a06 --- /dev/null +++ b/tests/sys/net/if_tun_test.sh @@ -0,0 +1,30 @@ +# $FreeBSD$ + +. $(atf_get_srcdir)/../common/vnet.subr + +atf_test_case "235704" "cleanup" +235704_head() +{ + atf_set descr "Test PR #235704" + atf_set require.user root +} + +235704_body() +{ + vnet_init + vnet_mkjail one + + tun=$(jexec one ifconfig tun create) + jexec one ifconfig ${tun} name foo + atf_check -s exit:0 jexec one ifconfig foo destroy +} + +235704_cleanup() +{ + vnet_cleanup +} + +atf_init_test_cases() +{ + atf_add_test_case "235704" +} From 80a8c751ea386e8a8f20e03f9dcc332745186484 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Tue, 5 Mar 2019 16:18:06 +0000 Subject: [PATCH 08/93] libllvm: promote WithColor and xxhash to SRCS_MIN The armv6 build failed in CI due to missing symbols (from these two source files) in the bootstrap Clang. This affected only armv6 because other Clang-using archs are using LLD as the bootstrap linker, and thus include SRCS_MIW via LLD_BOOTSTRAP. Reported by: CI, via lwhsu Sponsored by: The FreeBSD Foundation --- lib/clang/libllvm/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/clang/libllvm/Makefile b/lib/clang/libllvm/Makefile index 5b351e015893..6ed3701dd9ee 100644 --- a/lib/clang/libllvm/Makefile +++ b/lib/clang/libllvm/Makefile @@ -866,7 +866,7 @@ SRCS_MIN+= Support/UnicodeCaseFold.cpp SRCS_MIN+= Support/Valgrind.cpp SRCS_MIN+= Support/VirtualFileSystem.cpp SRCS_MIN+= Support/VersionTuple.cpp -SRCS_MIW+= Support/WithColor.cpp +SRCS_MIN+= Support/WithColor.cpp SRCS_MIN+= Support/YAMLParser.cpp SRCS_MIN+= Support/YAMLTraits.cpp SRCS_MIN+= Support/circular_raw_ostream.cpp @@ -877,7 +877,7 @@ SRCS_MIN+= Support/regerror.c SRCS_MIN+= Support/regexec.c SRCS_MIN+= Support/regfree.c SRCS_MIN+= Support/regstrlcpy.c -SRCS_MIW+= Support/xxhash.cpp +SRCS_MIN+= Support/xxhash.cpp SRCS_MIN+= TableGen/Error.cpp SRCS_MIN+= TableGen/JSONBackend.cpp SRCS_MIN+= TableGen/Main.cpp From bc408c7d61bdb1ec5df9888299a750b71054644f Mon Sep 17 00:00:00 2001 From: Eric Joyner Date: Tue, 5 Mar 2019 19:12:51 +0000 Subject: [PATCH 09/93] Remove references to CONTIGMALLOC_WORKS in iflib and em From Jake: "The iflib_fl_setup() function tries to pick various buffer sizes based on the max_frame_size value defined by the parent driver. However, this code was wrapped under CONTIGMALLOC_WORKS, which was never actually defined anywhere. This same code pattern was used in if_em.c, likely trying to match what iflib uses. Since CONTIGMALLOC_WORKS is not defined, remove this dead code from iflib_fl_setup and if_em.c Given that various iflib drivers appear to be using a similar calculation, it might be worth making this buffer size a value that the driver can peek at in the future." Submitted by: Jacob Keller Reviewed by: shurd@ MFC after: 1 week Sponsored by: Intel Corporation Differential Revision: https://reviews.freebsd.org/D19199 --- sys/dev/e1000/if_em.c | 7 ------- sys/net/iflib.c | 9 --------- 2 files changed, 16 deletions(-) diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index d41d8aa30512..e25e102a2da1 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -1276,15 +1276,8 @@ em_if_init(if_ctx_t ctx) */ if (adapter->hw.mac.max_frame_size <= 2048) adapter->rx_mbuf_sz = MCLBYTES; -#ifndef CONTIGMALLOC_WORKS else adapter->rx_mbuf_sz = MJUMPAGESIZE; -#else - else if (adapter->hw.mac.max_frame_size <= 4096) - adapter->rx_mbuf_sz = MJUMPAGESIZE; - else - adapter->rx_mbuf_sz = MJUM9BYTES; -#endif em_initialize_receive_unit(ctx); /* Use real VLAN Filter support? */ diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 51d980cd1026..b803c4b3ca1f 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -2187,17 +2187,8 @@ iflib_fl_setup(iflib_fl_t fl) */ if (sctx->isc_max_frame_size <= 2048) fl->ifl_buf_size = MCLBYTES; -#ifndef CONTIGMALLOC_WORKS else fl->ifl_buf_size = MJUMPAGESIZE; -#else - else if (sctx->isc_max_frame_size <= 4096) - fl->ifl_buf_size = MJUMPAGESIZE; - else if (sctx->isc_max_frame_size <= 9216) - fl->ifl_buf_size = MJUM9BYTES; - else - fl->ifl_buf_size = MJUM16BYTES; -#endif if (fl->ifl_buf_size > ctx->ifc_max_fl_buf_size) ctx->ifc_max_fl_buf_size = fl->ifl_buf_size; fl->ifl_cltype = m_gettype(fl->ifl_buf_size); From 3f877103dddece9ffe76c8ba602bbf47a1058e7b Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Tue, 5 Mar 2019 19:17:24 +0000 Subject: [PATCH 10/93] freebsd-update.8: update example to contemporary versions PR: 235761 Reported by: linimon MFC after: 1 week --- usr.sbin/freebsd-update/freebsd-update.8 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/usr.sbin/freebsd-update/freebsd-update.8 b/usr.sbin/freebsd-update/freebsd-update.8 index 45f0dba8b770..ea9bd5b279f2 100644 --- a/usr.sbin/freebsd-update/freebsd-update.8 +++ b/usr.sbin/freebsd-update/freebsd-update.8 @@ -59,13 +59,13 @@ by the .Fx Release Engineering Team, e.g., .Fx -10.3-RELEASE and +11.2-RELEASE and .Fx -11.0-RELEASE, but not +12.0-RELEASE, but not .Fx -10.3-STABLE or +11.2-STABLE or .Fx -12-CURRENT. +13.0-CURRENT. .Sh OPTIONS The following options are supported: .Bl -tag -width "-r newrelease" From 6a855903707745c072f45e041ffa2f69b82cfb62 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 5 Mar 2019 19:45:37 +0000 Subject: [PATCH 11/93] Show wiring state of map entries in procstat -v. Note that only entries wired by userspace are shown as such. In particular, entries transiently wired by sysctl_wire_old_buffer() are not flagged as wired in procstat -v output. Reviewed by: kib (previous version) MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D19461 --- sys/kern/kern_proc.c | 2 ++ sys/sys/user.h | 1 + usr.bin/procstat/procstat.1 | 9 ++++++++- usr.bin/procstat/procstat_vm.c | 8 ++++++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 61ac3016ea28..0bd19c798127 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -2487,6 +2487,8 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags) kve->kve_flags |= KVME_FLAG_GROWS_UP; if (entry->eflags & MAP_ENTRY_GROWS_DOWN) kve->kve_flags |= KVME_FLAG_GROWS_DOWN; + if (entry->eflags & MAP_ENTRY_USER_WIRED) + kve->kve_flags |= KVME_FLAG_USER_WIRED; last_timestamp = map->timestamp; vm_map_unlock_read(map); diff --git a/sys/sys/user.h b/sys/sys/user.h index 34adfc2b5905..db98abb5aeff 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -471,6 +471,7 @@ struct kinfo_file { #define KVME_FLAG_SUPER 0x00000008 #define KVME_FLAG_GROWS_UP 0x00000010 #define KVME_FLAG_GROWS_DOWN 0x00000020 +#define KVME_FLAG_USER_WIRED 0x00000040 #if defined(__amd64__) #define KINFO_OVMENTRY_SIZE 1168 diff --git a/usr.bin/procstat/procstat.1 b/usr.bin/procstat/procstat.1 index 66a791cf5042..f0a9c6242dab 100644 --- a/usr.bin/procstat/procstat.1 +++ b/usr.bin/procstat/procstat.1 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 14, 2017 +.Dd March 4, 2019 .Dt PROCSTAT 1 .Os .Sh NAME @@ -662,6 +662,11 @@ one or more superpage mappings are used grows down (top-down stack) .It U grows up (bottom-up stack) +.It W +pages in this range are locked by +.Xr mlock 2 +or +.Xr mlockall 2 .El .Ss ELF Auxiliary Vector Display ELF auxiliary vector values: @@ -684,6 +689,8 @@ auxiliary vector value .Xr sockstat 1 , .Xr cap_enter 2 , .Xr cap_rights_limit 2 , +.Xr mlock 2 , +.Xr mlockall 2 , .Xr libprocstat 3 , .Xr libxo 3 , .Xr signal 3 , diff --git a/usr.bin/procstat/procstat_vm.c b/usr.bin/procstat/procstat_vm.c index de09ab6a03bb..aa8bc3a10096 100644 --- a/usr.bin/procstat/procstat_vm.c +++ b/usr.bin/procstat/procstat_vm.c @@ -53,7 +53,7 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) ptrwidth = 2*sizeof(void *) + 2; if ((procstat_opts & PS_OPT_NOHEADER) == 0) - xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %-4s %-2s %-s}\n", + xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %-5s %-2s %-s}\n", "PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES", "PRES", "REF", "SHD", "FLAG", "TP", "PATH"); @@ -98,9 +98,11 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) KVME_FLAG_NEEDS_COPY ? "N" : "-"); xo_emit("{d:super_pages/%-1s}", kve->kve_flags & KVME_FLAG_SUPER ? "S" : "-"); - xo_emit("{d:grows_down/%-1s} ", kve->kve_flags & + xo_emit("{d:grows_down/%-1s}", kve->kve_flags & KVME_FLAG_GROWS_UP ? "U" : kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "D" : "-"); + xo_emit("{d:wired/%-1s} ", kve->kve_flags & + KVME_FLAG_USER_WIRED ? "W" : "-"); xo_open_container("kve_flags"); xo_emit("{en:copy_on_write/%s}", kve->kve_flags & KVME_FLAG_COW ? "true" : "false"); @@ -112,6 +114,8 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) KVME_FLAG_GROWS_UP ? "true" : "false"); xo_emit("{en:grows_down/%s}", kve->kve_flags & KVME_FLAG_GROWS_DOWN ? "true" : "false"); + xo_emit("{en:wired/%s}", kve->kve_flags & + KVME_FLAG_USER_WIRED ? "true" : "false"); xo_close_container("kve_flags"); switch (kve->kve_type) { case KVME_TYPE_NONE: From 0a4621159be68e49c08e9228630b394e188dcbbb Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Tue, 5 Mar 2019 22:04:23 +0000 Subject: [PATCH 12/93] Add a few missed files to the MK_LLVM_TARGET_BPF=yes case, otherwise clang and various other executables will fail to link with undefined symbols. Reported by: O. Hartmann MFC after: 1 month X-MFC-With: r344779 --- lib/clang/libllvm/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/clang/libllvm/Makefile b/lib/clang/libllvm/Makefile index 6ed3701dd9ee..52e2d6355997 100644 --- a/lib/clang/libllvm/Makefile +++ b/lib/clang/libllvm/Makefile @@ -1011,11 +1011,13 @@ SRCS_MIN+= Target/BPF/BPFISelDAGToDAG.cpp SRCS_MIN+= Target/BPF/BPFISelLowering.cpp SRCS_MIN+= Target/BPF/BPFInstrInfo.cpp SRCS_MIN+= Target/BPF/BPFMCInstLower.cpp +SRCS_MIN+= Target/BPF/BPFMIChecking.cpp SRCS_MIN+= Target/BPF/BPFMIPeephole.cpp SRCS_MIN+= Target/BPF/BPFRegisterInfo.cpp SRCS_MIN+= Target/BPF/BPFSelectionDAGInfo.cpp SRCS_MIN+= Target/BPF/BPFSubtarget.cpp SRCS_MIN+= Target/BPF/BPFTargetMachine.cpp +SRCS_MIN+= Target/BPF/BTFDebug.cpp SRCS_MIN+= Target/BPF/Disassembler/BPFDisassembler.cpp SRCS_MIN+= Target/BPF/InstPrinter/BPFInstPrinter.cpp SRCS_MIN+= Target/BPF/MCTargetDesc/BPFAsmBackend.cpp From 835adc6898cfb0725e60e5279acdb822280acd76 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 5 Mar 2019 22:55:33 +0000 Subject: [PATCH 13/93] Round # partitions up to fill the last GPT table sector Set the number of partitions entries in the GPT header to a multiple of the number of entries that fit in a sector. PR: 236238 Reviewed by: imp MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D19465 --- usr.bin/mkimg/gpt.c | 4 +- usr.bin/mkimg/tests/Makefile | 2 +- .../mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu | 256 +++++++++--------- .../mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu | 44 +-- .../mkimg/tests/img-1x1-4096-gpt.raw.gz.uu | 23 +- .../mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu | 36 +-- .../mkimg/tests/img-1x1-4096-gpt.vhdf.gz.uu | 30 +- .../mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu | 138 +++++----- .../mkimg/tests/img-1x1-512-gpt.qcow.gz.uu | 256 +++++++++--------- .../mkimg/tests/img-1x1-512-gpt.qcow2.gz.uu | 44 +-- usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu | 22 +- usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu | 36 +-- .../mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu | 30 +- .../mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu | 154 +++++------ .../tests/img-63x255-4096-gpt.qcow.gz.uu | 256 +++++++++--------- .../tests/img-63x255-4096-gpt.qcow2.gz.uu | 45 +-- .../mkimg/tests/img-63x255-4096-gpt.raw.gz.uu | 23 +- .../mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu | 36 +-- .../tests/img-63x255-4096-gpt.vhdf.gz.uu | 30 +- .../tests/img-63x255-4096-gpt.vmdk.gz.uu | 168 ++++++------ .../mkimg/tests/img-63x255-512-gpt.qcow.gz.uu | 256 +++++++++--------- .../tests/img-63x255-512-gpt.qcow2.gz.uu | 44 +-- .../mkimg/tests/img-63x255-512-gpt.raw.gz.uu | 22 +- .../mkimg/tests/img-63x255-512-gpt.vhd.gz.uu | 38 +-- .../mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu | 30 +- .../mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu | 168 ++++++------ 26 files changed, 1097 insertions(+), 1094 deletions(-) diff --git a/usr.bin/mkimg/gpt.c b/usr.bin/mkimg/gpt.c index a8a9ac999c4e..b386ef6bc208 100644 --- a/usr.bin/mkimg/gpt.c +++ b/usr.bin/mkimg/gpt.c @@ -259,9 +259,9 @@ gpt_write(lba_t imgsz, void *bootcode) le64enc(&hdr->hdr_lba_end, imgsz - tblsz - 2); mkimg_uuid(&uuid); mkimg_uuid_enc(&hdr->hdr_uuid, &uuid); - le32enc(&hdr->hdr_entries, nparts); + le32enc(&hdr->hdr_entries, tblsz * secsz / sizeof(struct gpt_ent)); le32enc(&hdr->hdr_entsz, sizeof(struct gpt_ent)); - crc = crc32(tbl, nparts * sizeof(struct gpt_ent)); + crc = crc32(tbl, tblsz * secsz); le32enc(&hdr->hdr_crc_table, crc); error = gpt_write_hdr(hdr, 1, imgsz - 1, 2); if (!error) diff --git a/usr.bin/mkimg/tests/Makefile b/usr.bin/mkimg/tests/Makefile index d934c72f90e1..259ee78ef23b 100644 --- a/usr.bin/mkimg/tests/Makefile +++ b/usr.bin/mkimg/tests/Makefile @@ -18,6 +18,6 @@ $f: $f.gz.uu CLEANFILES+= ${${PACKAGE}FILES}} rebase: .PHONY - (cd ${.CURDIR}; atf-sh ${_REBASE_SCRIPT}.sh rebase) + (cd ${.CURDIR}; /usr/libexec/atf-sh ${_REBASE_SCRIPT}.sh rebase) .include diff --git a/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu b/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu index 3fa74dba68a4..7300262f39ac 100644 --- a/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow.gz.uu @@ -1,132 +1,132 @@ # $FreeBSD$ begin 644 img-1x1-4096-gpt.qcow.gz -M'XL(",]Q+ED``VEM9RTQ>#$M-#`Y-BUG<'0N<6-O=RYO=70`K9W+CAS7L47G -M^HKDFVR2S8J(S*Q,OFW`!CR3C7MG]P+.Y]`HS_GQ[NH^C^ZHO1D6V!(A4"!R -MH^IP]2I*6CH\'.[^:)I.FK9OVK'9Y^;F[],W:>[]S<-OS8^___5OU_?_^/'; -MW9@Y`3Y%N).0NQ$^1;B3D+L)/D6XDY"[ -M&3Y%N).0NP4^1;B3D+L5/D6XTY"[#3Y%N".?%_>XV^%3A#N-N!/\%.%.(^X$ -M^4X9=QIQ)\AWRKC3B#M!OE/&G4;<"?*=,NXTXDZ0[Y1Q9Q%W@GQGC#N+N!/D -M.V/<6<@=\ITQ[BSD#OG.&'<6*GR+]:QET;<:?(=RWCKHNX4^2[CG'71=PI\EW'N.M"[I#O.L9=%W*'?-' -MW"'?S8R[.>0.^6YFW,TA=\AW,^-N#KE#OIL9=W/('?+=S+B;0^Z0[V;&W1)R -MAWRW,.Z6D#ODNX5QMT3<]?@IPMT2<=^6QAW2\1=CWRW,.Z6 -MB+L>^6YAW"T1=SWRW<*X6R/N>N2[E7&W1MSUR'2O\/G@._D0+B30\@=\)T<"'=RB+@;\%.8 -M.PG[NP'X3EA_)V%_-P#?">OO).SO!N`[8?V=A/W=`'PGK+^3L+\;@.^$]7<2 -M]G<#\)VP_D["_FX`OA/6WTG8WPW`=\+Z.PG[NP'X3EA_)V%_-P#?">OO).SO -M!N`[8?V=A/W=`'PGK+^3L+\;@.^$]7<2]G<#\AWK[R3L[P;D.];?2=C?C?@I -MPEW8WXW(=ZR_D["_&Y'O6'\G87\W(M^Q_D["_FY$OF/]G83]W8A\Q_H["?N[ -M$?F.]7<2]G]8?R=A?SOO).SO)OP4X2[L[R;D -M.];?2=C?3OO).SO)N0[UM])V-]-R'>LOY.POYN0[UA_)V%_-R'? -ML?Y.POYN0KYC_9V$_=V$?,?Z.PG[NPGYCO5W$O9W,WZ*OO).SO -M9N0[UM])V-_-R'>LOY.POYN1[UA_)V%_-R/?L?Y.POYN1KYC_9V$_=V,?,?Z -M.PG[NQGYCO5W$O9W,_(=Z^\D[.]FY#O6WTG8W\W(=ZR_D["_FY'O6'\G87\W -M(]^Q_D["_FY&OF/]G83]W8Q\Q_H["?N[!3]%N`O[NP7YCO5W$O9W"_(=Z^\D -M[.\6Y#O6WTG8WRW(=ZR_D["_6Y#O6'\G87^W(-^Q_D["_FY!OF/]G83]W8)\ -MQ_H["?N[!?F.]7<2]G<+\AWK[R3L[Q;D.];?2=C?+]8?R=A?[OO).SO5N0[UM])V-^MR'>LOY.POUN1[UA_ -M)V%_MR+?L?Y.POYNPT\1[L+^;D.^8_V=A/W=AGS'^CL)^[L-^8[U=Q+V=QOR -M'>OO).SO-N0[UM])V-]MR'>LOY.PO]N0[UA_)V%_MR'?L?Y.POYN0[YC_9V$ -M_=V&?,?Z.PG[NPWYCO5W$O9W&_(=Z^\D[.\VY#O6WTG8WVW(=ZR_D["_VY#O -M6'\G87^WXZ<(=V%_MR/?L?Y.POYN1[YC_9V$_=V.?,?Z.PG[NQWYCO5W$O9W -M._(=Z^\D[.]VY#O6WTG8W^W(=ZR_D["_VY'O6'\G87^W(]^Q_D["_FY'OF/] -MG83]W8Y\Q_H["?N['?F.]7<2]G<[\AWK[S1_Q\TU=0[X[N8IS)VZ_B[?I]=4 -M[H#OE/5WZOJ[)G'79.[L@)_"W*GK[YK$7?//,@=\IZR_4]??-2=W=H;NOU/6 -MWZGK[\K9U3G@.V7]G;K^#LP!WRGK[]3U=V`.^$Y9?Z>NO\MS3^H<\)VR_DY= -M?_+ -MLP.^4];?J>OORMG5.>`[9?V=NOX.S`'?*>OOU/5W8`[X3EE_IZZ_RW-/ZQSR -M'>OOU/5W3_-GOS9H?OOE/5WZOJ[LOU/7WSW+>USGD.];?J>OOGN>YRAWR'>OOU/5WSQ-WSPMWZ/X[9?V=NO[N>>+N>>$. -MW7^GK+]3U]\]/_FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J^CLPAWS' -M^CMU_5V>>U'GD.]8?Z>NOWN1YPIWZ/X[9?V=NO[N1>+N1>4.^8[U=^KZNQ>) -MNQ>5.^0[UM^IZ^]>G"[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z.W7]'9A# -MOF/]G;K^+L^]K'/(=ZR_4]??OOO7B;N7A;NT/UWROH[=?W= -MR\3=R\(=NO].67^GKK][>?)GA^Z_4];?J>OORMG5.>0[UM^IZ^_`'/(=Z^_4 -M]7=@#OF.]7?J^KL\]ZK.(=^Q_DY=?_>0[UA_IZZ_>YWG*G?(=ZR_4]??O4[0[UM^IZ^_`'/(=Z^_4]7=Y[DV=0[YC_9VZ_NY-GBO>0[UA_IZZ_N\ISE3OD.];?J>OOKA)W -M5X4[=/^=LOY.77]WE;B[*MRA^^^4]7?J^KNKDS\[=/^=LOY.77]7SJ[.(=^Q -M_DY=?P?FD.]8?Z>NOP-SR'>LOU/7W^6YMW4.^8[U=^KZN[=YKG"'[K]3UM^I -MZ^_>)N[>5NZ0[UA_IZZ_>YNX>UNY0[YC_9VZ_N[MZ>+LD.]8?Z>NORMG5^>0 -M[UA_IZZ_`W/(=ZR_4]??@3GD.];?J>OO\MR[.H=\Q_H[=?W=NSQ7N4.^8_V= -MNO[N7>+N7>$.W7^GK+]3U]^]2]R]*]RA^^^4]7?J^KMW)W]VZ/X[9?V=NOZN -MG%V=0[YC_9VZ_@[,(=^Q_DY=?P?FD.]8?Z>NO\MS[^L<\AWK[]3U=^_S7.$. -MW7^GK+]3U]^]3]R]K]PAW['^3EU_]SYQ][YRAWS'^CMU_=W[T\79(=^Q_DY= -M?U?.KLXAW['^3EU_!^:0[UA_IZZ_`W/(=ZR_4]??Y;GK.H=\Q_H[C?H[0_?? -M*>OO-.KO#-U_IZR_TZB_,W3_G;+^3J/^SM#]=\KZ.XWZ.T/WWRGK[S3J[PS= -M?Z>LO].HOS-T_YVR_DY)?_>ASB'?L?Y.77_W(<\5[M#]=\KZ.W7]W8?$W8?* -M'?(=Z^_4]7OOU/5WY>SJ'/(=Z^_4]7=@ -M#OF.]7?J^CLPAWS'^CO+WW%SASH'?&>LO[OY@0?<93\=*G?`=\;Z.W/]W2'M -M'0IWZ/X[8_V=N?[ND+@[%.[0_7?&^CMS_=WAY,\.W7]GK+\SU]^5LZMSP'?& -M^CMS_1V8`[XSUM^9Z^_`'/"=L?[.7'^7YZ3.`=\9Z^_,]7>2YPIWZ/X[8_V= -MN?Y.TLN3RAWPG;'^SEQ_)XD[J=P!WQGK[\SU=W*Z.#O@.V/]G;G^KIQ=G0.^ -M,];?F>OOP!SPG;'^SEQ_!^:`[XSU=^;ZNSRG=0[YCO5WYOH[S7.5.^0[UM^9 -MZ^\T<:>%.W3_G;'^SEQ_IXD[+=RA^^^,]7?F^CL]^;-#]]\9Z^_,]7?E[.H< -M\AWK[\SU=V`.^8[U=^;Z.S"'?,?Z.W/]79ZS.H=\Q_H[<_V=Y;G"';K_SEA_ -M9ZZ_L\2=5>Z0[UA_9ZZ_L\2=5>Z0[UA_9ZZ_L]/%V2'?L?[.7']7SJ[.(=^Q -M_LYNOP-SR'>LOS/7W^6YMLXAW['^SEQ_U^:YRAWR'>OOS/5W -M;>*N+=RA^^^,]7?F^KLV<=<6[M#]=\;Z.W/]77OR9X?NOS/6WYGK[\K9U3GD -M.];?F>OOP!SR'>OOS/5W8`[YCO5WYOJ[/-?5.>0[UM^9Z^^Z/%>X0_??&>OO -MS/5W7>*NJ]PAW['^SEQ_UR7NNLH=\AWK[\SU=]WIXNR0[UA_9ZZ_*V=7YY#O -M6']GKK\#<\AWK+\SU]^!.>0[UM^9Z^_R7%_GD.]8?V>NO^OS7.4.^8[U=^;Z -MNSYQUQ?NT/UWQOH[<_U=G[CK"W?H_CMC_9VY_JX_^;-#]]\9Z^_,]7?E[.H< -M\AWK[\SU=V`.^8[U=^;Z.S"'?,?Z.W/]79X[UCGD.];?F>OOCGFN<(?NOS/6 -MWYGK[XZ)NV/E#OF.]7?F^KMCXNY8N4.^8_V=N?[N>+HX.^0[UM^9Z^_*V=4Y -MY#O6WYGK[\`<\AWK[\SU=V`.^8[U=^;ZNSPWU#GD.];?F>OOACQ7N4.^8_V= -MN?YN2-P-A3MT_YVQ_LYOOQL3=6+E#OF/]G;G^;CQ=G!WR'>OOS/5WY>SJ -M'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^UCGD.]8?V>NO_N8YRIWR'>L -MOS/7WWU,W'TLW*'[[XSU=^;ZNX^)NX^%.W3_G;'^SEQ_]_'DSP[=?V>LOS/7 -MWY6SJW/(=ZR_,]??@3GD.];?F>OOP!SR'>OOS/5W>>Y3G4.^8_V=N?[N4YXK -MW*'[[XSU=^;ZNT^)NT^5.^0[UM^9Z^\^)>X^5>Z0[UA_9ZZ_^W2Z.#OD.];? -MF>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\][G.(=^Q_LYNO_NNORMG5^>0[UA_9ZZ_`W/(=ZR_,]??@3GD.];?F>OO\MR7.H=\Q_H[ -M<_W=ESQ7N$/WWQGK[\SU=U\2=U\J=\AWK+\SU]]]2=Q]J=PAW['^SEQ_]^5T -M<7;(=ZR_,]??E;.K<\AWK+\SU]^!.>0[UM^9Z^_`'/(=Z^_,]7=Y[FN=0[YC -M_9VY_NYKGJO<(=^Q_LYU<(?NOS/6WYGK[[XF[KX6[M#]=\;Z.W/] -MW=>3/SMT_YVQ_LY0[UM^U^3MN -M[GN=`[YK67_7NO[N>YZKW`'?W3R%N6M=?_<]\%/D]SUV;_9[[HVO -MRQSZ_;;+4\'8.Z2#T[?Z_?[MW -M<[GG>>,SCW!<[ -M;O[/B_SM-@_GP*_T?NWTSK]>F;M'.[TQP8*^\1^@IS?=G1X^I//IP2^9'_>O -M$;T_!WZ]\BNGU]]^:IP_8R?P5_X#/WZ_?OCGW6";!A_M%=X,+H_XU7&>>\2O -MCO/<(WYUG.<>]:OC//B(7QWGN4?\ZCC//>)7QWGN4;\Z;@9O_YWC(WV(G^?D -M[F-R7YM!F\W^_F'^/9'W^PC -8?HB?YQ[U0[P]'&^\]]M_`$CJT>#UK``` +M'XL("-N7?5P``VEM9RTQ>#$M-#`Y-BUG<'0N<6-O=RYO=70`K9W);ES9L47G +M]16IOJ#/)TY"1>S-LB"JAH()\MS./ +M%A=55:L.C\?;;X=#*X>F.S3C89\/UW^=OLOASE_<_W[X^=<__^7J[K>?O]V. +MR?&!I]Q?-WK0-'=OZX^',J?GIY;#[^TJ>;LM&^SN#?Z>YOZ17I^2 +MM]NSN>'>W,F]725O=V1STX.P*(%E9G-+,-?`IU8VMP5S+7QJQW/RP*_M[5P' +MGQ(V!S]NKPYEKH=/&9MK[LT=KS+0>6Z`3Q'N).1NA$\1[B3D;H)/$>XDY&Z& +M3Q'N).1N@4\1[B3D;H5/$>XTY&Z#3Q'NR.>+.]SM\"G"G4;<"7Z*<*<1=X)\ +MIXP[C;@3Y#MEW&G$G2#?*>-.(^X$^4X9=QIQ)\AWRKBSB#M!OC/&G47<"?*= +M,>XLY`[YSAAW%G*'?&>,.PNY0[XSQIV%W"'?&>/.0NZ0[XQQ9R%WR'?&N&M" +M[I#O&L9=$W*'?-Z:B#M%OFL8=TW$G2+?-8R[)N).D>\:QET3 +M<:?(=PWCKHFX4^2[AG'71MPI\EW+N&LC[A3YKF7&GR+<=1%WAGS7,>ZZB#M#ONL8=UW$G2'?=8R[+N+.D.\ZQET7<6?(=QWC +MKH^X,^2[GG'71]P9\EW/N.M#[I#O>L9='W*'?-*N0;X;&'=#Q%V#?#>0[T;&W1AQ +MUR#?C8R[,>0.^6YDW(TA=\AW(^-N#+E#OAL9=V/('?+=R+@;0^Z0[T;&W1AR +MAWPW,NZFD#ODNXEQ-X7<(=]-C+LIXJ[%3Q'NIHB[%OEN8MQ-$7\FQEW^UY!\#OEN9MS-$7*N0[Y;&'=+Q%V' +M?+&W"'?K8R[->0.^6YEW*TA +M=\AW*^-N#;E#OEL9=VO('?+=RKA;0^Z0[U;&W19RAWRW,>ZVD#ODNXUQMT7< +M]?@IPMT6<=^VQAW6\1=CWRW,>ZVB+L>^6YCW&T1=SWRW<:X +MVR/N>N2[G7&W1]SUR'<[XVX/N4.^VQEW>\@=\MW.N-M#[I#O=L;='G*'?+OO).SO!N`[8?V=A/W=`'PGK+^3L+\;@.^$]7<2]G<#\)VP +M_D["_FX`OA/6WTG8WPW`=\+Z.PG[NP'YCO5W$O9W`_(=Z^\D[.]&_!3A+NSO +M1N0[UM])V-^-R'>LOY.POQN1[UA_)V%_-R+?L?Y.POYN1+YC_9V$_=V(?,?Z +M.PG[NQ'YCO5W$O9W(_(=Z^\D[.]&Y#O6WTG8WXW(=ZR_D["_&Y'O6'\G87\W +M(M^Q_D["_FY$OF/]G83]W8A\Q_H["?N[$?F.]7<2]G<3?HIP%_9W$_(=Z^\D +M[.\FY#O6WTG8WTW(=ZR_D["_FY#O6'\G87\W(=^Q_D["_FY"OF/]G83]W81\ +MQ_H["?N["?F.]7<2]G<3\AWK[R3L[R;D.];?2=C?3]8?R=A?SOO).SO9N0[UM])V-_-R'>LOY.POYN1[UA_ +M)V%_-R/?L?Y.POYN1KYC_9V$_=V"GR+OO).SO%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y.POYN0;YC_9V$ +M_=V"?,?Z.PG[NP7YCO5W$O9W"_(=Z^\D[.\6Y#O6WTG8WRW(=ZR_D["_6Y#O +M6'\G87^W(-^Q_D["_F[%3Q'NPOYN1;YC_9V$_=V*?,?Z.PG[NQ7YCO5W$O9W +M*_(=Z^\D[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q_D["_FY%OF/] +MG83]W8I\Q_H["?N[%?F.]7<2]G]8?R=A?[?AIPAW87^W(=^Q_D["_FY#OF/]G83]W89\Q_H["?N[#?F.]7<2 +M]G<;\AWK[R3L[S;D.];?2=C?;OO).SO-N0[UM])V-]MR'>LOY.P +MO]OQ4X2[L+_;D>]8?R=A?[^8_V=A/W=CGS'^CL)^[L=^8[U +M=Q+V=SOR'>OO).SO=N0[UM])V-_MR'>LOY.PO]N1[UA_)V%_MR/?L?Y.POYN +M1[YC_9V$_=V.?,?Z.PG[NQWYCO5WFG_@Y@YU#OCN^BG,G;K^+M^G=ZC<`=\I +MZ^_4]7>'Q-TALOU/7WSW) +MOOU/5WY>SJ'/"=LOY.77\'YH#OE/5WZOH[,`=\IZR_4]??Y;FG=0[YCO5W +MZOJ[IWFNOOU/5WS_-G_S9H?OOE/5WZOJ[LOU/7W[W(UCGD.];?J>OO7N:YRAWR'>OOU/5W+Q-W+PMWZ/X[9?V=NO[N9>+N +M9>$.W7^GK+]3U]^]//FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J^CLP +MAWS'^CMU_5V>>U7GD.]8?Z>NOWN5YPIWZ/X[9?V=NO[N5>+N5>4.^8[U=^KZ +MNU>)NU>5.^0[UM^IZ^]>G2[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z.W7] +M'9A#OF/]G;K^+L^]KG/(=ZR_4]??OOO7B?N7A?NT/UWROH[ +M=?W=Z\3=Z\(=NO].67^GKK][??)GA^Z_4];?J>OORMG5.>0[UM^IZ^_`'/(= +MZ^_4]7=@#OF.]7?J^KL\]Z;.(=^Q_DY=?_0[UA_IZZ_>YOG*G?(=ZR_4]??O4W0[UM^IZ^_`'/(=Z^_4]7=Y[EV=0[YC_9VZ_NY=GBOZ0[UA_IZZ_ +M>Y^X>U^X0_??*>OOU/5W[Q-W[PMWZ/X[9?V=NO[N_0[UM^IZ^_RW(X0_?? +M*>OOU/5W'Q)W'RIWR'>LOU/7WWU(W'VHW"'?L?Y.77_WX71Q=LAWK+]3U]^5 +MLZMSR'>LOU/7WX$YY#O6WZGK[\`<\AWK[]3U=WGNJLXAW['^3J/^SM#]=\KZ +M.XWZ.T/WWRGK[S3J[PS=?Z>LO].HOS-T_YVR_DZC_L[0_7?*^CN-^CM#]]\I +MZ^\TZN\,W7^GK+]3TM]]K'/(=ZR_4]???Q'?,?Z.W7]73F[.H=\Q_H[=?T=F$.^ +M8_V=NOX.S"'?L?[.\@_=]E/Q\H=\)VQ_LY\?" +M';K_SEA_9ZZ_.R;NCH4[=/^=L?[.7']W//FS0_??&>OOS/5WY>SJ'/"=L?[. +M7'\'YH#OC/5WYOH[,`=\9ZR_,]??Y3FI<\!WQOH[<_V=Y+G"';K_SEA_9ZZ_ +MD_3RI'('?&>LOS/7WTGB3BIWP'?&^CMS_9V<+LX.^,Y8?V>NORMG5^>`[XSU +M=^;Z.S`'?&>LOS/7WX$YX#MC_9VY_B[/:9U#OF/]G;G^3O-LOS/7WVGB3@MWZ/X[8_V=N?Y.3_[LT/UWQOH[<_U=.;LZAWS' +M^CMS_1V80[YC_9VY_@[,(=^Q_LY0[UM^9Z^_`'/(=Z^_,]7=YKJESR'>LOS/7WS5YKG*'?,?Z.W/]79.X +M:PIWZ/X[8_V=N?ZN2=PUA3MT_YVQ_LY<_-FA^^^,]7?F^KMR=G4.^8[U +M=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L^U=0[YCO5WYOJ[-L\5[M#]=\;Z.W/] +M79NX:RMWR'>LOS/7W[6)N[9RAWS'^CMS_5U[NC@[Y#O6WYGK[\K9U3GD.];? +MF>OOP!SR'>OOS/5W8`[YCO5WYOJ[/-?5.>0[UM^9Z^^Z/%>Y0[YC_9VY_JY+ +MW'6%.W3_G;'^SEQ_UR7NNL(=NO_.6']GKK_K3O[LT/UWQOH[<_U=.;LZAWS' +M^CMS_1V80[YC_9VY_@[,(=^Q_LYOOS/5W0YZKW"'?L?[.7'\W +M).Z&PAVZ_\Y8?V>NOQL2=T/A#MU_9ZR_,]??#2=_=NC^.V/]G;G^KIQ=G4.^ +M8_V=N?X.S"'?L?[.7'\'YI#O6']GKK_+OOS/5W8^)NK-PAW['^SEQ_-YXNS@[YCO5WYOJ[LOS/7WWW*OOP!SR'>OOS/5W8`[YCO5WYOJ[//>YSB'?L?[.7'_W.<\5[M#] +M=\;Z.W/]W>?$W>?*'?(=Z^_,]7>?$W>?*W?(=ZR_,]???3Y=G!WR'>OOS/5W +MY>SJ'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^U+GD.]8?V>NO_N2YRIW +MR'>LOS/7WWU)W'TIW*'[[XSU=^;ZNR^)NR^%.W3_G;'^SEQ_]^7DSP[=?V>L +MOS/7WY6SJW/(=ZR_,]??@3GD.];?F>OOP!SR'>OOS/5W>>YKG4.^8_V=N?[N +M:YXKW*'[[XSU=^;ZNZ^)NZ^5.^0[UM^9Z^^^)NZ^5NZ0[UA_9ZZ_^WJZ.#OD +M.];?F>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\]ZW.(=^Q_LY< +M?_NO_N6N/M6N$/WWQGK[\SU=]\2=]\*=^C^.V/]G;G^[MO) +MGQVZ_\Y8?V>NORMG5^>0[UA_9ZZ_`W/(=ZR_,]??@3GD.];?F>OO\MSW.H=\ +MQ_H[<_W=]SQ7N$/WWQGK[\SU=]\3=]\K=\AWK+\SU]]]3]Q]K]PAW['^SEQ_ +M]_UT<7;(=ZR_,]??E;.K<\AWK+\SU]^!.>0[UM^9Z^_`'/(=Z^^:_`,W]Z/. +M`=\UK+]K7'_W(\]5[H#OKI_"W#6NO_N1N/N1N6N.^"GR=8_=F_V1>^.K,H>^ +MWG9Y*IB[\^WG;V]O!]%]572P\5\?-Y]>_KAHT'U5O_+ZVIOS:_1PG,"?^4_\ +M_./5_3_*X,W=0?_%8'Z%]^?R+TA[>W?0332U7;MS3]^/INEB\'_RZ[NY[J=I#TUW:,9TD6,CAU8/;5/F;MYK +MN]Q]?7_Z\U\.O__A;W\_C_UO?;LWU_V<_\[S^O^U/72#>W7"WN[UW^7]W_VW +M>SMW\^G[XK3SG+&Y^\[GFH:>.2E_=Q:_M[=S-I^^F_B^' +MNT_--\W;^6LF-&SN]_MSZ,O'_PIY-S<'S-VAO_Z;UNO?X,EAV<\_6+OS%]\] +M#-_W'KSWS*-AU[._Y7=]>#/?_[UZI^W8Q^N_O4NO;[;FP,$?^<_P4[O +M]N:`@;W=_*\7^=L]W)\#O]/[M=,[_W[E^L/BL4YO3)I"W_E/T-.;;D\/']+Y +M]."'S,^[UXC>G0._7_F5T^MN/FN +M\:/C//>('QWGN4?\Z#C//>I'QWGP$3\ZSG./^-%QGGO$CX[SW*-^=%P/WOPS +MQT?Z)'Z>.[,W]#=?EK0Y=)-[?>S3\?GU_3]XN[?_S)%]ZG_@DSC^Q=@>\9/X +E>>[A3^+;`V\6_=INC_A)_#SWJ)_$FV-_[;W?_@U4+HE0]:P````` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu b/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu index 6b4a6ca41a3c..6991d3b5e149 100644 --- a/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-4096-gpt.qcow2.gz.uu @@ -1,26 +1,26 @@ # $FreeBSD$ begin 644 img-1x1-4096-gpt.qcow2.gz -M'XL(",]Q+ED``VEM9RTQ>#$M-#`Y-BUG<'0N<6-O=S(N;W5T`*V92V_<(!"` -M[_D5I.\FS=8,8'O[2)JD62FWI&IOO?AYC-1KY?:WUQALUGC&)%MVD945FD^` -MOQFPDR3FPYCB3*9,;EE;LOZW;<#V?LP;Z^YWMYO]3W=D8#PAHI`.*2;3,.&A^8 -M\?D1\L#Q0>SQ"7S]U!CG=Z3KXQ-F?'Y41N'R(`Z0J"V%*X(X@425%*X*XB02 -M55.X)HA32%1+X'A`E1Z7(E&-B[+1)%>/;>X%Q..8U&4=^!Y]]+B7CD<4N^`\@X\[UY;W!N'0^H=4-Z!Y]U;BSMQ -M.*3>`>4=>-Z=6MP[AT/J'5#>@>?=V<([CM0[H+P3GG?O+2MQ.*3>"-X)BY,.A]0[07DG/.^4Q:4.A]0[07DG/.\RB\L=#JEW@O). -M>-YM+>Z#PR'U3E#>"<^[CQ;WR>&0>B+.W7=A<5\< -M#JEWDO).>MY=6MR5PR'U3E+>2<^[:XO[.N$`BYJ\2Q*\6=S-(FE.VYSY$IWK`#SIP/)O5::M.R`@$S[>[.'JR.LWI-L3@$JQHE@` -M?XSC&]*MSR_S;J"W6PW%0`%3%/SI.3?JG-);W:6*V -M;1C.6%N6<7UVZX'=P_WFP<#.-K].[?@DMT9@C>Z@5D\.E3FGIINY!P%BNFR. -MPUXC_=?JZ;IO,*N'+Y)>/31ENG'5QH0;<67/F%6:B -MZ_?R2G=T=YOYUP"E!48;H4S;*F)V:%S$[-"XB-FA<5&S0P,C9H?&1ZB6<-/5GS^>M--N(FKG%1-W&9Z>/WT3]QQ=U%%1H````` +M'XL("-N7?5P``VEM9RTQ>#$M-#`Y-BUG<'0N<6-O=S(N;W5T`*V82V^<,!"` +M[_D53M])FBT>V\"FSR3-2KDE57OKA67A&*D]T_[V8CS@QBO9_;"#V_ADWT=QO;E?[G^;(P63"1!$=6@VX$>O: +MXX##)7+:(6G#D@BHM+B6B)(>#15Q&1"D.IQ=Q.1'%>2>7O5L349QWQ=241QWLEE[W9$%.<=,-X)CZN(*,X["+P[1MPSCZN) +M*,X["+Q[CK@7`TY249QW$'CW$G&O/(ZH=\!Y!X%WKQ'WQN.(>@><=Q!X=X*X +M4X\CZAUPWD'@W1GBWGH<4>^`\PX"[\XGWDFBW@'GG0J\>X>LQ..(>J!Q1[Q3GG0J\4XC3'D?4.\5YIP+O#.)2CR/JG>*\4X%W&>)RCR/JG>*\ +M4X%W:\1=>!Q1[Q3GG0J\>X^X#QY'U#O%>:<"[SXB[I/'$?5.<=[IP+O/B/OB +M<42]TYQW.O#N$G%7'D?4.\UYIP/OKA'W=<`!%35XER1T0]S-)&>!J'K/=PN\OIUZ?8$H#&B*";` +M'_WXNG1K\\N]&VCM-ETQ,"",'G#=7$VY/[Z;S:VXN_SVW<)^^NEVZ59W9X"B +M\B>!?G22G>[) +M\6P=SAXOAJMVV_;+EMB"?33MT;W4'.YNC$LCFZ>[8:0B*T5:V?=)96W_V*7V +MEB;R-DW;A?/3C8^>K7&8Y/2S2":GP'MWJZJ\PY-]W, +M7P28Z8HQCGJ-]%^K9^ORUD1;O366*:KQ'>SJ%6[UZ$6RJT>F3-.O6I]P/6X; +M=_6D>X69V/H]_>4[FKO5^.N`&H'11JC3NHR8'187,3LL+F)V6%S4[+#`B-EA +M<1&SP^(B9H?%1O/WT3^)='8^%1H````` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-4096-gpt.raw.gz.uu b/usr.bin/mkimg/tests/img-1x1-4096-gpt.raw.gz.uu index 751395c98997..5629f1638ab2 100644 --- a/usr.bin/mkimg/tests/img-1x1-4096-gpt.raw.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-4096-gpt.raw.gz.uu @@ -1,15 +1,16 @@ # $FreeBSD$ begin 644 img-1x1-4096-gpt.raw.gz -M'XL("-!Q+ED``VEM9RTQ>#$M-#`Y-BUG<'0N^"C'3;SSX^U0D*^6N,E`0TB&>7;FI2^S4H8# -M,!JRC%S3@>Y)+,_N<'OH::JZ#NA_GTI8`84'!ESM@U+3,\ZA;8FXT;,<,V4M5GIP!PG`FYLM[T.:"W*<@/\'.O3_>NP,#G,"=H_+V$4 -MK(8U?[B^5UO/ZWM^><7Y\?V#8%]3NUKY8.7S&Y09W$HDJ9+M?J_;#3A-61NU -M1UR6Q-W$<1EE-3NXV$KCS%Y6V$/_>[)D4/T="^Q!.."KHB8'=Y$Y<`NQ<_=T-]1@T[ -M(K;2@91ZIM\J1:K=(^WMW7:QQ&7/_3TEY^`7C-"Q#B`L````` +M'XL("-N7?5P``VEM9RTQ>#$M-#`Y-BUG<'0NO/"9XR'3;SSX^U0D*^6N,E`0TB&>9AY.\,@I3\` +MHR&+P#5NZ![%\NP.-X>>ILKK@.[]%,(**!S0XRIGE)J>:1JT[;"DZKV\LVRA +MU7@_X,1T',4,5T]>FQ4WS''"X\9TV^N`UJ(H-L"/,3[=;X>%26%.T.YY":-@ +M-:SYP_6YVFH>W]/S"\X/;^\$^YS2UZM%FJ^B4[%T[X7X6J;K<9J\ +M-FJ/N"2JWG&MGLW'F<)9Z8G\[E7J6EK5('*Q'#G +M)2YEKCS3AY$BJY`VL`I52S=U"J6`W+6)WVX-74.>D"GHDH#=Y55S==+'$)MWHYJ6?9U#L-GZG0BANBZA5>O;!( +MI%ZP9;I1M;%#1ES)JY[JIX:K?_?]WE[CANXLEJ<'F@'(%J'1;FSP=0?A&+N# +M<(S=03C6[B`@8W<0CK$[",?8'81C[0X';"3?$"<05GD!FFQBB\VCBF^ +M[T"ZC=X;_3M#/+P9#>,0)]S^$&]VD@WM;<,XQ`G'.L2-^Y^2\O`+__!T\X@+ +"```` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu b/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu index 6c3e3018bbf4..542d95716d0c 100644 --- a/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-4096-gpt.vhd.gz.uu @@ -1,22 +1,22 @@ # $FreeBSD$ begin 644 img-1x1-4096-gpt.vhd.gz -M'XL("-!Q+ED``VEM9RTQ>#$M-#`Y-BUG<'0N=FAD+F]U=`"MF$MOVS`,@._] -M%2QVZS!#;R>7`2O0`KMUPX9==K$=IPN&98_VT(/WWT?*4FS9EK&T=%0CB<+/ -M)$61K(3H+P"GP>W!M>`LO2\-N"V4&P"<#$/YNPP?H6M^'MOF\?!4A*N[Z&%2 -MC*52<9)7&@P^I`15T4/O8<@]]N -M>NV(].6@OGOD];>3=GJNW2"%?^4.A`$I1[_043O$%']38PU*[?=^.-BU)'L: -MR8=D8C!VXCLK)E(C-9><*@9CEW!N3>H\Q;*(? -M9@-#Y>GA5_7GH9WHIS*AXD[ZR=F7-3[TWH&"LGY-BQ>?YQOZ -M/&#T8(H[&5PWY#^?!]IVL*@/DB"L-2B971!].?)?O6->WWI_'M!:J*H9\'/4 -MK_'+8<$X,%L*#$P.1H)58(=P]K;:9JS?S>U[N'OW\1/!O@[F-A0NC8*FA*T" -MN9UH-]]IZ[FEH]UN?E3<[<>\M.(N\M;IE8U8KB,L75O-Z3OFK@_L#\/;_G)[J[(GWU -M0!7*$%M=4R&1LFEH`I!-0Q/V+Z.&LEU=S'-7V:A2,688PC%F&,(Q9AC"L688 -M`C)F&,(Q9AC",688PK%F&`0:P=<($#$M-#`Y-BUG<'0N=FAD+F]U=`"MF$MOG#`0@._Y +M%1/UEJH4CQ^PQT9*U?:TK5KET@NP;+JJNGTDAQSH?Z_'V(`7C+K)L`YBU\S' +MO#R>D.?]`6`DF#V8%HRFZT*!V4!1`MA)/]"=A?\*7?/SV#8/A\?,']U%#Q/Y +M5"H6)WF4H.Q#"L"*'F)V=`U=P&0O;NZN#C_N`@X]#CU(%R0E$4P]>XZROY:] +M=D2Z/>!WA[S^-F@GY]J-4O:OV$&N0(C)'3)H9S'9W]A89:7V>S<,[%J2'4;T +M)9H8C3WQG,Q<$4MY`JS_*> +MB>5"=*T3V]$P50_(_(5GZ>#D=2O(OWL8LBKA7-ZHKO.XL\`K.OS +M@,&#,6XPN&[(?ZX.M.UH49\D7EA*0)$,B+R<^*_>,<>WWI\'U!JJ:@;\$O1K +M7#@T*`-J0XEABX,2H!'TF,[.5MU,];MY^QZV;SY])MC7T=R&TD65@'O8*-B< +M:C=?:1[W[O7B8FMHLM#,,?18I-B!; +M[,9N'5T3L#M^S(X][%7V^Z77KQ4^(Y9&>B+EO=;5Y3)E;C$6[(2Y$..XZW); +MDO$V[7L/EOZ_?\G)[H +MMEG\Z8'HMR&V?0U](6734'D@FX;*KU].[&LQSHZRP0,8*0SC&"D,XQ@I# +M.-8*0T#&"D,XQ@I#.,8*0SC6"F.!*N=KA`CG&J&*`B`T12)2(]G2=!]\(&1L +MKL*U]BG=""6"H1@;(<*M-D+VO^A4;/V!)\8R-D*$8VV$C"^D3.\R3&B$YCH\ +MY5V&"8W0\/AGO#$M-#`Y-BUG<'0N=FAD9BYO=70`K9=/J]P@$,#O -M^RFFO,/"*Q4U:K*7!RV\EMZVCY9>>LD??2RE6PJE])`/7T?-1GMQHA93C,UJ# -M,6%2YK2\LOW-V[!><&0=>Q+AIHO6[2P+8ASQN,5=\S*@E-#W-\`OBWW](;]>!_L$"QF1FV5!*7H"4X5V)7=;S.U-=R'%-;6CUV'T9+7H'4*RY&99 -M4(Q>[Z.7#Q)&+U>Z%A>B1EZEN*%N])CK&K8^[/Y]>R\+YB-)+P\4`5C-0F', -M6+$Z$%>Q.A!7L3H05[4Z$%BQ.A!7L3H05[$Z$%>U.BQ0TWI-''&8>YI"J\"T -M>(!(S"BVXYG\L><*'/O$7<<<#QYUF/OT]_X^A)MS/#>DB^FJC/&TQ, -M94NDQY>H"=>1?7>/S_>G'\\+C@>OE@#*%K4:#FJX<5>F[GX]\>\.>5RMRVQ3 -M,H[>00$5N,7$C@?KCFFJ2'<"6IS5!CJ!NI>9_$@$V41&G$N5^.'__;8>5SM5 --[%^#W3\[9-S+LPT````` +M'XL("-R7?5P``VEM9RTQ>#$M-#`Y-BUG<'0N=FAD9BYO=70`K9=-B]LP$(;O +M^153>@ALJ9!D2;:/6]C"WM+2TDLO_M*279I2Z*$'__AJ]!%;CF2Z1;8P"K(> +MS[R:T2B4N@M`<*!=XID?F#^0^)X/=P=+8_WK@.;[:,(&2`S0X08S2#F^,TV@ +MM6^4V5ENLOG-:]\/.+)<1[+"C==9MRT_L,81APONZM;-9S^HY +M+@WK8!`YW"G&J<*1)ZP9"NH!U`22P:"Q,RI@#*`Q:=)8"`<^`FVA9L![!,Z7 +M3^3B8._)KW?>/L%\1*1:?B"GGL!0H4W.W1IC>]==B'%5:?4:5$\64Z_UVU2J +MY0>RZG5.O;1(J%XJ=0W.JT;>Q+B^K'K,5@T3_V;_OGWF!^83B6\'%!Y8S$*A +M]5`P.Q!7,#L05S`[$%.1MG"Q9QQ!4M +MXM(?OU4%RN:7DMBO!2B34LT:R)>8L<#AYV4:?I__K-63=F>&Y9"\:3B?5QB8 +MRJ1(AQ]1(_97]KU]>+H[_W@*..Z]"F.LBH/J;]R5L;O?SOPE*!APB6U* +MKM5K%:X58Y'CWKI3'"K2GH""LY.&1MAU#BWZ$0TD`QEQ(52N[7_7UN%*AXKY +,:W#X"S$T<4>S#0`` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu b/usr.bin/mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu index d7c21b2ea49b..4e19e303449a 100644 --- a/usr.bin/mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-4096-gpt.vmdk.gz.uu @@ -1,63 +1,63 @@ # $FreeBSD$ begin 644 img-1x1-4096-gpt.vmdk.gz -M'XL("-%Q+ED``VEM9RTQ>#$M-#`Y-BUG<'0N=FUD:RYO=70`K5Q=C]S&$7SW -MKYC(#PX29,%:DLOE@X+8.3LP@@"*["0O>0@_XT/LDW(Z&!&P/SX<'=S -MI'Q]VM-NB]VUTSW+YJJZP"Q;?IPK6E<4KNA=>7(9W/1/R\-E^;TQ/8YG'KC\ -M^>HO?S_PY]>'P^6S!0P^2D*0*9P8J_>Y'![\$.[X7-3JP/0X;L+E/JI]%!C@ -MCHD#2;AB.GA\*H2K:^;#O7\A<"X"N15<^41.R62?6]UO/@O%\^O+_1JF[3W5 -MKLK=J0VF.Y6SG;OJ.!_+7#4YC1/@Y^[J^L-_W-7PH;N]?G_W+JSOZ/=V80IL>KD7_@#'J[V$*?!Y;W+X0^[R^TWUS\.AY^'VP_7[VY>@^D>_=X6 -MN2MJOQSOG]T_5H9_D\R=X-_#7?[X[=7K\,G-#N^;6\+YJ&DATWM/>2CNZ>3\ -M[^/'O+KAYLXCCN$GKL[O;2A..;]WX5^4A:MJ-R^G]-C'Z7`?4IYKU]T.S=WP -M_^M+5L]`Y[E0N2MS#Q52\^4K/:+_V,R[YBX_7M_]<-U] -M-Z7Y87AU^-P1[N1K-VW@.:QKR7H*.25W=EKVY>O_W4WYNC[L[#7AYD7,24SO -M71Y=67FL:0/GK3BZO/"OIG^:%CQE4L`[N4X+G$*FA%8YE4O^Y<./I;M\][5[Y9/\_H=A_@02KEY.,^^\[`-F\^A?A*HM -M\+Z)%?[`O+/NJKEKW%?-A^'P^=755W%G&Y]L,3^FI0T>Y;1`^\_W7,ZI<,M. -M+QL];T7?MX>F;][?#;=^>^-6M+Y$?$ZY?:3EUA$H]>*L)W5WNJS;C?@AP>19:0!Y:V:I$ -M<3G+&TH#';J[=[?+PEY)/\X?7LM>VH^+1Y?4ZA<"+G#6ZSME#ZYGN<858I0K -M0'\5RZ;?/TR_;^[7=_+K.XEGI5%G,>H5W+\FB/>/TSWYL[`1SU:C.C'Z/=4[ -M^=8VB.?XL'K\J@%YG8;C=P%ZYAI5B%&NX%*U*T/MZ%EIU%F,>@67JMTIU(Z> -MK49U8O2[DJU"[>@Y:I1_XEK49U8O2[DFU#[>@Y:I1_8H.`O$[#=:%V],PUJA"C7,&E:M>' -MVM&STJBS&/4*+E6[(=2.GJU&=6+TNY(=0^WH.6J4?RJD=L467)6%VM$SUZA" -MC'(%EZA=Q7Y'STJCSF+4*[A$[2KV.WJV&M6)T>]*EOV.GJ-&^:=2:E=NPK'? -MT3/7J$*,<@67JAW['3TKC3J+4:_@4K5COZ-GJU&=&/VN9-GOZ#EJE'\Z2>U. -MFW#L=_3,-:H0HUS!I6K'?D?/2J/.8M0KN%3MV._HV6I4)T:_*UGV.WJ.&N6? -M^"4(\CH-QWY'SURC"C'*%5RJ=NQW]*PTZBQ&O8)+U8[]CIZM1G5B]+N29;^C -MYZA1_HF$#.1U$NZH0HQR!9>HW9G]CIZ51IW%J%=PB=J=V>_HV6I4 -M)T:_*UGV.WJ.&N6?:JE=O0G'?D?/7*,*,P:5JQWY'SU:C.C'Z7N4848Y0HN4;N: -M_8Z>E4:=Q:A7<(G:U>QW]&PUJA.CWY4L^QT]1XWR3[W4KM^$8[^C9ZY1A1CE -M"BY5._8[>E8:=1:C7L&E:L=^1\]6HSHQ^EW)LM_1<]0H_S1([89-./8[>N8: -M58A1KN!2M6._HV>E46-\D^CU&[N4848Y0HN53OV.WI6&G46HU[!I6K'?D?/5J,Z,?I=R;+?T7/4J$RF9Y#7 -M2;@F6VH7/7.-*L0H5W")VC6AWT7/2J/.8M0KN$3MFM#OHF>K49T8_:YD0[^+ -MGJ-&^9()?X=-2JL)_0["WT'Y.PA_ATW^K@G]#L+?0?D["'^'3?ZN"?T.PM]! -M^3L(?[^PR=^U['?"WT'Y.PA_ATW^KF6_$_X.RM]!^+L=R;+?"7\'Y>\@_!TV -M*:V6_4[X.RA_!^'OL,G?M>QWPM]!^3L(?X=-_JYEOQ/^#LK?0?B['^PR=^U['?"WT'Y.PA_ATW^KF6_ -M$_X.RM]!^+L=R;+?"7\'Y>\@_!TV*:TN"[43_@[*WT'X.VSR=QW[G?!W4/X. -MPM]AD[_KV.^$OX/R=Q#^;D>R['?"WT'Y.PA_ATU*JV._$_X.RM]!^#ML\G<= -M^YWP=U#^#L+?89._Z]COA+^#\G<0_FY'LNQWPM]!^3L(?X=-2JMCOQ/^#LK? -M0?@[;/)W'?N=\'=0_@["WV&3O^O8[X2_@_)W$/YN1[+L=\+?0?D["'^'34JK -M8[\3_@[*WT'X.VSR=QW[G?!W4/X.PM]AD[_KV.^$OX/R=Q#^;D>R['?"WT'Y -M.PA_ATU*J\]"[82_@_)W$/X.F_Q=SWXG_!V4OX/P=]CD[WKV.^'OH/P=A+_; -MD2S[G?!W4/X.PM]AD]+JV>^$OX/R=Q#^#IO\7<]^)_P=E+^#\'?8Y.]Z]COA -M[Z#\'82_VY$L^YWP=U#^#L+?89/2ZMGOA+^#\G<0_@Z;_%W/?B?\'92_@_!W -MV.3O>O8[X>^@_!V$O]N1+/N=\'=0_@["WV&3TNK9[X2_@_)W$/X.F_Q=SWXG -M_!V4OX/P=]CD[WKV.^'OH/P=A+_;D2S[G?!W4/XNBND@KP7.+;\!;LB6VCTI -M*7_BGV+MW).K&ZSU@>.X%S!_.EV_QS%=9,\NX]/7AUF_&&<>2]5_&>`"9UP_ -MQ/F[E.D^[E/UE8CS=SY>I*]$G+_S\2)])>+\G8\7Z2L1Y^\F^DK$^;N)OA)Q +M'XL("-R7?5P``VEM9RTQ>#$M-#`Y-BUG<'0N=FUD:RYO=70`K5Q=C]S&$7SW +MKYC(#PX29,%:DLOE@X#8.1LP@@"*[20O>0@_XTML23D=@@C8'Q\..357O-LY +M4KX^\;3;VN[:Z9YE26G9++/K>XWGX7B^?7E?@W3]IYJ +M5^7NU`;3G80IL>KDG_@7/%SM(4Z#RWN7P[_L+G??W/XT'/X[W'VX???V-9CNT>]M +MD;NB]LOQ_MG#L3+\FV3N!/\>[O*';V]>AT]N=GC?W!'.1TT+F=Y[RD-Q3R?G +M?Y\>\^J&M_<><0P_<75^;T-QROF]"_^D+%Q5NWDYI<<^3B_W(>6Y=MW=T-P/ +M/WQ\/[Q^]?.[M[%V?F]]R>H9Z#P7*G=E[J%":KY\I4?T'YMYU]SEI]O['V^[ +M[Z'G;TEW+R(.8GI +MO^63_.''8?X$$JY>3C/OO.P#9O/HGX2J +M+?"^B17^A7EGW4USW[BOF@_#X?.;FZ_BSC8^V6(^IJ4-'N6T0/O/]US.J7#+ +M3B\;/6]%W[>'IF_>WP]W?GOC5K2^1'W(U&]K\;"-Z_>IYIT:_2?&75Z[5[?] +MM*<>]I_#NY\)URT?XVD=_B-1SX&Y?S)]>F;X(;S#\HGQV^3AAON[CX?NXT^W +M;_OI1'.O"=_%G8B&>K49T8_9[J +MG7QK&\1S?%P]?M6`/$_#\;L`/7.-*L0H5W"IVI6A=O2L-.HL1KV"2]7N%&I' +MSU:C.C'Z7N8:58A1KN!2M:M#[>A9:=19 +MC'H%EZI=$VI'SU:C.C'Z7JW1!J1\]6HSHQ^EW)CJ%V]!PURC\44KMB"Z[*0NWHF6M4 +M(4:Y@DO4KF*_HV>E46E4:=Q:A7<*G:L=_1L]6H3HQ^5[+L=_0<-AF._HV>N4848Y0HN53OV.WI6&G46HU[!I6K'?D?/5J,Z,?I=R;+? +MT7/4*/]`0@;R/`EWSD+MZ)EK5"%&N8)+U.[,?D?/2J/.8M0KN$3MSNQW]&PU +MJA.CWY4L^QT]1XWR#[74KMZ$8[^C9ZY1A1CE"BY5._8[>E8:=1:C7L&E:L=^ +M1\]6HSHQ^EW)LM_1<]0H_\#_/T&>I^'8[^B9:U0A1KF"2]6._8Z>E4:=Q:A7 +M<*G:L=_1L]6H3HQ^5[+L=_0<-H0HQR!9>J'?L=/2N- +M.HM1K^!2M6._HV>K49T8_:YDV>_H.6J4?^BD=MT67)V%VM$SUZA"C'(%EZA= +MS7Y'STJCSF+4*[A$[6KV.WJV&M6)T>]*EOV.GJ-&^8=>:M=OPK'?T3/7J$*, +M<@67JAW['3TKC3J+4:_@4K5COZ-GJU&=&/VN9-GOZ#EJE'\8I';#)AS['3US +MC2K$*%=PJ=JQW]&STJBS&/4*+E4[]CMZMAK5B='O2I;]CIZC1OF'46HW;L*Q +MW]$SUZA"C'(%EZH=^QT]*XTZBU&OX%*U8[^C9ZM1G1C]KF39[^@Y:E0FTS/( +M\R1^@_!V$O\,F?]>$?@?A[Z#\'82_PR9_UX1^!^'O +MH/P=A+_;D6SH=Q#^#LK?0?@[;%):3>AW$/X.RM]!^#ML\G=-Z'<0_@[*WT'X +M.VSR=TWH=Q#^#LK?0?B['^@_!V$O\,F?]>$?@?A[Z#\'82_VY%LZ'<0_@[*WT'X.VQ26FT6:B?\ +M'92_@_!WV.3O6O8[X>^@_!V$O\,F?]>RWPE_!^7O(/S=CF39[X2_@_)W$/X. +MFY16RWXG_!V4OX/P=]CD[UKV.^'OH/P=A+_#)G_7LM\)?P?E[R#\W8YDV>^$ +MOX/R=Q#^#IN45LM^)_P=E+^#\'?8Y.]:]COA[Z#\'82_PR9_U[+?"7\'Y>\@ +M_-V.9-GOA+^#\G<0_@Z;E%;+?B?\'92_@_!WV.3O6O8[X>^@_!V$O\,F?]>R +MWPE_!^7O(/S=CF39[X2_@_)W$/X.FY16EX7:"7\'Y>\@_!TV^;N._4[X.RA_ +M!^'OL,G?=>QWPM]!^3L(?[^@_!V$O\,FI=6QWPE_!^7O(/P=-OF[ +MCOU.^#LH?P?A[[#)WW7L=\+?0?D["'^W(UGV.^'OH/P=A+_#)J75L=\)?P?E +M[R#\'3;YNX[]3O@[*'\'X>^PR=]U['?"WT'Y.PA_MR-9]COA[Z#\'82_PR:E +MU;'?"7\'Y>\@_!TV^;N._4[X.RA_!^'OL,G?=>QWPM]!^3L(?[^@ +M_!V$O\,FI=5GH7;"WT'Y.PA_ATW^KF>_$_X.RM]!^#ML\G<]^YWP=U#^#L+? +M[4B6_4[X.RA_!^'OL$EI]>QWPM]!^3L(?X=-_JYGOQ/^#LK?0?@[;/)W/?N= +M\'=0_@["W^U(EOU.^#LH?P?A[[!):?7L=\+?0?D["'^'3?ZN9[\3_@[*WT'X +M.VSR=SW[G?!W4/X.PM_M2);]3O@[*'\'X>^P26GU['?"WT'Y.PA_ATW^KF>_ +M$_X.RM]!^#ML\G<]^YWP=U#^#L+?[4B6_4[X.RA_%\5TD.<"YY;?`#=D2^VN +M2LJO_%.LG;NZNL%:'SB.>P'SZ^GZ/8[I(GMV&9^^/LSZQ3CS6*K^RP`7../Z +M(<[?I4P/<9^JKT2?O)OI*Q/F[B;X2 M?O)OI*Q/F[B;X2?O M)OI*Q/F[B;X27Q^.PR/GU] -MQ5R_Y>ZJC_].'[A\=5C_B8!H/PV0*US#,>$"_MQ8M%[#X,8Q/!;E'#]!HSM6 -MZ82_.`A<;UR__?N[/,K2-51UJM#.MT_O7U\=A3S[9T?5YMP>1+N -MBZ=.MF*^O?/8/P/WU",-5SP7]:EW`B_FVSMKE*IO73ZX-G=CXYH^`??[!W`G -MXT_>?.?9]N2JSM\_N(3KYIL]]R=/2[OS=)HL__,[NF/OE0@5W-'?D?EPN?GK -MX68!^]WAO[\-ZUON/(NG'^D#J>H5\UW>SZETJT3#7K=Y@_K[2E6?7J -M\&%YZI$^D*Q>LU0O<56;JO?4J3O!\:KVJS5<:UN]'-9_ -M%L`B`)JML/"W%+0[.SRG9X0,.SP\,9GAT>SO#L\'"F9T?A -M;QAI=Q'W<%B^,57P\_2]PO]\L4IWYAR3E_YG+N)/;\9@ -E>!'W<,]>Q,!'W<*87\<+?O3/[[/^_O`I!M&4````` +M,9KJ*S&:ZBLQFNHK,9KJ*X]9EAGJ*X]/[G6\$^YILHL^\`A3?>7Q^.PR/GU] +MQ5R_Y>ZJ3_].OW#YZK#^$P'1?AH@5[B&8\(%_+FQ:+V&P8UC.!;E'#]!HSM6 +MZ82_.`A<;UR__?N['&7IFN8)X%^XOGE_B]+?C[FHYYOS\LZ\91'AYMS+3M?W +M]3??NC=??O>#!_O[0[KS[9TGH+'Q*'W[:'5(I?OMXUUW2H^M:UQ_#%O2M2<&_6<"?C +M3]Y\Y]GVY*K.WS^XA.OFFSWW)T]+N_-TFBS_\SNZ8^^5"!7U7ZUAFMMJU?.5XU%>/+T[_0+ES>']9\% +ML`B`9BLL_"T%['1[0\.SP<(9GAXV?VV?\!KL<'>[1E```` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow.gz.uu b/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow.gz.uu index efa290f4be3e..eb7c76eb4222 100644 --- a/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-512-gpt.qcow.gz.uu @@ -1,132 +1,132 @@ # $FreeBSD$ begin 644 img-1x1-512-gpt.qcow.gz -M'XL(",5Q+ED``VEM9RTQ>#$M-3$R+6=P="YQ8V]W+F]U=`"MG?U -M%5=OB9*HC(C[U-MNM`'/RH9[UH.ZKQQU&]ES?7PSR?,@(_=6V!!51$$%X6YD -M'BTNJE2KC@Z'NV]-TTG3]DT[-<>EN?GG]"'-O7]X^-'\^-M?_GI]_]N/W^[& -MY/"3I]P_M]I(FGNP]>GUN8P_0MS-Q]P[MZKLW_CU=U[LY=S5[_=O5G\ -MG+)!>S#8I+E#>GU"3J_]UU[?=_=VY>[T'N_M*GF['1OL'PS^GN;^2*]/R=L= -MV-SX8.[DWJZ2MSNQN?FGL"B!96%S:S#7PJ"?&>,.XNX$^0[8]Q9R!WR -MG3'N+.0.^&W"'?M8R[ -M-N0.^:YEW+41=XJ?(MRU$7>*?-.NB[A3Y+N.<==%W"GR7<>XZT+ND.\ZQET7%W"'?=8R[+N0.^:YCW'4A=\AW'>.N#[E#ONL9=WW('?)=S[CK(^X,/T6X -MZR/N#/FN9]SU$7>&?-$W"'?#8R[(>0.^6Y@W`TA=\AW`^-N"+E#OAL8=T/('?+= -MP+@;0NZ0[P;&W1ARAWPW,N[&D#ODNY%Q-T;>0[R;&W11QUR+?38R[ -M*>0.^6YBW$TA=\AW$^-N"KE#OIL8=U/('?+=Q+B;0NZ0[R;&W11RAWPW,>[F -MD#ODNYEQ-X?<(=_-C+LYXJ[#3Q'NYHB[#OEN9MS-$7<=\MW,N)LC[CKDNYEQ -M-T?<=OP4X6Z-N.N1[U;&W1IQUR/?K8R[->*N1[Y;&7=KQ%V/?+%W"'?;8R[+>0.^6YCW&TA=\AW&^-N -M"[E#OML8=UO('?+=QKC;0NZ0[S;&W1YRAWRW,^[VD#ODNYUQMT?<#?@IPMT> -M<3<@W^V,NSWB;D"^VQEW>\3=@'RW,^[VB+L!^6YGW.T1=P/RW)N0+X[,NZ.(7?(=T?&W3'D#OGNR+@[AMPAWQT9=\>0.^2[(^/N&'*' -M?'=DW!U#[I#OCH0[R=_A<\!WL -MOY.POQN![X3U=Q+V=R/PG;#^3L+^;@2^$];?2=C?CLOY.POQN![X3U=Q+V=R/PG;#^3L+^ -M;@2^$];?2=C?C]8?R=A?SOO).SO9N0[UM])V-_-R'>LOY.POYN1[UA_)V%_-R/? -ML?Y.POYN1KYC_9V$_=V,?,?Z.PG[NP4_1;@+^[L%^8[U=Q+V=POR'>OO).SO -M%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y.POYN0;YC_9V$_=V"?,?Z -M.PG[NP7YCO5W$O9W"_(=Z^\D[.\6Y#O6WTG8WRW(=ZR_D["_6Y#O6'\G87^W -M(-^Q_D["_FY!OF/]G83]W8J?(MR%_=V*?,?Z.PG[NQ7YCO5W$O9W*_(=Z^\D -M[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q_D["_FY%OF/]G83]W8I\ -MQ_H["?N[%?F.]7<2]G]8?R=A -M?[["_FY#OF/]G83]W89\Q_H["?N[#?F.]7<2]G<;\AWK -M[R3L[S;D.];?2=C?;OO).SO-N0[UM])V-]MR'>LOY.PO]N0[UA_ -M)V%_M^.G"'=A?[^8_V=A/W=CGS'^CL)^[L=^8[U=Q+V=SOR -M'>OO).SO=N0[UM])V-_MR'>LOY.PO]N1[UA_)V%_MR/?L?Y.POYN1[YC_9V$ -M_=V.?,?Z.PG[NQWYCO5W$O9W._(=Z^\D[.]VY#O6WTG8W^W(=ZR_D["_.^*G -M"'=A?W=$OF/]G83]W1'YCO5W$O9W1^0[UM])V-\=D>]8?R=A?W=$OF/]G83] -MW1'YCO5W$O9W1^0[UM])V-\=D>]8?R=A?W=$OF/]G83]W1'YCO5W$O9W1^0[ -MUM])V-\=D>]8?R=A?W=$OF/]G>;ON+FFS@'?W3R%N5/7W^7[])K*'?"=LOY. -M77_7).Z:S)T=\%.8.W7]79.X:_XH<\!WROH[=?U=OOP!SPG;+^3EU_!^:`[Y3U=^KZNSSWI,X!WRGK[]3U=T_R7%/F -M@.^4]7?J^KLGB;LGE3O@.V7]G;K^[DGB[DGE#OA.67^GKK][TSB'?L?Y.77_W -M-,]5[I#O6'^GKK][FKA[6KA#]]\IZ^_4]7=/$W=/"W?H_CME_9VZ_N[IR9\= -MNO].67^GKK\K9U?GD.]8?Z>NOP-SR'>LOU/7WX$YY#O6WZGK[_+LOU/7WY6SJW/(=ZR_4]??@3GD.];?J>OOP!SR'>OOU/5W>>YYG4.^ -M8_V=NO[N>9ZKW"'?L?Y.77_W/''WO'"'[K]3UM^IZ^^>)^Z>%^[0_7?*^CMU -M_=WSDS\[=/^=LOY.77]7SJ[.(=^Q_DY=?P?FD.]8?Z>NOP-SR'>LOU/7W^6Y -M%W4.^8[U=^KZNQ=YKG"'[K]3UM^IZ^]>).Y>5.Z0[UA_IZZ_>Y&X>U&Y0[YC -M_9VZ_N[%Z>+LD.]8?Z>NORMG5^>0[UA_IZZ_`W/(=ZR_4]??@3GD.];?J>OO -M\MS+.H=\Q_H[=?W=RSQ7N4.^8_V=NO[N9>+N9>$.W7^GK+]3U]^]3-R]+-RA -M^^^4]7?J^KN7)W]VZ/X[9?V=NOZNG%V=0[YC_9VZ_@[,(=^Q_DY=?P?FD.]8 -M?Z>NO\MSK^H<\AWK[]3U=Z_R7.$.W7^GK+]3U]^]2MR]JMPAW['^3EU_]RIQ -M]ZIRAWS'^CMU_=VKT\79(=^Q_DY=?U?.KLXAW['^3EU_!^:0[UA_IZZ_`W/( -M=ZR_4]??Y;G7=0[YCO5WZOJ[UWFNO3_[LT/UWROH[=?U=.;LZAWS'^CMU_1V80[YC_9VZ -M_@[,(=^Q_DY=?Y?GWM0YY#O6WZGK[][DN<(=NO].67^GKK][D[A[4[E#OF/] -MG;K^[DWB[DWE#OF.]7?J^KLWIXNS0[YC_9VZ_JZ<79U#OF/]G;K^#LPAW['^ -M3EU_!^:0[UA_IZZ_RW-7=0[YCO5WZOJ[JSQ7N4.^8_V=NO[N*G%W5;A#]]\I -MZ^_4]7=7B;NKPAVZ_TY9?Z>NO[LZ^;-#]]\IZ^_4]7?E[.H<\AWK[]3U=V`. -M^8[U=^KZ.S"'?,?Z.W7]79Y[6^>0[UA_IZZ_>YOG"G?H_CME_9VZ_NYMXNYM -MY0[YCO5WZOJ[MXF[MY4[Y#O6WZGK[]Z>+LX.^8[U=^KZNW)V=0[YCO5WZOH[ -M,(=\Q_H[=?T=F$.^8_V=NOXNS[VK<\AWK+]3U]^]RW.5.^0[UM^IZ^_>)>[> -M%>[0_7?*^CMU_=V[Q-V[PAVZ_TY9?Z>NOWMW\F>'[K]3UM^IZ^_*V=4YY#O6 -MWZGK[\`<\AWK[]3U=V`.^8[U=^KZNSSWOLXAW['^3EU_]S[/%>[0_7?*^CMU -M_=W[Q-W[RAWR'>OOU/5W[Q-W[RMWR'>LOU/7W[T_79P=\AWK[]3U=^7LZASR -M'>OOU/5W8`[YCO5WZOH[,(=\Q_H[=?U=GKNN<\AWK+_3J+\S=/^=LOY.H_[. -MT/UWROH[C?H[0_??*>OO-.KO#-U_IZR_TZB_,W3_G;+^3J/^SM#]=\KZ.XWZ -M.T/WWRGK[Y3T=Q_J'/(=Z^_4]7AN -MOP-SR'>LO[/\'3=WJ'/`=\;ZNYL?>,!=]M.A<@=\9ZR_,]??'=+>H7"'[K\S -MUM^9Z^\.B;M#X0[=?V>LOS/7WQU._NS0_7?&^CMS_5TYNSH'?&>LOS/7WX$Y -MX#MC_9VY_@[,`=\9Z^_,]7=Y3NH<\)VQ_LYOOS/5WDKB3RAWPG;'^SEQ_)Z>+LP.^,];?F>OORMG5.>`[8_V=N?X. -MS`'?&>OOS/5W8`[XSEA_9ZZ_RW-:YY#O6']GKK_3/%>Y0[YC_9VY_DX3=UJX -M0_??&>OOS/5WFKC3PAVZ_\Y8?V>NO].3/SMT_YVQ_LYOOS/5W;9ZKW"'?L?[.7'_7)N[:PAVZ -M_\Y8?V>NOVL3=VWA#MU_9ZR_,]??M2=_=NC^.V/]G;G^KIQ=G4.^8_V=N?X. -MS"'?L?[.7'\'YI#O6']GKK_+ZZ -MRAWR'>OOS/5W7>*NJ]PAW['^SEQ_UYTNS@[YCO5WYOJ[Z0[UA_9ZZ_ZQ-W?>$. -MW7]GK+\SU]_UB;N^<(?NOS/6WYGK[_J3/SMT_YVQ_LYNOQM.%V>'?,?Z.W/]73F[.H=\Q_H[<_T= -MF$.^8_V=N?X.S"'?L?[.7'^7Y\8ZAWS'^CMS_=V8YRIWR'>LOS/7WXV)N[%P -MA^Z_,];?F>OOQL3=6+A#]]\9Z^_,]7?CR9\=NO_.6']GKK\K9U?GD.]8?V>N -MOP-SR'>LOS/7WX$YY#O6WYGK[_+<5.>0[UA_9ZZ_F_)LOS/7WTV) -MNZERAWS'^CMS_=V4N)LJ=\AWK+\SU]]-IXNS0[YC_9VY_JZ<79U#OF/]G;G^ -M#LPAW['^SEQ_!^:0[UA_9ZZ_RW,?ZQSR'>OOS/5W'_-LOS/7WWW*?3A=GAWS'^CMS_5TYNSJ' -M?,?Z.W/]'9A#OF/]G;G^#LPAW['^SEQ_E^<^USGD.];?F>OO/N>YRAWR'>OO -MS/5WGQ-WGPMWZ/X[8_V=N?[N<^+N<^$.W7]GK+\SU]]]/OFS0_??&>OOS/5W -MY>SJ'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^U+GD.]8?V>NO_N2YPIW -MZ/X[8_V=N?[N2^+N2^4.^8[U=^;ZNR^)NR^5.^0[UM^9Z^^^G"[.#OF.]7?F -M^KMR=G4.^8[U=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L]]K7/(=ZR_,]???OOOB;NOA;NT/UWQOH[<_W=U\3=U\(=NO_.6']GKK_[>O)GA^Z_ -M,];?F>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\]ZW.(=^Q_LY< -M?_OOOB?NOF?NV@-^BORYQ^[-?L^]\7690W_>=GDJ -MF+OW[<=O5W>#Z+ZJMF2`T>O[P[\^=%_5K[R^[O;\6FT.,_@[_X$??[Y^^%<9 -MO+T[Z-\8S*_PX5Q^P]W=W4&WT=1^X\YC^CC(_3<\U.OTP!M^#_Y5?W^UU/VW7M'W33NDBQU::3INN+7.W[[5;[[^^__S+ -M7YO?__3W?YS'_KN^W=OK?G9MAO7V#Q_8W*L3^G9_^+=[-W?[Y?OBM/..[VRW?WDSGTP>?:GSUU4/KJ+GYN[^:ZP\.GQOM/C5TS:M/?_-O03.?^Y\$< -M^N/C?X6\VYL#EO[\<]O?_`)/FO5X_L[6G__PW6:\^32Y^T\S>OO_,DW-(.?_ -MR^[\<_O/OUW_\V[L_?7_O4VO[^[F`,$?_`?8Z=W=',"(..1LD;_=YN$<^)7> -MKYW>^=O/=Z>%#.K\H^"GSX_XUHO?GP*]7?NGT;O^O -MQO/7V!G\G?_`C]^O'_YU-]BFP4=[A>VA7Q_QL^,\]XB?'>>Y1_SL.,\]ZF?' -M>?`1/SO.>\3/CO/_I[C(WT1/\^=V6NMF==F'9K>?Q%G -M7XY__,?U]?^"MWOW>X[L2_]/OHCCGXS]$;^(G^=^_D6\IS^W^9M[LX_X1?P\ -4]ZA?Q-O#<"/3W_X?EY=\._6L```` +M'XL("-27?5P``VEM9RTQ>#$M-3$R+6=P="YQ8V]W+F]U=`"MG?U +M%:&W1$E4GG/BJ;<-E-&>E8WN60\J(C)B:&3/]?'-).^#/+FWC@U11114D&,C +M\VIQ45:MNCH<[KXU32=-VS?MU.Q+<_//Z4.:>__P\*/Y\8^__?WZ_K$G3[E_;K61-/=@ZZ]U3L]/K[/X +M.66#]F"P27.']/J$G%[[[[V^[^[MRMWI/=[;5?)V.S;8/QC\(\W]F5Z?DK<[ +ML+GQP=S)O5TE;W=B<_-/85$"R\+FUF"NA4\=V=P6S'7PJ1W/R4]^;N_F>OB4 +ML#F%/.(NX$^$W"'?+8R[)>0. +M^6YAW"TA=\AW"^-N";E#OEL8=TO('?+=PKA;0NZ0[Q;&W1IRAWRW,N[6D#OD +MNY5QMT;<]?@IPMT:<=^6QEW:\1=CWRW,N[6B+L>^6YEW*T1 +M=SWRW*N1[X[,NZ.(7?(=T?&W3'D#OGNR+@[AMPAWQT9 +M=\>0.^2[(^/N&'*'?'=DW!U#[I#OCHR[+>0.^6YCW&TA=\AW&^-NB[@;\%.$ +MNRWB;D"^VQAW6\3=@'RW,>ZVB+L!^6YCW&T1=P/RW<:XVR+N!N2[C7&W1]P- +MR'<[XVZ/N!N0[W;&W1YRAWRW,^[VD#ODNYUQMX?<(=_MC+L]Y`[Y;F?<[2%W +MR'<[XVX/N4.^VPEWDK_#YX#OY$"XDT/('?"='`AWL +MOY.POYN0[UA_)V%_-R'?L?Y.POYN0KYC_9V$_=V$?,?Z.PG[NPGYCO5W$O9W +M$_(=Z^\D[.\FY#O6WTG8WTW(=ZR_D["_FY#O6'\G87\W(=^Q_D["_FY"OF/] +MG83]W81\Q_H["?N["?F.]7<2]G<3\AWK[R3L[V;\%.$N[.]FY#O6WTG8W\W( +M=ZR_D["_FY'O6'\G87\W(]^Q_D["_FY&OF/]G83]W8Q\Q_H["?N[&?F.]7<2 +M]G]8?R=A?SOO).SO%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y.POYN +M0;YC_9V$_=V"?,?Z.PG[NQ4_1;@+^[L5^8[U=Q+V=ROR'>OO).SO5N0[UM]) +MV-^MR'>LOY.POUN1[UA_)V%_MR+?L?Y.POYN1;YC_9V$_=V*?,?Z.PG[NQ7Y +MCO5W$O9W*_(=Z^\D[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q_D[" +M_FY%OF/]G83]W1$_1;@+^[LC\AWK[R3L[X[(=ZR_D["_.R+?L?Y.PO[NB'S' +M^CL)^[LC\AWK[R3L[X[(=ZR_D["_.R+?L?Y.PO[NB'S'^CL)^[LC\AWK[R3L +M[X[(=ZR_D["_.R+?L?Y.PO[NB'S'^CL)^[LC\AWK[R3L[X[(=ZR_D["_.R+? +ML?Y.POYNPT\1[L+^;D.^8_V=A/W=AGS'^CL)^[L-^8[U=Q+V=QOR'>OO).SO +M-N0[UM])V-]MR'>LOY.PO]N0[UA_)V%_MR'?L?Y.POYN0[YC_9V$_=V&?,?Z +M.PG[NPWYCO5W$O9W&_(=Z^\D[.\VY#O6WTG8WVW(=ZR_D["_VY#O6'\G87^W +MXZ<(=V%_MR/?L?Y.POYN1[YC_9V$_=V.?,?Z.PG[NQWYCO5W$O9W._(=Z^\D +M[.]VY#O6WTG8W^W(=ZR_D["_VY'O6'\G87^W(]^Q_D["_FY'OF/]G83]W8Y\ +MQ_H["?N['?F.]7<2]G<[\AWK[S1_Q\TU=0[X[N8IS)VZ_B[?I]=4[H#OE/5W +MZOJ[)G'79.[L@)_"W*GK[YK$7?-GF0.^4];?J>OOFI,[.T/WWRGK[]3U=^7L +MZASPG;+^3EU_!^:`[Y3U=^KZ.S`'?*>LOU/7W^6Y)W4.^$Y9?Z>NOWN2YYHR +M!WRGK+]3U]\]2=P]J=P!WRGK[]3U=T\2=T\J=\!WROH[=?W=D]/%V0'?*>OO +MU/5WY>SJ'/"=LOY.77\'YH#OE/5WZOH[,`=\IZR_4]??Y;FG=0[YCO5WZOJ[ +MIWFNOOU/5WS_-G_S9H?OOE/5WZOJ[LOU/7W[W(UCGD.];?J>OO7N:YRAWR'>OOU/5W+Q-W+PMWZ/X[9?V=NO[N9>+N9>$. +MW7^GK+]3U]^]//FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J^CLPAWS' +M^CMU_5V>>U7GD.]8?Z>NOWN5YPIWZ/X[9?V=NO[N5>+N5>4.^8[U=^KZNU>) +MNU>5.^0[UM^IZ^]>G2[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z.W7]'9A# +MOF/]G;K^+L^]KG/(=ZR_4]??OOO7B?N7A?NT/UWROH[=?W= +MZ\3=Z\(=NO].67^GKK][??)GA^Z_4];?J>OORMG5.>0[UM^IZ^_`'/(=Z^_4 +M]7=@#OF.]7?J^KL\]Z;.(=^Q_DY=?_6YRAWR'>OOU/5W5XF[J\(=NO]. +M67^GKK^[2MQ=%>[0_7?*^CMU_=W5R9\=NO].67^GKK\K9U?GD.]8?Z>NOP-S +MR'>LOU/7WX$YY#O6WZGK[_+LOU/7WY6SJW/(=ZR_4]?? +M@3GD.];?J>OOP!SR'>OOU/5W>>Y=G4.^8_V=NO[N79ZKW"'?L?Y.77_W+G'W +MKG"'[K]3UM^IZ^_>)>[>%>[0_7?*^CMU_=V[DS\[=/^=LOY.77]7SJ[.(=^Q +M_DY=?P?FD.]8?Z>NOP-SR'>LOU/7W^6Y]W4.^8[U=^KZN_=YKG"'[K]3UM^I +MZ^_>)^[>5^Z0[UA_IZZ_>Y^X>U^Y0[YC_9VZ_N[]Z>+LD.]8?Z>NORMG5^>0 +M[UA_IZZ_`W/(=ZR_4]??@3GD.];?J>OO\MQUG4.^8_V=1OV=H?OOE/5W&O5W +MANZ_4];?:=3?&;K_3EE_IU%_9^C^.V7]G4;]G:'[[Y3U=QKU=X;NOU/6WVG4 +MWQFZ_TY9?Z>DO_M0YY#O6'^GKK_[D.<*=^C^.V7]G;K^[D/B[D/E#OF.]7?J +M^KL/B;L/E3OD.];?J>OO/IPNS@[YCO5WZOJ[_-FA^^^,]7?F^KMR=G4.^8[U=^;Z +M.S"'?,?Z.W/]'9A#OF/]G;G^+L]9G4.^8_V=N?[.\ESA#MU_9ZR_,]??6>+. +M*G?(=ZR_,]??6>+.*G?(=ZR_,]??V>GB[)#O6']GKK\K9U?GD.]8?V>NOP-S +MR'>LOS/7WX$YY#O6WYGK[_)<6^>0[UA_9ZZ_:_-OOS/5W +M8`[YCO5WYOH[,(=\Q_H[<_U=GNOJ'/(=Z^_,]7==GBOZ0[UA_9ZZ_ZQ)W7>4.^8[U=^;ZN^YT<7;(=ZR_,]??E;.K<\AWK+\SU]^! +M.>0[UM^9Z^_`'/(=Z^_,]7=YKJ]SR'>LOS/7W_5YKG*'?,?Z.W/]79^XZPMW +MZ/X[8_V=N?ZN3]SUA3MT_YVQ_LY?_-FA^^^,]7?F^KMR=G4.^8[U=^;Z +M.S"'?,?Z.W/]'9A#OF/]G;G^+L\-=0[YCO5WYOJ[(<\5[M#]=\;Z.W/]W9"X +M&RIWR'>LOS/7WPV)NZ%RAWS'^CMS_=UPNC@[Y#O6WYGK[\K9U3GD.];?F>OO +MP!SR'>OOS/5W8`[YCO5WYOJ[/#?6.>0[UM^9Z^_&/%>Y0[YC_9VY_FY,W(V% +M.W3_G;'^SEQ_-R;NQL(=NO_.6']GKK\;3_[LT/UWQOH[<_U=.;LZAWS'^CMS +M_1V80[YC_9VY_@[,(=^Q_LY0[UA_9ZZ_^YCG*G?(=ZR_,]???4S< +M?2S3/#MU_9ZR_,]??E;.K<\AW +MK+\SU]^!.>0[UM^9Z^_`'/(=Z^_,]7=Y[E.=0[YC_9VY_NY3GBOZ0[UA_ +M9ZZ_^YRX^URX0_??&>OOS/5WGQ-WGPMWZ/X[8_V=N?[N\\F?';K_SEA_9ZZ_ +M*V=7YY#O6']GKK\#<\AWK+\SU]^!.>0[UM^9Z^_RW)X +M0_??&>OOS/5W7Q)W7RIWR'>LOS/7WWU)W'VIW"'?L?[.7'_WY71Q=LAWK+\S +MU]^5LZMSR'>LOS/7WX$YY#O6WYGK[\`<\AWK[\SU=WGN:YU#OF/]G;G^[FN> +MJ]PAW['^SEQ_]S5Q][5PA^Z_,];?F>OOOB;NOA;NT/UWQOH[<_W=UY,_.W3_ +MG;'^SEQ_5\ZNSB'?L?[.7'\'YI#O6']GKK\#<\AWK+\SU]_EN6]U#OF.]7?F +M^KMO>:YPA^Z_,];?F>OOOB7NOE7ND.]8?V>NO_N6N/M6N4.^8_V=N?[NV^GB +M[)#O6']GKK\K9U?GD.]8?V>NOP-SR'>LOS/7WX$YY#O6W[7Y.V[N>YT#OFM9 +M?]>Z_NY[GJO<`=_=/(6Y:UU_]SUQ]SUSUQ[P4^3//79O]GONC:_+'/KSMLM3 +MP=R];S]^N[H;1/=5M24#C%[?G_[UH?NJ?N7U=;?GUVISF,'?^0_\^.OUP[_* +MX.W=0?_!8'Z%#^?R&^[N[@ZZC::V&W?NZ>,@]]_P4*_3`V_XR?6].?1G,__* +M^:'K?GXVV'7-/%\,_D]^?;?7_;1=T_9-.Z6+'%MI.FVZMLS=OM=NO?_Z?O_; +MWYL__O+/_SZ/_6]]N[?7_=P\/(VWOUOB#ND@[.W^L_S^PGWZNKOK?BY..\\9 +MFRNWS+FYVR_?W4_FT`>?:W_VU$'IJ[OXN;V;N_WRW=;_Y7C_J?//4==L<[,O +M9.[WWQ_.H3\^_E?(N[TY8.F;X>;_M-[\`D^:=3]_Y]B?__#=9KSY-+G[5S-Z +M^]\R3>Y1_SL.,\] +MXF?'>>Y1/SO.@X_XV7&>>\3/CO/<(WYVG.<>];/C9O#V]QP?Z8OX>>[,WFY- +M.S;;#$M-3$R+6=P="YQ8V]W,BYO=70`K9A+;YPP$(#O -M^15.WTT:BLVL/[`*G*E+OM+^]&!N\F!F<;+V+5HFL^30V -MWXP-:6H^C"G.9,9DR=HMZ_^W%["]?^87ZVXWU\G^ISLR,)X24&J($X@45L*MPOB)!)5 -M4[@FB%-(5$O@>$"5'I-X=6]PCAVN1*,H[ -M\+Q[;'%/)AS'HBCOP//NJ<4]/;>X%PZ']#N@O`//NY<6=^)P -M2+\#RCOPO#NUN%<.A_0[H+P#S[NSA7<2<\[UY;5NIP2+\3E'?"\XY; -M'#@"\DYXWBF+RQP.Z7>"\DYXWN465S@XO[X'!(OQ.4=]+S[J/%?7(X -MI-])RCOI>7=N<1<.A_0[27DG/>\N+>[SA`,L:O(N3?'+XJX6-0M(OY/9/7&; -M)8Y^6#GD."O=<9LCO_3`"K!X.)#<:Z4YI\2;L#(3UE95R"\]T%TD\^\$'&KW -M`<`QPSG.3EB9VC4/C$W#VM9>9J5L<-ZZ`P(RX>-D#U='7K^AW!X`5(I5U0+X -M?^OLR[@=YN-30#!4S)"3?,5>WV\[O:7+.;\Z_?-.R'F^Y0;AK7Z(>E -M*O.RX]1TK[X@]BE3;LO5'G&"PDW',@^GCQ=YO8+#+M;](7!R+6IZZ7"/>VMP -M*IU'[;XWT -M7ZNG^_)615N]TLJ"7?0`N7J563U\D712:,ETXZJ-!3?BMI%7+]/#?7WT_7OY -M2P]T-\G\:X#2`J-E*+-V%[$Z-"YB=6A(:I]TK"Z9J5DK6UO,TR.VX2WZBTVU@;>M?V<3QF]%$W,0U;G43 ->SQMRLO;SUYMLQ$U#$M-3$R+6=P="YQ8V]W,BYO=70`K9A+=I/9,;DFGO?4"-APSTSOM;R]"`H'818DKF_'$H]DO*_'M +M2B9-S8LQQ9G,F-RPIF+==WL!FWR97ZR]W]TFTU=[8F`\):*0`2E&W(QUXW!` +MX5*^'.`X;I*=0'`P1"U!(9PDLUL;0'#G)_W2]3>C\"+$,4"#(V_&4?F!R<^/ +MD$?F!['S$_CZJ2'.'\C6\Q,F/S\JIW!%$`=(U(;"E4&<0*(J"KB!(6305R!1%'>\;!W&R2*\HZ'O2N1*,H[ +M'O:N0J(H[WC8NST217G'P]X=D"C*.R"\8PY7(U&4=^!Y=VIQSQRN0:(H[\#S +M[KG%O1AQ'(NBO`//NY<6]\KAD'X'E'?@>??:XLX<#NEW0'D'GG=O+.[-Z]LZS4X9!^)RCOA.<=MSAP +M.*3?"=Y\L[K/#(?U.4-Y)S[LO%O?5X9!^ +M)RGOI.?=E<5=.QS2[R3EG?2\N[&X;R,.L*C1NS3%+XO;+FH6D'XGLT?B=DL< +M_6/EF..L=,=MCGS2`RO`XNE`7V!*!2K"P7P)]# +M?GVY=?5EG@UT=JN^&2A@2HZX?JYJ/\UON[ME=U???VC8+S?=OMR:_E]VAX>B +M]++C]'3/EO8I4V[+U1YP@L2=)BA.'R_RPPH.NUC[A\#)M:CQH<,C[JW!Z>/% +M^%.[NZ9MJ[]'BM7E_/G-%+?=SG%99/.D'JXREN]95NOG2?M&_W'(]*\T5G1E +M8K9MZ,]8&Y9S?7;K@.W#??)@8)?)[PN;G^36".RB!ZC5D[!FA$XJ,%TVQV&/ +MD?YK]71?KE2TU=O8-H5=]`"Y>J59/7R1=%)HR;3#J@T%-^"JR*N7Z>&N/KK^ +MO?RD!]J[9/XV0&F!T3*46;./6!T:%[$Z-"YB=6AY/GZ?_`/D@(G0%1H````` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu b/usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu index 99668623653c..bacb98c3a070 100644 --- a/usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-512-gpt.raw.gz.uu @@ -1,15 +1,15 @@ # $FreeBSD$ begin 644 img-1x1-512-gpt.raw.gz -M'XL(",9Q+ED``VEM9RTQ>#$M-3$R+6=P="YR87EIJKH,&+Z/(6S'"-6>OQ:8-8YR(N)1N>QG06BC+!?`]Q:?[X[!@')@]Z/"^!*/` -M:K#F%]?G:NMQ?(]/SW"X?WU#V,;L1I]%I4 -M.^$*$K?-XXIXMC0NMVF<6?.*/?2_LXTX*Z=>?NSE+7@-KH:F)'&?$YQC[CR# -MYLK!K@9W!*N@;O&A<:!4B"_(Q/>04-\&Y!YV"G2%P.[T(DX1=B.^KH?XC!HZ -M(K=I`U4]H]@C_+^7=]K0'<3TBD`S`-DB#,WG&-6!.$9U((Y1'8AC50<"&=6! -M.$9U((Y1'8AC54<`>LDWQ!'7#W$#NP::`HKY$*?&<2>^Q6TF7:_71O_*$,\? -CAF<#$M-3$R+6=P="YR87<5G*6!5L-[ +MCQ/C=1037#5Z+5;<,,6)@!O2;?8!K85S"^#7$)_NCL/"I#`YM-\O812LAC4W +M7)>K+:?QG5_?<'G^^"38]YBN5M[H2CB#^H0FN8M._3_=@-/DM:CV@$NBN.,Z +M+@EG&\>MK3C.;'F%'MJ3K`W)WG9F4R\Z(XO:H2DBN/-YCDN9.\^0N4AQ*I'6 +ML`IE0R]5"J6`S,LDZR"^OA5DCI."+@C87M_%-<">Q,]C'Y]1?4>LK;@A5CVC +MMSJ"@OHC79:M>WO^FUE;<$*V>"]5;+U)4,NU0M4$A`ZY@KEY* +M9J\/__]>/N.&]B+F=P":'L@6H6^^E%$=A&-4!^$8U4$X5G40D%$=A&-4!^$8 +MU4$X5G5X8";YACCANB%ND.;J9WAK]&T-\_3`RQB%.N.TA +8GNQ-EG&($XYUB'N@D_+P"ZG]1LB("P`` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu b/usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu index 03166658a927..13690cbdafd4 100644 --- a/usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-512-gpt.vhd.gz.uu @@ -1,22 +1,22 @@ # $FreeBSD$ begin 644 img-1x1-512-gpt.vhd.gz -M'XL(",9Q+ED``VEM9RTQ>#$M-3$R+6=P="YV:&0N;W5T`*V82W/3,!"`[_D5 -MV^%6!H_>=F[0F3)P*PP,%RY^I62`\&@//9C_CE:6;,NV#&G743U)E/V\+ZVV -M8JR_`(P$7Q^^W`2<\3GB0SE%*"C#5XCG*?EOTVB'I -MTU%\=^[=J:?2*2*&?3CBSF9-E?X5!'AQUX#A>F\92XXROTB>5" -M=*T3F`X3PID?>V]$P50_P]F&S]/!2.I7HGYV,;!RY9Z>Z*ZR^#4`J^H\8/!@ -MC!L,KFKTGZL#;3M:U">)%Y82!$\&1%Y,_%^^M.PF56ETR85?+LHL85]%ZC[OVT:X/6[^7]_1$=Y/%KQXH -M_#9$MJ\)7TC)-%0>2*:A\NN74$.N-H-Y;I25R`5AA4$<885!'&&%01QIA4$@ -M885!'&&%01QAA4$<:86Q0)?,1(T0XGS?;/UQ;=G\!II']:``3```` +M'XL("-27?5P``VEM9RTQ>#$M-3$R+6=P="YV:&0N;W5T`*V82V_4,!"`[_LK +MINJMB"A^9O=(I47B@"@(Q(5+'DZ[`I9'>^@A_'<\CIW$FSBP[63=*+O.?)F7 +MQ]/D>7\`:`&Z!6U`*[PN).@=%%L`.^D'=V?FOT)7_SB:^N'PF/FCV_0PED^E +M8G&4YP*D?4@!O,2'Z`:OH0N8[')_>W7X?AMPW..X!ZD"I00'7(^VOVUX[ +M)'T^\*\.>7TW:"?FVHU2]J]H()?`V.0.$;2SF.Q/;*RT4FWKAH;&H.PPHB_1 +MQ&CLB>]4?B(U47/)J?EH[!).KTF=@[O:^%CTJ6(3H[#G'#2#@N.U39O@A]FP +MJ?)X_[/\?6].]..)5-&#?FPV)]+F&U$PU4^S?,7GZ6`D]2M1/[L8\G+AG)[HKK/X,P"KZCQ@ +M\&",&PRN:O2?JP/&C!;U2>*%A0#.D@$1%Q/_50UQ?*OV/*!24)8SX*>@7^W" +MH4!JD#M,#%L<)`/%08WI[&Q5]52__>LW$?1G-K3%=9`-E#8RCGV+M +MYBO-X]Y:MRTLMAH7V]S;`2=2N#X$)V]^LW=QN +M;W9CMXZN$-@=WV?''O8R^_7"ZV>8SXBED9Y(><_PM8Q`I?YA+L0XZKILMN@] +M1>:]G2]32R,]D?1>V7MOV4FHU.*2";M:EEW$N(K6>\RUCW9]V/H]/Z<$)*PSB""L,X@@K#.)( +M*PP""2L,X@@K#.((*PSB2"N,!;ID)FJ$$.<:H19,`SO[CTL=JY%L:;IW6?8- +M42(V5_*U]BG=""6"(0D;(<2M-D(B'5M_\!-C"1LAQ)$V0MH74J)W&3HT0G,= +MGO(N0X=&:'C\L]YEZ.5&Z*GO,A!'^"X#<83O,A!'G"K8MVS^`DBJ@3\`$P`` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu b/usr.bin/mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu index e574937cdfa2..d1802316557a 100644 --- a/usr.bin/mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-512-gpt.vhdf.gz.uu @@ -1,19 +1,19 @@ # $FreeBSD$ begin 644 img-1x1-512-gpt.vhdf.gz -M'XL(",9Q+ED``VEM9RTQ>#$M-3$R+6=P="YV:&1F+F]U=`"METV/TS`0AN_] -M%8,X5%I$9#NVDQQ!6B1N!1;MA4L^G%4%%"%QX-`?SXSMM'9C!Q8YL:)4DWDR -M\V8FDS+F-@`I@/6)8]YP?EO%^WEWM[,T/CP/B/>G$&Z`%0(=;D0C$W2-,3#/ -M?C%NO9PS_A:-/U]PU77;5P%NNGBM5]X0XBJ'6]*=GP=4"OI^!?R\Q"?LXU`@ -M-<@.!%[/0')0`I2\X&SN:@SCNW_W'@YO/CX0[,LU7<'1.(_036`:0L31\8UT -M'^)T'4X0;J7V@JNSN/VM>@Y7$V[:P*56'B>WO%P-_=NS=3C%8J\V]&H5M`+T -M"%.?Q7V+<+IPY4DR#QJ:$;0!Q6&3Q^J -MDX.]KGZ^\O%)[BLBM?*&G'I2;%4$!?67="'&U:75:TD]54R]SA=+:N4-6?5Z -MIUY:)`HJU;J(\ZI5+V+<4%@]36;L#WQ_KX]YP_E0Q;L#2@\L%J&5TU^ -M'&-\CY]L8/LH72.V1O_&$$\_#%-PB!-N#$M-3$R+6=P="YV:&1F+F]U=`"ME\V+U#`4P._S +M5SSQ,+!B:-)\M$>%$00/HRA>]M*FR3*(LPB"*_2/-Z])I\U,4EU)^R@97O/K +M^^SK5)4_`#B#JDM<\XKQ+8G/<7>WFVBT?Q[0/1]-N`(2!_0X[905PWN,`6N# +M5'3:Y3>[WTR%]8PCR[$G*]QPV74K><4:1SQN=M<^#R@$=-T-\,ML'YO2(8!+ +MX"TP=W\%G()@(/@%-_DN]-J^P[OW<'SSZ3/"[A=W&465R-N&$#EY(\CF_M\C7T;[GU.($XOMS9K'=A +MC@28#FR?P1T.,4X6KCR.ZEZ"TB`-"`K:XF*00"E`X]K$IYL!&Z!J05%@/0+' +M\T=R]K#7Y,>K8!^GH2)2DE?DHL?95D6@47]Q%V)<73IZ#49/%(M>&UY3*\XKQ2.+3`WD`%K.06ZL+ +M=@?B"G8'X@IV!^**=@<""W8'X@IV!^(*=@?BBG:'`YJJW!!''-:>M$`'4&Z( +MV]B,[#@>'\DO;]@^PK=&_,<33R3`%ASCB-H>X-3EG+YPK9PL.<<05'>(B +M?'[+&M/K^DL*7"L.LL6/M16$+34S`?7CV>B?IZ<%Z''45T12<#^KT6.I@'7X +M$#G@>F7?R\/#W>G[PXQCP:OYVTDHW%4SD/V-NR)V]^N)?9N0Q\6ZQ&M*K*/7 +M2LP5I9'CP;IC7"IB^@*:G346&C[E>9;H1Z1(%C+BYE*YR/_FUN-*EXK[:[#[ +)`]C5KH*S#0`` ` end diff --git a/usr.bin/mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu b/usr.bin/mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu index cbd9d1bb4e40..86f2f54cfa15 100644 --- a/usr.bin/mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu +++ b/usr.bin/mkimg/tests/img-1x1-512-gpt.vmdk.gz.uu @@ -1,87 +1,87 @@ # $FreeBSD$ begin 644 img-1x1-512-gpt.vmdk.gz -M'XL(",=Q+ED``VEM9RTQ>#$M-3$R+6=P="YV;61K+F]U=`"M7%V/W,81?/>O -MF,@/#A)DP5J2R^6#@-@Y&S""`(JEQ"]Y"#_C0^23N/SY -MZB]_/_#GMX?#Y8L%##Y*0I`IG!BK][D<'OP0[OA'PJA*MKYL.]?R%P+@*Y%5SY1$[)9)];W>^^",7SZ\O]&J;M/=6N -MRMVI#:8[E;.=N^HX'\M<-3F-$^"7[NKZT[_=U?"IN[W^>/ -M_]1YA"FQZN1?^`,>KO80I\'EOMPYF:'C\TMX7S4M)#IO:<\%/=TW7!SYQ''\!-7Y_T9\V\ZZYR_OKNY^NN[=3 -MFI^&5X%.OG;3!I[#NI:LIY!3G95^^_=_=E*_KP\Y>$VY>Q)S$]-[E -MT965QYHV<-Z*H\L+_VKZIVG!4R8%O).[?+@Y_/#C=(G[8KU]\_4/A#M/49/G -MM,`I9$IHE5.YY%\^/"W=Y>VW[I5/\MU/PWP&$JY>+C/OO.P#9O/H7X2J+?"^ -MB17^P+RS[JJY:]PWS:?A\.75U3=Q9QN?;#$_IJ4-'N6T0/OS>R[G5+AEIY>- -MGK>B[]M#TSUN-_&]?M4\TZ-_HQQE]?NU74_[:F' -M_=?PX6?"=[5O*MQ>80;_.KZ1PN<]S,4,BXJOJV[ -M_#PO[Z>AZ:>E3=B$&_WJCD^O(U3JP5M-Z.YR7[49]U.`R[/0`O+0RE8EBLM9 -MWE`:Z-#=?;A=%O9*^G'^\+/LI?VX>/216OU*P`7.>GVG[,'G6:YQA1CE"M!_ -MBF73[Q^GWS?WZSOY]9W$L]*HLQCU"NZ?$\3'Q^F>_%78B&>K49T8_9[JG7QK -M&\1S?%@]?M6`O$[#\;L`/7.-*L0H5W"IVI6A=O2L-.HL1KV"2]7N%&I'SU:C -M.C'Z7N8:58A1KN!2M:M#[>A9:=19C'H% -MEZI=$VI'SU:C.C'Z7JW1!J1\]6HSHQ^EW)CJ%V]!PURC\54KMB"Z[*0NWHF6M4(4:Y -M@DO4KF*_HV>E46E4:=Q:A7<*G:L=_1L]6H3HQ^5[+L=_0<-N4848Y0HN53OV.WI6&G46HU[!I6K'?D?/5J,Z,?I=R;+?T7/4 -M*/]$0@;R.@EWSD+MZ)EK5"%&N8)+U.[,?D?/2J/.8M0KN$3MSNQW]&PUJA.C -MWY4L^QT]1XWR3[74KMZ$8[^C9ZY1A1CE"BY5._8[>E8:=1:C7L&E:L=^1\]6 -MHSHQ^EW)LM_1<]0H_\3_/T%>I^'8[^B9:U0A1KF"2]6._8Z>E4:=Q:A7<*G: -ML=_1L]6H3HQ^5[+L=_0<-H0HQR!9>J'?L=/2N-.HM1 -MK^!2M6._HV>K49T8_:YDV>_H.6J4?^JD=MT67)V%VM$SUZA"C'(%EZA=S7Y' -MSTJCSF+4*[A$[6KV.WJV&M6)T>]*EOV.GJ-&^:=>:M=OPK'?T3/7J$*,<@67 -MJAW['3TKC3J+4:_@4K5COZ-GJU&=&/VN9-GOZ#EJE'\:I';#)AS['3USC2K$ -M*%=PJ=JQW]&STJBS&/4*+E4[]CMZMAK5B='O2I;]CIZC1OFG46HW;L*QW]$S -MUZA"C'(%EZH=^QT]*XTZBU&OX%*U8[^C9ZM1G1C]KF39[^@Y:E0FTS/(ZR1< -MDRVUBYZY1A5BE"NX1.V:T.^B9Z519S'J%5RB=DWH=]&SU:A.C'Y7LJ'?1<]1 -MHWS)A+_#)J75A'X'X>^@_!V$O\,F?]>$?@?A[Z#\'82_PR9_UX1^!^'OH/P= -MA+_;D6SH=Q#^#LK?0?@[;%):3>AW$/X.RM]!^#ML\G=-Z'<0_@[*WT'X.VSR -M=TWH=Q#^#LK?0?B['^@_!V$O\,F?]>$?@?A[Z#\'82_VY%LZ'<0_@[*WT'X.VQ26FT6:B?\'92_ -M@_!WV.3O6O8[X>^@_!V$O\,F?]>RWPE_!^7O(/S=CF39[X2_@_)W$/X.FY16 -MRWXG_!V4OX/P=]CD[UKV.^'OH/P=A+_#)G_7LM\)?P?E[R#\W8YDV>^$OX/R -M=Q#^#IN45LM^)_P=E+^#\'?8Y.]:]COA[Z#\'82_PR9_U[+?"7\'Y>\@_-V. -M9-GOA+^#\G<0_@Z;E%;+?B?\'92_@_!WV.3O6O8[X>^@_!V$O\,F?]>RWPE_ -M!^7O(/S=CF39[X2_@_)W$/X.FY16EX7:"7\'Y>\@_!TV^;N._4[X.RA_!^'O -ML,G?=>QWPM]!^3L(?[^@_!V$O\,FI=6QWPE_!^7O(/P=-OF[COU. -M^#LH?P?A[[#)WW7L=\+?0?D["'^W(UGV.^'OH/P=A+_#)J75L=\)?P?E[R#\ -M'3;YNX[]3O@[*'\'X>^PR=]U['?"WT'Y.PA_MR-9]COA[Z#\'82_PR:EU;'? -M"7\'Y>\@_!TV^;N._4[X.RA_!^'OL,G?=>QWPM]!^3L(?[^@_!V$ -MO\,FI=5GH7;"WT'Y.PA_ATW^KF>_$_X.RM]!^#ML\G<]^YWP=U#^#L+?[4B6 -M_4[X.RA_!^'OL$EI]>QWPM]!^3L(?X=-_JYGOQ/^#LK?0?@[;/)W/?N=\'=0 -M_@["W^U(EOU.^#LH?P?A[[!):?7L=\+?0?D["'^'3?ZN9[\3_@[*WT'X.VSR -M=SW[G?!W4/X.PM_M2);]3O@[*'\'X>^P26GU['?"WT'Y.PA_ATW^KF>_$_X. -MRM]!^#ML\G<]^YWP=U#^#L+?[4B6_4[X.RA_%\5TD-<"YY;?`#=D2^V>E)0_ -M\4^Q=N[)U0W6^L!QW`N8/YVNW^.8+K)GE_'YZ\.L7XPSCZ7JOPYP@3.N'^+\ -M7Y^DK$^3L?+])7(L[?^7B1OA)Q_L['B_25B/-W$WTEXOS=1%^).'\W -MT5+\W41?B3A_ +M'XL("-67?5P``VEM9RTQ>#$M-3$R+6=P="YV;61K+F]U=`"M7%UOY,81?/>O +MF)P?'"3(@K4DE\N'`V)'9\!(`EQL)WG)0_@9"[%U%YV0^(#]\>&04Z.BI!%Y +M5NNHVVUM=^UTS[(I51>89DXGOG"Y8]7 +M?_[;@5^_/APNGRU@\%$2@DSAQ%B]S^7PX(MPQ^>B5B],QW$3+O=1[:/``'=, +MO)"$*Z87CT^%<'7-_'+OGPB=6]YO/0O'\^G*_AFE[3[6K +MSLY%R?O +M?^H\PI18=?)/_`L>KO80I\'EOUOD +MKJC][_.&;J]?ADYL=WC>WA/-1TT*F]Y[R4-S3R?GO +MQ\>\NN'FSB..X2NNSN]M*$XYOW?AGY2%JVHW+Z?TV,?IY3ZD/->NNQV:N^'[ +MC^^'UZ]^>G<3:^?WUI>LGH'.*J3FRU=Z1/^QF7?-77Z\OOOANOMN +M2O/#\.KPN2/2]11R2N[LM.S+FY_OIGQ='W;VFG#S(N8DIO^&?3CZ8%3YD4\$[N\N[F\.W?IU/<%^N[MU]^2[CS%#5Y +M3@N<0J:$5CF52_[EPX^ENWSWQKWR27[_PS!_`@E7+Z>9=U[V`;-Y]$]"U19X +MW\0*_\*\L^ZJN6O<5\V'X?#YU=57<6<;GVPQ']/2!H]R6J#]YWLNYU2X9:>7 +MC9ZWHN_;0],W[^^&6[^]<2M:7Z(^9.JWM;C?QO7[5/-.C?X3XRZOW:OK?MI3 +M#_NOX=U/A.N6C_&T#O^1J.?`W#^9/CTS_!#>8?G$^&WR<,/=[<=#]_''ZYM^ +M.M'<:\+U2^VFY2R[>;^9TP9.*WQR@5/M7LV[&I='N,&OKG^TP'D_0R'CHN+; +MNLM/\_)^&)I^6MJ$3;C1K^[X]#I"I1Z\U83N+O=5FW$_!+@\"RT@#ZUL5:*X +MG.4-I8$.W=V[VV5AKZ0?YP^O92_MQ\6C2VKU"P$7..OUG;('U[-ZIU\ +M:QO$AN/O`O3,-:H0HUS!I6I7AMK1L]*HLQCU"BY5NU.H'3U; +MC>K$Z'1JN"[6C9ZY1A1CE"BY5NS[4 +MCIZ51IW%J%=PJ=H-H7;T;#6J$Z/?E>P8:D?/4:/\0R&U*[;@JBS4CIZY1A5B +ME"NX1.TJ]CMZ5AIU%J->P25J5['?T;/5J$Z,?E>R['?T'#7*/Y12NW(3COV. +MGKE&%6*4*[A4[=COZ%EIU%F,>@67JAW['3U;C>K$Z'N4848Y0HN53OV.WI6&G46HU[!I6K'?D?/5J,Z,?I=R;+?T7/4*/_` +M7X(@S]-P['?TS#6J$*-@67J-V9_8Z>K49U +M8O2[DF6_H^>H4?ZAEMK5FW#L=_3,-:H0HUS!I6K'?D?/2J/.8M0KN%3MV._H +MV6I4)T:_*UGV.WJ.&N4?^/<3Y'D:COV.GKE&%6*4*[A4[=COZ%EIU%F,>@67 +MJAW['3U;C>K$Z'K8:U8G1[TJ6_8Z>HT;YAT%J-VS"L=_1,]>H +M0HQR!9>J'?L=/2N-.HM1K^!2M6._HV>K49T8_:YDV>_H.6J4?QBE=N,F'/L= +M/7.-*L0H5W"IVK'?T;/2J+,8]0HN53OV.WJV&M6)T>]*EOV.GJ-&93(]@SQ/ +MPC794KOHF6M4(4:Y@DO4K@G]+GI6&G46HU[!)6K7A'X7/5N-ZL3H=R4;^EWT +M'#7*ETSX.VQ26DWH=Q#^#LK?0?@[;/)W3>AW$/X.RM]!^#ML\G=-Z'<0_@[* +MWT'XNQW)AGX'X>^@_!V$O\,FI=6$?@?A[Z#\'82_PR9_UX1^!^'OH/P=A+_# +M)G_7A'X'X>^@_!V$O]N1;.AW$/X.RM]!^#ML4EI-Z'<0_@[*WT'X.VSR=TWH +M=Q#^#LK?0?@[;/)W3>AW$/X.RM]!^+L=R89^!^'OH/P=A+_#)J759J%VPM]! +M^3L(?X=-_JYEOQ/^#LK?0?@[;/)W+?N=\'=0_@["W^U(EOU.^#LH?P?A[[!) +M:;7L=\+?0?D["'^'3?ZN9;\3_@[*WT'X.VSR=RW[G?!W4/X.PM_M2);]3O@[ +M*'\'X>^P26FU['?"WT'Y.PA_ATW^KF6_$_X.RM]!^#ML\GQWPM]!^3L(?X=-_JYEOQ/^#LK?0?@[;/)W+?N= +M\'=0_@["W^U(EOU.^#LH?P?A[[!):759J)WP=U#^#L+?89._Z]COA+^#\G<0 +M_@Z;_%W'?B?\'92_@_!W.Y)EOQ/^#LK?0?@[;%):'?N=\'=0_@["WV&3O^O8 +M[X2_@_)W$/X.F_Q=QWXG_!V4OX/P=SN29;\3_@[*WT'X.VQ26AW[G?!W4/X. +MPM]AD[_KV.^$OX/R=Q#^#IO\7<=^)_P=E+^#\'<[DF6_$_X.RM]!^#ML4EH= +M^YWP=U#^#L+?89._Z]COA+^#\G<0_@Z;_%W'?B?\'92_@_!W.Y)EOQ/^#LK? +M0?@[;%):?19J)_P=E+^#\'?8Y.]Z]COA[Z#\'82_PR9_U[/?"7\'Y>\@_-V. +M9-GOA+^#\G<0_@Z;E%;/?B?\'92_@_!WV.3O>O8[X>^@_!V$O\,F?]>SWPE_ +M!^7O(/S=CF39[X2_@_)W$/X.FY16SWXG_!V4OX/P=]CD[WKV.^'OH/P=A+_# +M)G_7L]\)?P?E[R#\W8YDV>^$OX/R=Q#^#IN45L]^)_P=E+^#\'?8Y.]Z]COA +M[Z#\'82_PR9_U[/?"7\'Y>\@_-V.9-GOA+^#\G=13`=Y+G!N^0YP0[;4[DE) +M^1,_BK5S3ZYNL-8'CN->P/SI=/T>QW21/;N,3U\?9OUBG'DL5?]E@`N<;Q(7XDX?^?Q(GTEXOR=QXOTE8CS=Q-])>+\W41?B3A_ M-]%7(L[?3?25B/-W$WTEXOS=1%^).'\WT5+\W41?B3A_-]%7(L[?3?25B/-W$WTEXOS=1%^) -M.'\WT5#\W49?"<[?;?25X/S=1E\)SM]M])7@ +M.'\WT5+\W41? +MB3A_-]%7(L[?3?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25 +MX/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@ M_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\ MW49?"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S= -M1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U& -M7PG.WVWTE8CS=WJ^2%^).'^GYXOTE8CS=WJ^2%^).'^GYXOTE8CS=Q-])>+\ -MW41?B3A_-]%7(L[?3?25B/-W$WTEXOS=1%^).'\WT5+])6(\W=ZODA?B3A_I^>+])6(\W<3?27B M_-U$7XDX?S?15R+.WTWTE8CS=Q-])>+\W41?B3A_-]%7(L[?3?25B/-W$WTE MXOS=1%^).'\WT5+\W41?B3A_-]%7(L[?3?25X/S=1E^)P51?B<%47XG!5%^)P51?B<%47XG! -M5%^)P51?B<%47XG!5%^)P51?B<%47XG!5%^)P51?B<%47XG!5%^),'QV&9^_OF*N -MWW)WU<=_IP]7EGWK*(<'/N9:?K^_:[ -M[]V;KW]XY\'^<9_N?'OGL7-U[X;*0ZQ7AV?2???XZBCFVSL_KC;A\B3<5T]= -M;,5\>^>Q?P;NJ4<:KG@NZG/O!%[,MW?6*%7?NG/ISD=__]Z^2<*]7\&=C,^\ -M^EG;GZ3)9_N=W=,?>*Q$JN*._(_/A19//]('4M4KCL^=$7Y1&^FZ-5QN73W_?:4MS:I7AY/EJ4?Z -M0+)ZS5*]Q*?:M*BG+MT)CI]JOUG#M<;5FU7YB_#D\=_I`YVN#@]G>'5X.,.KP\.97AT>T/#J\'"&5X>',[PZ/)SIU5'X&T;:?8A[ -M.'_N]5/-:W\/_W)]UJ0_CJ?U_?AV7MA7JW1GSC'YT?_,A_C3FS$8?HA[N&<_ -@Q,9"LX8>XAS/]$"_\W3NS+_X/OKS-T+1E```` +M)>+\W41?B3A_-]%7(L[?3?25B/-W$WTEXOS=1%^).'\WT5#\W49?B<%47XG!5%^)P51?B<%47XG!5%^) +MP51?B<%47XG!5%^)P51?B<%47XG!5%^)P51?B<%47XG!5%^)P51?B3'+#/65 +M&$WUE1A-]9483?65&$WUE1A-]9483?65&$WUE1A-]9483?65&$WUE1A-]948 +M3?65&$WUE1A-]9483?65QRS+#/65QT?W.MX)]SC911]XA*F^\GA\=AF?OKYB +MKM]R=]7'_Z=?N'QU6/^+@&@_#9`K7,,QX0+^W%BT7L/@QC$_'7-3SS7EY9]ZRB'!S[F6GZWOS +M]3?N[9???N_!_G&?[GQ[YZ+S]UGM*G]GX?7JD$KW3Q\//S\^.XKY]LZ/JTVX +M/`6W;,%C.'_Y'OMGX)XZTG#%B?P8KZ]J;^<]*MW0N+%-P+UY +MLX8[&7_RYCO/MB=7=?[^P25<-]_LN3]Y6MJ=I]-DV>ZC._9>B5#!'?T=F0^7 +MF[\<;A:PWQW^\]NPON7.LWCZ2+^0JEYQ?.X3X1>UD:Y;P^76U?._K[2E6?7J +MT*:>.M(O)*O7+-5+7-6F13UUZDYPO*K]:@W7&E=O5N4OPI/'_Z=?N+P]K/\M +M@$4`-%MAX6\I:'=V>#C#L\/#&9X='L[T[/"`AF>'AS,\.SR[]S<-OS8^___5OU_?_ -M^/';W9@Y`3Y%N).0NQ$^1;B3D+L)/D6X -MDY"[&3Y%N).0NP4^1;B3D+L5/D6XTY"[#3Y%N".?%_>XV^%3A#N-N!/\%.%. -M(^X$^4X9=QIQ)\AWRKC3B#M!OE/&G4;<"?*=,NXTXDZ0[Y1Q9Q%W@GQGC#N+ -MN!/D.V/<6<@=\ITQ[BSD#OG.&'<6*GR+]:QET;<:?(=RWCKHNX4^2[CG'71=PI\EW'N.M"[I#O.L9=%W*' -M?-'W"'?S8R[.>0.^6YFW,TA=\AW,^-N#KE#OIL9=W/('?+=S+B;0^Z0[V;& -MW1)RAWRW,.Z6D#ODNX5QMT3<]?@IPMT2<=^6QAW2\1=CWRW -M,.Z6B+L>^6YAW"T1=SWRW<*X6R/N>N2[E7&W1MSUR'2O\/G@._D0+B30\@=\)T<"'=RB+@; -M\%.8.PG[NP'X3EA_)V%_-P#?">OO).SO!N`[8?V=A/W=`'PGK+^3L+\;@.^$ -M]7<2]G<#\)VP_D["_FX`OA/6WTG8WPW`=\+Z.PG[NP'X3EA_)V%_-P#?">OO -M).SO!N`[8?V=A/W=`'PGK+^3L+\;@.^$]7<2]G<#\AWK[R3L[P;D.];?2=C? -MC?@IPEW8WXW(=ZR_D["_&Y'O6'\G87\W(M^Q_D["_FY$OF/]G83]W8A\Q_H[ -M"?N[$?F.]7<2]G]8?R=A?SOO).SO)OP4X2[L -M[R;D.];?2=C?3OO).SO)N0[UM])V-]-R'>LOY.POYN0[UA_)V%_ -M-R'?L?Y.POYN0KYC_9V$_=V$?,?Z.PG[NPGYCO5W$O9W,WZ*OO -M).SO9N0[UM])V-_-R'>LOY.POYN1[UA_)V%_-R/?L?Y.POYN1KYC_9V$_=V, -M?,?Z.PG[NQGYCO5W$O9W,_(=Z^\D[.]FY#O6WTG8W\W(=ZR_D["_FY'O6'\G -M87\W(]^Q_D["_FY&OF/]G83]W8Q\Q_H["?N[!3]%N`O[NP7YCO5W$O9W"_(= -MZ^\D[.\6Y#O6WTG8WRW(=ZR_D["_6Y#O6'\G87^W(-^Q_D["_FY!OF/]G83] -MW8)\Q_H["?N[!?F.]7<2]G<+\AWK[R3L[Q;D.];?2=C?+]8?R=A?[OO).SO5N0[UM])V-^MR'>LOY.POUN1 -M[UA_)V%_MR+?L?Y.POYNPT\1[L+^;D.^8_V=A/W=AGS'^CL)^[L-^8[U=Q+V -M=QOR'>OO).SO-N0[UM])V-]MR'>LOY.PO]N0[UA_)V%_MR'?L?Y.POYN0[YC -M_9V$_=V&?,?Z.PG[NPWYCO5W$O9W&_(=Z^\D[.\VY#O6WTG8WVW(=ZR_D["_ -MVY#O6'\G87^WXZ<(=V%_MR/?L?Y.POYN1[YC_9V$_=V.?,?Z.PG[NQWYCO5W -M$O9W._(=Z^\D[.]VY#O6WTG8W^W(=ZR_D["_VY'O6'\G87^W(]^Q_D["_FY' -MOF/]G83]W8Y\Q_H["?N['?F.]7<2]G<[\AWK[S1_Q\TU=0[X[N8IS)VZ_B[? -MI]=4[H#OE/5WZOJ[)G'79.[L@)_"W*GK[YK$7?//,@=\IZR_4]??-2=W=H;N -MOU/6WZGK[\K9U3G@.V7]G;K^#LP!WRGK[]3U=V`.^$Y9?Z>NO\MS3^H<\)VR -M_DY=?_+LP.^4];?J>OORMG5.>`[9?V=NOX.S`'?*>OOU/5W8`[X3EE_IZZ_RW-/ -MZQSR'>OOU/5W3_-GOS9H?OOE/5WZOJ[LOU/7WSW+>USGD.];?J>OOGN>YRAWR'>OOU/5WSQ-WSPMWZ/X[9?V=NO[N>>+N -M>>$.W7^GK+]3U]\]/_FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J^CLP -MAWS'^CMU_5V>>U'GD.]8?Z>NOWN1YPIWZ/X[9?V=NO[N1>+N1>4.^8[U=^KZ -MNQ>)NQ>5.^0[UM^IZ^]>G"[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z.W7] -M'9A#OF/]G;K^+L^]K'/(=ZR_4]??OOO7B;N7A;NT/UWROH[ -M=?W=R\3=R\(=NO].67^GKK][>?)GA^Z_4];?J>OORMG5.>0[UM^IZ^_`'/(= -MZ^_4]7=@#OF.]7?J^KL\]ZK.(=^Q_DY=?_>0[UA_IZZ_>YWG*G?(=ZR_4]??O4[0[UM^IZ^_`'/(=Z^_4]7=Y[DV=0[YC_9VZ_NY-GBO>0[UA_IZZ_N\ISE3OD.];?J>OO -MKA)W5X4[=/^=LOY.77]WE;B[*MRA^^^4]7?J^KNKDS\[=/^=LOY.77]7SJ[. -M(=^Q_DY=?P?FD.]8?Z>NOP-SR'>LOU/7W^6YMW4.^8[U=^KZN[=YKG"'[K]3 -MUM^IZ^_>)N[>5NZ0[UA_IZZ_>YNX>UNY0[YC_9VZ_N[MZ>+LD.]8?Z>NORMG -M5^>0[UA_IZZ_`W/(=ZR_4]??@3GD.];?J>OO\MR[.H=\Q_H[=?W=NSQ7N4.^ -M8_V=NO[N7>+N7>$.W7^GK+]3U]^]2]R]*]RA^^^4]7?J^KMW)W]VZ/X[9?V= -MNOZNG%V=0[YC_9VZ_@[,(=^Q_DY=?P?FD.]8?Z>NO\MS[^L<\AWK[]3U=^_S -M7.$.W7^GK+]3U]^]3]R]K]PAW['^3EU_]SYQ][YRAWS'^CMU_=W[T\79(=^Q -M_DY=?U?.KLXAW['^3EU_!^:0[UA_IZZ_`W/(=ZR_4]??Y;GK.H=\Q_H[C?H[ -M0_??*>OO-.KO#-U_IZR_TZB_,W3_G;+^3J/^SM#]=\KZ.XWZ.T/WWRGK[S3J -M[PS=?Z>LO].HOS-T_YVR_DY)?_>ASB'?L?Y.77_W(<\5[M#]=\KZ.W7]W8?$ -MW8?*'?(=Z^_4]7OOU/5WY>SJ'/(=Z^_4 -M]7=@#OF.]7?J^CLPAWS'^CO+WW%SASH'?&>LO[OY@0?<93\=*G?`=\;Z.W/] -MW2'M'0IWZ/X[8_V=N?[ND+@[%.[0_7?&^CMS_=WAY,\.W7]GK+\SU]^5LZMS -MP'?&^CMS_1V8`[XSUM^9Z^_`'/"=L?[.7'^7YZ3.`=\9Z^_,]7>2YPIWZ/X[ -M8_V=N?Y.TLN3RAWPG;'^SEQ_)XD[J=P!WQGK[\SU=W*Z.#O@.V/]G;G^KIQ= -MG0.^,];?F>OOP!SPG;'^SEQ_!^:`[XSU=^;ZNSRG=0[YCO5WYOH[S7.5.^0[ -MUM^9Z^\T<:>%.W3_G;'^SEQ_IXD[+=RA^^^,]7?F^CL]^;-#]]\9Z^_,]7?E -M[.H<\AWK[\SU=V`.^8[U=^;Z.S"'?,?Z.W/]79ZS.H=\Q_H[<_V=Y;G"';K_ -MSEA_9ZZ_L\2=5>Z0[UA_9ZZ_L\2=5>Z0[UA_9ZZ_L]/%V2'?L?[.7']7SJ[. -M(=^Q_LYNOP-SR'>LOS/7W^6YMLXAW['^SEQ_U^:YRAWR'>OO -MS/5W;>*N+=RA^^^,]7?F^KLV<=<6[M#]=\;Z.W/]77OR9X?NOS/6WYGK[\K9 -MU3GD.];?F>OOP!SR'>OOS/5W8`[YCO5WYOJ[/-?5.>0[UM^9Z^^Z/%>X0_?? -M&>OOS/5W7>*NJ]PAW['^SEQ_UR7NNLH=\AWK[\SU=]WIXNR0[UA_9ZZ_*V=7 -MYY#O6']GKK\#<\AWK+\SU]^!.>0[UM^9Z^_R7%_GD.]8?V>NO^OS7.4.^8[U -M=^;ZNSYQUQ?NT/UWQOH[<_U=G[CK"W?H_CMC_9VY_JX_^;-#]]\9Z^_,]7?E -M[.H<\AWK[\SU=V`.^8[U=^;Z.S"'?,?Z.W/]79X[UCGD.];?F>OOCGFN<(?N -MOS/6WYGK[XZ)NV/E#OF.]7?F^KMCXNY8N4.^8_V=N?[N>+HX.^0[UM^9Z^_* -MV=4YY#O6WYGK[\`<\AWK[\SU=V`.^8[U=^;ZNSPWU#GD.];?F>OOACQ7N4.^ -M8_V=N?YN2-P-A3MT_YVQ_LYOOQL3=6+E#OF/]G;G^;CQ=G!WR'>OOS/5W -MY>SJ'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^UCGD.]8?V>NO_N8YRIW -MR'>LOS/7WWU,W'TLW*'[[XSU=^;ZNX^)NX^%.W3_G;'^SEQ_]_'DSP[=?V>L -MOS/7WY6SJW/(=ZR_,]??@3GD.];?F>OOP!SR'>OOS/5W>>Y3G4.^8_V=N?[N -M4YXKW*'[[XSU=^;ZNT^)NT^5.^0[UM^9Z^\^)>X^5>Z0[UA_9ZZ_^W2Z.#OD -M.];?F>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\][G.(=^Q_LY< -M?_NO_NNORMG5^>0[UA_9ZZ_`W/(=ZR_,]??@3GD.];?F>OO\MR7.H=\ -MQ_H[<_W=ESQ7N$/WWQGK[\SU=U\2=U\J=\AWK+\SU]]]2=Q]J=PAW['^SEQ_ -M]^5T<7;(=ZR_,]??E;.K<\AWK+\SU]^!.>0[UM^9Z^_`'/(=Z^_,]7=Y[FN= -M0[YC_9VY_NYKGJO<(=^Q_LYU<(?NOS/6WYGK[[XF[KX6[M#]=\;Z -M.W/]W=>3/SMT_YVQ_LY0[UM^U -M^3MN[GN=`[YK67_7NO[N>YZKW`'?W3R%N6M=?_<]\%/D]SUV;_9[ -M[HVORQSZ_;;+4\'8.Z2#T[?Z_ -M?[MW<[GG>>,SCW!<[;O[/B_SM-@_GP*_T?NWTSK]>F;M'.[TQP8*^\1^@IS?=G1X^I//IP2^9 -M'_>O$;T_!WZ]\BNGU]]^:IP_8R?P5_X#/WZ_?OCGW6";!A_M%=X,+H_XU7&> -M>\2OCO/<(WYUG.<>]:OC//B(7QWGN4?\ZCC//>)7QWGN4;\Z;@9O_YWC(WV( -MG^?D[F-R7YM!F\W^_F'^/9' -;W^PC?HB?YQ[U0[P]'&^\]]M_`$CJT>#UK``` +M'XL(".F7?5P``VEM9RTV,W@R-34M-#`Y-BUG<'0N<6-O=RYO=70`K9W);ES9 +ML47G]16IOJ#/)TY"1>S-LB"JAH()\ +MMS./%A=55:L.C\?;;X=#*X>F.S3C89\/UW^=OLOASE_<_W[X^=<__^7J[K>? +MO]V.R?&!I]Q?-WK0-'=OZX^',J?GIY;#[^TJ>;LM&^SN#?Z>YOZ1 +M7I^2M]NSN>'>W,F]725O=V1STX.P*(%E9G-+,-?`IU8VMP5S+7QJQW/RP*_M +M[5P'GQ(V!S]NKPYEKH=/&9MK[LT=KS+0>6Z`3Q'N).1NA$\1[B3D;H)/$>XD +MY&Z&3Q'N).1N@4\1[B3D;H5/$>XTY&Z#3Q'NR.>+.]SM\"G"G4;<"7Z*<*<1 +M=X)\IXP[C;@3Y#MEW&G$G2#?*>-.(^X$^4X9=QIQ)\AWRKBSB#M!OC/&G47< +M"?*=,>XLY`[YSAAW%G*'?&>,.PNY0[XSQIV%W"'?&>/.0NZ0[XQQ9R%WR'?& +MN&M"[I#O&L9=$W*'?-Z:B#M%OFL8=TW$G2+?-8R[)N).D>\: +MQET3<:?(=PWCKHFX4^2[AG'71MPI\EW+N&LC[A3YKF7&GR+<=1%WAGS7,>ZZB#M#ONL8=UW$G2'?=8R[+N+.D.\ZQET7<6?( +M=QWCKH^X,^2[GG'71]P9\EW/N.M#[I#O>L9='W*'?-*N0;X;&'=#Q%V#?#>0[T;& +MW1AQUR#?C8R[,>0.^6YDW(TA=\AW(^-N#+E#OAL9=V/('?+=R+@;0^Z0[T;& +MW1ARAWPW,NZFD#ODNXEQ-X7<(=]-C+LIXJ[%3Q'NIHB[%OEN8MQ-$7\FQEW^UY!\#OEN9MS-$7*N0[Y;&'=+ +MQ%V'?+&W"'?K8R[->0.^6YE +MW*TA=\AW*^-N#;E#OEL9=VO('?+=RKA;0^Z0[U;&W19RAWRW,>ZVD#ODNXUQ +MMT7<]?@IPMT6<=^VQAW6\1=CWRW,>ZVB+L>^6YCW&T1=SWR +MW<:XVR/N>N2[G7&W1]SUR'<[XVX/N4.^VQEW>\@=\MW.N-M#[I#O=L;='G*' +M?+OO).SO!N`[8?V=A/W=`'PGK+^3L+\;@.^$]7<2]G<# +M\)VP_D["_FX`OA/6WTG8WPW`=\+Z.PG[NP'YCO5W$O9W`_(=Z^\D[.]&_!3A +M+NSO1N0[UM])V-^-R'>LOY.POQN1[UA_)V%_-R+?L?Y.POYN1+YC_9V$_=V( +M?,?Z.PG[NQ'YCO5W$O9W(_(=Z^\D[.]&Y#O6WTG8WXW(=ZR_D["_&Y'O6'\G +M87\W(M^Q_D["_FY$OF/]G83]W8A\Q_H["?N[$?F.]7<2]G<3?HIP%_9W$_(= +MZ^\D[.\FY#O6WTG8WTW(=ZR_D["_FY#O6'\G87\W(=^Q_D["_FY"OF/]G83] +MW81\Q_H["?N["?F.]7<2]G<3\AWK[R3L[R;D.];?2=C?3]8?R=A?SOO).SO9N0[UM])V-_-R'>LOY.POYN1 +M[UA_)V%_-R/?L?Y.POYN1KYC_9V$_=V"GR+OO).SO%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y.POYN0;YC +M_9V$_=V"?,?Z.PG[NP7YCO5W$O9W"_(=Z^\D[.\6Y#O6WTG8WRW(=ZR_D["_ +M6Y#O6'\G87^W(-^Q_D["_F[%3Q'NPOYN1;YC_9V$_=V*?,?Z.PG[NQ7YCO5W +M$O9W*_(=Z^\D[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q_D["_FY% +MOF/]G83]W8I\Q_H["?N[%?F.]7<2]G]8?R=A?[?AIPAW87^W(=^Q_D["_FY#OF/]G83]W89\Q_H["?N[#?F. +M]7<2]G<;\AWK[R3L[S;D.];?2=C?;OO).SO-N0[UM])V-]MR'>L +MOY.PO]OQ4X2[L+_;D>]8?R=A?[^8_V=A/W=CGS'^CL)^[L= +M^8[U=Q+V=SOR'>OO).SO=N0[UM])V-_MR'>LOY.PO]N1[UA_)V%_MR/?L?Y. +MPOYN1[YC_9V$_=V.?,?Z.PG[NQWYCO5WFG_@Y@YU#OCN^BG,G;K^+M^G=ZC< +M`=\IZ^_4]7>'Q-TALOU/7 +MWSW)OOU/5WY>SJ'/"=LOY.77\'YH#OE/5WZOH[,`=\IZR_4]??Y;FG=0[Y +MCO5WZOJ[IWFNOOU/5WS_-G_S9H?OOE/5WZOJ[LOU/7W[W(UCGD.];?J>OO7N:YRAWR'>OOU/5W+Q-W+PMWZ/X[9?V=NO[N +M9>+N9>$.W7^GK+]3U]^]//FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J +M^CLPAWS'^CMU_5V>>U7GD.]8?Z>NOWN5YPIWZ/X[9?V=NO[N5>+N5>4.^8[U +M=^KZNU>)NU>5.^0[UM^IZ^]>G2[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z +M.W7]'9A#OF/]G;K^+L^]KG/(=ZR_4]??OOO7B?N7A?NT/UW +MROH[=?W=Z\3=Z\(=NO].67^GKK][??)GA^Z_4];?J>OORMG5.>0[UM^IZ^_` +M'/(=Z^_4]7=@#OF.]7?J^KL\]Z;.(=^Q_DY=?_0[UA_IZZ_>YOG*G?(=ZR_4]??O4W< +MO2W0[UM^IZ^_`'/(=Z^_4]7=Y[EV=0[YC_9VZ_NY=GBOZ0[UA_ +MIZZ_>Y^X>U^X0_??*>OOU/5W[Q-W[PMWZ/X[9?V=NO[N_0[UM^IZ^_RW(X +M0_??*>OOU/5W'Q)W'RIWR'>LOU/7WWU(W'VHW"'?L?Y.77_WX71Q=LAWK+]3 +MU]^5LZMSR'>LOU/7WX$YY#O6WZGK[\`<\AWK[]3U=WGNJLXAW['^3J/^SM#] +M=\KZ.XWZ.T/WWRGK[S3J[PS=?Z>LO].HOS-T_YVR_DZC_L[0_7?*^CN-^CM# +M]]\IZ^\TZN\,W7^GK+]3TM]]K'/(=ZR_4]???Q +M'?,?Z.W7]73F[.H=\Q_H[=?T= +MF$.^8_V=NOX.S"'?L?[.\@_=]E/Q\H=\)VQ_LY\?"';K_SEA_9ZZ_.R;NCH4[=/^=L?[.7']W//FS0_??&>OOS/5WY>SJ'/"= +ML?[.7'\'YH#OC/5WYOH[,`=\9ZR_,]??Y3FI<\!WQOH[<_V=Y+G"';K_SEA_ +M9ZZ_D_3RI'('?&>LOS/7WTGB3BIWP'?&^CMS_9V<+LX.^,Y8?V>NORMG5^>` +M[XSU=^;Z.S`'?&>LOS/7WX$YX#MC_9VY_B[/:9U#OF/]G;G^3O-LOS/7WVGB3@MWZ/X[8_V=N?Y.3_[LT/UWQOH[<_U=.;LZ +MAWS'^CMS_1V80[YC_9VY_@[,(=^Q_LY0[UM^9Z^_`'/(=Z^_,]7=YKJESR'>LOS/7WS5YKG*'?,?Z.W/] +M79.X:PIWZ/X[8_V=N?ZN2=PUA3MT_YVQ_LY<_-FA^^^,]7?F^KMR=G4. +M^8[U=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L^U=0[YCO5WYOJ[-L\5[M#]=\;Z +M.W/]79NX:RMWR'>LOS/7W[6)N[9RAWS'^CMS_5U[NC@[Y#O6WYGK[\K9U3GD +M.];?F>OOP!SR'>OOS/5W8`[YCO5WYOJ[/-?5.>0[UM^9Z^^Z/%>Y0[YC_9VY +M_JY+W'6%.W3_G;'^SEQ_UR7NNL(=NO_.6']GKK_K3O[LT/UWQOH[<_U=.;LZ +MAWS'^CMS_1V80[YC_9VY_@[,(=^Q_LYOOS/5W0YZKW"'?L?[. +M7'\W).Z&PAVZ_\Y8?V>NOQL2=T/A#MU_9ZR_,]??#2=_=NC^.V/]G;G^KIQ= +MG4.^8_V=N?X.S"'?L?[.7'\'YI#O6']GKK_+OOS/5W8^)NK-PAW['^SEQ_-YXNS@[YCO5WYOJ[LOS/7WWW*OOP!SR'>OOS/5W8`[YCO5WYOJ[//>YSB'?L?[.7'_W.<\5 +M[M#]=\;Z.W/]W>?$W>?*'?(=Z^_,]7>?$W>?*W?(=ZR_,]???3Y=G!WR'>OO +MS/5WY>SJ'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^U+GD.]8?V>NO_N2 +MYRIWR'>LOS/7WWU)W'TIW*'[[XSU=^;ZNR^)NR^%.W3_G;'^SEQ_]^7DSP[= +M?V>LOS/7WY6SJW/(=ZR_,]??@3GD.];?F>OOP!SR'>OOS/5W>>YKG4.^8_V= +MN?[N:YXKW*'[[XSU=^;ZNZ^)NZ^5.^0[UM^9Z^^^)NZ^5NZ0[UA_9ZZ_^WJZ +M.#OD.];?F>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\]ZW.(=^Q +M_LYNO_N6N/M6N$/WWQGK[\SU=]\2=]\*=^C^.V/]G;G^ +M[MO)GQVZ_\Y8?V>NORMG5^>0[UA_9ZZ_`W/(=ZR_,]??@3GD.];?F>OO\MSW +M.H=\Q_H[<_W=]SQ7N$/WWQGK[\SU=]\3=]\K=\AWK+\SU]]]3]Q]K]PAW['^ +MSEQ_]_UT<7;(=ZR_,]??E;.K<\AWK+\SU]^!.>0[UM^9Z^_`'/(=Z^^:_`,W +M]Z/.`=\UK+]K7'_W(\]5[H#OKI_"W#6NO_N1N/N1N6N.^"GR=8_=F_V1>^.K +M,H>^WG9Y*IB[\^WG;V]O!]%]572P\5\?-Y]>_KAHT'U5O_+ZVIOS:_1PG,"? +M^4_\_./5_3_*X,W=0?_%8'Z%]^?R+TA[>W?0332U7;MS3]^/INEB\'_RZ[NY[J=I#TUW:,9TD6,CAU8/;5/F +M;MYKN]Q]?7_Z\U\.O__A;W\_C_UO?;LWU_V<_\[S^O^U/72#>W7"WN[UW^7] +MW_VW>SMW\^G[XK3SG+&Y^\[GFH:>.2E_=Q:_M[=S-I^^F +M_B^'NT_--\W;^6LF-&SN]_MSZ,O'_PIY-S<'S-VAO_Z;UNO?X,EAV<\_6+OS +M%]\]#-_W'KSWS*-AU[._Y7=]>#/?_[UZI^W8Q^N_O4NO;[;FP,$?^<_ +MP4[O]N:`@;W=_*\7^=L]W)\#O]/[M=,[_W[E^L/BL4YO3)I"W_E/T-.;;D\/ +M']+Y]."'S,^[UXC>G0._7_F5T^MN/FN\:/C//>('QWGN4?\Z#C//>I'QWGP$3\ZSG./^-%QGGO$CX[SW*-^=%P/ +MWOPSQT?Z)'Z>.[,W]#=?EK0Y=)-[?>S3\?GU_3]XN[?_S)%]ZG_@DSC^Q=@> +H\9/X>>[A3^+;`V\6_=INC_A)_#SWJ)_$FV-_[;W?_@U4+HE0]:P````` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow2.gz.uu b/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow2.gz.uu index 87a55ddee0d2..3631241ca88a 100644 --- a/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow2.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-4096-gpt.qcow2.gz.uu @@ -1,26 +1,27 @@ # $FreeBSD$ begin 644 img-63x255-4096-gpt.qcow2.gz -M'XL(".1Q+ED``VEM9RTV,W@R-34M-#`Y-BUG<'0N<6-O=S(N;W5T`*V92V_< -M(!"`[_D5I.\FS=8,8'O[2)JD62FWI&IOO?AYC-1KY?:WUQALUGC&)%MVD945 -MFD^`OQFPDR3FPYCB3*9,;EE;LOZW;<#V?LP;Z^YWMYO]3W=D8#PAHI`.*2;< -MC'7M<$#A$K[LX#AN;W0"P<$8M02%<)(3,. -M&A^8\?D1\L#Q0>SQ"7S]U!CG=Z3KXQ-F?'Y41N'R(`Z0J"V%*X(X@425%*X* -MXB0255.X)HA32%1+X'A`E1Z7(E&-B[+1)%>/;>X%Q..8U&4=^!Y]]+B7CD<4N^`\@X\[UY;W!N'0^H=4-Z!Y]U; -MBSMQ.*3>`>4=>-Z=6MP[AT/J'5#>@>?=V<([CM0[H+P3GG?O+2MQ.*3>"-X)BY,.A]0[07DG/.^4Q:4.A]0[07DG/.\RB\L=#JEW -M@O).>-YM+>Z#PR'U3E#>"<^[CQ;WR>&0>B+.W7=A -M<5\<#JEWDO).>MY=6MR5PR'U3E+>2<^[:XO[.N$`BYJ\2Q*\6=S-(FE.VYSY$IWK`#SIP/)O5::M.R`@$S[>[.'JR.LWI-L3@$JQ -MHE@`?XSC&]*MSR_S;J"W6PW%0`%3%/SI.3?JG-);W -M:6*V;1C.6%N6<7UVZX'=P_WFP<#.-K].[?@DMT9@C>Z@5D\.E3FGIINY!P%B -MNFR.PUXC_=?JZ;IO,*N'+Y)>/31ENG'5QH0;<67/F -M%6:BZ_?R2G=T=YOYUP"E!48;H4S;*F)V:%S$[-"XB-FA<5&S0P,C9H?&1ZB6<-/5GS^>M--N(FKG%1-W&9Z>/WT3]QQ=U%%1H````` +M'XL(".F7?5P``VEM9RTV,W@R-34M-#`Y-BUG<'0N<6-O=S(N;W5T`*V82V^< +M,!"`[_D53M])FBT>V\"FSR3-2KDE57OKA67A&*D]T_[V8CS@QBO9_;"#V_ADWT=QO;E?[G^;(P63"1!$=6@VX +M$>O:XX##)7+:(6G#D@BHM+B6B)(>#15Q&1"D.IQ=Q.1'%>2>7O5L349QW +MQ=241QWLEE[W9$%.<=,-X)CZN(*,X["+P[1MPS +MCZN)*,X["+Q[CK@7`TY249QW$'CW$G&O/(ZH=\!Y!X%WKQ'WQN.(>@><=Q!X +M=X*X4X\CZAUPWD'@W1GBWGH<4>^`\PX"[\XGWDFBW@'GG0J\>X>LQ..(>J!Q1[Q3GG0J\4XC3'D?4.\5YIP+O#.)2CR/JG>*\4X%W&>)RCR/J +MG>*\4X%W:\1=>!Q1[Q3GG0J\>X^X#QY'U#O%>:<"[SXB[I/'$?5.<=[IP+O/ +MB/OB<42]TYQW.O#N$G%7'D?4.\UYIP/OKA'W=<`!%35XER1T0]S-)&>!J'K/=PN\OIUZ?8$H#&B +M*";`'_WXNG1K\\N]&VCM-ETQ,"",'G#=7$VY/[Z;S:VXN_SVW<)^^NEVZ59W +M9X"B\B>!?G22G>[)\6P=SAXOAJMVV_;+EMB"?33MT;W4'.YNC$LCFZ>[8:0B*T5:V?=)96W_ +MV*7VEB;R-DW;A?/3C8^>K7&8Y/2S2":GP'MWJZJ\PY +M-]W,7P28Z8HQCGJ-]%^K9^ORUD1;O366*:KQ'>SJ%6[UZ$6RJT>F3-.O6I]P +M/6X;=_6D>X69V/H]_>4[FKO5^.N`&H'11JC3NHR8'187,3LL+F)V6%S4[+#` +MB-EA<1&SP^(B9H?%1O/WT3^)='8^%1H` +!```` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-4096-gpt.raw.gz.uu b/usr.bin/mkimg/tests/img-63x255-4096-gpt.raw.gz.uu index a6480b90b694..27eebb6de2c2 100644 --- a/usr.bin/mkimg/tests/img-63x255-4096-gpt.raw.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-4096-gpt.raw.gz.uu @@ -1,15 +1,16 @@ # $FreeBSD$ begin 644 img-63x255-4096-gpt.raw.gz -M'XL(".1Q+ED``VEM9RTV,W@R-34M-#`Y-BUG<'0N^"C'3;SSX^U0D*^6N,E`0TB&>7;FI2^S -M4H8#,!JRC%S3@>Y)+,_N<'OH::JZ#NA_GTI8`84'!ESM@U+3,\ZA;8FXT;,<,V4M5GIP!PG`FYLM[T.:"W*<@/\'.O3_>NP,#G,"=H_ -M+V$4K(8U?[B^5UO/ZWM^><7Y\?V#8%]3NUKY8.7S&Y09W$HDJ9+M?J_;#3A- -M61NU1UR6Q-W$<1EE-3NXV$KCS%Y6V$/_>[)D4/T="^Q!.."KHB8'=Y$Y<`NQ<_=T-] -M1@T[(K;2@91ZIM\J1:K=(^WMW7:QQ&7/_3TEY^`7C-"Q#B`L````` +M'XL(".F7?5P``VEM9RTV,W@R-34M-#`Y-BUG<'0NO/"9XR'3;SSX^U0D*^6N,E`0TB&>9AY.\,@ +MI3\`HR&+P#5NZ![%\NP.-X>>ILKK@.[]%,(**!S0XRIGE)J>:1JT[;"DZKV\ +MLVRAU7@_X,1T',4,5T]>FQ4WS''"X\9TV^N`UJ(H-L"/,3[=;X>%26%.T.YY +M":-@-:SYP_6YVFH>W]/S"\X/;^\$^YS2UZM%FJ^B4[%T[X7X6J;K +M<9J\-FJ/N"2JWG&MGLW'F<)9Z8G\[E7J6EK5('* +MQ'#G)2YEKCS3AY$BJY`VL`I52S=U"J6`W+6)WVX-74.>D"GHDH#=Y55S==+'$)MWHYJ6?9U#L-GZG0BANBZA5> +MO;!(I%ZP9;I1M;%#1ES)JY[JIX:K?_?]WE[CANXLEJ<'F@'(%J'1;FSP=0?A +M&+N#<(S=03C6[B`@8W<0CK$[",?8'81C[0X';"3?$"<05GD!FFQBB\V +MCBF^[T"ZC=X;_3M#/+P9#>,0)]S^$&]VD@WM;<,XQ`G'.L2-^Y^2\O`+__!T +%\X@+```` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu b/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu index 3b6b603ed8ec..c24f9ccbd8d1 100644 --- a/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-4096-gpt.vhd.gz.uu @@ -1,22 +1,22 @@ # $FreeBSD$ begin 644 img-63x255-4096-gpt.vhd.gz -M'XL(".5Q+ED``VEM9RTV,W@R-34M-#`Y-BUG<'0N=FAD+F]U=`"MF$N/TS`0 -M@._]%8.X+2*R'=M)+D4@+1*W!8&X["7/584HCW+80_O?F7&<)D[BB(IIK2B5 -M,U_F;=="]!\`FX+MP+9@#=UG&FP!60Z`DWXH=Y7^)YSK'\>V_G-X3OSGO.MA -M4DRE0G&25REH?$D&JJ27V(;NX3Q@DI?W3W>'[T\#3GF<\B"3D52JP%:+]V0- -MY/U['.[K07USR,NH7;K4;I3J#>PZ2+O)$^F@W<5=WTR-U2B%S],PD&<@]#B" -M'\'$:.S,=T;,I"9JKCE5C,:NX>R6U"VXNYV/19\JF!@97@58"9FB>TR;P0^+ -M@:GR?/I9_CZU,_U4)%7L)!CSN0WO*9\J:GC8:Z!)P2USP5%.<]Q*JOR7]VPH -M-T07G2#,,*$&\W'@^T50&4Y1,>AGI=CP>3P84?U*TD]C)90KU_C$^5T2?J_` -MJKH-.'@PQ%T#4M7D/U>I;3M:U">)%\9'TC8>D/TDOE7#'-^JNPUH#)3E`OAE -MT*]VX3"@+>B"$@.;@Y9@%!A]Q3G;33W5[_[]!WAX^^DSP1Y'9>5HJMIF);>GO`I5'2?XAMCS,B -ME,JG4JASE4)70ME$CQ^38P][G?QZY?5KI<^(M1&?B'FO=7TYCYF;C0T[8BZ$..Z^W.;D -M/6W<2>6^M=*^K6I*\"'$5K_>D6S6P/K!_+Z_QB?-# -M$GY[H/++$-NZIGPC9=-0>R";AMK7+Z.&LMT,YJU1MEY#-I,M_DE@U3!K -M2#C&'D@XQAY(.-8>2$#&'D@XQAY(.,8>2#C6'I@UA4MFIJT:X2CW9`%20Y?1 -MABU0([KI&O7;3\TM^K_0L0W>QE9M-1B%8-RJ$6YSJU9UMQK+N%4C'.M6+?=] -JC^FTA7",IRV$8SQM(1SC:0OA&$];",=XVD(X[E3!K3AK"I$>93#'KK_'8]C-T]'5$QK6:GL +M^3(OCUTSUG\`=`ZZ`VU!*WPV$G0)I@!P@Z$)W_/P$R[-CY-M_AR?LO"Y['H8 +M9V.IJ3C*BQRD>XD!4>%+=(O/<(F8[.7]X]WQ^V/$B8`3`:0,2N4"=+UXCVFA +MZ-_C<5^/XIM'/@_:Y4OM!JG>P*Z#O!O-R*-VS[Y_,S96.BDW'YN"P@"30YO\ +MF`P,QLY\I]A,:J3FFE/98.P:3F])W8*[VX58]*GB$L.XGH'F8`0^N[2)?E@T +MERI/YY_5[[.=Z2<2J:)'P9B/;7A/A%01<7+00**"6^:"IYSGN)54^2_OZ:E< +MC*YS`E-Q0$3S77/O9Y.5X15E43_-V8;/T\%(ZE>A?M*MA&JE3P]GN&M`Z@;]YU>JM8-%?9($83QC,;3!=7(72`IW4 +MS6O+(@`T0)S&[O; +MA6L$7DX?LU,/>YW]>A7TLSQDQ%I+#Z2\9WU=+E+FFJ%@)\R%*8ZZ+ML"O:?( +MO%>&,K76T@-)[U6]]]:=A-Y;6[K772W+7DQQ-:WWN-\U7/Z[^KWLTP.70S;] +M]D`1MB&R?4V$0DJFH0Q`,@UE6+^$&G*[&U>KN5F,)CVJ((SVJ%:'N$=VV +G(([PM@5QA+MO2X'<\EPXM[$)OV]+2RU[R7(9EIY3=PQ[FQU>RDTFY]W-SM%X?1T0WT\F+(`%`CVN02$3]$S7 -M0=\/@W&GY97Q7O;#?,05TW$H9KCVHK4>:<$<5WCDW-YT%T*Q.@B7L3H(E[4Z")BQ.@B7L3H(E[$Z")>U.A#8L7Q-G'"4>\T> -M&HQY#768->EV/-EW"-SMQ%;KWVCB\<7H,C9QPFTV\;Z[UMF,39QP69NX'3Z_ -MC03CZLMHFI<*#):4G0/%E#,.V/P^=/>MV9I@^DA>#](6DQ#18(A6] -MQ+0TG]GW_O;QYOC\..+$X-480%V2EA1@ZI6[-G3WUU$\+:V+;%,VB!Y?I?-B -M&SC,<>KB+/X:X!;#U#2"FT`0363"N529/_R_:^MQN5,%?PUV?P&M?`V+LPT` -!```` +M'XL(".F7?5P``VEM9RTV,W@R-34M-#`Y-BUG<'0N=FAD9BYO=70`K9=+B]PP +M#(#O\RM4]K:EQN]XZ&%HERWT-BTMO91"GLNP=,K"'O:0'U_+SLN)';K%B0@. +MBK](LF0EE/H#0'*@9>2:5O0?27CVA]N#H['J=4#[?C1A!206Z'&U55*.S[0M +M=-T@E+E9?K*]%]TP'G%D/DYD@6NF65M)*Y8XXG&CN]WK@$I!66Z`WT?[N%L. +M!5*#/`*WSU.0#!0')2><\UW52_ON/WV&\X>OWQ#V=*9H:&H0;>@&-0=#AH-C`$86R;&03CP!N@1"@:\0F!_ +M_4*N'O:./+T=[)-LR(B8I!6IZ$E,%6I2[A:8V[ON0H@3N:-G,'HJ6_2.PS85 +MD[0B&;W21R\>)(Q>K'0M;H@:>1/BJKS18ZYKV/RW^_?VFE;T9Q*>'B@'8#8+ +MBZZK,U8'XC)6!^(R5@?BLE8'`C-6!^(R5@?B,E8'XK)6AP6V-%\31QSFGA3. +M7=LL0]_2[;B_`\*<8:?`W9;OM?Z=)AY?C#9C$T?<;A/OVI2S$V?E;,8FCKBL +M3=P,G]]:@';UI16."PG:EI19`OF<,PY8_[FV]?/E91D]XW9FF#^25X+SN<#$ +MU+9$2GR);G"\L._F_N'V\OMAQ/'!J_';214X2W#0U<9=$[K[X\(?U]9%MBD3 +M1(]MTGFU#9R6.#DY:W\-[!:#ZSQ*_*RF5PTS\MF\OR^\&T'4\\ -M/!#N.-S7JL3TW;2<,5T\OB4"V=WGD_W_D#@7`1R*[CRB9B2P3XWN]]\%I+GYY?[.4S+ -M6S6NSEW5AJ&KRGF80JLKOR!/^'A&@]1#2[O70Y_VEUNO[GY<3C\/-Q^N'GW]A48[M&O -M;9&[HO'3\?;9_;8:^`_)7`7_&>[RQV^O7X4K-SN\/]\2SGM-$YD^>XI#<:O* -M^=_'VSR[X>V=1QS#3YR=7]N0G'+^[,(?E(6K&S=/I_38Q^ET'T*><]?=#N>[ -MX?N/[X=75S^]>QMSY]?6IZR9@4YSHG)7YAXJA.;35WI$?]G,J^8N/][<_7#3 -M?3>%^6&X.GSN"%?YW$T+>`KS6J*>7*KDRD[3OGS]O[LI7M>'E;TAW#R).8CI -ML\NC*VN/-2W@O!1'EQ?^:/JG:<)3)`6\D;N\>WMX\X_I%O?)^N[UEV\(=YJ\ -M)LMI@I/+%-`JIG*)OWQX6;K+=U^[*Q_D]S\,\Q5(N&:YS;SQL@Z8AT=_$+*V -MP/LB5O@3\\JZZ_/=V7UU_C`EGH>2GZOCV<^_/[N^'6+V]_42X;KF,IWGX2Z*9'7-_,%T],_P0/F&Y8OPR>;CA[O;CH?OXX\W; -M?KK1W"O"]4ONINGD69A4G-/#2<6/G7)WE=U/;<(FW.!3M$SJ%&Z,"6N9QWT6 -M_!53^BUDX?+Q\,-P[J=IN:MC65[%I1@?+H6FZ$$6EH6>186<%PE9YF3RRN7YV%&ZP)Z]^YVGEJ57VD]SA\^RUY:CXM'C]3Z%P(N<-;S -MJ[('S[-<_0H9E"M`_Q3+IM\_3+^O[^=7^?E58EFKUTD&S0KN7Q/$^\?A5OX2 -M.XMEJUZ=#/H]V:M\:1O$A4R*%=PJ=R5(7>TK-7K -M)(-F!9?*715R1\M6O3H9]+N"K4/N:#FJE]_QJQ2R'5_+JE/('2US]2ID4*[@ -M4KEK0NYH6:O720;-"BZ5NW/('2U;]>IDT.\*M@VYH^6H7G['`@$Y3L-U(7>T -MS-6KD$&Y@DOEK@^YHV6M7B<9-"NX5.Z&D#M:MNK5R:#?%>P8L=+6OU.LF@6<&E?D="!G*TS-6KD$&Y@DOD[L1Z1\M:O4XR -M:%9PB=R=6.]HV:I7)X-^5["L=[0D?+7+T*&90KN%3N6.]H -M6:O720;-"BZ5.]8[6K;JUL=[2LU>LD@V8%E\H=ZQTM6_7J9-#O"I;UCI:C>OD=^4?(<1J.]8Z6N7H5 -M,BA7<*GIDT.\*EO6.EJ-Z^5TO -MN>LWX5CO:)FK5R&#<@67RAWK'2UK]3K)H%G!I7+'>D?+5KTZ&?2[@F6]H^6H -M7GXW2.Z&33C6.UKFZE7(H%S!I7+'>D?+6KU.,FA6<*G@?A -M[Z#\'82_PR:EU68A=\+?0?D["'^'3?ZN9;T3_@[*WT'X.VSR=RWKG?!W4/X. -MPM_M");U3O@[*'\'X>^P26FUK'?"WT'Y.PA_ATW^KF6]$_X.RM]!^#ML\GN=\'=0_@["W^T(EO5.^#LH?P?A[[!):;6L=\+?0?D["'^'3?ZN -M9;T3_@[*WT'X.VSR=RWKG?!W4/X.PM_M");U3O@[*'\'X>^P26EU6B?\'92_@_!W -M.X)EO1/^#LK?0?@[;%):'>N=\'=0_@["WV&3O^M8[X2_@_)W$/X.F_Q=QWHG -M_!V4OX/P=SN"9;T3_@[*WT'X.VQ26GT6M8[X>^@_!V$ -MO\,F?]>SW@E_!^7O(/S=CF!9[X2_@_)W$/X.FY16SWHG_!V4OX/P=]CD[WK6 -M.^'OH/P=A+_#)G_7L]X)?P?E[R#\W8Y@6>^$OX/R=Q#^#IN45L]Z)_P=E+^# -M\'?8Y.]ZUCOA[Z#\'82_PR9_U[/>"7\'Y>\@_-V.8%GOA+^#\G<0_@Z;E%;/ -M>B?\'92_@_!WV.3O>M8[X>^@_!V$O\,F?]>SW@E_!^7O(/S=CF!9[X2_@_)W -M44P'.18XM_P&N"%;DI/R)?XJYG?QUPT -M\\MY^6;>LHAP<^QEI_/[^IMOW>LOWWSOP?YY'^[\>NR0#O=/ -M;Q[?'<7\>N?'V29\/O5-X,7\>F?U4O6M -MRP?7YFX\NW.?@/O]`[C*^,J;WSS;5J[N_/N#2[AN?MES7WE:VIVFVV3YG]_1 -M'7NO1*CACOZ-S(?+V[\>WBY@OSO\][=A?LN;9_'TECZ1REXQO^7]E`JW3A3L -M=9D7N-PZ>_[[2EN:9:\)%\M36_I$,GOG)7N)I]J4O:=NW0F.3[5?K>%:V^R5 -M\U-C$9X\_CM]XO+ZL/ZS`!8!T&R&A7^EH-W=X>$,[PX/9WAW>#C3N\,#&MX= -M'L[P[O!PAG>'AS.].PK_PDB[A[B'P_*-N:[<6/LO$*MI)!_'E\//T_<*__/% -M*MR9=8%INOXD2=XE>9[D0U*428ID_J?U2-+LP9B/<\T7 +M+G^\_M-?3_SY]>ET^6P%@XN2$*0*)\;F?2ZG1S^$.[\4M7EA/LZ[<)F+ZIX$ +M>KASY(4H7#Z_>'XNA*MKEY<']T3@D@"4;."*9W**)OO2ZG[SF2^>6U_FUC!O +M;]DD59:4G3>3LECL+*G.RVMI4LU.TPSX>7)]\^'?R?7XH;^[>7__SJ_O[/9V +M=LY+YU_V#F%.K"K=$_>"@VL<1#DFV9!D<"\GE[MO;GX:3_\=[S[N.4X__3AV!CN3=*DA'N/Y/*';Z_?^$]N>GK?WA'.13RT\W] +MCS?]]W.:'\:KT^<)X4I7NWD#:[^N->LYI(SN[+SLR]?_NY_S30:_LS>$6Q:Q +M)#&_=W%.BLIAS1NX;,4YR7+W;/ZG><%S)CF<4W)Y=WOZ[F_S*>Z*]?W;+[\C +M7#U'S9[S`N>0.:%-3L6:?_'X8YELIYES7OIEIV:W"4\=[#_'=S\3KE\_QO,ZW$>B60(S]V3^]"SPHW^']1/CMLG!C?=W'T_] +MQY]N;H?Y1$O>$&Y8:S +M/HR]A\M2OX'3ICCKFI*L3++,KVC;0._?W2U+*[,K[GUE^NAZEFE<+D:Q`717L73^_?W\^_9A?:5;7RF>E4;58C0;N'_,$.^? +MIENZCU@KGIU&]6(,1ZI7NM8VBN?TN'K\J@%Y'H?C=P%Z9AJ5BU%LX&*U*WSM +MZ%EI5"U&LX&+U:[TM:-GIU&]&,.A9"M?.WI.&N4>^%4*Z8&O967M:T?/3*-R +M,8H-7*QVC:\=/2N-JL5H-G"QVK6^=O3L-*H78SB4;.=K1\])H]P#&P3D>1RN +M][6C9Z91N1C%!BY6N\'7CIZ51M5B-!NX6.U&7SMZ=AK5BS$<2G;RM:/GI%'N +M(9?:Y7MP5>IK1\],HW(QB@UQW].PTJA=C.)0L +M^QT])XUR#X74KMB%8[^C9Z91N1C%!BY6._8[>E8:58O1;.!BM6._HV>G4;T8 +MPZ%DV>_H.6F4>RBE=N4N'/L=/3.-RL4H-G"QVK'?T;/2J%J,9@,7JQW['3T[ +MC>K%&`XERWY'STFCW`._!$&>Q^'8[^B9:50N1K&!B]6._8Z>E4;58C0;N%CM +MV._HV6E4+\9P*%GV.WI.&N4>2,A`GD?AZM37CIZ91N5B%!NX2.UJ]CMZ5AI5 +MB]%LX"*UJ]GOZ-EI5"_&<"A9]CMZ3AKE'AJI7;,+QWY'STRCQ^'8[^B9:50N1K&! +MB]6._8Z>E4;58C0;N%CMV._HV6E4+\9P*%GV.WI.&N4>R#]"GL?AV._HF6E4 +M+D:Q@8O5COV.GI5&U6(T&[A8[=COZ-EI5"_&<"A9]CMZ3AKE'GJI7;\'UZ2^ +M=O3,-"H7H]C`16K7L-_1L]*H6HQF`Q>I7<-^1\].HWHQAD/)LM_1<](H]S!( +M[89=./8[>F8:E8M1;.!BM6._HV>E4;48S08N5COV.WIV&M6+,1Q*EOV.GI-& +MN8=1:C?NPK'?T3/3J%R,8@,7JQW['3TKC:K%:#9PL=JQW]&STZA>C.%0LNQW +M])PTRCU,4KMI%X[]CIZ91N5B%!NX6.W8[^A9:50M1K.!B]6._8Z>G4;U8@R' +MDF6_H^>D4:E,SR#/HW!MNM8N>&8:E8M1;.`BM6M]OPN>E4;58C0;N$CM6M_O +M@F>G4;T8PZ%D?;\+GI-&N9()?X==2JOU_0["WT'Y.PA_AUW^KO7]#L+?0?D[ +M"'^'7?ZN]?T.PM]!^3L(?W<@6=_O(/P=E+^#\'?8I;1:W^\@_!V4OX/P=]CE +M[UK?[R#\'92_@_!WV.7O6M_O(/P=E+^#\'<'DO7]#L+?0?D["'^'74JK]?T. +MPM]!^3L(?X==_J[U_0["WT'Y.PA_AUW^KO7]#L+?0?D["']W(%G?[R#\'92_ +M@_!WV*6TNM373O@[*'\'X>^PR]]U['?"WT'Y.PA_AUW^KF._$_X.RM]!^+L# +MR;+?"7\'Y>\@_!UV*:V._4[X.RA_!^'OL,O?=>QWPM]!^3L(?X==_JYCOQ/^ +M#LK?0?B[`\FRWPE_!^7O(/P==BFMCOU.^#LH?P?A[[#+WW7L=\+?0?D["'^' +M7?ZN8[\3_@[*WT'XNP/)LM\)?P?E[R#\'78IK8[]3O@[*'\'X>^PR]]U['?" +MWT'Y.PA_AUW^KF._$_X.RM]!^+L#R;+?"7\'Y>\@_!UV*:T^];43_@[*WT'X +M.^SR=SW[G?!W4/X.PM]AE[_KV>^$OX/R=Q#^[D"R['?"WT'Y.PA_AUU*JV>_ +M$_X.RM]!^#OL\G<]^YWP=U#^#L+?89>_Z]GOA+^#\G<0_NY`LNQWPM]!^3L( +M?X==2JMGOQ/^#LK?0?@[[/)W/?N=\'=0_@["WV&7O^O9[X2_@_)W$/[N0++L +M=\+?0?D["'^'74JK9[\3_@[*WT'X.^SR=SW[G?!W4/X.PM]AE[_KV>^$OX/R +M=Q#^[D"R['?"WT'Y.PA_AUU*:TA][82_@_)W$/X.N_S=P'XG_!V4OX/P=]CE +M[P;V.^'OH/P=A+\[D"S[G?!W4/X.PM]AE](:V.^$OX/R=Q#^#KO\W\&]COA[Z#\'82_.Y`L^YWP=U#^#L+?89?2&MCOA+^#\G<0_@Z[ +M_-W`?B?\'92_@_!WV.7O!O8[X>^@_!V$OSN0+/N=\'=0_@["WV&7TAK8[X2_ +M@_)W$/X.N_S=P'XG_!V4OX/P=]CE[P;V.^'OH/P=A+\[D"S[G?!W4/XNB.D@ +MSP4N67\]W)BNM7M64O[,/X7:)<^N;K36!T[34<#L^73='H=TD;ZXC$]?'Q;] +M8IAYK%7_98`KG'']$.;O4J:'N$_55R+,WWF\2E^),'_G\2I])<+\G<>K])4( +M\W<3?27"_-U$7XDP?S?15R+,WTWTE0CS=Q-])<+\W41?B3!_-]%7(LS?3?25 +M"/-W$WTEPOS=1%^),'\WT5#\W49?"<[?;?25X/S=1E\)SM]M +M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWT +ME>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25 +MX/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@ +M_-U&7PG.WVWTE>#\W49?"<[?;?25"/-W>KY*7XDP?Z?GJ_25"/-W>KY*7XDP +M?Z?GJ_25"/-W$WTEPOS=1%^),'\WT5(:IOO)\?G$9G[Z^?*G?>G?5IW_'7[A\==K^"8#H/@V0*]S",>$<[MQ8M5[C +MF$R3/U;E'#]!4W*NX@E_<1*XP;A^Q_=W/8HB:=LG@'_A^I;]S0MW/^:\66[. +MRSOS%GF`6W(O>EW?U]]\F[S]\KL?'-C?'])=;N\\`TVM0QFZ1ZM#+-UO3U\^ +MB/O5.X/ER>^>@]IH/5=\F +MW=E_<>_S&-S;+5QI_,E;[CS;E4G5N_L'%TCZY6;/0^EHZ:2>3Y/U?W[GY#PX +M)4*%Y.SNR'RZW/[Y=+N"_>[TG]_Z]:UWGL7S1_R%6/7RY2[O=2S=*M*PMVU> +MX#+KZKGO*UUA5KW&MZGGCO@+T>JU:_4B5[6Y>L^=NC,!,SPX':'AV.#C# +ML\/!&9X=#L[T[,C=#2/M+N(.;OD_>)LT\_>?^2+>;Y<1O1Q?_L6%?;%)=^$< +MHY?^%R[BSV_&:'@1=W`O7L2G,99LP'F4K.%%W,&97L1S=_?.]+/_`T[?0N"T +#90`` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow.gz.uu b/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow.gz.uu index 36b91897389f..d0d414a7e5bd 100644 --- a/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-512-gpt.qcow.gz.uu @@ -1,132 +1,132 @@ # $FreeBSD$ begin 644 img-63x255-512-gpt.qcow.gz -M'XL("-EQ+ED``VEM9RTV,W@R-34M-3$R+6=P="YQ8V]W+F]U=`"MG?U%5=OB9*HC(C[U-MNM`'/RH9[UH.ZKQQU&]ES?7PSR?,@(_=6V!!51$$% -MX6YD'BTNJE2KC@Z'NV]-TTG3]DT[-<>EN?GG]"'-O7]X^-'\^-M?_GI]_]N/ -MW^[&Y/"3I]P_M]I(FGNP]>GUN8P_0MS-Q]P[MZKLW_CU=U[LY=S5[_= -MO5G\G+)!>S#8I+E#>GU"3J_]UU[?=_=VY>[T'N_M*GF['1OL'PS^GN;^2*]/ -MR=L=V-SX8.[DWJZ2MSNQN?FGL"B!96%S:S#7PJ"?&>,.XNX$^0[8]Q9 -MR!WRG3'N+.0.^&W"'? -MM8R[-N0.^:YEW+41=XJ?(MRU$7>*?-.NB[A3Y+N.<==%W"GR7<>XZT+ND.\ZQET7%W"'?=8R[+N0.^:YCW'4A=\AW'>.N#[E#ONL9=WW('?)=S[CK(^X, -M/T6XZR/N#/FN9]SU$7>&?-$W"'?#8R[(>0.^6Y@W`TA=\AW`^-N"+E#OAL8=T/( -M'?+=P+@;0NZ0[P;&W1ARAWPW,N[&D#ODNY%Q-T;>0[R;&W11QUR+? -M38R[*>0.^6YBW$TA=\AW$^-N"KE#OIL8=U/('?+=Q+B;0NZ0[R;&W11RAWPW -M,>[FD#ODNYEQ-X?<(=_-C+LYXJ[#3Q'NYHB[#OEN9MS-$7<=\MW,N)LC[CKD -MNYEQ-T?<=OP4X6Z-N.N1[U;&W1IQUR/?K8R[->*N1[Y;&7=KQ%V/?+%W"'?;8R[+>0.^6YCW&TA=\AW -M&^-N"[E#OML8=UO('?+=QKC;0NZ0[S;&W1YRAWRW,^[VD#ODNYUQMT?<#?@I -MPMT><3<@W^V,NSWB;D"^VQEW>\3=@'RW,^[VB+L!^6YGW.T1=P/RW)N0+X[,NZ.(7?(=T?&W3'D#OGNR+@[AMPAWQT9=\>0.^2[(^/N -M&'*'?'=DW!U#[I#OCH0[R=_A<\!WLOY.POQN![X3U=Q+V=R/PG;#^3L+^;@2^$];?2=C?CLOY.POQN![X3U=Q+V=R/PG;#^ -M3L+^;@2^$];?2=C?C]8?R=A?SOO).SO9N0[UM])V-_-R'>LOY.POYN1[UA_)V%_ -M-R/?L?Y.POYN1KYC_9V$_=V,?,?Z.PG[NP4_1;@+^[L%^8[U=Q+V=POR'>OO -M).SO%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y.POYN0;YC_9V$_=V" -M?,?Z.PG[NP7YCO5W$O9W"_(=Z^\D[.\6Y#O6WTG8WRW(=ZR_D["_6Y#O6'\G -M87^W(-^Q_D["_FY!OF/]G83]W8J?(MR%_=V*?,?Z.PG[NQ7YCO5W$O9W*_(= -MZ^\D[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q_D["_FY%OF/]G83] -MW8I\Q_H["?N[%?F.]7<2]G]8 -M?R=A?[["_FY#OF/]G83]W89\Q_H["?N[#?F.]7<2]G<; -M\AWK[R3L[S;D.];?2=C?;OO).SO-N0[UM])V-]MR'>LOY.PO]N0 -M[UA_)V%_M^.G"'=A?[^8_V=A/W=CGS'^CL)^[L=^8[U=Q+V -M=SOR'>OO).SO=N0[UM])V-_MR'>LOY.PO]N1[UA_)V%_MR/?L?Y.POYN1[YC -M_9V$_=V.?,?Z.PG[NQWYCO5W$O9W._(=Z^\D[.]VY#O6WTG8W^W(=ZR_D["_ -M.^*G"'=A?W=$OF/]G83]W1'YCO5W$O9W1^0[UM])V-\=D>]8?R=A?W=$OF/] -MG83]W1'YCO5W$O9W1^0[UM])V-\=D>]8?R=A?W=$OF/]G83]W1'YCO5W$O9W -M1^0[UM])V-\=D>]8?R=A?W=$OF/]G>;ON+FFS@'?W3R%N5/7W^7[])K*'?"= -MLOY.77_7).Z:S)T=\%.8.W7]79.X:_XH<\!WROH[=?U=OOP!SPG;+^3EU_!^:`[Y3U=^KZNSSWI,X!WRGK[]3U=T_R -M7%/F@.^4]7?J^KLGB;LGE3O@.V7]G;K^[DGB[DGE#OA.67^GKK][TSB'?L?Y. -M77_W-,]5[I#O6'^GKK][FKA[6KA#]]\IZ^_4]7=/$W=/"W?H_CME_9VZ_N[I -MR9\=NO].67^GKK\K9U?GD.]8?Z>NOP-SR'>LOU/7WX$YY#O6WZGK[_+LOU/7WY6SJW/(=ZR_4]??@3GD.];?J>OOP!SR'>OOU/5W>>YY -MG4.^8_V=NO[N>9ZKW"'?L?Y.77_W/''WO'"'[K]3UM^IZ^^>)^Z>%^[0_7?* -M^CMU_=WSDS\[=/^=LOY.77]7SJ[.(=^Q_DY=?P?FD.]8?Z>NOP-SR'>LOU/7 -MW^6Y%W4.^8[U=^KZNQ=YKG"'[K]3UM^IZ^]>).Y>5.Z0[UA_IZZ_>Y&X>U&Y -M0[YC_9VZ_N[%Z>+LD.]8?Z>NORMG5^>0[UA_IZZ_`W/(=ZR_4]??@3GD.];? -MJ>OO\MS+.H=\Q_H[=?W=RSQ7N4.^8_V=NO[N9>+N9>$.W7^GK+]3U]^]3-R] -M+-RA^^^4]7?J^KN7)W]VZ/X[9?V=NOZNG%V=0[YC_9VZ_@[,(=^Q_DY=?P?F -MD.]8?Z>NO\MSK^H<\AWK[]3U=Z_R7.$.W7^GK+]3U]^]2MR]JMPAW['^3EU_ -M]RIQ]ZIRAWS'^CMU_=VKT\79(=^Q_DY=?U?.KLXAW['^3EU_!^:0[UA_IZZ_ -M`W/(=ZR_4]??Y;G7=0[YCO5WZOJ[UWFNO3_[LT/UWROH[=?U=.;LZAWS'^CMU_1V80[YC -M_9VZ_@[,(=^Q_DY=?Y?GWM0YY#O6WZGK[][DN<(=NO].67^GKK][D[A[4[E# -MOF/]G;K^[DWB[DWE#OF.]7?J^KLWIXNS0[YC_9VZ_JZ<79U#OF/]G;K^#LPA -MW['^3EU_!^:0[UA_IZZ_RW-7=0[YCO5WZOJ[JSQ7N4.^8_V=NO[N*G%W5;A# -M]]\IZ^_4]7=7B;NKPAVZ_TY9?Z>NO[LZ^;-#]]\IZ^_4]7?E[.H<\AWK[]3U -M=V`.^8[U=^KZ.S"'?,?Z.W7]79Y[6^>0[UA_IZZ_>YOG"G?H_CME_9VZ_NYM -MXNYMY0[YCO5WZOJ[MXF[MY4[Y#O6WZGK[]Z>+LX.^8[U=^KZNW)V=0[YCO5W -MZOH[,(=\Q_H[=?T=F$.^8_V=NOXNS[VK<\AWK+]3U]^]RW.5.^0[UM^IZ^_> -M)>[>%>[0_7?*^CMU_=V[Q-V[PAVZ_TY9?Z>NOWMW\F>'[K]3UM^IZ^_*V=4Y -MY#O6WZGK[\`<\AWK[]3U=V`.^8[U=^KZNSSWOLXAW['^3EU_]S[/%>[0_7?* -M^CMU_=W[Q-W[RAWR'>OOU/5W[Q-W[RMWR'>LOU/7W[T_79P=\AWK[]3U=^7L -MZASR'>OOU/5W8`[YCO5WZOH[,(=\Q_H[=?U=GKNN<\AWK+_3J+\S=/^=LOY. -MH_[.T/UWROH[C?H[0_??*>OO-.KO#-U_IZR_TZB_,W3_G;+^3J/^SM#]=\KZ -M.XWZ.T/WWRGK[Y3T=Q_J'/(=Z^_4]7ANOP-SR'>LO[/\'3=WJ'/`=\;ZNYL?>,!=]M.A<@=\9ZR_,]??'=+>H7"' -M[K\SUM^9Z^\.B;M#X0[=?V>LOS/7WQU._NS0_7?&^CMS_5TYNSH'?&>LOS/7 -MWX$YX#MC_9VY_@[,`=\9Z^_,]7=Y3NH<\)VQ_LYOOS/5WDKB3RAWPG;'^SEQ_)Z>+LP.^,];?F>OORMG5.>`[8_V= -MN?X.S`'?&>OOS/5W8`[XSEA_9ZZ_RW-:YY#O6']GKK_3/%>Y0[YC_9VY_DX3 -M=UJX0_??&>OOS/5WFKC3PAVZ_\Y8?V>NO].3/SMT_YVQ_LYOOS/5W;9ZKW"'?L?[.7'_7)N[: -MPAVZ_\Y8?V>NOVL3=VWA#MU_9ZR_,]??M2=_=NC^.V/]G;G^KIQ=G4.^8_V= -MN?X.S"'?L?[.7'\'YI#O6']GKK_+ZZRAWR'>OOS/5W7>*NJ]PAW['^SEQ_UYTNS@[YCO5WYOJ[Z0[UA_9ZZ_ZQ-W -M?>$.W7]GK+\SU]_UB;N^<(?NOS/6WYGK[_J3/SMT_YVQ_LYNOQM.%V>'?,?Z.W/]73F[.H=\Q_H[ -M<_T=F$.^8_V=N?X.S"'?L?[.7'^7Y\8ZAWS'^CMS_=V8YRIWR'>LOS/7WXV) -MN[%PA^Z_,];?F>OOQL3=6+A#]]\9Z^_,]7?CR9\=NO_.6']GKK\K9U?GD.]8 -M?V>NOP-SR'>LOS/7WX$YY#O6WYGK[_+<5.>0[UA_9ZZ_F_)LOS/7 -MWTV)NZERAWS'^CMS_=V4N)LJ=\AWK+\SU]]-IXNS0[YC_9VY_JZ<79U#OF/] -MG;G^#LPAW['^SEQ_!^:0[UA_9ZZ_RW,?ZQSR'>OOS/5W'_-LOS/7WWW*?3A=GAWS'^CMS_5TY -MNSJ'?,?Z.W/]'9A#OF/]G;G^#LPAW['^SEQ_E^<^USGD.];?F>OO/N>YRAWR -M'>OOS/5WGQ-WGPMWZ/X[8_V=N?[N<^+N<^$.W7]GK+\SU]]]/OFS0_??&>OO -MS/5WY>SJ'/(=Z^_,]7=@#OF.]7?F^CLPAWS'^CMS_5V>^U+GD.]8?V>NO_N2 -MYPIWZ/X[8_V=N?[N2^+N2^4.^8[U=^;ZNR^)NR^5.^0[UM^9Z^^^G"[.#OF. -M]7?F^KMR=G4.^8[U=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L]]K7/(=ZR_,]?? -M?OOOB;NOA;NT/UWQOH[<_W=U\3=U\(=NO_.6']GKK_[>O)G -MA^Z_,];?F>OORMG5.>0[UM^9Z^_`'/(=Z^_,]7=@#OF.]7?F^KL\]ZW.(=^Q -M_LYOOOB?NOF?NV@-^BORYQ^[-?L^]\7690W_> -M=GDJF+OW[<=O5W>#Z+ZJMF2`T>O[P[\^=%_5K[R^[O;\6FT.,_@[_X$??[Y^ -M^%<9O+T[Z-\8S*_PX5Q^P]W=W4&WT=1^X\YC^CC(_3<\U.OTP!M^#_Y5?W^UU/VW7M'W33NDBQU::3INN+7.W[[5;[[^^ -M__S+7YO?__3W?YS'_KN^W=OK?G9MAO7V#Q_8W*L3^G9_^+=[-W?[Y?OBM/.< -MT;DG>.[VRW?WDSGTP>?:GSUU4/KJ+GYN[^:ZP\.GQOM/C5TS:M/?_-O03.?^ -MY\$<^N/C?X6\VYL#EO[\<]O?_`)/FO5X_L[6G__PW6:\^32Y^T\S>OO_,DW- -M(.?_R^[\<_O/OUW_\V[L_?7_O4VO[^[F`,$?_`?8Z=W=',"(..1LD;_=YN$< -M^)7>KYW>^=O/=Z>%#.K\H^"GSX_XUHO?GP*]7?NGT -M;O^OQO/7V!G\G?_`C]^O'_YU-]BFP4=[A>VA7Q_QL^,\]XB?'>>Y1_SL.,\] -MZF?'>?`1/SO.>\3/CO/_I[C(WT1/\^=V6NMF==F'9K> -M?Q%G7XY__,?U]?^"MWOW>X[L2_]/OHCCGXS]$;^(G^=^_D6\IS^W^9M[LX_X -71?P\]ZA?Q-O#<"/3W_X?EY=\._6L```` +M'XL(".*7?5P``VEM9RTV,W@R-34M-3$R+6=P="YQ8V]W+F]U=`"MG?U%:&W1$E4GG/BJ;<-E-&>E8WN60\J(C)B:&3/]?'-).^#/+FWC@U11114 +MD&,C\VIQ45:MNCH<[KXU32=-VS?MU.Q+<_//Z4.:>__P\*/Y\8^__?WZ_K$G3[E_;K61-/=@ZZ]U3L]/K[/X.66#]F"P27.']/J$G%[[[[V^[^[MRMWI/=[;5?)V.S;8/QC\(\W]F5Z? +MDK<[L+GQP=S)O5TE;W=B<_-/85$"R\+FUF"NA4\=V=P6S'7PJ1W/R4]^;N_F +M>OB4L#F%/.(NX$^$W"'?+8R[ +M)>0.^6YAW"TA=\AW"^-N";E#OEL8=TO('?+=PKA;0NZ0[Q;&W1IRAWRW,N[6 +MD#ODNY5QMT;<]?@IPMT:<=^6QEW:\1=CWRW,N[6B+L>^6YE +MW*T1=SWRW*N1[X[,NZ.(7?(=T?&W3'D#OGNR+@[AMPA +MWQT9=\>0.^2[(^/N&'*'?'=DW!U#[I#OCHR[+>0.^6YCW&TA=\AW&^-NB[@; +M\%.$NRWB;D"^VQAW6\3=@'RW,>ZVB+L!^6YCW&T1=P/RW<:XVR+N!N2[C7&W +M1]P-R'<[XVZ/N!N0[W;&W1YRAWRW,^[VD#ODNYUQMX?<(=_MC+L]Y`[Y;F?< +M[2%WR'<[XVX/N4.^VPEWDK_#YX#OY$"XDT/('?"='`AWLOY.POYN0[UA_)V%_-R'?L?Y.POYN0KYC_9V$_=V$?,?Z.PG[NPGYCO5W +M$O9W$_(=Z^\D[.\FY#O6WTG8WTW(=ZR_D["_FY#O6'\G87\W(=^Q_D["_FY" +MOF/]G83]W81\Q_H["?N["?F.]7<2]G<3\AWK[R3L[V;\%.$N[.]FY#O6WTG8 +MW\W(=ZR_D["_FY'O6'\G87\W(]^Q_D["_FY&OF/]G83]W8Q\Q_H["?N[&?F. +M]7<2]G]8?R=A?SOO).SO%N0[UM])V-\MR'>LOY.POUN0[UA_)V%_MR#?L?Y. +MPOYN0;YC_9V$_=V"?,?Z.PG[NQ4_1;@+^[L5^8[U=Q+V=ROR'>OO).SO5N0[ +MUM])V-^MR'>LOY.POUN1[UA_)V%_MR+?L?Y.POYN1;YC_9V$_=V*?,?Z.PG[ +MNQ7YCO5W$O9W*_(=Z^\D[.]6Y#O6WTG8WZW(=ZR_D["_6Y'O6'\G87^W(M^Q +M_D["_FY%OF/]G83]W1$_1;@+^[LC\AWK[R3L[X[(=ZR_D["_.R+?L?Y.PO[N +MB'S'^CL)^[LC\AWK[R3L[X[(=ZR_D["_.R+?L?Y.PO[NB'S'^CL)^[LC\AWK +M[R3L[X[(=ZR_D["_.R+?L?Y.PO[NB'S'^CL)^[LC\AWK[R3L[X[(=ZR_D["_ +M.R+?L?Y.POYNPT\1[L+^;D.^8_V=A/W=AGS'^CL)^[L-^8[U=Q+V=QOR'>OO +M).SO-N0[UM])V-]MR'>LOY.PO]N0[UA_)V%_MR'?L?Y.POYN0[YC_9V$_=V& +M?,?Z.PG[NPWYCO5W$O9W&_(=Z^\D[.\VY#O6WTG8WVW(=ZR_D["_VY#O6'\G +M87^WXZ<(=V%_MR/?L?Y.POYN1[YC_9V$_=V.?,?Z.PG[NQWYCO5W$O9W._(= +MZ^\D[.]VY#O6WTG8W^W(=ZR_D["_VY'O6'\G87^W(]^Q_D["_FY'OF/]G83] +MW8Y\Q_H["?N['?F.]7<2]G<[\AWK[S1_Q\TU=0[X[N8IS)VZ_B[?I]=4[H#O +ME/5WZOJ[)G'79.[L@)_"W*GK[YK$7?-GF0.^4];?J>OOFI,[.T/WWRGK[]3U +M=^7LZASPG;+^3EU_!^:`[Y3U=^KZ.S`'?*>LOU/7W^6Y)W4.^$Y9?Z>NOWN2 +MYYHR!WRGK+]3U]\]2=P]J=P!WRGK[]3U=T\2=T\J=\!WROH[=?W=D]/%V0'? +M*>OOU/5WY>SJ'/"=LOY.77\'YH#OE/5WZOH[,`=\IZR_4]??Y;FG=0[YCO5W +MZOJ[IWFNOOU/5WS_-G_S9H?OOE/5WZOJ[LOU/7W[W(UCGD.];?J>OO7N:YRAWR'>OOU/5W+Q-W+PMWZ/X[9?V=NO[N9>+N +M9>$.W7^GK+]3U]^]//FS0_??*>OOU/5WY>SJ'/(=Z^_4]7=@#OF.]7?J^CLP +MAWS'^CMU_5V>>U7GD.]8?Z>NOWN5YPIWZ/X[9?V=NO[N5>+N5>4.^8[U=^KZ +MNU>)NU>5.^0[UM^IZ^]>G2[.#OF.]7?J^KMR=G4.^8[U=^KZ.S"'?,?Z.W7] +M'9A#OF/]G;K^+L^]KG/(=ZR_4]??OOO7B?N7A?NT/UWROH[ +M=?W=Z\3=Z\(=NO].67^GKK][??)GA^Z_4];?J>OORMG5.>0[UM^IZ^_`'/(= +MZ^_4]7=@#OF.]7?J^KL\]Z;.(=^Q_DY=?_6YRAWR'>OOU/5W5XF[J\(= +MNO].67^GKK^[2MQ=%>[0_7?*^CMU_=W5R9\=NO].67^GKK\K9U?GD.]8?Z>N +MOP-SR'>LOU/7WX$YY#O6WZGK[_+LOU/7WY6SJW/(=ZR_ +M4]??@3GD.];?J>OOP!SR'>OOU/5W>>Y=G4.^8_V=NO[N79ZKW"'?L?Y.77_W +M+G'WKG"'[K]3UM^IZ^_>)>[>%>[0_7?*^CMU_=V[DS\[=/^=LOY.77]7SJ[. +M(=^Q_DY=?P?FD.]8?Z>NOP-SR'>LOU/7W^6Y]W4.^8[U=^KZN_=YKG"'[K]3 +MUM^IZ^_>)^[>5^Z0[UA_IZZ_>Y^X>U^Y0[YC_9VZ_N[]Z>+LD.]8?Z>NORMG +M5^>0[UA_IZZ_`W/(=ZR_4]??@3GD.];?J>OO\MQUG4.^8_V=1OV=H?OOE/5W +M&O5WANZ_4];?:=3?&;K_3EE_IU%_9^C^.V7]G4;]G:'[[Y3U=QKU=X;NOU/6 +MWVG4WQFZ_TY9?Z>DO_M0YY#O6'^GKK_[D.<*=^C^.V7]G;K^[D/B[D/E#OF. +M]7?J^KL/B;L/E3OD.];?J>OO/IPNS@[YCO5WZOJ['[K\SUM^9Z^_*V=4YX#MC_9VY +M_@[,`=\9Z^_,]7=@#OC.6']GKK_+5)Y0[XSEA_9ZZ_D\2=5.Z`[XSU=^;Z.SE=G!WPG;'^SEQ_5\ZNS@'?&>OO +MS/5W8`[XSEA_9ZZ_`W/`=\;Z.W/]79[3.H=\Q_H[<_V=YKG*'?(=Z^_,]7>: +MN-/"';K_SEA_9ZZ_T\2=%N[0_7?&^CMS_9V>_-FA^^^,]7?F^KMR=G4.^8[U +M=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L]9G4.^8_V=N?[.\ESA#MU_9ZR_,]?? +M6>+.*G?(=ZR_,]??6>+.*G?(=ZR_,]??V>GB[)#O6']GKK\K9U?GD.]8?V>N +MOP-SR'>LOS/7WX$YY#O6WYGK[_)<6^>0[UA_9ZZ_:_-OO +MS/5W8`[YCO5WYOH[,(=\Q_H[<_U=GNOJ'/(=Z^_,]7==GBOZ0[UA_9ZZ_ZQ)W7>4.^8[U=^;ZN^YT<7;(=ZR_,]??E;.K<\AWK+\S +MU]^!.>0[UM^9Z^_`'/(=Z^_,]7=YKJ]SR'>LOS/7W_5YKG*'?,?Z.W/]79^X +MZPMWZ/X[8_V=N?ZN3]SUA3MT_YVQ_LY?_-FA^^^,]7?F^KMR=G4.^8[U +M=^;Z.S"'?,?Z.W/]'9A#OF/]G;G^+L\-=0[YCO5WYOJ[(<\5[M#]=\;Z.W/] +MW9"X&RIWR'>LOS/7WPV)NZ%RAWS'^CMS_=UPNC@[Y#O6WYGK[\K9U3GD.];? +MF>OOP!SR'>OOS/5W8`[YCO5WYOJ[/#?6.>0[UM^9Z^_&/%>Y0[YC_9VY_FY, +MW(V%.W3_G;'^SEQ_-R;NQL(=NO_.6']GKK\;3_[LT/UWQOH[<_U=.;LZAWS' +M^CMS_1V80[YC_9VY_@[,(=^Q_LY0[UA_9ZZ_^YCG*G?(=ZR_,]?? +M?4S3/#MU_9ZR_,]??E;.K +M<\AWK+\SU]^!.>0[UM^9Z^_`'/(=Z^_,]7=Y[E.=0[YC_9VY_NY3GBOZ0 +M[UA_9ZZ_^YRX^URX0_??&>OOS/5WGQ-WGPMWZ/X[8_V=N?[N\\F?';K_SEA_ +M9ZZ_*V=7YY#O6']GKK\#<\AWK+\SU]^!.>0[UM^9Z^_RW)X0_??&>OOS/5W7Q)W7RIWR'>LOS/7WWU)W'VIW"'?L?[.7'_WY71Q=LAW +MK+\SU]^5LZMSR'>LOS/7WX$YY#O6WYGK[\`<\AWK[\SU=WGN:YU#OF/]G;G^ +M[FN>J]PAW['^SEQ_]S5Q][5PA^Z_,];?F>OOOB;NOA;NT/UWQOH[<_W=UY,_ +M.W3_G;'^SEQ_5\ZNSB'?L?[.7'\'YI#O6']GKK\#<\AWK+\SU]_EN6]U#OF. +M]7?F^KMO>:YPA^Z_,];?F>OOOB7NOE7ND.]8?V>NO_N6N/M6N4.^8_V=N?[N +MV^GB[)#O6']GKK\K9U?GD.]8?V>NOP-SR'>LOS/7WX$YY#O6W[7Y.V[N>YT# +MOFM9?]>Z_NY[GJO<`=_=/(6Y:UU_]SUQ]SUSUQ[P4^3//79O]GONC:_+'/KS +MMLM3P=R];S]^N[H;1/=5M24#C%[?G_[UH?NJ?N7U=;?GUVISF,'?^0_\^.OU +MP[_*X.W=0?_!8'Z%#^?R&^[N[@ZZC::V&W?NZ>,@]]_P4*_3`V_XR?6].?1G +M,__*^:'K?GXVV'7-/%\,_D]^?;?7_;1=T_9-.Z6+'%MI.FVZMLS=OM=NO?_Z +M?O_;WYL__O+/_SZ/_6]]N[?7_=P\/(VWOUOB#ND@[.W^L_S^PGWZNKOK?BY. +M.\\9FRNWS+FYVR_?W4_FT`>?:W_VU$'IJ[OXN;V;N_WRW=;_Y7C_J?//4==L +M<[,O9.[WWQ_.H3\^_E?(N[TY8.F;X>;_M-[\`D^:=3]_Y]B?__#=9KSY-+G[ +M5S-Z^]\R3>Y1_SL +M.,\]XF?'>>Y1/SO.@X_XV7&>>\3/CO/<(WYVG.<>];/C9O#V]QP?Z8OX>>[, +MWFY-.S;;VL/[`*G*E+OM+^]&!N\F!F<;+V+5HFL -M^30VWXP-:6H^C"G.9,9DR=HMZ_^W%["]?^87ZVXWU\G^ISLR,)X24&J($X@45L*MPOB -M)!)54[@FB%-(5$O@>$"5'I-X=6]PCAVN1 -M*,H[\+Q[;'%/)AS'HBCOP//NJ<4]/;>X%PZ']#N@O`//NY<6 -M=^)P2+\#RCOPO#NUN%<.A_0[H+P#S[NSA7<2<\[UY;5NIP2+\3E'?" -M\XY;'#@"\DYXWBF+RQP.Z7>"\DYXWN465S@XO[X'!(OQ.4=]+S[J/% -M?7(XI-])RCOI>7=N<1<.A_0[27DG/>\N+>[SA`,L:O(N3?'+XJX6-0M(OY/9 -M/7&;)8Y^6#GD."O=<9LCO_3`"K!X.)#<:Z4YI\2;L#(3UE95R"\]T%TD\^\$ -M'&KW`<`QPSG.3EB9VC4/C$W#VM9>9J5L<-ZZ`P(RX>-D#U='7K^AW!X`5(I5 -MU0+X?^OLR[@=YN-30#!4S)"3?,5>WV\[O:7+.;\Z_?-.R'F^Y0;AK7 -MZ(>E*O.RX]1TK[X@]BE3;LO5'G&"PDW',@^GCQ=YO8+#+M;](7!R+6IZZ7"/ -M>VMP*IU'[;XWT7ZNG^_)615N]TLJ"7?0`N7J563U\D712:,ETXZJ-!3?BMI%7+]/#?7WT -M_7OY2P]T-\G\:X#2`J-E*+-V%[$Z-"YB=6A(:I]TK"Z9J5DK6UO,TR.VX2WZBTVU@;>M?V<3QF]%$W,0U -A;G43SQMRLO;SUYMLQ$U=I/9,;DFGO?4"-APSTSOM;R]"`H'818DKF_'$H]DO +M*_'M2B9-S8LQQ9G,F-RPIF+==WL!FWR97ZR]W]TFTU=[8F`\):*0`2E&W(QU +MXW!`X5*^'.`X;I*=0'`P1"U!(9PDLUL;0'#G)_W2]3>C\"+$,4"#(V_&4?F! +MR<^/D$?F!['S$_CZJ2'.'\C6\Q,F/S\JIW!%$`=(U(;"E4&<0*(J"KB!(6305R!1%'>\;!W&R2*\HZ'O2N1 +M*,H['O:N0J(H[WC8NST217G'P]X=D"C*.R"\8PY7(U&4=^!Y=VIQSQRN0:(H +M[\#S[KG%O1AQ'(NBO`//NY<6]\KAD'X'E'?@>??:XLX<#NEW0'D'GG=O+.[< +MX9!^!Y1WX'EW87%O'0[I=T!Y!YYWEPOO.-+O@/).>-Z]LZS4X9!^)RCOA.<= +MMSAP.*3?"=Y\L[K/#(?U.4-Y)S[LO%O?5 +MX9!^)RGOI.?=E<5=.QS2[R3EG?2\N[&X;R,.L*C1NS3%+XO;+FH6D'XGLT?B +M=DL<_6/EF..L=,=MCGS2`RO`XNE`7V!*!2K"P7 +MP)]#?GVY=?5EG@UT=JN^&2A@2HZX?JYJ/\UON[ME=U???VC8+S?=OMR:_E]V +MAX>B]++C]'3/EO8I4V[+U1YP@L2=)BA.'R_RPPH.NUC[A\#)M:CQH<,C[JW! +MZ>/%^%.[NZ9MJ[]'BM7E_/G-%+?=SG%99/.D'JXREN]95NOG2?M&_W'(]*\T +M5G1E8K9MZ,]8&Y9S?7;K@.W#??)@8)?)[PN;G^36".RB!ZC5D[!FA$XJ,%TV +MQV&/D?YK]71?KE2TU=O8-H5=]`"Y>J59/7R1=%)HR;3#J@T%-^"JR*N7Z>&N +M/KK^O?RD!]J[9/XV0&F!T3*46;./6!T:%[$Z-"YB=6AY/GZ?_`/D@(G0%1H````` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-512-gpt.raw.gz.uu b/usr.bin/mkimg/tests/img-63x255-512-gpt.raw.gz.uu index 34c7c72726cf..ebb6a17d87df 100644 --- a/usr.bin/mkimg/tests/img-63x255-512-gpt.raw.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-512-gpt.raw.gz.uu @@ -1,15 +1,15 @@ # $FreeBSD$ begin 644 img-63x255-512-gpt.raw.gz -M'XL("-IQ+ED``VEM9RTV,W@R-34M-3$R+6=P="YR87EIJKH,&+Z/(6S'"-6>OQ:8-8YR(N)1N>QG06BC+!?`]Q:?[X[!@')@]Z/"^ -M!*/`:K#F%]?G:NMQ?(]/SW"X?WU#V,;L1I -M]%I4.^$*$K?-XXIXMC0NMVF<6?.*/?2_LXTX*Z=>?NSE+7@-KH:F)'&?$YQC -M[CR#YLK!K@9W!*N@;O&A<:!4B"_(Q/>04-\&Y!YV"G2%P.[T(DX1=B.^KH?X -MC!HZ(K=I`U4]H]@C_+^7=]K0'<3TBD`S`-DB#,WG&-6!.$9U((Y1'8AC50<" -M&=6!.$9U((Y1'8AC54<`>LDWQ!'7#W$#NP::`HKY$*?&<2>^Q6TF7:_71O_* -F$,\?AF<<5G*6! +M5L-[CQ/C=1037#5Z+5;<,,6)@!O2;?8!K85S"^#7$)_NCL/"I#`YM-\O812L +MAC4W7)>K+:?QG5_?<'G^^"38]YBN5M[H2CB#^H0FN8M._3_=@-/DM:CV@$NB +MN.,Z+@EG&\>MK3C.;'F%'MJ3K`W)WG9F4R\Z(XO:H2DBN/-YCDN9.\^0N4AQ +M*I'6L`IE0R]5"J6`S,LDZR"^OA5DCI."+@C87M_%-<">Q,]C'Y]1?4>LK;@A +M5CVCMSJ"@OHC79:M>WO^FUE;<$*V>"]5;+U)4,NU0M4$A`ZY@ +MKEY*9J\/__]>/N.&]B+F=P":'L@6H6^^E%$=A&-4!^$8U4$X5G40D%$=A&-4 +M!^$8U4$X5G5X8";YACCANB%ND.;J9WAK]&T-\_3`RQB%. +;N.TAGNQ-EG&($XYUB'N@D_+P"ZG]1LB("P`` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-512-gpt.vhd.gz.uu b/usr.bin/mkimg/tests/img-63x255-512-gpt.vhd.gz.uu index 833f43b5f129..597dab379258 100644 --- a/usr.bin/mkimg/tests/img-63x255-512-gpt.vhd.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-512-gpt.vhd.gz.uu @@ -1,23 +1,23 @@ # $FreeBSD$ begin 644 img-63x255-512-gpt.vhd.gz -M'XL("-IQ+ED``VEM9RTV,W@R-34M-3$R+6=P="YV:&0N;W5T`*V8S8^4,!3` -M[_M7/&/B88VDE+;`98PF:^)M-9J]>*%\;";J^#$>-I']W^TK+5"@Z,0WTQ`F -MY?UXW^V4L>$#H#)0':@6E,3[7(`J(2\`S*0;W%Y3]Q/Z^MNIK7\='Q+WZ:\& -M6,KF4J$XRO,,A'E)#KS"EZ@&[Z'WF.3IS?WU\>N]QW&'XPXDD_> -M0#&\Q^+NCORS13Y.VF5K[2:IP<"N@ZR;/9%Y[1[M]>7<6&&DS/,X)!0Y,#&- -MX$(^[5.'^8:>!0`7WS`5+.2]Q&ZGR7]Y3 -MH9R/KG$"DWZ">_/-,.]G065819G73Z5LQ^?Q8$3UJU`_82JAVKC&)_K72?@= -M@5I?!O0>#'%C0'2-_K.5VK:314.2.&'S2-;&`W*8Q5]OCLJCW#INU6V.QZ78'MS7B.+$G-:XE_Q#; -M`2=9*%7,I0J)ZX>JH:FBN"\!CKHOMSBM351K7,)E"K5=RQL%:6KT,V526`@' -MW@`S"[M9A34"^].[Y#3`7B0_GCO]VM1EQ-:(3\2\U_*]C$"E_F(NA#CJOMP6 -MZ#U)YKW2):K>/ICY,_UY?XQ/] -M;1)^!R!WRQ#9NL9=(R734#@@F8;"U2^AAJG8#>:E459.0S*3E4L;,@WSIJ#L -M@8@C[(&((^R!B"/M@0@D[(&((^R!B"/L@8@C[8%Y4]ID)MJJ(0YSCRLH-?[; -M+>I0C>BFJW^6W`V*'>;FEL-?Z-@&;V>KMAF,DA%NU1"WNU737MB".\+0%<=2I8K8N5W\`!A+Z -%KZ(3```` +M'XL(".*7?5P``VEM9RTV,W@R-34M-3$R+6=P="YV:&0N;W5T`*V82X_3,!#' +M[_T4@[@M(G([XW'L)FGL0,6T5I3* +M\2__>7CLFK'A`Z`*4#TH`TKBO1:@*M`E@.WTC;MK[G_"J?UV,.VO_5/F/Z?- +M`,O9=-1\.([G!0C[$@V\QI>H#N_A%##9R]WCS?[K8\!QC^,>)#6.*CBH9O$> +MW4$YO,?A[O?\BT,^C^J*I;IQU&!@WT/13YXH@KIG=WTS-5;84?9Y;!)*#4R, +M;?9CUC$:>^$[R2Y&363&G,I&8V,XM3;J&MS-QL=B2!6;&-I>&:@<-,=[FS;! +M#XMF4^7I^+W^>307^G@B5=0D&)=]*][C/E5X>-@K$"APS5QPE.,E+I(J_^4] +M-1\7HFN=P&3HX,%\V^S[V6QF.*$LZ%,Y6_%Y.AA)?37J$W8FU)%KNN/T+IM_ +MS\"FN0X8/#C'G0/2M.@_-U.-&2T:DL0/MH\4)AV0[22^34<#I\"$[#+#7V8]77I_)?4;$6KHCY3W#US("1?W%7)CCJ.NR +M*=%[DLQ[E2]3L9;N2'JO'KP7=Q**BDW=\ZJ692_FN(;6>[G;/MKY8>OW\IKN +M.-UE\^\`Y'X9(EO7N"^D9`J%!Y(I%'[^$BK,Q6HPKXVR\@K)3%8^;<@4ZJZD +MK(&((ZR!B".L@8@CK8$()*R!B".L@8@CK(&((ZV!NJM<,A-MU1"'N5?95.Y! +M:Z@O9"0W75;?[T'8=FIN-?R%3FWP5K9JT6!4C'"KAKC5K5K3IXW-HL82;M40 +M1[I5*WW=(SIM01SA:0OB"$];$$=XVH(XPM,6Q!&>MB"..E7LUF7S!V&AQ:.B +#$P`` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu b/usr.bin/mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu index 40937fd7aaab..c1b185e37759 100644 --- a/usr.bin/mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-512-gpt.vhdf.gz.uu @@ -1,19 +1,19 @@ # $FreeBSD$ begin 644 img-63x255-512-gpt.vhdf.gz -M'XL("-IQ+ED``VEM9RTV,W@R-34M-3$R+6=P="YV:&1F+F]U=`"MET^/U2`0 -MP._O4XSQMD8"%"@]O:S):KRM1N-E+_T#FY?59TPT\=`/+U/H>Z6%ZAI:TM!, -MY]>9889I*?4'@.!`V\0U+QC?D/@<#S>'B<:ZYP'=^]&$%9`XH,?U3D@Y/F,, -M6!L&99.65W;WE0WS&4>NQY$L<,-%:SOR@B6.>-SLKGT>4$IHVPWP\VP?GY9# -M@E`@&N#N>0J"@>0@Q04W^2[[I7UW;]_#_>W'3PA[N+K+F1-J`U4#5$(M5]:Q -MK+L-^16[ZW'.H$2T9UR5Q1W7T?.X"G'##BXU\CBQI^5SZ-_6UN,DC;7T4DM+ -MT!Q4#T.;Q7V-<*IPY@D4=PKJ'I0!R:"W.!D4,.;LQF!1OW%78AQ5>GH:8R>+!:])B1+:N0% -MV>BU/GKI(*%1J=)UN!`U\B+&=86CIU#LZL/MW]MK7C#>D_CT0!&`Q2RLK>T+ -M5@?B"E8'X@I6!^**5@<""U8'X@I6!^(*5@?BBE:'`QI:KHDC#G//.E8-;0>= -MB86)J6K@+;Y$ -M#3A?V/?R[O'F].UQQO'@U1Q`6:-6Y6+6;=S5L;M?3OQI;5UBF])1]-@FG5?; -MP'&)$Q=GW:^!VV*HN([H)A(D$QEQ4ZHL'_[?M?6XTJGB?@T.?P"E;4<,LPT` -!```` +M'XL(".*7?5P``VEM9RTV,W@R-34M-3$R+6=P="YV:&1F+F]U=`"ME\V+U3`0 +MP._OKQB1O:P8FL^F%Q\KO`5OJR@B>.E'LCS$MPA[\-`_WDS3]C5M4EU).Y24 +M:7Z=FC"2L@<4"/:YVR8/B, +M,6#M*`4=9OG)[I[;<3SAR/4XD@6NFV=M):U8XHC'3>[:EP&EA+K>`+],]K%A +M.20(!:("YIXO0%"0#*28<8/OLEW:=[K_``]WGSXC[/O574:=DAOH.F`29+6R +MCJ;IPS*!+M"<>3T3NNH^=Q'''=#BXF:9S8F^5SZ-_6UN,DXL3U +M2;V@!PH!U4%10 +M4F`-`OO+1W+QL+?DUYO1/D''C(A)6I&*GF![&8%&_<5="'$\=_0T1D]FBUXU +M;E,Q22N2T:M]].)!0J-BI>MP8]3(JQ#79(Z>0K6K#[=_;Z]I1?]`PM,#Q0C, +M9F%I;9NQ.A"7L3H0E[$Z$)>U.A"8L3H0E[$Z$)>Q.A"7M3HPO=:_T\3CBV$R-G'$[39Q:U+.SIR5LQF;..*R +M-G$]?GXK#FJH+R5Q7`I0KJ3T$LBN.3,`VZ>+:9_/OY?10QSU&1$5G,\X>JQ* +M8#6^1'4X7MCW^O1X>_[Y..'8Z-64<[+$69R!:C;NZM#=KV?V8VU=9)O20?3H +M)IU7V\!QB1.SL^[7P&TQN,Z3!#>!(IK(B)M299;_75N/RYTJ[M?@\`?U7U^L +$LPT````` ` end diff --git a/usr.bin/mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu b/usr.bin/mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu index 3ff70e9ee2ea..bbeff6aa94d8 100644 --- a/usr.bin/mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu +++ b/usr.bin/mkimg/tests/img-63x255-512-gpt.vmdk.gz.uu @@ -1,88 +1,88 @@ # $FreeBSD$ begin 644 img-63x255-512-gpt.vmdk.gz -M'XL("-MQ+ED``VEM9RTV,W@R-34M-3$R+6=P="YV;61K+F]U=`"M7%UOW,@1 -M?+]?,=$]7)`@"]:27)(/!G(7W0&'((!C.[F7/&3YE1/BDQU9"&)`/SX<\C>=76!6;;\.%>TKBA/!#N.-S4:L7IN.X"9?[J/91 -M8(`[)EY(PA73B\>G0KBZ\_QR[Y\(G(M`;@57/I%3,MGG5O>[KT+Q_/IROX9I -M>T^-JW)W:H/I3N5LYZXZSJ]EKIJG?[G+XU-UOPIF;'3Z>;PCGHZ:%3.\]Y:&X -MIY/SOX^/>77#]:U'',-/7)W?VU"<9=3FE^&BX.7SO"G7SMI@VLP[J6K*>04W)GIV7???^_VRE?UX>=O2+F]RZ,K*X\U;>"\%4>7%_[9]$_3@J=,"G@G=_?A^O#FI^D2]\5Z^_K;-X2K -MIZC)9=U[V`;-Y]$]" -MU19XW\0*_\*\L^[R?'MVWYT_#8>O+R^_BSM[]LD6\S$M;?`HIP7:G]]S.:?" -M+3N];/2\%7W?'L[]^>/M<..W-VY%ZTO4ATS]MA;WV[A^GVK>J=&?,>[NE;NX -MZJ<]];#_&C[\0KAN.8VG=?A3HID#<_]D.GMF^"&\PW+&^&WR<,/MS>=#]_G] -MU74_76CN%>'ZI7;3&BXMM.M;O([I3CWT[+VBF_T'ZVD_+AY]I%:_$G"! -MLU[?*7OP>99K7"%&N0+TGV+9]/O'Z??U_?I.?GTG\:PTJA:C6<']B??V@;Q'!]6CU\U(,_3N4848 -MY0HN5;LFU(Z>E4;58C0KN%3MSJ%V]&PUJA.CWY5L&VI'SU&C_`,;!.1Y&JX+ -MM:-GKE&%&.4*+E6[/M2.GI5&U6(T*[A4[890.WJV&M6)T>]*=@RUH^>H4?ZA -MD-H56W!5%FI'SURC"C'*%5RB=A7['3TKC:K%:%9PB=I5['?T;#6J$Z/?E2S[ -M'3U'C?(/I=2NW(1COZ-GKE&%&.4*+E4[]CMZ5AI5B]&LX%*U8[^C9ZM1G1C] -MKF39[^@Y:I1_.$GM3IMP['?TS#6J$*-AF._HV>N4848Y0HN53OV.WI6&E6+T:S@4K5C -MOZ-GJU&=&/VN9-GOZ#EJE'\@(0-YGH2KLU`[>N8:58A1KN`2M:O9[^A9:50M -M1K."2]2N9K^C9ZM1G1C]KF39[^@Y:I1_:*1VS28<^QT]J'?L=/5N-ZL3H=R7+?D?/4:/\`_\+!7F>AF._HV>N4848Y0HN -M53OV.WI6&E6+T:S@4K5COZ-GJU&=&/VN9-GOZ#EJE'\@_PAYGH9COZ-GKE&% -M&.4*+E4[]CMZ5AI5B]&LX%*U8[^C9ZM1G1C]KF39[^@Y:I1_Z*1VW19N8:58A1KN!2M6._HV>E4;48S0HN53OV.WJV&M6)T>]* -MEOV.GJ-&93(]@SQ/PIVSI7;1,]>H0HQR!9>HW3GTN^A9:50M1K."2]3N'/I= -M]&PUJA.CWY5LZ'?1<]0H7S+A[[!):9U#OX/P=U#^#L+?89._.X=^!^'OH/P= -MA+_#)G]W#OT.PM]!^3L(?[^$ -MOX/R=Q#^;D>R['?"WT'Y.PA_ATU*JV6_$_X.RM]!^#ML\G^@_!V$O]N1+/N=\'=0_@["WV&3TNK8 -M[X2_@_)W$/X.F_Q=QWXG_!V4OX/P=]CD[SKV.^'OH/P=A+_;D2S[G?!W4/X. -MPM]AD]+JV.^$OX/R=Q#^#IO\7<=^)_P=E+^#\'?8Y.\Z]COA[Z#\'82_VY$L -M^YWP=U#^#L+?89/2ZMCOA+^#\G<0_@Z;_%W'?B?\'92_@_!WV.3O.O8[X>^@ -M_!V$O]N1+/N=\'=0_@["WV&3TNJS4#OA[Z#\'82_PR9_U[/?"7\'Y>\@_!TV -M^;N>_4[X.RA_!^'O=B3+?B?\'92_@_!WV*2T>O8[X>^@_!V$O\,F?]>SWPE_ -M!^7O(/P=-OF[GOU.^#LH?P?A[W8DRWXG_!V4OX/P=]BDM'KV.^'OH/P=A+_# -M)G_7L]\)?P?E[R#\'3;YNY[]3O@[*'\'X>]V),M^)_P=E+^#\'?8I+1Z]COA -M[Z#\'82_PR9_U[/?"7\'Y>\@_!TV^;N>_4[X.RA_!^'O=B3+?B?\'92_BV(Z -MR'.!<\MO@!NRI79/2LJ?^*=8._?DZ@9K?>`X[@7,GT[7[W%,%]FSR_CR]6'6 -M+\:9QU+U7P>XP!G7#W'^+F6ZC_M2?27B_)W'B_25B/-W'B_25R+.WWF\2%^) -M.'\WT5+\W41? -MB3A_-]%7(L[?3?25B/-W$WTEXOS=1%^).'\WT5+\W41?B3A_-]%7(L[?3?25B/-W$WTEXOS= -M1%^).'\WT5#\W49?"<[?;?25X/S= -M1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U& -M7PG.WVWTE>#\W49?"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49? -M"<[?;?25X/S=1E\)SM]M])7@_-U&7PG.WVWTE>#\W49?"<[?;?25X/S=1E\) -MSM]M])7@_-U&7PG.WVWTE>#\W49?B3A_I^>+])6(\W=ZODA?B3A_I^>+])6( -M\W=ZODA?B3A_-]%7(L[?3?25B/-W$WTEXOS=1%^).'\WT5+\W41?B3A_-]%7(L[?3?25B/-W -M$WTEXOS=1%^).'\WT5+\W41?B3A_-]%7(L[?3?25B/-W$WTEXOS=1%\)SM]M])483/65&$SU -ME1A,]9483/65&$SUE1A,]9483/65&$SUE1A,]9483/65&$SUE1A,]9483/65 -M&$SUE1A,]948L\Q07XG15%^)T51?B=%47XG15%^)T51?B=%47XG15%^)T51? -MB=%47XG15%^)T51?B=%47XG15%^)T51?B=%47WG,LLQ07WE\=*_CG7"/DUWT -M@4>8ZBN/QV>7\>7K*^;Z+7=7??QW^H6[[P[K/Q$0[9N/Z[=_?Y2A+=SX_`OP;US?O;U'Z^S$7S7QS -M7MZ9MRPBW)Q[V>GZOO_A1_?ZVS?O/-@_[M.=;^\\=J[IW5!YB/7J\$RZ[QY? -M'<5\>^?'U29BOO1.X,5\>V>-4O6MJTM7 -M'_W]>_N'=YZ]!WJ_@CL9GWGSG6?;DZLZ?__@$JZ;;_;KI,EG^YW=T -MQ]XK$2JXH[\C\^'N^J^'ZP7L#X?__#ZL;[GS+)X^TB^DJE<O[[2EN:5:\))\M31_J%9/7.2_42GVK3HIZZ="',[PZ/)SIU>$!#:\.#V=X -M=7@XPZO#PYE>'86_8:3=A[B'\^=>/]6\\??P+]=G3?KC>%K?3V_GA7VS2G?F -M'),?_<]\B#^]&8/AA[B'>_9#?!S2R8:?!\D:?HA[.-,/\<+?O3/[ZO]>I(A+ -$M&4````` +M'XL("..7?5P``VEM9RTV,W@R-34M-3$R+6=P="YV;61K+F]U=`"M7%V/W,81 +M?/>OF)P?'"3(@K4DE\L'`;%S,F`D`13;25[R$'[&A]B289E>>7`8W_=-RN"R_-Z;C>.8' +MES]>__EO!_[Z]>%P^6P!@X^2$&0*)\;J>RZ'![\(=WPN:O7!=!PWX7(?U3X* +M#'#'Q`=)N&+Z\/A4"%?7S!_W_HW`N0CD5G#E$SDEDWUN=;_Y+!3/KR_W:YBV +M]U2[*G>G-ICN5,YV[JKC_%GFJLEIG``_=]W-^[MW87U'O[>3 +MOP'2/ +M?F^+W!6U7X[WS^Z/E>&_)',G^.]PES]\<_TJG+G9X7US2S@?-2UD^NXI#\4] +MG9S_\_B85S>\O?.(8_@55^?W-A2GG+^[\&_*PE6UFY=3>NSC]'$?4IYKU]T. +MS=WP_^M+5L]`Y[E0N2MS#Q52\^4K/:(_;>9=$._G:31MX#NM:LIY"3LF=G99]>?WSW92OZ\/.WA!N7L2< +MQ/3=Y=&5E<>:-G#>BJ/+"_]N^J=IP5,F!;R3N[Q[>_CV[],E[HOUW9LOOR7< +M>8J:/*<%3B%30JN>=E'S";1_\F +M5&V!]TVL\!_,.^NNF[O&?=5\&`Z?7U]_%7>V\7\WW/KMC5O1^A+U(5._K<7]-JZ_IYIW:O1GC+N\;KB[_7CH/OYX +M\[:?+C3WBG#]4KMI.7D6%A77]'!1\6NGVEUE]TN;L`DW^!(MBSJ'"V/"6M9Q +M7P5_QI3^"%6X?#S\,#3]M"QW=2S+J[@5X\.MT!(]J,*RT5,MEJT("_MX^#!T +M`2[/P@:.J^(L:W+YR>5Y6-&Z@=Z]NYV7=LJOM!_G#^]E+^W'Q:-;:O4+`1RTSG4CIZY1A5B +ME"NX5.WJ4#MZ5AIU%J->P:5JUX3:T;/5J$Z,?E>R;:@=/4>-\B]L$)#W:;@N +MU(Z>N4858I0KN%3M^E`[>E8:=1:C7L&E:C>$VM&SU:A.C'Y7LF.H'3U'C?(O +MA=2NV(*KLE`[>N8:58A1KN`2M:O8[^A9:=19C'H%EZA=Q7Y'SU:C.C'Z7IW6D3COV.GKE&%6*4*[A4[=COZ%EIU%F,>@67JAW['3U; +MC>K$Z'9^$.V>A=O3,-:H0HUS!)6IW9K^C9Z51 +M9S'J%5RB=F?V.WJV&M6)T>]*EOV.GJ-&^9=::E=OPK'?T3/7J$*,<@67JAW[ +M'3TKC3J+4:_@4K5COZ-GJU&=&/VN9-GOZ#EJE'_A?Z$@[]-P['?TS#6J$*-< +MP:5JQWY'STJCSF+4*[A4[=COZ-EJ5"=&ORM9]CMZCAKE7\@_0MZGX=COZ)EK +M5"%&N8)+U8[]CIZ51IW%J%=PJ=JQW]&SU:A.C'Y7LNQW]!PURK]T4KMN"Z[. +M0NWHF6M4(4:Y@DO4KF:_HV>E46E4:=Q:A7<*G:L=_1L]6H3HQ^5[+L=_0< +M-N4858I0KN%3MV._H66G468QZ!9>J'?L=/5N-ZL3H=R7+ +M?D?/4:/\RRBU&S?AV._HF6M4(4:Y@DO5COV.GI5&G<6H5W"IVK'?T;/5J$Z, +M?E>R['?T'#4JD^D9Y'T2KLF6VD7/7*,*,AWT;/2J+,8]0HN4;LF +M]+OHV6I4)T:_*]G0[Z+GJ%&^9,+?89/2:D*_@_!W4/X.PM]AD[]K0K^#\'=0 +M_@["WV&3OVM"OX/P=U#^#L+?[4@V]#L(?P?E[R#\'38IK2;T.PA_!^7O(/P= +M-OF[)O0["'\'Y>\@_!TV^;LF]#L(?P?E[R#\W8YD0[^#\'=0_@["WV&3TFI" +MOX/P=U#^#L+?89._:T*_@_!W4/X.PM]AD[]K0K^#\'=0_@["W^U(-O0["'\' +MY>\@_!TV*:TV"[43_@[*WT'X.VSR=RW[G?!W4/X.PM]AD[]KV>^$OX/R=Q#^ +M;D>R['?"WT'Y.PA_ATU*JV6_$_X.RM]!^#ML\G^$OX/R=Q#^;D>R['?"WT'Y.PA_ATU*J\M"[82_@_)W +M$/X.F_Q=QWXG_!V4OX/P=]CD[SKV.^'OH/P=A+_;D2S[G?!W4/X.PM]AD]+J +MV.^$OX/R=Q#^#IO\7<=^)_P=E+^#\'?8Y.\Z]COA[Z#\'82_VY$L^YWP=U#^ +M#L+?89/2ZMCOA+^#\G<0_@Z;_%W'?B?\'92_@_!WV.3O.O8[X>^@_!V$O]N1 +M+/N=\'=0_@["WV&3TNK8[X2_@_)W$/X.F_Q=QWXG_!V4OX/P=]CD[SKV.^'O +MH/P=A+_;D2S[G?!W4/X.PM]AD]+JLU`[X>^@_!V$O\,F?]>SWPE_!^7O(/P= +M-OF[GOU.^#LH?P?A[W8DRWXG_!V4OX/P=]BDM'KV.^'OH/P=A+_#)G_7L]\) +M?P?E[R#\'3;YNY[]3O@[*'\'X>]V),M^)_P=E+^#\'?8I+1Z]COA[Z#\'82_ +MPR9_U[/?"7\'Y>\@_!TV^;N>_4[X.RA_!^'O=B3+?B?\'92_@_!WV*2T>O8[ +MX>^@_!V$O\,F?]>SWPE_!^7O(/P=-OF[GOU.^#LH?P?A[W8DRWXG_!V4OXMB +M.LA[@7/+GP`W9$OMGI24/_%/L7;NR=4-UOK`<=P+F#^=KM_CF"ZR9Y?QZ>O# +MK%^,,X^EZK\,<($SKA_B_%W*=!_WJ?I*Q/D[CQ?I*Q'G[SQ>I*]$G+_S>)&^ +M$G'^;J*O1)R_F^@K$>?O)OI*Q/F[B;X2?O)OI*Q/F[ +MB;X2?O)OI*Q/F[B;X2G+_;Z"O!^;N-OA*?O]'R1OA)Q_D[/%^DK +M$>?O]'R1OA)Q_FZBKT2?O +M)OI*Q/F[B;X2?O)OI*Q/F[B;X2[ +MZ`./,-57'H_/+N/3UU?,]5N>KOKX[_0'EZ\.Z]\1$.VG`7*%:S@F7,!?&XO6 +M:QC<.(9C4<[Q#!K=L4HG_,5!X'KC^NW?W^4H2]?/GM]Q[L'_?ISH]W+CK_M-6N\D\67J\.J73_ +M]/'P\^.KHY@?[_RXVH3+4W#+%CR&\[?OL7\&[JDC#5<\%_6I3P(OYL<[1[77 +M=*CZ=MZCT@V-&]L$W.O7:[B3\9DW/WFV/;FJ\\\/+N&Z^6'/_JI(_U!LGK-4KW$76U:U%.7[@3'N]JOUG"M'AS.\.CR'5X +M.,.KP\,97AT>SO3J*/P#(^UNXAYN_C_XZ/]W5DTW\7&]C.3M^/+N\+]E85^L +MTITYQ^2M_YF;^-.;,1C>Q#W)&MX$_=PIC?QPC^],_OL_UV9 +&Q(:T90`` ` end From 91c3fda00badedb7d144fc41757f93f95a54ca92 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 5 Mar 2019 23:56:40 +0000 Subject: [PATCH 14/93] Add pmap_get_tables() for riscv. This mirrors the arm64 implementation and is for use in the minidump code. Submitted by: Mitchell Horne Differential Revision: https://reviews.freebsd.org/D18321 --- sys/riscv/riscv/pmap.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c index d25224f75e79..a4e5bb29da7f 100644 --- a/sys/riscv/riscv/pmap.c +++ b/sys/riscv/riscv/pmap.c @@ -4438,3 +4438,40 @@ pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode) return (mode >= VM_MEMATTR_DEVICE && mode <= VM_MEMATTR_WRITE_BACK); } + +bool +pmap_get_tables(pmap_t pmap, vm_offset_t va, pd_entry_t **l1, pd_entry_t **l2, + pt_entry_t **l3) +{ + pd_entry_t *l1p, *l2p; + + /* Get l1 directory entry. */ + l1p = pmap_l1(pmap, va); + *l1 = l1p; + + if (l1p == NULL || (pmap_load(l1p) & PTE_V) == 0) + return (false); + + if ((pmap_load(l1p) & PTE_RX) != 0) { + *l2 = NULL; + *l3 = NULL; + return (true); + } + + /* Get l2 directory entry. */ + l2p = pmap_l1_to_l2(l1p, va); + *l2 = l2p; + + if (l2p == NULL || (pmap_load(l2p) & PTE_V) == 0) + return (false); + + if ((pmap_load(l2p) & PTE_RX) != 0) { + *l3 = NULL; + return (true); + } + + /* Get l3 page table entry. */ + *l3 = pmap_l2_to_l3(l2p, va); + + return (true); +} From 3a3dfb281537a228c3a13f1466e3dd0b0d9b5610 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 5 Mar 2019 23:58:16 +0000 Subject: [PATCH 15/93] Initialize dump_avail[] on riscv. Submitted by: Mitchell Horne Differential Revision: https://reviews.freebsd.org/D19170 --- sys/riscv/riscv/pmap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c index a4e5bb29da7f..38315490784b 100644 --- a/sys/riscv/riscv/pmap.c +++ b/sys/riscv/riscv/pmap.c @@ -628,7 +628,7 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen) pa = pmap_early_vtophys(l1pt, freemempos); - /* Initialize phys_avail. */ + /* Initialize phys_avail and dump_avail. */ for (avail_slot = map_slot = physmem = 0; map_slot < physmap_idx * 2; map_slot += 2) { start = physmap[map_slot]; @@ -636,6 +636,9 @@ pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen) if (start == end) continue; + dump_avail[map_slot] = start; + dump_avail[map_slot + 1] = end; + if (start >= kernstart && end <= pa) continue; From 5e58ed820a0391e766c1a365735b81a52bbf9af5 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Tue, 5 Mar 2019 23:59:55 +0000 Subject: [PATCH 16/93] Add riscv minidump support to libkvm. Submitted by: Mitchell Horne Differential Revision: https://reviews.freebsd.org/D19171 --- lib/libkvm/Makefile | 1 + lib/libkvm/kvm_minidump_riscv.c | 288 ++++++++++++++++++++++++++++++++ lib/libkvm/kvm_riscv.h | 90 ++++++++++ 3 files changed, 379 insertions(+) create mode 100644 lib/libkvm/kvm_minidump_riscv.c create mode 100644 lib/libkvm/kvm_riscv.h diff --git a/lib/libkvm/Makefile b/lib/libkvm/Makefile index 8520a02d7b22..d934690d4355 100644 --- a/lib/libkvm/Makefile +++ b/lib/libkvm/Makefile @@ -18,6 +18,7 @@ SRCS= kvm.c kvm_cptime.c kvm_getloadavg.c \ kvm_i386.c kvm_minidump_i386.c \ kvm_minidump_mips.c \ kvm_powerpc.c kvm_powerpc64.c \ + kvm_minidump_riscv.c \ kvm_sparc64.c INCS= kvm.h diff --git a/lib/libkvm/kvm_minidump_riscv.c b/lib/libkvm/kvm_minidump_riscv.c new file mode 100644 index 000000000000..ffe83b8f99cc --- /dev/null +++ b/lib/libkvm/kvm_minidump_riscv.c @@ -0,0 +1,288 @@ +/*- + * Copyright (c) 2006 Peter Wemm + * Copyright (c) 2019 Mitchell Horne + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From: FreeBSD: src/lib/libkvm/kvm_minidump_amd64.c r261799 + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * RISC-V machine dependent routines for kvm and minidumps. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "../../sys/riscv/include/minidump.h" + +#include + +#include "kvm_private.h" +#include "kvm_riscv.h" + +#define riscv_round_page(x) roundup2((kvaddr_t)(x), RISCV_PAGE_SIZE) + +struct vmstate { + struct minidumphdr hdr; +}; + +static riscv_pt_entry_t +_riscv_pte_get(kvm_t *kd, u_long pteindex) +{ + riscv_pt_entry_t *pte = _kvm_pmap_get(kd, pteindex, sizeof(*pte)); + + return le64toh(*pte); +} + +static int +_riscv_minidump_probe(kvm_t *kd) +{ + + return (_kvm_probe_elf_kernel(kd, ELFCLASS64, EM_RISCV) && + _kvm_is_minidump(kd)); +} + +static void +_riscv_minidump_freevtop(kvm_t *kd) +{ + struct vmstate *vm = kd->vmst; + + free(vm); + kd->vmst = NULL; +} + +static int +_riscv_minidump_initvtop(kvm_t *kd) +{ + struct vmstate *vmst; + off_t off, sparse_off; + + vmst = _kvm_malloc(kd, sizeof(*vmst)); + if (vmst == NULL) { + _kvm_err(kd, kd->program, "cannot allocate vm"); + return (-1); + } + kd->vmst = vmst; + if (pread(kd->pmfd, &vmst->hdr, sizeof(vmst->hdr), 0) != + sizeof(vmst->hdr)) { + _kvm_err(kd, kd->program, "cannot read dump header"); + return (-1); + } + if (strncmp(MINIDUMP_MAGIC, vmst->hdr.magic, + sizeof(vmst->hdr.magic)) != 0) { + _kvm_err(kd, kd->program, "not a minidump for this platform"); + return (-1); + } + + vmst->hdr.version = le32toh(vmst->hdr.version); + if (vmst->hdr.version != MINIDUMP_VERSION) { + _kvm_err(kd, kd->program, "wrong minidump version. " + "Expected %d got %d", MINIDUMP_VERSION, vmst->hdr.version); + return (-1); + } + vmst->hdr.msgbufsize = le32toh(vmst->hdr.msgbufsize); + vmst->hdr.bitmapsize = le32toh(vmst->hdr.bitmapsize); + vmst->hdr.pmapsize = le32toh(vmst->hdr.pmapsize); + vmst->hdr.kernbase = le64toh(vmst->hdr.kernbase); + vmst->hdr.dmapphys = le64toh(vmst->hdr.dmapphys); + vmst->hdr.dmapbase = le64toh(vmst->hdr.dmapbase); + vmst->hdr.dmapend = le64toh(vmst->hdr.dmapend); + + /* Skip header and msgbuf */ + off = RISCV_PAGE_SIZE + riscv_round_page(vmst->hdr.msgbufsize); + + /* build physical address lookup table for sparse pages */ + sparse_off = off + riscv_round_page(vmst->hdr.bitmapsize) + + riscv_round_page(vmst->hdr.pmapsize); + if (_kvm_pt_init(kd, vmst->hdr.bitmapsize, off, sparse_off, + RISCV_PAGE_SIZE, sizeof(uint64_t)) == -1) { + return (-1); + } + off += riscv_round_page(vmst->hdr.bitmapsize); + + if (_kvm_pmap_init(kd, vmst->hdr.pmapsize, off) == -1) { + return (-1); + } + off += riscv_round_page(vmst->hdr.pmapsize); + + return (0); +} + +static int +_riscv_minidump_vatop(kvm_t *kd, kvaddr_t va, off_t *pa) +{ + struct vmstate *vm; + riscv_physaddr_t offset; + riscv_pt_entry_t l3; + kvaddr_t l3_index; + riscv_physaddr_t a; + off_t ofs; + + vm = kd->vmst; + offset = va & RISCV_PAGE_MASK; + + if (va >= vm->hdr.dmapbase && va < vm->hdr.dmapend) { + a = (va - vm->hdr.dmapbase + vm->hdr.dmapphys) & + ~RISCV_PAGE_MASK; + ofs = _kvm_pt_find(kd, a, RISCV_PAGE_SIZE); + if (ofs == -1) { + _kvm_err(kd, kd->program, "_riscv_minidump_vatop: " + "direct map address 0x%jx not in minidump", + (uintmax_t)va); + goto invalid; + } + *pa = ofs + offset; + return (RISCV_PAGE_SIZE - offset); + } else if (va >= vm->hdr.kernbase) { + l3_index = (va - vm->hdr.kernbase) >> RISCV_L3_SHIFT; + if (l3_index >= vm->hdr.pmapsize / sizeof(l3)) + goto invalid; + l3 = _riscv_pte_get(kd, l3_index); + if ((l3 & RISCV_PTE_V) == 0 || (l3 & RISCV_PTE_RWX) == 0) { + _kvm_err(kd, kd->program, + "_riscv_minidump_vatop: pte not valid"); + goto invalid; + } + a = (l3 >> RISCV_PTE_PPN0_S) << RISCV_L3_SHIFT; + ofs = _kvm_pt_find(kd, a, RISCV_PAGE_SIZE); + if (ofs == -1) { + _kvm_err(kd, kd->program, "_riscv_minidump_vatop: " + "physical address 0x%jx not in minidump", + (uintmax_t)a); + goto invalid; + } + *pa = ofs + offset; + return (RISCV_PAGE_SIZE - offset); + } else { + _kvm_err(kd, kd->program, + "_riscv_minidump_vatop: virtual address 0x%jx not minidumped", + (uintmax_t)va); + goto invalid; + } + +invalid: + _kvm_err(kd, 0, "invalid address (0x%jx)", (uintmax_t)va); + return (0); +} + +static int +_riscv_minidump_kvatop(kvm_t *kd, kvaddr_t va, off_t *pa) +{ + + if (ISALIVE(kd)) { + _kvm_err(kd, 0, + "_riscv_minidump_kvatop called in live kernel!"); + return (0); + } + return (_riscv_minidump_vatop(kd, va, pa)); +} + +static int +_riscv_native(kvm_t *kd __unused) +{ + +#ifdef __riscv + return (1); +#else + return (0); +#endif +} + +static vm_prot_t +_riscv_entry_to_prot(riscv_pt_entry_t pte) +{ + vm_prot_t prot = VM_PROT_READ; + + if ((pte & RISCV_PTE_W) != 0) + prot |= VM_PROT_WRITE; + if ((pte & RISCV_PTE_X) != 0) + prot |= VM_PROT_EXECUTE; + return prot; +} + +static int +_riscv_minidump_walk_pages(kvm_t *kd, kvm_walk_pages_cb_t *cb, void *arg) +{ + struct vmstate *vm = kd->vmst; + u_long nptes = vm->hdr.pmapsize / sizeof(riscv_pt_entry_t); + u_long bmindex, dva, pa, pteindex, va; + struct kvm_bitmap bm; + vm_prot_t prot; + int ret = 0; + + if (!_kvm_bitmap_init(&bm, vm->hdr.bitmapsize, &bmindex)) + return (0); + + for (pteindex = 0; pteindex < nptes; pteindex++) { + riscv_pt_entry_t pte = _riscv_pte_get(kd, pteindex); + + if (((pte & RISCV_PTE_V) == 0) || + ((pte & RISCV_PTE_RWX) == 0)) + continue; + + va = vm->hdr.kernbase + (pteindex << RISCV_L3_SHIFT); + pa = (pte >> RISCV_PTE_PPN0_S) << RISCV_L3_SHIFT; + dva = vm->hdr.dmapbase + pa; + if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, + _riscv_entry_to_prot(pte), RISCV_PAGE_SIZE, 0)) { + goto out; + } + } + + while (_kvm_bitmap_next(&bm, &bmindex)) { + pa = bmindex * RISCV_PAGE_SIZE; + dva = vm->hdr.dmapbase + pa; + if (vm->hdr.dmapend < (dva + RISCV_PAGE_SIZE)) + break; + va = 0; + prot = VM_PROT_READ | VM_PROT_WRITE; + if (!_kvm_visit_cb(kd, cb, arg, pa, va, dva, + prot, RISCV_PAGE_SIZE, 0)) { + goto out; + } + } + ret = 1; + +out: + _kvm_bitmap_deinit(&bm); + return (ret); +} + +static struct kvm_arch kvm_riscv_minidump = { + .ka_probe = _riscv_minidump_probe, + .ka_initvtop = _riscv_minidump_initvtop, + .ka_freevtop = _riscv_minidump_freevtop, + .ka_kvatop = _riscv_minidump_kvatop, + .ka_native = _riscv_native, + .ka_walk_pages = _riscv_minidump_walk_pages, +}; + +KVM_ARCH(kvm_riscv_minidump); diff --git a/lib/libkvm/kvm_riscv.h b/lib/libkvm/kvm_riscv.h new file mode 100644 index 000000000000..f1021f448dc0 --- /dev/null +++ b/lib/libkvm/kvm_riscv.h @@ -0,0 +1,90 @@ +/*- + * Copyright (c) 2015 John H. Baldwin + * Copyright (c) 2019 Mitchell Horne + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef __KVM_RISCV_H__ +#define __KVM_RISCV_H__ + +#ifdef __riscv +#include +#endif + +typedef uint64_t riscv_physaddr_t; +typedef uint64_t riscv_pt_entry_t; + +#define RISCV_PAGE_SHIFT 12 +#define RISCV_PAGE_SIZE (1 << RISCV_PAGE_SHIFT) +#define RISCV_PAGE_MASK (RISCV_PAGE_SIZE - 1) + +/* Source: sys/riscv/include/pte.h */ +#define RISCV_L3_SHIFT 12 +#define RISCV_L3_SIZE (1 << L3_SHIFT) +#define RISCV_L3_OFFSET (L3_SIZE - 1) + +#define RISCV_PTE_SW_MANAGED (1 << 9) +#define RISCV_PTE_SW_WIRED (1 << 8) +#define RISCV_PTE_D (1 << 7) /* Dirty */ +#define RISCV_PTE_A (1 << 6) /* Accessed */ +#define RISCV_PTE_G (1 << 5) /* Global */ +#define RISCV_PTE_U (1 << 4) /* User */ +#define RISCV_PTE_X (1 << 3) /* Execute */ +#define RISCV_PTE_W (1 << 2) /* Write */ +#define RISCV_PTE_R (1 << 1) /* Read */ +#define RISCV_PTE_V (1 << 0) /* Valid */ +#define RISCV_PTE_RWX (RISCV_PTE_R | RISCV_PTE_W | RISCV_PTE_X) + +#define RISCV_PTE_PPN0_S 10 + +#ifdef __riscv +_Static_assert(sizeof(pt_entry_t) == sizeof(riscv_pt_entry_t), + "pt_entry_t size mismatch"); + +_Static_assert(PAGE_SHIFT == RISCV_PAGE_SHIFT, "PAGE_SHIFT mismatch"); +_Static_assert(PAGE_SIZE == RISCV_PAGE_SIZE, "PAGE_SIZE mismatch"); +_Static_assert(PAGE_MASK == RISCV_PAGE_MASK, "PAGE_MASK mismatch"); + +_Static_assert(L3_SHIFT == RISCV_L3_SHIFT, "L3_SHIFT mismatch"); +_Static_assert(L3_SIZE == RISCV_L3_SIZE, "L3_SIZE mismatch"); +_Static_assert(L3_OFFSET == RISCV_L3_OFFSET, "L3_OFFSET mismatch"); +_Static_assert(PTE_PPN0_S == RISCV_PTE_PPN0_S, "PTE_PPN0_S mismatch"); + +_Static_assert(PTE_SW_MANAGED == RISCV_PTE_SW_MANAGED, + "PTE_SW_MANAGED mismatch"); +_Static_assert(PTE_SW_WIRED == RISCV_PTE_SW_WIRED, "PTE_SW_WIRED mismatch"); +_Static_assert(PTE_D == RISCV_PTE_D, "PTE_D mismatch"); +_Static_assert(PTE_A == RISCV_PTE_A, "PTE_A mismatch"); +_Static_assert(PTE_G == RISCV_PTE_G, "PTE_G mismatch"); +_Static_assert(PTE_U == RISCV_PTE_U, "PTE_U mismatch"); +_Static_assert(PTE_X == RISCV_PTE_X, "PTE_X mismatch"); +_Static_assert(PTE_W == RISCV_PTE_W, "PTE_W mismatch"); +_Static_assert(PTE_R == RISCV_PTE_R, "PTE_R mismatch"); +_Static_assert(PTE_V == RISCV_PTE_V, "PTE_V mismatch"); +_Static_assert(PTE_RWX == RISCV_PTE_RWX, "PTE_RWX mismatch"); +#endif + +#endif /* !__KVM_RISCV_H__ */ From 3b5b20292b466eed14001b1a089f0f304cae6c2c Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Wed, 6 Mar 2019 00:01:06 +0000 Subject: [PATCH 17/93] Implement minidump support for RISC-V. Submitted by: Mitchell Horne Differential Revision: https://reviews.freebsd.org/D18320 --- sys/riscv/riscv/minidump_machdep.c | 376 ++++++++++++++++++++++++++++- sys/riscv/riscv/pmap.c | 4 - sys/riscv/riscv/uma_machdep.c | 6 - sys/vm/vm_page.c | 8 +- 4 files changed, 380 insertions(+), 14 deletions(-) diff --git a/sys/riscv/riscv/minidump_machdep.c b/sys/riscv/riscv/minidump_machdep.c index 7c92f7551145..42f166b53d60 100644 --- a/sys/riscv/riscv/minidump_machdep.c +++ b/sys/riscv/riscv/minidump_machdep.c @@ -1,5 +1,7 @@ /*- * Copyright (c) 2006 Peter Wemm + * Copyright (c) 2015 The FreeBSD Foundation + * Copyright (c) 2019 Mitchell Horne * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,9 +55,381 @@ __FBSDID("$FreeBSD$"); CTASSERT(sizeof(struct kerneldumpheader) == 512); CTASSERT(sizeof(*vm_page_dump) == 8); +uint64_t *vm_page_dump; +int vm_page_dump_size; + +static struct kerneldumpheader kdh; + +/* Handle chunked writes. */ +static size_t fragsz; +static void *dump_va; +static size_t counter, progress, dumpsize; + +static uint64_t tmpbuffer[PAGE_SIZE / sizeof(uint64_t)]; + +static struct { + int min_per; + int max_per; + int visited; +} progress_track[10] = { + { 0, 10, 0}, + { 10, 20, 0}, + { 20, 30, 0}, + { 30, 40, 0}, + { 40, 50, 0}, + { 50, 60, 0}, + { 60, 70, 0}, + { 70, 80, 0}, + { 80, 90, 0}, + { 90, 100, 0} +}; + +static void +report_progress(size_t progress, size_t dumpsize) +{ + int sofar, i; + + sofar = 100 - ((progress * 100) / dumpsize); + for (i = 0; i < nitems(progress_track); i++) { + if (sofar < progress_track[i].min_per || + sofar > progress_track[i].max_per) + continue; + if (progress_track[i].visited) + return; + progress_track[i].visited = 1; + printf("..%d%%", sofar); + return; + } +} + +static bool +is_dumpable(vm_paddr_t pa) +{ + vm_page_t m; + int i; + + if ((m = vm_phys_paddr_to_vm_page(pa)) != NULL) + return ((m->flags & PG_NODUMP) == 0); + + for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { + if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) + return (true); + } + return (false); +} + +static int +blk_flush(struct dumperinfo *di) +{ + int error; + + if (fragsz == 0) + return (0); + + error = dump_append(di, dump_va, 0, fragsz); + fragsz = 0; + return (error); +} + +/* + * Write a block of data to the dump file. + * + * Caller can provide data through a pointer or by specifying its + * physical address. + * + * XXX writes using pa should be no larger than PAGE_SIZE. + */ +static int +blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz) +{ + size_t len; + int error, c; + u_int maxdumpsz; + + maxdumpsz = min(di->maxiosize, MAXDUMPPGS * PAGE_SIZE); + if (maxdumpsz == 0) /* seatbelt */ + maxdumpsz = PAGE_SIZE; + error = 0; + if ((sz % PAGE_SIZE) != 0) { + printf("size not page aligned\n"); + return (EINVAL); + } + if (ptr != NULL && pa != 0) { + printf("cant have both va and pa!\n"); + return (EINVAL); + } + if ((((uintptr_t)pa) % PAGE_SIZE) != 0) { + printf("address not page aligned %#lx\n", (uintptr_t)pa); + return (EINVAL); + } + if (ptr != NULL) { + /* + * If we're doing a virtual dump, flush any + * pre-existing pa pages. + */ + error = blk_flush(di); + if (error != 0) + return (error); + } + while (sz) { + len = maxdumpsz - fragsz; + if (len > sz) + len = sz; + counter += len; + progress -= len; + if (counter >> 22) { + report_progress(progress, dumpsize); + counter &= (1 << 22) - 1; + } + + wdog_kern_pat(WD_LASTVAL); + + if (ptr) { + error = dump_append(di, ptr, 0, len); + if (error != 0) + return (error); + ptr += len; + sz -= len; + } else { + dump_va = (void *)PHYS_TO_DMAP(pa); + fragsz += len; + pa += len; + sz -= len; + error = blk_flush(di); + if (error != 0) + return (error); + } + + /* Check for user abort */ + c = cncheckc(); + if (c == 0x03) + return (ECANCELED); + if (c != -1) + printf(" (CTRL-C to abort) "); + } + + return (0); +} + int minidumpsys(struct dumperinfo *di) { + pd_entry_t *l1, *l2; + pt_entry_t *l3; + struct minidumphdr mdhdr; + uint32_t pmapsize; + vm_offset_t va; + vm_paddr_t pa; + int error; + uint64_t bits; + int i, bit; + int retry_count; - panic("minidumpsys"); + retry_count = 0; +retry: + retry_count++; + error = 0; + pmapsize = 0; + + /* Build set of dumpable pages from kernel pmap */ + for (va = VM_MIN_KERNEL_ADDRESS; va < kernel_vm_end; va += L2_SIZE) { + pmapsize += PAGE_SIZE; + if (!pmap_get_tables(pmap_kernel(), va, &l1, &l2, &l3)) + continue; + + /* We should always be using the l2 table for kvm */ + if (l2 == NULL) + continue; + + /* l2 may be a superpage */ + if ((*l2 & PTE_RWX) != 0) { + pa = (*l2 >> PTE_PPN1_S) << L2_SHIFT; + for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { + if (is_dumpable(pa)) + dump_add_page(pa); + } + } else { + for (i = 0; i < Ln_ENTRIES; i++) { + if ((l3[i] & PTE_V) == 0) + continue; + pa = (l3[i] >> PTE_PPN0_S) * PAGE_SIZE; + if (is_dumpable(pa)) + dump_add_page(pa); + } + } + } + + /* Calculate dump size */ + dumpsize = pmapsize; + dumpsize += round_page(msgbufp->msg_size); + dumpsize += round_page(vm_page_dump_size); + for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { + bits = vm_page_dump[i]; + while (bits) { + bit = ffsl(bits) - 1; + pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + + bit) * PAGE_SIZE; + /* Clear out undumpable pages now if needed */ + if (is_dumpable(pa)) + dumpsize += PAGE_SIZE; + else + dump_drop_page(pa); + bits &= ~(1ul << bit); + } + } + dumpsize += PAGE_SIZE; + + progress = dumpsize; + + /* Initialize mdhdr */ + bzero(&mdhdr, sizeof(mdhdr)); + strcpy(mdhdr.magic, MINIDUMP_MAGIC); + mdhdr.version = MINIDUMP_VERSION; + mdhdr.msgbufsize = msgbufp->msg_size; + mdhdr.bitmapsize = vm_page_dump_size; + mdhdr.pmapsize = pmapsize; + mdhdr.kernbase = KERNBASE; + mdhdr.dmapphys = DMAP_MIN_PHYSADDR; + mdhdr.dmapbase = DMAP_MIN_ADDRESS; + mdhdr.dmapend = DMAP_MAX_ADDRESS; + + dump_init_header(di, &kdh, KERNELDUMPMAGIC, KERNELDUMP_RISCV_VERSION, + dumpsize); + + error = dump_start(di, &kdh); + if (error != 0) + goto fail; + + printf("Dumping %llu out of %ju MB:", (long long)dumpsize >> 20, + ptoa((uintmax_t)physmem) / 1048576); + + /* Dump minidump header */ + bzero(&tmpbuffer, sizeof(tmpbuffer)); + bcopy(&mdhdr, &tmpbuffer, sizeof(mdhdr)); + error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); + if (error) + goto fail; + + /* Dump msgbuf up front */ + error = blk_write(di, (char *)msgbufp->msg_ptr, 0, + round_page(msgbufp->msg_size)); + if (error) + goto fail; + + /* Dump bitmap */ + error = blk_write(di, (char *)vm_page_dump, 0, + round_page(vm_page_dump_size)); + if (error) + goto fail; + + /* Dump kernel page directory pages */ + bzero(&tmpbuffer, sizeof(tmpbuffer)); + for (va = VM_MIN_KERNEL_ADDRESS; va < kernel_vm_end; va += L2_SIZE) { + if (!pmap_get_tables(pmap_kernel(), va, &l1, &l2, &l3)) { + /* We always write a page, even if it is zero */ + error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); + if (error) + goto fail; + /* Flush, in case we reuse tmpbuffer in the same block */ + error = blk_flush(di); + if (error) + goto fail; + } else if ((*l2 & PTE_RWX) != 0) { + /* Generate fake l3 entries based on the l2 superpage */ + for (i = 0; i < Ln_ENTRIES; i++) { + tmpbuffer[i] = (*l2 | (i << PTE_PPN0_S)); + } + /* We always write a page, even if it is zero */ + error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); + if (error) + goto fail; + /* Flush, in case we reuse tmpbuffer in the same block */ + error = blk_flush(di); + if (error) + goto fail; + bzero(&tmpbuffer, sizeof(tmpbuffer)); + } else { + pa = (*l2 >> PTE_PPN0_S) * PAGE_SIZE; + + /* We always write a page, even if it is zero */ + error = blk_write(di, NULL, pa, PAGE_SIZE); + if (error) + goto fail; + } + } + + /* Dump memory chunks */ + /* XXX cluster it up and use blk_dump() */ + for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { + bits = vm_page_dump[i]; + while (bits) { + bit = ffsl(bits) - 1; + pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + + bit) * PAGE_SIZE; + error = blk_write(di, 0, pa, PAGE_SIZE); + if (error) + goto fail; + bits &= ~(1ul << bit); + } + } + + error = blk_flush(di); + if (error) + goto fail; + + error = dump_finish(di, &kdh); + if (error != 0) + goto fail; + + printf("\nDump complete\n"); + return (0); + +fail: + if (error < 0) + error = -error; + + printf("\n"); + if (error == ENOSPC) { + printf("Dump map grown while dumping. "); + if (retry_count < 5) { + printf("Retrying...\n"); + goto retry; + } + printf("Dump failed.\n"); + } + else if (error == ECANCELED) + printf("Dump aborted\n"); + else if (error == E2BIG) + printf("Dump failed. Partition too small.\n"); + else + printf("** DUMP FAILED (ERROR %d) **\n", error); + return (error); +} + +/* + * Add a page to the minidump bitmap. + */ +void +dump_add_page(vm_paddr_t pa) +{ + int idx, bit; + + pa >>= PAGE_SHIFT; + idx = pa >> 6; /* 2^6 = 64 */ + bit = pa & 63; + atomic_set_long(&vm_page_dump[idx], 1ul << bit); +} + +/* + * Remove page from the minidump bitmap. + */ +void +dump_drop_page(vm_paddr_t pa) +{ + int idx, bit; + + pa >>= PAGE_SHIFT; + idx = pa >> 6; /* 2^6 = 64 */ + bit = pa & 63; + atomic_clear_long(&vm_page_dump[idx], 1ul << bit); } diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c index 38315490784b..eeeb48bb4972 100644 --- a/sys/riscv/riscv/pmap.c +++ b/sys/riscv/riscv/pmap.c @@ -1645,9 +1645,7 @@ free_pv_chunk(struct pv_chunk *pc) PV_STAT(atomic_add_int(&pc_chunk_frees, 1)); /* entire chunk is free, return it */ m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc)); -#if 0 /* TODO: For minidump */ dump_drop_page(m->phys_addr); -#endif vm_page_unwire(m, PQ_NONE); vm_page_free(m); } @@ -1709,9 +1707,7 @@ get_pv_entry(pmap_t pmap, struct rwlock **lockp) } PV_STAT(atomic_add_int(&pc_chunk_count, 1)); PV_STAT(atomic_add_int(&pc_chunk_allocs, 1)); -#if 0 /* TODO: This is for minidump */ dump_add_page(m->phys_addr); -#endif pc = (void *)PHYS_TO_DMAP(m->phys_addr); pc->pc_pmap = pmap; pc->pc_map[0] = PC_FREE0 & ~1ul; /* preallocated bit 0 */ diff --git a/sys/riscv/riscv/uma_machdep.c b/sys/riscv/riscv/uma_machdep.c index d99a5a94fecd..4ab256ed2179 100644 --- a/sys/riscv/riscv/uma_machdep.c +++ b/sys/riscv/riscv/uma_machdep.c @@ -55,11 +55,8 @@ uma_small_alloc(uma_zone_t zone, vm_size_t bytes, int domain, u_int8_t *flags, if (m == NULL) return (NULL); pa = m->phys_addr; -#if 0 - /* RISCVTODO: minidump */ if ((wait & M_NODUMP) == 0) dump_add_page(pa); -#endif va = (void *)PHYS_TO_DMAP(pa); if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) bzero(va, PAGE_SIZE); @@ -73,10 +70,7 @@ uma_small_free(void *mem, vm_size_t size, u_int8_t flags) vm_paddr_t pa; pa = DMAP_TO_PHYS((vm_offset_t)mem); -#if 0 - /* RISCVTODO: minidump */ dump_drop_page(pa); -#endif m = PHYS_TO_VM_PAGE(pa); vm_page_unwire_noq(m); vm_page_free(m); diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index 7c3aeaef7456..a90a6f805b74 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -633,7 +633,7 @@ vm_page_startup(vm_offset_t vaddr) #endif #if defined(__aarch64__) || defined(__amd64__) || defined(__arm__) || \ - defined(__i386__) || defined(__mips__) + defined(__i386__) || defined(__mips__) || defined(__riscv) /* * Allocate a bitmap to indicate that a random physical page * needs to be included in a minidump. @@ -658,7 +658,8 @@ vm_page_startup(vm_offset_t vaddr) #else (void)last_pa; #endif -#if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) +#if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) || \ + defined(__riscv) /* * Include the UMA bootstrap pages, witness pages and vm_page_dump * in a crash dump. When pmap_map() uses the direct map, they are @@ -773,7 +774,8 @@ vm_page_startup(vm_offset_t vaddr) high_avail = new_end; new_end = vm_reserv_startup(&vaddr, new_end, high_avail); #endif -#if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) +#if defined(__aarch64__) || defined(__amd64__) || defined(__mips__) || \ + defined(__riscv) /* * Include vm_page_array and vm_reserv_array in a crash dump. */ From 151c6d102035a05ff5c62b7df02bb7b3247dd0f7 Mon Sep 17 00:00:00 2001 From: Cy Schubert Date: Wed, 6 Mar 2019 02:52:58 +0000 Subject: [PATCH 18/93] Remove an empty directory emptied by r343702. MFC after: 3 days From ce37b71e6809fe5074be54230da9cf09543d3cdd Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Wed, 6 Mar 2019 05:39:40 +0000 Subject: [PATCH 19/93] Add retry loop around GetMemoryMap call to fix fragmentation bug The call to BS->AllocatePages can cause the memory map to become framented, causing BS->GetMemoryMap to return EFI_BUFFER_TOO_SMALL more than once. For example this can happen on the MinnowBoard Turbot, causing the boot to stop with an error. Avoid this by calling GetMemoryMap in a loop. Reviewed by: imp, tsoome, kevans Differential Revision: https://reviews.freebsd.org/D19341 --- stand/efi/loader/bootinfo.c | 136 ++++++++++++++++++++---------------- stand/efi/loader/copy.c | 33 ++++++--- 2 files changed, 99 insertions(+), 70 deletions(-) diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.c index af0896a46063..b1df11acd53f 100644 --- a/stand/efi/loader/bootinfo.c +++ b/stand/efi/loader/bootinfo.c @@ -287,12 +287,12 @@ static int bi_load_efi_data(struct preloaded_file *kfp) { EFI_MEMORY_DESCRIPTOR *mm; - EFI_PHYSICAL_ADDRESS addr; + EFI_PHYSICAL_ADDRESS addr = 0; EFI_STATUS status; const char *efi_novmap; size_t efisz; UINTN efi_mapkey; - UINTN mmsz, pages, retry, sz; + UINTN dsz, pages, retry, sz; UINT32 mmver; struct efi_map_header *efihdr; bool do_vmap; @@ -323,76 +323,94 @@ bi_load_efi_data(struct preloaded_file *kfp) efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf; /* - * Assgin size of EFI_MEMORY_DESCRIPTOR to keep compatible with + * Assign size of EFI_MEMORY_DESCRIPTOR to keep compatible with * u-boot which doesn't fill this value when buffer for memory * descriptors is too small (eg. 0 to obtain memory map size) */ - mmsz = sizeof(EFI_MEMORY_DESCRIPTOR); + dsz = sizeof(EFI_MEMORY_DESCRIPTOR); /* - * It is possible that the first call to ExitBootServices may change - * the map key. Fetch a new map key and retry ExitBootServices in that - * case. + * Allocate enough pages to hold the bootinfo block and the + * memory map EFI will return to us. The memory map has an + * unknown size, so we have to determine that first. Note that + * the AllocatePages call can itself modify the memory map, so + * we have to take that into account as well. The changes to + * the memory map are caused by splitting a range of free + * memory into two, so that one is marked as being loader + * data. + */ + + sz = 0; + + /* + * Matthew Garrett has observed at least one system changing the + * memory map when calling ExitBootServices, causing it to return an + * error, probably because callbacks are allocating memory. + * So we need to retry calling it at least once. */ for (retry = 2; retry > 0; retry--) { - /* - * Allocate enough pages to hold the bootinfo block and the - * memory map EFI will return to us. The memory map has an - * unknown size, so we have to determine that first. Note that - * the AllocatePages call can itself modify the memory map, so - * we have to take that into account as well. The changes to - * the memory map are caused by splitting a range of free - * memory into two (AFAICT), so that one is marked as being - * loader data. - */ - sz = 0; - BS->GetMemoryMap(&sz, NULL, &efi_mapkey, &mmsz, &mmver); - sz += mmsz; - sz = (sz + 0xf) & ~0xf; - pages = EFI_SIZE_TO_PAGES(sz + efisz); - status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData, - pages, &addr); - if (EFI_ERROR(status)) { - printf("%s: AllocatePages error %lu\n", __func__, - EFI_ERROR_CODE(status)); - return (ENOMEM); - } + for (;;) { + status = BS->GetMemoryMap(&sz, mm, &efi_mapkey, &dsz, &mmver); + if (!EFI_ERROR(status)) + break; - /* - * Read the memory map and stash it after bootinfo. Align the - * memory map on a 16-byte boundary (the bootinfo block is page - * aligned). - */ - efihdr = (struct efi_map_header *)(uintptr_t)addr; - mm = (void *)((uint8_t *)efihdr + efisz); - sz = (EFI_PAGE_SIZE * pages) - efisz; + if (status != EFI_BUFFER_TOO_SMALL) { + printf("%s: GetMemoryMap error %lu\n", __func__, + EFI_ERROR_CODE(status)); + return (EINVAL); + } + + if (addr != 0) + BS->FreePages(addr, pages); + + /* Add 10 descriptors to the size to allow for + * fragmentation caused by calling AllocatePages */ + sz += (10 * dsz); + pages = EFI_SIZE_TO_PAGES(sz + efisz); + status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData, + pages, &addr); + if (EFI_ERROR(status)) { + printf("%s: AllocatePages error %lu\n", __func__, + EFI_ERROR_CODE(status)); + return (ENOMEM); + } - status = BS->GetMemoryMap(&sz, mm, &efi_mapkey, &mmsz, &mmver); - if (EFI_ERROR(status)) { - printf("%s: GetMemoryMap error %lu\n", __func__, - EFI_ERROR_CODE(status)); - return (EINVAL); - } - status = BS->ExitBootServices(IH, efi_mapkey); - if (EFI_ERROR(status) == 0) { /* - * This may be disabled by setting efi_disable_vmap in - * loader.conf(5). By default we will setup the virtual - * map entries. + * Read the memory map and stash it after bootinfo. Align the + * memory map on a 16-byte boundary (the bootinfo block is page + * aligned). */ - if (do_vmap) - efi_do_vmap(mm, sz, mmsz, mmver); - efihdr->memory_size = sz; - efihdr->descriptor_size = mmsz; - efihdr->descriptor_version = mmver; - file_addmetadata(kfp, MODINFOMD_EFI_MAP, efisz + sz, - efihdr); - return (0); + efihdr = (struct efi_map_header *)(uintptr_t)addr; + mm = (void *)((uint8_t *)efihdr + efisz); + sz = (EFI_PAGE_SIZE * pages) - efisz; } - BS->FreePages(addr, pages); + + status = BS->ExitBootServices(IH, efi_mapkey); + if (!EFI_ERROR(status)) + break; } - printf("ExitBootServices error %lu\n", EFI_ERROR_CODE(status)); - return (EINVAL); + + if (retry == 0) { + BS->FreePages(addr, pages); + printf("ExitBootServices error %lu\n", EFI_ERROR_CODE(status)); + return (EINVAL); + } + + /* + * This may be disabled by setting efi_disable_vmap in + * loader.conf(5). By default we will setup the virtual + * map entries. + */ + + if (do_vmap) + efi_do_vmap(mm, sz, dsz, mmver); + efihdr->memory_size = sz; + efihdr->descriptor_size = dsz; + efihdr->descriptor_version = mmver; + file_addmetadata(kfp, MODINFOMD_EFI_MAP, efisz + sz, + efihdr); + + return (0); } /* diff --git a/stand/efi/loader/copy.c b/stand/efi/loader/copy.c index 293626c95c9e..a19b048c9beb 100644 --- a/stand/efi/loader/copy.c +++ b/stand/efi/loader/copy.c @@ -95,7 +95,7 @@ static void efi_verify_staging_size(unsigned long *nr_pages) { UINTN sz; - EFI_MEMORY_DESCRIPTOR *map, *p; + EFI_MEMORY_DESCRIPTOR *map = NULL, *p; EFI_PHYSICAL_ADDRESS start, end; UINTN key, dsz; UINT32 dver; @@ -104,17 +104,28 @@ efi_verify_staging_size(unsigned long *nr_pages) unsigned long available_pages = 0; sz = 0; - status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver); - if (status != EFI_BUFFER_TOO_SMALL) { - printf("Can't determine memory map size\n"); - return; - } - map = malloc(sz); - status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver); - if (EFI_ERROR(status)) { - printf("Can't read memory map\n"); - goto out; + for (;;) { + status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver); + if (!EFI_ERROR(status)) + break; + + if (status != EFI_BUFFER_TOO_SMALL) { + printf("Can't read memory map: %lu\n", + EFI_ERROR_CODE(status)); + goto out; + } + + free(map); + + /* Allocate 10 descriptors more than the size reported, + * to allow for any fragmentation caused by calling + * malloc */ + map = malloc(sz + (10 * dsz)); + if (map == NULL) { + printf("Unable to allocate memory\n"); + goto out; + } } ndesc = sz / dsz; From 13ea0450a9c8742119d36f3bf8f47accdce46e54 Mon Sep 17 00:00:00 2001 From: Marcin Wojtas Date: Wed, 6 Mar 2019 06:39:42 +0000 Subject: [PATCH 20/93] Extend libsecureboot(old libve) to obtain trusted certificates from UEFI and implement revocation UEFI related headers were copied from edk2. A new build option "MK_LOADER_EFI_SECUREBOOT" was added to allow loading of trusted anchors from UEFI. Certificate revocation support is also introduced. The forbidden certificates are loaded from dbx variable. Verification fails in two cases: There is a direct match between cert in dbx and the one in the chain. The CA used to sign the chain is found in dbx. One can also insert a hash of TBS section of a certificate into dbx. In this case verifications fails only if a direct match with a certificate in chain is found. Submitted by: Kornel Duleba Reviewed by: sjg Obtained from: Semihalf Sponsored by: Stormshield Differential Revision: https://reviews.freebsd.org/D19093 --- lib/libsecureboot/Makefile.inc | 13 +- lib/libsecureboot/Makefile.libsa.inc | 13 + lib/libsecureboot/efi/efi_init.c | 74 ++++ lib/libsecureboot/efi/efi_variables.c | 278 ++++++++++++++ .../efi/include/Guid/GlobalVariable.h | 194 ++++++++++ .../efi/include/Guid/ImageAuthentication.h | 352 ++++++++++++++++++ lib/libsecureboot/efi/include/Protocol/Hash.h | 171 +++++++++ lib/libsecureboot/h/verify_file.h | 1 + lib/libsecureboot/libsecureboot-priv.h | 14 +- lib/libsecureboot/local.trust.mk | 19 +- lib/libsecureboot/verify_file.c | 2 +- lib/libsecureboot/vets.c | 246 ++++++++++-- share/mk/src.opts.mk | 1 + stand/efi/loader/Makefile | 4 + stand/efi/loader/main.c | 11 + .../build/options/WITH_LOADER_EFI_SECUREBOOT | 5 + 16 files changed, 1362 insertions(+), 36 deletions(-) create mode 100644 lib/libsecureboot/efi/efi_init.c create mode 100644 lib/libsecureboot/efi/efi_variables.c create mode 100644 lib/libsecureboot/efi/include/Guid/GlobalVariable.h create mode 100644 lib/libsecureboot/efi/include/Guid/ImageAuthentication.h create mode 100644 lib/libsecureboot/efi/include/Protocol/Hash.h create mode 100644 tools/build/options/WITH_LOADER_EFI_SECUREBOOT diff --git a/lib/libsecureboot/Makefile.inc b/lib/libsecureboot/Makefile.inc index e7564b7bb7cb..93eaee04989e 100644 --- a/lib/libsecureboot/Makefile.inc +++ b/lib/libsecureboot/Makefile.inc @@ -31,6 +31,17 @@ BRSSL_SRCS+= \ ${BEARSSL}/tools/xmem.c \ ${BEARSSL}/tools/vector.c +BRSSL_DEPS= \ + brf.c \ + vets.c \ + veta.c + +.if ${MK_LOADER_EFI_SECUREBOOT} != "no" +BRSSL_DEPS+= \ + efi_init.c \ + efi_variables.c +.endif + # we do not need/want nested objdirs OBJS_SRCS_FILTER = T R @@ -134,7 +145,7 @@ vse.h: echo 'NULL };' ) > ${.TARGET} -.for s in ${BRSSL_SRCS} brf.c vets.c veta.c +.for s in ${BRSSL_SRCS} ${BRSSL_DEPS} .ifdef BRSSL_SED $s: brssl.h .endif diff --git a/lib/libsecureboot/Makefile.libsa.inc b/lib/libsecureboot/Makefile.libsa.inc index 2456484a89c7..388d2edd90a2 100644 --- a/lib/libsecureboot/Makefile.libsa.inc +++ b/lib/libsecureboot/Makefile.libsa.inc @@ -16,6 +16,19 @@ SRCS+= \ vepcr.c \ verify_file.c \ +# Build library with support for the UEFI based authentication +.if ${MK_LOADER_EFI_SECUREBOOT} == "yes" +SRCS+= \ + efi/efi_variables.c \ + efi/efi_init.c + +# Add includes required by efi part +CFLAGS+= \ + -I${SRCTOP}/stand/efi/include \ + -I${SRCTOP}/lib/libsecureboot/efi/include \ + -I${SRCTOP}/stand/efi/include/${MACHINE} +.endif + # this is the list of paths (relative to a file # that we need to verify) used to find a signed manifest. # the signature extensions in VE_SIGNATURE_EXT_LIST diff --git a/lib/libsecureboot/efi/efi_init.c b/lib/libsecureboot/efi/efi_init.c new file mode 100644 index 000000000000..241e99dab17a --- /dev/null +++ b/lib/libsecureboot/efi/efi_init.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2019 Stormshield. + * Copyright (c) 2019 Semihalf. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#define NEED_BRSSL_H +#include "../libsecureboot-priv.h" +#include + +void +ve_efi_init(void) +{ + br_x509_certificate *xcs; + hash_data *digests; + size_t num; + int result; + static int once = 0; + + if (once > 0) + return; + + once = 1; + + result = efi_secure_boot_enabled(); + if (result <= 0) + return; + + xcs = efi_get_trusted_certs(&num); + if (num > 0 && xcs != NULL) { + num = ve_trust_anchors_add(xcs, num); + free_certificates(xcs, num); + } + xcs = efi_get_forbidden_certs(&num); + if (num > 0 && xcs != NULL) { + num = ve_forbidden_anchors_add(xcs, num); + free_certificates(xcs, num); + } + digests = efi_get_forbidden_digests(&num); + if (num > 0 && digests != NULL) { + ve_forbidden_digest_add(digests, num); + /* + * Don't free the buffors for digests, + * since they are shallow copied. + */ + xfree(digests); + } + + return; +} diff --git a/lib/libsecureboot/efi/efi_variables.c b/lib/libsecureboot/efi/efi_variables.c new file mode 100644 index 000000000000..12b553679bae --- /dev/null +++ b/lib/libsecureboot/efi/efi_variables.c @@ -0,0 +1,278 @@ +/*- + * Copyright (c) 2019 Stormshield. + * Copyright (c) 2019 Semihalf. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include + +#define NEED_BRSSL_H +#include "../libsecureboot-priv.h" +#include + +static EFI_GUID ImageSecurityDatabaseGUID = EFI_IMAGE_SECURITY_DATABASE_GUID; + +static EFI_GUID efiCertX509GUID = EFI_CERT_X509_GUID; +static EFI_GUID efiCertX509Sha256GUID = EFI_CERT_X509_SHA256_GUID; +static EFI_GUID efiCertX509Sha384GUID = EFI_CERT_X509_SHA384_GUID; +static EFI_GUID efiCertX509Sha5122UID = EFI_CERT_X509_SHA512_GUID; + +/* + * Check if Secure Boot is enabled in firmware. + * We evaluate two variables - Secure Boot and Setup Mode. + * Secure Boot is enforced only if the first one equals 1 and the other 0. + */ +int +efi_secure_boot_enabled(void) +{ + UINT8 SecureBoot; + UINT8 SetupMode; + size_t length; + EFI_STATUS status; + + length = sizeof(SecureBoot); + status = efi_global_getenv("SecureBoot", &SecureBoot, &length); + if (status != EFI_SUCCESS) { + if (status == EFI_NOT_FOUND) + return (0); + + printf("Failed to read \"SecureBoot\" variable\n"); + return (-efi_status_to_errno(status)); + } + + length = sizeof(SetupMode); + status = efi_global_getenv("SetupMode", &SetupMode, &length); + if (status != EFI_SUCCESS) + SetupMode = 0; + + printf(" SecureBoot: %d, SetupMode: %d\n", SecureBoot, SetupMode); + + return (SecureBoot == 1 && SetupMode == 0); +} + +/* + * Iterate through UEFI variable and extract X509 certificates from it. + * The EFI_* structures and related guids are defined in UEFI standard. + */ +static br_x509_certificate* +efi_get_certs(const char *name, size_t *count) +{ + br_x509_certificate *certs; + UINT8 *database; + EFI_SIGNATURE_LIST *list; + EFI_SIGNATURE_DATA *entry; + size_t db_size; + ssize_t cert_count; + EFI_STATUS status; + + database = NULL; + certs = NULL; + db_size = 0; + cert_count = 0; + + /* + * Read variable length and allocate memory for it + */ + status = efi_getenv(&ImageSecurityDatabaseGUID, name, database, &db_size); + if (status != EFI_BUFFER_TOO_SMALL) + return (NULL); + + database = malloc(db_size); + if (database == NULL) + return (NULL); + + status = efi_getenv(&ImageSecurityDatabaseGUID, name, database, &db_size); + if (status != EFI_SUCCESS) + goto fail; + + for (list = (EFI_SIGNATURE_LIST*) database; + db_size >= list->SignatureListSize && db_size > 0; + db_size -= list->SignatureListSize, + list = (EFI_SIGNATURE_LIST*) + ((UINT8*)list + list->SignatureListSize)) { + + /* We are only interested in entries containing X509 certs. */ + if (memcmp(&efiCertX509GUID, + &list->SignatureType, + sizeof(EFI_GUID)) != 0) { + continue; + } + + entry = (EFI_SIGNATURE_DATA*) + ((UINT8*)list + + sizeof(EFI_SIGNATURE_LIST) + + list->SignatureHeaderSize); + + certs = realloc(certs, + (cert_count + 1) * sizeof(br_x509_certificate)); + if (certs == NULL) { + cert_count = 0; + goto fail; + } + + certs[cert_count].data_len = list->SignatureSize - sizeof(EFI_GUID); + certs[cert_count].data = malloc(certs[cert_count].data_len); + if (certs[cert_count].data == NULL) + goto fail; + + memcpy(certs[cert_count].data, + entry->SignatureData, + certs[cert_count].data_len); + + cert_count++; + } + + *count = cert_count; + + xfree(database); + return (certs); + +fail: + free_certificates(certs, cert_count); + xfree(database); + return (NULL); + +} + +/* + * Extract digests from UEFI "dbx" variable. + * UEFI standard specifies three types of digest - sha256, sha386, sha512. + */ +hash_data* +efi_get_forbidden_digests(size_t *count) +{ + UINT8 *database; + hash_data *digests; + EFI_SIGNATURE_LIST *list; + EFI_SIGNATURE_DATA *entry; + size_t db_size, header_size, hash_size; + int digest_count, entry_count; + EFI_STATUS status; + + db_size = 0; + digest_count = 0; + database = NULL; + digests = NULL; + + status = efi_getenv(&ImageSecurityDatabaseGUID, "dbx", database, &db_size); + if (status != EFI_BUFFER_TOO_SMALL) + return (NULL); + + database = malloc(db_size); + if (database == NULL) + return (NULL); + + status = efi_getenv(&ImageSecurityDatabaseGUID, "dbx", database, &db_size); + if (status != EFI_SUCCESS) + goto fail; + + + for (list = (EFI_SIGNATURE_LIST*) database; + db_size >= list->SignatureListSize && db_size > 0; + db_size -= list->SignatureListSize, + list = (EFI_SIGNATURE_LIST*) + ((UINT8*)list + list->SignatureListSize)) { + + /* We are only interested in entries that contain digests. */ + if (memcmp(&efiCertX509Sha256GUID, &list->SignatureType, + sizeof(EFI_GUID)) == 0) { + hash_size = br_sha256_SIZE; + } else if (memcmp(&efiCertX509Sha384GUID, &list->SignatureType, + sizeof(EFI_GUID)) == 0) { + hash_size = br_sha384_SIZE; + } else if (memcmp(&efiCertX509Sha5122UID, &list->SignatureType, + sizeof(EFI_GUID)) == 0) { + hash_size = br_sha512_SIZE; + } else { + continue; + } + + /* + * A single entry can have multiple digests + * of the same type for some reason. + */ + header_size = sizeof(EFI_SIGNATURE_LIST) + list->SignatureHeaderSize; + + /* Calculate the number of entries basing on structure size */ + entry_count = list->SignatureListSize - header_size; + entry_count /= list->SignatureSize; + entry = (EFI_SIGNATURE_DATA*)((UINT8*)list + header_size); + while (entry_count-- > 0) { + digests = realloc(digests, + (digest_count + 1) * sizeof(hash_data)); + if (digests == NULL) { + digest_count = 0; + goto fail; + } + + digests[digest_count].data = malloc(hash_size); + if (digests[digest_count].data == NULL) + goto fail; + + memcpy(digests[digest_count].data, + entry->SignatureData, + hash_size); + digests[digest_count].hash_size = hash_size; + + entry = (EFI_SIGNATURE_DATA*)(entry + list->SignatureSize); + digest_count++; + } + } + xfree(database); + if (count != NULL) + *count = digest_count; + + return (digests); + +fail: + while (digest_count--) + xfree(digests[digest_count].data); + + xfree(database); + xfree(digests); + return (NULL); +} + +/* Copy x509 certificates from db */ +br_x509_certificate* +efi_get_trusted_certs(size_t *count) +{ + return (efi_get_certs("db", count)); +} + +/* Copy forbidden certificates from dbx */ +br_x509_certificate* +efi_get_forbidden_certs(size_t *count) +{ + return (efi_get_certs("dbx", count)); +} diff --git a/lib/libsecureboot/efi/include/Guid/GlobalVariable.h b/lib/libsecureboot/efi/include/Guid/GlobalVariable.h new file mode 100644 index 000000000000..cef7995e7497 --- /dev/null +++ b/lib/libsecureboot/efi/include/Guid/GlobalVariable.h @@ -0,0 +1,194 @@ +/** @file + GUID for EFI (NVRAM) Variables. + Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + @par Revision Reference: + GUID defined in UEFI 2.1 +**/ + +#ifndef __GLOBAL_VARIABLE_GUID_H__ +#define __GLOBAL_VARIABLE_GUID_H__ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef EFI_GLOBAL_VARIABLE +#define EFI_GLOBAL_VARIABLE \ + { \ + 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C } \ + } +#endif /* EFI_GLOBAL_VARIABLE */ + +extern EFI_GUID gEfiGlobalVariableGuid; + +// +// Follow UEFI 2.4 spec: +// To prevent name collisions with possible future globally defined variables, +// other internal firmware data variables that are not defined here must be +// saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or +// any other GUID defined by the UEFI Specification. Implementations must +// only permit the creation of variables with a UEFI Specification-defined +// VendorGuid when these variables are documented in the UEFI Specification. +// +// Note: except the globally defined variables defined below, the spec also defines +// L"Boot####" - A boot load option. +// L"Driver####" - A driver load option. +// L"SysPrep####" - A System Prep application load option. +// L"Key####" - Describes hot key relationship with a Boot#### load option. +// The attribute for them is NV+BS+RT, #### is a printed hex value, and no 0x or h +// is included in the hex value. They can not be expressed as a #define like other globally +// defined variables, it is because we can not list the Boot0000, Boot0001, etc one by one. +// + +/// +/// The language codes that the firmware supports. This value is deprecated. +/// Its attribute is BS+RT. +/// +#define EFI_LANG_CODES_VARIABLE_NAME L"LangCodes" +/// +/// The language code that the system is configured for. This value is deprecated. +/// Its attribute is NV+BS+RT. +/// +#define EFI_LANG_VARIABLE_NAME L"Lang" +/// +/// The firmware's boot managers timeout, in seconds, before initiating the default boot selection. +/// Its attribute is NV+BS+RT. +/// +#define EFI_TIME_OUT_VARIABLE_NAME L"Timeout" +/// +/// The language codes that the firmware supports. +/// Its attribute is BS+RT. +/// +#define EFI_PLATFORM_LANG_CODES_VARIABLE_NAME L"PlatformLangCodes" +/// +/// The language code that the system is configured for. +/// Its attribute is NV+BS+RT. +/// +#define EFI_PLATFORM_LANG_VARIABLE_NAME L"PlatformLang" +/// +/// The device path of the default input/output/error output console. +/// Its attribute is NV+BS+RT. +/// +#define EFI_CON_IN_VARIABLE_NAME L"ConIn" +#define EFI_CON_OUT_VARIABLE_NAME L"ConOut" +#define EFI_ERR_OUT_VARIABLE_NAME L"ErrOut" +/// +/// The device path of all possible input/output/error output devices. +/// Its attribute is BS+RT. +/// +#define EFI_CON_IN_DEV_VARIABLE_NAME L"ConInDev" +#define EFI_CON_OUT_DEV_VARIABLE_NAME L"ConOutDev" +#define EFI_ERR_OUT_DEV_VARIABLE_NAME L"ErrOutDev" +/// +/// The ordered boot option load list. +/// Its attribute is NV+BS+RT. +/// +#define EFI_BOOT_ORDER_VARIABLE_NAME L"BootOrder" +/// +/// The boot option for the next boot only. +/// Its attribute is NV+BS+RT. +/// +#define EFI_BOOT_NEXT_VARIABLE_NAME L"BootNext" +/// +/// The boot option that was selected for the current boot. +/// Its attribute is BS+RT. +/// +#define EFI_BOOT_CURRENT_VARIABLE_NAME L"BootCurrent" +/// +/// The types of boot options supported by the boot manager. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME L"BootOptionSupport" +/// +/// The ordered driver load option list. +/// Its attribute is NV+BS+RT. +/// +#define EFI_DRIVER_ORDER_VARIABLE_NAME L"DriverOrder" +/// +/// The ordered System Prep Application load option list. +/// Its attribute is NV+BS+RT. +/// +#define EFI_SYS_PREP_ORDER_VARIABLE_NAME L"SysPrepOrder" +/// +/// Identifies the level of hardware error record persistence +/// support implemented by the platform. This variable is +/// only modified by firmware and is read-only to the OS. +/// Its attribute is NV+BS+RT. +/// +#define EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME L"HwErrRecSupport" +/// +/// Whether the system is operating in setup mode (1) or not (0). +/// All other values are reserved. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_SETUP_MODE_NAME L"SetupMode" +/// +/// The Key Exchange Key Signature Database. +/// Its attribute is NV+BS+RT+AT. +/// +#define EFI_KEY_EXCHANGE_KEY_NAME L"KEK" +/// +/// The public Platform Key. +/// Its attribute is NV+BS+RT+AT. +/// +#define EFI_PLATFORM_KEY_NAME L"PK" +/// +/// Array of GUIDs representing the type of signatures supported +/// by the platform firmware. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_SIGNATURE_SUPPORT_NAME L"SignatureSupport" +/// +/// Whether the platform firmware is operating in Secure boot mode (1) or not (0). +/// All other values are reserved. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_SECURE_BOOT_MODE_NAME L"SecureBoot" +/// +/// The OEM's default Key Exchange Key Signature Database. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_KEK_DEFAULT_VARIABLE_NAME L"KEKDefault" +/// +/// The OEM's default public Platform Key. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_PK_DEFAULT_VARIABLE_NAME L"PKDefault" +/// +/// The OEM's default secure boot signature store. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_DB_DEFAULT_VARIABLE_NAME L"dbDefault" +/// +/// The OEM's default secure boot blacklist signature store. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_DBX_DEFAULT_VARIABLE_NAME L"dbxDefault" +/// +/// The OEM's default secure boot timestamp signature store. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_DBT_DEFAULT_VARIABLE_NAME L"dbtDefault" +/// +/// Allows the firmware to indicate supported features and actions to the OS. +/// Its attribute is BS+RT. +/// +#define EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME L"OsIndicationsSupported" +/// +/// Allows the OS to request the firmware to enable certain features and to take certain actions. +/// Its attribute is NV+BS+RT. +/// +#define EFI_OS_INDICATIONS_VARIABLE_NAME L"OsIndications" +/// +/// Whether the system is configured to use only vendor provided +/// keys or not. Should be treated as read-only. +/// Its attribute is BS+RT. +/// +#define EFI_VENDOR_KEYS_VARIABLE_NAME L"VendorKeys" + +#endif diff --git a/lib/libsecureboot/efi/include/Guid/ImageAuthentication.h b/lib/libsecureboot/efi/include/Guid/ImageAuthentication.h new file mode 100644 index 000000000000..c68e5fce205a --- /dev/null +++ b/lib/libsecureboot/efi/include/Guid/ImageAuthentication.h @@ -0,0 +1,352 @@ +/** @file + Image signature database are defined for the signed image validation. + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + @par Revision Reference: + GUIDs defined in UEFI 2.5 spec. +**/ + +#ifndef __IMAGE_AUTHTICATION_H__ +#define __IMAGE_AUTHTICATION_H__ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#define EFI_IMAGE_SECURITY_DATABASE_GUID \ + { \ + 0xd719b2cb, 0x3d3a, 0x4596, { 0xa3, 0xbc, 0xda, 0xd0, 0xe, 0x67, 0x65, 0x6f } \ + } + +/// +/// Varialbe name with guid EFI_IMAGE_SECURITY_DATABASE_GUID +/// for the authorized signature database. +/// +#define EFI_IMAGE_SECURITY_DATABASE L"db" +/// +/// Varialbe name with guid EFI_IMAGE_SECURITY_DATABASE_GUID +/// for the forbidden signature database. +/// +#define EFI_IMAGE_SECURITY_DATABASE1 L"dbx" +/// +/// Variable name with guid EFI_IMAGE_SECURITY_DATABASE_GUID +/// for the timestamp signature database. +/// +#define EFI_IMAGE_SECURITY_DATABASE2 L"dbt" + +#define SECURE_BOOT_MODE_ENABLE 1 +#define SECURE_BOOT_MODE_DISABLE 0 + +#define SETUP_MODE 1 +#define USER_MODE 0 + +//*********************************************************************** +// Signature Database +//*********************************************************************** +/// +/// The format of a signature database. +/// +#pragma pack(1) + +typedef struct { + /// + /// An identifier which identifies the agent which added the signature to the list. + /// + EFI_GUID SignatureOwner; + /// + /// The format of the signature is defined by the SignatureType. + /// + UINT8 SignatureData[1]; +} EFI_SIGNATURE_DATA; + +typedef struct { + /// + /// Type of the signature. GUID signature types are defined in below. + /// + EFI_GUID SignatureType; + /// + /// Total size of the signature list, including this header. + /// + UINT32 SignatureListSize; + /// + /// Size of the signature header which precedes the array of signatures. + /// + UINT32 SignatureHeaderSize; + /// + /// Size of each signature. + /// + UINT32 SignatureSize; + /// + /// Header before the array of signatures. The format of this header is specified + /// by the SignatureType. + /// UINT8 SignatureHeader[SignatureHeaderSize]; + /// + /// An array of signatures. Each signature is SignatureSize bytes in length. + /// EFI_SIGNATURE_DATA Signatures[][SignatureSize]; + /// +} EFI_SIGNATURE_LIST; + +typedef struct { + /// + /// The SHA256 hash of an X.509 certificate's To-Be-Signed contents. + /// + EFI_SHA256_HASH ToBeSignedHash; + /// + /// The time that the certificate shall be considered to be revoked. + /// + EFI_TIME TimeOfRevocation; +} EFI_CERT_X509_SHA256; + +typedef struct { + /// + /// The SHA384 hash of an X.509 certificate's To-Be-Signed contents. + /// + EFI_SHA384_HASH ToBeSignedHash; + /// + /// The time that the certificate shall be considered to be revoked. + /// + EFI_TIME TimeOfRevocation; +} EFI_CERT_X509_SHA384; + +typedef struct { + /// + /// The SHA512 hash of an X.509 certificate's To-Be-Signed contents. + /// + EFI_SHA512_HASH ToBeSignedHash; + /// + /// The time that the certificate shall be considered to be revoked. + /// + EFI_TIME TimeOfRevocation; +} EFI_CERT_X509_SHA512; + +#pragma pack() + +/// +/// This identifies a signature containing a SHA-256 hash. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of SignatureOwner component) + +/// 32 bytes. +/// +#define EFI_CERT_SHA256_GUID \ + { \ + 0xc1c41626, 0x504c, 0x4092, {0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28} \ + } + +/// +/// This identifies a signature containing an RSA-2048 key. The key (only the modulus +/// since the public key exponent is known to be 0x10001) shall be stored in big-endian +/// order. +/// The SignatureHeader size shall always be 0. The SignatureSize shall always be 16 (size +/// of SignatureOwner component) + 256 bytes. +/// +#define EFI_CERT_RSA2048_GUID \ + { \ + 0x3c5766e8, 0x269c, 0x4e34, {0xaa, 0x14, 0xed, 0x77, 0x6e, 0x85, 0xb3, 0xb6} \ + } + +/// +/// This identifies a signature containing a RSA-2048 signature of a SHA-256 hash. The +/// SignatureHeader size shall always be 0. The SignatureSize shall always be 16 (size of +/// SignatureOwner component) + 256 bytes. +/// +#define EFI_CERT_RSA2048_SHA256_GUID \ + { \ + 0xe2b36190, 0x879b, 0x4a3d, {0xad, 0x8d, 0xf2, 0xe7, 0xbb, 0xa3, 0x27, 0x84} \ + } + +/// +/// This identifies a signature containing a SHA-1 hash. The SignatureSize shall always +/// be 16 (size of SignatureOwner component) + 20 bytes. +/// +#define EFI_CERT_SHA1_GUID \ + { \ + 0x826ca512, 0xcf10, 0x4ac9, {0xb1, 0x87, 0xbe, 0x1, 0x49, 0x66, 0x31, 0xbd} \ + } + +/// +/// TThis identifies a signature containing a RSA-2048 signature of a SHA-1 hash. The +/// SignatureHeader size shall always be 0. The SignatureSize shall always be 16 (size of +/// SignatureOwner component) + 256 bytes. +/// +#define EFI_CERT_RSA2048_SHA1_GUID \ + { \ + 0x67f8444f, 0x8743, 0x48f1, {0xa3, 0x28, 0x1e, 0xaa, 0xb8, 0x73, 0x60, 0x80} \ + } + +/// +/// This identifies a signature based on an X.509 certificate. If the signature is an X.509 +/// certificate then verification of the signature of an image should validate the public +/// key certificate in the image using certificate path verification, up to this X.509 +/// certificate as a trusted root. The SignatureHeader size shall always be 0. The +/// SignatureSize may vary but shall always be 16 (size of the SignatureOwner component) + +/// the size of the certificate itself. +/// Note: This means that each certificate will normally be in a separate EFI_SIGNATURE_LIST. +/// +#define EFI_CERT_X509_GUID \ + { \ + 0xa5c059a1, 0x94e4, 0x4aa7, {0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72} \ + } + +/// +/// This identifies a signature containing a SHA-224 hash. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of SignatureOwner component) + +/// 28 bytes. +/// +#define EFI_CERT_SHA224_GUID \ + { \ + 0xb6e5233, 0xa65c, 0x44c9, {0x94, 0x7, 0xd9, 0xab, 0x83, 0xbf, 0xc8, 0xbd} \ + } + +/// +/// This identifies a signature containing a SHA-384 hash. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of SignatureOwner component) + +/// 48 bytes. +/// +#define EFI_CERT_SHA384_GUID \ + { \ + 0xff3e5307, 0x9fd0, 0x48c9, {0x85, 0xf1, 0x8a, 0xd5, 0x6c, 0x70, 0x1e, 0x1} \ + } + +/// +/// This identifies a signature containing a SHA-512 hash. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of SignatureOwner component) + +/// 64 bytes. +/// +#define EFI_CERT_SHA512_GUID \ + { \ + 0x93e0fae, 0xa6c4, 0x4f50, {0x9f, 0x1b, 0xd4, 0x1e, 0x2b, 0x89, 0xc1, 0x9a} \ + } + +/// +/// This identifies a signature containing the SHA256 hash of an X.509 certificate's +/// To-Be-Signed contents, and a time of revocation. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of the SignatureOwner component) +/// + 48 bytes for an EFI_CERT_X509_SHA256 structure. If the TimeOfRevocation is non-zero, +/// the certificate should be considered to be revoked from that time and onwards, and +/// otherwise the certificate shall be considered to always be revoked. +/// +#define EFI_CERT_X509_SHA256_GUID \ + { \ + 0x3bd2a492, 0x96c0, 0x4079, {0xb4, 0x20, 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed } \ + } + +/// +/// This identifies a signature containing the SHA384 hash of an X.509 certificate's +/// To-Be-Signed contents, and a time of revocation. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of the SignatureOwner component) +/// + 64 bytes for an EFI_CERT_X509_SHA384 structure. If the TimeOfRevocation is non-zero, +/// the certificate should be considered to be revoked from that time and onwards, and +/// otherwise the certificate shall be considered to always be revoked. +/// +#define EFI_CERT_X509_SHA384_GUID \ + { \ + 0x7076876e, 0x80c2, 0x4ee6, {0xaa, 0xd2, 0x28, 0xb3, 0x49, 0xa6, 0x86, 0x5b } \ + } + +/// +/// This identifies a signature containing the SHA512 hash of an X.509 certificate's +/// To-Be-Signed contents, and a time of revocation. The SignatureHeader size shall +/// always be 0. The SignatureSize shall always be 16 (size of the SignatureOwner component) +/// + 80 bytes for an EFI_CERT_X509_SHA512 structure. If the TimeOfRevocation is non-zero, +/// the certificate should be considered to be revoked from that time and onwards, and +/// otherwise the certificate shall be considered to always be revoked. +/// +#define EFI_CERT_X509_SHA512_GUID \ + { \ + 0x446dbf63, 0x2502, 0x4cda, {0xbc, 0xfa, 0x24, 0x65, 0xd2, 0xb0, 0xfe, 0x9d } \ + } + +/// +/// This identifies a signature containing a DER-encoded PKCS #7 version 1.5 [RFC2315] +/// SignedData value. +/// +#define EFI_CERT_TYPE_PKCS7_GUID \ + { \ + 0x4aafd29d, 0x68df, 0x49ee, {0x8a, 0xa9, 0x34, 0x7d, 0x37, 0x56, 0x65, 0xa7} \ + } + +//*********************************************************************** +// Image Execution Information Table Definition +//*********************************************************************** +typedef UINT32 EFI_IMAGE_EXECUTION_ACTION; + +#define EFI_IMAGE_EXECUTION_AUTHENTICATION 0x00000007 +#define EFI_IMAGE_EXECUTION_AUTH_UNTESTED 0x00000000 +#define EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED 0x00000001 +#define EFI_IMAGE_EXECUTION_AUTH_SIG_PASSED 0x00000002 +#define EFI_IMAGE_EXECUTION_AUTH_SIG_NOT_FOUND 0x00000003 +#define EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND 0x00000004 +#define EFI_IMAGE_EXECUTION_POLICY_FAILED 0x00000005 +#define EFI_IMAGE_EXECUTION_INITIALIZED 0x00000008 + +// +// EFI_IMAGE_EXECUTION_INFO is added to EFI System Configuration Table +// and assigned the GUID EFI_IMAGE_SECURITY_DATABASE_GUID. +// +typedef struct { + /// + /// Describes the action taken by the firmware regarding this image. + /// + EFI_IMAGE_EXECUTION_ACTION Action; + /// + /// Size of all of the entire structure. + /// + UINT32 InfoSize; + /// + /// If this image was a UEFI device driver (for option ROM, for example) this is the + /// null-terminated, user-friendly name for the device. If the image was for an application, + /// then this is the name of the application. If this cannot be determined, then a simple + /// NULL character should be put in this position. + /// CHAR16 Name[]; + /// + + /// + /// For device drivers, this is the device path of the device for which this device driver + /// was intended. In some cases, the driver itself may be stored as part of the system + /// firmware, but this field should record the device's path, not the firmware path. For + /// applications, this is the device path of the application. If this cannot be determined, + /// a simple end-of-path device node should be put in this position. + /// EFI_DEVICE_PATH_PROTOCOL DevicePath; + /// + + /// + /// Zero or more image signatures. If the image contained no signatures, + /// then this field is empty. + /// EFI_SIGNATURE_LIST Signature; + /// +} EFI_IMAGE_EXECUTION_INFO; + + +typedef struct { + /// + /// Number of EFI_IMAGE_EXECUTION_INFO structures. + /// + UINTN NumberOfImages; + /// + /// Number of image instances of EFI_IMAGE_EXECUTION_INFO structures. + /// + // EFI_IMAGE_EXECUTION_INFO InformationInfo[] +} EFI_IMAGE_EXECUTION_INFO_TABLE; + +extern EFI_GUID gEfiImageSecurityDatabaseGuid; +extern EFI_GUID gEfiCertSha256Guid; +extern EFI_GUID gEfiCertRsa2048Guid; +extern EFI_GUID gEfiCertRsa2048Sha256Guid; +extern EFI_GUID gEfiCertSha1Guid; +extern EFI_GUID gEfiCertRsa2048Sha1Guid; +extern EFI_GUID gEfiCertX509Guid; +extern EFI_GUID gEfiCertSha224Guid; +extern EFI_GUID gEfiCertSha384Guid; +extern EFI_GUID gEfiCertSha512Guid; +extern EFI_GUID gEfiCertX509Sha256Guid; +extern EFI_GUID gEfiCertX509Sha384Guid; +extern EFI_GUID gEfiCertX509Sha512Guid; +extern EFI_GUID gEfiCertPkcs7Guid; + +#endif diff --git a/lib/libsecureboot/efi/include/Protocol/Hash.h b/lib/libsecureboot/efi/include/Protocol/Hash.h new file mode 100644 index 000000000000..f25267952391 --- /dev/null +++ b/lib/libsecureboot/efi/include/Protocol/Hash.h @@ -0,0 +1,171 @@ +/** @file + EFI_HASH_SERVICE_BINDING_PROTOCOL as defined in UEFI 2.0. + EFI_HASH_PROTOCOL as defined in UEFI 2.0. + The EFI Hash Service Binding Protocol is used to locate hashing services support + provided by a driver and to create and destroy instances of the EFI Hash Protocol + so that a multiple drivers can use the underlying hashing services. +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#ifndef __EFI_HASH_PROTOCOL_H__ +#define __EFI_HASH_PROTOCOL_H__ + +#include +__FBSDID("$FreeBSD$"); + +#define CONST const + +#define EFI_HASH_SERVICE_BINDING_PROTOCOL_GUID \ + { \ + 0x42881c98, 0xa4f3, 0x44b0, {0xa3, 0x9d, 0xdf, 0xa1, 0x86, 0x67, 0xd8, 0xcd } \ + } + +#define EFI_HASH_PROTOCOL_GUID \ + { \ + 0xc5184932, 0xdba5, 0x46db, {0xa5, 0xba, 0xcc, 0x0b, 0xda, 0x9c, 0x14, 0x35 } \ + } + +#define EFI_HASH_ALGORITHM_SHA1_GUID \ + { \ + 0x2ae9d80f, 0x3fb2, 0x4095, {0xb7, 0xb1, 0xe9, 0x31, 0x57, 0xb9, 0x46, 0xb6 } \ + } + +#define EFI_HASH_ALGORITHM_SHA224_GUID \ + { \ + 0x8df01a06, 0x9bd5, 0x4bf7, {0xb0, 0x21, 0xdb, 0x4f, 0xd9, 0xcc, 0xf4, 0x5b } \ + } + +#define EFI_HASH_ALGORITHM_SHA256_GUID \ + { \ + 0x51aa59de, 0xfdf2, 0x4ea3, {0xbc, 0x63, 0x87, 0x5f, 0xb7, 0x84, 0x2e, 0xe9 } \ + } + +#define EFI_HASH_ALGORITHM_SHA384_GUID \ + { \ + 0xefa96432, 0xde33, 0x4dd2, {0xae, 0xe6, 0x32, 0x8c, 0x33, 0xdf, 0x77, 0x7a } \ + } + +#define EFI_HASH_ALGORITHM_SHA512_GUID \ + { \ + 0xcaa4381e, 0x750c, 0x4770, {0xb8, 0x70, 0x7a, 0x23, 0xb4, 0xe4, 0x21, 0x30 } \ + } + +#define EFI_HASH_ALGORTIHM_MD5_GUID \ + { \ + 0xaf7c79c, 0x65b5, 0x4319, {0xb0, 0xae, 0x44, 0xec, 0x48, 0x4e, 0x4a, 0xd7 } \ + } + +#define EFI_HASH_ALGORITHM_SHA1_NOPAD_GUID \ + { \ + 0x24c5dc2f, 0x53e2, 0x40ca, {0x9e, 0xd6, 0xa5, 0xd9, 0xa4, 0x9f, 0x46, 0x3b } \ + } + +#define EFI_HASH_ALGORITHM_SHA256_NOPAD_GUID \ + { \ + 0x8628752a, 0x6cb7, 0x4814, {0x96, 0xfc, 0x24, 0xa8, 0x15, 0xac, 0x22, 0x26 } \ + } + +// +// Note: Use of the following algorithms with EFI_HASH_PROTOCOL is deprecated. +// EFI_HASH_ALGORITHM_SHA1_GUID +// EFI_HASH_ALGORITHM_SHA224_GUID +// EFI_HASH_ALGORITHM_SHA256_GUID +// EFI_HASH_ALGORITHM_SHA384_GUID +// EFI_HASH_ALGORITHM_SHA512_GUID +// EFI_HASH_ALGORTIHM_MD5_GUID +// + +typedef struct _EFI_HASH_PROTOCOL EFI_HASH_PROTOCOL; + +typedef UINT8 EFI_MD5_HASH[16]; +typedef UINT8 EFI_SHA1_HASH[20]; +typedef UINT8 EFI_SHA224_HASH[28]; +typedef UINT8 EFI_SHA256_HASH[32]; +typedef UINT8 EFI_SHA384_HASH[48]; +typedef UINT8 EFI_SHA512_HASH[64]; + +typedef union { + EFI_MD5_HASH *Md5Hash; + EFI_SHA1_HASH *Sha1Hash; + EFI_SHA224_HASH *Sha224Hash; + EFI_SHA256_HASH *Sha256Hash; + EFI_SHA384_HASH *Sha384Hash; + EFI_SHA512_HASH *Sha512Hash; +} EFI_HASH_OUTPUT; + +/** + Returns the size of the hash which results from a specific algorithm. + @param[in] This Points to this instance of EFI_HASH_PROTOCOL. + @param[in] HashAlgorithm Points to the EFI_GUID which identifies the algorithm to use. + @param[out] HashSize Holds the returned size of the algorithm's hash. + @retval EFI_SUCCESS Hash size returned successfully. + @retval EFI_INVALID_PARAMETER HashSize is NULL or HashAlgorithm is NULL. + @retval EFI_UNSUPPORTED The algorithm specified by HashAlgorithm is not supported + by this driver. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HASH_GET_HASH_SIZE)( + IN CONST EFI_HASH_PROTOCOL *This, + IN CONST EFI_GUID *HashAlgorithm, + OUT UINTN *HashSize + ); + +/** + Creates a hash for the specified message text. + @param[in] This Points to this instance of EFI_HASH_PROTOCOL. + @param[in] HashAlgorithm Points to the EFI_GUID which identifies the algorithm to use. + @param[in] Extend Specifies whether to create a new hash (FALSE) or extend the specified + existing hash (TRUE). + @param[in] Message Points to the start of the message. + @param[in] MessageSize The size of Message, in bytes. + @param[in,out] Hash On input, if Extend is TRUE, then this parameter holds a pointer + to a pointer to an array containing the hash to extend. If Extend + is FALSE, then this parameter holds a pointer to a pointer to a + caller-allocated array that will receive the result of the hash + computation. On output (regardless of the value of Extend), the + array will contain the result of the hash computation. + @retval EFI_SUCCESS Hash returned successfully. + @retval EFI_INVALID_PARAMETER Message or Hash, HashAlgorithm is NULL or MessageSize is 0. + MessageSize is not an integer multiple of block size. + @retval EFI_UNSUPPORTED The algorithm specified by HashAlgorithm is not supported by this + driver. Or, Extend is TRUE, and the algorithm doesn't support extending the hash. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HASH_HASH)( + IN CONST EFI_HASH_PROTOCOL *This, + IN CONST EFI_GUID *HashAlgorithm, + IN BOOLEAN Extend, + IN CONST UINT8 *Message, + IN UINT64 MessageSize, + IN OUT EFI_HASH_OUTPUT *Hash + ); + +/// +/// This protocol allows creating a hash of an arbitrary message digest +/// using one or more hash algorithms. +/// +struct _EFI_HASH_PROTOCOL { + EFI_HASH_GET_HASH_SIZE GetHashSize; + EFI_HASH_HASH Hash; +}; + +extern EFI_GUID gEfiHashServiceBindingProtocolGuid; +extern EFI_GUID gEfiHashProtocolGuid; +extern EFI_GUID gEfiHashAlgorithmSha1Guid; +extern EFI_GUID gEfiHashAlgorithmSha224Guid; +extern EFI_GUID gEfiHashAlgorithmSha256Guid; +extern EFI_GUID gEfiHashAlgorithmSha384Guid; +extern EFI_GUID gEfiHashAlgorithmSha512Guid; +extern EFI_GUID gEfiHashAlgorithmMD5Guid; +extern EFI_GUID gEfiHashAlgorithmSha1NoPadGuid; +extern EFI_GUID gEfiHashAlgorithmSha256NoPadGuid; + +#endif diff --git a/lib/libsecureboot/h/verify_file.h b/lib/libsecureboot/h/verify_file.h index 3f8e6138cbc8..4556f8268714 100644 --- a/lib/libsecureboot/h/verify_file.h +++ b/lib/libsecureboot/h/verify_file.h @@ -40,6 +40,7 @@ struct stat; void ve_debug_set(int); int ve_status_get(int); +void ve_efi_init(void); int load_manifest(const char *, const char *, const char *, struct stat *); int verify_file(int, const char *, off_t, int); void verify_pcr_export(void); diff --git a/lib/libsecureboot/libsecureboot-priv.h b/lib/libsecureboot/libsecureboot-priv.h index 0618f05f15b1..5cfc9800c829 100644 --- a/lib/libsecureboot/libsecureboot-priv.h +++ b/lib/libsecureboot/libsecureboot-priv.h @@ -31,8 +31,15 @@ /* public api */ #include "libsecureboot.h" +typedef struct { + unsigned char *data; + size_t hash_size; +} hash_data; + size_t ve_trust_anchors_add(br_x509_certificate *, size_t); -char *fingerprint_info_lookup(int, const char *); +size_t ve_forbidden_anchors_add(br_x509_certificate *, size_t); +void ve_forbidden_digest_add(hash_data *digest, size_t); +char *fingerprint_info_lookup(int, const char *); br_x509_certificate * parse_certificates(unsigned char *, size_t, size_t *); int certificate_to_trust_anchor_inner(br_x509_trust_anchor *, @@ -45,4 +52,9 @@ int verify_rsa_digest(br_rsa_public_key *pkey, int openpgp_self_tests(void); +int efi_secure_boot_enabled(void); +br_x509_certificate* efi_get_trusted_certs(size_t *count); +br_x509_certificate* efi_get_forbidden_certs(size_t *count); +hash_data* efi_get_forbidden_digests(size_t *count); + #endif /* _LIBSECUREBOOT_PRIV_H_ */ diff --git a/lib/libsecureboot/local.trust.mk b/lib/libsecureboot/local.trust.mk index f26a4ec0a9be..cdc3a796b7ec 100644 --- a/lib/libsecureboot/local.trust.mk +++ b/lib/libsecureboot/local.trust.mk @@ -7,27 +7,26 @@ # for each key will provide the appropriate certificate chain on request # force these for Junos -MANIFEST_SKIP_ALWAYS= boot +#MANIFEST_SKIP_ALWAYS= boot VE_HASH_LIST= \ SHA1 \ SHA256 \ - SHA384 + SHA384 \ + SHA512 VE_SIGNATURE_LIST= \ - ECDSA + ECDSA \ + RSA VE_SIGNATURE_EXT_LIST= \ - esig + esig \ + rsig VE_SELF_TESTS= yes .if ${MACHINE} == "host" && ${.CURDIR:T} == "tests" -# for testing -VE_HASH_LIST+= \ - SHA512 VE_SIGNATURE_LIST+= \ - RSA \ DEPRECATED_RSA_SHA1 VE_SIGNATURE_EXT_LIST+= \ @@ -88,7 +87,7 @@ vc_rsa.pem: rcerts.pem _2ndLAST_PEM_USE .endif # we take the mtime of this as our baseline time -BUILD_UTC_FILE= ecerts.pem +#BUILD_UTC_FILE= ecerts.pem #VE_DEBUG_LEVEL=3 #VE_VERBOSE_DEFAULT=1 @@ -97,7 +96,7 @@ BUILD_UTC_FILE= ecerts.pem .if empty(TRUST_ANCHORS) TRUST_ANCHORS!= cd ${.CURDIR} && 'ls' -1 *.pem t*.asc 2> /dev/null .endif -.if empty(TRUST_ANCHORS) +.if empty(TRUST_ANCHORS) && ${MK_LOADER_EFI_SECUREBOOT} != "yes" .error Need TRUST_ANCHORS see ${.CURDIR}/README.rst .endif .if ${TRUST_ANCHORS:T:Mt*.pem} != "" diff --git a/lib/libsecureboot/verify_file.c b/lib/libsecureboot/verify_file.c index 8bde42090755..dcf9a9a6be12 100644 --- a/lib/libsecureboot/verify_file.c +++ b/lib/libsecureboot/verify_file.c @@ -346,7 +346,7 @@ verify_file(int fd, const char *filename, off_t off, int severity) if (verbose || severity > VE_WANT) { #if defined(VE_DEBUG_LEVEL) && VE_DEBUG_LEVEL > 0 printf("Verified %s %llu,%llu\n", filename, - st.st_dev, st.st_ino); + (long long)st.st_dev, (long long)st.st_ino); #else printf("Verified %s\n", filename); #endif diff --git a/lib/libsecureboot/vets.c b/lib/libsecureboot/vets.c index db96fe965a5c..06bfd0e3fc0c 100644 --- a/lib/libsecureboot/vets.c +++ b/lib/libsecureboot/vets.c @@ -49,8 +49,11 @@ __FBSDID("$FreeBSD$"); int DebugVe = 0; typedef VECTOR(br_x509_certificate) cert_list; +typedef VECTOR(hash_data) digest_list; static anchor_list trust_anchors = VEC_INIT; +static anchor_list forbidden_anchors = VEC_INIT; +static digest_list forbidden_digests = VEC_INIT; void ve_debug_set(int n) @@ -113,12 +116,75 @@ free_cert_contents(br_x509_certificate *xc) xfree(xc->data); } -/** - * @brief - * add certs to our trust store +/* ASN parsing related defines */ +#define ASN1_PRIMITIVE_TAG 0x1F +#define ASN1_INF_LENGTH 0x80 +#define ASN1_LENGTH_MASK 0x7F + +/* + * Get TBS part of certificate. + * Since BearSSL doesn't provide any API to do this, + * it has to be implemented here. */ -size_t -ve_trust_anchors_add(br_x509_certificate *xcs, size_t num) +static void* +X509_to_tbs(unsigned char* cert, size_t* output_size) +{ + unsigned char *result; + size_t tbs_size; + int size, i; + + if (cert == NULL) + return (NULL); + + /* Strip two sequences to get to the TBS section */ + for (i = 0; i < 2; i++) { + /* + * XXX: We don't need to support extended tags since + * they should not be present in certificates. + */ + if ((*cert & ASN1_PRIMITIVE_TAG) == ASN1_PRIMITIVE_TAG) + return (NULL); + + cert++; + + if (*cert == ASN1_INF_LENGTH) + return (NULL); + + size = *cert & ASN1_LENGTH_MASK; + tbs_size = 0; + + /* Size can either be stored on a single or multiple bytes */ + if (*cert & (ASN1_LENGTH_MASK + 1)) { + cert++; + while (*cert == 0 && size > 0) { + cert++; + size--; + } + while (size-- > 0) { + tbs_size <<= 8; + tbs_size |= *(cert++); + } + } + if (i == 0) + result = cert; + } + tbs_size += (cert - result); + + if (output_size != NULL) + *output_size = tbs_size; + + return (result); +} + +void +ve_forbidden_digest_add(hash_data *digest, size_t num) +{ + while (num--) + VEC_ADD(forbidden_digests, digest[num]); +} + +static size_t +ve_anchors_add(br_x509_certificate *xcs, size_t num, anchor_list *anchors) { br_x509_trust_anchor ta; size_t u; @@ -127,11 +193,27 @@ ve_trust_anchors_add(br_x509_certificate *xcs, size_t num) if (certificate_to_trust_anchor_inner(&ta, &xcs[u]) < 0) { break; } - VEC_ADD(trust_anchors, ta); + VEC_ADD(*anchors, ta); } return (u); } +/** + * @brief + * add certs to our trust store + */ +size_t +ve_trust_anchors_add(br_x509_certificate *xcs, size_t num) +{ + return (ve_anchors_add(xcs, num, &trust_anchors)); +} + +size_t +ve_forbidden_anchors_add(br_x509_certificate *xcs, size_t num) +{ + return (ve_anchors_add(xcs, num, &forbidden_anchors)); +} + /** * @brief * initialize our trust_anchors from ta_PEM @@ -139,13 +221,14 @@ ve_trust_anchors_add(br_x509_certificate *xcs, size_t num) int ve_trust_init(void) { +#ifdef TRUST_ANCHOR_STR br_x509_certificate *xcs; +#endif static int once = -1; size_t num; if (once >= 0) return (once); - once = 0; ve_utc_set(time(NULL)); #ifdef BUILD_UTC @@ -159,14 +242,12 @@ ve_trust_init(void) #ifdef TRUST_ANCHOR_STR xcs = parse_certificates(__DECONST(unsigned char *, TRUST_ANCHOR_STR), sizeof(TRUST_ANCHOR_STR), &num); - if (xcs == NULL) - return (0); - num = ve_trust_anchors_add(xcs, num); - once = (int) num; -#else - num = 0; + if (xcs != NULL) + num = ve_trust_anchors_add(xcs, num); #endif - return (num); + once = (int) VEC_LEN(trust_anchors); + + return (once); } /** @@ -177,7 +258,8 @@ ve_trust_init(void) static br_x509_pkey * verify_signer_xcs(br_x509_certificate *xcs, size_t num, - br_name_element *elts, size_t num_elts) + br_name_element *elts, size_t num_elts, + anchor_list *anchors) { br_x509_minimal_context mc; br_x509_certificate *xc; @@ -196,11 +278,11 @@ verify_signer_xcs(br_x509_certificate *xcs, } DEBUG_PRINTF(5, ("verify_signer: %zu trust anchors\n", - VEC_LEN(trust_anchors))); + VEC_LEN(*anchors))); br_x509_minimal_init(&mc, &br_sha256_vtable, - &VEC_ELT(trust_anchors, 0), - VEC_LEN(trust_anchors)); + &VEC_ELT(*anchors, 0), + VEC_LEN(*anchors)); #ifdef VE_ECDSA_SUPPORT br_x509_minimal_set_ecdsa(&mc, &br_ec_prime_i31, &br_ecdsa_i31_vrfy_asn1); @@ -255,10 +337,96 @@ verify_signer_xcs(br_x509_certificate *xcs, pk = xpkeydup(tpk); } } - VEC_CLEAREXT(chain, &free_cert_contents); + VEC_CLEAR(chain); return (pk); } +/* + * Check if digest of one of the certificates from verified chain + * is present in the forbidden database. + * Since UEFI allows to store three types of digests + * all of them have to be checked separately. + */ +static int +check_forbidden_digests(br_x509_certificate *xcs, size_t num) +{ + unsigned char sha256_digest[br_sha256_SIZE]; + unsigned char sha384_digest[br_sha384_SIZE]; + unsigned char sha512_digest[br_sha512_SIZE]; + void *tbs; + hash_data *digest; + br_hash_compat_context ctx; + const br_hash_class *md; + size_t tbs_len, i; + int have_sha256, have_sha384, have_sha512; + + if (VEC_LEN(forbidden_digests) == 0) + return (0); + + /* + * Iterate through certificates, extract their To-Be-Signed section, + * and compare its digest against the ones in the forbidden database. + */ + while (num--) { + tbs = X509_to_tbs(xcs[num].data, &tbs_len); + if (tbs == NULL) { + printf("Failed to obtain TBS part of certificate\n"); + return (1); + } + have_sha256 = have_sha384 = have_sha512 = 0; + + for (i = 0; i < VEC_LEN(forbidden_digests); i++) { + digest = &VEC_ELT(forbidden_digests, i); + switch (digest->hash_size) { + case br_sha256_SIZE: + if (!have_sha256) { + have_sha256 = 1; + md = &br_sha256_vtable; + md->init(&ctx.vtable); + md->update(&ctx.vtable, tbs, tbs_len); + md->out(&ctx.vtable, sha256_digest); + } + if (!memcmp(sha256_digest, + digest->data, + br_sha256_SIZE)) + return (1); + + break; + case br_sha384_SIZE: + if (!have_sha384) { + have_sha384 = 1; + md = &br_sha384_vtable; + md->init(&ctx.vtable); + md->update(&ctx.vtable, tbs, tbs_len); + md->out(&ctx.vtable, sha384_digest); + } + if (!memcmp(sha384_digest, + digest->data, + br_sha384_SIZE)) + return (1); + + break; + case br_sha512_SIZE: + if (!have_sha512) { + have_sha512 = 1; + md = &br_sha512_vtable; + md->init(&ctx.vtable); + md->update(&ctx.vtable, tbs, tbs_len); + md->out(&ctx.vtable, sha512_digest); + } + if (!memcmp(sha512_digest, + digest->data, + br_sha512_SIZE)) + return (1); + + break; + } + } + } + + return (0); +} + static br_x509_pkey * verify_signer(const char *certs, br_name_element *elts, size_t num_elts) @@ -266,15 +434,46 @@ verify_signer(const char *certs, br_x509_certificate *xcs; br_x509_pkey *pk; size_t num; - + + pk = NULL; + ve_trust_init(); xcs = read_certificates(certs, &num); if (xcs == NULL) { ve_error_set("cannot read certificates\n"); return (NULL); } - pk = verify_signer_xcs(xcs, num, elts, num_elts); - xfree(xcs); + + /* + * Check if either + * 1. There is a direct match between cert from forbidden_anchors + * and a cert from chain. + * 2. CA that signed the chain is found in forbidden_anchors. + */ + if (VEC_LEN(forbidden_anchors) > 0) + pk = verify_signer_xcs(xcs, num, elts, num_elts, &forbidden_anchors); + if (pk != NULL) { + ve_error_set("Certificate is on forbidden list\n"); + xfreepkey(pk); + pk = NULL; + goto out; + } + + pk = verify_signer_xcs(xcs, num, elts, num_elts, &trust_anchors); + if (pk == NULL) + goto out; + + /* + * Check if hash of tbs part of any certificate in chain + * is on the forbidden list. + */ + if (check_forbidden_digests(xcs, num)) { + ve_error_set("Certificate hash is on forbidden list\n"); + xfreepkey(pk); + pk = NULL; + } +out: + free_certificates(xcs, num); return (pk); } @@ -679,7 +878,8 @@ ve_self_tests(void) for (u = 0; u < num; u ++) { cn.len = sizeof(cn_buf); - if ((pk = verify_signer_xcs(&xcs[u], 1, &cn, 1)) != NULL) { + if ((pk = verify_signer_xcs(&xcs[u], 1, &cn, 1, &trust_anchors)) != NULL) { + free_cert_contents(&xcs[u]); once++; printf("Testing verify certificate: %s\tPassed\n", cn.status ? cn_buf : ""); diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk index 3c3f34b6fb43..9cb83f2ef78f 100644 --- a/share/mk/src.opts.mk +++ b/share/mk/src.opts.mk @@ -221,6 +221,7 @@ __DEFAULT_DEPENDENT_OPTIONS= \ CLANG_FULL/CLANG \ LLVM_TARGET_ALL/CLANG \ LOADER_VERIEXEC/BEARSSL \ + LOADER_EFI_SECUREBOOT/LOADER_VERIEXEC \ VERIEXEC/BEARSSL \ # MK_*_SUPPORT options which default to "yes" unless their corresponding diff --git a/stand/efi/loader/Makefile b/stand/efi/loader/Makefile index 58c58533ab2e..814bf069796c 100644 --- a/stand/efi/loader/Makefile +++ b/stand/efi/loader/Makefile @@ -81,6 +81,10 @@ HAVE_BCACHE= yes CFLAGS+= -DEFI_STAGING_SIZE=${EFI_STAGING_SIZE} .endif +.if ${MK_LOADER_EFI_SECUREBOOT} != "no" +CFLAGS+= -DEFI_SECUREBOOT +.endif + NEWVERSWHAT= "EFI loader" ${MACHINE} VERSION_FILE= ${.CURDIR}/../loader/version diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c index fb6c97ab73de..62a155599ea2 100644 --- a/stand/efi/loader/main.c +++ b/stand/efi/loader/main.c @@ -963,6 +963,17 @@ main(int argc, CHAR16 *argv[]) */ BS->SetWatchdogTimer(0, 0, 0, NULL); + /* + * Initialize the trusted/forbidden certificates from UEFI. + * They will be later used to verify the manifest(s), + * which should contain hashes of verified files. + * This needs to be initialized before any configuration files + * are loaded. + */ +#ifdef EFI_SECUREBOOT + ve_efi_init(); +#endif + /* * Try and find a good currdev based on the image that was booted. * It might be desirable here to have a short pause to allow falling diff --git a/tools/build/options/WITH_LOADER_EFI_SECUREBOOT b/tools/build/options/WITH_LOADER_EFI_SECUREBOOT new file mode 100644 index 000000000000..6ba0e310448b --- /dev/null +++ b/tools/build/options/WITH_LOADER_EFI_SECUREBOOT @@ -0,0 +1,5 @@ +.\" $FreeBSD$ +Enable building +.Xr loader 8 +with support for verification based on certificates obtained from UEFI. +.Pp From 7fbcfe69e763a89d0d7d58813afea8d2cd857669 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 6 Mar 2019 07:54:29 +0000 Subject: [PATCH 21/93] [ath_hal] [ath_hal_ar9300] ANI fixes and preparation for userland control. * The ani function bitmap was being badly used when determining if a command could be used. In hostap modes only a couple of the ANI control parameters are enabled. * The ani function bitmap was not being reset to HAL_ANI_ALL if transitioning from AP -> STA. * Change mrcCckOff to mrcCck - 1 == on, rather than 1 == off. This matches the API used to set the value from userland via the diagnostic API. * Handle OFDM/CCK noise immunity level commands in ar9300_ani_control(). These will only come from userland and it will go and program the rest of the ANI control parameters with the values in the ANI table. * Ensure all of the ANI parameters can be tweaked at runtime, even if they're disabled. Tested: * carambola2 (AR9331), STA/AP modes --- sys/dev/ath/ath_hal/ah.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index 85ca9e850bae..91f949fa3675 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -893,13 +893,13 @@ typedef struct { } HAL_ANI_STATS; typedef struct { - uint8_t noiseImmunityLevel; /* OFDM */ - uint8_t cckNoiseImmunityLevel; + uint8_t noiseImmunityLevel; /* Global for pre-AR9380; OFDM later*/ + uint8_t cckNoiseImmunityLevel; /* AR9380: CCK specific NI */ uint8_t spurImmunityLevel; uint8_t firstepLevel; uint8_t ofdmWeakSigDetectOff; uint8_t cckWeakSigThreshold; - uint8_t mrcCckOff; + uint8_t mrcCck; /* MRC CCK is enabled */ uint32_t listenTime; /* NB: intentionally ordered so data exported to user space is first */ @@ -958,7 +958,7 @@ typedef struct { */ typedef enum { HAL_ANI_PRESENT = 0, /* is ANI support present */ - HAL_ANI_NOISE_IMMUNITY_LEVEL = 1, /* set level */ + HAL_ANI_NOISE_IMMUNITY_LEVEL = 1, /* set level (global or ofdm) */ HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION = 2, /* enable/disable */ HAL_ANI_CCK_WEAK_SIGNAL_THR = 3, /* enable/disable */ HAL_ANI_FIRSTEP_LEVEL = 4, /* set level */ @@ -966,6 +966,7 @@ typedef enum { HAL_ANI_MODE = 6, /* 0 => manual, 1 => auto (XXX do not change) */ HAL_ANI_PHYERR_RESET = 7, /* reset phy error stats */ HAL_ANI_MRC_CCK = 8, + HAL_ANI_CCK_NOISE_IMMUNITY_LEVEL = 9, /* set level (cck) */ } HAL_ANI_CMD; #define HAL_ANI_ALL 0xffffffff From 28adfbfe13ddc91eda8c1a0c451e192ec2b1650b Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Wed, 6 Mar 2019 07:58:19 +0000 Subject: [PATCH 22/93] [athani] Add a simple tool to list and control ANI parameters. This is a WIP tool I'm using to figure out why ANI is weirdly busted in my home FreeBSD AP/STA setup. Although athstats (mostly) gets the ANI statistics correct, ANI is making the radio deaf it doesn't recover without being disabled. It's very WIP. Tested: * Carambola 2, (AR9331), AP/STA mode. --- tools/tools/ath/Makefile | 2 +- tools/tools/ath/athani/Makefile | 23 ++++ tools/tools/ath/athani/main.c | 226 ++++++++++++++++++++++++++++++++ 3 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 tools/tools/ath/athani/Makefile create mode 100644 tools/tools/ath/athani/main.c diff --git a/tools/tools/ath/Makefile b/tools/tools/ath/Makefile index b17f4c4b2dcc..1b5543909b63 100644 --- a/tools/tools/ath/Makefile +++ b/tools/tools/ath/Makefile @@ -3,6 +3,6 @@ SUBDIR= arcode athdebug athdecode athkey athpoke athprom athrd athregs athalq SUBDIR+= athstats ath_prom_read athradar athaggrstats SUBDIR+= ath_ee_v14_print ath_ee_v4k_print ath_ee_9287_print ath_ee_9300_print -SUBDIR+= athsurvey athratestats athspectral +SUBDIR+= athsurvey athratestats athspectral athani .include diff --git a/tools/tools/ath/athani/Makefile b/tools/tools/ath/athani/Makefile new file mode 100644 index 000000000000..b475a6b0ed63 --- /dev/null +++ b/tools/tools/ath/athani/Makefile @@ -0,0 +1,23 @@ +# $FreeBSD$ + +PROG= athani +MAN= + +CFLAGS+= -I../../../../sys/contrib + +SRCS= main.c + +.include <../Makefile.inc> + +CFLAGS+= -I${.CURDIR}/../common/ +.PATH.c: ${.CURDIR}/../common/ +SRCS+= ctrl.c + +CLEANFILES+= opt_ah.h + +opt_ah.h: + echo "#define AH_DEBUG 1" > opt_ah.h + echo "#define AH_DEBUG_COUNTRY 1" >> opt_ah.h + echo "#define AH_SUPPORT_AR5416 1" >> opt_ah.h + +.include diff --git a/tools/tools/ath/athani/main.c b/tools/tools/ath/athani/main.c new file mode 100644 index 000000000000..e2147091780d --- /dev/null +++ b/tools/tools/ath/athani/main.c @@ -0,0 +1,226 @@ +/*- + * Copyright (c) 2019 Adrian Chadd . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGES. + * + * $FreeBSD$ + */ +#include "diag.h" + +#include "ah.h" +#include "ah_internal.h" + +#include +#include +#include +#include +#include + +#include "../common/ctrl.h" + +/* + * This is a simple wrapper program around the ANI diagnostic interface. + * It is for fetching and setting the live ANI configuration when trying + * to diagnose a noisy environment. + */ + +/* + * HAL_DIAG_ANI_CMD is used to set the ANI configuration. + * HAL_DIAG_ANI_CURRENT is used to fetch the current ANI configuration. + */ + +struct ani_var { + const char *name; + int id; +}; + +static struct ani_var ani_labels[] = { + { "ofdm_noise_immunity_level", 1, }, + { "noise_immunity_level", 1, }, + { "ofdm_weak_signal_detect", 2, }, + { "cck_weak_signal_threshold", 3, }, + { "firstep_level", 4, }, + { "spur_immunity_level", 5, }, + { "mrc_cck", 8, }, + { "cck_noise_immunity_level", 9, }, + { NULL, -1, }, +}; + +static void +usage(void) +{ + fprintf(stderr, "usage: athani [-i interface] [-l]\n"); + fprintf(stderr, " -i: interface\n"); + fprintf(stderr, " -l: list ANI labels\n"); + fprintf(stderr, " If no args are given after flags, the ANI state will be listed.\n"); + fprintf(stderr, " To set, use '