From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=209.132.183.28; helo=mx1.redhat.com; envelope-from=lersek@redhat.com; receiver=edk2-devel@lists.01.org Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 2834220355222 for ; Fri, 10 Nov 2017 06:41:47 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9D9246A7E8; Fri, 10 Nov 2017 14:45:49 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-120-145.rdu2.redhat.com [10.10.120.145]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5841664197; Fri, 10 Nov 2017 14:45:46 +0000 (UTC) To: "Ni, Ruiyu" , "Justen, Jordan L" , Jeff Fan Cc: "Kinney, Michael D" , "edk2-devel@lists.01.org" , "Yao, Jiewen" , "Dong, Eric" , Ard Biesheuvel References: <20171012084810.148196-1-ruiyu.ni@intel.com> <20171012084810.148196-4-ruiyu.ni@intel.com> <03e369bb-77c4-0134-258f-bdae62cbc8c5@redhat.com> <151019243761.10467.634318081879242382@jljusten-skl> <734D49CCEBEEF84792F5B80ED585239D5BAB7B62@SHSMSX104.ccr.corp.intel.com> <151021054953.14125.10727630216824816281@jljusten-skl> <734D49CCEBEEF84792F5B80ED585239D5BAB804D@SHSMSX104.ccr.corp.intel.com> <9474d983-b1c1-b83b-34ef-10bb84586ef6@redhat.com> <734D49CCEBEEF84792F5B80ED585239D5BAB8FCF@SHSMSX104.ccr.corp.intel.com> From: Laszlo Ersek Message-ID: <3a8c1855-4d29-44ee-17ee-e1a7ad53d044@redhat.com> Date: Fri, 10 Nov 2017 15:45:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <734D49CCEBEEF84792F5B80ED585239D5BAB8FCF@SHSMSX104.ccr.corp.intel.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 10 Nov 2017 14:45:49 +0000 (UTC) Subject: Re: [PATCH 3/4] UefiCpuPkg/MtrrLib: Update algorithm to calculate optimal settings X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Nov 2017 14:41:47 -0000 X-Groupsio-MsgNum: 17266 Content-Type: multipart/mixed; boundary="------------483358821E7D97E3696299FF" Content-Language: en-US --------------483358821E7D97E3696299FF Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi Ray, On 11/10/17 01:52, Ni, Ruiyu wrote: > > >> -----Original Message----- >> From: Laszlo Ersek [mailto:lersek@redhat.com] >> Sent: Thursday, November 9, 2017 9:16 PM >> To: Ni, Ruiyu ; Justen, Jordan L >> ; Jeff Fan >> Cc: Kinney, Michael D ; edk2-devel@lists.01.org; >> Yao, Jiewen ; Dong, Eric ; Ard >> Biesheuvel >> Subject: Re: [edk2] [PATCH 3/4] UefiCpuPkg/MtrrLib: Update algorithm to >> calculate optimal settings >> (1b) is an option we may or may not want to exercise in OVMF. I have the >> patches ready for enlarging the temp SEC/PEI RAM (and as part of that, the >> temp stack), which is one alternative. However, because OVMF's PEI phase runs >> from RAM (and not flash), the other alternative is just to add a sufficiently large >> static UINT8 array to PlatformPei, and pass that as scratch space to MtrrLib. >> Is my understanding correct that MtrrSetMemoryAttribute() is the only function >> that is affected? > > 1. yes. Only MtrrSetMemoryAttribute() call in OVMF is affected. >> (3) Is my understanding correct that >> MtrrSetMemoryAttributesInMtrrSettings() should be used like this: >> >> (3a) start with MtrrGetAllMtrrs() >> >> (3b) collect all *foreseeable* MtrrSetMemoryAttribute() calls into an >> array of MTRR_MEMORY_RANGE elements >> >> (3c) Perform a batch update on the output of (3a) by calling >> MtrrSetMemoryAttributesInMtrrSettings(). For this, the array from >> (3b), plus a caller-allocated scratch space, have to be passed in,. >> >> (3d) Finally, call MtrrSetAllMtrrs(). >> >> Is this correct? > > 2. yes. In summary, there are three ways to call this new API. The first way is what > you described. The second way is a bit change to (3a), ZeroMem() is called > instead of MtrrGetAllMtrrs() to initialize the MTRR. The third way is to call > this new API using NULL MtrrSetting, which cause the API itself to retrieve > the current MTRR settings from CPU, apply the new setting, write to CPU. > But the third way doesn't support batch setting. > >> >> I think we could use this. Jordan, which alternative do you prefer; larger stack >> and unchanged code in PlatformPei, or same stack and updated code in >> PlatformPei? >> >> >> (4) Ray: would it be possible to expose SCRATCH_BUFFER_SIZE (with a new >> name MTRR_SCRATCH_BUFFER_SIZE) in the library class header? I see the new >> RETURN_BUFFER_TOO_SMALL status codes, and I don't really want to deal with >> them. The library class header should provide clients with a size macro that >> *guarantees* that RETURN_BUFFER_TOO_SMALL will not occur. >> >> Practically speaking, I would use MTRR_SCRATCH_BUFFER_SIZE in the definition >> of the static UINT8 array in PlatformPei. (If Jordan prefers this alternative to the >> larger temp stack.) > > 3. Not quite correct. Because even when pass in the scratch buffer whose size equal > to MTRR_SCRATCH_BUFFER_SIZE, the BUFFER_TOO_SMALL could be returned. > That's why the BUFFER_TOO_SMALL status is invented. It requires caller to re-supply > the enough scratch buffer for calculation. > As such, I do not think exposing SCRATCH_BUFFER_SIZE helps. > When implementing the code, I tried to find out the maximum scratch buffer size but > found that the maximum could be up to 256KB. I cannot use such large stack because > as Jordan said, MSVC will inject some code results in unresolved symbol in EDKII code. > And DxeIpl only allocates 128KB stack for whole DXE phase. Thank you very much for the explanation! I have an untested prototype for (1b), using a 16KB static array as MtrrLib scratch space, in OvmfPkg/PlatformPei. In the compressed FVMAIN_COMPACT volume, its size impact is 320 bytes only. (For illustration, I'm attaching this "proof of concept".) However, after some more thinking, I dislike this approach. First, I'd like to keep this added complexity out of PlatformPei, if possible. Second, a 16KB growth in PEIFV (current total size: 896 KB) just to preserve the "status quo" is not really nice; we could use that space for including executable code and related static data. Third, this scratch space cannot be used for any other purpose. A larger temp stack is generally available to other functions in PlatformPei, and to all other PEIMs as well. In particular, if OVMF included a PEIM in the future that used the traditional MtrrSetMemoryAttribute() API, then PlatformPei's dedicated scratch space could not be shared by that PEIM. So, I'll go ahead and post the variant that grows the temp SEC/PEI RAM for OVMF. Thanks! Laszlo --------------483358821E7D97E3696299FF Content-Type: text/x-patch; name="0001-OvmfPkg-PlatformPei-manage-MtrrLib-scratch-space-manually.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0001-OvmfPkg-PlatformPei-manage-MtrrLib-scratch-space-manual"; filename*1="ly.patch" RnJvbSA3OTYwOTJiZDgxMzkwYTdmMzk4Y2E5MjNjNTA5ODM4ZDM2ZDRiOTdkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYXN6bG8gRXJzZWsgPGxlcnNla0ByZWRoYXQuY29tPgpEYXRl OiBGcmksIDEwIE5vdiAyMDE3IDE0OjU2OjA5ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gT3ZtZlBr Zy9QbGF0Zm9ybVBlaTogbWFuYWdlIE10cnJMaWIgc2NyYXRjaCBzcGFjZSBtYW51YWxseQoKVGhp cyBpcyBhbiB1bnRlc3RlZCBwcm90b3R5cGUsIGFzIGFuIGFsdGVybmF0aXZlIHRvIGdyb3dpbmcg dGhlIHRlbXAKU0VDL1BFSSBzdGFjay4gUmVmZXIgdG86CgotIGh0dHBzOi8vYnVnemlsbGEudGlh bm9jb3JlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ3Ci0gaHR0cDovL21pZC5tYWlsLWFyY2hpdmUu Y29tLzk0NzRkOTgzLWIxYzEtYjgzYi0zNGVmLTEwYmI4NDU4NmVmNkByZWRoYXQuY29tCgpUaGlz IHBhdGNoIGluY3JlYXNlcyB0aGUgUEVJRlYgdXNhZ2UgYnkgMTZLQjoKCj4gLVBFSUZWIFszOSVG dWxsXSA5MTc1MDQgdG90YWwsIDM2NTU3NiB1c2VkLCA1NTE5MjggZnJlZQo+ICtQRUlGViBbNDEl RnVsbF0gOTE3NTA0IHRvdGFsLCAzODA1NTIgdXNlZCwgNTM2OTUyIGZyZWUKCndoaWxlIHRoZSBk aWZmZXJlbmNlIGZvciBGVk1BSU5fQ09NUEFDVCBpcyBqdXN0IDMyMCBieXRlczoKCj4gLUZWTUFJ Tl9DT01QQUNUIFs0MyVGdWxsXSAzNDQwNjQwIHRvdGFsLCAxNTA4NzUyIHVzZWQsIDE5MzE4ODgg ZnJlZQo+ICtGVk1BSU5fQ09NUEFDVCBbNDMlRnVsbF0gMzQ0MDY0MCB0b3RhbCwgMTUwODQzMiB1 c2VkLCAxOTMyMjA4IGZyZWUKCkNvbnRyaWJ1dGVkLXVuZGVyOiBUaWFub0NvcmUgQ29udHJpYnV0 aW9uIEFncmVlbWVudCAxLjEKU2lnbmVkLW9mZi1ieTogTGFzemxvIEVyc2VrIDxsZXJzZWtAcmVk aGF0LmNvbT4KLS0tCiBPdm1mUGtnL1BsYXRmb3JtUGVpL1BsYXRmb3JtLmggIHwgIDQgKysrKwog T3ZtZlBrZy9QbGF0Zm9ybVBlaS9NZW1EZXRlY3QuYyB8IDQyICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0tCiBPdm1mUGtnL1BsYXRmb3JtUGVpL1BsYXRmb3JtLmMgIHwg IDIgKysKIE92bWZQa2cvUGxhdGZvcm1QZWkvWGVuLmMgICAgICAgfCAyNiArKysrKysrKysrKysr KysrKysrKysrKystCiA0IGZpbGVzIGNoYW5nZWQsIDY2IGluc2VydGlvbnMoKyksIDggZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9QbGF0Zm9ybS5oIGIvT3Zt ZlBrZy9QbGF0Zm9ybVBlaS9QbGF0Zm9ybS5oCmluZGV4IGY5NDJlNjFiYjRmOS4uNTEzYTJlMjM3 M2U2IDEwMDY0NAotLS0gYS9Pdm1mUGtnL1BsYXRmb3JtUGVpL1BsYXRmb3JtLmgKKysrIGIvT3Zt ZlBrZy9QbGF0Zm9ybVBlaS9QbGF0Zm9ybS5oCkBAIC0xNyw2ICsxNyw4IEBACiANCiAjaW5jbHVk ZSA8SW5kdXN0cnlTdGFuZGFyZC9FODIwLmg+DQogDQorI2RlZmluZSBNVFJSX0xJQl9TQ1JBVENI X0JVRkZFUl9TSVpFIFNJWkVfMTZLQg0KKw0KIFZPSUQNCiBBZGRJb01lbW9yeUJhc2VTaXplSG9i ICgNCiAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICBNZW1vcnlCYXNlLA0KQEAgLTExNSw0 ICsxMTcsNiBAQCBleHRlcm4gVUlOVDMyIG1NYXhDcHVDb3VudDsKIA0KIGV4dGVybiBVSU5UMTYg bUhvc3RCcmlkZ2VEZXZJZDsNCiANCitleHRlcm4gVUlOVDggbU10cnJMaWJTY3JhdGNoQnVmZmVy W01UUlJfTElCX1NDUkFUQ0hfQlVGRkVSX1NJWkVdOw0KKw0KICNlbmRpZiAvLyBfUExBVEZPUk1f UEVJX0hfSU5DTFVERURfDQpkaWZmIC0tZ2l0IGEvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9NZW1EZXRl Y3QuYyBiL092bWZQa2cvUGxhdGZvcm1QZWkvTWVtRGV0ZWN0LmMKaW5kZXggMmIyZjNlNGJlYzU1 Li4xZDA5ZGM0NGI2OWIgMTAwNjQ0Ci0tLSBhL092bWZQa2cvUGxhdGZvcm1QZWkvTWVtRGV0ZWN0 LmMKKysrIGIvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9NZW1EZXRlY3QuYwpAQCAtNTk1LDYgKzU5NSw4 IEBAIFFlbXVJbml0aWFsaXplUmFtICgKICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIExv d2VyTWVtb3J5U2l6ZTsNCiAgIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICBVcHBlck1lbW9y eVNpemU7DQogICBNVFJSX1NFVFRJTkdTICAgICAgICAgICAgICAgTXRyclNldHRpbmdzOw0KKyAg TVRSUl9NRU1PUllfUkFOR0UgICAgICAgICAgIFJhbmdlc1syXTsNCisgIFVJTlROICAgICAgICAg ICAgICAgICAgICAgICBNdHJyTGliU2NyYXRjaEJ1ZmZlclNpemU7DQogICBFRklfU1RBVFVTICAg ICAgICAgICAgICAgICAgU3RhdHVzOw0KIA0KICAgREVCVUcgKChFRklfRF9JTkZPLCAiJWEgY2Fs bGVkXG4iLCBfX0ZVTkNUSU9OX18pKTsNCkBAIC02ODIsMjIgKzY4NCw0OCBAQCBRZW11SW5pdGlh bGl6ZVJhbSAoCiAgICAgU2V0TWVtICgmTXRyclNldHRpbmdzLkZpeGVkLCBzaXplb2YgTXRyclNl dHRpbmdzLkZpeGVkLCAweDA2KTsNCiAgICAgWmVyb01lbSAoJk10cnJTZXR0aW5ncy5WYXJpYWJs ZXMsIHNpemVvZiBNdHJyU2V0dGluZ3MuVmFyaWFibGVzKTsNCiAgICAgTXRyclNldHRpbmdzLk10 cnJEZWZUeXBlIHw9IEJJVDExIHwgQklUMTAgfCA2Ow0KLSAgICBNdHJyU2V0QWxsTXRycnMgKCZN dHJyU2V0dGluZ3MpOw0KIA0KICAgICAvLw0KICAgICAvLyBTZXQgbWVtb3J5IHJhbmdlIGZyb20g NjQwS0IgdG8gMU1CIHRvIHVuY2FjaGVhYmxlDQogICAgIC8vDQotICAgIFN0YXR1cyA9IE10cnJT ZXRNZW1vcnlBdHRyaWJ1dGUgKEJBU0VfNTEyS0IgKyBCQVNFXzEyOEtCLA0KLSAgICAgICAgICAg ICAgIEJBU0VfMU1CIC0gKEJBU0VfNTEyS0IgKyBCQVNFXzEyOEtCKSwgQ2FjaGVVbmNhY2hlYWJs ZSk7DQotICAgIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQorICAgIFJhbmdlc1swXS5CYXNl QWRkcmVzcyA9IEJBU0VfNTEyS0IgKyBCQVNFXzEyOEtCOw0KKyAgICBSYW5nZXNbMF0uTGVuZ3Ro ICAgICAgPSBCQVNFXzFNQiAtIFJhbmdlc1swXS5CYXNlQWRkcmVzczsNCisgICAgUmFuZ2VzWzBd LlR5cGUgICAgICAgID0gQ2FjaGVVbmNhY2hlYWJsZTsNCiANCiAgICAgLy8NCiAgICAgLy8gU2V0 IG1lbW9yeSByYW5nZSBmcm9tIHRoZSAidG9wIG9mIGxvd2VyIFJBTSIgKFJBTSBiZWxvdyA0R0Ip IHRvIDRHQiBhcw0KICAgICAvLyB1bmNhY2hlYWJsZQ0KICAgICAvLw0KLSAgICBTdGF0dXMgPSBN dHJyU2V0TWVtb3J5QXR0cmlidXRlIChMb3dlck1lbW9yeVNpemUsDQotICAgICAgICAgICAgICAg U0laRV80R0IgLSBMb3dlck1lbW9yeVNpemUsIENhY2hlVW5jYWNoZWFibGUpOw0KLSAgICBBU1NF UlRfRUZJX0VSUk9SIChTdGF0dXMpOw0KKyAgICBSYW5nZXNbMV0uQmFzZUFkZHJlc3MgPSBMb3dl ck1lbW9yeVNpemU7DQorICAgIFJhbmdlc1sxXS5MZW5ndGggICAgICA9IFNJWkVfNEdCIC0gTG93 ZXJNZW1vcnlTaXplOw0KKyAgICBSYW5nZXNbMV0uVHlwZSAgICAgICAgPSBDYWNoZVVuY2FjaGVh YmxlOw0KKw0KKyAgICAvLw0KKyAgICAvLyBBcHBseSBSYW5nZXMgdG8gTXRyclNldHRpbmdzLg0K KyAgICAvLw0KKyAgICBNdHJyTGliU2NyYXRjaEJ1ZmZlclNpemUgPSBzaXplb2YgbU10cnJMaWJT Y3JhdGNoQnVmZmVyOw0KKyAgICBTdGF0dXMgPSBNdHJyU2V0TWVtb3J5QXR0cmlidXRlc0luTXRy clNldHRpbmdzICgNCisgICAgICAgICAgICAgICAmTXRyclNldHRpbmdzLA0KKyAgICAgICAgICAg ICAgIG1NdHJyTGliU2NyYXRjaEJ1ZmZlciwNCisgICAgICAgICAgICAgICAmTXRyckxpYlNjcmF0 Y2hCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgIFJhbmdlcywNCisgICAgICAgICAgICAgICBB UlJBWV9TSVpFIChSYW5nZXMpDQorICAgICAgICAgICAgICAgKTsNCisgICAgaWYgKEVGSV9FUlJP UiAoU3RhdHVzKSkgew0KKyAgICAgIERFQlVHICgoDQorICAgICAgICBERUJVR19FUlJPUiwNCisg ICAgICAgICIlYTogTXRyclNldE1lbW9yeUF0dHJpYnV0ZXNJbk10cnJTZXR0aW5ncygpOiAlciAo U2NyYXRjaFNpemU9JUx1KVxuIiwNCisgICAgICAgIF9fRlVOQ1RJT05fXywNCisgICAgICAgIFN0 YXR1cywNCisgICAgICAgIChVSU5UNjQpTXRyckxpYlNjcmF0Y2hCdWZmZXJTaXplDQorICAgICAg ICApKTsNCisgICAgICBBU1NFUlQgKEZBTFNFKTsNCisgICAgfQ0KKw0KKyAgICAvLw0KKyAgICAv LyBQcm9ncmFtIHRoZSBoYXJkd2FyZSB3aXRoIE10cnJTZXR0aW5ncy4NCisgICAgLy8NCisgICAg TXRyclNldEFsbE10cnJzICgmTXRyclNldHRpbmdzKTsNCiAgIH0NCiB9DQogDQpkaWZmIC0tZ2l0 IGEvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9QbGF0Zm9ybS5jIGIvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9Q bGF0Zm9ybS5jCmluZGV4IDU0NGFjNTQ3YmY1Zi4uZGIxNmU2NzU2ZmRhIDEwMDY0NAotLS0gYS9P dm1mUGtnL1BsYXRmb3JtUGVpL1BsYXRmb3JtLmMKKysrIGIvT3ZtZlBrZy9QbGF0Zm9ybVBlaS9Q bGF0Zm9ybS5jCkBAIC03MSw2ICs3MSw4IEBAIEJPT0xFQU4gbVMzU3VwcG9ydGVkID0gRkFMU0U7 CiANCiBVSU5UMzIgbU1heENwdUNvdW50Ow0KIA0KK1VJTlQ4IG1NdHJyTGliU2NyYXRjaEJ1ZmZl cltNVFJSX0xJQl9TQ1JBVENIX0JVRkZFUl9TSVpFXTsNCisNCiBWT0lEDQogQWRkSW9NZW1vcnlC YXNlU2l6ZUhvYiAoDQogICBFRklfUEhZU0lDQUxfQUREUkVTUyAgICAgICAgTWVtb3J5QmFzZSwN CmRpZmYgLS1naXQgYS9Pdm1mUGtnL1BsYXRmb3JtUGVpL1hlbi5jIGIvT3ZtZlBrZy9QbGF0Zm9y bVBlaS9YZW4uYwppbmRleCBhYjM4Zjk3YTY3YWEuLmYwNmMyNThkNTVjMCAxMDA2NDQKLS0tIGEv T3ZtZlBrZy9QbGF0Zm9ybVBlaS9YZW4uYworKysgYi9Pdm1mUGtnL1BsYXRmb3JtUGVpL1hlbi5j CkBAIC0xODEsNiArMTgxLDkgQEAgWGVuUHVibGlzaFJhbVJlZ2lvbnMgKAogICAgIFVJTlQzMiBM b29wOw0KIA0KICAgICBmb3IgKExvb3AgPSAwOyBMb29wIDwgRTgyMEVudHJpZXNDb3VudDsgTG9v cCsrKSB7DQorICAgICAgTVRSUl9NRU1PUllfUkFOR0UgUmFuZ2U7DQorICAgICAgVUlOVE4gICAg ICAgICAgICAgTXRyckxpYlNjcmF0Y2hCdWZmZXJTaXplOw0KKw0KICAgICAgIEVudHJ5ID0gRTgy ME1hcCArIExvb3A7DQogDQogICAgICAgLy8NCkBAIC0xOTIsNyArMTk1LDI4IEBAIFhlblB1Ymxp c2hSYW1SZWdpb25zICgKIA0KICAgICAgIEFkZE1lbW9yeUJhc2VTaXplSG9iIChFbnRyeS0+QmFz ZUFkZHIsIEVudHJ5LT5MZW5ndGgpOw0KIA0KLSAgICAgIE10cnJTZXRNZW1vcnlBdHRyaWJ1dGUg KEVudHJ5LT5CYXNlQWRkciwgRW50cnktPkxlbmd0aCwgQ2FjaGVXcml0ZUJhY2spOw0KKyAgICAg IFJhbmdlLkJhc2VBZGRyZXNzICAgICAgICA9IEVudHJ5LT5CYXNlQWRkcjsNCisgICAgICBSYW5n ZS5MZW5ndGggICAgICAgICAgICAgPSBFbnRyeS0+TGVuZ3RoOw0KKyAgICAgIFJhbmdlLlR5cGUg ICAgICAgICAgICAgICA9IENhY2hlV3JpdGVCYWNrOw0KKyAgICAgIE10cnJMaWJTY3JhdGNoQnVm ZmVyU2l6ZSA9IHNpemVvZiBtTXRyckxpYlNjcmF0Y2hCdWZmZXI7DQorDQorICAgICAgU3RhdHVz ID0gTXRyclNldE1lbW9yeUF0dHJpYnV0ZXNJbk10cnJTZXR0aW5ncyAoDQorICAgICAgICAgICAg ICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvLyBNdHJyU2V0dGluZw0KKyAgICAgICAg ICAgICAgICAgbU10cnJMaWJTY3JhdGNoQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgJk10cnJM aWJTY3JhdGNoQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICZSYW5nZSwNCisgICAgICAg ICAgICAgICAgIDENCisgICAgICAgICAgICAgICAgICk7DQorICAgICAgaWYgKEVGSV9FUlJPUiAo U3RhdHVzKSkgew0KKyAgICAgICAgREVCVUcgKCgNCisgICAgICAgICAgREVCVUdfV0FSTiwNCisg ICAgICAgICAgKCIlYTogTXRyclNldE1lbW9yeUF0dHJpYnV0ZXNJbk10cnJTZXR0aW5ncygpOiAl ciAiDQorICAgICAgICAgICAiKFNjcmF0Y2hTaXplPSVMdSlcbiIpLA0KKyAgICAgICAgICBfX0ZV TkNUSU9OX18sDQorICAgICAgICAgIFN0YXR1cywNCisgICAgICAgICAgKFVJTlQ2NClNdHJyTGli U2NyYXRjaEJ1ZmZlclNpemUNCisgICAgICAgICAgKSk7DQorICAgICAgfQ0KICAgICB9DQogICB9 DQogfQ0KLS0gCjIuMTQuMS4zLmdiN2NmNmUwMjQwMWIKCg== --------------483358821E7D97E3696299FF--