From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C08C4C77B75 for ; Mon, 22 May 2023 14:06:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232988AbjEVOGj (ORCPT ); Mon, 22 May 2023 10:06:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42752 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233151AbjEVOGh (ORCPT ); Mon, 22 May 2023 10:06:37 -0400 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2E980FA for ; Mon, 22 May 2023 07:06:35 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id C3C5B1C0004; Mon, 22 May 2023 14:06:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1684764393; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lFksMzukjU5IJFPkhxwZUOFmyMJnkU2QvIJkyZ8hCYg=; b=ZpK2OZxNhunwfCcMupNhrhBfJ5GRyx7Kc/lKVn+iNnQ3WqgLx1hqyL/bwVxnaeZrQmlIAk rCxbfqe3hA0gUtkijbcS70/WCyr2suOyGHZ0DEbjOwbku5E+6Qhm5X8XTUepv8LPJ9ZDlp s1Pz4uqrin4bwJSAAYUsA/GWhMuCxC8eFjAYtbbYQn+86eyYKkpwbVOOjH4QrTC26HzrDn d4DXfgQivT1WIlDdt+AT93n9+2SRYZX1KZJEraVAOBw+7GjiZXgWMAyIRLavS28ZLwYZ7V mtS833/jmj7xp0Y69D9BOUDs8iUDGD3x8NcvXd7XTNS5SBC9iIy29/3VLPj+3g== Date: Mon, 22 May 2023 16:06:31 +0200 From: Miquel Raynal To: =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= Cc: Richard Weinberger , Vignesh Raghavendra , Andy Gross , Bjorn Andersson , Konrad Dybcio , linux-arm-msm@vger.kernel.org, linux-mtd@lists.infradead.org, =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= , Alexandru Gagniuc , Christian Marangi Subject: Re: [PATCH] mtd: parsers: qcom: deal with partitions names on Netgear WAX218 Message-ID: <20230522160631.3bebb92a@xps-13> In-Reply-To: <20230417133719.16592-1-zajec5@gmail.com> References: <20230417133719.16592-1-zajec5@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi Rafa=C5=82, zajec5@gmail.com wrote on Mon, 17 Apr 2023 15:37:19 +0200: > From: Rafa=C5=82 Mi=C5=82ecki >=20 > Netgear WAX218 has two similar partitions: "rootfs" and "rootfs_1". They > both contain device firmware (kernel + rootfs). Bootloader chooses the > one to boot from depending on the "active_fw" variable. >=20 > The whole mechanism is used for safe firmware upgrades. >=20 > Sadly original bootloader on this device doesn't let know what firmware > it has booted. >=20 > To run system reliably we need to know which kernel has been booted and > mount proper rootfs accordingly. This patch registers currently used > partition using the "firmware" name. Let me try to understand this further: you need to know what kernel has started and use the relevant rootfs, both stored in mtd partitions, so you always mount the "firmware" partition as rootfs by changing the partition name dynamically at boot time. Am I understanding this correctly? > It isn't clear how many devices will need this so just check for a > WAX218 compatible string for now. >=20 > Signed-off-by: Rafa=C5=82 Mi=C5=82ecki > Cc: Alexandru Gagniuc > Cc: Christian Marangi > --- > drivers/mtd/parsers/qcomsmempart.c | 92 +++++++++++++++++++++++++++--- > 1 file changed, 84 insertions(+), 8 deletions(-) >=20 > diff --git a/drivers/mtd/parsers/qcomsmempart.c b/drivers/mtd/parsers/qco= msmempart.c > index 4311b89d8df0..352fb153745c 100644 > --- a/drivers/mtd/parsers/qcomsmempart.c > +++ b/drivers/mtd/parsers/qcomsmempart.c > @@ -54,6 +54,69 @@ struct smem_flash_ptable { > struct smem_flash_pentry pentry[SMEM_FLASH_PTABLE_MAX_PARTS_V4]; > } __packed __aligned(4); > =20 > +/** > + * parse_qcomsmem_get_active_fw - get active firmware index > + * > + * Some devices have active and backup/fallback firmwares. This function= returns index of the active > + * one. It's useful for registering MTD partitions using clear names. > + */ > +static int parse_qcomsmem_get_active_fw(struct mtd_info *mtd, struct sme= m_flash_ptable *ptable) > +{ > + bool found =3D false; > + size_t offset; > + size_t bytes; > + size_t size; > + char *buf; > + char *var; > + int err; > + int i; > + > + if (!of_machine_is_compatible("netgear,wax218")) > + return -EOPNOTSUPP; > + > + /* Find partition with environment data */ > + > + for (i =3D 0; i < le32_to_cpu(ptable->numparts); i++) { > + struct smem_flash_pentry *pentry =3D &ptable->pentry[i]; > + > + if (!strcmp(pentry->name, "0:APPSBLENV")) { > + offset =3D le32_to_cpu(pentry->offset) * mtd->erasesize; > + size =3D le32_to_cpu(pentry->length) * mtd->erasesize; > + found =3D true; > + break; > + } > + } > + if (!found) > + return -ENOENT; > + > + /* Read it */ > + > + buf =3D kcalloc(1, size, GFP_KERNEL); > + if (!buf) > + return -ENOMEM; > + > + err =3D mtd_read(mtd, offset, size, &bytes, buf); > + if ((err && !mtd_is_bitflip(err)) || bytes !=3D size) { > + pr_err("Failed to read environment\n"); > + return -EIO; > + } Why can't we access this information through an nvmem cell thanks to the U-boot env parser? > + > + /* Find & parse entry with active firmware index */ > + > + for (var =3D buf + 4; var < buf + size && *var; var +=3D strlen(var) + = 1) { > + const char *prefix =3D "active_fw=3D"; > + unsigned long idx; > + > + if (strstarts(var, prefix)) { > + err =3D kstrtol(var + strlen(prefix), 0, &idx); > + > + return err ? err : idx; > + } > + } > + > + return -ENOENT; > +} > + > static int parse_qcomsmem_part(struct mtd_info *mtd, > const struct mtd_partition **pparts, > struct mtd_part_parser_data *data) > @@ -64,6 +127,8 @@ static int parse_qcomsmem_part(struct mtd_info *mtd, > struct smem_flash_ptable *ptable; > struct mtd_partition *parts; > char *name, *c; > + int active_fw; > + int fw_idx; > =20 > if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_4K_SECTORS) > && mtd->type =3D=3D MTD_NORFLASH) { > @@ -123,24 +188,35 @@ static int parse_qcomsmem_part(struct mtd_info *mtd, > numparts++; > } > =20 > + active_fw =3D parse_qcomsmem_get_active_fw(mtd, ptable); > + > parts =3D kcalloc(numparts, sizeof(*parts), GFP_KERNEL); > if (!parts) > return -ENOMEM; > =20 > + fw_idx =3D -1; > for (i =3D 0, j =3D 0; i < tmpparts; i++) { > pentry =3D &ptable->pentry[i]; > if (pentry->name[0] =3D=3D '\0') > continue; > =20 > - name =3D kstrdup(pentry->name, GFP_KERNEL); > - if (!name) { > - ret =3D -ENOMEM; > - goto out_free_parts; > - } > + if (active_fw >=3D 0 && strstarts(pentry->name, "rootfs")) { > + name =3D kstrdup(++fw_idx =3D=3D active_fw ? "firmware" : "backup", G= FP_KERNEL); I'm really not a big fan of this logic. Changing dynamically the partition name really sounds dangerous. Does the kernel need to know? Or is it "just" the userspace? Could we imagine another mechanism than the name to carry the information? > + if (!name) { > + ret =3D -ENOMEM; > + goto out_free_parts; > + } > + } else { > + name =3D kstrdup(pentry->name, GFP_KERNEL); > + if (!name) { > + ret =3D -ENOMEM; > + goto out_free_parts; > + } > =20 > - /* Convert name to lower case */ > - for (c =3D name; *c !=3D '\0'; c++) > - *c =3D tolower(*c); > + /* Convert name to lower case */ > + for (c =3D name; *c !=3D '\0'; c++) > + *c =3D tolower(*c); > + } > =20 > parts[j].name =3D name; > parts[j].offset =3D le32_to_cpu(pentry->offset) * mtd->erasesize; Thanks, Miqu=C3=A8l From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EEB49C77B73 for ; Mon, 22 May 2023 14:06:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=iCMGClRFeDmBwQylmtVy1SPUDMbuzNyoZB3xVuEWYak=; b=dvHRv14tfDWV1r uOjw8EvZUGQT/NU5QiiqLlq5bBkn0GMgmnNMI3hxJdaPLHnTW6cUQ+Zl3i4HL7G7sMgdtULUDAYP+ rP6CvagpGvs9lxqYl4horD/V3pyMHa88FN104KeuVLTdiwbJUeAxujvNKQgHHoJ0ON79GGOmaUntk Mo+RA4h7vInQLuPtEZjaObxtJYhaKr/M3guajAN5RW5In+w1F5ChBeo/9ukA4IBQ+4ZHuFfxz8o7c s8E5d90p8nvAyah8m9/q6pexRWT5CgAQDwXeCx4+r27zRGgtAX9KnioDguKf00iL1WUkTIzJC4Kq7 FDR8vAGrBzRsT3hUxd1Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q16BP-006llV-0e; Mon, 22 May 2023 14:06:43 +0000 Received: from relay5-d.mail.gandi.net ([217.70.183.197]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q16BK-006lkI-2l for linux-mtd@lists.infradead.org; Mon, 22 May 2023 14:06:40 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id C3C5B1C0004; Mon, 22 May 2023 14:06:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1684764393; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lFksMzukjU5IJFPkhxwZUOFmyMJnkU2QvIJkyZ8hCYg=; b=ZpK2OZxNhunwfCcMupNhrhBfJ5GRyx7Kc/lKVn+iNnQ3WqgLx1hqyL/bwVxnaeZrQmlIAk rCxbfqe3hA0gUtkijbcS70/WCyr2suOyGHZ0DEbjOwbku5E+6Qhm5X8XTUepv8LPJ9ZDlp s1Pz4uqrin4bwJSAAYUsA/GWhMuCxC8eFjAYtbbYQn+86eyYKkpwbVOOjH4QrTC26HzrDn d4DXfgQivT1WIlDdt+AT93n9+2SRYZX1KZJEraVAOBw+7GjiZXgWMAyIRLavS28ZLwYZ7V mtS833/jmj7xp0Y69D9BOUDs8iUDGD3x8NcvXd7XTNS5SBC9iIy29/3VLPj+3g== Date: Mon, 22 May 2023 16:06:31 +0200 From: Miquel Raynal To: =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= Cc: Richard Weinberger , Vignesh Raghavendra , Andy Gross , Bjorn Andersson , Konrad Dybcio , linux-arm-msm@vger.kernel.org, linux-mtd@lists.infradead.org, =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= , Alexandru Gagniuc , Christian Marangi Subject: Re: [PATCH] mtd: parsers: qcom: deal with partitions names on Netgear WAX218 Message-ID: <20230522160631.3bebb92a@xps-13> In-Reply-To: <20230417133719.16592-1-zajec5@gmail.com> References: <20230417133719.16592-1-zajec5@gmail.com> Organization: Bootlin X-Mailer: Claws Mail 4.0.0 (GTK+ 3.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230522_070639_161990_3409A646 X-CRM114-Status: GOOD ( 34.96 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgUmFmYcWCLAoKemFqZWM1QGdtYWlsLmNvbSB3cm90ZSBvbiBNb24sIDE3IEFwciAyMDIzIDE1 OjM3OjE5ICswMjAwOgoKPiBGcm9tOiBSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+ Cj4gCj4gTmV0Z2VhciBXQVgyMTggaGFzIHR3byBzaW1pbGFyIHBhcnRpdGlvbnM6ICJyb290ZnMi IGFuZCAicm9vdGZzXzEiLiBUaGV5Cj4gYm90aCBjb250YWluIGRldmljZSBmaXJtd2FyZSAoa2Vy bmVsICsgcm9vdGZzKS4gQm9vdGxvYWRlciBjaG9vc2VzIHRoZQo+IG9uZSB0byBib290IGZyb20g ZGVwZW5kaW5nIG9uIHRoZSAiYWN0aXZlX2Z3IiB2YXJpYWJsZS4KPiAKPiBUaGUgd2hvbGUgbWVj aGFuaXNtIGlzIHVzZWQgZm9yIHNhZmUgZmlybXdhcmUgdXBncmFkZXMuCj4gCj4gU2FkbHkgb3Jp Z2luYWwgYm9vdGxvYWRlciBvbiB0aGlzIGRldmljZSBkb2Vzbid0IGxldCBrbm93IHdoYXQgZmly bXdhcmUKPiBpdCBoYXMgYm9vdGVkLgo+IAo+IFRvIHJ1biBzeXN0ZW0gcmVsaWFibHkgd2UgbmVl ZCB0byBrbm93IHdoaWNoIGtlcm5lbCBoYXMgYmVlbiBib290ZWQgYW5kCj4gbW91bnQgcHJvcGVy IHJvb3RmcyBhY2NvcmRpbmdseS4gVGhpcyBwYXRjaCByZWdpc3RlcnMgY3VycmVudGx5IHVzZWQK PiBwYXJ0aXRpb24gdXNpbmcgdGhlICJmaXJtd2FyZSIgbmFtZS4KCkxldCBtZSB0cnkgdG8gdW5k ZXJzdGFuZCB0aGlzIGZ1cnRoZXI6IHlvdSBuZWVkIHRvIGtub3cgd2hhdCBrZXJuZWwgaGFzCnN0 YXJ0ZWQgYW5kIHVzZSB0aGUgcmVsZXZhbnQgcm9vdGZzLCBib3RoIHN0b3JlZCBpbiBtdGQgcGFy dGl0aW9ucywgc28KeW91IGFsd2F5cyBtb3VudCB0aGUgImZpcm13YXJlIiBwYXJ0aXRpb24gYXMg cm9vdGZzIGJ5IGNoYW5naW5nIHRoZQpwYXJ0aXRpb24gbmFtZSBkeW5hbWljYWxseSBhdCBib290 IHRpbWUuIEFtIEkgdW5kZXJzdGFuZGluZyB0aGlzCmNvcnJlY3RseT8KCj4gSXQgaXNuJ3QgY2xl YXIgaG93IG1hbnkgZGV2aWNlcyB3aWxsIG5lZWQgdGhpcyBzbyBqdXN0IGNoZWNrIGZvciBhCj4g V0FYMjE4IGNvbXBhdGlibGUgc3RyaW5nIGZvciBub3cuCj4gCj4gU2lnbmVkLW9mZi1ieTogUmFm YcWCIE1pxYJlY2tpIDxyYWZhbEBtaWxlY2tpLnBsPgo+IENjOiBBbGV4YW5kcnUgR2Fnbml1YyA8 bXIubnVrZS5tZUBnbWFpbC5jb20+Cj4gQ2M6IENocmlzdGlhbiBNYXJhbmdpIDxhbnN1ZWxzbXRo QGdtYWlsLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9tdGQvcGFyc2Vycy9xY29tc21lbXBhcnQuYyB8 IDkyICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQo+ICAxIGZpbGUgY2hhbmdlZCwgODQg aW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvcGFyc2Vycy9xY29tc21lbXBhcnQuYyBiL2RyaXZlcnMvbXRkL3BhcnNlcnMvcWNvbXNtZW1w YXJ0LmMKPiBpbmRleCA0MzExYjg5ZDhkZjAuLjM1MmZiMTUzNzQ1YyAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL210ZC9wYXJzZXJzL3Fjb21zbWVtcGFydC5jCj4gKysrIGIvZHJpdmVycy9tdGQvcGFy c2Vycy9xY29tc21lbXBhcnQuYwo+IEBAIC01NCw2ICs1NCw2OSBAQCBzdHJ1Y3Qgc21lbV9mbGFz aF9wdGFibGUgewo+ICAJc3RydWN0IHNtZW1fZmxhc2hfcGVudHJ5IHBlbnRyeVtTTUVNX0ZMQVNI X1BUQUJMRV9NQVhfUEFSVFNfVjRdOwo+ICB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKPiAgCj4g Ky8qKgo+ICsgKiBwYXJzZV9xY29tc21lbV9nZXRfYWN0aXZlX2Z3IC0gZ2V0IGFjdGl2ZSBmaXJt d2FyZSBpbmRleAo+ICsgKgo+ICsgKiBTb21lIGRldmljZXMgaGF2ZSBhY3RpdmUgYW5kIGJhY2t1 cC9mYWxsYmFjayBmaXJtd2FyZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbmRleCBvZiB0aGUg YWN0aXZlCj4gKyAqIG9uZS4gSXQncyB1c2VmdWwgZm9yIHJlZ2lzdGVyaW5nIE1URCBwYXJ0aXRp b25zIHVzaW5nIGNsZWFyIG5hbWVzLgo+ICsgKi8KPiArc3RhdGljIGludCBwYXJzZV9xY29tc21l bV9nZXRfYWN0aXZlX2Z3KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qgc21lbV9mbGFzaF9w dGFibGUgKnB0YWJsZSkKPiArewo+ICsJYm9vbCBmb3VuZCA9IGZhbHNlOwo+ICsJc2l6ZV90IG9m ZnNldDsKPiArCXNpemVfdCBieXRlczsKPiArCXNpemVfdCBzaXplOwo+ICsJY2hhciAqYnVmOwo+ ICsJY2hhciAqdmFyOwo+ICsJaW50IGVycjsKPiArCWludCBpOwo+ICsKPiArCWlmICghb2ZfbWFj aGluZV9pc19jb21wYXRpYmxlKCJuZXRnZWFyLHdheDIxOCIpKQo+ICsJCXJldHVybiAtRU9QTk9U U1VQUDsKPiArCj4gKwkvKiBGaW5kIHBhcnRpdGlvbiB3aXRoIGVudmlyb25tZW50IGRhdGEgKi8K PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbGUzMl90b19jcHUocHRhYmxlLT5udW1wYXJ0cyk7IGkr Kykgewo+ICsJCXN0cnVjdCBzbWVtX2ZsYXNoX3BlbnRyeSAqcGVudHJ5ID0gJnB0YWJsZS0+cGVu dHJ5W2ldOwo+ICsKPiArCQlpZiAoIXN0cmNtcChwZW50cnktPm5hbWUsICIwOkFQUFNCTEVOViIp KSB7Cj4gKwkJCW9mZnNldCA9IGxlMzJfdG9fY3B1KHBlbnRyeS0+b2Zmc2V0KSAqIG10ZC0+ZXJh c2VzaXplOwo+ICsJCQlzaXplID0gbGUzMl90b19jcHUocGVudHJ5LT5sZW5ndGgpICogbXRkLT5l cmFzZXNpemU7Cj4gKwkJCWZvdW5kID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ ICsJaWYgKCFmb3VuZCkKPiArCQlyZXR1cm4gLUVOT0VOVDsKPiArCj4gKwkvKiBSZWFkIGl0ICov Cj4gKwo+ICsJYnVmID0ga2NhbGxvYygxLCBzaXplLCBHRlBfS0VSTkVMKTsKPiArCWlmICghYnVm KQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCWVyciA9IG10ZF9yZWFkKG10ZCwgb2Zmc2V0 LCBzaXplLCAmYnl0ZXMsIGJ1Zik7Cj4gKwlpZiAoKGVyciAmJiAhbXRkX2lzX2JpdGZsaXAoZXJy KSkgfHwgYnl0ZXMgIT0gc2l6ZSkgewo+ICsJCXByX2VycigiRmFpbGVkIHRvIHJlYWQgZW52aXJv bm1lbnRcbiIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQoKV2h5IGNhbid0IHdlIGFjY2VzcyB0 aGlzIGluZm9ybWF0aW9uIHRocm91Z2ggYW4gbnZtZW0gY2VsbCB0aGFua3MgdG8KdGhlIFUtYm9v dCBlbnYgcGFyc2VyPwoKPiArCj4gKwkvKiBGaW5kICYgcGFyc2UgZW50cnkgd2l0aCBhY3RpdmUg ZmlybXdhcmUgaW5kZXggKi8KPiArCj4gKwlmb3IgKHZhciA9IGJ1ZiArIDQ7IHZhciA8IGJ1ZiAr IHNpemUgJiYgKnZhcjsgdmFyICs9IHN0cmxlbih2YXIpICsgMSkgewo+ICsJCWNvbnN0IGNoYXIg KnByZWZpeCA9ICJhY3RpdmVfZnc9IjsKPiArCQl1bnNpZ25lZCBsb25nIGlkeDsKPiArCj4gKwkJ aWYgKHN0cnN0YXJ0cyh2YXIsIHByZWZpeCkpIHsKPiArCQkJZXJyID0ga3N0cnRvbCh2YXIgKyBz dHJsZW4ocHJlZml4KSwgMCwgJmlkeCk7Cj4gKwo+ICsJCQlyZXR1cm4gZXJyID8gZXJyIDogaWR4 Owo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gLUVOT0VOVDsKPiArfQo+ICsKPiAgc3RhdGlj IGludCBwYXJzZV9xY29tc21lbV9wYXJ0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+ICAJCQkgICAg ICAgY29uc3Qgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsCj4gIAkJCSAgICAgICBzdHJ1 Y3QgbXRkX3BhcnRfcGFyc2VyX2RhdGEgKmRhdGEpCj4gQEAgLTY0LDYgKzEyNyw4IEBAIHN0YXRp YyBpbnQgcGFyc2VfcWNvbXNtZW1fcGFydChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKPiAgCXN0cnVj dCBzbWVtX2ZsYXNoX3B0YWJsZSAqcHRhYmxlOwo+ICAJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBh cnRzOwo+ICAJY2hhciAqbmFtZSwgKmM7Cj4gKwlpbnQgYWN0aXZlX2Z3Owo+ICsJaW50IGZ3X2lk eDsKPiAgCj4gIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfTVREX1NQSV9OT1JfVVNFXzRLX1NFQ1RP UlMpCj4gIAkJCSYmIG10ZC0+dHlwZSA9PSBNVERfTk9SRkxBU0gpIHsKPiBAQCAtMTIzLDI0ICsx ODgsMzUgQEAgc3RhdGljIGludCBwYXJzZV9xY29tc21lbV9wYXJ0KHN0cnVjdCBtdGRfaW5mbyAq bXRkLAo+ICAJCQludW1wYXJ0cysrOwo+ICAJfQo+ICAKPiArCWFjdGl2ZV9mdyA9IHBhcnNlX3Fj b21zbWVtX2dldF9hY3RpdmVfZncobXRkLCBwdGFibGUpOwo+ICsKPiAgCXBhcnRzID0ga2NhbGxv YyhudW1wYXJ0cywgc2l6ZW9mKCpwYXJ0cyksIEdGUF9LRVJORUwpOwo+ICAJaWYgKCFwYXJ0cykK PiAgCQlyZXR1cm4gLUVOT01FTTsKPiAgCj4gKwlmd19pZHggPSAtMTsKPiAgCWZvciAoaSA9IDAs IGogPSAwOyBpIDwgdG1wcGFydHM7IGkrKykgewo+ICAJCXBlbnRyeSA9ICZwdGFibGUtPnBlbnRy eVtpXTsKPiAgCQlpZiAocGVudHJ5LT5uYW1lWzBdID09ICdcMCcpCj4gIAkJCWNvbnRpbnVlOwo+ ICAKPiAtCQluYW1lID0ga3N0cmR1cChwZW50cnktPm5hbWUsIEdGUF9LRVJORUwpOwo+IC0JCWlm ICghbmFtZSkgewo+IC0JCQlyZXQgPSAtRU5PTUVNOwo+IC0JCQlnb3RvIG91dF9mcmVlX3BhcnRz Owo+IC0JCX0KPiArCQlpZiAoYWN0aXZlX2Z3ID49IDAgJiYgc3Ryc3RhcnRzKHBlbnRyeS0+bmFt ZSwgInJvb3RmcyIpKSB7Cj4gKwkJCW5hbWUgPSBrc3RyZHVwKCsrZndfaWR4ID09IGFjdGl2ZV9m dyA/ICJmaXJtd2FyZSIgOiAiYmFja3VwIiwgR0ZQX0tFUk5FTCk7CgpJJ20gcmVhbGx5IG5vdCBh IGJpZyBmYW4gb2YgdGhpcyBsb2dpYy4KCkNoYW5naW5nIGR5bmFtaWNhbGx5IHRoZSBwYXJ0aXRp b24gbmFtZSByZWFsbHkgc291bmRzIGRhbmdlcm91cy4KCkRvZXMgdGhlIGtlcm5lbCBuZWVkIHRv IGtub3c/IE9yIGlzIGl0ICJqdXN0IiB0aGUgdXNlcnNwYWNlPyBDb3VsZCB3ZQppbWFnaW5lIGFu b3RoZXIgbWVjaGFuaXNtIHRoYW4gdGhlIG5hbWUgdG8gY2FycnkgdGhlIGluZm9ybWF0aW9uPwoK PiArCQkJaWYgKCFuYW1lKSB7Cj4gKwkJCQlyZXQgPSAtRU5PTUVNOwo+ICsJCQkJZ290byBvdXRf ZnJlZV9wYXJ0czsKPiArCQkJfQo+ICsJCX0gZWxzZSB7Cj4gKwkJCW5hbWUgPSBrc3RyZHVwKHBl bnRyeS0+bmFtZSwgR0ZQX0tFUk5FTCk7Cj4gKwkJCWlmICghbmFtZSkgewo+ICsJCQkJcmV0ID0g LUVOT01FTTsKPiArCQkJCWdvdG8gb3V0X2ZyZWVfcGFydHM7Cj4gKwkJCX0KPiAgCj4gLQkJLyog Q29udmVydCBuYW1lIHRvIGxvd2VyIGNhc2UgKi8KPiAtCQlmb3IgKGMgPSBuYW1lOyAqYyAhPSAn XDAnOyBjKyspCj4gLQkJCSpjID0gdG9sb3dlcigqYyk7Cj4gKwkJCS8qIENvbnZlcnQgbmFtZSB0 byBsb3dlciBjYXNlICovCj4gKwkJCWZvciAoYyA9IG5hbWU7ICpjICE9ICdcMCc7IGMrKykKPiAr CQkJCSpjID0gdG9sb3dlcigqYyk7Cj4gKwkJfQo+ICAKPiAgCQlwYXJ0c1tqXS5uYW1lID0gbmFt ZTsKPiAgCQlwYXJ0c1tqXS5vZmZzZXQgPSBsZTMyX3RvX2NwdShwZW50cnktPm9mZnNldCkgKiBt dGQtPmVyYXNlc2l6ZTsKCgpUaGFua3MsCk1pcXXDqGwKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eCBNVEQgZGlzY3Vzc2lvbiBtYWls aW5nIGxpc3QKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1tdGQvCg==