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 X-Spam-Level: X-Spam-Status: No, score=-5.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 513E3C43215 for ; Wed, 4 Dec 2019 04:19:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1A5C12073C for ; Wed, 4 Dec 2019 04:19:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UsR4nxLG" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727021AbfLDETV (ORCPT ); Tue, 3 Dec 2019 23:19:21 -0500 Received: from mail-ot1-f66.google.com ([209.85.210.66]:43213 "EHLO mail-ot1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726804AbfLDETU (ORCPT ); Tue, 3 Dec 2019 23:19:20 -0500 Received: by mail-ot1-f66.google.com with SMTP id p8so5112198oth.10; Tue, 03 Dec 2019 20:19:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=oO5aKHWqKZXgtDSzybkME6BK6jEsYJ93MQcu7wW6Ois=; b=UsR4nxLGxkGDB8c1PVJMKEM9OO+Ridm9v4kB8Sovl3epF/ujjT7s3EPYaXWek871Ap m3baBWk2e58Ho1eagyO56sSNRY90MUm9QRdNb7WD2BEnkJzlGMbABMjkL+JibbwXTnUq NPgTfgku2xEMZjoRYeOqZNwmMvVkd8uwaj17GZjdo6j4QTNrImxHtCTbAKGVm0d69UC4 WUAZGyyZRnKJyCEgTHWXvPfT1GFVhT52kkiakkMmO1TcdyicBbMQOYuHLzaZwVby+JV0 Am+QLOtz5qR7KUVokXCwlMZr6z1f6XmDxtCxGDhsbLPZRzgm8kLQGO5p85cKTQX670YM bjsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=oO5aKHWqKZXgtDSzybkME6BK6jEsYJ93MQcu7wW6Ois=; b=S35s0moz7Tx0MPFoOaTA+CiE2FjzSZ5B1P6sBFg5U4JG1MlT9IyReI+uJVw4fvnnug LwJKROihtZ8jC5W7kGP7SNBtxFzH2X0IOhYDoS9vMjZ1Xx2zRq5EcETVhbpBpkKUeDTl ATEuOflVu9CZimisZllXje63xsDq61ngsGgVGlHlJRdFQ7NmKO6bl2OC9h/a9Vs9gL+8 cQLbKbWjK/WBQVm/9RHEIdyC1N6gFzkN597ZEJHN9lid/Ri9J7n1l7X3vqjYnzSjYd18 boU+VWI7PaVmWFUEhiaH6H8Z25l9LQedw7k/KtCD2ztVOxgGANuhg3DjCJ6syDGV4H/q Wz4A== X-Gm-Message-State: APjAAAXpQ3JfsfrezT0CbX/RhO2TOQE5lplCsZOdwYp5fxPaFlMz2+5t nkcrRcZvNnW0nR4kyseE4X9dSxUMzef3UcgHFNg= X-Google-Smtp-Source: APXvYqytyNA2QkmAJY7xC5kFRg0u6U/Fdz8XWksN3Nv4gba/r2jxdUps87kfcX5VKf3Oss1lFcZ3soNRgEF+xYh58lc= X-Received: by 2002:a9d:64ce:: with SMTP id n14mr1025741otl.263.1575433159471; Tue, 03 Dec 2019 20:19:19 -0800 (PST) MIME-Version: 1.0 References: <20190113021719.46457-1-samuel@sholland.org> <20190113021719.46457-2-samuel@sholland.org> <472c5450-1b60-6ac7-b242-805c2a2f3272@arm.com> In-Reply-To: <472c5450-1b60-6ac7-b242-805c2a2f3272@arm.com> From: Vasily Khoruzhick Date: Tue, 3 Dec 2019 20:18:53 -0800 Message-ID: Subject: Re: [linux-sunxi] Re: [PATCH v3 1/2] arm64: arch_timer: Workaround for Allwinner A64 timer instability To: marc.zyngier@arm.com Cc: Samuel Holland , Catalin Marinas , Will Deacon , Maxime Ripard , Chen-Yu Tsai , Rob Herring , Mark Rutland , Daniel Lezcano , Thomas Gleixner , devicetree , arm-linux , linux-kernel , linux-sunxi Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jan 14, 2019 at 1:25 AM Marc Zyngier wrote: > > Hi Samuel, Hi Samuel, > On 13/01/2019 02:17, Samuel Holland wrote: > > The Allwinner A64 SoC is known[1] to have an unstable architectural > > timer, which manifests itself most obviously in the time jumping forwar= d > > a multiple of 95 years[2][3]. This coincides with 2^56 cycles at a > > timer frequency of 24 MHz, implying that the time went slightly backwar= d > > (and this was interpreted by the kernel as it jumping forward and > > wrapping around past the epoch). > > > > Investigation revealed instability in the low bits of CNTVCT at the > > point a high bit rolls over. This leads to power-of-two cycle forward > > and backward jumps. (Testing shows that forward jumps are about twice a= s > > likely as backward jumps.) Since the counter value returns to normal > > after an indeterminate read, each "jump" really consists of both a > > forward and backward jump from the software perspective. > > > > Unless the kernel is trapping CNTVCT reads, a userspace program is able > > to read the register in a loop faster than it changes. A test program > > running on all 4 CPU cores that reported jumps larger than 100 ms was > > run for 13.6 hours and reported the following: > > > > Count | Event > > -------+--------------------------- > > 9940 | jumped backward 699ms > > 268 | jumped backward 1398ms > > 1 | jumped backward 2097ms > > 16020 | jumped forward 175ms > > 6443 | jumped forward 699ms > > 2976 | jumped forward 1398ms > > 9 | jumped forward 356516ms > > 9 | jumped forward 357215ms > > 4 | jumped forward 714430ms > > 1 | jumped forward 3578440ms > > > > This works out to a jump larger than 100 ms about every 5.5 seconds on > > each CPU core. > > > > The largest jump (almost an hour!) was the following sequence of reads: > > 0x0000007fffffffff =E2=86=92 0x00000093feffffff =E2=86=92 0x0000008= 000000000 > > > > Note that the middle bits don't necessarily all read as all zeroes or > > all ones during the anomalous behavior; however the low 10 bits checked > > by the function in this patch have never been observed with any other > > value. > > > > Also note that smaller jumps are much more common, with backward jumps > > of 2048 (2^11) cycles observed over 400 times per second on each core. > > (Of course, this is partially explained by lower bits rolling over more > > frequently.) Any one of these could have caused the 95 year time skip. > > > > Similar anomalies were observed while reading CNTPCT (after patching th= e > > kernel to allow reads from userspace). However, the CNTPCT jumps are > > much less frequent, and only small jumps were observed. The same progra= m > > as before (except now reading CNTPCT) observed after 72 hours: > > > > Count | Event > > -------+--------------------------- > > 17 | jumped backward 699ms > > 52 | jumped forward 175ms > > 2831 | jumped forward 699ms > > 5 | jumped forward 1398ms > > > > Further investigation showed that the instability in CNTPCT/CNTVCT also > > affected the respective timer's TVAL register. The following values wer= e > > observed immediately after writing CNVT_TVAL to 0x10000000: > > > > CNTVCT | CNTV_TVAL | CNTV_CVAL | CNTV_TVAL Error > > --------------------+------------+--------------------+----------------= - > > 0x000000d4a2d8bfff | 0x10003fff | 0x000000d4b2d8bfff | +0x00004000 > > 0x000000d4a2d94000 | 0x0fffffff | 0x000000d4b2d97fff | -0x00004000 > > 0x000000d4a2d97fff | 0x10003fff | 0x000000d4b2d97fff | +0x00004000 > > 0x000000d4a2d9c000 | 0x0fffffff | 0x000000d4b2d9ffff | -0x00004000 > > > > The pattern of errors in CNTV_TVAL seemed to depend on exactly which > > value was written to it. For example, after writing 0x10101010: > > > > CNTVCT | CNTV_TVAL | CNTV_CVAL | CNTV_TVAL Error > > --------------------+------------+--------------------+----------------= - > > 0x000001ac3effffff | 0x1110100f | 0x000001ac4f10100f | +0x1000000 > > 0x000001ac40000000 | 0x1010100f | 0x000001ac5110100f | -0x1000000 > > 0x000001ac58ffffff | 0x1110100f | 0x000001ac6910100f | +0x1000000 > > 0x000001ac66000000 | 0x1010100f | 0x000001ac7710100f | -0x1000000 > > 0x000001ac6affffff | 0x1110100f | 0x000001ac7b10100f | +0x1000000 > > 0x000001ac6e000000 | 0x1010100f | 0x000001ac7f10100f | -0x1000000 > > > > I was also twice able to reproduce the issue covered by Allwinner's > > workaround[4], that writing to TVAL sometimes fails, and both CVAL and > > TVAL are left with entirely bogus values. One was the following values: > > > > CNTVCT | CNTV_TVAL | CNTV_CVAL > > --------------------+------------+-------------------------------------= - > > 0x000000d4a2d6014c | 0x8fbd5721 | 0x000000d132935fff (615s in the past= ) > > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > > > Because the CPU can read the CNTPCT/CNTVCT registers faster than they > > change, performing two reads of the register and comparing the high bit= s > > (like other workarounds) is not a workable solution. And because the > > timer can jump both forward and backward, no pair of reads can > > distinguish a good value from a bad one. The only way to guarantee a > > good value from consecutive reads would be to read _three_ times, and > > take the middle value only if the three values are 1) each unique and > > 2) increasing. This takes at minimum 3 counter cycles (125 ns), or more > > if an anomaly is detected. > > > > However, since there is a distinct pattern to the bad values, we can > > optimize the common case (1022/1024 of the time) to a single read by > > simply ignoring values that match the error pattern. This still takes n= o > > more than 3 cycles in the worst case, and requires much less code. As a= n > > additional safety check, we still limit the loop iteration to the numbe= r > > of max-frequency (1.2 GHz) CPU cycles in three 24 MHz counter periods. > > > > For the TVAL registers, the simple solution is to not use them. Instead= , > > read or write the CVAL and calculate the TVAL value in software. > > > > Although the manufacturer is aware of at least part of the erratum[4], > > there is no official name for it. For now, use the kernel-internal name > > "UNKNOWN1". > > > > [1]: https://github.com/armbian/build/commit/a08cd6fe7ae9 > > [2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/ > > [3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26 > > [4]: https://github.com/Allwinner-Homlet/H6-BSP4.9-linux/blob/master/dr= ivers/clocksource/arm_arch_timer.c#L272 > > nit: In general, I'm not overly keen on URLs in commit messages, as they > may vanish without notice and the commit message becomes less useful. In > the future, please keep those in the cover letter (though in this > particular case, the commit message explains the issue pretty well, so > no harm done once GitHub dies a horrible death... ;-). > > The fix itself looks pretty solid, and will hopefully make the > "AllLoosers" HW more usable. Unfortunately this patch doesn't completely eliminate the jumps. There have been reports from users who still saw 95y jump even with the patch applied. Personally I've seen it once or twice on my Pine64-LTS. Looks like we need bigger hammer. Does anyone have any idea what it could b= e? Regards, Vasily > Reviewed-by: Marc Zyngier > > Daniel, please consider this for v5.1. > > Thanks, > > M. > -- > Jazz is not dead. It just smells funny... > > -- > You received this message because you are subscribed to the Google Groups= "linux-sunxi" group. > To unsubscribe from this group and stop receiving emails from it, send an= email to linux-sunxi+unsubscribe@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. 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 X-Spam-Level: X-Spam-Status: No, score=-5.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 45C3AC432C3 for ; Wed, 4 Dec 2019 04:19:27 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 0354C20674 for ; Wed, 4 Dec 2019 04:19:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="MsNlMuAx"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UsR4nxLG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0354C20674 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=FQ8+NTIBQuWWqzd6YB8dCAjYiFQZf+5DDQIncVNJIbg=; b=MsNlMuAx7yjpPe DLGB5wJGBD0G1kWQdhhMUs+N8GTFvtnSVc+ww3mbPnonvmbYLhoP5Zgi1+emMoMw5niHdzsB0kvdX 7iWIaiDfrZHMWoGY1Es0D//lv9zfhBzMbOgKqEK300XDCBvEmIe6Hw78zQ/06XH/n5kVFznt7lBHf cAdgZA3oUBAG89E2JhWOrX4xk/icVn43JYxBOrlZxuxSX3pphY9odpJMRZbdxA0o0YcGh+Ph4pQbN SQadtPHSJlYs3DuzCIo7V5O3ByAUSChNC+WmkTEcC6ktvcjKWMrP7CzZr0eazDoAsQksZjiLHNKiK Rz4SdVGixTr4CxdTIWNw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1icM8M-0002py-8S; Wed, 04 Dec 2019 04:19:26 +0000 Received: from mail-ot1-x341.google.com ([2607:f8b0:4864:20::341]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1icM8H-0002pE-F7 for linux-arm-kernel@lists.infradead.org; Wed, 04 Dec 2019 04:19:23 +0000 Received: by mail-ot1-x341.google.com with SMTP id x3so5111182oto.11 for ; Tue, 03 Dec 2019 20:19:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=oO5aKHWqKZXgtDSzybkME6BK6jEsYJ93MQcu7wW6Ois=; b=UsR4nxLGxkGDB8c1PVJMKEM9OO+Ridm9v4kB8Sovl3epF/ujjT7s3EPYaXWek871Ap m3baBWk2e58Ho1eagyO56sSNRY90MUm9QRdNb7WD2BEnkJzlGMbABMjkL+JibbwXTnUq NPgTfgku2xEMZjoRYeOqZNwmMvVkd8uwaj17GZjdo6j4QTNrImxHtCTbAKGVm0d69UC4 WUAZGyyZRnKJyCEgTHWXvPfT1GFVhT52kkiakkMmO1TcdyicBbMQOYuHLzaZwVby+JV0 Am+QLOtz5qR7KUVokXCwlMZr6z1f6XmDxtCxGDhsbLPZRzgm8kLQGO5p85cKTQX670YM bjsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=oO5aKHWqKZXgtDSzybkME6BK6jEsYJ93MQcu7wW6Ois=; b=fqc4A0/fhnh62EgwGB5sdtPuaQ2u5wj26NtZdCDv6S1nJSX8lEp5WHyNoOK3B/DR1+ zFaaDAQ4OSoWpberwbIu7z6QQ0Im0QTjFA8qW9Not2CkXrW/mEr8DiEs5axY7P3rWvGa wc3lSJOvTfMdN1pDjORzgTMyIACUtveIIl+k8j+iz88tga+vxyBJF7UkT95lBttxHwbR KJ8RWO4VfZ9vmZjYdtfWFjxSbiultxoZ0jNLvuhfUH6MFBefah0p/Rp3FlgJq9IpY28Z sGC76OFrqGo4LM1ASfTOWhNKMNm2uWySk2V5UFUTWhxAEJxKrV1agGdkTGufNCKy+18U 9YPw== X-Gm-Message-State: APjAAAX9dMntVVHB7OI5jRttGkQXFR4CG5Fd24sckJgKtPHC4HOIBYjN VUrGRdNSWdoxxuIeeckmDF+isR6s/VEBqUlfxZ8= X-Google-Smtp-Source: APXvYqytyNA2QkmAJY7xC5kFRg0u6U/Fdz8XWksN3Nv4gba/r2jxdUps87kfcX5VKf3Oss1lFcZ3soNRgEF+xYh58lc= X-Received: by 2002:a9d:64ce:: with SMTP id n14mr1025741otl.263.1575433159471; Tue, 03 Dec 2019 20:19:19 -0800 (PST) MIME-Version: 1.0 References: <20190113021719.46457-1-samuel@sholland.org> <20190113021719.46457-2-samuel@sholland.org> <472c5450-1b60-6ac7-b242-805c2a2f3272@arm.com> In-Reply-To: <472c5450-1b60-6ac7-b242-805c2a2f3272@arm.com> From: Vasily Khoruzhick Date: Tue, 3 Dec 2019 20:18:53 -0800 Message-ID: Subject: Re: [linux-sunxi] Re: [PATCH v3 1/2] arm64: arch_timer: Workaround for Allwinner A64 timer instability To: marc.zyngier@arm.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191203_201921_507915_E1D6017A X-CRM114-Status: GOOD ( 33.71 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree , Samuel Holland , Maxime Ripard , Catalin Marinas , linux-sunxi , Daniel Lezcano , Will Deacon , linux-kernel , Chen-Yu Tsai , Rob Herring , Thomas Gleixner , arm-linux Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gTW9uLCBKYW4gMTQsIDIwMTkgYXQgMToyNSBBTSBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2ll ckBhcm0uY29tPiB3cm90ZToKPgo+IEhpIFNhbXVlbCwKCkhpIFNhbXVlbCwKCj4gT24gMTMvMDEv MjAxOSAwMjoxNywgU2FtdWVsIEhvbGxhbmQgd3JvdGU6Cj4gPiBUaGUgQWxsd2lubmVyIEE2NCBT b0MgaXMga25vd25bMV0gdG8gaGF2ZSBhbiB1bnN0YWJsZSBhcmNoaXRlY3R1cmFsCj4gPiB0aW1l ciwgd2hpY2ggbWFuaWZlc3RzIGl0c2VsZiBtb3N0IG9idmlvdXNseSBpbiB0aGUgdGltZSBqdW1w aW5nIGZvcndhcmQKPiA+IGEgbXVsdGlwbGUgb2YgOTUgeWVhcnNbMl1bM10uIFRoaXMgY29pbmNp ZGVzIHdpdGggMl41NiBjeWNsZXMgYXQgYQo+ID4gdGltZXIgZnJlcXVlbmN5IG9mIDI0IE1Ieiwg aW1wbHlpbmcgdGhhdCB0aGUgdGltZSB3ZW50IHNsaWdodGx5IGJhY2t3YXJkCj4gPiAoYW5kIHRo aXMgd2FzIGludGVycHJldGVkIGJ5IHRoZSBrZXJuZWwgYXMgaXQganVtcGluZyBmb3J3YXJkIGFu ZAo+ID4gd3JhcHBpbmcgYXJvdW5kIHBhc3QgdGhlIGVwb2NoKS4KPiA+Cj4gPiBJbnZlc3RpZ2F0 aW9uIHJldmVhbGVkIGluc3RhYmlsaXR5IGluIHRoZSBsb3cgYml0cyBvZiBDTlRWQ1QgYXQgdGhl Cj4gPiBwb2ludCBhIGhpZ2ggYml0IHJvbGxzIG92ZXIuIFRoaXMgbGVhZHMgdG8gcG93ZXItb2Yt dHdvIGN5Y2xlIGZvcndhcmQKPiA+IGFuZCBiYWNrd2FyZCBqdW1wcy4gKFRlc3Rpbmcgc2hvd3Mg dGhhdCBmb3J3YXJkIGp1bXBzIGFyZSBhYm91dCB0d2ljZSBhcwo+ID4gbGlrZWx5IGFzIGJhY2t3 YXJkIGp1bXBzLikgU2luY2UgdGhlIGNvdW50ZXIgdmFsdWUgcmV0dXJucyB0byBub3JtYWwKPiA+ IGFmdGVyIGFuIGluZGV0ZXJtaW5hdGUgcmVhZCwgZWFjaCAianVtcCIgcmVhbGx5IGNvbnNpc3Rz IG9mIGJvdGggYQo+ID4gZm9yd2FyZCBhbmQgYmFja3dhcmQganVtcCBmcm9tIHRoZSBzb2Z0d2Fy ZSBwZXJzcGVjdGl2ZS4KPiA+Cj4gPiBVbmxlc3MgdGhlIGtlcm5lbCBpcyB0cmFwcGluZyBDTlRW Q1QgcmVhZHMsIGEgdXNlcnNwYWNlIHByb2dyYW0gaXMgYWJsZQo+ID4gdG8gcmVhZCB0aGUgcmVn aXN0ZXIgaW4gYSBsb29wIGZhc3RlciB0aGFuIGl0IGNoYW5nZXMuIEEgdGVzdCBwcm9ncmFtCj4g PiBydW5uaW5nIG9uIGFsbCA0IENQVSBjb3JlcyB0aGF0IHJlcG9ydGVkIGp1bXBzIGxhcmdlciB0 aGFuIDEwMCBtcyB3YXMKPiA+IHJ1biBmb3IgMTMuNiBob3VycyBhbmQgcmVwb3J0ZWQgdGhlIGZv bGxvd2luZzoKPiA+Cj4gPiAgQ291bnQgfCBFdmVudAo+ID4gLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KPiA+ICAgOTk0MCB8IGp1bXBlZCBiYWNrd2FyZCAgICAgIDY5OW1zCj4g PiAgICAyNjggfCBqdW1wZWQgYmFja3dhcmQgICAgIDEzOThtcwo+ID4gICAgICAxIHwganVtcGVk IGJhY2t3YXJkICAgICAyMDk3bXMKPiA+ICAxNjAyMCB8IGp1bXBlZCBmb3J3YXJkICAgICAgIDE3 NW1zCj4gPiAgIDY0NDMgfCBqdW1wZWQgZm9yd2FyZCAgICAgICA2OTltcwo+ID4gICAyOTc2IHwg anVtcGVkIGZvcndhcmQgICAgICAxMzk4bXMKPiA+ICAgICAgOSB8IGp1bXBlZCBmb3J3YXJkICAg IDM1NjUxNm1zCj4gPiAgICAgIDkgfCBqdW1wZWQgZm9yd2FyZCAgICAzNTcyMTVtcwo+ID4gICAg ICA0IHwganVtcGVkIGZvcndhcmQgICAgNzE0NDMwbXMKPiA+ICAgICAgMSB8IGp1bXBlZCBmb3J3 YXJkICAgMzU3ODQ0MG1zCj4gPgo+ID4gVGhpcyB3b3JrcyBvdXQgdG8gYSBqdW1wIGxhcmdlciB0 aGFuIDEwMCBtcyBhYm91dCBldmVyeSA1LjUgc2Vjb25kcyBvbgo+ID4gZWFjaCBDUFUgY29yZS4K PiA+Cj4gPiBUaGUgbGFyZ2VzdCBqdW1wIChhbG1vc3QgYW4gaG91ciEpIHdhcyB0aGUgZm9sbG93 aW5nIHNlcXVlbmNlIG9mIHJlYWRzOgo+ID4gICAgIDB4MDAwMDAwN2ZmZmZmZmZmZiDihpIgMHgw MDAwMDA5M2ZlZmZmZmZmIOKGkiAweDAwMDAwMDgwMDAwMDAwMDAKPiA+Cj4gPiBOb3RlIHRoYXQg dGhlIG1pZGRsZSBiaXRzIGRvbid0IG5lY2Vzc2FyaWx5IGFsbCByZWFkIGFzIGFsbCB6ZXJvZXMg b3IKPiA+IGFsbCBvbmVzIGR1cmluZyB0aGUgYW5vbWFsb3VzIGJlaGF2aW9yOyBob3dldmVyIHRo ZSBsb3cgMTAgYml0cyBjaGVja2VkCj4gPiBieSB0aGUgZnVuY3Rpb24gaW4gdGhpcyBwYXRjaCBo YXZlIG5ldmVyIGJlZW4gb2JzZXJ2ZWQgd2l0aCBhbnkgb3RoZXIKPiA+IHZhbHVlLgo+ID4KPiA+ IEFsc28gbm90ZSB0aGF0IHNtYWxsZXIganVtcHMgYXJlIG11Y2ggbW9yZSBjb21tb24sIHdpdGgg YmFja3dhcmQganVtcHMKPiA+IG9mIDIwNDggKDJeMTEpIGN5Y2xlcyBvYnNlcnZlZCBvdmVyIDQw MCB0aW1lcyBwZXIgc2Vjb25kIG9uIGVhY2ggY29yZS4KPiA+IChPZiBjb3Vyc2UsIHRoaXMgaXMg cGFydGlhbGx5IGV4cGxhaW5lZCBieSBsb3dlciBiaXRzIHJvbGxpbmcgb3ZlciBtb3JlCj4gPiBm cmVxdWVudGx5LikgQW55IG9uZSBvZiB0aGVzZSBjb3VsZCBoYXZlIGNhdXNlZCB0aGUgOTUgeWVh ciB0aW1lIHNraXAuCj4gPgo+ID4gU2ltaWxhciBhbm9tYWxpZXMgd2VyZSBvYnNlcnZlZCB3aGls ZSByZWFkaW5nIENOVFBDVCAoYWZ0ZXIgcGF0Y2hpbmcgdGhlCj4gPiBrZXJuZWwgdG8gYWxsb3cg cmVhZHMgZnJvbSB1c2Vyc3BhY2UpLiBIb3dldmVyLCB0aGUgQ05UUENUIGp1bXBzIGFyZQo+ID4g bXVjaCBsZXNzIGZyZXF1ZW50LCBhbmQgb25seSBzbWFsbCBqdW1wcyB3ZXJlIG9ic2VydmVkLiBU aGUgc2FtZSBwcm9ncmFtCj4gPiBhcyBiZWZvcmUgKGV4Y2VwdCBub3cgcmVhZGluZyBDTlRQQ1Qp IG9ic2VydmVkIGFmdGVyIDcyIGhvdXJzOgo+ID4KPiA+ICBDb3VudCB8IEV2ZW50Cj4gPiAtLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ID4gICAgIDE3IHwganVtcGVkIGJhY2t3 YXJkICAgICAgNjk5bXMKPiA+ICAgICA1MiB8IGp1bXBlZCBmb3J3YXJkICAgICAgIDE3NW1zCj4g PiAgIDI4MzEgfCBqdW1wZWQgZm9yd2FyZCAgICAgICA2OTltcwo+ID4gICAgICA1IHwganVtcGVk IGZvcndhcmQgICAgICAxMzk4bXMKPiA+Cj4gPiBGdXJ0aGVyIGludmVzdGlnYXRpb24gc2hvd2Vk IHRoYXQgdGhlIGluc3RhYmlsaXR5IGluIENOVFBDVC9DTlRWQ1QgYWxzbwo+ID4gYWZmZWN0ZWQg dGhlIHJlc3BlY3RpdmUgdGltZXIncyBUVkFMIHJlZ2lzdGVyLiBUaGUgZm9sbG93aW5nIHZhbHVl cyB3ZXJlCj4gPiBvYnNlcnZlZCBpbW1lZGlhdGVseSBhZnRlciB3cml0aW5nIENOVlRfVFZBTCB0 byAweDEwMDAwMDAwOgo+ID4KPiA+ICBDTlRWQ1QgICAgICAgICAgICAgfCBDTlRWX1RWQUwgIHwg Q05UVl9DVkFMICAgICAgICAgIHwgQ05UVl9UVkFMIEVycm9yCj4gPiAtLS0tLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0K PiA+ICAweDAwMDAwMGQ0YTJkOGJmZmYgfCAweDEwMDAzZmZmIHwgMHgwMDAwMDBkNGIyZDhiZmZm IHwgKzB4MDAwMDQwMDAKPiA+ICAweDAwMDAwMGQ0YTJkOTQwMDAgfCAweDBmZmZmZmZmIHwgMHgw MDAwMDBkNGIyZDk3ZmZmIHwgLTB4MDAwMDQwMDAKPiA+ICAweDAwMDAwMGQ0YTJkOTdmZmYgfCAw eDEwMDAzZmZmIHwgMHgwMDAwMDBkNGIyZDk3ZmZmIHwgKzB4MDAwMDQwMDAKPiA+ICAweDAwMDAw MGQ0YTJkOWMwMDAgfCAweDBmZmZmZmZmIHwgMHgwMDAwMDBkNGIyZDlmZmZmIHwgLTB4MDAwMDQw MDAKPiA+Cj4gPiBUaGUgcGF0dGVybiBvZiBlcnJvcnMgaW4gQ05UVl9UVkFMIHNlZW1lZCB0byBk ZXBlbmQgb24gZXhhY3RseSB3aGljaAo+ID4gdmFsdWUgd2FzIHdyaXR0ZW4gdG8gaXQuIEZvciBl eGFtcGxlLCBhZnRlciB3cml0aW5nIDB4MTAxMDEwMTA6Cj4gPgo+ID4gIENOVFZDVCAgICAgICAg ICAgICB8IENOVFZfVFZBTCAgfCBDTlRWX0NWQUwgICAgICAgICAgfCBDTlRWX1RWQUwgRXJyb3IK PiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tLQo+ID4gIDB4MDAwMDAxYWMzZWZmZmZmZiB8IDB4MTExMDEwMGYg fCAweDAwMDAwMWFjNGYxMDEwMGYgfCArMHgxMDAwMDAwCj4gPiAgMHgwMDAwMDFhYzQwMDAwMDAw IHwgMHgxMDEwMTAwZiB8IDB4MDAwMDAxYWM1MTEwMTAwZiB8IC0weDEwMDAwMDAKPiA+ICAweDAw MDAwMWFjNThmZmZmZmYgfCAweDExMTAxMDBmIHwgMHgwMDAwMDFhYzY5MTAxMDBmIHwgKzB4MTAw MDAwMAo+ID4gIDB4MDAwMDAxYWM2NjAwMDAwMCB8IDB4MTAxMDEwMGYgfCAweDAwMDAwMWFjNzcx MDEwMGYgfCAtMHgxMDAwMDAwCj4gPiAgMHgwMDAwMDFhYzZhZmZmZmZmIHwgMHgxMTEwMTAwZiB8 IDB4MDAwMDAxYWM3YjEwMTAwZiB8ICsweDEwMDAwMDAKPiA+ICAweDAwMDAwMWFjNmUwMDAwMDAg fCAweDEwMTAxMDBmIHwgMHgwMDAwMDFhYzdmMTAxMDBmIHwgLTB4MTAwMDAwMAo+ID4KPiA+IEkg d2FzIGFsc28gdHdpY2UgYWJsZSB0byByZXByb2R1Y2UgdGhlIGlzc3VlIGNvdmVyZWQgYnkgQWxs d2lubmVyJ3MKPiA+IHdvcmthcm91bmRbNF0sIHRoYXQgd3JpdGluZyB0byBUVkFMIHNvbWV0aW1l cyBmYWlscywgYW5kIGJvdGggQ1ZBTCBhbmQKPiA+IFRWQUwgYXJlIGxlZnQgd2l0aCBlbnRpcmVs eSBib2d1cyB2YWx1ZXMuIE9uZSB3YXMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cj4gPgo+ID4gIENO VFZDVCAgICAgICAgICAgICB8IENOVFZfVFZBTCAgfCBDTlRWX0NWQUwKPiA+IC0tLS0tLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQo+ID4gIDB4MDAwMDAwZDRhMmQ2MDE0YyB8IDB4OGZiZDU3MjEgfCAweDAwMDAwMGQxMzI5 MzVmZmYgKDYxNXMgaW4gdGhlIHBhc3QpCj4gPgo+ID4gPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj4gPgo+ID4g QmVjYXVzZSB0aGUgQ1BVIGNhbiByZWFkIHRoZSBDTlRQQ1QvQ05UVkNUIHJlZ2lzdGVycyBmYXN0 ZXIgdGhhbiB0aGV5Cj4gPiBjaGFuZ2UsIHBlcmZvcm1pbmcgdHdvIHJlYWRzIG9mIHRoZSByZWdp c3RlciBhbmQgY29tcGFyaW5nIHRoZSBoaWdoIGJpdHMKPiA+IChsaWtlIG90aGVyIHdvcmthcm91 bmRzKSBpcyBub3QgYSB3b3JrYWJsZSBzb2x1dGlvbi4gQW5kIGJlY2F1c2UgdGhlCj4gPiB0aW1l ciBjYW4ganVtcCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkLCBubyBwYWlyIG9mIHJlYWRzIGNh bgo+ID4gZGlzdGluZ3Vpc2ggYSBnb29kIHZhbHVlIGZyb20gYSBiYWQgb25lLiBUaGUgb25seSB3 YXkgdG8gZ3VhcmFudGVlIGEKPiA+IGdvb2QgdmFsdWUgZnJvbSBjb25zZWN1dGl2ZSByZWFkcyB3 b3VsZCBiZSB0byByZWFkIF90aHJlZV8gdGltZXMsIGFuZAo+ID4gdGFrZSB0aGUgbWlkZGxlIHZh bHVlIG9ubHkgaWYgdGhlIHRocmVlIHZhbHVlcyBhcmUgMSkgZWFjaCB1bmlxdWUgYW5kCj4gPiAy KSBpbmNyZWFzaW5nLiBUaGlzIHRha2VzIGF0IG1pbmltdW0gMyBjb3VudGVyIGN5Y2xlcyAoMTI1 IG5zKSwgb3IgbW9yZQo+ID4gaWYgYW4gYW5vbWFseSBpcyBkZXRlY3RlZC4KPiA+Cj4gPiBIb3dl dmVyLCBzaW5jZSB0aGVyZSBpcyBhIGRpc3RpbmN0IHBhdHRlcm4gdG8gdGhlIGJhZCB2YWx1ZXMs IHdlIGNhbgo+ID4gb3B0aW1pemUgdGhlIGNvbW1vbiBjYXNlICgxMDIyLzEwMjQgb2YgdGhlIHRp bWUpIHRvIGEgc2luZ2xlIHJlYWQgYnkKPiA+IHNpbXBseSBpZ25vcmluZyB2YWx1ZXMgdGhhdCBt YXRjaCB0aGUgZXJyb3IgcGF0dGVybi4gVGhpcyBzdGlsbCB0YWtlcyBubwo+ID4gbW9yZSB0aGFu IDMgY3ljbGVzIGluIHRoZSB3b3JzdCBjYXNlLCBhbmQgcmVxdWlyZXMgbXVjaCBsZXNzIGNvZGUu IEFzIGFuCj4gPiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjaywgd2Ugc3RpbGwgbGltaXQgdGhlIGxv b3AgaXRlcmF0aW9uIHRvIHRoZSBudW1iZXIKPiA+IG9mIG1heC1mcmVxdWVuY3kgKDEuMiBHSHop IENQVSBjeWNsZXMgaW4gdGhyZWUgMjQgTUh6IGNvdW50ZXIgcGVyaW9kcy4KPiA+Cj4gPiBGb3Ig dGhlIFRWQUwgcmVnaXN0ZXJzLCB0aGUgc2ltcGxlIHNvbHV0aW9uIGlzIHRvIG5vdCB1c2UgdGhl bS4gSW5zdGVhZCwKPiA+IHJlYWQgb3Igd3JpdGUgdGhlIENWQUwgYW5kIGNhbGN1bGF0ZSB0aGUg VFZBTCB2YWx1ZSBpbiBzb2Z0d2FyZS4KPiA+Cj4gPiBBbHRob3VnaCB0aGUgbWFudWZhY3R1cmVy IGlzIGF3YXJlIG9mIGF0IGxlYXN0IHBhcnQgb2YgdGhlIGVycmF0dW1bNF0sCj4gPiB0aGVyZSBp cyBubyBvZmZpY2lhbCBuYW1lIGZvciBpdC4gRm9yIG5vdywgdXNlIHRoZSBrZXJuZWwtaW50ZXJu YWwgbmFtZQo+ID4gIlVOS05PV04xIi4KPiA+Cj4gPiBbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9h cm1iaWFuL2J1aWxkL2NvbW1pdC9hMDhjZDZmZTdhZTkKPiA+IFsyXTogaHR0cHM6Ly9mb3J1bS5h cm1iaWFuLmNvbS90b3BpYy8zNDU4LWE2NC1kYXRldGltZS1jbG9jay1pc3N1ZS8KPiA+IFszXTog aHR0cHM6Ly9pcmNsb2cud2hpdGVxdWFyay5vcmcvbGludXgtc3VueGkvMjAxOC0wMS0yNgo+ID4g WzRdOiBodHRwczovL2dpdGh1Yi5jb20vQWxsd2lubmVyLUhvbWxldC9INi1CU1A0LjktbGludXgv YmxvYi9tYXN0ZXIvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jI0wyNzIKPgo+ IG5pdDogSW4gZ2VuZXJhbCwgSSdtIG5vdCBvdmVybHkga2VlbiBvbiBVUkxzIGluIGNvbW1pdCBt ZXNzYWdlcywgYXMgdGhleQo+IG1heSB2YW5pc2ggd2l0aG91dCBub3RpY2UgYW5kIHRoZSBjb21t aXQgbWVzc2FnZSBiZWNvbWVzIGxlc3MgdXNlZnVsLiBJbgo+IHRoZSBmdXR1cmUsIHBsZWFzZSBr ZWVwIHRob3NlIGluIHRoZSBjb3ZlciBsZXR0ZXIgKHRob3VnaCBpbiB0aGlzCj4gcGFydGljdWxh ciBjYXNlLCB0aGUgY29tbWl0IG1lc3NhZ2UgZXhwbGFpbnMgdGhlIGlzc3VlIHByZXR0eSB3ZWxs LCBzbwo+IG5vIGhhcm0gZG9uZSBvbmNlIEdpdEh1YiBkaWVzIGEgaG9ycmlibGUgZGVhdGguLi4g Oy0pLgo+Cj4gVGhlIGZpeCBpdHNlbGYgbG9va3MgcHJldHR5IHNvbGlkLCBhbmQgd2lsbCBob3Bl ZnVsbHkgbWFrZSB0aGUKPiAiQWxsTG9vc2VycyIgSFcgbW9yZSB1c2FibGUuCgpVbmZvcnR1bmF0 ZWx5IHRoaXMgcGF0Y2ggZG9lc24ndCBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUganVtcHMuIFRo ZXJlCmhhdmUgYmVlbiByZXBvcnRzIGZyb20gdXNlcnMgd2hvIHN0aWxsIHNhdyA5NXkganVtcCBl dmVuIHdpdGggdGhlCnBhdGNoIGFwcGxpZWQuCgpQZXJzb25hbGx5IEkndmUgc2VlbiBpdCBvbmNl IG9yIHR3aWNlIG9uIG15IFBpbmU2NC1MVFMuCgpMb29rcyBsaWtlIHdlIG5lZWQgYmlnZ2VyIGhh bW1lci4gRG9lcyBhbnlvbmUgaGF2ZSBhbnkgaWRlYSB3aGF0IGl0IGNvdWxkIGJlPwoKUmVnYXJk cywKVmFzaWx5CgoKPiBSZXZpZXdlZC1ieTogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJt LmNvbT4KPgo+IERhbmllbCwgcGxlYXNlIGNvbnNpZGVyIHRoaXMgZm9yIHY1LjEuCj4KPiBUaGFu a3MsCj4KPiAgICAgICAgIE0uCj4gLS0KPiBKYXp6IGlzIG5vdCBkZWFkLiBJdCBqdXN0IHNtZWxs cyBmdW5ueS4uLgo+Cj4gLS0KPiBZb3UgcmVjZWl2ZWQgdGhpcyBtZXNzYWdlIGJlY2F1c2UgeW91 IGFyZSBzdWJzY3JpYmVkIHRvIHRoZSBHb29nbGUgR3JvdXBzICJsaW51eC1zdW54aSIgZ3JvdXAu Cj4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGdyb3VwIGFuZCBzdG9wIHJlY2VpdmluZyBlbWFp bHMgZnJvbSBpdCwgc2VuZCBhbiBlbWFpbCB0byBsaW51eC1zdW54aSt1bnN1YnNjcmliZUBnb29n bGVncm91cHMuY29tLgo+IEZvciBtb3JlIG9wdGlvbnMsIHZpc2l0IGh0dHBzOi8vZ3JvdXBzLmdv b2dsZS5jb20vZC9vcHRvdXQuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVs QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==