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 68BADC38141 for ; Fri, 20 Jan 2023 17:05:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230298AbjATRFH (ORCPT ); Fri, 20 Jan 2023 12:05:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229556AbjATRFE (ORCPT ); Fri, 20 Jan 2023 12:05:04 -0500 Received: from wout5-smtp.messagingengine.com (wout5-smtp.messagingengine.com [64.147.123.21]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E94D7495C; Fri, 20 Jan 2023 09:05:03 -0800 (PST) Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailout.west.internal (Postfix) with ESMTP id 5D3D33200A46; Fri, 20 Jan 2023 12:05:01 -0500 (EST) Received: from imap51 ([10.202.2.101]) by compute6.internal (MEProxy); Fri, 20 Jan 2023 12:05:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arndb.de; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm2; t=1674234300; x= 1674320700; bh=YXir1cBKVSIl8ncpYdIhv313q6EHddedfJlIGmxdQ48=; b=j 0K/SidyWGRubZXkXPnrsLz5CVySWPQULowlDXUz6HY1MaFN/D4LsuOcGTMy6oAOy 9pUHEBw4fLHSEJP3rwO4DFW80gEVGwvGsFf4R1Oo+Ny8/D2ySBhbXJK89Fu89kPg 2oJZKpmjpghLVS3RQP4p0IZqG5FGtcRXtJdFc5AvqIJIOZELmbDiQp8zohlOf3wH BQpy2ZcIg/NRxqJiaEjDsck0mwp6xbq4mGb7YeGnvMcDTI8+byRSDyh0aFQfkrC5 MFwTmadSGVVhJYOpxLEUxwpXDi0gVBJaZzusUpGn6r2flXD9fcaZrdFaBWuwMzPV PAStBxMywbMPUrSi8F2kg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1674234300; x= 1674320700; bh=YXir1cBKVSIl8ncpYdIhv313q6EHddedfJlIGmxdQ48=; b=C MknTjwegB1X/8av4QkyxN7bM1FGuYJSuE/HQruTFttXJzE1w4SBCy3HDpkYolOGs iE4FZjdZGMinnYysNs+5GRdq0b79kZ7k95UavTuRRVbknHLqyXjEE+97ZnxN4+Nm Kzt62o7tq+a65P9Non0UZfyHxDGs94Ye+Y+l4QK+Ard1sd1Wrp4T/QF+v8Ke2jsZ MuAZEL4o1beL80y3H8zaj5UbjX5Eo/fb89aYQH57tgOccVzrUno0y5Dbf17x3cyW /Tsis+X6GJsl35eXxyc8nwUzbgG11zPmYkVrMCptR83Sy8d3fBNZWMiAVJ2hVsYJ Sxz3eZWy/qup6wBeV1ugg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrudduvddgleelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtgfesthhqredtreerjeenucfhrhhomhepfdet rhhnugcuuegvrhhgmhgrnhhnfdcuoegrrhhnugesrghrnhgusgdruggvqeenucggtffrrg htthgvrhhnpeegfeejhedvledvffeijeeijeeivddvhfeliedvleevheejleetgedukedt gfejveenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe grrhhnugesrghrnhgusgdruggv X-ME-Proxy: Feedback-ID: i56a14606:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id AC226B60086; Fri, 20 Jan 2023 12:04:58 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.9.0-alpha0-85-gd6d859e0cf-fm-20230116.001-gd6d859e0 Mime-Version: 1.0 Message-Id: In-Reply-To: <20230113054807.GA23179@lst.de> References: <20230106185526.260163-1-prabhakar.mahadev-lad.rj@bp.renesas.com> <20230106185526.260163-2-prabhakar.mahadev-lad.rj@bp.renesas.com> <6f7d06ef-d74d-4dfc-9b77-6ae83e0d7816@app.fastmail.com> <9017adf0-acd4-4c43-8aea-3579b214b477@app.fastmail.com> <45d6eb0c-cbe3-4a83-aa12-3483638473ae@app.fastmail.com> <20230110070144.GG10289@lst.de> <02988e70-b099-46fd-b260-2d537c50543a@app.fastmail.com> <20230113054807.GA23179@lst.de> Date: Fri, 20 Jan 2023 18:04:37 +0100 From: "Arnd Bergmann" To: "Christoph Hellwig" Cc: Prabhakar , "Conor.Dooley" , "Geert Uytterhoeven" , =?UTF-8?Q?Heiko_St=C3=BCbner?= , guoren , "Andrew Jones" , "Paul Walmsley" , "Palmer Dabbelt" , "Albert Ou" , "open list:RISC-V ARCHITECTURE" , "open list" , devicetree@vger.kernel.org, Linux-Renesas , "Lad, Prabhakar" , "Philipp Tomsich" , "Nathan Chancellor" , "Atish Patra" , "Anup Patel" , "Tsukasa OI" , "Jisheng Zhang" , "Mayuresh Chitale" , "Will Deacon" Subject: Re: [RFC PATCH v6 1/6] riscv: mm: dma-noncoherent: Switch using function pointers for cache management Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jan 13, 2023, at 06:48, Christoph Hellwig wrote: > On Tue, Jan 10, 2023 at 04:03:06PM +0100, Arnd Bergmann wrote: >> I looked at all the implementations now and put them in a table[1] >> to see what the differences are. The only bit that I think needs >> discussion is the dma_sync_single_for_device(DMA_FROM_DEVICE) op >> that I mentioned above. I see that arm64, csky, powerpc, riscv >> and parisc all write out at least partical cache lines first to >> avoid losing dirty data in the part that is not written by the >> device[2][3], while the other ones don't[4].=20 > > I'm tempted to declare [4] buggy until proof of the inverse. Having looked at this some more, I see that the powerpc version is a bit problematic here as well: this one flushes the partial cache lines before and after the DMA transfer, while only invalidating the full cache lines. If a partical cache line gets written to by the CPU while the buffer is owned by the device, this means that the received data from the device is immediately overwritten by the second flush. The arm64 and riscv behavior of doing a flush before and an invalidate after the DMA seems a bit more appropriate, as that ends up keeping the DMA data but discarding anything written by the CPU. Obviously there is no winning either way if the same cache line gets written by both CPU and device, I'm just trying to figure out what behavior we actually want here. The best I can think of so far is: - flush the partial cache lines before the DMA, as powerpc does, and just invalidate the full cache lines - only invalidate but not clean/flush after the DMA. This is the arm64 behavior - warn when flushing partial cache lines if dma_debug is enabled. >> I also see that at least arc, arm, mips and riscv all want >> CPU specific cache management operations to be registered >> at boot time. While Russell had some concerns about your >> suggestion to generalize the arm version, we could start >> by moving the abstracted riscv version into >> kernel/dma/direct.c and make sure it can be shared with >> at least mips and arc, provided that we can agree on the >> DMA_FROM_DEVICE behavior. > > Yes, I'd really like to start out with a common version and then > move bits over. There's also some interesting bits about handling > highmem for architectures that needs virtual addresss for flushing > that might be worth sharing, too. > > Th=D1=96s should be a new file in kernel/dma/ as it's not only used by > dma-direct but also by dma-iommu, and to keep the code nicely > separated. > > Can you give it a go? I started this at the beginning of the week but couldn't finish it at all, but still plan to get back to it next week. Aside from the question for how to handle flush vs invalidate on DMA_FROM_DEVICE, I'm still trying to figure out how to best handle highmem with architecture specific cache management operations. The easy approach would be to leave that up to the architecture, passing only a physical address to the flush function. A nicer interface might be to move the loop over highmem pages out into common code, flush lowmem pages by virtual addresss, and have a separate callback for highmem pages that takes a page pointer, like struct dma_cache_ops { void (*dma_cache_wback_inv)(void *start, unsigned long sz); void (*dma_cache_inv)(void *start, unsigned long sz); void (*dma_cache_wback)(void *start, unsigned long sz); #ifdef CONFIG_HIGHMEM void (*dma_cache_wback_inv_high_page)(struct page *, size_t star= t, unsigned long sz); void (*dma_cache_inv_high_page)(struct page *, size_t start, uns= igned long sz); void (*dma_cache_wback_high_page)(struct page *, size_t start, u= nsigned long sz); #endif }; Let me know if you have a preference here, before I spend too much time on something we don't want in the end. Arnd 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 6D701C25B4E for ; Fri, 20 Jan 2023 17:11:39 +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:Subject:Cc:To:From:Date:References: In-Reply-To:Message-Id:Mime-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=KBJKTrPNBXnnYfVFaqUZYGZPGiBq1KOgoyFs8YDCQhE=; b=R6aaxWVlh7U2YH XsIvUJ7e8C6sD8OAEWH3oQeQEIZ9QGHK7d3yz6XCYrRTd84sYMKLqyhVcjNgJCa7lxAPqwWISg745 /9WkBNiffrMqc+LFaxA9MWtfH1pZkpqOW6EFcbkUHdTCdaPmt6AuvM+9F+uURluCPXaHCk36KGgh6 Ne2ASgubM3narPQtGVATAogJ5ypPdAdR7hti4qHMj5a+o8R6FYD722VlmhHW4dsGOaCTpctTKtxZX 2+qq0FZdFJHu8LLMFEPTMHbRgiNc5mgmjIhJLHcUd1Y14Y2To1BW9+ejQetxgPOJJ3tQQUBj//Sc1 wbqS+u0z2F42srAyITog==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pIuvH-00BSYB-O0; Fri, 20 Jan 2023 17:11:27 +0000 Received: from wout5-smtp.messagingengine.com ([64.147.123.21]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pIup9-00BPNY-Hf for linux-riscv@lists.infradead.org; Fri, 20 Jan 2023 17:05:09 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailout.west.internal (Postfix) with ESMTP id 5D3D33200A46; Fri, 20 Jan 2023 12:05:01 -0500 (EST) Received: from imap51 ([10.202.2.101]) by compute6.internal (MEProxy); Fri, 20 Jan 2023 12:05:03 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arndb.de; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm2; t=1674234300; x= 1674320700; bh=YXir1cBKVSIl8ncpYdIhv313q6EHddedfJlIGmxdQ48=; b=j 0K/SidyWGRubZXkXPnrsLz5CVySWPQULowlDXUz6HY1MaFN/D4LsuOcGTMy6oAOy 9pUHEBw4fLHSEJP3rwO4DFW80gEVGwvGsFf4R1Oo+Ny8/D2ySBhbXJK89Fu89kPg 2oJZKpmjpghLVS3RQP4p0IZqG5FGtcRXtJdFc5AvqIJIOZELmbDiQp8zohlOf3wH BQpy2ZcIg/NRxqJiaEjDsck0mwp6xbq4mGb7YeGnvMcDTI8+byRSDyh0aFQfkrC5 MFwTmadSGVVhJYOpxLEUxwpXDi0gVBJaZzusUpGn6r2flXD9fcaZrdFaBWuwMzPV PAStBxMywbMPUrSi8F2kg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1674234300; x= 1674320700; bh=YXir1cBKVSIl8ncpYdIhv313q6EHddedfJlIGmxdQ48=; b=C MknTjwegB1X/8av4QkyxN7bM1FGuYJSuE/HQruTFttXJzE1w4SBCy3HDpkYolOGs iE4FZjdZGMinnYysNs+5GRdq0b79kZ7k95UavTuRRVbknHLqyXjEE+97ZnxN4+Nm Kzt62o7tq+a65P9Non0UZfyHxDGs94Ye+Y+l4QK+Ard1sd1Wrp4T/QF+v8Ke2jsZ MuAZEL4o1beL80y3H8zaj5UbjX5Eo/fb89aYQH57tgOccVzrUno0y5Dbf17x3cyW /Tsis+X6GJsl35eXxyc8nwUzbgG11zPmYkVrMCptR83Sy8d3fBNZWMiAVJ2hVsYJ Sxz3eZWy/qup6wBeV1ugg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrudduvddgleelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtgfesthhqredtreerjeenucfhrhhomhepfdet rhhnugcuuegvrhhgmhgrnhhnfdcuoegrrhhnugesrghrnhgusgdruggvqeenucggtffrrg htthgvrhhnpeegfeejhedvledvffeijeeijeeivddvhfeliedvleevheejleetgedukedt gfejveenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe grrhhnugesrghrnhgusgdruggv X-ME-Proxy: Feedback-ID: i56a14606:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id AC226B60086; Fri, 20 Jan 2023 12:04:58 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.9.0-alpha0-85-gd6d859e0cf-fm-20230116.001-gd6d859e0 Mime-Version: 1.0 Message-Id: In-Reply-To: <20230113054807.GA23179@lst.de> References: <20230106185526.260163-1-prabhakar.mahadev-lad.rj@bp.renesas.com> <20230106185526.260163-2-prabhakar.mahadev-lad.rj@bp.renesas.com> <6f7d06ef-d74d-4dfc-9b77-6ae83e0d7816@app.fastmail.com> <9017adf0-acd4-4c43-8aea-3579b214b477@app.fastmail.com> <45d6eb0c-cbe3-4a83-aa12-3483638473ae@app.fastmail.com> <20230110070144.GG10289@lst.de> <02988e70-b099-46fd-b260-2d537c50543a@app.fastmail.com> <20230113054807.GA23179@lst.de> Date: Fri, 20 Jan 2023 18:04:37 +0100 From: "Arnd Bergmann" To: "Christoph Hellwig" Cc: Prabhakar , "Conor.Dooley" , "Geert Uytterhoeven" , =?UTF-8?Q?Heiko_St=C3=BCbner?= , guoren , "Andrew Jones" , "Paul Walmsley" , "Palmer Dabbelt" , "Albert Ou" , "open list:RISC-V ARCHITECTURE" , "open list" , devicetree@vger.kernel.org, Linux-Renesas , "Lad, Prabhakar" , "Philipp Tomsich" , "Nathan Chancellor" , "Atish Patra" , "Anup Patel" , "Tsukasa OI" , "Jisheng Zhang" , "Mayuresh Chitale" , "Will Deacon" Subject: Re: [RFC PATCH v6 1/6] riscv: mm: dma-noncoherent: Switch using function pointers for cache management X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230120_090507_696002_7273D167 X-CRM114-Status: GOOD ( 31.23 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gRnJpLCBKYW4gMTMsIDIwMjMsIGF0IDA2OjQ4LCBDaHJpc3RvcGggSGVsbHdpZyB3cm90ZToK PiBPbiBUdWUsIEphbiAxMCwgMjAyMyBhdCAwNDowMzowNlBNICswMTAwLCBBcm5kIEJlcmdtYW5u IHdyb3RlOgo+PiBJIGxvb2tlZCBhdCBhbGwgdGhlIGltcGxlbWVudGF0aW9ucyBub3cgYW5kIHB1 dCB0aGVtIGluIGEgdGFibGVbMV0KPj4gdG8gc2VlIHdoYXQgdGhlIGRpZmZlcmVuY2VzIGFyZS4g VGhlIG9ubHkgYml0IHRoYXQgSSB0aGluayBuZWVkcwo+PiBkaXNjdXNzaW9uIGlzIHRoZSBkbWFf c3luY19zaW5nbGVfZm9yX2RldmljZShETUFfRlJPTV9ERVZJQ0UpIG9wCj4+IHRoYXQgSSBtZW50 aW9uZWQgYWJvdmUuIEkgc2VlIHRoYXQgYXJtNjQsIGNza3ksIHBvd2VycGMsIHJpc2N2Cj4+IGFu ZCBwYXJpc2MgYWxsIHdyaXRlIG91dCBhdCBsZWFzdCBwYXJ0aWNhbCBjYWNoZSBsaW5lcyBmaXJz dCB0bwo+PiBhdm9pZCBsb3NpbmcgZGlydHkgZGF0YSBpbiB0aGUgcGFydCB0aGF0IGlzIG5vdCB3 cml0dGVuIGJ5IHRoZQo+PiBkZXZpY2VbMl1bM10sIHdoaWxlIHRoZSBvdGhlciBvbmVzIGRvbid0 WzRdLiAKPgo+IEknbSB0ZW1wdGVkIHRvIGRlY2xhcmUgWzRdIGJ1Z2d5IHVudGlsIHByb29mIG9m IHRoZSBpbnZlcnNlLgoKSGF2aW5nIGxvb2tlZCBhdCB0aGlzIHNvbWUgbW9yZSwgSSBzZWUgdGhh dCB0aGUgcG93ZXJwYwp2ZXJzaW9uIGlzIGEgYml0IHByb2JsZW1hdGljIGhlcmUgYXMgd2VsbDog dGhpcyBvbmUKZmx1c2hlcyB0aGUgcGFydGlhbCBjYWNoZSBsaW5lcyBiZWZvcmUgYW5kIGFmdGVy IHRoZQpETUEgdHJhbnNmZXIsIHdoaWxlIG9ubHkgaW52YWxpZGF0aW5nIHRoZSBmdWxsCmNhY2hl IGxpbmVzLiBJZiBhIHBhcnRpY2FsIGNhY2hlIGxpbmUgZ2V0cyB3cml0dGVuCnRvIGJ5IHRoZSBD UFUgd2hpbGUgdGhlIGJ1ZmZlciBpcyBvd25lZCBieSB0aGUgZGV2aWNlLAp0aGlzIG1lYW5zIHRo YXQgdGhlIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgZGV2aWNlIGlzCmltbWVkaWF0ZWx5IG92ZXJ3 cml0dGVuIGJ5IHRoZSBzZWNvbmQgZmx1c2guCgpUaGUgYXJtNjQgYW5kIHJpc2N2IGJlaGF2aW9y IG9mIGRvaW5nIGEgZmx1c2ggYmVmb3JlCmFuZCBhbiBpbnZhbGlkYXRlIGFmdGVyIHRoZSBETUEg c2VlbXMgYSBiaXQgbW9yZQphcHByb3ByaWF0ZSwgYXMgdGhhdCBlbmRzIHVwIGtlZXBpbmcgdGhl IERNQQpkYXRhIGJ1dCBkaXNjYXJkaW5nIGFueXRoaW5nIHdyaXR0ZW4gYnkgdGhlIENQVS4KCk9i dmlvdXNseSB0aGVyZSBpcyBubyB3aW5uaW5nIGVpdGhlciB3YXkgaWYgdGhlIHNhbWUKY2FjaGUg bGluZSBnZXRzIHdyaXR0ZW4gYnkgYm90aCBDUFUgYW5kIGRldmljZSwgSSdtCmp1c3QgdHJ5aW5n IHRvIGZpZ3VyZSBvdXQgd2hhdCBiZWhhdmlvciB3ZSBhY3R1YWxseQp3YW50IGhlcmUuCgpUaGUg YmVzdCBJIGNhbiB0aGluayBvZiBzbyBmYXIgaXM6CgotIGZsdXNoIHRoZSBwYXJ0aWFsIGNhY2hl IGxpbmVzIGJlZm9yZSB0aGUgRE1BLAogIGFzIHBvd2VycGMgZG9lcywgYW5kIGp1c3QgaW52YWxp ZGF0ZSB0aGUgZnVsbAogIGNhY2hlIGxpbmVzCgotIG9ubHkgaW52YWxpZGF0ZSBidXQgbm90IGNs ZWFuL2ZsdXNoIGFmdGVyIHRoZQogIERNQS4gVGhpcyBpcyB0aGUgYXJtNjQgYmVoYXZpb3IKCi0g d2FybiB3aGVuIGZsdXNoaW5nIHBhcnRpYWwgY2FjaGUgbGluZXMKICBpZiBkbWFfZGVidWcgaXMg ZW5hYmxlZC4KCj4+IEkgYWxzbyBzZWUgdGhhdCBhdCBsZWFzdCBhcmMsIGFybSwgbWlwcyBhbmQg cmlzY3YgYWxsIHdhbnQKPj4gQ1BVIHNwZWNpZmljIGNhY2hlIG1hbmFnZW1lbnQgb3BlcmF0aW9u cyB0byBiZSByZWdpc3RlcmVkCj4+IGF0IGJvb3QgdGltZS4gV2hpbGUgUnVzc2VsbCBoYWQgc29t ZSBjb25jZXJucyBhYm91dCB5b3VyCj4+IHN1Z2dlc3Rpb24gdG8gZ2VuZXJhbGl6ZSB0aGUgYXJt IHZlcnNpb24sIHdlIGNvdWxkIHN0YXJ0Cj4+IGJ5IG1vdmluZyB0aGUgYWJzdHJhY3RlZCByaXNj diB2ZXJzaW9uIGludG8KPj4ga2VybmVsL2RtYS9kaXJlY3QuYyBhbmQgbWFrZSBzdXJlIGl0IGNh biBiZSBzaGFyZWQgd2l0aAo+PiBhdCBsZWFzdCBtaXBzIGFuZCBhcmMsIHByb3ZpZGVkIHRoYXQg d2UgY2FuIGFncmVlIG9uIHRoZQo+PiBETUFfRlJPTV9ERVZJQ0UgYmVoYXZpb3IuCj4KPiBZZXMs IEknZCByZWFsbHkgbGlrZSB0byBzdGFydCBvdXQgd2l0aCBhIGNvbW1vbiB2ZXJzaW9uIGFuZCB0 aGVuCj4gbW92ZSBiaXRzIG92ZXIuICBUaGVyZSdzIGFsc28gc29tZSBpbnRlcmVzdGluZyBiaXRz IGFib3V0IGhhbmRsaW5nCj4gaGlnaG1lbSBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IG5lZWRzIHZp cnR1YWwgYWRkcmVzc3MgZm9yIGZsdXNoaW5nCj4gdGhhdCBtaWdodCBiZSB3b3J0aCBzaGFyaW5n LCB0b28uCj4KPiBUaNGWcyBzaG91bGQgYmUgYSBuZXcgZmlsZSBpbiBrZXJuZWwvZG1hLyBhcyBp dCdzIG5vdCBvbmx5IHVzZWQgYnkKPiBkbWEtZGlyZWN0IGJ1dCBhbHNvIGJ5IGRtYS1pb21tdSwg YW5kIHRvIGtlZXAgdGhlIGNvZGUgbmljZWx5Cj4gc2VwYXJhdGVkLgo+Cj4gQ2FuIHlvdSBnaXZl IGl0IGEgZ28/CgpJIHN0YXJ0ZWQgdGhpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3ZWVrIGJ1 dCBjb3VsZG4ndApmaW5pc2ggaXQgYXQgYWxsLCBidXQgc3RpbGwgcGxhbiB0byBnZXQgYmFjayB0 byBpdApuZXh0IHdlZWsuCgpBc2lkZSBmcm9tIHRoZSBxdWVzdGlvbiBmb3IgaG93IHRvIGhhbmRs ZSBmbHVzaCB2cyBpbnZhbGlkYXRlCm9uIERNQV9GUk9NX0RFVklDRSwgSSdtIHN0aWxsIHRyeWlu ZyB0byBmaWd1cmUgb3V0IGhvdyB0bwpiZXN0IGhhbmRsZSBoaWdobWVtIHdpdGggYXJjaGl0ZWN0 dXJlIHNwZWNpZmljIGNhY2hlIG1hbmFnZW1lbnQKb3BlcmF0aW9ucy4gVGhlIGVhc3kgYXBwcm9h Y2ggd291bGQgYmUgdG8gbGVhdmUgdGhhdCB1cAp0byB0aGUgYXJjaGl0ZWN0dXJlLCBwYXNzaW5n IG9ubHkgYSBwaHlzaWNhbCBhZGRyZXNzIHRvCnRoZSBmbHVzaCBmdW5jdGlvbi4gQSBuaWNlciBp bnRlcmZhY2UgbWlnaHQgYmUgdG8gbW92ZSB0aGUKbG9vcCBvdmVyIGhpZ2htZW0gcGFnZXMgb3V0 IGludG8gY29tbW9uIGNvZGUsIGZsdXNoCmxvd21lbSBwYWdlcyBieSB2aXJ0dWFsIGFkZHJlc3Nz LCBhbmQgaGF2ZSBhIHNlcGFyYXRlCmNhbGxiYWNrIGZvciBoaWdobWVtIHBhZ2VzIHRoYXQgdGFr ZXMgYSBwYWdlIHBvaW50ZXIsCmxpa2UKCnN0cnVjdCBkbWFfY2FjaGVfb3BzIHsKICAgICAgICB2 b2lkICgqZG1hX2NhY2hlX3diYWNrX2ludikodm9pZCAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3op OwogICAgICAgIHZvaWQgKCpkbWFfY2FjaGVfaW52KSh2b2lkICpzdGFydCwgdW5zaWduZWQgbG9u ZyBzeik7CiAgICAgICAgdm9pZCAoKmRtYV9jYWNoZV93YmFjaykodm9pZCAqc3RhcnQsIHVuc2ln bmVkIGxvbmcgc3opOwojaWZkZWYgQ09ORklHX0hJR0hNRU0KICAgICAgICB2b2lkICgqZG1hX2Nh Y2hlX3diYWNrX2ludl9oaWdoX3BhZ2UpKHN0cnVjdCBwYWdlICosIHNpemVfdCBzdGFydCwgdW5z aWduZWQgbG9uZyBzeik7CiAgICAgICAgdm9pZCAoKmRtYV9jYWNoZV9pbnZfaGlnaF9wYWdlKShz dHJ1Y3QgcGFnZSAqLCBzaXplX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3opOwogICAgICAgIHZv aWQgKCpkbWFfY2FjaGVfd2JhY2tfaGlnaF9wYWdlKShzdHJ1Y3QgcGFnZSAqLCBzaXplX3Qgc3Rh cnQsIHVuc2lnbmVkIGxvbmcgc3opOwojZW5kaWYKfTsKCkxldCBtZSBrbm93IGlmIHlvdSBoYXZl IGEgcHJlZmVyZW5jZSBoZXJlLCBiZWZvcmUgSSBzcGVuZAp0b28gbXVjaCB0aW1lIG9uIHNvbWV0 aGluZyB3ZSBkb24ndCB3YW50IGluIHRoZSBlbmQuCgogICAgIEFybmQKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlz dApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK