From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 28629D8026F for ; Fri, 1 Mar 2024 00:14:48 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=CLqv6w2ajgle3cO7WP6a1N10euN8twgwNYT0GKSD/cc=; c=relaxed/simple; d=groups.io; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject:To:Cc:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type; s=20140610; t=1709252086; v=1; b=t5XRVviyuTj6P2Fn10dXACbMRG0/02QYJla2TklcD4IrJMhCySjtHALfIr0JK5nPsEseb/Gi SgInQILz2ftTLoKUBuihOf10kCr2vVjPdihOyXyus6Z7yI5np3Io1fjtP9holNNcK/e+jNQwKdm 4eG8AhNaayesoO2gfRFgWaUk= X-Received: by 127.0.0.2 with SMTP id rsPFYY7687511xuR22Ar6poI; Thu, 29 Feb 2024 16:14:46 -0800 X-Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.groups.io with SMTP id smtpd.web10.11056.1709252086072747365 for ; Thu, 29 Feb 2024 16:14:46 -0800 X-Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-422-o_BOTB_uMTK0qEYN1U2A8w-1; Thu, 29 Feb 2024 19:14:42 -0500 X-MC-Unique: o_BOTB_uMTK0qEYN1U2A8w-1 X-Received: by mail-wr1-f71.google.com with SMTP id ffacd0b85a97d-33d308b0c76so1261551f8f.0 for ; Thu, 29 Feb 2024 16:14:42 -0800 (PST) X-Gm-Message-State: 88M1NTSd2HpA4du9LzUCzxNhx7686176AA= X-Received: by 2002:adf:b30f:0:b0:33d:b312:2130 with SMTP id j15-20020adfb30f000000b0033db3122130mr464282wrd.11.1709252081558; Thu, 29 Feb 2024 16:14:41 -0800 (PST) X-Google-Smtp-Source: AGHT+IErd1x0xIV73sVyDvNUAHCmG3uHM/7YDhYPJa6qtANnu2QAzKEw++mAE8cxZ8BQYDEfvg1XX6WriQYZ5ROMM1w= X-Received: by 2002:adf:b30f:0:b0:33d:b312:2130 with SMTP id j15-20020adfb30f000000b0033db3122130mr464271wrd.11.1709252081183; Thu, 29 Feb 2024 16:14:41 -0800 (PST) MIME-Version: 1.0 References: <20240229130246.3-1-ray.ni@intel.com> <20240229130246.3-3-ray.ni@intel.com> In-Reply-To: <20240229130246.3-3-ray.ni@intel.com> From: "Paolo Bonzini" Date: Fri, 1 Mar 2024 01:14:28 +0100 Message-ID: Subject: Re: [edk2-devel] [PATCH 2/2] MdeModulePkg/DxeCore: Fix stack overflow issue due to nested interrupts To: Ray Ni Cc: devel@edk2.groups.io, Michael D Kinney , Liming Gao , Laszlo Ersek , Michael Brown X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pbonzini@redhat.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Type: multipart/mixed; boundary="00000000000021af2806128e43d6" X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=t5XRVviy; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=redhat.com (policy=none) --00000000000021af2806128e43d6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Feb 29, 2024 at 2:04=E2=80=AFPM Ray Ni wrote: > @@ -134,9 +262,9 @@ CoreRestoreTpl ( > } > > // > - // Set the new value > + // Set the new TPL with interrupt disabled. > // > - > + CoreSetInterruptState (FALSE); > gEfiCurrentTpl =3D NewTpl; > > // > @@ -144,7 +272,22 @@ CoreRestoreTpl ( > // interrupts are enabled > // > if (gEfiCurrentTpl < TPL_HIGH_LEVEL) { > - CoreSetInterruptState (TRUE); > + if ((INTN)gEfiCurrentTpl > HighBitSet64 (mInterruptedTplMask)) { > + // > + // Only enable interrupts if restoring to a level above the highes= t > + // interrupted TPL level. This allows interrupt nesting, but only= for > + // events at higher TPL level than the current TPL level. > + // > + CoreSetInterruptState (TRUE); > + } else { > + // > + // Clear interrupted TPL level mask, but do not re-enable interrup= ts here > + // This will return to CoreTimerTick() and interrupts will be re-e= nabled > + // when the timer interrupt handlers returns from interrupt contex= t. > + // > + ASSERT ((INTN)gEfiCurrentTpl =3D=3D HighBitSet64 (mInterruptedTplM= ask)); > + mInterruptedTplMask &=3D ~(UINTN)(1 << gEfiCurrentTpl); > + } > } Ok, now I understand what's going on and it's indeed the same logic as NestedInterruptTplLib, with DisableInterruptsOnIret() replaced by skipping CoreSetInterruptState(TRUE). It's similar to what I proposed elsewhere in the thread, just written differenty. I agree with Michael Brown that the spec is unclear on the state of the interrupt flag on exit from gBS->RestoreTPL(), but perhaps this change is feasible if the interrupt handlers just raise the TPL first and restore it last. Just as an exercise for me to understand the code better, I tried rewriting the code in terms of the CoreRestoreTplInternal() function that I proposed. I find it easier to read, but I guess that's a bit in the eye of the beholder, and it is a little more defensively coded. I attach it (untested beyond compilation) for reference. Paolo -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116192): https://edk2.groups.io/g/devel/message/116192 Mute This Topic: https://groups.io/mt/104642317/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --00000000000021af2806128e43d6 Content-Type: text/x-patch; charset="US-ASCII"; name="tpl.patch" Content-Disposition: attachment; filename="tpl.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lt7wharz0 RnJvbSAyM2M0ZjYwY2Y3OWYyOWFiNWVmZjU1YTAyYzcyYmI1MDQ4MDRkMDJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQYW9sbyBCb256aW5pIDxwYm9uemluaUByZWRoYXQuY29tPgpE YXRlOiBUaHUsIDI5IEZlYiAyMDI0IDIzOjU0OjUwICswMTAwClN1YmplY3Q6IFtQQVRDSCAxLzJd IE1kZU1vZHVsZVBrZzogaW50cm9kdWNlIENvcmVSZXN0b3JlVHBsSW50ZXJuYWwoKQpDb250ZW50 LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgKCkludHJvZHVjZSBhIGZ1bmN0aW9uIHRo YXQgcmVzdG9yZXMgdGhlIFRQTCBqdXN0IGxpa2UgZ0JTLT5SZXN0b3JlVFBMKCksCmJ1dCBjYW4g b3B0aW9uYWxseSByZXR1cm4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgVGhpcyBjYW4gYmUg dXNlZApmcm9tIGludGVycnVwdCBoYW5kbGVycywgc28gdGhhdCBhbnkgbmVzdGVkIGludGVycnVw dCBoYW5kbGVyIHdpbGwgb25seQpzZWUgYW4gZWxldmF0ZWQgVFBMIGFuZCBub3QgdGhlIHZhbHVl IG9uIGVudHJ5IHRvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KClNpZ25lZC1vZmYtYnk6IFBhb2xv IEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+Ci0tLQogTWRlTW9kdWxlUGtnL0NvcmUvRHhl L0V2ZW50L1RwbC5jIHwgNDYgKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQogMSBmaWxl IGNoYW5nZWQsIDMxIGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L01kZU1vZHVsZVBrZy9Db3JlL0R4ZS9FdmVudC9UcGwuYyBiL01kZU1vZHVsZVBrZy9Db3JlL0R4 ZS9FdmVudC9UcGwuYwppbmRleCBiMzNmODA1NzNjLi5mZTk1ZWEzODk2IDEwMDY0NAotLS0gYS9N ZGVNb2R1bGVQa2cvQ29yZS9EeGUvRXZlbnQvVHBsLmMKKysrIGIvTWRlTW9kdWxlUGtnL0NvcmUv RHhlL0V2ZW50L1RwbC5jCkBAIC05MCwxMCArOTAsMTEgQEAgQ29yZVJhaXNlVHBsICgKICAgQHBh cmFtICBOZXdUcGwgIE5ldywgbG93ZXIsIHRhc2sgcHJpb3JpdHkNCiANCiAqKi8NCi1WT0lEDQor c3RhdGljIFZPSUQNCiBFRklBUEkNCi1Db3JlUmVzdG9yZVRwbCAoDQotICBJTiBFRklfVFBMICBO ZXdUcGwNCitDb3JlUmVzdG9yZVRwbEludGVybmFsICgNCisgIElOIEVGSV9UUEwgIE5ld1RwbCwN CisgIElOIEJPT0xFQU4gIERlc2lyZWRJbnRlcnJ1cHRTdGF0ZQ0KICAgKQ0KIHsNCiAgIEVGSV9U UEwgIE9sZFRwbDsNCkBAIC0xMDcsMTEgKzEwOCw2IEBAIENvcmVSZXN0b3JlVHBsICgKIA0KICAg QVNTRVJUIChWQUxJRF9UUEwgKE5ld1RwbCkpOw0KIA0KLSAgLy8NCi0gIC8vIElmIGxvd2VyaW5n IGJlbG93IEhJR0hfTEVWRUwsIG1ha2Ugc3VyZQ0KLSAgLy8gaW50ZXJydXB0cyBhcmUgZW5hYmxl ZA0KLSAgLy8NCi0NCiAgIGlmICgoT2xkVHBsID49IFRQTF9ISUdIX0xFVkVMKSAmJiAgKE5ld1Rw bCA8IFRQTF9ISUdIX0xFVkVMKSkgew0KICAgICBnRWZpQ3VycmVudFRwbCA9IFRQTF9ISUdIX0xF VkVMOw0KICAgfQ0KQEAgLTEyNiw2ICsxMjIsMTEgQEAgQ29yZVJlc3RvcmVUcGwgKAogICAgIH0N CiANCiAgICAgZ0VmaUN1cnJlbnRUcGwgPSBQZW5kaW5nVHBsOw0KKw0KKyAgICAvLw0KKyAgICAv LyBJZiBsb3dlcmluZyBiZWxvdyBISUdIX0xFVkVMLCBtYWtlIHN1cmUNCisgICAgLy8gaW50ZXJy dXB0cyBhcmUgZW5hYmxlZA0KKyAgICAvLw0KICAgICBpZiAoZ0VmaUN1cnJlbnRUcGwgPCBUUExf SElHSF9MRVZFTCkgew0KICAgICAgIENvcmVTZXRJbnRlcnJ1cHRTdGF0ZSAoVFJVRSk7DQogICAg IH0NCkBAIC0xMzQsMTYgKzEzNSwzMSBAQCBDb3JlUmVzdG9yZVRwbCAoCiAgIH0NCiANCiAgIC8v DQotICAvLyBTZXQgdGhlIG5ldyB2YWx1ZQ0KKyAgLy8gU2V0IHRoZSBuZXcgVFBMIHdpdGggaW50 ZXJydXB0IGRpc2FibGVkLiAgSWYgRGVzaXJlZEludGVycnVwdFN0YXRlDQorICAvLyBpcyBGQUxT RSwgdGhpcyBlbnN1cmVzIHRoYXQgYW55IG5lc3RlZCBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIG9u bHkNCisgIC8vIHNlZSBhbiBlbGV2YXRlZCBUUEwgYW5kIG5vdCBOZXdUcGwuDQogICAvLw0KLQ0K KyAgQ29yZVNldEludGVycnVwdFN0YXRlIChGQUxTRSk7DQogICBnRWZpQ3VycmVudFRwbCA9IE5l d1RwbDsNCiANCi0gIC8vDQotICAvLyBJZiBsb3dlcmluZyBiZWxvdyBISUdIX0xFVkVMLCBtYWtl IHN1cmUNCi0gIC8vIGludGVycnVwdHMgYXJlIGVuYWJsZWQNCi0gIC8vDQotICBpZiAoZ0VmaUN1 cnJlbnRUcGwgPCBUUExfSElHSF9MRVZFTCkgew0KKyAgaWYgKERlc2lyZWRJbnRlcnJ1cHRTdGF0 ZSkgew0KKyAgICBBU1NFUlQoZ0VmaUN1cnJlbnRUcGwgPCBUUExfSElHSF9MRVZFTCk7DQogICAg IENvcmVTZXRJbnRlcnJ1cHRTdGF0ZSAoVFJVRSk7DQogICB9DQogfQ0KKw0KKy8qKg0KKyAgTG93 ZXJzIHRoZSB0YXNrIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyB2YWx1ZS4gICBJZiB0aGUgbmV3 DQorICBwcmlvcml0eSB1bm1hc2tzIGV2ZW50cyBhdCBhIGhpZ2hlciBwcmlvcml0eSwgdGhleSBh cmUgZGlzcGF0Y2hlZC4NCisNCisgIEBwYXJhbSAgTmV3VHBsICBOZXcsIGxvd2VyLCB0YXNrIHBy aW9yaXR5DQorDQorKiovDQorVk9JRA0KK0VGSUFQSQ0KK0NvcmVSZXN0b3JlVHBsICgNCisgIElO IEVGSV9UUEwgTmV3VHBsDQorICApDQorew0KKyAgQ29yZVJlc3RvcmVUcGxJbnRlcm5hbCAoTmV3 VHBsLCBOZXdUcGwgPCBUUExfSElHSF9MRVZFTCk7DQorfQ0KLS0gCjIuNDMuMgoKCkZyb20gOTdi MDdmNTNmOWEwNzExZWI1NWUwMmU4YWY1OTFlZWUwOTk3MTY2OCBNb24gU2VwIDE3IDAwOjAwOjAw IDIwMDEKRnJvbTogTWljaGFlbCBEIEtpbm5leSA8bWljaGFlbC5kLmtpbm5leUBpbnRlbC5jb20+ CkRhdGU6IEZyaSwgMSBNYXIgMjAyNCAwMDo0MDo1MyArMDEwMApTdWJqZWN0OiBbUEFUQ0ggMi8y XSBNZGVNb2R1bGVQa2c6IGZpeCBzdGFjayBvdmVyZmxvdyBpc3N1ZSBkdWUgdG8gbmVzdGVkCiBp bnRlcnJ1cHRzCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOAoKVGhpcyBp cyBhIGhlYXZpbHkgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dpYyBpbiB0aGUgT3ZtZlBr ZwpOZXN0ZWRJbnRlcnJ1cHRUcGxMaWIuICBCZWNhdXNlIHRoZSBuZXcgQ29yZVJlc3RvcmVUcGxJ bnRlcm5hbCgpCmZ1bmN0aW9uIGFsbG93cyB0byBsb3dlciB0aGUgVFBMIHdoaWxlIGludGVycnVw dHMgYXJlIGRpc2FibGVkLAp0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgY29tcGxleCBkZWZlcnJl ZCBleGVjdXRpb24gbWVjaGFuaXNtLgoKSW5zdGVhZCwgQ29yZVJhaXNlVHBsKCkgdXNlcyB0aGUg Y3VycmVudCBzdGF0ZSBvZiB0aGUgaW50ZXJydXB0CmZsYWcgdG8gc2Vjb25kIGd1ZXNzIHdoZXRo ZXIgaXQncyBiZWluZyBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQKaGFuZGxlcjsgYW5kIHdoZW4g cmVzdG9yaW5nIHRoZSBvdXRlciBUUEwgYXQgdGhlIGVuZCBvZiB0aGUgaGFuZGxlciwKaW50ZXJy dXB0cyByZW1haW4gZGlzYWJsZWQgdW50aWwgSVJFVCBhbmQgdGhlcmUgY2Fubm90IGJlIG5lc3Rl ZAppbnZvY2F0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhdCB0aGUgc2FtZSBUUEwuCgpT aWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEQgS2lubmV5IDxtaWNoYWVsLmQua2lubmV5QGludGVsLmNv bT4KU2lnbmVkLW9mZi1ieTogUmF5IE5pIDxyYXkubmlAaW50ZWwuY29tPgpbUmV3cml0dGVuIHRo ZSBDb3JlUmVzdG9yZVRwbCBwYXJ0LiAtIFBhb2xvXQpTaWduZWQtb2ZmLWJ5OiBQYW9sbyBCb256 aW5pIDxwYm9uemluaUByZWRoYXQuY29tPgotLS0KIE1kZU1vZHVsZVBrZy9Db3JlL0R4ZS9FdmVu dC9UcGwuYyB8IDczICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmlsZSBjaGFu Z2VkLCA3MiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpkaWZmIC0tZ2l0IGEvTWRlTW9k dWxlUGtnL0NvcmUvRHhlL0V2ZW50L1RwbC5jIGIvTWRlTW9kdWxlUGtnL0NvcmUvRHhlL0V2ZW50 L1RwbC5jCmluZGV4IGZlOTVlYTM4OTYuLjcxNWIwNjI2YjggMTAwNjQ0Ci0tLSBhL01kZU1vZHVs ZVBrZy9Db3JlL0R4ZS9FdmVudC9UcGwuYworKysgYi9NZGVNb2R1bGVQa2cvQ29yZS9EeGUvRXZl bnQvVHBsLmMKQEAgLTksNiArOSwxMSBAQCBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTIt Q2xhdXNlLVBhdGVudAogI2luY2x1ZGUgIkR4ZU1haW4uaCINCiAjaW5jbHVkZSAiRXZlbnQuaCIN CiANCisvLy8NCisvLy8gQml0IG1hc2sgb2YgVFBMcyB0aGF0IHdlcmUgaW50ZXJydXB0ZWQgZHVy aW5nIFJlc3RvcmVUUEwoKS4NCisvLy8NCitzdGF0aWMgVUlOVE4gICBtSW50ZXJydXB0ZWRUcGxN YXNrID0gMDsNCisNCiAvKioNCiAgIFNldCBJbnRlcnJ1cHQgU3RhdGUuDQogDQpAQCAtNTksNiAr NjQsNyBAQCBDb3JlUmFpc2VUcGwgKAogICApDQogew0KICAgRUZJX1RQTCAgT2xkVHBsOw0KKyAg Qk9PTEVBTiAgSW50ZXJydXB0U3RhdGU7DQogDQogICBPbGRUcGwgPSBnRWZpQ3VycmVudFRwbDsN CiAgIGlmIChPbGRUcGwgPiBOZXdUcGwpIHsNCkBAIC03Miw3ICs3OCwzMSBAQCBDb3JlUmFpc2VU cGwgKAogICAvLyBJZiByYWlzaW5nIHRvIGhpZ2ggbGV2ZWwsIGRpc2FibGUgaW50ZXJydXB0cw0K ICAgLy8NCiAgIGlmICgoTmV3VHBsID49IFRQTF9ISUdIX0xFVkVMKSAmJiAgKE9sZFRwbCA8IFRQ TF9ISUdIX0xFVkVMKSkgew0KLSAgICBDb3JlU2V0SW50ZXJydXB0U3RhdGUgKEZBTFNFKTsNCisg ICAgLy8NCisgICAgLy8gV2hlbiBnQ3B1IGlzIE5VTEwsIEludGVycnVwdFN0YXRlIGlzIFRSVUUu DQorICAgIC8vIENhbGxpbmcgQ29yZVNldEludGVycnVwdFN0YXRlKCkgd2l0aCBUUlVFIGlzIHNh ZmUgYXMgQ29yZVNldEludGVycnVwdFN0YXRlKCkgd2lsbCBkaXJlY3RseSByZXR1cm4NCisgICAg Ly8gd2hlbiBnQ3B1IGlzIE5VTEwuDQorICAgIC8vDQorICAgIEludGVycnVwdFN0YXRlID0gVFJV RTsNCisgICAgaWYgKGdDcHUgIT0gTlVMTCkgew0KKyAgICAgIGdDcHUtPkdldEludGVycnVwdFN0 YXRlIChnQ3B1LCAmSW50ZXJydXB0U3RhdGUpOw0KKyAgICB9DQorDQorICAgIGlmIChJbnRlcnJ1 cHRTdGF0ZSkgew0KKyAgICAgIC8vDQorICAgICAgLy8gSW50ZXJydXB0cyBhcmUgY3VycmVudGx5 IGVuYWJsZWQuDQorICAgICAgLy8gRGlzYWJsZSB0aGVtIGZvciBnb2luZyB0byBISUdIIGxldmVs Lg0KKyAgICAgIC8vDQorICAgICAgQ29yZVNldEludGVycnVwdFN0YXRlIChGQUxTRSk7DQorICAg IH0gZWxzZSB7DQorICAgICAgLy8NCisgICAgICAvLyBXaXRoaW4gYW4gaW50ZXJydXB0IGhhbmRs ZXIuICBTYXZlIHRoZSBUUEwgdGhhdCB3YXMgaW50ZXJydXB0ZWQ7DQorICAgICAgLy8gSXQgbXVz dCBiZSBoaWdoZXIgdGhhbiB0aGUgcHJldmlvdXNseSBpbnRlcnJ1cHRlZCBUUEwsIHNpbmNlDQor ICAgICAgLy8gQ29yZVJlc3RvcmVUcGwgdW53aW5kcyBhbGwgaGFuZGxlcnMgdXAgdG8gdGhlIHJl cXVlc3RlZCBUUEwuDQorICAgICAgLy8NCisgICAgICBBU1NFUlQgKChJTlROKWdFZmlDdXJyZW50 VHBsID4gSGlnaEJpdFNldDY0IChtSW50ZXJydXB0ZWRUcGxNYXNrKSk7DQorICAgICAgbUludGVy cnVwdGVkVHBsTWFzayB8PSAoVUlOVE4pKDEgPDwgZ0VmaUN1cnJlbnRUcGwpOw0KKyAgICB9DQog ICB9DQogDQogICAvLw0KQEAgLTE2MSw1ICsxOTEsNDYgQEAgQ29yZVJlc3RvcmVUcGwgKAogICBJ TiBFRklfVFBMIE5ld1RwbA0KICAgKQ0KIHsNCisgIEJPT0xFQU4gSW5JbnRlcnJ1cHRIYW5kbGVy ID0gRkFMU0U7DQorDQorICAvLw0KKyAgLy8gVW53aW5kIHRoZSBuZXN0ZWQgaW50ZXJydXB0IGhh bmRsZXJzIHVwIHRvIHRoZSByZXF1aXJlZA0KKyAgLy8gVFBMLCBwYXlpbmcgYXR0ZW50aW9uIG5v dCB0byBvdmVyZmxvdyB0aGUgc3RhY2suICBXaGlsZQ0KKyAgLy8gbm90IHN0cmljdGx5IG5lY2Vz c2FyeSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sDQorICAvLyBhY2NlcHQgdGhlIHBv c3NpYmlsaXR5IHRoYXQgbXVsdGlwbGUgUmFpc2VUUEwgY2FsbHMgYXJlDQorICAvLyB1bmRvbmUg YnkgYSBzaW5nbGUgUmVzdG9yZVRQTA0KKyAgLy8NCisgIHdoaWxlICgoSU5UTilOZXdUcGwgPD0g SGlnaEJpdFNldDY0IChtSW50ZXJydXB0ZWRUcGxNYXNrKSkgew0KKyAgICBVSU5UTiBJbnRlcnJ1 cHRlZFRwbCA9IEhpZ2hCaXRTZXQ2NCAobUludGVycnVwdGVkVHBsTWFzayk7DQorICAgIG1JbnRl cnJ1cHRlZFRwbE1hc2sgJj0gfihVSU5UTikoMSA8PCBJbnRlcnJ1cHRlZFRwbCk7DQorDQorICAg IEFTU0VSVCAoR2V0SW50ZXJydXB0U3RhdGUgKCkgPT0gRkFMU0UpOw0KKyAgICBJbkludGVycnVw dEhhbmRsZXIgPSBUUlVFOw0KKw0KKyAgICAvLw0KKyAgICAvLyBUYWtlIHRoZSBUUEwgZG93biBh IG5vdGNoIHRvIGFsbG93IGV2ZW50IG5vdGlmaWNhdGlvbnMgdG8gYmUNCisgICAgLy8gZGlzcGF0 Y2hlZC4gIFRoaXMgd2lsbCBpbXBsaWNpdGx5IHJlLWVuYWJsZSBpbnRlcnJ1cHRzIChpZg0KKyAg ICAvLyBJbnRlcnJ1cHRlZFRQTCBpcyBiZWxvdyBUUExfSElHSF9MRVZFTCksIGV2ZW4gdGhvdWdo IHdlIGFyZQ0KKyAgICAvLyBzdGlsbCBpbnNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQg dGhlIG5ldyBUUEwgd2lsbA0KKyAgICAvLyBiZSBzZXQgd2hpbGUgdGhleSBhcmUgZGlzYWJsZWQu DQorICAgIC8vDQorICAgIC8vIERlc2lyZWRJbnRlcnJ1cHRTdGF0ZSBtdXN0IGJlIEZBTFNFIHRv IGVuc3VyZSB0aGF0IHRoZQ0KKyAgICAvLyBzdGFjayBkb2VzIG5vdCBibG93IHVwLiAgSWYgd2Ug dXNlZCwgYXMgaW4gdGhlIGZpbmFsIGNhbGwNCisgICAgLy8gYmVsb3csICJJbnRlcnJ1cHRlZFRw bCA8IFRQTF9ISUdIX0xFVkVMIiwgdGhlIHRpbWVyIGludGVycnVwdA0KKyAgICAvLyBoYW5kbGVy IGNvdWxkIGJlIGludm9rZWQgcmVwZWF0ZWRseSBpbiB0aGUgc21hbGwgd2luZG93IGJldHdlZW4N CisgICAgLy8gQ29yZVNldEludGVycnVwdFN0YXRlIChUUlVFKSBhbmQgdGhlIElSRVQgaW5zdHJ1 Y3Rpb24uDQorICAgIC8vDQorICAgIENvcmVSZXN0b3JlVHBsSW50ZXJuYWwgKEludGVycnVwdGVk VHBsLCBGQUxTRSk7DQorDQorICAgIGlmIChJbnRlcnJ1cHRlZFRwbCA9PSBOZXdUcGwpIHsNCisg ICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLy8NCisgIC8vIElmIHdlIGdldCBoZXJl IHdpdGggSW5JbnRlcnJ1cHRIYW5kbGVyID09IFRSVUUsIGFuIGludGVycnVwdA0KKyAgLy8gaGFu ZGxlciBmb3Jnb3QgdG8gcmVzdG9yZSB0aGUgVFBMLg0KKyAgLy8NCisgIEFTU0VSVCAoIUluSW50 ZXJydXB0SGFuZGxlcik7DQogICBDb3JlUmVzdG9yZVRwbEludGVybmFsIChOZXdUcGwsIE5ld1Rw bCA8IFRQTF9ISUdIX0xFVkVMKTsNCiB9DQotLSAKMi40My4yCgo= --00000000000021af2806128e43d6--