From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756271AbcDGM54 (ORCPT ); Thu, 7 Apr 2016 08:57:56 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:30871 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753962AbcDGM5y (ORCPT ); Thu, 7 Apr 2016 08:57:54 -0400 Subject: Re: [PATCH v4 04/14] x86/rtc: replace paravirt rtc check with platform legacy quirk To: "Luis R. Rodriguez" , bp@alien8.de, hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com, rusty@rustcorp.com.au References: <1459987594-5434-1-git-send-email-mcgrof@kernel.org> <1459987594-5434-5-git-send-email-mcgrof@kernel.org> Cc: x86@kernel.org, linux-kernel@vger.kernel.org, luto@amacapital.net, david.vrabel@citrix.com, konrad.wilk@oracle.com, xen-devel@lists.xensource.com, lguest@lists.ozlabs.org, andriy.shevchenko@linux.intel.com, jlee@suse.com, glin@suse.com, matt@codeblueprint.co.uk, andrew.cooper3@citrix.com From: Boris Ostrovsky Message-ID: <570658DA.7060509@oracle.com> Date: Thu, 7 Apr 2016 08:55:54 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0 MIME-Version: 1.0 In-Reply-To: <1459987594-5434-5-git-send-email-mcgrof@kernel.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/06/2016 08:06 PM, Luis R. Rodriguez wrote: > We have 4 types of x86 platforms that disable RTC: > > * Intel MID > * Lguest - uses paravirt > * Xen dom-U - uses paravirt > * x86 on legacy systems annotated with an ACPI legacy flag > > We can consolidate all of these into a platform specific legacy > quirk set early in boot through i386_start_kernel() and through > x86_64_start_reservations(). This deals with the RTC quirks which > we can rely on through the hardware subarch, the ACPI check can > be dealt with separately. > > v2: split the subarch check from the ACPI check, clarify > on the ACPI change commit log why ordering works > > Suggested-by: Ingo Molnar > Signed-off-by: Luis R. Rodriguez > --- > arch/x86/Makefile | 1 + > arch/x86/include/asm/paravirt.h | 6 ------ > arch/x86/include/asm/paravirt_types.h | 5 ----- > arch/x86/include/asm/processor.h | 1 - > arch/x86/include/asm/x86_init.h | 13 +++++++++++++ > arch/x86/kernel/Makefile | 6 +++++- > arch/x86/kernel/head32.c | 2 ++ > arch/x86/kernel/head64.c | 1 + > arch/x86/kernel/platform-quirks.c | 18 ++++++++++++++++++ > arch/x86/kernel/rtc.c | 7 ++----- > arch/x86/lguest/boot.c | 1 - > arch/x86/xen/enlighten.c | 3 --- > 12 files changed, 42 insertions(+), 22 deletions(-) > create mode 100644 arch/x86/kernel/platform-quirks.c > > diff --git a/arch/x86/Makefile b/arch/x86/Makefile > index 4086abca0b32..f9ed8a7ce2b6 100644 > --- a/arch/x86/Makefile > +++ b/arch/x86/Makefile > @@ -209,6 +209,7 @@ endif > head-y := arch/x86/kernel/head_$(BITS).o > head-y += arch/x86/kernel/head$(BITS).o > head-y += arch/x86/kernel/head.o > +head-y += arch/x86/kernel/platform-quirks.o > > libs-y += arch/x86/lib/ > > diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h > index 601f1b8f9961..6c7a4a192032 100644 > --- a/arch/x86/include/asm/paravirt.h > +++ b/arch/x86/include/asm/paravirt.h > @@ -20,12 +20,6 @@ static inline int paravirt_enabled(void) > return pv_info.paravirt_enabled; > } > > -static inline int paravirt_has_feature(unsigned int feature) > -{ > - WARN_ON_ONCE(!pv_info.paravirt_enabled); > - return (pv_info.features & feature); > -} > - > static inline void load_sp0(struct tss_struct *tss, > struct thread_struct *thread) > { > diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h > index e8c2326478c8..6acc1b26cf40 100644 > --- a/arch/x86/include/asm/paravirt_types.h > +++ b/arch/x86/include/asm/paravirt_types.h > @@ -70,14 +70,9 @@ struct pv_info { > #endif > > int paravirt_enabled; > - unsigned int features; /* valid only if paravirt_enabled is set */ > const char *name; > }; > > -#define paravirt_has(x) paravirt_has_feature(PV_SUPPORTED_##x) > -/* Supported features */ > -#define PV_SUPPORTED_RTC (1<<0) > - > struct pv_init_ops { > /* > * Patch may replace one of the defined code sequences with > diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h > index 9264476f3d57..0c70c7daa6b8 100644 > --- a/arch/x86/include/asm/processor.h > +++ b/arch/x86/include/asm/processor.h > @@ -474,7 +474,6 @@ static inline unsigned long current_top_of_stack(void) > #else > #define __cpuid native_cpuid > #define paravirt_enabled() 0 > -#define paravirt_has(x) 0 > > static inline void load_sp0(struct tss_struct *tss, > struct thread_struct *thread) > diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h > index 1ae89a2721d6..27d5c3fe5198 100644 > --- a/arch/x86/include/asm/x86_init.h > +++ b/arch/x86/include/asm/x86_init.h > @@ -142,6 +142,15 @@ struct x86_cpuinit_ops { > struct timespec; > > /** > + * struct x86_legacy_features - legacy x86 features > + * > + * @rtc: this device has a CMOS real-time clock present > + */ > +struct x86_legacy_features { > + int rtc; > +}; > + > +/** > * struct x86_platform_ops - platform specific runtime functions > * @calibrate_tsc: calibrate TSC > * @get_wallclock: get time from HW clock like RTC etc. > @@ -152,6 +161,7 @@ struct timespec; > * @save_sched_clock_state: save state for sched_clock() on suspend > * @restore_sched_clock_state: restore state for sched_clock() on resume > * @apic_post_init: adjust apic if neeeded > + * @legacy: legacy features > */ > struct x86_platform_ops { > unsigned long (*calibrate_tsc)(void); > @@ -165,6 +175,7 @@ struct x86_platform_ops { > void (*save_sched_clock_state)(void); > void (*restore_sched_clock_state)(void); > void (*apic_post_init)(void); > + struct x86_legacy_features legacy; > }; > > struct pci_dev; > @@ -186,6 +197,8 @@ extern struct x86_cpuinit_ops x86_cpuinit; > extern struct x86_platform_ops x86_platform; > extern struct x86_msi_ops x86_msi; > extern struct x86_io_apic_ops x86_io_apic_ops; > + > +extern void x86_early_init_platform_quirks(void); > extern void x86_init_noop(void); > extern void x86_init_uint_noop(unsigned int unused); > > diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile > index 89f8ade0bc7c..7a9e44d935de 100644 > --- a/arch/x86/kernel/Makefile > +++ b/arch/x86/kernel/Makefile > @@ -2,7 +2,11 @@ > # Makefile for the linux kernel. > # > > -extra-y := head_$(BITS).o head$(BITS).o head.o vmlinux.lds > +extra-y := head_$(BITS).o > +extra-y += head$(BITS).o > +extra-y += head.o > +extra-y += platform-quirks.o > +extra-y += vmlinux.lds > > CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE) > > diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c > index 2911ef3a9f1c..d784bb547a9d 100644 > --- a/arch/x86/kernel/head32.c > +++ b/arch/x86/kernel/head32.c > @@ -34,6 +34,8 @@ asmlinkage __visible void __init i386_start_kernel(void) > cr4_init_shadow(); > sanitize_boot_params(&boot_params); > > + x86_early_init_platform_quirks(); > + > /* Call the subarch specific early setup function */ > switch (boot_params.hdr.hardware_subarch) { > case X86_SUBARCH_INTEL_MID: > diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c > index 1f4422d5c8d0..b72fb0b71dd1 100644 > --- a/arch/x86/kernel/head64.c > +++ b/arch/x86/kernel/head64.c > @@ -182,6 +182,7 @@ void __init x86_64_start_reservations(char *real_mode_data) > if (!boot_params.hdr.version) > copy_bootdata(__va(real_mode_data)); > > + x86_early_init_platform_quirks(); > reserve_ebda_region(); > > switch (boot_params.hdr.hardware_subarch) { > diff --git a/arch/x86/kernel/platform-quirks.c b/arch/x86/kernel/platform-quirks.c > new file mode 100644 > index 000000000000..1b114ac5996f > --- /dev/null > +++ b/arch/x86/kernel/platform-quirks.c > @@ -0,0 +1,18 @@ > +#include > +#include > + > +#include > +#include > + > +void __init x86_early_init_platform_quirks(void) > +{ > + x86_platform.legacy.rtc = 1; > + > + switch (boot_params.hdr.hardware_subarch) { > + case X86_SUBARCH_XEN: > + case X86_SUBARCH_LGUEST: > + case X86_SUBARCH_INTEL_MID: > + x86_platform.legacy.rtc = 0; > + break; > + } > +} What about Xen dom0 (aka initial domain)? -boris > --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -1192,7 +1192,6 @@ static const struct pv_info xen_info __initconst = { > #ifdef CONFIG_X86_64 > .extra_user_64bit_cs = FLAT_USER_CS64, > #endif > - .features = 0, > .name = "Xen", > }; > > @@ -1525,8 +1524,6 @@ asmlinkage __visible void __init xen_start_kernel(void) > > /* Install Xen paravirt ops */ > pv_info = xen_info; > - if (xen_initial_domain()) > - pv_info.features |= PV_SUPPORTED_RTC; > pv_init_ops = xen_init_ops; > if (!xen_pvh_domain()) { > pv_cpu_ops = xen_cpu_ops; From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: Re: [PATCH v4 04/14] x86/rtc: replace paravirt rtc check with platform legacy quirk Date: Thu, 7 Apr 2016 08:55:54 -0400 Message-ID: <570658DA.7060509@oracle.com> References: <1459987594-5434-1-git-send-email-mcgrof@kernel.org> <1459987594-5434-5-git-send-email-mcgrof@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1459987594-5434-5-git-send-email-mcgrof@kernel.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: "Luis R. Rodriguez" , bp@alien8.de, hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com, rusty@rustcorp.com.au Cc: xen-devel@lists.xensource.com, matt@codeblueprint.co.uk, andrew.cooper3@citrix.com, x86@kernel.org, linux-kernel@vger.kernel.org, luto@amacapital.net, jlee@suse.com, lguest@lists.ozlabs.org, glin@suse.com, david.vrabel@citrix.com, andriy.shevchenko@linux.intel.com List-Id: xen-devel@lists.xenproject.org T24gMDQvMDYvMjAxNiAwODowNiBQTSwgTHVpcyBSLiBSb2RyaWd1ZXogd3JvdGU6Cj4gV2UgaGF2 ZSA0IHR5cGVzIG9mIHg4NiBwbGF0Zm9ybXMgdGhhdCBkaXNhYmxlIFJUQzoKPgo+ICAgICogSW50 ZWwgTUlECj4gICAgKiBMZ3Vlc3QgLSB1c2VzIHBhcmF2aXJ0Cj4gICAgKiBYZW4gZG9tLVUgLSB1 c2VzIHBhcmF2aXJ0Cj4gICAgKiB4ODYgb24gbGVnYWN5IHN5c3RlbXMgYW5ub3RhdGVkIHdpdGgg YW4gQUNQSSBsZWdhY3kgZmxhZwo+Cj4gV2UgY2FuIGNvbnNvbGlkYXRlIGFsbCBvZiB0aGVzZSBp bnRvIGEgcGxhdGZvcm0gc3BlY2lmaWMgbGVnYWN5Cj4gcXVpcmsgc2V0IGVhcmx5IGluIGJvb3Qg dGhyb3VnaCBpMzg2X3N0YXJ0X2tlcm5lbCgpIGFuZCB0aHJvdWdoCj4geDg2XzY0X3N0YXJ0X3Jl c2VydmF0aW9ucygpLiBUaGlzIGRlYWxzIHdpdGggdGhlIFJUQyBxdWlya3Mgd2hpY2gKPiB3ZSBj YW4gcmVseSBvbiB0aHJvdWdoIHRoZSBoYXJkd2FyZSBzdWJhcmNoLCB0aGUgQUNQSSBjaGVjayBj YW4KPiBiZSBkZWFsdCB3aXRoIHNlcGFyYXRlbHkuCj4KPiB2Mjogc3BsaXQgdGhlIHN1YmFyY2gg Y2hlY2sgZnJvbSB0aGUgQUNQSSBjaGVjaywgY2xhcmlmeQo+ICAgICAgb24gdGhlIEFDUEkgY2hh bmdlIGNvbW1pdCBsb2cgd2h5IG9yZGVyaW5nIHdvcmtzCj4KPiBTdWdnZXN0ZWQtYnk6IEluZ28g TW9sbmFyIDxtaW5nb0BrZXJuZWwub3JnPgo+IFNpZ25lZC1vZmYtYnk6IEx1aXMgUi4gUm9kcmln dWV6IDxtY2dyb2ZAa2VybmVsLm9yZz4KPiAtLS0KPiAgIGFyY2gveDg2L01ha2VmaWxlICAgICAg ICAgICAgICAgICAgICAgfCAgMSArCj4gICBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5o ICAgICAgIHwgIDYgLS0tLS0tCj4gICBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBl cy5oIHwgIDUgLS0tLS0KPiAgIGFyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oICAgICAg fCAgMSAtCj4gICBhcmNoL3g4Ni9pbmNsdWRlL2FzbS94ODZfaW5pdC5oICAgICAgIHwgMTMgKysr KysrKysrKysrKwo+ICAgYXJjaC94ODYva2VybmVsL01ha2VmaWxlICAgICAgICAgICAgICB8ICA2 ICsrKysrLQo+ICAgYXJjaC94ODYva2VybmVsL2hlYWQzMi5jICAgICAgICAgICAgICB8ICAyICsr Cj4gICBhcmNoL3g4Ni9rZXJuZWwvaGVhZDY0LmMgICAgICAgICAgICAgIHwgIDEgKwo+ICAgYXJj aC94ODYva2VybmVsL3BsYXRmb3JtLXF1aXJrcy5jICAgICB8IDE4ICsrKysrKysrKysrKysrKysr Kwo+ICAgYXJjaC94ODYva2VybmVsL3J0Yy5jICAgICAgICAgICAgICAgICB8ICA3ICsrLS0tLS0K PiAgIGFyY2gveDg2L2xndWVzdC9ib290LmMgICAgICAgICAgICAgICAgfCAgMSAtCj4gICBhcmNo L3g4Ni94ZW4vZW5saWdodGVuLmMgICAgICAgICAgICAgIHwgIDMgLS0tCj4gICAxMiBmaWxlcyBj aGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkKPiAgIGNyZWF0ZSBtb2Rl IDEwMDY0NCBhcmNoL3g4Ni9rZXJuZWwvcGxhdGZvcm0tcXVpcmtzLmMKPgo+IGRpZmYgLS1naXQg YS9hcmNoL3g4Ni9NYWtlZmlsZSBiL2FyY2gveDg2L01ha2VmaWxlCj4gaW5kZXggNDA4NmFiY2Ew YjMyLi5mOWVkOGE3Y2UyYjYgMTAwNjQ0Cj4gLS0tIGEvYXJjaC94ODYvTWFrZWZpbGUKPiArKysg Yi9hcmNoL3g4Ni9NYWtlZmlsZQo+IEBAIC0yMDksNiArMjA5LDcgQEAgZW5kaWYKPiAgIGhlYWQt eSA6PSBhcmNoL3g4Ni9rZXJuZWwvaGVhZF8kKEJJVFMpLm8KPiAgIGhlYWQteSArPSBhcmNoL3g4 Ni9rZXJuZWwvaGVhZCQoQklUUykubwo+ICAgaGVhZC15ICs9IGFyY2gveDg2L2tlcm5lbC9oZWFk Lm8KPiAraGVhZC15ICs9IGFyY2gveDg2L2tlcm5lbC9wbGF0Zm9ybS1xdWlya3Mubwo+ICAgCj4g ICBsaWJzLXkgICs9IGFyY2gveDg2L2xpYi8KPiAgIAo+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9p bmNsdWRlL2FzbS9wYXJhdmlydC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAo+ IGluZGV4IDYwMWYxYjhmOTk2MS4uNmM3YTRhMTkyMDMyIDEwMDY0NAo+IC0tLSBhL2FyY2gveDg2 L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKPiArKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJh dmlydC5oCj4gQEAgLTIwLDEyICsyMCw2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHBhcmF2aXJ0X2Vu YWJsZWQodm9pZCkKPiAgIAlyZXR1cm4gcHZfaW5mby5wYXJhdmlydF9lbmFibGVkOwo+ICAgfQo+ ICAgCj4gLXN0YXRpYyBpbmxpbmUgaW50IHBhcmF2aXJ0X2hhc19mZWF0dXJlKHVuc2lnbmVkIGlu dCBmZWF0dXJlKQo+IC17Cj4gLQlXQVJOX09OX09OQ0UoIXB2X2luZm8ucGFyYXZpcnRfZW5hYmxl ZCk7Cj4gLQlyZXR1cm4gKHB2X2luZm8uZmVhdHVyZXMgJiBmZWF0dXJlKTsKPiAtfQo+IC0KPiAg IHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3NwMChzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzLAo+ICAg CQkJICAgICBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkKQo+ICAgewo+IGRpZmYgLS1naXQg YS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVk ZS9hc20vcGFyYXZpcnRfdHlwZXMuaAo+IGluZGV4IGU4YzIzMjY0NzhjOC4uNmFjYzFiMjZjZjQw IDEwMDY0NAo+IC0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKPiAr KysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCj4gQEAgLTcwLDE0ICs3 MCw5IEBAIHN0cnVjdCBwdl9pbmZvIHsKPiAgICNlbmRpZgo+ICAgCj4gICAJaW50IHBhcmF2aXJ0 X2VuYWJsZWQ7Cj4gLQl1bnNpZ25lZCBpbnQgZmVhdHVyZXM7CSAgLyogdmFsaWQgb25seSBpZiBw YXJhdmlydF9lbmFibGVkIGlzIHNldCAqLwo+ICAgCWNvbnN0IGNoYXIgKm5hbWU7Cj4gICB9Owo+ ICAgCj4gLSNkZWZpbmUgcGFyYXZpcnRfaGFzKHgpIHBhcmF2aXJ0X2hhc19mZWF0dXJlKFBWX1NV UFBPUlRFRF8jI3gpCj4gLS8qIFN1cHBvcnRlZCBmZWF0dXJlcyAqLwo+IC0jZGVmaW5lIFBWX1NV UFBPUlRFRF9SVEMgICAgICAgICgxPDwwKQo+IC0KPiAgIHN0cnVjdCBwdl9pbml0X29wcyB7Cj4g ICAJLyoKPiAgIAkgKiBQYXRjaCBtYXkgcmVwbGFjZSBvbmUgb2YgdGhlIGRlZmluZWQgY29kZSBz ZXF1ZW5jZXMgd2l0aAo+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNz b3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCj4gaW5kZXggOTI2NDQ3NmYz ZDU3Li4wYzcwYzdkYWE2YjggMTAwNjQ0Cj4gLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJv Y2Vzc29yLmgKPiArKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAo+IEBAIC00 NzQsNyArNDc0LDYgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdG9wX29m X3N0YWNrKHZvaWQpCj4gICAjZWxzZQo+ICAgI2RlZmluZSBfX2NwdWlkCQkJbmF0aXZlX2NwdWlk Cj4gICAjZGVmaW5lIHBhcmF2aXJ0X2VuYWJsZWQoKQkwCj4gLSNkZWZpbmUgcGFyYXZpcnRfaGFz KHgpIAkwCj4gICAKPiAgIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX3NwMChzdHJ1Y3QgdHNzX3N0 cnVjdCAqdHNzLAo+ICAgCQkJICAgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCj4gZGlm ZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3g4Nl9pbml0LmggYi9hcmNoL3g4Ni9pbmNs dWRlL2FzbS94ODZfaW5pdC5oCj4gaW5kZXggMWFlODlhMjcyMWQ2Li4yN2Q1YzNmZTUxOTggMTAw NjQ0Cj4gLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veDg2X2luaXQuaAo+ICsrKyBiL2FyY2gv eDg2L2luY2x1ZGUvYXNtL3g4Nl9pbml0LmgKPiBAQCAtMTQyLDYgKzE0MiwxNSBAQCBzdHJ1Y3Qg eDg2X2NwdWluaXRfb3BzIHsKPiAgIHN0cnVjdCB0aW1lc3BlYzsKPiAgIAo+ICAgLyoqCj4gKyAq IHN0cnVjdCB4ODZfbGVnYWN5X2ZlYXR1cmVzIC0gbGVnYWN5IHg4NiBmZWF0dXJlcwo+ICsgKgo+ ICsgKiBAcnRjOiB0aGlzIGRldmljZSBoYXMgYSBDTU9TIHJlYWwtdGltZSBjbG9jayBwcmVzZW50 Cj4gKyAqLwo+ICtzdHJ1Y3QgeDg2X2xlZ2FjeV9mZWF0dXJlcyB7Cj4gKwlpbnQgcnRjOwo+ICt9 Owo+ICsKPiArLyoqCj4gICAgKiBzdHJ1Y3QgeDg2X3BsYXRmb3JtX29wcyAtIHBsYXRmb3JtIHNw ZWNpZmljIHJ1bnRpbWUgZnVuY3Rpb25zCj4gICAgKiBAY2FsaWJyYXRlX3RzYzoJCWNhbGlicmF0 ZSBUU0MKPiAgICAqIEBnZXRfd2FsbGNsb2NrOgkJZ2V0IHRpbWUgZnJvbSBIVyBjbG9jayBsaWtl IFJUQyBldGMuCj4gQEAgLTE1Miw2ICsxNjEsNyBAQCBzdHJ1Y3QgdGltZXNwZWM7Cj4gICAgKiBA c2F2ZV9zY2hlZF9jbG9ja19zdGF0ZToJc2F2ZSBzdGF0ZSBmb3Igc2NoZWRfY2xvY2soKSBvbiBz dXNwZW5kCj4gICAgKiBAcmVzdG9yZV9zY2hlZF9jbG9ja19zdGF0ZToJcmVzdG9yZSBzdGF0ZSBm b3Igc2NoZWRfY2xvY2soKSBvbiByZXN1bWUKPiAgICAqIEBhcGljX3Bvc3RfaW5pdDoJCWFkanVz dCBhcGljIGlmIG5lZWVkZWQKPiArICogQGxlZ2FjeToJCQlsZWdhY3kgZmVhdHVyZXMKPiAgICAq Lwo+ICAgc3RydWN0IHg4Nl9wbGF0Zm9ybV9vcHMgewo+ICAgCXVuc2lnbmVkIGxvbmcgKCpjYWxp YnJhdGVfdHNjKSh2b2lkKTsKPiBAQCAtMTY1LDYgKzE3NSw3IEBAIHN0cnVjdCB4ODZfcGxhdGZv cm1fb3BzIHsKPiAgIAl2b2lkICgqc2F2ZV9zY2hlZF9jbG9ja19zdGF0ZSkodm9pZCk7Cj4gICAJ dm9pZCAoKnJlc3RvcmVfc2NoZWRfY2xvY2tfc3RhdGUpKHZvaWQpOwo+ICAgCXZvaWQgKCphcGlj X3Bvc3RfaW5pdCkodm9pZCk7Cj4gKwlzdHJ1Y3QgeDg2X2xlZ2FjeV9mZWF0dXJlcyBsZWdhY3k7 Cj4gICB9Owo+ICAgCj4gICBzdHJ1Y3QgcGNpX2RldjsKPiBAQCAtMTg2LDYgKzE5Nyw4IEBAIGV4 dGVybiBzdHJ1Y3QgeDg2X2NwdWluaXRfb3BzIHg4Nl9jcHVpbml0Owo+ICAgZXh0ZXJuIHN0cnVj dCB4ODZfcGxhdGZvcm1fb3BzIHg4Nl9wbGF0Zm9ybTsKPiAgIGV4dGVybiBzdHJ1Y3QgeDg2X21z aV9vcHMgeDg2X21zaTsKPiAgIGV4dGVybiBzdHJ1Y3QgeDg2X2lvX2FwaWNfb3BzIHg4Nl9pb19h cGljX29wczsKPiArCj4gK2V4dGVybiB2b2lkIHg4Nl9lYXJseV9pbml0X3BsYXRmb3JtX3F1aXJr cyh2b2lkKTsKPiAgIGV4dGVybiB2b2lkIHg4Nl9pbml0X25vb3Aodm9pZCk7Cj4gICBleHRlcm4g dm9pZCB4ODZfaW5pdF91aW50X25vb3AodW5zaWduZWQgaW50IHVudXNlZCk7Cj4gICAKPiBkaWZm IC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL01ha2Vm aWxlCj4gaW5kZXggODlmOGFkZTBiYzdjLi43YTllNDRkOTM1ZGUgMTAwNjQ0Cj4gLS0tIGEvYXJj aC94ODYva2VybmVsL01ha2VmaWxlCj4gKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCj4g QEAgLTIsNyArMiwxMSBAQAo+ICAgIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KPiAg ICMKPiAgIAo+IC1leHRyYS15ICAgICAgICAgICAgICAgIDo9IGhlYWRfJChCSVRTKS5vIGhlYWQk KEJJVFMpLm8gaGVhZC5vIHZtbGludXgubGRzCj4gK2V4dHJhLXkJOj0gaGVhZF8kKEJJVFMpLm8K PiArZXh0cmEteQkrPSBoZWFkJChCSVRTKS5vCj4gK2V4dHJhLXkJKz0gaGVhZC5vCj4gK2V4dHJh LXkJKz0gcGxhdGZvcm0tcXVpcmtzLm8KPiArZXh0cmEteQkrPSB2bWxpbnV4Lmxkcwo+ICAgCj4g ICBDUFBGTEFHU192bWxpbnV4LmxkcyArPSAtVSQoVVRTX01BQ0hJTkUpCj4gICAKPiBkaWZmIC0t Z2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWQzMi5jIGIvYXJjaC94ODYva2VybmVsL2hlYWQzMi5j Cj4gaW5kZXggMjkxMWVmM2E5ZjFjLi5kNzg0YmI1NDdhOWQgMTAwNjQ0Cj4gLS0tIGEvYXJjaC94 ODYva2VybmVsL2hlYWQzMi5jCj4gKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQzMi5jCj4gQEAg LTM0LDYgKzM0LDggQEAgYXNtbGlua2FnZSBfX3Zpc2libGUgdm9pZCBfX2luaXQgaTM4Nl9zdGFy dF9rZXJuZWwodm9pZCkKPiAgIAljcjRfaW5pdF9zaGFkb3coKTsKPiAgIAlzYW5pdGl6ZV9ib290 X3BhcmFtcygmYm9vdF9wYXJhbXMpOwo+ICAgCj4gKwl4ODZfZWFybHlfaW5pdF9wbGF0Zm9ybV9x dWlya3MoKTsKPiArCj4gICAJLyogQ2FsbCB0aGUgc3ViYXJjaCBzcGVjaWZpYyBlYXJseSBzZXR1 cCBmdW5jdGlvbiAqLwo+ICAgCXN3aXRjaCAoYm9vdF9wYXJhbXMuaGRyLmhhcmR3YXJlX3N1YmFy Y2gpIHsKPiAgIAljYXNlIFg4Nl9TVUJBUkNIX0lOVEVMX01JRDoKPiBkaWZmIC0tZ2l0IGEvYXJj aC94ODYva2VybmVsL2hlYWQ2NC5jIGIvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jCj4gaW5kZXgg MWY0NDIyZDVjOGQwLi5iNzJmYjBiNzFkZDEgMTAwNjQ0Cj4gLS0tIGEvYXJjaC94ODYva2VybmVs L2hlYWQ2NC5jCj4gKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jCj4gQEAgLTE4Miw2ICsx ODIsNyBAQCB2b2lkIF9faW5pdCB4ODZfNjRfc3RhcnRfcmVzZXJ2YXRpb25zKGNoYXIgKnJlYWxf bW9kZV9kYXRhKQo+ICAgCWlmICghYm9vdF9wYXJhbXMuaGRyLnZlcnNpb24pCj4gICAJCWNvcHlf Ym9vdGRhdGEoX192YShyZWFsX21vZGVfZGF0YSkpOwo+ICAgCj4gKwl4ODZfZWFybHlfaW5pdF9w bGF0Zm9ybV9xdWlya3MoKTsKPiAgIAlyZXNlcnZlX2ViZGFfcmVnaW9uKCk7Cj4gICAKPiAgIAlz d2l0Y2ggKGJvb3RfcGFyYW1zLmhkci5oYXJkd2FyZV9zdWJhcmNoKSB7Cj4gZGlmZiAtLWdpdCBh L2FyY2gveDg2L2tlcm5lbC9wbGF0Zm9ybS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9wbGF0 Zm9ybS1xdWlya3MuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAw Li4xYjExNGFjNTk5NmYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvYXJjaC94ODYva2VybmVsL3Bs YXRmb3JtLXF1aXJrcy5jCj4gQEAgLTAsMCArMSwxOCBAQAo+ICsjaW5jbHVkZSA8bGludXgva2Vy bmVsLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gKwo+ICsjaW5jbHVkZSA8YXNtL3Nl dHVwLmg+Cj4gKyNpbmNsdWRlIDxhc20vYmlvc19lYmRhLmg+Cj4gKwo+ICt2b2lkIF9faW5pdCB4 ODZfZWFybHlfaW5pdF9wbGF0Zm9ybV9xdWlya3Modm9pZCkKPiArewo+ICsJeDg2X3BsYXRmb3Jt LmxlZ2FjeS5ydGMgPSAxOwo+ICsKPiArCXN3aXRjaCAoYm9vdF9wYXJhbXMuaGRyLmhhcmR3YXJl X3N1YmFyY2gpIHsKPiArCWNhc2UgWDg2X1NVQkFSQ0hfWEVOOgo+ICsJY2FzZSBYODZfU1VCQVJD SF9MR1VFU1Q6Cj4gKwljYXNlIFg4Nl9TVUJBUkNIX0lOVEVMX01JRDoKPiArCQl4ODZfcGxhdGZv cm0ubGVnYWN5LnJ0YyA9IDA7Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gK30KCldoYXQgYWJvdXQgWGVu IGRvbTAgKGFrYSBpbml0aWFsIGRvbWFpbik/CgotYm9yaXMKCj4gLS0tIGEvYXJjaC94ODYveGVu L2VubGlnaHRlbi5jCj4gKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCj4gQEAgLTExOTIs NyArMTE5Miw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfaW5mbyB4ZW5faW5mbyBfX2luaXRj b25zdCA9IHsKPiAgICNpZmRlZiBDT05GSUdfWDg2XzY0Cj4gICAJLmV4dHJhX3VzZXJfNjRiaXRf Y3MgPSBGTEFUX1VTRVJfQ1M2NCwKPiAgICNlbmRpZgo+IC0JLmZlYXR1cmVzID0gMCwKPiAgIAku bmFtZSA9ICJYZW4iLAo+ICAgfTsKPiAgIAo+IEBAIC0xNTI1LDggKzE1MjQsNiBAQCBhc21saW5r YWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCB4ZW5fc3RhcnRfa2VybmVsKHZvaWQpCj4gICAKPiAg IAkvKiBJbnN0YWxsIFhlbiBwYXJhdmlydCBvcHMgKi8KPiAgIAlwdl9pbmZvID0geGVuX2luZm87 Cj4gLQlpZiAoeGVuX2luaXRpYWxfZG9tYWluKCkpCj4gLQkJcHZfaW5mby5mZWF0dXJlcyB8PSBQ Vl9TVVBQT1JURURfUlRDOwo+ICAgCXB2X2luaXRfb3BzID0geGVuX2luaXRfb3BzOwo+ICAgCWlm ICgheGVuX3B2aF9kb21haW4oKSkgewo+ICAgCQlwdl9jcHVfb3BzID0geGVuX2NwdV9vcHM7CgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVs IG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwOi8vbGlzdHMueGVuLm9y Zy94ZW4tZGV2ZWwK