From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752350AbcGYIVU (ORCPT ); Mon, 25 Jul 2016 04:21:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49861 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751202AbcGYIVM (ORCPT ); Mon, 25 Jul 2016 04:21:12 -0400 Reply-To: xlpang@redhat.com Subject: Re: [PATCH 3/3] x86/apic: Improved the setting of interrupt mode for bsp References: <1469175026-29447-1-git-send-email-weijg.fnst@cn.fujitsu.com> <1469175026-29447-3-git-send-email-weijg.fnst@cn.fujitsu.com> <20160722104034.GB3543@x1.redhat.com> <1469415695.2020.60.camel@localhost> To: "Wei, Jiangang" , "bhe@redhat.com" Cc: "kexec@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "Cao, Jin" , "tglx@linutronix.de" , "kernel@kyup.com" , "x86@kernel.org" , "hpa@zytor.com" , "mingo@redhat.com" , "ebiederm@xmission.com" , "joro@8bytes.org" From: Xunlei Pang Message-ID: <5795CBF2.3070407@redhat.com> Date: Mon, 25 Jul 2016 16:21:06 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <1469415695.2020.60.camel@localhost> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 25 Jul 2016 08:21:11 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/07/25 at 11:04, Wei, Jiangang wrote: > Hi He, > > Thanks for your response firstly. > > On Fri, 2016-07-22 at 18:40 +0800, Baoquan He wrote: >> Hi Jiangang, >> >> This is very nice, should be the stuff Eric and Ingo would like to see. >> But I have several questions: >> >> 1) Are you not going to clean up the old legacy irq mode setting code in >> 1st kernel? > Yes, I would like to pay more attention on fixing kdump's failure with > notsc. > No plan to clean up the irq mode setting codes in the crash kernel > reboot path. > If you are interested in it, please go on. > >> 2)I call them legacy irq mode because not only apic virtual wire mode >> exists, but the PIC mode in x86 32bit system. You need consider it too. >> Then init_bsp_APIC need be renamaed to an appropriate one. And assume >> this has been tested on x86 32bit system. > Thanks for your reminders. > As the comment of init_bsp_APIC(), it's just used to setup the virtual > wire mode. > so I won't change its name. > > But i agree with that PIC mode should be considered. > Next version will be like below, > > diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c > index 04358e0cf1e2..d40bab947a2a 100644 > --- a/arch/x86/kernel/apic/apic.c > +++ b/arch/x86/kernel/apic/apic.c > @@ -1186,7 +1186,7 @@ void __init init_bsp_APIC(void) > * the worst case is that both of them are inactive, > * If so, We need to enable the virtual wire mode via > through-local-APIC > */ > - if (smp_found_config || !boot_cpu_has(X86_FEATURE_APIC) > + if ( pic_mode || (smp_found_config && check_virtual_wire_mode()) I think this is needless, as init_bsp_APIC() is made under the following condition: #if defined(CONFIG_X86_64) || defined(CONFIG_X86_LOCAL_APIC) > || > !boot_cpu_has(X86_FEATURE_APIC)) > return; >> 3) >> >> *)About IO-APIC setting as virtual wire mode, I am always confused. In >> MP Spec 3.6.2.2, it says "the interrupt signal passes through both the >> I/O APIC and the BSP’s local APIC". That means IO-APIC virtual wire mode >> need both IO-APIC and LAPIC to be set, and with my understanding only >> pin of IO-APIC is set as ExtInt, LAPIC should be pass-through. >> >> *)But in Intel Arch manual 3A 10.1, there's only below sentences to mention >> it: >> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> The I/O APIC also has a “virtual wire mode” that allows it to communicate >> with a standard 8259A-style external interrupt controller. Note that the >> local APIC can be disabled. This allows an associated processor core to >> receive interrupts directly from an 8259A interrupt controller. >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> Eric's code in native_disable_io_apic() has the same point as above >> words. > IMO, > the through-IO-APIC mode has no relationship with the setting of local > APIC. > that's why i only check the pin of IO-APIC in virtual_wire_via_ioapic(). For through-IO-APIC mode, I think the bsp local apic should be on, but its LINT0 pin must not be set to be "ExtINT"(I guess with this mode set will make it to be through-LAPIC mode), and we can clearly see the fact from disconnect_bsp_APIC()'s implementation. Regards, Xunlei > Thanks > wei >> *)However please read code comments in irq_remapping_disable_io_apic(), >> Joerg's description give me a different impression that we can choose >> to only use LAPIC virtual wire mode. Joerg is IOMMU maintainers, he is >> very familiar with io-apic since IOMMU need take over io-apic entry >> filling, there must be reason he wrote that. Add Joerg to CC list. >> >> Seems it's difficult to find a system with IO-APIC virtual wire mode, >> maybe we can just keep it as is. Not sure if Intel engineers can help >> explain and confirm this. >> >> That's all I can think of. >> >> Thanks >> Baoquan >> >> On 07/22/16 at 04:10pm, Wei Jiangang wrote: >>> If we specify the 'notsc' parameter for the dump-capture kernel, >>> and then trigger a crash(panic) by using "ALT-SysRq-c" or >>> "echo c > /proc/sysrq-trigger", the dump-capture kernel will >>> hang in calibrate_delay_converge() and wait for jiffies changes. >>> serial log as follows: >>> >>> tsc: Fast TSC calibration using PIT >>> tsc: Detected 2099.947 MHz processor >>> Calibrating delay loop... >>> >>> The reason for jiffies not changes is there's no timer interrupt >>> passed to dump-capture kernel. >>> >>> In fact, once kernel panic occurs, the local APIC is disabled >>> by lapic_shutdown() in reboot path. >>> generly speaking, local APIC state can be initialized by BIOS >>> after Power-Up or Reset, which doesn't apply to kdump case. >>> so the kernel has to be responsible for initialize the interrupt >>> mode properly according the latest status of APIC in bootup path. >>> >>> An MP operating system is booted under either PIC mode or >>> virtual wire mode. Later, the operating system switches to >>> symmetric I/O mode as it enters multiprocessor mode. >>> Two kinds of virtual wire mode are defined in Intel MP spec: >>> virtual wire mode via local APIC or via I/O APIC. >>> >>> Now we determine the mode of APIC only through a SMP BIOS(MP table). >>> That's not enough. >>> It's better to do further check if APIC works with effective mode, >>> and do some porper setting. >>> >>> Signed-off-by: Cao jin >>> Signed-off-by: Wei Jiangang >>> --- >>> arch/x86/include/asm/io_apic.h | 5 ++++ >>> arch/x86/kernel/apic/apic.c | 55 +++++++++++++++++++++++++++++++++++++++++- >>> arch/x86/kernel/apic/io_apic.c | 28 +++++++++++++++++++++ >>> 3 files changed, 87 insertions(+), 1 deletion(-) >>> >>> diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h >>> index 6cbf2cfb3f8a..6550bd43fa39 100644 >>> --- a/arch/x86/include/asm/io_apic.h >>> +++ b/arch/x86/include/asm/io_apic.h >>> @@ -190,6 +190,7 @@ static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) >>> } >>> >>> extern void setup_IO_APIC(void); >>> +extern bool virtual_wire_via_ioapic(void); >>> extern void enable_IO_APIC(void); >>> extern void disable_IO_APIC(void); >>> extern void setup_ioapic_dest(void); >>> @@ -231,6 +232,10 @@ static inline void io_apic_init_mappings(void) { } >>> #define native_disable_io_apic NULL >>> >>> static inline void setup_IO_APIC(void) { } >>> +static inline bool virtual_wire_via_ioapic(void) >>> +{ >>> + return true; >>> +} >>> static inline void enable_IO_APIC(void) { } >>> static inline void setup_ioapic_dest(void) { } >>> >>> diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c >>> index 8e25b9b2d351..04358e0cf1e2 100644 >>> --- a/arch/x86/kernel/apic/apic.c >>> +++ b/arch/x86/kernel/apic/apic.c >>> @@ -1124,6 +1124,53 @@ void __init sync_Arb_IDs(void) >>> } >>> >>> /* >>> + * Return false means the virtual wire mode through-local-apic is inactive >>> + */ >>> +static bool virtual_wire_via_lapic(void) >>> +{ >>> + unsigned int value; >>> + >>> + /* Check the APIC global enable/disable flag firstly */ >>> + if (boot_cpu_data.x86 >= 6) { >>> + u32 h, l; >>> + >>> + rdmsr(MSR_IA32_APICBASE, l, h); >>> + /* >>> + * If local APIC is disabled by BIOS >>> + * do nothing, but return true >>> + */ >>> + if (!(l & MSR_IA32_APICBASE_ENABLE)) >>> + return true; >>> + } >>> + >>> + /* Check the software enable/disable flag */ >>> + value = apic_read(APIC_SPIV); >>> + if (!(value & APIC_SPIV_APIC_ENABLED)) >>> + return false; >>> + >>> + /* >>> + * Virtual wire mode via local APIC requests >>> + * APIC to enable the LINT0 for edge-trggered ExtINT delivery mode >>> + * and LINT1 for level-triggered NMI delivery mode >>> + */ >>> + value = apic_read(APIC_LVT0); >>> + if (GET_APIC_DELIVERY_MODE(value) != APIC_MODE_EXTINT) >>> + return false; >>> + >>> + value = apic_read(APIC_LVT1); >>> + if (GET_APIC_DELIVERY_MODE(value) != APIC_MODE_NMI) >>> + return false; >>> + >>> + return true; >>> +} >>> + >>> +static bool check_virtual_wire_mode(void) >>> +{ >>> + /* Neither of virtual wire mode is active, return false */ >>> + return virtual_wire_via_lapic() || virtual_wire_via_ioapic(); >>> +} >>> + >>> +/* >>> * An initial setup of the virtual wire mode. >>> */ >>> void __init init_bsp_APIC(void) >>> @@ -1133,8 +1180,14 @@ void __init init_bsp_APIC(void) >>> /* >>> * Don't do the setup now if we have a SMP BIOS as the >>> * through-I/O-APIC virtual wire mode might be active. >>> + * >>> + * It's better to do further check if either through-I/O-APIC >>> + * or through-local-APIC is active. >>> + * the worst case is that both of them are inactive, >>> + * If so, We need to enable the virtual wire mode via through-local-APIC >>> */ >>> - if (smp_found_config || !boot_cpu_has(X86_FEATURE_APIC)) >>> + if ((smp_found_config && check_virtual_wire_mode()) || >>> + !boot_cpu_has(X86_FEATURE_APIC)) >>> return; >>> >>> /* >>> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c >>> index 446702ed99dc..5a32c26938ac 100644 >>> --- a/arch/x86/kernel/apic/io_apic.c >>> +++ b/arch/x86/kernel/apic/io_apic.c >>> @@ -1379,6 +1379,34 @@ void __init print_IO_APICs(void) >>> /* Where if anywhere is the i8259 connect in external int mode */ >>> static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; >>> >>> +/* >>> + * Return false means the virtual wire mode via I/O APIC is inactive >>> + */ >>> +bool virtual_wire_via_ioapic(void) >>> +{ >>> + int apic, pin; >>> + >>> + for_each_ioapic_pin(apic, pin) { >>> + /* See if any of the pins is in ExtINT mode */ >>> + struct IO_APIC_route_entry entry = ioapic_read_entry(apic, pin); >>> + >>> + /* >>> + * If the interrupt line is enabled and in ExtInt mode >>> + * I have found the pin where the i8259 is connected. >>> + */ >>> + if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) >>> + return true; >>> + } >>> + >>> + /* >>> + * Virtual wire mode via I/O APIC requests >>> + * I/O APIC be connected to i8259 in chapter 3.6.2.2 of the MP v1.4 spec >>> + * If no pin in ExtInt mode, >>> + * the through-I/O-APIC virtual wire mode can be regarded inactive. >>> + */ >>> + return false; >>> +} >>> + >>> void __init enable_IO_APIC(void) >>> { >>> int i8259_apic, i8259_pin; >>> -- >>> 1.9.3 >>> >>> >>> >> > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.redhat.com ([209.132.183.28]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bRb8m-00053b-P5 for kexec@lists.infradead.org; Mon, 25 Jul 2016 08:21:35 +0000 Subject: Re: [PATCH 3/3] x86/apic: Improved the setting of interrupt mode for bsp References: <1469175026-29447-1-git-send-email-weijg.fnst@cn.fujitsu.com> <1469175026-29447-3-git-send-email-weijg.fnst@cn.fujitsu.com> <20160722104034.GB3543@x1.redhat.com> <1469415695.2020.60.camel@localhost> From: Xunlei Pang Message-ID: <5795CBF2.3070407@redhat.com> Date: Mon, 25 Jul 2016 16:21:06 +0800 MIME-Version: 1.0 In-Reply-To: <1469415695.2020.60.camel@localhost> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: xlpang@redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: "Wei, Jiangang" , "bhe@redhat.com" Cc: "joro@8bytes.org" , "x86@kernel.org" , "kexec@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "Cao, Jin" , "mingo@redhat.com" , "kernel@kyup.com" , "ebiederm@xmission.com" , "hpa@zytor.com" , "tglx@linutronix.de" T24gMjAxNi8wNy8yNSBhdCAxMTowNCwgV2VpLCBKaWFuZ2FuZyB3cm90ZToKPiBIaSBIZSwKPgo+ IFRoYW5rcyBmb3IgeW91ciByZXNwb25zZSBmaXJzdGx5Lgo+Cj4gT24gRnJpLCAyMDE2LTA3LTIy IGF0IDE4OjQwICswODAwLCBCYW9xdWFuIEhlIHdyb3RlOgo+PiBIaSBKaWFuZ2FuZywKPj4KPj4g VGhpcyBpcyB2ZXJ5IG5pY2UsIHNob3VsZCBiZSB0aGUgc3R1ZmYgRXJpYyBhbmQgSW5nbyB3b3Vs ZCBsaWtlIHRvIHNlZS4KPj4gQnV0IEkgaGF2ZSBzZXZlcmFsIHF1ZXN0aW9uczoKPj4KPj4gMSkg QXJlIHlvdSBub3QgZ29pbmcgdG8gY2xlYW4gdXAgdGhlIG9sZCBsZWdhY3kgaXJxIG1vZGUgc2V0 dGluZyBjb2RlIGluCj4+IDFzdCBrZXJuZWw/Cj4gWWVzLCBJIHdvdWxkIGxpa2UgdG8gcGF5IG1v cmUgYXR0ZW50aW9uIG9uIGZpeGluZyBrZHVtcCdzIGZhaWx1cmUgd2l0aAo+IG5vdHNjLgo+IE5v IHBsYW4gdG8gY2xlYW4gdXAgdGhlIGlycSBtb2RlIHNldHRpbmcgY29kZXMgaW4gdGhlIGNyYXNo IGtlcm5lbAo+IHJlYm9vdCBwYXRoLgo+IElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBpdCwgcGxl YXNlIGdvIG9uLgo+Cj4+IDIpSSBjYWxsIHRoZW0gbGVnYWN5IGlycSBtb2RlIGJlY2F1c2Ugbm90 IG9ubHkgYXBpYyB2aXJ0dWFsIHdpcmUgbW9kZQo+PiBleGlzdHMsIGJ1dCB0aGUgUElDIG1vZGUg aW4geDg2IDMyYml0IHN5c3RlbS4gWW91IG5lZWQgY29uc2lkZXIgaXQgdG9vLgo+PiBUaGVuIGlu aXRfYnNwX0FQSUMgbmVlZCBiZSByZW5hbWFlZCB0byBhbiBhcHByb3ByaWF0ZSBvbmUuIEFuZCBh c3N1bWUKPj4gdGhpcyBoYXMgYmVlbiB0ZXN0ZWQgb24geDg2IDMyYml0IHN5c3RlbS4gCj4gVGhh bmtzIGZvciB5b3VyIHJlbWluZGVycy4KPiBBcyB0aGUgY29tbWVudCBvZiBpbml0X2JzcF9BUElD KCksIGl0J3MganVzdCB1c2VkIHRvIHNldHVwIHRoZSB2aXJ0dWFsCj4gd2lyZSBtb2RlLgo+IHNv IEkgd29uJ3QgY2hhbmdlIGl0cyBuYW1lLgo+Cj4gQnV0IGkgYWdyZWUgd2l0aCB0aGF0IFBJQyBt b2RlIHNob3VsZCBiZSBjb25zaWRlcmVkLgo+IE5leHQgdmVyc2lvbiB3aWxsIGJlIGxpa2UgYmVs b3csCj4KPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94 ODYva2VybmVsL2FwaWMvYXBpYy5jCj4gaW5kZXggMDQzNThlMGNmMWUyLi5kNDBiYWI5NDdhMmEg MTAwNjQ0Cj4gLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCj4gKysrIGIvYXJjaC94 ODYva2VybmVsL2FwaWMvYXBpYy5jCj4gQEAgLTExODYsNyArMTE4Niw3IEBAIHZvaWQgX19pbml0 IGluaXRfYnNwX0FQSUModm9pZCkKPiAgICAgICAgICAqIHRoZSB3b3JzdCBjYXNlIGlzIHRoYXQg Ym90aCBvZiB0aGVtIGFyZSBpbmFjdGl2ZSwKPiAgICAgICAgICAqIElmIHNvLCBXZSBuZWVkIHRv IGVuYWJsZSB0aGUgdmlydHVhbCB3aXJlIG1vZGUgdmlhCj4gdGhyb3VnaC1sb2NhbC1BUElDCj4g ICAgICAgICAgKi8KPiAtICAgICAgIGlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFib290X2NwdV9o YXMoWDg2X0ZFQVRVUkVfQVBJQykKPiArICAgICAgIGlmICggcGljX21vZGUgfHwgKHNtcF9mb3Vu ZF9jb25maWcgJiYgY2hlY2tfdmlydHVhbF93aXJlX21vZGUoKSkKCkkgdGhpbmsgdGhpcyBpcyBu ZWVkbGVzcywgYXMgaW5pdF9ic3BfQVBJQygpIGlzIG1hZGUgdW5kZXIgdGhlIGZvbGxvd2luZyBj b25kaXRpb246CiNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4 Nl9MT0NBTF9BUElDKQoKPiB8fAo+ICAgICAgICAgICAgICAgICAhYm9vdF9jcHVfaGFzKFg4Nl9G RUFUVVJFX0FQSUMpKQo+ICAgICAgICAgICAgICAgICByZXR1cm47Cj4+IDMpIAo+Pgo+PiAqKUFi b3V0IElPLUFQSUMgc2V0dGluZyBhcyB2aXJ0dWFsIHdpcmUgbW9kZSwgSSBhbSBhbHdheXMgY29u ZnVzZWQuIEluCj4+IE1QIFNwZWMgMy42LjIuMiwgaXQgc2F5cyAidGhlIGludGVycnVwdCBzaWdu YWwgcGFzc2VzIHRocm91Z2ggYm90aCB0aGUKPj4gSS9PIEFQSUMgYW5kIHRoZSBCU1DigJlzIGxv Y2FsIEFQSUMiLiBUaGF0IG1lYW5zIElPLUFQSUMgdmlydHVhbCB3aXJlIG1vZGUKPj4gbmVlZCBi b3RoIElPLUFQSUMgYW5kIExBUElDIHRvIGJlIHNldCwgYW5kIHdpdGggbXkgdW5kZXJzdGFuZGlu ZyBvbmx5Cj4+IHBpbiBvZiBJTy1BUElDIGlzIHNldCBhcyBFeHRJbnQsIExBUElDIHNob3VsZCBi ZSBwYXNzLXRocm91Z2guCj4+Cj4+ICopQnV0IGluIEludGVsIEFyY2ggbWFudWFsIDNBIDEwLjEs IHRoZXJlJ3Mgb25seSBiZWxvdyBzZW50ZW5jZXMgdG8gbWVudGlvbgo+PiBpdDoKPj4KPj4gfn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+Cj4+IFRoZSBJL08gQVBJQyBhbHNvIGhhcyBhIOKAnHZpcnR1YWwgd2lyZSBtb2Rl4oCdIHRo YXQgYWxsb3dzIGl0IHRvIGNvbW11bmljYXRlCj4+IHdpdGggYSBzdGFuZGFyZCA4MjU5QS1zdHls ZSBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbGxlci4gTm90ZSB0aGF0IHRoZQo+PiBsb2NhbCBB UElDIGNhbiBiZSBkaXNhYmxlZC4gVGhpcyBhbGxvd3MgYW4gYXNzb2NpYXRlZCBwcm9jZXNzb3Ig Y29yZSB0bwo+PiByZWNlaXZlIGludGVycnVwdHMgZGlyZWN0bHkgZnJvbSBhbiA4MjU5QSBpbnRl cnJ1cHQgY29udHJvbGxlci4KPj4gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgo+Pgo+PiBFcmljJ3MgY29kZSBpbiBuYXRpdmVf ZGlzYWJsZV9pb19hcGljKCkgaGFzIHRoZSBzYW1lIHBvaW50IGFzIGFib3ZlCj4+IHdvcmRzLgo+ IElNT++8jAo+IHRoZSB0aHJvdWdoLUlPLUFQSUMgbW9kZSBoYXMgbm8gcmVsYXRpb25zaGlwIHdp dGggdGhlIHNldHRpbmcgb2YgbG9jYWwKPiBBUElDLgo+IHRoYXQncyB3aHkgaSBvbmx5IGNoZWNr IHRoZSBwaW4gb2YgSU8tQVBJQyBpbiB2aXJ0dWFsX3dpcmVfdmlhX2lvYXBpYygpLgoKRm9yIHRo cm91Z2gtSU8tQVBJQyBtb2RlLCBJIHRoaW5rIHRoZSBic3AgbG9jYWwgYXBpYyBzaG91bGQgYmUg b24sIGJ1dCBpdHMgTElOVDAgcGluIG11c3Qgbm90CmJlIHNldCB0byBiZSAiRXh0SU5UIihJIGd1 ZXNzIHdpdGggdGhpcyBtb2RlIHNldCB3aWxsIG1ha2UgaXQgdG8gYmUgdGhyb3VnaC1MQVBJQyBt b2RlKSwgYW5kCndlIGNhbiBjbGVhcmx5IHNlZSB0aGUgZmFjdCBmcm9tIGRpc2Nvbm5lY3RfYnNw X0FQSUMoKSdzIGltcGxlbWVudGF0aW9uLgoKUmVnYXJkcywKWHVubGVpCj4gVGhhbmtzCj4gd2Vp Cj4+ICopSG93ZXZlciBwbGVhc2UgcmVhZCBjb2RlIGNvbW1lbnRzIGluIGlycV9yZW1hcHBpbmdf ZGlzYWJsZV9pb19hcGljKCksCj4+IEpvZXJnJ3MgZGVzY3JpcHRpb24gZ2l2ZSBtZSBhIGRpZmZl cmVudCBpbXByZXNzaW9uIHRoYXQgd2UgY2FuIGNob29zZQo+PiB0byBvbmx5IHVzZSBMQVBJQyB2 aXJ0dWFsIHdpcmUgbW9kZS4gSm9lcmcgaXMgSU9NTVUgbWFpbnRhaW5lcnMsIGhlIGlzCj4+IHZl cnkgZmFtaWxpYXIgd2l0aCBpby1hcGljIHNpbmNlIElPTU1VIG5lZWQgdGFrZSBvdmVyIGlvLWFw aWMgZW50cnkKPj4gZmlsbGluZywgdGhlcmUgbXVzdCBiZSByZWFzb24gaGUgd3JvdGUgdGhhdC4g QWRkIEpvZXJnIHRvIENDIGxpc3QuCj4+Cj4+IFNlZW1zIGl0J3MgZGlmZmljdWx0IHRvIGZpbmQg YSBzeXN0ZW0gd2l0aCBJTy1BUElDIHZpcnR1YWwgd2lyZSBtb2RlLAo+PiBtYXliZSB3ZSBjYW4g anVzdCBrZWVwIGl0IGFzIGlzLiBOb3Qgc3VyZSBpZiBJbnRlbCBlbmdpbmVlcnMgY2FuIGhlbHAK Pj4gZXhwbGFpbiBhbmQgY29uZmlybSB0aGlzLgo+Pgo+PiBUaGF0J3MgYWxsIEkgY2FuIHRoaW5r IG9mLgo+Pgo+PiBUaGFua3MKPj4gQmFvcXVhbgo+Pgo+PiBPbiAwNy8yMi8xNiBhdCAwNDoxMHBt LCBXZWkgSmlhbmdhbmcgd3JvdGU6Cj4+PiBJZiB3ZSBzcGVjaWZ5IHRoZSAnbm90c2MnIHBhcmFt ZXRlciBmb3IgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwsCj4+PiBhbmQgdGhlbiB0cmlnZ2VyIGEg Y3Jhc2gocGFuaWMpIGJ5IHVzaW5nICJBTFQtU3lzUnEtYyIgb3IKPj4+ICJlY2hvIGMgPiAvcHJv Yy9zeXNycS10cmlnZ2VyIiwgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgd2lsbAo+Pj4gaGFuZyBp biBjYWxpYnJhdGVfZGVsYXlfY29udmVyZ2UoKSBhbmQgd2FpdCBmb3IgamlmZmllcyBjaGFuZ2Vz Lgo+Pj4gc2VyaWFsIGxvZyBhcyBmb2xsb3dzOgo+Pj4KPj4+ICAgICB0c2M6IEZhc3QgVFNDIGNh bGlicmF0aW9uIHVzaW5nIFBJVAo+Pj4gICAgIHRzYzogRGV0ZWN0ZWQgMjA5OS45NDcgTUh6IHBy b2Nlc3Nvcgo+Pj4gICAgIENhbGlicmF0aW5nIGRlbGF5IGxvb3AuLi4KPj4+Cj4+PiBUaGUgcmVh c29uIGZvciBqaWZmaWVzIG5vdCBjaGFuZ2VzIGlzIHRoZXJlJ3Mgbm8gdGltZXIgaW50ZXJydXB0 Cj4+PiBwYXNzZWQgdG8gZHVtcC1jYXB0dXJlIGtlcm5lbC4KPj4+Cj4+PiBJbiBmYWN0LCBvbmNl IGtlcm5lbCBwYW5pYyBvY2N1cnMsIHRoZSBsb2NhbCBBUElDIGlzIGRpc2FibGVkCj4+PiBieSBs YXBpY19zaHV0ZG93bigpIGluIHJlYm9vdCBwYXRoLgo+Pj4gZ2VuZXJseSBzcGVha2luZywgbG9j YWwgQVBJQyBzdGF0ZSBjYW4gYmUgaW5pdGlhbGl6ZWQgYnkgQklPUwo+Pj4gYWZ0ZXIgUG93ZXIt VXAgb3IgUmVzZXQsIHdoaWNoIGRvZXNuJ3QgYXBwbHkgdG8ga2R1bXAgY2FzZS4KPj4+IHNvIHRo ZSBrZXJuZWwgaGFzIHRvIGJlIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXplIHRoZSBpbnRlcnJ1 cHQKPj4+IG1vZGUgcHJvcGVybHkgYWNjb3JkaW5nIHRoZSBsYXRlc3Qgc3RhdHVzIG9mIEFQSUMg aW4gYm9vdHVwIHBhdGguCj4+Pgo+Pj4gQW4gTVAgb3BlcmF0aW5nIHN5c3RlbSBpcyBib290ZWQg dW5kZXIgZWl0aGVyIFBJQyBtb2RlIG9yCj4+PiB2aXJ0dWFsIHdpcmUgbW9kZS4gTGF0ZXIsIHRo ZSBvcGVyYXRpbmcgc3lzdGVtIHN3aXRjaGVzIHRvCj4+PiBzeW1tZXRyaWMgSS9PIG1vZGUgYXMg aXQgZW50ZXJzIG11bHRpcHJvY2Vzc29yIG1vZGUuCj4+PiBUd28ga2luZHMgb2YgdmlydHVhbCB3 aXJlIG1vZGUgYXJlIGRlZmluZWQgaW4gSW50ZWwgTVAgc3BlYzoKPj4+IHZpcnR1YWwgd2lyZSBt b2RlIHZpYSBsb2NhbCBBUElDIG9yIHZpYSBJL08gQVBJQy4KPj4+Cj4+PiBOb3cgd2UgZGV0ZXJt aW5lIHRoZSBtb2RlIG9mIEFQSUMgb25seSB0aHJvdWdoIGEgU01QIEJJT1MoTVAgdGFibGUpLgo+ Pj4gVGhhdCdzIG5vdCBlbm91Z2guCj4+PiBJdCdzIGJldHRlciB0byBkbyBmdXJ0aGVyIGNoZWNr IGlmIEFQSUMgd29ya3Mgd2l0aCBlZmZlY3RpdmUgbW9kZSwKPj4+IGFuZCBkbyBzb21lIHBvcnBl ciBzZXR0aW5nLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IENhbyBqaW4gPGNhb2ouZm5zdEBjbi5m dWppdHN1LmNvbT4KPj4+IFNpZ25lZC1vZmYtYnk6IFdlaSBKaWFuZ2FuZyA8d2VpamcuZm5zdEBj bi5mdWppdHN1LmNvbT4KPj4+IC0tLQo+Pj4gIGFyY2gveDg2L2luY2x1ZGUvYXNtL2lvX2FwaWMu aCB8ICA1ICsrKysKPj4+ICBhcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgICAgfCA1NSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPj4+ICBhcmNoL3g4Ni9rZXJu ZWwvYXBpYy9pb19hcGljLmMgfCAyOCArKysrKysrKysrKysrKysrKysrKysKPj4+ICAzIGZpbGVz IGNoYW5nZWQsIDg3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPj4+Cj4+PiBkaWZmIC0t Z2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9h c20vaW9fYXBpYy5oCj4+PiBpbmRleCA2Y2JmMmNmYjNmOGEuLjY1NTBiZDQzZmEzOSAxMDA2NDQK Pj4+IC0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvX2FwaWMuaAo+Pj4gKysrIGIvYXJjaC94 ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oCj4+PiBAQCAtMTkwLDYgKzE5MCw3IEBAIHN0YXRpYyBp bmxpbmUgdW5zaWduZWQgaW50IGlvX2FwaWNfcmVhZCh1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWdu ZWQgaW50IHJlZykKPj4+ICB9Cj4+PiAgCj4+PiAgZXh0ZXJuIHZvaWQgc2V0dXBfSU9fQVBJQyh2 b2lkKTsKPj4+ICtleHRlcm4gYm9vbCB2aXJ0dWFsX3dpcmVfdmlhX2lvYXBpYyh2b2lkKTsKPj4+ ICBleHRlcm4gdm9pZCBlbmFibGVfSU9fQVBJQyh2b2lkKTsKPj4+ICBleHRlcm4gdm9pZCBkaXNh YmxlX0lPX0FQSUModm9pZCk7Cj4+PiAgZXh0ZXJuIHZvaWQgc2V0dXBfaW9hcGljX2Rlc3Qodm9p ZCk7Cj4+PiBAQCAtMjMxLDYgKzIzMiwxMCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW9fYXBpY19p bml0X21hcHBpbmdzKHZvaWQpIHsgfQo+Pj4gICNkZWZpbmUgbmF0aXZlX2Rpc2FibGVfaW9fYXBp YwkJTlVMTAo+Pj4gIAo+Pj4gIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9JT19BUElDKHZvaWQp IHsgfQo+Pj4gK3N0YXRpYyBpbmxpbmUgYm9vbCB2aXJ0dWFsX3dpcmVfdmlhX2lvYXBpYyh2b2lk KQo+Pj4gK3sKPj4+ICsJcmV0dXJuIHRydWU7Cj4+PiArfQo+Pj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCBlbmFibGVfSU9fQVBJQyh2b2lkKSB7IH0KPj4+ICBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBf aW9hcGljX2Rlc3Qodm9pZCkgeyB9Cj4+PiAgCj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2Vy bmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCj4+PiBpbmRleCA4 ZTI1YjliMmQzNTEuLjA0MzU4ZTBjZjFlMiAxMDA2NDQKPj4+IC0tLSBhL2FyY2gveDg2L2tlcm5l bC9hcGljL2FwaWMuYwo+Pj4gKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCj4+PiBA QCAtMTEyNCw2ICsxMTI0LDUzIEBAIHZvaWQgX19pbml0IHN5bmNfQXJiX0lEcyh2b2lkKQo+Pj4g IH0KPj4+ICAKPj4+ICAvKgo+Pj4gKyAqIFJldHVybiBmYWxzZSBtZWFucyB0aGUgdmlydHVhbCB3 aXJlIG1vZGUgdGhyb3VnaC1sb2NhbC1hcGljIGlzIGluYWN0aXZlCj4+PiArICovCj4+PiArc3Rh dGljIGJvb2wgdmlydHVhbF93aXJlX3ZpYV9sYXBpYyh2b2lkKQo+Pj4gK3sKPj4+ICsJdW5zaWdu ZWQgaW50IHZhbHVlOwo+Pj4gKwo+Pj4gKwkvKiBDaGVjayB0aGUgQVBJQyBnbG9iYWwgZW5hYmxl L2Rpc2FibGUgZmxhZyBmaXJzdGx5ICovCj4+PiArCWlmIChib290X2NwdV9kYXRhLng4NiA+PSA2 KSB7Cj4+PiArCQl1MzIgaCwgbDsKPj4+ICsKPj4+ICsJCXJkbXNyKE1TUl9JQTMyX0FQSUNCQVNF LCBsLCBoKTsKPj4+ICsJCS8qCj4+PiArCQkgKiBJZiBsb2NhbCBBUElDIGlzIGRpc2FibGVkIGJ5 IEJJT1MKPj4+ICsJCSAqIGRvIG5vdGhpbmcsIGJ1dCByZXR1cm4gdHJ1ZQo+Pj4gKwkJICovCj4+ PiArCQlpZiAoIShsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkKPj4+ICsJCQlyZXR1cm4g dHJ1ZTsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwkvKiBDaGVjayB0aGUgc29mdHdhcmUgZW5hYmxlL2Rp c2FibGUgZmxhZyAqLwo+Pj4gKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwo+Pj4gKwlp ZiAoISh2YWx1ZSAmIEFQSUNfU1BJVl9BUElDX0VOQUJMRUQpKQo+Pj4gKwkJcmV0dXJuIGZhbHNl Owo+Pj4gKwo+Pj4gKwkvKgo+Pj4gKwkgKiBWaXJ0dWFsIHdpcmUgbW9kZSB2aWEgbG9jYWwgQVBJ QyByZXF1ZXN0cwo+Pj4gKwkgKiBBUElDIHRvIGVuYWJsZSB0aGUgTElOVDAgZm9yIGVkZ2UtdHJn Z2VyZWQgRXh0SU5UIGRlbGl2ZXJ5IG1vZGUKPj4+ICsJICogYW5kIExJTlQxIGZvciBsZXZlbC10 cmlnZ2VyZWQgTk1JIGRlbGl2ZXJ5IG1vZGUKPj4+ICsJICovCj4+PiArCXZhbHVlID0gYXBpY19y ZWFkKEFQSUNfTFZUMCk7Cj4+PiArCWlmIChHRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlKSAh PSBBUElDX01PREVfRVhUSU5UKQo+Pj4gKwkJcmV0dXJuIGZhbHNlOwo+Pj4gKwo+Pj4gKwl2YWx1 ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOwo+Pj4gKwlpZiAoR0VUX0FQSUNfREVMSVZFUllfTU9E RSh2YWx1ZSkgIT0gQVBJQ19NT0RFX05NSSkKPj4+ICsJCXJldHVybiBmYWxzZTsKPj4+ICsKPj4+ ICsJcmV0dXJuIHRydWU7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIGNoZWNrX3ZpcnR1 YWxfd2lyZV9tb2RlKHZvaWQpCj4+PiArewo+Pj4gKwkvKiBOZWl0aGVyIG9mIHZpcnR1YWwgd2ly ZSBtb2RlIGlzIGFjdGl2ZSwgcmV0dXJuIGZhbHNlICovCj4+PiArCXJldHVybiAgdmlydHVhbF93 aXJlX3ZpYV9sYXBpYygpIHx8IHZpcnR1YWxfd2lyZV92aWFfaW9hcGljKCk7Cj4+PiArfQo+Pj4g Kwo+Pj4gKy8qCj4+PiAgICogQW4gaW5pdGlhbCBzZXR1cCBvZiB0aGUgdmlydHVhbCB3aXJlIG1v ZGUuCj4+PiAgICovCj4+PiAgdm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQo+Pj4gQEAg LTExMzMsOCArMTE4MCwxNCBAQCB2b2lkIF9faW5pdCBpbml0X2JzcF9BUElDKHZvaWQpCj4+PiAg CS8qCj4+PiAgCSAqIERvbid0IGRvIHRoZSBzZXR1cCBub3cgaWYgd2UgaGF2ZSBhIFNNUCBCSU9T IGFzIHRoZQo+Pj4gIAkgKiB0aHJvdWdoLUkvTy1BUElDIHZpcnR1YWwgd2lyZSBtb2RlIG1pZ2h0 IGJlIGFjdGl2ZS4KPj4+ICsJICoKPj4+ICsJICogSXQncyBiZXR0ZXIgdG8gZG8gZnVydGhlciBj aGVjayBpZiBlaXRoZXIgdGhyb3VnaC1JL08tQVBJQwo+Pj4gKwkgKiBvciB0aHJvdWdoLWxvY2Fs LUFQSUMgaXMgYWN0aXZlLgo+Pj4gKwkgKiB0aGUgd29yc3QgY2FzZSBpcyB0aGF0IGJvdGggb2Yg dGhlbSBhcmUgaW5hY3RpdmUsCj4+PiArCSAqIElmIHNvLCBXZSBuZWVkIHRvIGVuYWJsZSB0aGUg dmlydHVhbCB3aXJlIG1vZGUgdmlhIHRocm91Z2gtbG9jYWwtQVBJQwo+Pj4gIAkgKi8KPj4+IC0J aWYgKHNtcF9mb3VuZF9jb25maWcgfHwgIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUElDKSkK Pj4+ICsJaWYgKChzbXBfZm91bmRfY29uZmlnICYmIGNoZWNrX3ZpcnR1YWxfd2lyZV9tb2RlKCkp IHx8Cj4+PiArCQkhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpKQo+Pj4gIAkJcmV0dXJu Owo+Pj4gIAo+Pj4gIAkvKgo+Pj4gZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lv X2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwo+Pj4gaW5kZXggNDQ2NzAy ZWQ5OWRjLi41YTMyYzI2OTM4YWMgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBp Yy9pb19hcGljLmMKPj4+ICsrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwo+Pj4g QEAgLTEzNzksNiArMTM3OSwzNCBAQCB2b2lkIF9faW5pdCBwcmludF9JT19BUElDcyh2b2lkKQo+ Pj4gIC8qIFdoZXJlIGlmIGFueXdoZXJlIGlzIHRoZSBpODI1OSBjb25uZWN0IGluIGV4dGVybmFs IGludCBtb2RlICovCj4+PiAgc3RhdGljIHN0cnVjdCB7IGludCBwaW4sIGFwaWM7IH0gaW9hcGlj X2k4MjU5ID0geyAtMSwgLTEgfTsKPj4+ICAKPj4+ICsvKgo+Pj4gKyAqIFJldHVybiBmYWxzZSBt ZWFucyB0aGUgdmlydHVhbCB3aXJlIG1vZGUgdmlhIEkvTyBBUElDIGlzIGluYWN0aXZlCj4+PiAr ICovCj4+PiArYm9vbCB2aXJ0dWFsX3dpcmVfdmlhX2lvYXBpYyh2b2lkKQo+Pj4gK3sKPj4+ICsJ aW50IGFwaWMsIHBpbjsKPj4+ICsKPj4+ICsJZm9yX2VhY2hfaW9hcGljX3BpbihhcGljLCBwaW4p IHsKPj4+ICsJCS8qIFNlZSBpZiBhbnkgb2YgdGhlIHBpbnMgaXMgaW4gRXh0SU5UIG1vZGUgKi8K Pj4+ICsJCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5ID0gaW9hcGljX3JlYWRfZW50 cnkoYXBpYywgcGluKTsKPj4+ICsKPj4+ICsJCS8qCj4+PiArCQkgKiBJZiB0aGUgaW50ZXJydXB0 IGxpbmUgaXMgZW5hYmxlZCBhbmQgaW4gRXh0SW50IG1vZGUKPj4+ICsJCSAqIEkgaGF2ZSBmb3Vu ZCB0aGUgcGluIHdoZXJlIHRoZSBpODI1OSBpcyBjb25uZWN0ZWQuCj4+PiArCQkgKi8KPj4+ICsJ CWlmICgoZW50cnkubWFzayA9PSAwKSAmJiAoZW50cnkuZGVsaXZlcnlfbW9kZSA9PSBkZXN0X0V4 dElOVCkpCj4+PiArCQkJcmV0dXJuIHRydWU7Cj4+PiArCX0KPj4+ICsKPj4+ICsJLyoKPj4+ICsJ ICogVmlydHVhbCB3aXJlIG1vZGUgdmlhIEkvTyBBUElDIHJlcXVlc3RzCj4+PiArCSAqIEkvTyBB UElDIGJlIGNvbm5lY3RlZCB0byBpODI1OSBpbiBjaGFwdGVyIDMuNi4yLjIgb2YgdGhlIE1QIHYx LjQgc3BlYwo+Pj4gKwkgKiBJZiBubyBwaW4gaW4gRXh0SW50IG1vZGUsCj4+PiArCSAqIHRoZSB0 aHJvdWdoLUkvTy1BUElDIHZpcnR1YWwgd2lyZSBtb2RlIGNhbiBiZSByZWdhcmRlZCBpbmFjdGl2 ZS4KPj4+ICsJICovCj4+PiArCXJldHVybiBmYWxzZTsKPj4+ICt9Cj4+PiArCj4+PiAgdm9pZCBf X2luaXQgZW5hYmxlX0lPX0FQSUModm9pZCkKPj4+ICB7Cj4+PiAgCWludCBpODI1OV9hcGljLCBp ODI1OV9waW47Cj4+PiAtLSAKPj4+IDEuOS4zCj4+Pgo+Pj4KPj4+Cj4+Cj4KPgoKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcgbGlz dAprZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8va2V4ZWMK