LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3][RFC] powerpc/ftrace: Removal of stop machine (and other goodies)
From: Steven Rostedt @ 2012-04-26 18:31 UTC (permalink / raw)
  To: linux-kernel, linuxppc-dev


Benjamin,

You once told me on IRC that powerpc has no problem with modifying
code on one CPU that may be executing on another CPU. With the tests I
made on my PPC64 (2 CPUs) box, it seems to be the case.

The first patch removes stop_machine from powerpc. The other patches
add some error handling if ftrace detects an update didn't occur
with 'patch_instruction'.

This is just an RFC, but if it's fine, feel free to pull them into
your tree.

-- Steve

Steven Rostedt (3):
      ftrace/ppc: Have PPC skip updating with stop_machine()
      powerpc: Have patch_instruction detect faults
      ftrace/ppc: Use patch_instruction instead of probe_kernel_write()

----
 arch/powerpc/include/asm/code-patching.h |    4 +-
 arch/powerpc/kernel/ftrace.c             |   69 ++++++++++++++++++++++++------
 arch/powerpc/lib/code-patching.c         |   14 ++++--
 3 files changed, 68 insertions(+), 19 deletions(-)

^ permalink raw reply

* [PATCH 2/3][RFC] powerpc: Have patch_instruction detect faults
From: Steven Rostedt @ 2012-04-26 18:31 UTC (permalink / raw)
  To: linux-kernel, linuxppc-dev
In-Reply-To: <20120426183116.857877522@goodmis.org>

From: Steven Rostedt <srostedt@redhat.com>

For ftrace to use the patch_instruction code, it needs to check for
faults on write. Ftrace updates code all over the kernel, and we need to
know if code is updated or not due to protections that are placed on
some portions of the kernel. If ftrace does not detect a fault, it will
error later on, and it will be much more difficult to find the problem.

By changing patch_instruction() to detect faults, then ftrace will be
able to make use of it too.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 arch/powerpc/include/asm/code-patching.h |    4 ++--
 arch/powerpc/lib/code-patching.c         |   14 ++++++++++----
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
index 37c32aba..a6f8c7a 100644
--- a/arch/powerpc/include/asm/code-patching.h
+++ b/arch/powerpc/include/asm/code-patching.h
@@ -26,8 +26,8 @@ unsigned int create_branch(const unsigned int *addr,
 			   unsigned long target, int flags);
 unsigned int create_cond_branch(const unsigned int *addr,
 				unsigned long target, int flags);
-void patch_branch(unsigned int *addr, unsigned long target, int flags);
-void patch_instruction(unsigned int *addr, unsigned int instr);
+int patch_branch(unsigned int *addr, unsigned long target, int flags);
+int patch_instruction(unsigned int *addr, unsigned int instr);
 
 int instr_is_relative_branch(unsigned int instr);
 int instr_is_branch_to_addr(const unsigned int *instr, unsigned long addr);
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index 7c975d4..dd223b3 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -13,17 +13,23 @@
 #include <linux/mm.h>
 #include <asm/page.h>
 #include <asm/code-patching.h>
+#include <asm/uaccess.h>
 
 
-void patch_instruction(unsigned int *addr, unsigned int instr)
+int patch_instruction(unsigned int *addr, unsigned int instr)
 {
-	*addr = instr;
+	int err;
+
+	err = __put_user(instr, addr);
+	if (err)
+		return err;
 	asm ("dcbst 0, %0; sync; icbi 0,%0; sync; isync" : : "r" (addr));
+	return 0;
 }
 
-void patch_branch(unsigned int *addr, unsigned long target, int flags)
+int patch_branch(unsigned int *addr, unsigned long target, int flags)
 {
-	patch_instruction(addr, create_branch(addr, target, flags));
+	return patch_instruction(addr, create_branch(addr, target, flags));
 }
 
 unsigned int create_branch(const unsigned int *addr,
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 3/3][RFC] ftrace/ppc: Use patch_instruction instead of probe_kernel_write()
From: Steven Rostedt @ 2012-04-26 18:31 UTC (permalink / raw)
  To: linux-kernel, linuxppc-dev
In-Reply-To: <20120426183116.857877522@goodmis.org>

From: Steven Rostedt <srostedt@redhat.com>

The patch_instruction() interface is made to modify kernel text. It is
safer to use that then the probe_kernel_write() when modifying kernel
code.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
 arch/powerpc/kernel/ftrace.c |   17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c
index 84a5ddd..4e376bc 100644
--- a/arch/powerpc/kernel/ftrace.c
+++ b/arch/powerpc/kernel/ftrace.c
@@ -63,11 +63,9 @@ ftrace_modify_code(unsigned long ip, unsigned int old, unsigned int new)
 		return -EINVAL;
 
 	/* replace the text with the new text */
-	if (probe_kernel_write((void *)ip, &new, MCOUNT_INSN_SIZE))
+	if (patch_instruction((unsigned int *)ip, new))
 		return -EPERM;
 
-	flush_icache_range(ip, ip + 8);
-
 	return 0;
 }
 
@@ -212,12 +210,9 @@ __ftrace_make_nop(struct module *mod,
 	 */
 	op = 0x48000008;	/* b +8 */
 
-	if (probe_kernel_write((void *)ip, &op, MCOUNT_INSN_SIZE))
+	if (patch_instruction((unsigned int *)ip, op))
 		return -EPERM;
 
-
-	flush_icache_range(ip, ip + 8);
-
 	return 0;
 }
 
@@ -286,11 +281,9 @@ __ftrace_make_nop(struct module *mod,
 
 	op = PPC_INST_NOP;
 
-	if (probe_kernel_write((void *)ip, &op, MCOUNT_INSN_SIZE))
+	if (patch_instruction((unsigned int *)ip, op))
 		return -EPERM;
 
-	flush_icache_range(ip, ip + 8);
-
 	return 0;
 }
 #endif /* PPC64 */
@@ -426,11 +419,9 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
 
 	pr_devel("write to %lx\n", rec->ip);
 
-	if (probe_kernel_write((void *)ip, &op, MCOUNT_INSN_SIZE))
+	if (patch_instruction((unsigned int *)ip, op))
 		return -EPERM;
 
-	flush_icache_range(ip, ip + 8);
-
 	return 0;
 }
 #endif /* CONFIG_PPC64 */
-- 
1.7.9.5

^ permalink raw reply related

* Re: [EDAC PATCH v13 2/7] edac: move dimm properties to struct dimm_info
From: Borislav Petkov @ 2012-04-26 14:26 UTC (permalink / raw)
  To: Mauro Carvalho Chehab
  Cc: Mike Williams, Shaohui Xie, Jason Uhlenkott, Hitoshi Mitake,
	Mark Gross, Dmitry Eremin-Solenikov, Ranganathan Desikan,
	Egor Martovetsky, Niklas Söderlund, Tim Small, Arvind R.,
	Borislav Petkov, Chris Metcalf, Olof Johansson, Doug Thompson,
	Linux Edac Mailing List, Michal Marek, Jiri Kosina,
	James Bottomley, Linux Kernel Mailing List, Joe Perches,
	Andrew Morton, linuxppc-dev
In-Reply-To: <1334607133-30039-3-git-send-email-mchehab@redhat.com>

On Mon, Apr 16, 2012 at 05:12:08PM -0300, Mauro Carvalho Chehab wrote:
> On systems based on chip select rows, all channels need to use memories
> with the same properties, otherwise the memories on channels A and B
> won't be recognized.
> 
> However, such assumption is not true for all types of memory
> controllers.
> 
> Controllers for FB-DIMM's don't have such requirements.
> 
> Also, modern Intel controllers seem to be capable of handling such
> differences.
> 
> So, we need to get rid of storing the DIMM information into a per-csrow
> data, storing it, instead at the right place.
> 
> The first step is to move grain, mtype, dtype and edac_mode to the
> per-dimm struct.
> 
> Reviewed-by: Aristeu Rozanski <arozansk@redhat.com>
> Cc: Doug Thompson <norsk5@yahoo.com>
> Cc: Borislav Petkov <borislav.petkov@amd.com>
> Cc: Mark Gross <mark.gross@intel.com>
> Cc: Jason Uhlenkott <juhlenko@akamai.com>
> Cc: Tim Small <tim@buttersideup.com>
> Cc: Ranganathan Desikan <ravi@jetztechnologies.com>
> Cc: "Arvind R." <arvino55@gmail.com>
> Cc: Olof Johansson <olof@lixom.net>
> Cc: Egor Martovetsky <egor@pasemi.com>
> Cc: Chris Metcalf <cmetcalf@tilera.com>
> Cc: Michal Marek <mmarek@suse.cz>
> Cc: Jiri Kosina <jkosina@suse.cz>
> Cc: Joe Perches <joe@perches.com>
> Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: Hitoshi Mitake <h.mitake@gmail.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: James Bottomley <James.Bottomley@parallels.com>
> Cc: "Niklas Söderlund" <niklas.soderlund@ericsson.com>
> Cc: Shaohui Xie <Shaohui.Xie@freescale.com>
> Cc: Josh Boyer <jwboyer@gmail.com>
> Cc: Mike Williams <mike@mikebwilliams.com>
> Cc: linuxppc-dev@lists.ozlabs.org
> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

For the amd64_edac and core changes:

Reviewed-by: Borislav Petkov <borislav.petkov@amd.com>

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Andreas Schwab @ 2012-04-26 11:46 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: khali, linuxppc-dev
In-Reply-To: <1335388465.21961.35.camel@pasglop>

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> Darwin has an algorithm for it based on getting some data from the video
> driver in the AGP slot, but I don't have that.

Perhaps the slots fan should be programmable from user space.  For my
use case I'm pretty sure I would never need to set it to more than the
minimum speed.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Andreas Schwab @ 2012-04-26 11:43 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: khali, linuxppc-dev
In-Reply-To: <1335431975.21961.75.camel@pasglop>

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> On Thu, 2012-04-26 at 11:13 +0200, Andreas Schwab wrote:
>> Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
>> 
>> > What if you just comment out the tickle code ?
>> 
>> I haven't tried it yet, but I suspect it won't tickle the fcu any more
>> since wf_control_set avoids writing an unchanged value (unlike the old
>> driver).
>
> Sure, the question is whether that fixes the "annoyance" :-)

Removing the tickling removes much of the annoyance.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Andreas Schwab @ 2012-04-26 11:41 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: khali, linuxppc-dev
In-Reply-To: <1335431975.21961.75.camel@pasglop>

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> In fact, can you change that define around and see if it makes it behave
> more like therm_pm72 overall ? IE That's the only -known- difference
> between the old and new driver (+/- a bug / typo / etc..)

Yes, that's make the difference for the cpu fan control.  Note that
MacOS (at least 10.3, which is the only one I have) drives the fans the
same way as the old driver.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply

* RE: [PATCH][2/3][RFC] TDM Framework
From: Singh Sandeep-B37400 @ 2012-04-26 11:20 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, Aggrwal Poonam-B10812
  Cc: linuxppc-dev@lists.ozlabs.org
In-Reply-To: <1335332972.21961.31.camel@pasglop>

LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZyb206IEJlbmphbWluIEhlcnJlbnNjaG1pZHQg
W21haWx0bzpiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmddIA0KU2VudDogV2VkbmVzZGF5LCBBcHJp
bCAyNSwgMjAxMiAxMToyMCBBTQ0KVG86IEFnZ3J3YWwgUG9vbmFtLUIxMDgxMg0KQ2M6IGxpbnV4
cHBjLWRldkBsaXN0cy5vemxhYnMub3JnOyBTaW5naCBTYW5kZWVwLUIzNzQwMA0KU3ViamVjdDog
UmU6IFtQQVRDSF1bMi8zXVtSRkNdIFRETSBGcmFtZXdvcmsNCg0KT24gU2F0LCAyMDEyLTAzLTEw
IGF0IDE4OjI3ICswNTMwLCBQb29uYW0gQWdncndhbCB3cm90ZToNCj4gRnJvbTogU2FuZGVlcCBT
aW5naCA8U2FuZGVlcEBmcmVlc2NhbGUuY29tPg0KPiANCj4gVERNIEZyYW1ld29yayBpcyBhbiBh
dHRlbXB0IHRvIHByb3ZpZGUgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBsYXllciANCj4gd2hpY2gg
Y2FuIG9mZmVyIGEgc3RhbmRhcmQgaW50ZXJmYWNlICBmb3IgVERNIGFjY2VzcyB0byBkaWZmZXJl
bnQgY2xpZW50IG1vZHVsZXMuDQo+IEJlbmVhdGgsIHRoZSBmcmFtZXdvcmsgbGF5ZXIgY2FuIGhv
dXNlIGRpZmZlcmVudCB0eXBlcyBvZiBURE0gZHJpdmVycyANCj4gdG8gaGFuZGxlIHZhcmlvdXMg
VERNIGRldmljZXMsIHRoZSBoYXJkd2FyZSBpbnRyaWNhY2llcyBvZiB0aGUgZGV2aWNlcyANCj4g
YmVpbmcgY29tcGxldGVseSB0YWtlbiBjYXJlIGJ5IFRETSBkcml2ZXJzLg0KDQpOZWl0aGVyIHRo
ZSBjaGFuZ2VzZXQgY29tbWVudCwgdGhlIGNvZGUsIG5vdCB0aGUgRG9jdW1lbnRhdGlvbiBmaWxl
ICh3aGljaCBhcmUgbm9uLWV4aXN0ZW50LCBhdCBsZWFzdCBpbiB0aGlzIHBhdGNoLCB0aG91Z2gg
bWVudGlvbmVkKSwgZGVmaW5lIHdoYXQgIlRETSIgYWN0dWFsbHkgaXMgOi0pDQoNCltTYW5kZWVw
XSBUaGFua3MgZm9yIHlvdXIgY29tbWVudHMuIERvY3VtZW50YXRpb24gZm9yIFRETSBpcyBwcmVz
ZW50IGluIHRoZSBmb2xsb3dpbmcgcGF0Y2g6DQoNCmh0dHA6Ly9wYXRjaHdvcmsub3psYWJzLm9y
Zy9wYXRjaC8xNDU4NTcvDQoNClJlZ2FyZHMsDQpTYW5kZWVwDQoNCkNoZWVycywNCkJlbi4NCg0K
DQo+IFRoaXMgZnJhbWV3b3JrIGxheWVyIHdpbGwgYWxsb3cgYW55IHR5cGUgb2YgVERNIGRldmlj
ZSB0byBob29rIHdpdGggaXQuDQo+IEZvciBleGFtcGxlIEZyZWVzY2FsZSBjb250cm9sbGVyIGFz
IG9uIE1QQzgzMTUsIFVDQyBiYXNlZCBURE0gDQo+IGNvbnRyb2xsZXIsIG9yIGFueSBvdGhlciBj
b250cm9sbGVyLg0KPiANCj4gVGhlIG1haW4gZnVuY3Rpb25zIG9mIHRoaXMgRnJhbWV3b3JrIGFy
ZToNCj4gLSBwcm92aWRlcyBpbnRlcmZhY2UgdG8gVERNIGNsaWVudHMgdG8gYWNjZXNzIFRETSBm
dW5jdGlvbmFsaXRpZXMuDQo+IC0gcHJvdmlkZXMgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciBURE0g
ZHJpdmVycyB0byBob29rIHdpdGggdGhlIGZyYW1ld29yay4gDQo+IC0gaGFuZGxlcyB2YXJpb3Vz
IGRhdGEgaGFuZGxpbmcgc3R1ZmYgYW5kIGJ1ZmZlciBtYW5hZ2VtZW50Lg0KPiANCj4gSW4gZnV0
dXJlIHRoaXMgRnJhbWV3b3JrIHdpbGwgYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBJbnRlcmZhY2Ug
Zm9yIA0KPiBMaW5lIGNvbnRyb2wgZGV2aWNlcyBhbHNvLiBGb3IgZXhhbXBsZSBTTElDLCBFMS9U
MSBGcmFtZXJzIGV0Yy4NCj4gDQo+IExpbWl0YXRpb25zL0Z1dHVyZSBXb3JrDQo+IC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiAxLiBQcmVzZW50bHkgdGhlIGZyYW1ld29yayBzdXBwb3J0
cyBvbmx5IFNpbmdsZSBQb3J0IGNoYW5uZWxpc2VkIG1vZGUuDQo+IDIuIEFsc28gdGhlIGNvbmZp
Z3VyYWJpbGl0eSBvcHRpb25zIGFyZSBsaW1pdGVkIHdoaWNoIHdpbGwgYmUgZXh0ZW5kZWQgbGF0
ZXIgb24uDQo+IDMuIE9ubHkga2VybmVsIG1vZGUgVERNIGNsaWVudHMgYXJlIHN1cHBvcnRlZCBj
dXJyZW50bHkuIFN1cHBvcnQgZm9yIA0KPiBVc2VyIG1vZGUgY2xpZW50cyB3aWxsIGJlIGFkZGVk
IGxhdGVyLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogU2FuZGVlcCBTaW5naCA8U2FuZGVlcEBmcmVl
c2NhbGUuY29tPg0KPiBTaWduZWQtb2ZmLWJ5OiBQb29uYW0gQWdncndhbCA8cG9vbmFtLmFnZ3J3
YWxAZnJlZXNjYWxlLmNvbT4NCj4gLS0tDQo+ICBBIGNvdXBsZSBvZiB0b2RvcycgYXJlIGxlZnQg
aW4gdGhlIHBhdGNoLCB3ZSBhcmUgd29ya2luZyBvbiBpdCBhbmQgDQo+IHdpbGwgYmUgYWRkcmVz
c2VkIGluIHRoZSB1cGRhdGVkIHBhdGNoIHNldC4NCj4gIGRyaXZlcnMvS2NvbmZpZyAgICAgICAg
ICAgICAgICAgfCAgICAxICsNCj4gIGRyaXZlcnMvTWFrZWZpbGUgICAgICAgICAgICAgICAgfCAg
ICAxICsNCj4gIGRyaXZlcnMvdGRtL0tjb25maWcgICAgICAgICAgICAgfCAgIDI1ICsNCj4gIGRy
aXZlcnMvdGRtL3RkbS1jb3JlLmMgICAgICAgICAgfCAxMTQ2ICsrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKw0KPiAgaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaCB8
ICAgMTEgKw0KPiAgaW5jbHVkZS9saW51eC90ZG0uaCAgICAgICAgICAgICB8ICAzNDcgKysrKysr
KysrKysrDQo+ICA2IGZpbGVzIGNoYW5nZWQsIDE1MzEgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlv
bnMoLSkgIGNyZWF0ZSBtb2RlIA0KPiAxMDA2NDQgZHJpdmVycy90ZG0vS2NvbmZpZyAgY3JlYXRl
IG1vZGUgMTAwNjQ0IGRyaXZlcnMvdGRtL3RkbS1jb3JlLmMgIA0KPiBjcmVhdGUgbW9kZSAxMDA2
NDQgaW5jbHVkZS9saW51eC90ZG0uaA0KPiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZp
ZyBiL2RyaXZlcnMvS2NvbmZpZyBpbmRleCBhZDZjMWViLi4yNWY3ZjViIA0KPiAxMDA2NDQNCj4g
LS0tIGEvZHJpdmVycy9LY29uZmlnDQo+ICsrKyBiL2RyaXZlcnMvS2NvbmZpZw0KPiBAQCAtMTMw
LDQgKzEzMCw1IEBAIHNvdXJjZSAiZHJpdmVycy92aXJ0L0tjb25maWciDQo+ICANCj4gIHNvdXJj
ZSAiZHJpdmVycy9uZXQvZHBhL05ldENvbW1Tdy9LY29uZmlnIg0KPiAgDQo+ICtzb3VyY2UgImRy
aXZlcnMvdGRtL0tjb25maWciDQo+ICBlbmRtZW51DQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL01h
a2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZSBpbmRleCANCj4gY2Q1NDZlYi4uMzYyYjVlZCAxMDA2
NDQNCj4gLS0tIGEvZHJpdmVycy9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJzL01ha2VmaWxlDQo+
IEBAIC0xMDIsNiArMTAyLDcgQEAgb2JqLSQoQ09ORklHX0lORklOSUJBTkQpCSs9IGluZmluaWJh
bmQvDQo+ICBvYmotJChDT05GSUdfU0dJX1NOKQkJKz0gc24vDQo+ICBvYmoteQkJCQkrPSBmaXJt
d2FyZS8NCj4gIG9iai0kKENPTkZJR19DUllQVE8pCQkrPSBjcnlwdG8vDQo+ICtvYmotJChDT05G
SUdfVERNKQkJKz0gdGRtLw0KPiAgb2JqLSQoQ09ORklHX1NVUEVSSCkJCSs9IHNoLw0KPiAgb2Jq
LSQoQ09ORklHX0FSQ0hfU0hNT0JJTEUpCSs9IHNoLw0KPiAgaWZuZGVmIENPTkZJR19BUkNIX1VT
RVNfR0VUVElNRU9GRlNFVCBkaWZmIC0tZ2l0IA0KPiBhL2RyaXZlcnMvdGRtL0tjb25maWcgYi9k
cml2ZXJzL3RkbS9LY29uZmlnIG5ldyBmaWxlIG1vZGUgMTAwNjQ0IGluZGV4IA0KPiAwMDAwMDAw
Li44ZGIyYjA1DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvZHJpdmVycy90ZG0vS2NvbmZpZw0K
PiBAQCAtMCwwICsxLDI1IEBADQo+ICsjDQo+ICsjIFRETSBzdWJzeXN0ZW0gY29uZmlndXJhdGlv
bg0KPiArIw0KPiArDQo+ICttZW51Y29uZmlnIFRETQ0KPiArCXRyaXN0YXRlICJURE0gc3VwcG9y
dCINCj4gKwktLS1oZWxwLS0tDQo+ICsJICBNb3JlIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBp
biB0aGUgZGlyZWN0b3J5IDxmaWxlOkRvY3VtZW50YXRpb24vdGRtLz4sDQo+ICsJICBlc3BlY2lh
bGx5IGluIHRoZSBmaWxlIGNhbGxlZCAic3VtbWFyeSIgdGhlcmUuDQo+ICsJICBJZiB5b3Ugd2Fu
dCBURE0gc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvIHRoZQ0KPiAr
CSAgc3BlY2lmaWMgZHJpdmVyIGZvciB5b3VyIGJ1cyBhZGFwdGVyKHMpIGJlbG93Lg0KPiArDQo+
ICsJICBUaGlzIFRETSBzdXBwb3J0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYg
c28sIHRoZSBtb2R1bGUNCj4gKwkgIHdpbGwgYmUgY2FsbGVkIHRkbS1jb3JlLg0KPiArDQo+ICtp
ZiBURE0NCj4gKw0KPiArY29uZmlnIFRETV9ERUJVR19DT1JFDQo+ICsJYm9vbCAiVERNIENvcmUg
ZGVidWdnaW5nIG1lc3NhZ2VzIg0KPiArCWhlbHANCj4gKwkgIFNheSBZIGhlcmUgaWYgeW91IHdh
bnQgdGhlIFRETSBjb3JlIHRvIHByb2R1Y2UgYSBidW5jaCBvZiBkZWJ1Zw0KPiArCSAgbWVzc2Fn
ZXMgdG8gdGhlIHN5c3RlbSBsb2cuICBTZWxlY3QgdGhpcyBpZiB5b3UgYXJlIGhhdmluZyBhDQo+
ICsJICBwcm9ibGVtIHdpdGggVERNIHN1cHBvcnQgYW5kIHdhbnQgdG8gc2VlIG1vcmUgb2Ygd2hh
dCBpcyBnb2luZyBvbi4NCj4gKw0KPiArZW5kaWYgIyBURE0NCj4gZGlmZiAtLWdpdCBhL2RyaXZl
cnMvdGRtL3RkbS1jb3JlLmMgYi9kcml2ZXJzL3RkbS90ZG0tY29yZS5jIG5ldyBmaWxlIA0KPiBt
b2RlIDEwMDY0NCBpbmRleCAwMDAwMDAwLi5jZGRhMjYwDQo+IC0tLSAvZGV2L251bGwNCj4gKysr
IGIvZHJpdmVycy90ZG0vdGRtLWNvcmUuYw0KPiBAQCAtMCwwICsxLDExNDYgQEANCj4gKy8qIGRy
aXZlci90ZG0vdGRtLWNvcmUuYw0KPiArICoNCj4gKyAqIENvcHlyaWdodCAoQykgMjAxMiBGcmVl
c2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLCBBbGwgcmlnaHRzIHJlc2VydmVkLg0KPiArICoNCj4g
KyAqIFRETSBjb3JlIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBURE0gY2xpZW50cyBhbmQgVERN
IGRldmljZXMuDQo+ICsgKiBJdCBpcyBhbHNvIGludGVuZGVkIHRvIHNlcnZlIGFzIGFuIGludGVy
ZmFjZSBmb3IgbGluZSBjb250cm9sZA0KPiArICogZGV2aWNlcyBsYXRlciBvbi4NCj4gKyAqDQo+
ICsgKiBBdXRob3I6SGVtYW50IEFncmF3YWwgPGhlbWFudEBmcmVlc2NhbGUuY29tPg0KPiArICoJ
UmFqZXNoIEd1bWFzdGEgPHJhamVzaC5ndW1hc3RhQGZyZWVzY2FsZS5jb20+DQo+ICsgKg0KPiAr
ICogTW9kaWZpZWQgYnkgU2FuZGVlcCBLciBTaW5naCA8c2FuZGVlcEBmcmVlc2NhbGUuY29tPg0K
PiArICoJCVBvb25hbSBBZ2dhcndhbCA8cG9vbmFtLmFnZ2Fyd2FsQGZyZWVzY2FsZS5jb20+DQo+
ICsgKiAxLiBBZGRlZCBmcmFtZXdvcmsgYmFzZWQgaW5pdGlhbGl6YXRpb24gb2YgZGV2aWNlLg0K
PiArICogMi4gQWxsIHRoZSBpbml0L3J1biB0aW1lIGNvbmZpZ3VyYXRpb24gaXMgbm93IGRvbmUg
YnkgZnJhbWV3b3JrLg0KPiArICogMy4gQWRkZWQgY2hhbm5lbCBsZXZlbCBvcGVyYXRpb25zLg0K
PiArICoNCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSAgaXQgYW5kL29yIA0KPiArbW9kaWZ5IGl0DQo+ICsgKiB1bmRlciAgdGhlIHRlcm1z
IG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCANCj4gK2J5
IHRoZQ0KPiArICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBv
ZiB0aGUgIExpY2Vuc2UsIG9yIA0KPiArKGF0IHlvdXINCj4gKyAqIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uDQo+ICsgKg0KPiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIA0KPiArYnV0DQo+ICsgKiBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQo+ICsgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQ0KPiArICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0K
PiArICoNCj4gKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSANCj4gK2Fsb25nDQo+ICsgKiB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgDQo+ICtJ
bmMuLA0KPiArICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuDQo+ICsg
Ki8NCj4gKw0KPiArLyogaWYgcmVhZCB3cml0ZSBkZWJ1ZyByZXF1aXJlZCAqLw0KPiArI3VuZGVm
IFRETV9DT1JFX0RFQlVHDQo+ICsNCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gKyNp
bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPg0KPiAr
I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC90ZG0uaD4NCj4gKyNp
bmNsdWRlIDxsaW51eC9pbml0Lmg+DQo+ICsjaW5jbHVkZSA8bGludXgvaWRyLmg+DQo+ICsjaW5j
bHVkZSA8bGludXgvbXV0ZXguaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+DQo+
ICsjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdz
Lmg+DQo+ICsjaW5jbHVkZSA8bGludXgvbGlzdC5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L3VhY2Nl
c3MuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9pby5oPg0KPiArI2luY2x1ZGUgImRldmljZS90ZG1f
ZnNsLmgiDQo+ICsNCj4gKw0KPiArc3RhdGljIERFRklORV9NVVRFWCh0ZG1fY29yZV9sb2NrKTsN
Cj4gK3N0YXRpYyBERUZJTkVfSURSKHRkbV9hZGFwdGVyX2lkcik7DQo+ICsvKiBMaXN0IG9mIFRE
TSBhZGFwdGVycyByZWdpc3RlcmVkIHdpdGggVERNIGZyYW1ld29yayAqLyANCj4gK0xJU1RfSEVB
RChhZGFwdGVyX2xpc3QpOw0KPiArDQo+ICsvKiBMaXN0IG9mIFRETSBjbGllbnRzIHJlZ2lzdGVy
ZWQgd2l0aCBURE0gZnJhbWV3b3JrICovIA0KPiArTElTVF9IRUFEKGRyaXZlcl9saXN0KTsNCj4g
Kw0KPiArLyogSW4gY2FzZSB0aGUgcHJldmlvdXMgZGF0YSBpcyBub3QgZmV0Y2hlZCBieSB0aGUg
Y2xpZW50IGRyaXZlciwgdGhlDQo+ICsgKiBkZS1pbnRlcmxlYXZpbmcgZnVuY3Rpb24gd2lsbCAg
ZGlzY2FyZCB0aGUgb2xkIGRhdGEgYW5kIHJld3JpdGUgDQo+ICt0aGUNCj4gKyAqIG5ldyBkYXRh
ICovDQo+ICtzdGF0aWMgaW50IHVzZV9sYXRlc3RfdGRtX2RhdGEgPSAxOw0KPiArDQo+ICsvKiB0
aGlzIHRhc2tsZXQgaXMgY3JlYXRlZCBmb3IgZWFjaCBhZGFwdGVyIGluc3RhbmNlICovIHN0YXRp
YyB2b2lkIA0KPiArdGRtX2RhdGFfdGFza2xldF9mbih1bnNpZ25lZCBsb25nKTsNCj4gKw0KPiAr
LyogdHJpZXMgdG8gbWF0Y2ggY2xpZW50IGRyaXZlciB3aXRoIHRoZSBhZGFwdGVyICovIHN0YXRp
YyBpbnQgDQo+ICt0ZG1fZGV2aWNlX21hdGNoKHN0cnVjdCB0ZG1fZHJpdmVyICpkcml2ZXIsIHN0
cnVjdCB0ZG1fYWRhcHRlciAqYWRhcCkgDQo+ICt7DQo+ICsJLyogbWF0Y2ggb24gYW4gaWQgdGFi
bGUgaWYgdGhlcmUgaXMgb25lICovDQo+ICsJaWYgKGRyaXZlci0+aWRfdGFibGUgJiYgZHJpdmVy
LT5pZF90YWJsZS0+bmFtZVswXSkgew0KPiArCQlpZiAoIShzdHJjbXAoZHJpdmVyLT5pZF90YWJs
ZS0+bmFtZSwgYWRhcC0+bmFtZSkpKQ0KPiArCQkJcmV0dXJuIChpbnQpZHJpdmVyLT5pZF90YWJs
ZTsNCj4gKwl9DQo+ICsJcmV0dXJuIFRETV9FX09LOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgaW50
IHRkbV9hdHRhY2hfZHJpdmVyX2FkYXAoc3RydWN0IHRkbV9kcml2ZXIgKmRyaXZlciwNCj4gKwkJ
CQkJc3RydWN0IHRkbV9hZGFwdGVyICphZGFwKQ0KPiArew0KPiArCS8qIGlmIGRyaXZlciBpcyBh
bHJlYWR5IGF0dGFjaGVkIHRvIGFueSBvdGhlciBhZGFwdGVyLCByZXR1cm4qLw0KPiArCWlmIChk
cml2ZXItPmFkYXB0ZXIgJiYgKGRyaXZlci0+YWRhcHRlciAhPSBhZGFwKSkNCj4gKwkJcmV0dXJu
IFRETV9FX09LOw0KPiArDQo+ICsJZHJpdmVyLT5hZGFwdGVyID0gYWRhcDsNCj4gKw0KPiArCWlm
IChkcml2ZXItPmF0dGFjaF9hZGFwdGVyKSB7DQo+ICsJCWlmIChkcml2ZXItPmF0dGFjaF9hZGFw
dGVyKGFkYXApIDwgMCkNCj4gKwkJCS8qIFdlIGlnbm9yZSB0aGUgcmV0dXJuIGNvZGU7IGlmIGl0
IGZhaWxzLCB0b28gYmFkICovDQo+ICsJCQlwcl9lcnIoImF0dGFjaF9hZGFwdGVyIGZhaWxlZCBm
b3IgZHJpdmVyIFslc11cbiIsDQo+ICsJCQkJZHJpdmVyLT5uYW1lKTsNCj4gKwl9DQo+ICsJYWRh
cC0+ZHJ2X2NvdW50Kys7DQo+ICsNCj4gKwlpZiAoIWFkYXAtPnRhc2tsZXRfY29uZikgew0KPiAr
CQl0YXNrbGV0X2luaXQoJmFkYXAtPnRkbV9kYXRhX3Rhc2tsZXQsIHRkbV9kYXRhX3Rhc2tsZXRf
Zm4sDQo+ICsJCQkJCQkodW5zaWduZWQgbG9uZylhZGFwKTsNCj4gKwkJYWRhcC0+dGFza2xldF9j
b25mID0gMTsNCj4gKwl9DQo+ICsNCj4gKwlyZXR1cm4gVERNX0VfT0s7DQo+ICt9DQo+ICsNCj4g
Ky8qIERldGFjaCBjbGllbnQgZHJpdmVyIGFuZCBhZGFwdGVyICovIHN0YXRpYyBpbnQgDQo+ICt0
ZG1fZGV0YWNoX2RyaXZlcl9hZGFwKHN0cnVjdCB0ZG1fZHJpdmVyICpkcml2ZXIsDQo+ICsJCQkJ
CXN0cnVjdCB0ZG1fYWRhcHRlciAqYWRhcCkNCj4gK3sNCj4gKwlpbnQgcmVzID0gVERNX0VfT0s7
DQo+ICsNCj4gKwlpZiAoIWRyaXZlci0+YWRhcHRlciB8fCAoZHJpdmVyLT5hZGFwdGVyICE9IGFk
YXApKQ0KPiArCQlyZXR1cm4gVERNX0VfT0s7DQo+ICsNCj4gKwlpZiAoIWRyaXZlci0+ZGV0YWNo
X2FkYXB0ZXIpDQo+ICsJCXJldHVybiBURE1fRV9PSzsNCj4gKw0KPiArCWFkYXAtPmRydl9jb3Vu
dC0tOw0KPiArDQo+ICsJLyogSWYgbm8gbW9yZSBkcml2ZXIgaXMgcmVnaXN0ZWQgd2l0aCB0aGUg
YWRhcHRlciovDQo+ICsJaWYgKCFhZGFwLT5kcnZfY291bnQgJiYgYWRhcC0+dGFza2xldF9jb25m
KSB7DQo+ICsJCXRhc2tsZXRfZGlzYWJsZSgmYWRhcC0+dGRtX2RhdGFfdGFza2xldCk7DQo+ICsJ
CXRhc2tsZXRfa2lsbCgmYWRhcC0+dGRtX2RhdGFfdGFza2xldCk7DQo+ICsJCWFkYXAtPnRhc2ts
ZXRfY29uZiA9IDA7DQo+ICsJfQ0KPiArDQo+ICsJaWYgKGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIp
IHsNCj4gKwkJaWYgKGRyaXZlci0+ZGV0YWNoX2FkYXB0ZXIoYWRhcCkpDQo+ICsJCQlwcl9lcnIo
ImRldGFjaF9hZGFwdGVyIGZhaWxlZCBmb3IgZHJpdmVyIFslc11cbiIsDQo+ICsJCQkJZHJpdmVy
LT5uYW1lKTsNCj4gKwl9DQo+ICsNCj4gKwlkcml2ZXItPmFkYXB0ZXIgPSBOVUxMOw0KPiArCXJl
dHVybiByZXM7DQo+ICt9DQo+ICsNCj4gKy8qIFRETSBhZGFwdGVyIFJlZ2lzdHJhdGlvbi9EZS1y
ZWdpc3RyYXRpb24gd2l0aCBURE0gZnJhbWV3b3JrICovDQo+ICsNCj4gK3N0YXRpYyBpbnQgdGRt
X3JlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IHRkbV9hZGFwdGVyICphZGFwKSB7DQo+ICsJaW50IHJl
cyA9IFRETV9FX09LOw0KPiArCXN0cnVjdCB0ZG1fZHJpdmVyICpkcml2ZXIsICpuZXh0Ow0KPiAr
DQo+ICsJaWYgKCFhZGFwKSB7DQo+ICsJCXByX2VycigiJXM6SW52YWxpZCBoYW5kbGVcbiIsIF9f
ZnVuY19fKTsNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ICsJbXV0ZXhfaW5p
dCgmYWRhcC0+YWRhcF9sb2NrKTsNCj4gKwlJTklUX0xJU1RfSEVBRCgmYWRhcC0+bXlwb3J0cyk7
DQo+ICsJc3Bpbl9sb2NrX2luaXQoJmFkYXAtPnBvcnRsaXN0X2xvY2spOw0KPiArDQo+ICsJYWRh
cC0+ZHJ2X2NvdW50ID0gMDsNCj4gKwlhZGFwLT50YXNrbGV0X2NvbmYgPSAwOw0KPiArDQo+ICsJ
bGlzdF9hZGRfdGFpbCgmYWRhcC0+bGlzdCwgJmFkYXB0ZXJfbGlzdCk7DQo+ICsNCj4gKwkvKiBp
bml0aWFsaXphdGlvbiBvZiBkcml2ZXIgYnkgZnJhbWV3b3JrIGluIGRlZmF1bHQgY29uZmlndXJh
dGlvbiAqLw0KPiArCWluaXRfY29uZmlnX2FkYXB0ZXIoYWRhcCk7DQo+ICsNCj4gKwkvKiBOb3Rp
ZnkgZHJpdmVycyAqLw0KPiArCXByX2luZm8oImFkYXB0ZXIgWyVzXSByZWdpc3RlcmVkXG4iLCBh
ZGFwLT5uYW1lKTsNCj4gKwltdXRleF9sb2NrKCZ0ZG1fY29yZV9sb2NrKTsNCj4gKwlsaXN0X2Zv
cl9lYWNoX2VudHJ5X3NhZmUoZHJpdmVyLCBuZXh0LCAmZHJpdmVyX2xpc3QsIGxpc3QpIHsNCj4g
KwkJaWYgKHRkbV9kZXZpY2VfbWF0Y2goZHJpdmVyLCBhZGFwKSkgew0KPiArCQkJcmVzID0gdGRt
X2F0dGFjaF9kcml2ZXJfYWRhcChkcml2ZXIsIGFkYXApOw0KPiArCQkJcHJfaW5mbygNCj4gKwkJ
CSJEcml2ZXIoSUQ9JWQpIGlzIGF0dGFjaGVkIHdpdGggQWRhcHRlciAlcyhJRCA9ICVkKVxuIiwN
Cj4gKwkJCQlkcml2ZXItPmlkLCBhZGFwLT5uYW1lLCBhZGFwLT5pZCk7DQo+ICsJCX0NCj4gKwl9
DQo+ICsJbXV0ZXhfdW5sb2NrKCZ0ZG1fY29yZV9sb2NrKTsNCj4gKw0KPiArCXJldHVybiByZXM7
DQo+ICt9DQo+ICsNCj4gKy8qDQo+ICsgKiB0ZG1fYWRkX2FkYXB0ZXIgLSBkZWNsYXJlIHRkbSBh
ZGFwdGVyLCB1c2UgZHluYW1pYyBkZXZpY2UgbnVtYmVyDQo+ICsgKiBAYWRhcHRlcjogdGhlIGFk
YXB0ZXIgdG8gYWRkDQo+ICsgKiBDb250ZXh0OiBjYW4gc2xlZXANCj4gKyAqDQo+ICsgKiBUaGlz
IHJvdXRpbmUgaXMgdXNlZCB0byBkZWNsYXJlIGEgVERNIGFkYXB0ZXINCj4gKyAqIFdoZW4gdGhp
cyByZXR1cm5zIHplcm8sIGEgbmV3IGRldmljZSBudW1iZXIgd2lsbCBiZSBhbGxvY2F0ZWQgYW5k
IA0KPiArc3RvcmVkDQo+ICsgKiBpbiBhZGFwLT5pZCwgYW5kIHRoZSBzcGVjaWZpZWQgYWRhcHRl
ciBiZWNhbWUgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50cy4NCj4gKyAqIE90aGVyd2lzZSwgYSBu
ZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZC4NCj4gKyAqLw0KPiAraW50IHRkbV9hZGRf
YWRhcHRlcihzdHJ1Y3QgdGRtX2FkYXB0ZXIgKmFkYXB0ZXIpIHsNCj4gKwlpbnQgaWQsIHJlcyA9
IFRETV9FX09LOw0KPiArCWlmICghYWRhcHRlcikgew0KPiArCQlwcl9lcnIoIiVzOkludmFsaWQg
aGFuZGxlXG4iLCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0K
PiArcmV0cnk6DQo+ICsJaWYgKGlkcl9wcmVfZ2V0KCZ0ZG1fYWRhcHRlcl9pZHIsIEdGUF9LRVJO
RUwpID09IDApDQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArDQo+ICsJbXV0ZXhfbG9jaygmdGRt
X2NvcmVfbG9jayk7DQo+ICsJcmVzID0gaWRyX2dldF9uZXcoJnRkbV9hZGFwdGVyX2lkciwgYWRh
cHRlciwgJmlkKTsNCj4gKwltdXRleF91bmxvY2soJnRkbV9jb3JlX2xvY2spOw0KPiArDQo+ICsJ
aWYgKHJlcyA8IDApIHsNCj4gKwkJaWYgKHJlcyA9PSAtRUFHQUlOKQ0KPiArCQkJZ290byByZXRy
eTsNCj4gKwkJcmV0dXJuIHJlczsNCj4gKwl9DQo+ICsNCj4gKwlhZGFwdGVyLT5pZCA9IGlkOw0K
PiArCXJldHVybiB0ZG1fcmVnaXN0ZXJfYWRhcHRlcihhZGFwdGVyKTsgfSANCj4gK0VYUE9SVF9T
WU1CT0wodGRtX2FkZF9hZGFwdGVyKTsNCj4gKw0KPiArDQo+ICsvKioNCj4gKyAqIHRkbV9kZWxf
YWRhcHRlciAtIHVucmVnaXN0ZXIgVERNIGFkYXB0ZXINCj4gKyAqIEBhZGFwOiB0aGUgYWRhcHRl
ciBiZWluZyB1bnJlZ2lzdGVyZWQNCj4gKyAqDQo+ICsgKiBUaGlzIHVucmVnaXN0ZXJzIGFuIFRE
TSBhZGFwdGVyIHdoaWNoIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQNCj4gKyAqIGJ5IEB0ZG1f
YWRkX2FkYXB0ZXIuDQo+ICsgKi8NCj4gK2ludCB0ZG1fZGVsX2FkYXB0ZXIoc3RydWN0IHRkbV9h
ZGFwdGVyICphZGFwKSB7DQo+ICsJaW50IHJlcyA9IFRETV9FX09LOw0KPiArCXN0cnVjdCB0ZG1f
YWRhcHRlciAqZm91bmQ7DQo+ICsJc3RydWN0IHRkbV9kcml2ZXIgKmRyaXZlciwgKm5leHQ7DQo+
ICsNCj4gKwlpZiAoIWFkYXApIHsNCj4gKwkJcHJfZXJyKCIlczpJbnZhbGlkIGhhbmRsZVxuIiwg
X19mdW5jX18pOw0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKwl9DQo+ICsNCj4gKwkvKiBGaXJz
dCBtYWtlIHN1cmUgdGhhdCB0aGlzIGFkYXB0ZXIgd2FzIGV2ZXIgYWRkZWQgKi8NCj4gKwltdXRl
eF9sb2NrKCZ0ZG1fY29yZV9sb2NrKTsNCj4gKwlmb3VuZCA9IGlkcl9maW5kKCZ0ZG1fYWRhcHRl
cl9pZHIsIGFkYXAtPmlkKTsNCj4gKwltdXRleF91bmxvY2soJnRkbV9jb3JlX2xvY2spOw0KPiAr
CWlmIChmb3VuZCAhPSBhZGFwKSB7DQo+ICsJCXByX2VycigidGRtLWNvcmU6IGF0dGVtcHRpbmcg
dG8gZGVsZXRlIHVucmVnaXN0ZXJlZCAiDQo+ICsJCQkgImFkYXB0ZXIgWyVzXVxuIiwgYWRhcC0+
bmFtZSk7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0KPiArCS8qZGlzYWJsZSBh
bmQga2lsbCB0aGUgZGF0YSBwcm9jZXNzaW5nIHRhc2tsZXQgKi8NCj4gKwlpZiAoYWRhcC0+dGFz
a2xldF9jb25mKSB7DQo+ICsJCXRhc2tsZXRfZGlzYWJsZSgmYWRhcC0+dGRtX2RhdGFfdGFza2xl
dCk7DQo+ICsJCXRhc2tsZXRfa2lsbCgmYWRhcC0+dGRtX2RhdGFfdGFza2xldCk7DQo+ICsJCWFk
YXAtPnRhc2tsZXRfY29uZiA9IDA7DQo+ICsJfQ0KPiArDQo+ICsJLyogRGV0YWNoIGFueSBhY3Rp
dmUgcG9ydHMuIFRoaXMgY2FuJ3QgZmFpbCwgdGh1cyB3ZSBkbyBub3QNCj4gKwkgICBjaGVja2lu
ZyB0aGUgcmV0dXJuZWQgdmFsdWUuICovDQo+ICsJbXV0ZXhfbG9jaygmdGRtX2NvcmVfbG9jayk7
DQo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRyaXZlciwgbmV4dCwgJmRyaXZlcl9saXN0
LCBsaXN0KSB7DQo+ICsJCWlmICh0ZG1fZGV2aWNlX21hdGNoKGRyaXZlciwgYWRhcCkpIHsNCj4g
KwkJCXRkbV9kZXRhY2hfZHJpdmVyX2FkYXAoZHJpdmVyLCBhZGFwKTsNCj4gKwkJCXByX2luZm8o
DQo+ICsJCQkiRHJpdmVyKElEPSVkKSBpcyBkZXRhY2hlZCBmcm9tIEFkYXB0ZXIgJXMoSUQgPSAl
ZClcbiIsDQo+ICsJCQkJIGRyaXZlci0+aWQsIGFkYXAtPm5hbWUsIGFkYXAtPmlkKTsNCj4gKwkJ
fQ0KPiArCX0NCj4gKwltdXRleF91bmxvY2soJnRkbV9jb3JlX2xvY2spOw0KPiArDQo+ICsJbXV0
ZXhfbG9jaygmdGRtX2NvcmVfbG9jayk7DQo+ICsJaWRyX3JlbW92ZSgmdGRtX2FkYXB0ZXJfaWRy
LCBhZGFwLT5pZCk7DQo+ICsJbXV0ZXhfdW5sb2NrKCZ0ZG1fY29yZV9sb2NrKTsNCj4gKw0KPiAr
CXByX2RlYnVnKCJhZGFwdGVyIFslc10gdW5yZWdpc3RlcmVkXG4iLCBhZGFwLT5uYW1lKTsNCj4g
Kw0KPiArCWxpc3RfZGVsKCZhZGFwLT5saXN0KTsNCj4gKwkvKiBDbGVhciB0aGUgZGV2aWNlIHN0
cnVjdHVyZSBpbiBjYXNlIHRoaXMgYWRhcHRlciBpcyBldmVyIGdvaW5nIHRvIGJlDQo+ICsJICAg
YWRkZWQgYWdhaW4gKi8NCj4gKwlhZGFwLT5wYXJlbnQgPSBOVUxMOw0KPiArDQo+ICsJcmV0dXJu
IHJlczsNCj4gK30NCj4gK0VYUE9SVF9TWU1CT0wodGRtX2RlbF9hZGFwdGVyKTsNCj4gKw0KPiAr
LyogVERNIENsaWVudCBEcml2ZXJzIFJlZ2lzdHJhdGlvbi9EZS1yZWdpc3RyYXRpb24gRnVuY3Rp
b25zICovIGludCANCj4gK3RkbV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRkbV9kcml2ZXIgKmRy
aXZlcikgew0KPiArCWludCByZXMgPSBURE1fRV9PSzsNCj4gKwlzdHJ1Y3QgdGRtX2FkYXB0ZXIg
KmFkYXAsICpuZXh0Ow0KPiArDQo+ICsJbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5saXN0LCAmZHJp
dmVyX2xpc3QpOw0KPiArDQo+ICsJbXV0ZXhfbG9jaygmdGRtX2NvcmVfbG9jayk7DQo+ICsJLyog
V2FsayB0aGUgYWRhcHRlcnMgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50ICovDQo+ICsJbGlzdF9m
b3JfZWFjaF9lbnRyeV9zYWZlKGFkYXAsIG5leHQsICZhZGFwdGVyX2xpc3QsIGxpc3QpIHsNCj4g
KwkJaWYgKHRkbV9kZXZpY2VfbWF0Y2goZHJpdmVyLCBhZGFwKSkgew0KPiArCQkJcmVzID0gdGRt
X2F0dGFjaF9kcml2ZXJfYWRhcChkcml2ZXIsIGFkYXApOw0KPiArCQkJcHJfaW5mbygiVERNIERy
aXZlcihJRD0lZClpcyBhdHRhY2hlZCB3aXRoIEFkYXB0ZXIiDQo+ICsJCQkJIiVzKElEID0gJWQp
IGRydl9jb3VudD0lZCIsIGRyaXZlci0+aWQsDQo+ICsJCQkJYWRhcC0+bmFtZSwgYWRhcC0+aWQs
IGFkYXAtPmRydl9jb3VudCk7DQo+ICsJCWJyZWFrOw0KPiArCQl9DQo+ICsJfQ0KPiArCW11dGV4
X3VubG9jaygmdGRtX2NvcmVfbG9jayk7DQo+ICsNCj4gKwlyZXR1cm4gcmVzOw0KPiArfQ0KPiAr
RVhQT1JUX1NZTUJPTCh0ZG1fcmVnaXN0ZXJfZHJpdmVyKTsNCj4gKw0KPiArLyoNCj4gKyAqIHRk
bV91bnJlZ2lzdGVyX2RyaXZlciAtIHVucmVnaXN0ZXIgVERNIGNsaWVudCBkcml2ZXIgZnJvbSBU
RE0gDQo+ICtmcmFtZXdvcmsNCj4gKyAqIEBkcml2ZXI6IHRoZSBkcml2ZXIgYmVpbmcgdW5yZWdp
c3RlcmVkICAqLyB2b2lkIA0KPiArdGRtX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0ZG1fZHJp
dmVyICpkcml2ZXIpIHsNCj4gKwlpZiAoIWRyaXZlcikgew0KPiArCQlwcl9lcnIoIiVzOkludmFs
aWQgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsgICAgICAg
LyogQSBkcml2ZXIgY2FuIHJlZ2lzdGVyIHRvIG9ubHkgb25lIGFkYXB0ZXIsDQo+ICsJKiBzbyBu
byBuZWVkIHRvIGJyb3dzZSB0aGUgbGlzdCAqLw0KPiArCW11dGV4X2xvY2soJnRkbV9jb3JlX2xv
Y2spOw0KPiArCXRkbV9kZXRhY2hfZHJpdmVyX2FkYXAoZHJpdmVyLCBkcml2ZXItPmFkYXB0ZXIp
Ow0KPiArCW11dGV4X3VubG9jaygmdGRtX2NvcmVfbG9jayk7DQo+ICsNCj4gKwlsaXN0X2RlbCgm
ZHJpdmVyLT5saXN0KTsNCj4gKw0KPiArCXByX2RlYnVnKCJ0ZG0tY29yZTogZHJpdmVyIFslc10g
dW5yZWdpc3RlcmVkXG4iLCBkcml2ZXItPm5hbWUpOyB9IA0KPiArRVhQT1JUX1NZTUJPTCh0ZG1f
dW5yZWdpc3Rlcl9kcml2ZXIpOw0KPiArDQo+ICsvKiBURE0gRnJhbWV3b3JrIGluaXQgYW5kIGV4
aXQgKi8NCj4gK3N0YXRpYyBpbnQgX19pbml0IHRkbV9pbml0KHZvaWQpDQo+ICt7DQo+ICsJcHJf
aW5mbygiJXNcbiIsIF9fZnVuY19fKTsNCj4gKwlyZXR1cm4gVERNX0VfT0s7DQo+ICt9DQo+ICsN
Cj4gK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZG1fZXhpdCh2b2lkKQ0KPiArew0KPiArCXByX2luZm8o
IiVzXG4iLCBfX2Z1bmNfXyk7DQo+ICsJcmV0dXJuOw0KPiArfQ0KPiArDQo+ICsvKiBXZSBtdXN0
IGluaXRpYWxpemUgZWFybHksIGJlY2F1c2Ugc29tZSBzdWJzeXN0ZW1zIHJlZ2lzdGVyIHRkbSAN
Cj4gK2RyaXZlcnMNCj4gKyAqIGluIHN1YnN5c19pbml0Y2FsbCgpIGNvZGUsIGJ1dCBhcmUgbGlu
a2VkIChhbmQgaW5pdGlhbGl6ZWQpIGJlZm9yZSB0ZG0uDQo+ICsgKi8NCj4gK3Bvc3Rjb3JlX2lu
aXRjYWxsKHRkbV9pbml0KTsNCj4gK21vZHVsZV9leGl0KHRkbV9leGl0KTsNCj4gKw0KPiArDQo+
ICsvKiBJbnRlcmZhY2UgdG8gdGhlIHRkbSBkZXZpY2UvYWRhcHRlciAqLw0KPiArDQo+ICsvKiB0
ZG1fYWRhcF9zZW5kIC0gaXNzdWUgYSBURE0gd3JpdGUNCj4gKyAqIEBhZGFwOiBIYW5kbGUgdG8g
VERNIGRldmljZQ0KPiArICogQGJ1ZjogRGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUg
VERNIGRldmljZQ0KPiArICogQGNvdW50OiBIb3cgbWFueSBieXRlcyB0byB3cml0ZQ0KPiArICoN
Cj4gKyAqIFJldHVybnMgbmVnYXRpdmUgZXJybm8sIG9yIGVsc2UgdGhlIG51bWJlciBvZiBieXRl
cyB3cml0dGVuLg0KPiArICovDQo+ICtpbnQgdGRtX2FkYXBfc2VuZChzdHJ1Y3QgdGRtX2FkYXB0
ZXIgKmFkYXAsIHZvaWQgKipidWYsIGludCBjb3VudCkgew0KPiArCWludCByZXM7DQo+ICsNCj4g
KwlpZiAoKGFkYXAgPT0gTlVMTCkgfHwgKGJ1ZiA9PSBOVUxMKSkgeyAvKiBpbnZhbGlkIGhhbmRs
ZSovDQo+ICsJCXByX2VycigiJXM6IEludmFsaWQgSGFuZGxlXG4iLCBfX2Z1bmNfXyk7DQo+ICsJ
CXJldHVybiAtRU5YSU87DQo+ICsJfQ0KPiArDQo+ICsJaWYgKGFkYXAtPmFsZ28tPnRkbV93cml0
ZSkNCj4gKwkJcmVzID0gYWRhcC0+YWxnby0+dGRtX3dyaXRlKGFkYXAsIGJ1ZiwgY291bnQpOw0K
PiArCWVsc2Ugew0KPiArCQlwcl9lcnIoIlRETSBsZXZlbCB3cml0ZSBub3Qgc3VwcG9ydGVkXG4i
KTsNCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOw0KPiArCX0NCj4gKw0KPiArCS8qIElmIGV2ZXJ5
dGhpbmcgd2VudCBvayAoaS5lLiBmcmFtZSB0cmFuc21pdHRlZCksIHJldHVybiAjYnl0ZXMNCj4g
KwkgICB0cmFuc21pdHRlZCwgZWxzZSBlcnJvciBjb2RlLiAqLw0KPiArCXJldHVybiAocmVzID09
IDEpID8gY291bnQgOiByZXM7DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9hZGFwX3NlbmQp
Ow0KPiArDQo+ICsvKioNCj4gKyAqIHRkbV9hZGFwX3JlY3YgLSBpc3N1ZSBhIFRETSByZWFkDQo+
ICsgKiBAYWRhcDogSGFuZGxlIHRvIFRETSBkZXZpY2UNCj4gKyAqIEBidWY6IFdoZXJlIHRvIHN0
b3JlIGRhdGEgcmVhZCBmcm9tIFRETSBkZXZpY2UNCj4gKyAqDQo+ICsgKiBSZXR1cm5zIG5lZ2F0
aXZlIGVycm5vLCBvciBlbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4NCj4gKyAqLw0KPiAr
aW50IHRkbV9hZGFwX3JlY3Yoc3RydWN0IHRkbV9hZGFwdGVyICphZGFwLCB2b2lkICoqYnVmKSB7
DQo+ICsJaW50IHJlczsNCj4gKw0KPiArCWlmIChhZGFwLT5hbGdvLT50ZG1fcmVhZCkNCj4gKwkJ
cmVzID0gYWRhcC0+YWxnby0+dGRtX3JlYWQoYWRhcCwgKHUxNiAqKilidWYpOw0KPiArCWVsc2Ug
ew0KPiArCQlwcl9lcnIoIlRETSBsZXZlbCByZWFkIG5vdCBzdXBwb3J0ZWRcbiIpOw0KPiArCQly
ZXR1cm4gLUVPUE5PVFNVUFA7DQo+ICsJfQ0KPiArCS8qIElmIGV2ZXJ5dGhpbmcgd2VudCBvayAo
aS5lLiBmcmFtZSByZWNlaXZlZCksIHJldHVybiAjYnl0ZXMNCj4gKwkgICB0cmFuc21pdHRlZCwg
ZWxzZSBlcnJvciBjb2RlLiAqLw0KPiArCXJldHVybiByZXM7DQo+ICt9DQo+ICsNCj4gKy8qKg0K
PiArICogdGRtX2FkYXBfZ2V0X3dyaXRlX2J1ZiAtIGdldCBuZXh0IHdyaXRlIFRETSBkZXZpY2Ug
YnVmZmVyDQo+ICsgKiBAYWRhcDogSGFuZGxlIHRvIFRETSBkZXZpY2UNCj4gKyAqIEBidWY6IHBv
aW50ZXIgdG8gVERNIGRldmljZSBidWZmZXINCj4gKyAqDQo+ICsgKiBSZXR1cm5zIG5lZ2F0aXZl
IGVycm5vLCBvciBlbHNlIHNpemUgb2YgdGhlIHdyaXRlIGJ1ZmZlci4NCj4gKyAqLw0KPiAraW50
IHRkbV9hZGFwX2dldF93cml0ZV9idWYoc3RydWN0IHRkbV9hZGFwdGVyICphZGFwLCB2b2lkICoq
YnVmKSB7DQo+ICsJaW50IHJlczsNCj4gKw0KPiArCWlmIChhZGFwLT5hbGdvLT50ZG1fZ2V0X3dy
aXRlX2J1Zikgew0KPiArCQlyZXMgPSBhZGFwLT5hbGdvLT50ZG1fZ2V0X3dyaXRlX2J1ZihhZGFw
LCAodTE2ICoqKWJ1Zik7DQo+ICsJfSBlbHNlIHsNCj4gKwkJcHJfZXJyKCJURE0gbGV2ZWwgd3Jp
dGUgYnVmIGdldCBub3Qgc3VwcG9ydGVkXG4iKTsNCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOw0K
PiArCX0NCj4gKwkvKiBJZiBldmVyeXRoaW5nIHdlbnQgb2sgKGkuZS4gMSBtc2cgcmVjZWl2ZWQp
LCByZXR1cm4gI2J5dGVzDQo+ICsJICAgdHJhbnNtaXR0ZWQsIGVsc2UgZXJyb3IgY29kZS4gKi8N
Cj4gKwlyZXR1cm4gcmVzOw0KPiArfQ0KPiArRVhQT1JUX1NZTUJPTCh0ZG1fYWRhcF9nZXRfd3Jp
dGVfYnVmKTsNCj4gKw0KPiAraW50IHRkbV9hZGFwX2VuYWJsZShzdHJ1Y3QgdGRtX2RyaXZlciAq
ZHJ2KSB7DQo+ICsJaW50IHJlczsNCj4gKwlzdHJ1Y3QgdGRtX2FkYXB0ZXIgKmFkYXA7DQo+ICsJ
aWYgKGRydiA9PSBOVUxMKSB7IC8qIGludmFsaWQgaGFuZGxlKi8NCj4gKwkJcHJfZXJyKCIlczog
SW52YWxpZCBIYW5kbGVcbiIsIF9fZnVuY19fKTsNCj4gKwkJcmV0dXJuIC1FTlhJTzsNCj4gKwl9
DQo+ICsJYWRhcCA9IGRydi0+YWRhcHRlcjsNCj4gKw0KPiArCWlmIChhZGFwLT5hbGdvLT50ZG1f
ZW5hYmxlKSB7DQo+ICsJCXJlcyA9IGFkYXAtPmFsZ28tPnRkbV9lbmFibGUoYWRhcCk7DQo+ICsJ
fSBlbHNlIHsNCj4gKwkJcHJfZXJyKCJURE0gbGV2ZWwgZW5hYmxlIG5vdCBzdXBwb3J0ZWRcbiIp
Ow0KPiArCQlyZXR1cm4gLUVPUE5PVFNVUFA7DQo+ICsJfQ0KPiArCXJldHVybiByZXM7DQo+ICt9
DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9hZGFwX2VuYWJsZSk7DQo+ICsNCj4gK2ludCB0ZG1fYWRh
cF9kaXNhYmxlKHN0cnVjdCB0ZG1fZHJpdmVyICpkcnYpIHsNCj4gKwlpbnQgcmVzOw0KPiArCXN0
cnVjdCB0ZG1fYWRhcHRlciAqYWRhcDsNCj4gKwlpZiAoZHJ2ID09IE5VTEwpIHsgLyogaW52YWxp
ZCBoYW5kbGUqLw0KPiArCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEhhbmRsZVxuIiwgX19mdW5jX18p
Ow0KPiArCQlyZXR1cm4gLUVOWElPOw0KPiArCX0NCj4gKwlhZGFwID0gZHJ2LT5hZGFwdGVyOw0K
PiArDQo+ICsJaWYgKGFkYXAtPmFsZ28tPnRkbV9kaXNhYmxlKSB7DQo+ICsJCXJlcyA9IGFkYXAt
PmFsZ28tPnRkbV9kaXNhYmxlKGFkYXApOw0KPiArCX0gZWxzZSB7DQo+ICsJCXByX2VycigiVERN
IGxldmVsIGVuYWJsZSBub3Qgc3VwcG9ydGVkXG4iKTsNCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQ
Ow0KPiArCX0NCj4gKwlyZXR1cm4gcmVzOw0KPiArfQ0KPiArRVhQT1JUX1NZTUJPTCh0ZG1fYWRh
cF9kaXNhYmxlKTsNCj4gKw0KPiArc3RydWN0IHRkbV9hZGFwdGVyICp0ZG1fZ2V0X2FkYXB0ZXIo
aW50IGlkKSB7DQo+ICsJc3RydWN0IHRkbV9hZGFwdGVyICphZGFwdGVyOw0KPiArDQo+ICsJbXV0
ZXhfbG9jaygmdGRtX2NvcmVfbG9jayk7DQo+ICsJYWRhcHRlciA9IGlkcl9maW5kKCZ0ZG1fYWRh
cHRlcl9pZHIsIGlkKTsNCj4gKwlpZiAoYWRhcHRlciAmJiAhdHJ5X21vZHVsZV9nZXQoYWRhcHRl
ci0+b3duZXIpKQ0KPiArCQlhZGFwdGVyID0gTlVMTDsNCj4gKw0KPiArCW11dGV4X3VubG9jaygm
dGRtX2NvcmVfbG9jayk7DQo+ICsNCj4gKwlyZXR1cm4gYWRhcHRlcjsNCj4gK30NCj4gK0VYUE9S
VF9TWU1CT0wodGRtX2dldF9hZGFwdGVyKTsNCj4gKw0KPiArdm9pZCB0ZG1fcHV0X2FkYXB0ZXIo
c3RydWN0IHRkbV9hZGFwdGVyICphZGFwKSB7DQo+ICsJbW9kdWxlX3B1dChhZGFwLT5vd25lcik7
DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9wdXRfYWRhcHRlcik7DQo+ICsNCj4gKw0KPiAr
LyogUG9ydCBMZXZlbCBBUElzIG9mIFRETSBGcmFtZXdvcmsgKi8gdW5zaWduZWQgaW50IA0KPiAr
dGRtX3BvcnRfb3BlbihzdHJ1Y3QgdGRtX2RyaXZlciAqZHJpdmVyLCB2b2lkICoqaF9wb3J0KSB7
DQo+ICsJc3RydWN0IHRkbV9wb3J0ICpwb3J0Ow0KPiArCXN0cnVjdCB0ZG1fYWRhcHRlciAqYWRh
cDsNCj4gKwl1bnNpZ25lZCBsb25nCQlmbGFnczsNCj4gKwlpbnQgcmVzID0gVERNX0VfT0s7DQo+
ICsNCj4gKwlpZiAoZHJpdmVyID09IE5VTEwpIHsNCj4gKwkJcHJfZXJyKCJkcml2ZXIgTlVMTFxu
Iik7DQo+ICsJCXJldHVybiAtRU5PREVWOw0KPiArCX0NCj4gKwlpZiAoZHJpdmVyLT5hZGFwdGVy
ID09IE5VTEwpIHsNCj4gKwkJcHJfZXJyKCJhZGFwdGVyIE5VTExcbiIpOw0KPiArCQlyZXR1cm4g
LUVOT0RFVjsNCj4gKwl9DQo+ICsNCj4gKwlhZGFwID0gdGRtX2dldF9hZGFwdGVyKGRyaXZlci0+
YWRhcHRlci0+aWQpOw0KPiArCWlmICghYWRhcCkNCj4gKwkJcmV0dXJuIC1FTk9ERVY7DQo+ICsN
Cj4gKwkvKiBUaGlzIGNyZWF0ZXMgYW4gYW5vbnltb3VzIHRkbV9wb3J0LCB3aGljaCBtYXkgbGF0
ZXIgYmUNCj4gKwkgKiBwb2ludGVkIHRvIHNvbWUgc2xvdC4NCj4gKwkgKg0KPiArCSAqLw0KPiAr
CXBvcnQgPSBremFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOw0KPiArCWlmICghcG9y
dCkgew0KPiArCQlyZXMgPSAtRU5PTUVNOw0KPiArCQlnb3RvIG91dDsNCj4gKwl9DQo+ICsNCj4g
Kwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwb3J0LT5jaF93YWl0X3F1ZXVlKTsNCj4gKw0KPiArDQo+
ICsJcG9ydC0+cnhfbWF4X2ZyYW1lcyA9IE5VTV9TQU1QTEVTX1BFUl9GUkFNRTsNCj4gKwlwb3J0
LT5wb3J0X2NmZy5wb3J0X21vZGUgPSBlX1RETV9QT1JUX0NIQU5ORUxJWkVEOw0KPiArDQo+ICsJ
cG9ydC0+aW5fdXNlID0gMTsNCj4gKw0KPiArCXNucHJpbnRmKGRyaXZlci0+bmFtZSwgVERNX05B
TUVfU0laRSwgInRkbS1kZXYiKTsNCj4gKwlwb3J0LT5kcml2ZXIgPSBkcml2ZXI7DQo+ICsJcG9y
dC0+YWRhcHRlciA9IGFkYXA7DQo+ICsNCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcC0+cG9y
dGxpc3RfbG9jaywgZmxhZ3MpOw0KPiArCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmxpc3QsICZhZGFw
LT5teXBvcnRzKTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwLT5wb3J0bGlzdF9s
b2NrLCBmbGFncyk7DQo+ICsNCj4gKwlJTklUX0xJU1RfSEVBRCgmcG9ydC0+bXljaGFubmVscyk7
DQo+ICsNCj4gKwkqaF9wb3J0ID0gcG9ydDsNCj4gKw0KPiArb3V0Og0KPiArCXJldHVybiByZXM7
DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9wb3J0X29wZW4pOw0KPiArDQo+ICt1bnNpZ25l
ZCBpbnQgdGRtX3BvcnRfY2xvc2Uodm9pZCAqaF9wb3J0KSB7DQo+ICsJc3RydWN0IHRkbV9hZGFw
dGVyICphZGFwOw0KPiArCXN0cnVjdCB0ZG1fZHJpdmVyICpkcml2ZXI7DQo+ICsJc3RydWN0IHRk
bV9wb3J0ICpwb3J0Ow0KPiArCXN0cnVjdCB0ZG1fY2hhbm5lbCAqdGVtcCwgKmNoYW5uZWw7DQo+
ICsJdW5zaWduZWQgbG9uZwkJZmxhZ3M7DQo+ICsJaW50IHJlcyA9IFRETV9FX09LOw0KPiArCXBv
cnQgPSAoc3RydWN0IHRkbV9wb3J0ICopaF9wb3J0Ow0KPiArDQo+ICsJaWYgKHBvcnQgPT0gTlVM
TCkgeyAvKiBpbnZhbGlkIGhhbmRsZSovDQo+ICsJCXByX2VycigiSW52YWxpZCBIYW5kbGUiKTsN
Cj4gKwkJcmV0dXJuIC1FTlhJTzsNCj4gKwl9DQo+ICsNCj4gKwlkcml2ZXIgPSAgcG9ydC0+ZHJp
dmVyOw0KPiArDQo+ICsJaWYgKGRyaXZlciA9PSBOVUxMKSB7DQo+ICsJCXByX2VycigiZHJpdmVy
IE5VTExcbiIpOw0KPiArCQlyZXMgPSAtRU5PREVWOw0KPiArCQlnb3RvIG91dDsNCj4gKwl9DQo+
ICsJaWYgKGRyaXZlci0+YWRhcHRlciA9PSBOVUxMKSB7DQo+ICsJCXByX2VycigiYWRhcHRlciBO
VUxMXG4iKTsNCj4gKwkJcmVzID0gLUVOT0RFVjsNCj4gKwkJZ290byBvdXQ7DQo+ICsJfQ0KPiAr
DQo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW5uZWwsIHRlbXAsICZwb3J0LT5teWNo
YW5uZWxzLCBsaXN0KSB7DQo+ICsJaWYgKGNoYW5uZWwpDQo+ICsJCWlmIChjaGFubmVsLT5pbl91
c2UpIHsNCj4gKwkJCXByX2VycigiJXM6IENhbm5vdCBjbG9zZSBwb3J0LiBDaGFubmVsIGluIHVz
ZVxuIiwNCj4gKwkJCQkJCQkJX19mdW5jX18pOw0KPiArCQkJcmVzID0gLUVOWElPOw0KPiArCQkJ
Z290byBvdXQ7DQo+ICsJCQl9DQo+ICsJfQ0KPiArCWFkYXAgPSBkcml2ZXItPmFkYXB0ZXI7DQo+
ICsNCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcC0+cG9ydGxpc3RfbG9jaywgZmxhZ3MpOw0K
PiArCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZh
ZGFwLT5wb3J0bGlzdF9sb2NrLCBmbGFncyk7DQo+ICsNCj4gKwlpZiAocG9ydC0+cF9wb3J0X2Rh
dGEgIT0gTlVMTCkgew0KPiArCQlpbnQgaTsNCj4gKwkJc3RydWN0IHRkbV9iZCAqY2hfYmQ7DQo+
ICsNCj4gKwkJLyogSWYgdGhlIHRkbSBpcyBpbiBjaGFubmVsaXNlZCBtb2RlLA0KPiArCQlkZS1h
bGxvY2F0ZSB0aGUgY2hhbm5lbGlzZWQgYnVmZmVyICovDQo+ICsJCWNoX2JkID0gJihwb3J0LT5w
X3BvcnRfZGF0YS0+cnhfZGF0YV9maWZvWzBdKTsNCj4gKwkJZm9yIChpID0gMDsgY2hfYmQgJiYg
aSA8IFRETV9DSF9SWF9CRF9SSU5HX1NJWkU7IGkrKykgew0KPiArCQkJY2hfYmQtPmZsYWcgPSAw
Ow0KPiArCQkJY2hfYmQrKzsNCj4gKwkJfQ0KPiArCQljaF9iZCA9ICYocG9ydC0+cF9wb3J0X2Rh
dGEtPnR4X2RhdGFfZmlmb1swXSk7DQo+ICsJCWZvciAoaSA9IDA7IGNoX2JkICYmIGkgPCBURE1f
Q0hfVFhfQkRfUklOR19TSVpFOyBpKyspIHsNCj4gKwkJCWNoX2JkLT5mbGFnID0gMDsNCj4gKwkJ
CWNoX2JkKys7DQo+ICsJCX0NCj4gKwkJa2ZyZWUocG9ydC0+cF9wb3J0X2RhdGEpOw0KPiArCX0N
Cj4gKwlrZnJlZShwb3J0KTsNCj4gKwlyZXR1cm4gcmVzOw0KPiArb3V0Og0KPiArCWlmIChwb3J0
KQ0KPiArCQlrZnJlZShwb3J0LT5wX3BvcnRfZGF0YSk7DQo+ICsJa2ZyZWUocG9ydCk7DQo+ICsJ
cmV0dXJuIHJlczsNCj4gK30NCj4gK0VYUE9SVF9TWU1CT0wodGRtX3BvcnRfY2xvc2UpOw0KPiAr
DQo+ICt1bnNpZ25lZCBpbnQgdGRtX2NoYW5uZWxfcmVhZCh2b2lkICpoX3BvcnQsIHZvaWQgKmhf
Y2hhbm5lbCwNCj4gKwkJCQl2b2lkICpwX2RhdGEsIHUxNiAqc2l6ZSkNCj4gK3sNCj4gKwlzdHJ1
Y3QgdGRtX3BvcnQgKnBvcnQ7DQo+ICsJc3RydWN0IHRkbV9jaGFubmVsICpjaGFubmVsOw0KPiAr
CXN0cnVjdCB0ZG1fYmQgKnJ4X2JkOw0KPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+ICsJaW50
IGksIHJlcyA9IFRETV9FX09LOw0KPiArCXVuc2lnbmVkIHNob3J0ICpidWYsICpidWYxOw0KPiAr
CXBvcnQgPSAoc3RydWN0IHRkbV9wb3J0ICopaF9wb3J0Ow0KPiArCWNoYW5uZWwgPSAoc3RydWN0
IHRkbV9jaGFubmVsICopaF9jaGFubmVsOw0KPiArDQo+ICsJaWYgKChwb3J0ICYmIGNoYW5uZWwp
ID09IDApIHsgLyogaW52YWxpZCBoYW5kbGUqLw0KPiArCQlwcl9lcnIoIiVzOkludmFsaWQgSGFu
ZGxlXG4iLCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVybiAtRU5YSU87DQo+ICsJfQ0KPiArDQo+ICsJ
aWYgKCFwb3J0LT5pbl91c2UpDQo+ICsJCXJldHVybiAtRUlPOw0KPiArCWlmICghY2hhbm5lbC0+
cF9jaF9kYXRhIHx8ICFjaGFubmVsLT5pbl91c2UpDQo+ICsJCXJldHVybiAtRUlPOw0KPiArDQo+
ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnBfY2hfZGF0YS0+cnhfY2hhbm5lbF9sb2Nr
LCBmbGFncyk7DQo+ICsJcnhfYmQgPSBjaGFubmVsLT5wX2NoX2RhdGEtPnJ4X291dF9kYXRhOw0K
PiArDQo+ICsJaWYgKHJ4X2JkLT5mbGFnKSB7DQo+ICsJCSpzaXplID0gcnhfYmQtPmxlbmd0aDsN
Cj4gKwkJYnVmID0gKHUxNiAqKSBwX2RhdGE7DQo+ICsJCWJ1ZjEgPSAodTE2ICopcnhfYmQtPnBf
ZGF0YTsNCj4gKwkJZm9yIChpID0gMDsgaSA8IE5VTV9TQU1QTEVTX1BFUl9GUkFNRTsgaSsrKQ0K
PiArCQkJYnVmW2ldID0gYnVmMVtpXTsNCj4gKwkJcnhfYmQtPmZsYWcgPSAwOw0KPiArCQlyeF9i
ZC0+b2Zmc2V0ID0gMDsNCj4gKwkJY2hhbm5lbC0+cF9jaF9kYXRhLT5yeF9vdXRfZGF0YSA9IChy
eF9iZC0+d3JhcCkgPw0KPiArCQkJCWNoYW5uZWwtPnBfY2hfZGF0YS0+cnhfZGF0YV9maWZvIDog
cnhfYmQgKyAxOw0KPiArDQo+ICsJfSBlbHNlIHsNCj4gKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y
ZSgmY2hhbm5lbC0+cF9jaF9kYXRhLT5yeF9jaGFubmVsX2xvY2ssDQo+ICsJCQkJCQlmbGFncyk7
DQo+ICsJCXByX2luZm8oIk5vIERhdGEgQXZhaWxhYmxlIik7DQo+ICsJCXJldHVybiAtRUFHQUlO
Ow0KPiArCX0NCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5wX2NoX2RhdGEt
PnJ4X2NoYW5uZWxfbG9jaywgZmxhZ3MpOw0KPiArDQo+ICsJcmV0dXJuIHJlczsNCj4gK30NCj4g
K0VYUE9SVF9TWU1CT0wodGRtX2NoYW5uZWxfcmVhZCk7DQo+ICsNCj4gKw0KPiArdW5zaWduZWQg
aW50IHRkbV9jaGFubmVsX3dyaXRlKHZvaWQgKmhfcG9ydCwgdm9pZCAqaF9jaGFubmVsLA0KPiAr
CQkJCXZvaWQgKnBfZGF0YSwgdTE2IHNpemUpDQo+ICt7DQo+ICsJc3RydWN0IHRkbV9wb3J0ICpw
b3J0Ow0KPiArCXN0cnVjdCB0ZG1fY2hhbm5lbCAqY2hhbm5lbDsNCj4gKwlzdHJ1Y3QgdGRtX2Jk
ICp0eF9iZDsNCj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiArCWludCBlcnIgPSBURE1fRV9P
SzsNCj4gKwlwb3J0ID0gKHN0cnVjdCB0ZG1fcG9ydCAqKWhfcG9ydDsNCj4gKwljaGFubmVsID0g
KHN0cnVjdCB0ZG1fY2hhbm5lbCAqKWhfY2hhbm5lbDsgI2lmZGVmIFRETV9DT1JFX0RFQlVHDQo+
ICsJYm9vbCBkYXRhX2ZsYWcgPSAwOw0KPiArI2VuZGlmDQo+ICsNCj4gKwlpZiAoKHBvcnQgJiYg
Y2hhbm5lbCkgPT0gMCkgeyAvKiBpbnZhbGlkIGhhbmRsZSovDQo+ICsJCXByX2VycigiSW52YWxp
ZCBIYW5kbGUiKTsNCj4gKwkJcmV0dXJuIC1FTlhJTzsNCj4gKwl9DQo+ICsNCj4gKwlpZiAocF9k
YXRhID09IE5VTEwpIHsgLyogaW52YWxpZCBkYXRhKi8NCj4gKwkJcHJfZXJyKCJJbnZhbGlkIERh
dGEiKTsNCj4gKwkJcmV0dXJuIC1FRkFVTFQ7DQo+ICsJfQ0KPiArDQo+ICsJaWYgKCFwb3J0LT5p
bl91c2UpDQo+ICsJCXJldHVybiAtRUlPOw0KPiArCWlmICghY2hhbm5lbC0+cF9jaF9kYXRhIHx8
ICFjaGFubmVsLT5pbl91c2UpDQo+ICsJCXJldHVybiAtRUlPOw0KPiArDQo+ICsJc3Bpbl9sb2Nr
X2lycXNhdmUoJmNoYW5uZWwtPnBfY2hfZGF0YS0+dHhfY2hhbm5lbF9sb2NrLCBmbGFncyk7DQo+
ICsJdHhfYmQgPSBjaGFubmVsLT5wX2NoX2RhdGEtPnR4X2luX2RhdGE7DQo+ICsNCj4gKwlpZiAo
IXR4X2JkLT5mbGFnKSB7DQo+ICsJCXR4X2JkLT5sZW5ndGggPSBzaXplOw0KPiArCQltZW1jcHko
dHhfYmQtPnBfZGF0YSwgcF9kYXRhLA0KPiArCQkJc2l6ZSAqIHBvcnQtPmFkYXB0ZXItPmFkYXB0
X2NmZy5zbG90X3dpZHRoKTsNCj4gKwkJdHhfYmQtPmZsYWcgPSAxOw0KPiArCQl0eF9iZC0+b2Zm
c2V0ID0gMDsNCj4gKwkJY2hhbm5lbC0+cF9jaF9kYXRhLT50eF9pbl9kYXRhID0gKHR4X2JkLT53
cmFwKSA/DQo+ICsJCQkJY2hhbm5lbC0+cF9jaF9kYXRhLT50eF9kYXRhX2ZpZm8gOiB0eF9iZCsx
Ow0KPiArCQlwb3J0LT5wb3J0X3N0YXQudHhfcGt0X2NvdW50Kys7DQo+ICsjaWZkZWYgVERNX0NP
UkVfREVCVUcNCj4gKwkJZGF0YV9mbGFnID0gMTsNCj4gKyNlbmRpZg0KPiArCX0gZWxzZSB7DQo+
ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPnBfY2hfZGF0YS0+dHhfY2hhbm5l
bF9sb2NrLA0KPiArCQkJCQkJZmxhZ3MpOw0KPiArCQlwb3J0LT5wb3J0X3N0YXQudHhfcGt0X2Ry
b3BfY291bnQrKzsNCj4gKwkJcHJfZXJyKCJFX05PX01FTU9SWSAtRmFpbGVkIFRyYW5zbWl0Iik7
DQo+ICsJCXJldHVybiAtRU5PTUVNOw0KPiArCX0NCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl
KCZjaGFubmVsLT5wX2NoX2RhdGEtPnR4X2NoYW5uZWxfbG9jaywgZmxhZ3MpOw0KPiArDQo+ICsj
aWZkZWYJVERNX0NPUkVfREVCVUcNCj4gKwlpZiAoZGF0YV9mbGFnKSB7DQo+ICsJCWludCBrOw0K
PiArCQlwcl9pbmZvKCJcblRYIHBvcnQ6JWQgLSBXcml0ZSAtIFBvcnQgVFgtJWRcbiIsDQo+ICsJ
CQkJCQlwb3J0LT5wb3J0X2lkLCBzaXplKTsNCj4gKwkJZm9yIChrID0gMDsgayA8IHNpemU7IGsr
KykNCj4gKwkJCXByX2luZm8oIiV4IiwgcF9kYXRhW2tdKTsNCj4gKwkJcHJfaW5mbygiXG4iKTsN
Cj4gKwl9DQo+ICsjZW5kaWYNCj4gKwlyZXR1cm4gZXJyOw0KPiArfQ0KPiArRVhQT1JUX1NZTUJP
TCh0ZG1fY2hhbm5lbF93cml0ZSk7DQo+ICsNCj4gK3dhaXRfcXVldWVfaGVhZF90ICp0ZG1fcG9y
dF9nZXRfd2FpdF9xdWV1ZSh2b2lkICAqaF9wb3J0KSB7DQo+ICsJc3RydWN0IHRkbV9wb3J0ICpw
b3J0Ow0KPiArCXBvcnQgPSAoc3RydWN0IHRkbV9wb3J0ICopaF9wb3J0Ow0KPiArDQo+ICsJaWYg
KHBvcnQgPT0gTlVMTCkgeyAvKiBpbnZhbGlkIGhhbmRsZSovDQo+ICsJCXByX2VycigiSW52YWxp
ZCBIYW5kbGUiKTsNCj4gKwkJcmV0dXJuIE5VTEw7DQo+ICsJfQ0KPiArDQo+ICsJcmV0dXJuICZw
b3J0LT5jaF93YWl0X3F1ZXVlOw0KPiArDQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9wb3J0
X2dldF93YWl0X3F1ZXVlKTsNCj4gKw0KPiArLyogRHJpdmVyIEZ1bmN0aW9uIGZvciBzZWxlY3Qg
YW5kIHBvbGwuIEJhc2VkIG9uIFBvcnQgbm8sIGl0IHNsZWVwcyANCj4gK29uDQo+ICsgKiB3YWl0
cXVldWUgKi8NCj4gK3Vuc2lnbmVkIGludCB0ZG1fcG9ydF9wb2xsKHZvaWQgKmhfcG9ydCwgdW5z
aWduZWQgaW50IHdhaXRfdGltZSkgew0KPiArCXN0cnVjdCB0ZG1fcG9ydCAqcG9ydDsNCj4gKwl1
bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHdhaXRfdGltZSk7DQo+ICsJ
cG9ydCA9IChzdHJ1Y3QgdGRtX3BvcnQgKiloX3BvcnQ7DQo+ICsNCj4gKwlpZiAocG9ydCA9PSBO
VUxMKSB7IC8qIGludmFsaWQgaGFuZGxlKi8NCj4gKwkJcHJfZXJyKCIlczogSW52YWxpZCBIYW5k
bGVcbiIsIF9fZnVuY19fKTsNCj4gKwkJcmV0dXJuIC1FTlhJTzsNCj4gKwl9DQo+ICsJaWYgKCFw
b3J0LT5wX3BvcnRfZGF0YSB8fCAhcG9ydC0+aW5fdXNlKQ0KPiArCQlyZXR1cm4gLUVJTzsNCj4g
Kw0KPiArCWlmIChwb3J0LT5wX3BvcnRfZGF0YS0+cnhfb3V0X2RhdGEtPmZsYWcpIHsNCj4gKwkJ
cHJfZGVidWcoIkRhdGEgQXZhaWxhYmxlIik7DQo+ICsJCXJldHVybiBURE1fRV9PSzsNCj4gKwl9
DQo+ICsJaWYgKHRpbWVvdXQpIHsNCj4gKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVv
dXQocG9ydC0+Y2hfd2FpdF9xdWV1ZSwNCj4gKwkJCQkJICBwb3J0LT5wX3BvcnRfZGF0YS0+cnhf
b3V0X2RhdGEtPmZsYWcsDQo+ICsJCQkJCSAgdGltZW91dCk7DQo+ICsNCj4gKwkJaWYgKHBvcnQt
PnBfcG9ydF9kYXRhLT5yeF9vdXRfZGF0YS0+ZmxhZykgew0KPiArCQkJcHJfZGVidWcoIkRhdGEg
QXZhaWxhYmxlIik7DQo+ICsJCQlyZXR1cm4gVERNX0VfT0s7DQo+ICsJCX0NCj4gKwl9DQo+ICsJ
cmV0dXJuIC1FQUdBSU47DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9wb3J0X3BvbGwpOw0K
PiArDQo+ICt1bnNpZ25lZCBpbnQgdGRtX3BvcnRfZ2V0X3N0YXRzKHZvaWQgKmhfcG9ydCwgc3Ry
dWN0IHRkbV9wb3J0X3N0YXRzIA0KPiArKnBvcnRTdGF0KSB7DQo+ICsJc3RydWN0IHRkbV9wb3J0
ICpwb3J0Ow0KPiArCWludCBwb3J0X251bTsNCj4gKwlwb3J0ID0gKHN0cnVjdCB0ZG1fcG9ydCAq
KWhfcG9ydDsNCj4gKw0KPiArCWlmIChwb3J0ID09IE5VTEwgfHwgcG9ydFN0YXQgPT0gTlVMTCkg
eyAvKiBpbnZhbGlkIGhhbmRsZSovDQo+ICsJCXByX2VycigiSW52YWxpZCBIYW5kbGUiKTsNCj4g
KwkJcmV0dXJuIC1FTlhJTzsNCj4gKwl9DQo+ICsJcG9ydF9udW0gPSAgcG9ydC0+cG9ydF9pZDsN
Cj4gKw0KPiArCW1lbWNweShwb3J0U3RhdCwgJnBvcnQtPnBvcnRfc3RhdCwgc2l6ZW9mKHN0cnVj
dCB0ZG1fcG9ydF9zdGF0cykpOw0KPiArDQo+ICsJcHJfaW5mbygiVERNIFBvcnQgJWQgR2V0IFN0
YXRzIiwgcG9ydF9udW0pOw0KPiArDQo+ICsJcmV0dXJuIFRETV9FX09LOw0KPiArfQ0KPiArRVhQ
T1JUX1NZTUJPTCh0ZG1fcG9ydF9nZXRfc3RhdHMpOw0KPiArDQo+ICsvKiBEYXRhIGhhbmRsaW5n
IGZ1bmN0aW9ucyAqLw0KPiArDQo+ICtzdGF0aWMgaW50IHRkbV9kYXRhX3J4X2RlaW50ZXJsZWF2
ZShzdHJ1Y3QgdGRtX2FkYXB0ZXIgKmFkYXApIHsNCj4gKwlzdHJ1Y3QgdGRtX3BvcnQgKnBvcnQs
ICpuZXh0Ow0KPiArCXN0cnVjdCB0ZG1fY2hhbm5lbCAqY2hhbm5lbCwgKnRlbXA7DQo+ICsJc3Ry
dWN0IHRkbV9iZAkqY2hfYmQ7DQo+ICsNCj4gKwlpbnQgaSwgYnVmX3NpemUsIGNoX2RhdGFfbGVu
Ow0KPiArCXUxNiAqaW5wdXRfdGRtX2J1ZmZlcjsNCj4gKwl1MTYgKnBjbV9idWZmZXI7DQo+ICsJ
aW50IHNsb3Rfd2lkdGg7DQo+ICsJaW50IGZyYW1lX2NoX2RhdGFfc2l6ZTsNCj4gKwlib29sIGNo
X2RhdGE7DQo+ICsJaW50IGJ5dGVzX2luX2ZpZm9fcGVyX2ZyYW1lOw0KPiArCWludCBieXRlc19z
bG90X29mZnNldDsNCj4gKw0KPiArCWNoX2RhdGFfbGVuID0gTlVNX1NBTVBMRVNfUEVSX0ZSQU1F
Ow0KPiArCWZyYW1lX2NoX2RhdGFfc2l6ZSA9IE5VTV9TQU1QTEVTX1BFUl9GUkFNRTsNCj4gKwlj
aF9kYXRhID0gMDsNCj4gKw0KPiArCWlmICghYWRhcCkgeyAvKiBpbnZhbGlkIGhhbmRsZSovDQo+
ICsJCXByX2VycigiJXM6IEludmFsaWQgSGFuZGxlXG4iLCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVy
biAtRU5YSU87DQo+ICsJfQ0KPiArDQo+ICsJc2xvdF93aWR0aCA9IGFkYXAtPmFkYXB0X2NmZy5z
bG90X3dpZHRoOw0KPiArCWJ1Zl9zaXplID0gdGRtX2FkYXBfcmVjdihhZGFwLCAodm9pZCAqKikm
aW5wdXRfdGRtX2J1ZmZlcik7DQo+ICsJaWYgKGJ1Zl9zaXplIDw9IDAgfHwgIWlucHV0X3RkbV9i
dWZmZXIpDQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsJYnl0ZXNfaW5fZmlmb19wZXJf
ZnJhbWUgPSBidWZfc2l6ZS9mcmFtZV9jaF9kYXRhX3NpemU7DQo+ICsJYnl0ZXNfc2xvdF9vZmZz
ZXQgPSBieXRlc19pbl9maWZvX3Blcl9mcmFtZS9zbG90X3dpZHRoOw0KPiArDQo+ICsJLyogZGUt
aW50ZXJsZWF2aW5nIGZvciBhbGwgcG9ydHMqLw0KPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm
ZShwb3J0LCBuZXh0LCAmYWRhcC0+bXlwb3J0cywgbGlzdCkgew0KPiArDQo+ICsJCS8qIGlmIHRo
ZSBwb3J0IGlzIG5vdCBvcGVuICovDQo+ICsJCWlmICghcG9ydC0+aW5fdXNlKQ0KPiArCQkJY29u
dGludWU7DQo+ICsNCj4gKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW5uZWwsIHRlbXAs
ICZwb3J0LT5teWNoYW5uZWxzLA0KPiArCQkJCQkJCWxpc3QpIHsNCj4gKwkJLyogaWYgdGhlIGNo
YW5uZWwgaXMgbm90IG9wZW4gKi8NCj4gKwkJaWYgKCFjaGFubmVsLT5pbl91c2UgfHwgIWNoYW5u
ZWwtPnBfY2hfZGF0YSkNCj4gKwkJCWNvbnRpbnVlOw0KPiArCQljaF9iZCA9IGNoYW5uZWwtPnBf
Y2hfZGF0YS0+cnhfaW5fZGF0YTsNCj4gKwkJc3Bpbl9sb2NrKCZjaGFubmVsLT5wX2NoX2RhdGEt
PnJ4X2NoYW5uZWxfbG9jayk7DQo+ICsJCQkvKmlmIG9sZCBkYXRhIGlzIHRvIGJlIGRpc2NhcmRl
ZCAqLw0KPiArCQlpZiAodXNlX2xhdGVzdF90ZG1fZGF0YSkNCj4gKwkJCWlmIChjaF9iZC0+Zmxh
Zykgew0KPiArCQkJCWNoX2JkLT5mbGFnID0gMDsNCj4gKwkJCQljaF9iZC0+b2Zmc2V0ID0gMDsN
Cj4gKwkJCQlpZiAoY2hfYmQgPT0gY2hhbm5lbC0+cF9jaF9kYXRhLT5yeF9vdXRfZGF0YSkNCj4g
KwkJCQkJY2hhbm5lbC0+cF9jaF9kYXRhLT5yeF9vdXRfZGF0YSA9DQo+ICsJCQkJCQljaF9iZC0+
d3JhcCA/DQo+ICsJCQkJCQljaGFubmVsLT5wX2NoX2RhdGEtPnJ4X2RhdGFfZmlmbw0KPiArCQkJ
CQkJOiBjaF9iZCsxOw0KPiArCQkJCQlwb3J0LT5wb3J0X3N0YXQucnhfcGt0X2Ryb3BfY291bnQr
KzsNCj4gKwkJCQl9DQo+ICsJCQkvKiBpZiB0aGUgYmQgaXMgZW1wdHkgKi8NCj4gKwkJCWlmICgh
Y2hfYmQtPmZsYWcpIHsNCj4gKwkJCQlpZiAoY2hfYmQtPm9mZnNldCA9PSAwKQ0KPiArCQkJCQlj
aF9iZC0+bGVuZ3RoID0gcG9ydC0+cnhfbWF4X2ZyYW1lczsNCj4gKw0KPiArCQkJCXBjbV9idWZm
ZXIgPSBjaF9iZC0+cF9kYXRhICsgY2hfYmQtPm9mZnNldDsNCj4gKwkJCQkvKiBEZS1pbnRlcmxl
YXZpbmcgdGhlIGRhdGEgKi8NCj4gKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2hfZGF0YV9sZW47IGkr
Kykgew0KPiArCQkJCQlwY21fYnVmZmVyW2ldDQo+ICsJCQkJCT0gaW5wdXRfdGRtX2J1ZmZlcltp
KmJ5dGVzX3Nsb3Rfb2Zmc2V0ICsNCj4gKwkJCQkJCWNoYW5uZWwtPmNoX2lkXTsNCj4gKwkJCQl9
DQo+ICsJCQkJY2hfYmQtPm9mZnNldCArPSBjaF9kYXRhX2xlbiAqIHNsb3Rfd2lkdGg7DQo+ICsN
Cj4gKwkJCQlpZiAoY2hfYmQtPm9mZnNldCA+PQ0KPiArCQkJCQkoY2hfYmQtPmxlbmd0aCAtIGZy
YW1lX2NoX2RhdGFfc2l6ZSkqDQo+ICsJCQkJCQkoYWRhcC0+YWRhcHRfY2ZnLnNsb3Rfd2lkdGgp
KSB7DQo+ICsJCQkJCWNoX2JkLT5mbGFnID0gMTsNCj4gKwkJCQkJY2hfYmQtPm9mZnNldCA9IDA7
DQo+ICsJCQkJCWNoYW5uZWwtPnBfY2hfZGF0YS0+cnhfaW5fZGF0YSA9DQo+ICsJCQkJCQljaF9i
ZC0+d3JhcCA/DQo+ICsJCQkJCQljaGFubmVsLT5wX2NoX2RhdGEtPnJ4X2RhdGFfZmlmbw0KPiAr
CQkJCQkJOiBjaF9iZCsxOw0KPiArCQkJCQljaF9kYXRhID0gMTsNCj4gKwkJCQl9DQo+ICsJCQl9
IGVsc2Ugew0KPiArCQkJCXBvcnQtPnBvcnRfc3RhdC5yeF9wa3RfZHJvcF9jb3VudCsrOw0KPiAr
CQkJfQ0KPiArCQlzcGluX3VubG9jaygmY2hhbm5lbC0+cF9jaF9kYXRhLT5yeF9jaGFubmVsX2xv
Y2spOw0KPiArCQl9DQo+ICsNCj4gKwkJaWYgKGNoX2RhdGEpIHsNCj4gKwkJCS8qCVdha2UgdXAg
dGhlIFBvcnQgRGF0YSBQb2xsIGV2ZW50ICovDQo+ICsJCQl3YWtlX3VwX2ludGVycnVwdGlibGUo
JnBvcnQtPmNoX3dhaXRfcXVldWUpOw0KPiArI2lmZGVmCVRETV9DT1JFX0RFQlVHDQo+ICsJCQlw
cl9pbmZvKCJQb3J0IFJYLSVkLSVkXG4iLCBjaGFubmVsLT5jaF9pZCwgY2hfZGF0YV9sZW4pOw0K
PiArCQkJZm9yIChpID0gMDsgaSA8IGNoX2RhdGFfbGVuOyBpKyspDQo+ICsJCQkJcHJfaW5mbygi
JXgiLCBwY21fYnVmZmVyW2ldKTsNCj4gKwkJCXByX2luZm8oIlxuIik7DQo+ICsjZW5kaWYNCj4g
KwkJCXBvcnQtPnBvcnRfc3RhdC5yeF9wa3RfY291bnQrKzsNCj4gKwkJCWNoX2RhdGEgPSAwOw0K
PiArCQl9DQo+ICsJfQ0KPiArCXJldHVybiBURE1fRV9PSzsNCj4gK30NCj4gKw0KPiArc3RhdGlj
IGludCB0ZG1fZGF0YV90eF9pbnRlcmxlYXZlKHN0cnVjdCB0ZG1fYWRhcHRlciAqYWRhcCkgew0K
PiArCXN0cnVjdCB0ZG1fcG9ydCAqcG9ydCwgKm5leHQ7DQo+ICsJc3RydWN0IHRkbV9jaGFubmVs
ICpjaGFubmVsLCAqdGVtcDsNCj4gKwlzdHJ1Y3QgdGRtX2JkCSpjaF9iZDsNCj4gKwlpbnQgaSwg
YnVmX3NpemUsIGNoX2RhdGFfbGVuID0gTlVNX1NBTVBMRVNfUEVSX0ZSQU1FOw0KPiArCWJvb2wg
bGFzdF9kYXRhID0gMDsNCj4gKwl1MTYgKm91dHB1dF90ZG1fYnVmZmVyOw0KPiArCXUxNiAqcGNt
X2J1ZmZlcjsNCj4gKwlpbnQgZnJhbWVfY2hfZGF0YV9zaXplID0gTlVNX1NBTVBMRVNfUEVSX0ZS
QU1FOw0KPiArCWludCBieXRlc19pbl9maWZvX3Blcl9mcmFtZTsNCj4gKwlpbnQgYnl0ZXNfc2xv
dF9vZmZzZXQ7DQo+ICsNCj4gKyNpZmRlZiBURE1fQ09SRV9ERUJVRw0KPiArCXU4CWRhdGFfZmxh
ZyA9IDA7DQo+ICsjZW5kaWYNCj4gKw0KPiArCWlmIChhZGFwID09IE5VTEwpIHsgLyogaW52YWxp
ZCBoYW5kbGUqLw0KPiArCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEhhbmRsZVxuIiwgX19mdW5jX18p
Ow0KPiArCQlyZXR1cm4gLUVOWElPOw0KPiArCX0NCj4gKw0KPiArCWJ1Zl9zaXplID0gdGRtX2Fk
YXBfZ2V0X3dyaXRlX2J1ZihhZGFwLCAodm9pZCAqKikmb3V0cHV0X3RkbV9idWZmZXIpOw0KPiAr
CWlmIChidWZfc2l6ZSA8PSAwIHx8ICFvdXRwdXRfdGRtX2J1ZmZlcikNCj4gKwkJcmV0dXJuIC1F
SU5WQUw7DQo+ICsNCj4gKwlieXRlc19pbl9maWZvX3Blcl9mcmFtZSA9IGJ1Zl9zaXplL2ZyYW1l
X2NoX2RhdGFfc2l6ZTsNCj4gKwlieXRlc19zbG90X29mZnNldCA9IA0KPiArYnl0ZXNfaW5fZmlm
b19wZXJfZnJhbWUvYWRhcC0+YWRhcHRfY2ZnLnNsb3Rfd2lkdGg7DQo+ICsNCj4gKw0KPiArCW1l
bXNldChvdXRwdXRfdGRtX2J1ZmZlciwgMCwgc2l6ZW9mKGJ1Zl9zaXplKSk7DQo+ICsNCj4gKwls
aXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgbmV4dCwgJmFkYXAtPm15cG9ydHMsIGxpc3Qp
IHsNCj4gKw0KPiArCQkvKiBjaGVjayBpZiB0aGUgcG9ydCBpcyBvcGVuICovDQo+ICsJCWlmICgh
cG9ydC0+aW5fdXNlKQ0KPiArCQkJY29udGludWU7DQo+ICsNCj4gKwkJbGlzdF9mb3JfZWFjaF9l
bnRyeV9zYWZlKGNoYW5uZWwsIHRlbXAsICZwb3J0LT5teWNoYW5uZWxzLA0KPiArCQkJCQkJCQls
aXN0KSB7DQo+ICsJCXByX2RlYnVnKCJUWC1UZG0gJWQgKHNsb3RzLSkiLCBjaGFubmVsLT5jaF9p
ZCk7DQo+ICsNCj4gKw0KPiArCQkvKiBpZiB0aGUgY2hhbm5lbCBpcyBvcGVuICovDQo+ICsJCWlm
ICghY2hhbm5lbC0+aW5fdXNlIHx8ICFjaGFubmVsLT5wX2NoX2RhdGEpDQo+ICsJCQljb250aW51
ZTsNCj4gKw0KPiArCQlzcGluX2xvY2soJmNoYW5uZWwtPnBfY2hfZGF0YS0+dHhfY2hhbm5lbF9s
b2NrKTsNCj4gKwkJaWYgKCFjaGFubmVsLT5pbl91c2UgfHwgIWNoYW5uZWwtPnBfY2hfZGF0YSkN
Cj4gKwkJCWNvbnRpbnVlOw0KPiArCQkJY2hfYmQgPSBjaGFubmVsLT5wX2NoX2RhdGEtPnR4X291
dF9kYXRhOw0KPiArCQkJaWYgKGNoX2JkLT5mbGFnKSB7DQo+ICsJCQkJcGNtX2J1ZmZlciA9ICh1
MTYgKikoKHVpbnQ4X3QgKiljaF9iZC0+cF9kYXRhICsNCj4gKwkJCQkJCWNoX2JkLT5vZmZzZXQp
Ow0KPiArCQkJCS8qaWYgdGhlIGJ1ZmZlciBoYXMgbGVzcyBmcmFtZXMgdGhhbiByZXF1aXJlZCAq
Lw0KPiArCQkJCWlmIChmcmFtZV9jaF9kYXRhX3NpemUgPj0NCj4gKwkJCQkJKChjaF9iZC0+bGVu
Z3RoKSAtIChjaF9iZC0+b2Zmc2V0Lw0KPiArCQkJCQkJYWRhcC0+YWRhcHRfY2ZnLnNsb3Rfd2lk
dGgpKSkgew0KPiArCQkJCQljaF9kYXRhX2xlbiA9DQo+ICsJCQkJCShjaF9iZC0+bGVuZ3RoKSAt
IChjaF9iZC0+b2Zmc2V0Lw0KPiArCQkJCQkJYWRhcC0+YWRhcHRfY2ZnLnNsb3Rfd2lkdGgpOw0K
PiArCQkJCQlsYXN0X2RhdGEgPSAxOw0KPiArCQkJCX0gZWxzZSB7DQo+ICsJCQkJCWNoX2RhdGFf
bGVuID0gZnJhbWVfY2hfZGF0YV9zaXplOw0KPiArCQkJCX0NCj4gKwkJCQkvKiBJbnRlcmxlYXZp
bmcgdGhlIGRhdGEgKi8NCj4gKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2hfZGF0YV9sZW47IGkrKykg
ew0KPiArCQkJCQkvKiBUT0RPLSBuZWVkIHRvIGJlIGdlbmVyaWMgZm9yIGFueSBzaXplDQo+ICsJ
CQkJCSAgIGFzc2lnbm1lbnQqLw0KPiArCQkJCQlvdXRwdXRfdGRtX2J1ZmZlcltjaGFubmVsLT5j
aF9pZCArDQo+ICsJCQkJCQlieXRlc19zbG90X29mZnNldCAqIGldID0NCj4gKwkJCQkJCQkJcGNt
X2J1ZmZlcltpXTsNCj4gKwkJCQl9DQo+ICsJCQkJLyogSWYgYWxsIHRoZSBkYXRhIG9mIHRoaXMg
YnVmZmVyIGlzDQo+ICsJCQkJCQkJdHJhbnNtaXR0ZWQgKi8NCj4gKwkJCQlpZiAobGFzdF9kYXRh
KSB7DQo+ICsJCQkJCWNoX2JkLT5mbGFnID0gMDsNCj4gKwkJCQkJY2hfYmQtPm9mZnNldCA9IDA7
DQo+ICsJCQkJCWNoYW5uZWwtPnBfY2hfZGF0YS0+dHhfb3V0X2RhdGEgPQ0KPiArCQkJCQkJY2hf
YmQtPndyYXAgPw0KPiArCQkJCQkJY2hhbm5lbC0+cF9jaF9kYXRhLT50eF9kYXRhX2ZpZm8NCj4g
KwkJCQkJCTogY2hfYmQrMTsNCj4gKwkJCQkJcG9ydC0+cG9ydF9zdGF0LnR4X3BrdF9jb25mX2Nv
dW50Kys7DQo+ICsJCQkJfSBlbHNlIHsNCj4gKwkJCQkJY2hfYmQtPm9mZnNldCArPSBjaF9kYXRh
X2xlbiAqDQo+ICsJCQkJCQkoYWRhcC0+YWRhcHRfY2ZnLnNsb3Rfd2lkdGgpOw0KPiArCQkJCX0N
Cj4gKyNpZmRlZglURE1fQ09SRV9ERUJVRw0KPiArCQkJCWRhdGFfZmxhZyA9IDE7DQo+ICsjZW5k
aWYNCj4gKwkJCX0NCj4gKwkJc3Bpbl91bmxvY2soJmNoYW5uZWwtPnBfY2hfZGF0YS0+dHhfY2hh
bm5lbF9sb2NrKTsNCj4gKwkJfQ0KPiArCX0NCj4gKw0KPiArI2lmZGVmCVRETV9DT1JFX0RFQlVH
DQo+ICsJaWYgKGRhdGFfZmxhZykgew0KPiArCQlwcl9pbmZvKCJUWC1URE0gSW50ZXJsZWF2ZWQg
RGF0YS1cbiIpOw0KPiArCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykNCj4gKwkJCXByX2luZm8o
IiV4Iiwgb3V0cHV0X3RkbV9idWZmZXJbaV0pOw0KPiArCQlwcl9pbmZvKCJcbiIpOw0KPiArCSAg
fQ0KPiArI2VuZGlmDQo+ICsJcmV0dXJuIFRETV9FX09LOw0KPiArfQ0KPiArDQo+ICsvKiBDaGFu
bmVsIExldmVsIEFQSXMgb2YgVERNIEZyYW1ld29yayAqLyBpbnQgdGRtX2NoYW5uZWxfb3Blbih1
MTYgDQo+ICtjaGFuaWQsIHUxNiBjaF93aWR0aCwgc3RydWN0IHRkbV9wb3J0ICpwb3J0LA0KPiAr
CQkJCXZvaWQgKipoX2NoYW5uZWwpDQo+ICt7DQo+ICsJc3RydWN0IHRkbV9jaGFubmVsICpjaGFu
bmVsLCAqdGVtcDsNCj4gKwl1bnNpZ25lZCBsb25nCQlmbGFnczsNCj4gKwlzdHJ1Y3QgdGRtX2No
X2RhdGEJKnBfY2hfZGF0YTsNCj4gKwlpbnQgcmVzID0gVERNX0VfT0s7DQo+ICsNCj4gKwlpZiAo
IShwb3J0ICYmIGhfY2hhbm5lbCkpIHsNCj4gKwkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGVc
biIsIF9fZnVuY19fKTsNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJfQ0KPiArDQo+ICsJaWYg
KGNoX3dpZHRoICE9IDEpIHsNCj4gKwkJcHJfZXJyKCIlczogTW9kZSBub3Qgc3VwcG9ydGVkXG4i
LCBfX2Z1bmNfXyk7DQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArCX0NCj4gKw0KPiArCWxpc3Rf
Zm9yX2VhY2hfZW50cnlfc2FmZShjaGFubmVsLCB0ZW1wLCAmcG9ydC0+bXljaGFubmVscywgbGlz
dCkgew0KPiArCQlpZiAoY2hhbm5lbC0+Y2hfaWQgPT0gY2hhbmlkKSB7DQo+ICsJCQlwcl9lcnIo
IiVzOiBDaGFubmVsICVkIGFscmVhZHkgb3BlblxuIiwNCj4gKwkJCQkJCV9fZnVuY19fLCBjaGFu
aWQpOw0KPiArCQkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwljaGFu
bmVsID0ga3phbGxvYyhzaXplb2YoKmNoYW5uZWwpLCBHRlBfS0VSTkVMKTsNCj4gKwlpZiAoIWNo
YW5uZWwpIHsNCj4gKwkJcmVzID0gLUVOT01FTTsNCj4gKwkJZ290byBvdXQ7DQo+ICsJfQ0KPiAr
DQo+ICsJcF9jaF9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRkbV9wb3J0X2RhdGEpLCBH
RlBfS0VSTkVMKTsNCj4gKwlpZiAoIXBfY2hfZGF0YSkgew0KPiArCQlyZXMgPSAtRU5PTUVNOw0K
PiArCQlnb3RvIG91dGRhdGE7DQo+ICsJfQ0KPiArDQo+ICsJcF9jaF9kYXRhLT5yeF9kYXRhX2Zp
Zm9bVERNX0NIX1JYX0JEX1JJTkdfU0laRS0xXS53cmFwID0gMTsNCj4gKwlwX2NoX2RhdGEtPnR4
X2RhdGFfZmlmb1tURE1fQ0hfVFhfQkRfUklOR19TSVpFLTFdLndyYXAgPSAxOw0KPiArDQo+ICsJ
cF9jaF9kYXRhLT5yeF9pbl9kYXRhID0gcF9jaF9kYXRhLT5yeF9kYXRhX2ZpZm87DQo+ICsJcF9j
aF9kYXRhLT5yeF9vdXRfZGF0YSA9IHBfY2hfZGF0YS0+cnhfZGF0YV9maWZvOw0KPiArCXBfY2hf
ZGF0YS0+dHhfaW5fZGF0YSA9IHBfY2hfZGF0YS0+dHhfZGF0YV9maWZvOw0KPiArCXBfY2hfZGF0
YS0+dHhfb3V0X2RhdGEgPSBwX2NoX2RhdGEtPnR4X2RhdGFfZmlmbzsNCj4gKwlzcGluX2xvY2tf
aW5pdCgmcF9jaF9kYXRhLT5yeF9jaGFubmVsX2xvY2spOw0KPiArCXNwaW5fbG9ja19pbml0KCZw
X2NoX2RhdGEtPnR4X2NoYW5uZWxfbG9jayk7DQo+ICsNCj4gKwljaGFubmVsLT5wX2NoX2RhdGEg
PSBwX2NoX2RhdGE7DQo+ICsNCj4gKwljaGFubmVsLT5jaF9pZCA9IGNoYW5pZDsNCj4gKwljaGFu
bmVsLT5jaF9jZmcuZmlyc3Rfc2xvdCA9IGNoYW5pZDsNCj4gKwljaGFubmVsLT5jaF9jZmcubnVt
X3Nsb3RzID0gMTsJLyogVGhpcyBpcyAxIGZvciBjaGFubmVsaXplZCBtb2RlIGFuZA0KPiArCQkJ
CQkJY29uZmlndXJhYmxlIGZvciBvdGhlciBtb2RlcyAqLw0KPiArCWNoYW5uZWwtPnBvcnQgPSBw
b3J0Ow0KPiArCWNoYW5uZWwtPmluX3VzZSA9IDE7DQo+ICsNCj4gKwlzcGluX2xvY2tfaXJxc2F2
ZSgmcG9ydC0+Y2hfbGlzdF9sb2NrLCBmbGFncyk7DQo+ICsJbGlzdF9hZGRfdGFpbCgmY2hhbm5l
bC0+bGlzdCwgJnBvcnQtPm15Y2hhbm5lbHMpOw0KPiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo
JnBvcnQtPmNoX2xpc3RfbG9jaywgZmxhZ3MpOw0KPiArDQo+ICsJKmhfY2hhbm5lbCA9IGNoYW5u
ZWw7DQo+ICsNCj4gKwlyZXR1cm4gcmVzOw0KPiArDQo+ICtvdXRkYXRhOg0KPiArCWtmcmVlKGNo
YW5uZWwpOw0KPiArb3V0Og0KPiArCXJldHVybiByZXM7DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9M
KHRkbV9jaGFubmVsX29wZW4pOw0KPiArDQo+ICtpbnQgdGRtX2NoYW5uZWxfY2xvc2UodTE2IGNo
YW5pZCwgdTE2IGNoX3dpZHRoLCBzdHJ1Y3QgdGRtX3BvcnQgKnBvcnQsDQo+ICsJCQkJc3RydWN0
IHRkbV9jaGFubmVsICpoX2NoYW5uZWwpDQo+ICt7DQo+ICsJc3RydWN0IHRkbV9jaGFubmVsICpj
aGFubmVsOw0KPiArCXVuc2lnbmVkIGxvbmcJCWZsYWdzOw0KPiArCWludCByZXMgPSBURE1fRV9P
SzsNCj4gKwljaGFubmVsID0gaF9jaGFubmVsOw0KPiArDQo+ICsJaWYgKCEocG9ydCAmJiBjaGFu
bmVsKSkgew0KPiArCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOw0K
PiArCQlyZXMgPSAtRUlOVkFMOw0KPiArCQlnb3RvIG91dDsNCj4gKwl9DQo+ICsNCj4gKwlpZiAo
Y2hfd2lkdGggIT0gMSkgew0KPiArCQlwcl9lcnIoIiVzOiBNb2RlIG5vdCBzdXBwb3J0ZWRcbiIs
IF9fZnVuY19fKTsNCj4gKwkJcmVzID0gLUVJTlZBTDsNCj4gKwkJZ290byBvdXQ7DQo+ICsJfQ0K
PiArDQo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmNoX2xpc3RfbG9jaywgZmxhZ3MpOw0K
PiArCWxpc3RfZGVsKCZjaGFubmVsLT5saXN0KTsNCj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl
KCZwb3J0LT5jaF9saXN0X2xvY2ssIGZsYWdzKTsNCj4gKw0KPiArb3V0Og0KPiArCWlmIChjaGFu
bmVsKQ0KPiArCQlrZnJlZShjaGFubmVsLT5wX2NoX2RhdGEpOw0KPiArCWtmcmVlKGNoYW5uZWwp
Ow0KPiArCXJldHVybiByZXM7DQo+ICt9DQo+ICtFWFBPUlRfU1lNQk9MKHRkbV9jaGFubmVsX2Ns
b3NlKTsNCj4gKw0KPiArdm9pZCBpbml0X2NvbmZpZ19hZGFwdGVyKHN0cnVjdCB0ZG1fYWRhcHRl
ciAqYWRhcCkgew0KPiArCXN0cnVjdCBmc2xfdGRtX2FkYXB0X2NmZyBkZWZhdWx0X2FkYXB0X2Nm
ZyA9IHsNCj4gKwkJLmxvb3BiYWNrID0gZV9URE1fUFJPQ0VTU19OT1JNQUwsDQo+ICsJCS5udW1f
Y2ggPSBOVU1fQ0hBTk5FTFMsDQo+ICsJCS5jaF9zaXplX3R5cGUgPSBDSEFOTkVMXzE2QklUX0xJ
TiwNCj4gKwkJLmZyYW1lX2xlbiA9IE5VTV9TQU1QTEVTX1BFUl9GUkFNRSwNCj4gKwkJLm51bV9m
cmFtZXMgPSBOVU1fU0FNUExFU19QRVJfRlJBTUUsDQo+ICsJCS5hZGFwX21vZGUgPSBlX1RETV9B
REFQVEVSX01PREVfTk9ORQ0KPiArCQkJIH07DQo+ICsNCj4gKwlkZWZhdWx0X2FkYXB0X2NmZy5z
bG90X3dpZHRoID0gZGVmYXVsdF9hZGFwdF9jZmcuY2hfc2l6ZV90eXBlLzMgKyAxOw0KPiArDQo+
ICsJbWVtY3B5KCZhZGFwLT5hZGFwdF9jZmcsICZkZWZhdWx0X2FkYXB0X2NmZywNCj4gKwkJc2l6
ZW9mKHN0cnVjdCBmc2xfdGRtX2FkYXB0X2NmZykpOw0KPiArDQo+ICsJcmV0dXJuOw0KPiArfQ0K
PiArRVhQT1JUX1NZTUJPTChpbml0X2NvbmZpZ19hZGFwdGVyKTsNCj4gKw0KPiArc3RhdGljIHZv
aWQgdGRtX2RhdGFfdGFza2xldF9mbih1bnNpZ25lZCBsb25nIGRhdGEpIHsNCj4gKwlzdHJ1Y3Qg
dGRtX2FkYXB0ZXIgKmFkYXB0ZXI7DQo+ICsJYWRhcHRlciA9IChzdHJ1Y3QgdGRtX2FkYXB0ZXIg
KilkYXRhOw0KPiArCWlmIChhZGFwdGVyICE9IE5VTEwpIHsNCj4gKwkJdGRtX2RhdGFfdHhfaW50
ZXJsZWF2ZShhZGFwdGVyKTsNCj4gKwkJdGRtX2RhdGFfcnhfZGVpbnRlcmxlYXZlKGFkYXB0ZXIp
Ow0KPiArCX0NCj4gK30NCj4gKw0KPiArDQo+ICtNT0RVTEVfQVVUSE9SKCJIZW1hbnQgQWdyYXdh
bCA8aGVtYW50QGZyZWVzY2FsZS5jb20+IGFuZCAiDQo+ICsJIlJhamVzaCBHdW1hc3RhIDxyYWpl
c2guZ3VtYXN0YUBmcmVlc2NhbGUuY29tPiIpOyANCj4gK01PRFVMRV9ERVNDUklQVElPTigiVERN
IERyaXZlciBGcmFtZXdvcmsgQ29yZSIpOyANCj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCj4g
ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggDQo+IGIvaW5jbHVk
ZS9saW51eC9tb2RfZGV2aWNldGFibGUuaCBpbmRleCBhZTI4ZTkzLi5kYzFhNjU1IDEwMDY0NA0K
PiAtLS0gYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oDQo+ICsrKyBiL2luY2x1ZGUv
bGludXgvbW9kX2RldmljZXRhYmxlLmgNCj4gQEAgLTQxNiw2ICs0MTYsMTcgQEAgc3RydWN0IGky
Y19kZXZpY2VfaWQgew0KPiAgCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2Yoa2VybmVs
X3Vsb25nX3QpKSkpOw0KPiAgfTsNCj4gIA0KPiArLyogdGRtICovDQo+ICsNCj4gKyNkZWZpbmUg
VERNX05BTUVfU0laRSAgIDIwDQo+ICsjZGVmaW5lIFRETV9NT0RVTEVfUFJFRklYICJ0ZG06Ig0K
PiArDQo+ICtzdHJ1Y3QgdGRtX2RldmljZV9pZCB7DQo+ICsJY2hhciBuYW1lW1RETV9OQU1FX1NJ
WkVdOw0KPiArCWtlcm5lbF91bG9uZ190IGRyaXZlcl9kYXRhICAgICAgLyogRGF0YSBwcml2YXRl
IHRvIHRoZSBkcml2ZXIgKi8NCj4gKwkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGtl
cm5lbF91bG9uZ190KSkpKTsNCj4gK307DQo+ICsNCj4gIC8qIHNwaSAqLw0KPiAgDQo+ICAjZGVm
aW5lIFNQSV9OQU1FX1NJWkUJMzINCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGRtLmgg
Yi9pbmNsdWRlL2xpbnV4L3RkbS5oIG5ldyBmaWxlIG1vZGUgDQo+IDEwMDY0NCBpbmRleCAwMDAw
MDAwLi44Y2Y0ZWY1DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvaW5jbHVkZS9saW51eC90ZG0u
aA0KPiBAQCAtMCwwICsxLDM0NyBAQA0KPiArLyogaW5jbHVkZS9saW51eC90ZG0uaA0KPiArICoN
Cj4gKyAqIENvcHlyaWdodCAoQykgMjAxMiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLCBB
bGwgcmlnaHRzIHJlc2VydmVkLg0KPiArICoNCj4gKyAqIHRkbS5oIC0gZGVmaW5pdGlvbnMgZm9y
IHRoZSB0ZG0tZGV2aWNlIGZyYW1ld29yayBpbnRlcmZhY2UNCj4gKyAqDQo+ICsgKiBBdXRob3I6
SGVtYW50IEFncmF3YWwgPGhlbWFudEBmcmVlc2NhbGUuY29tPg0KPiArICoJUmFqZXNoIEd1bWFz
dGEgPHJhamVzaC5ndW1hc3RhQGZyZWVzY2FsZS5jb20+DQo+ICsgKg0KPiArICogVGhpcyBwcm9n
cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgDQo+
ICttb2RpZnkgaXQNCj4gKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAg
UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIA0KPiArYnkgdGhlDQo+ICsgKiBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgDQo+
ICsoYXQgeW91cg0KPiArICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCj4gKyAqDQo+ICsg
KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwgDQo+ICtidXQNCj4gKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQo+ICsgKiBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQo+ICsgKg0KPiArICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IA0KPiArYWxvbmcNCj4gKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCANCj4gK0luYy4sDQo+ICsgKiA2NzUgTWFzcyBB
dmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4NCj4gKyAqLw0KPiArDQo+ICsNCj4gKyNpZm5k
ZWYgX0xJTlVYX1RETV9IDQo+ICsjZGVmaW5lIF9MSU5VWF9URE1fSA0KPiArDQo+ICsjaWZkZWYg
X19LRVJORUxfXw0KPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQo+ICsjaW5jbHVkZSA8bGlu
dXgvbW9kdWxlLmg+DQo+ICsjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+DQo+ICsj
aW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIGZvciBzdHJ1Y3QgZGV2aWNlICovDQo+ICsjaW5j
bHVkZSA8bGludXgvc2NoZWQuaD4JLyogZm9yIGNvbXBsZXRpb24gKi8NCj4gKyNpbmNsdWRlIDxs
aW51eC9tdXRleC5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KPiArDQo+ICsj
ZGVmaW5lIENIQU5ORUxfOEJJVF9MSU4JMAkvKiA4IGJpdCBsaW5lYXIgKi8NCj4gKyNkZWZpbmUg
Q0hBTk5FTF84QklUX1VMQVcJMQkvKiA4IGJpdCBNdS1sYXcgKi8NCj4gKyNkZWZpbmUgQ0hBTk5F
TF84QklUX0FMQVcJMgkvKiA4IGJpdCBBLWxhdyAqLw0KPiArI2RlZmluZSBDSEFOTkVMXzE2QklU
X0xJTgkzCS8qIDE2IGJpdCBMaW5lYXIgKi8NCj4gKw0KPiArI2RlZmluZSBOVU1fQ0hBTk5FTFMJ
CTE2DQo+ICsjZGVmaW5lIE5VTV9TQU1QTEVTX1BFUl9NUwk4CQkvKiA4IHNhbXBsZXMgcGVyIG1p
bGxpIHNlYyBwZXINCj4gKwkJCQkJCSBjaGFubmVsLiBSZXEgZm9yIHZvaWNlIGRhdGEgKi8NCj4g
KyNkZWZpbmUgTlVNX01TCQkJMTANCj4gKyNkZWZpbmUgTlVNX1NBTVBMRVNfUEVSX0ZSQU1FCShO
VU1fTVMgKiBOVU1fU0FNUExFU19QRVJfTVMpIC8qIE51bWJlciBvZg0KPiArCQkJCQkJc2FtcGxl
cyBmb3IgMSBjbGllbnQgYnVmZmVyICovDQo+ICsjZGVmaW5lIE5VTV9PRl9URE1fQlVGCQkzDQo+
ICsNCj4gKy8qIEdlbmVyYWwgb3B0aW9ucyAqLw0KPiArDQo+ICtzdHJ1Y3QgdGRtX2FkYXB0X2Fs
Z29yaXRobTsNCj4gK3N0cnVjdCB0ZG1fYWRhcHRlcjsNCj4gK3N0cnVjdCB0ZG1fcG9ydDsNCj4g
K3N0cnVjdCB0ZG1fZHJpdmVyOw0KPiArDQo+ICsvKiBBbGlnbiBhZGRyIG9uIGEgc2l6ZSBib3Vu
ZGFyeSAtIGFkanVzdCBhZGRyZXNzIHVwIGlmIG5lZWRlZCAqLw0KPiArLyogcmV0dXJucyBtaW4g
dmFsdWUgZ3JlYXRlciB0aGFuIHNpemUgd2hpY2ggaXMgbXVsdGlwbGUgb2YgYWxpZ25tZW50IA0K
PiArKi8gc3RhdGljIGlubGluZSBpbnQgQUxJR05fU0laRSh1NjQgc2l6ZSwgdTMyIGFsaWdubWVu
dCkgew0KPiArCXJldHVybiAoc2l6ZSArIGFsaWdubWVudCAtIDEpICYgKH4oYWxpZ25tZW50IC0g
MSkpOyB9DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0IHRkbV9kcml2ZXIgLSByZXByZXNlbnQg
YW4gVERNIGRldmljZSBkcml2ZXINCj4gKyAqIEBjbGFzczogV2hhdCBraW5kIG9mIHRkbSBkZXZp
Y2Ugd2UgaW5zdGFudGlhdGUgKGZvciBkZXRlY3QpDQo+ICsgKiBAaWQ6RHJpdmVyIGlkDQo+ICsg
KiBAbmFtZTogTmFtZSBvZiB0aGUgZHJpdmVyDQo+ICsgKiBAYXR0YWNoX2FkYXB0ZXI6IENhbGxi
YWNrIGZvciBkZXZpY2UgYWRkaXRpb24gKGZvciBsZWdhY3kgZHJpdmVycykNCj4gKyAqIEBkZXRh
Y2hfYWRhcHRlcjogQ2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmFsIChmb3IgbGVnYWN5IGRyaXZl
cnMpDQo+ICsgKiBAcHJvYmU6IENhbGxiYWNrIGZvciBkZXZpY2UgYmluZGluZw0KPiArICogQHJl
bW92ZTogQ2FsbGJhY2sgZm9yIGRldmljZSB1bmJpbmRpbmcNCj4gKyAqIEBzaHV0ZG93bjogQ2Fs
bGJhY2sgZm9yIGRldmljZSBzaHV0ZG93bg0KPiArICogQHN1c3BlbmQ6IENhbGxiYWNrIGZvciBk
ZXZpY2Ugc3VzcGVuZA0KPiArICogQHJlc3VtZTogQ2FsbGJhY2sgZm9yIGRldmljZSByZXN1bWUN
Cj4gKyAqIEBjb21tYW5kOiBDYWxsYmFjayBmb3Igc2VuZGluZyBjb21tYW5kcyB0byBkZXZpY2UN
Cj4gKyAqIEBpZF90YWJsZTogTGlzdCBvZiBURE0gZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBk
cml2ZXINCj4gKyAqIEBsaXN0OiBMaXN0IG9mIGRyaXZlcnMgY3JlYXRlZCAoZm9yIHRkbS1jb3Jl
IHVzZSBvbmx5KSAgKi8gc3RydWN0IA0KPiArdGRtX2RyaXZlciB7DQo+ICsJdW5zaWduZWQgaW50
IGNsYXNzOw0KPiArCXVuc2lnbmVkIGludCBpZDsNCj4gKwljaGFyIG5hbWVbVERNX05BTUVfU0la
RV07DQo+ICsNCj4gKwlpbnQgKCphdHRhY2hfYWRhcHRlcikoc3RydWN0IHRkbV9hZGFwdGVyICop
Ow0KPiArCWludCAoKmRldGFjaF9hZGFwdGVyKShzdHJ1Y3QgdGRtX2FkYXB0ZXIgKik7DQo+ICsN
Cj4gKwkvKiBTdGFuZGFyZCBkcml2ZXIgbW9kZWwgaW50ZXJmYWNlcyAqLw0KPiArCWludCAoKnBy
b2JlKShjb25zdCBzdHJ1Y3QgdGRtX2RldmljZV9pZCAqKTsNCj4gKwlpbnQgKCpyZW1vdmUpKHZv
aWQpOw0KPiArDQo+ICsJLyogZHJpdmVyIG1vZGVsIGludGVyZmFjZXMgdGhhdCBkb24ndCByZWxh
dGUgdG8gZW51bWVyYXRpb24gKi8NCj4gKwl2b2lkICgqc2h1dGRvd24pKHZvaWQpOw0KPiArCWlu
dCAoKnN1c3BlbmQpKHBtX21lc3NhZ2VfdCBtZXNnKTsNCj4gKwlpbnQgKCpyZXN1bWUpKHZvaWQp
Ow0KPiArDQo+ICsJLyogYSBpb2N0bCBsaWtlIGNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBw
ZXJmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucw0KPiArCSAqIHdpdGggdGhlIGRldmljZS4NCj4gKwkg
Ki8NCj4gKwlpbnQgKCpjb21tYW5kKSh1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOw0KPiAr
DQo+ICsJY29uc3Qgc3RydWN0IHRkbV9kZXZpY2VfaWQgKmlkX3RhYmxlOw0KPiArDQo+ICsJLyog
VGhlIGFzc29jaWF0ZWQgYWRhcHRlciBmb3IgdGhpcyBkcml2ZXIgKi8NCj4gKwlzdHJ1Y3QgdGRt
X2FkYXB0ZXIgKmFkYXB0ZXI7DQo+ICsJc3RydWN0IGxpc3RfaGVhZCBsaXN0Ow0KPiArfTsNCj4g
Kw0KPiArLyogdGRtIHBlciBwb3J0IHN0YXRpc3RpY3Mgc3RydWN0dXJlLCB1c2VkIGZvciBwcm92
aWRpbmcgYW5kIHN0b3JpbmcgDQo+ICt0ZG0gcG9ydA0KPiArICogc3RhdGlzdGljcy4NCj4gKyAq
Lw0KPiArc3RydWN0IHRkbV9wb3J0X3N0YXRzIHsNCj4gKwl1bnNpZ25lZCBpbnQgcnhfcGt0X2Nv
dW50OwkvKiBSeCBmcmFtZSBjb3VudCBwZXIgY2hhbm5lbCAqLw0KPiArCXVuc2lnbmVkIGludCBy
eF9wa3RfZHJvcF9jb3VudDsJLyogUnggZHJvcCBjb3VudCBwZXIgY2hhbm5lbCB0bw0KPiArCQkJ
CQkgY2xlYW4gc3BhY2UgZm9yIG5ldyBidWZmZXIgKi8NCj4gKwl1bnNpZ25lZCBpbnQgdHhfcGt0
X2NvdW50OwkvKiBUeCBmcmFtZSBjb3VudCBwZXIgY2hhbm5lbCAqLw0KPiArCXVuc2lnbmVkIGlu
dCB0eF9wa3RfY29uZl9jb3VudDsJLyogVHggZnJhbWUgY29uZmlybWF0aW9uIGNvdW50IHBlcg0K
PiArCQkJCQkgY2hhbm5lbCAqLw0KPiArCXVuc2lnbmVkIGludCB0eF9wa3RfZHJvcF9jb3VudDsJ
LyogVHggZHJvcCBjb3VudCBwZXIgY2hhbm5lbCBkdWUgdG8NCj4gKwkJCQkJIHF1ZXVlIGZ1bGwg
Ki8NCj4gK307DQo+ICsNCj4gKw0KPiArLyogdGRtIEJ1ZmZlciBEZXNjcmlwdG9yLCB1c2VkIGZv
ciBDcmVhdGluZyBJbnRlcmxlYXZlZCBhbmQgDQo+ICtEZS1pbnRlcmxlYXZlZA0KPiArICogRklG
T3MNCj4gKyAqLw0KPiArc3RydWN0IHRkbV9iZCB7DQo+ICsJdW5zaWduZWQgY2hhciBmbGFnOwkJ
LyogQkQgaXMgZnVsbCBvciBlbXB0eSAqLw0KPiArCXVuc2lnbmVkIGNoYXIgd3JhcDsJCS8qIEJE
IGlzIGxhc3QgaW4gdGhlIHF1ZXVlICovDQo+ICsJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiBM
ZW5ndGggb2YgRGF0YSBpbiBCRCAqLw0KPiArCS8qVE9ETzogdXNlIGR5YW5taWMgbWVtb3J5ICov
DQo+ICsJdW5zaWduZWQgc2hvcnQgcF9kYXRhW05VTV9TQU1QTEVTX1BFUl9GUkFNRV07CS8qIERh
dGEgUG9pbnRlciAqLw0KPiArCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgb2YgdGhl
IERhdGEgUG9pbnRlciB0byBiZSB1c2VkICovDQo+ICt9Ow0KPiArDQo+ICsjZGVmaW5lIFRETV9D
SF9SWF9CRF9SSU5HX1NJWkUJMw0KPiArI2RlZmluZSBURE1fQ0hfVFhfQkRfUklOR19TSVpFCTMN
Cj4gKw0KPiArLyogdGRtIFJYLVRYIENoYW5uZWxpc2VkIERhdGEgKi8NCj4gK3N0cnVjdCB0ZG1f
cG9ydF9kYXRhIHsNCj4gKwlzdHJ1Y3QgdGRtX2JkIHJ4X2RhdGFfZmlmb1tURE1fQ0hfUlhfQkRf
UklOR19TSVpFXTsgLyogUnggQ2hhbm5lbCBEYXRhDQo+ICsJCQkJCQkJCUJEIFJpbmcgKi8NCj4g
KwlzdHJ1Y3QgdGRtX2JkICpyeF9pbl9kYXRhOwkvKiBDdXJyZW50IENoYW5uZWwgUnggQkQgdG8g
YmUgZmlsbGVkIGJ5DQo+ICsJCQkJCQlkZS1pbnRlcmxlYXZlIGZ1bmN0aW9uICovDQo+ICsJc3Ry
dWN0IHRkbV9iZCAqcnhfb3V0X2RhdGE7CS8qIEN1cnJlbnQgQ2hhbm5lbCBSeCBCRCB0byBiZQ0K
PiArCQkJCQkJCXJlYWQgYnkgQXBwICovDQo+ICsJc3RydWN0IHRkbV9iZCB0eF9kYXRhX2ZpZm9b
VERNX0NIX1RYX0JEX1JJTkdfU0laRV07IC8qIFR4IENoYW5uZWwgRGF0YQ0KPiArCQkJCQkJCQlC
RCBSaW5nICovDQo+ICsJc3RydWN0IHRkbV9iZCAqdHhfaW5fZGF0YTsJLyogQ3VycmVudCBDaGFu
bmVsIFR4IEJEIHRvIGJlDQo+ICsJCQkJCQkgZmlsbGVkIGJ5IEFwcCAqLw0KPiArCXN0cnVjdCB0
ZG1fYmQgKnR4X291dF9kYXRhOwkvKiBDdXJyZW50IENoYW5uZWwgVHggQkQgdG8gYmUgcmVhZCBi
eQ0KPiArCQkJCQkJaW50ZXJsZWF2ZSBmdW5jdGlvbiAqLw0KPiArCXNwaW5sb2NrX3QgcnhfY2hh
bm5lbF9sb2NrOwkvKiBTcGluIExvY2sgZm9yIFJ4IENoYW5uZWwgKi8NCj4gKwlzcGlubG9ja190
IHR4X2NoYW5uZWxfbG9jazsJLyogU3BpbiBMb2NrIGZvciBUeCBDaGFubmVsICovDQo+ICt9Ow0K
PiArDQo+ICsvKiBzdHJ1Y3R1cmUgdGRtX3BvcnRfY2ZnIC0gY29udGFpbnMgY29uZmlndXJhdGlv
biBwYXJhbXMgZm9yIGEgcG9ydCANCj4gKyovIHN0cnVjdCB0ZG1fcG9ydF9jZmcgew0KPiArCXVu
c2lnbmVkIHNob3J0IHBvcnRfbW9kZTsNCj4gK307DQo+ICsNCj4gKy8qIHN0cnVjdCB0ZG1fcG9y
dCAtIHJlcHJlc2VudCBhbiBURE0gcG9ydHMgZm9yIGEgZGV2aWNlICovIHN0cnVjdCANCj4gK3Rk
bV9wb3J0IHsNCj4gKwl1bnNpZ25lZCBzaG9ydCBwb3J0X2lkOw0KPiArCXVuc2lnbmVkIHNob3J0
IGluX3VzZTsJCS8qIFBvcnQgaXMgZW5hYmxlZD8gKi8NCj4gKwl1aW50MTZfdCByeF9tYXhfZnJh
bWVzOwkJLyogUmVjZWl2ZWQgUG9ydCBmcmFtZXMNCj4gKwkJCQkJIGJlZm9yZSBhbGxvd2luZyBS
ZWFkIE9wZXJhdGlvbiBpbg0KPiArCQkJCQkgUG9ydCBNb2RlICovDQo+ICsNCj4gKwlzdHJ1Y3Qg
dGRtX3BvcnRfc3RhdHMgcG9ydF9zdGF0Oy8qIEEgc3RydWN0dXJlIHBhcmFtZXRlcnMgZGVmaW5p
bmcNCj4gKwkJCQkJIFRETSBwb3J0IHN0YXRpc3RpY3MuICovDQo+ICsJc3RydWN0IHRkbV9wb3J0
X2RhdGEgKnBfcG9ydF9kYXRhOwkvKiBhIHN0cnVjdHVyZSBwYXJhbWV0ZXJzDQo+ICsJCQkJCQlk
ZWZpbmluZyB0ZG0gY2hhbm5lbGlzZWQgZGF0YSAqLw0KPiArCXdhaXRfcXVldWVfaGVhZF90IGNo
X3dhaXRfcXVldWU7CS8qIHdhaXRRdWV1ZSBmb3IgUlggUG9ydCBEYXRhICovDQo+ICsNCj4gKwlz
dHJ1Y3QgdGRtX2RyaXZlciAqZHJpdmVyOwkvKiBkcml2ZXIgZm9yIHRoaXMgcG9ydCAqLw0KPiAr
CXN0cnVjdCB0ZG1fYWRhcHRlciAqYWRhcHRlcjsJLyogYWRhcHRlciBmb3IgdGhpcyBwb3J0ICov
DQo+ICsJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGlzdCBvZiBwb3J0cyAqLw0KPiArCXN0
cnVjdCBsaXN0X2hlYWQgbXljaGFubmVsczsJLyogbGlzdCBvZiBjaGFubmVscywgY3JlYXRlZCBv
biB0aGlzDQo+ICsJCQkJCSBwb3J0Ki8NCj4gKwlzcGlubG9ja190IGNoX2xpc3RfbG9jazsJLyog
U3BpbiBMb2NrIGZvciBjaGFubmVsX2xpc3QgKi8NCj4gKwlzdHJ1Y3QgdGRtX3BvcnRfY2ZnIHBv
cnRfY2ZnOy8qIEEgc3RydWN0dXJlIHBhcmFtZXRlcnMgZGVmaW5pbmcNCj4gKwkJCQkJIFRETSBw
b3J0IGNvbmZpZ3VyYXRpb24uICovDQo+ICt9Ow0KPiArDQo+ICsvKiB0ZG0gUlgtVFggQ2hhbm5l
bGlzZWQgRGF0YSAqLw0KPiArc3RydWN0IHRkbV9jaF9kYXRhIHsNCj4gKwlzdHJ1Y3QgdGRtX2Jk
IHJ4X2RhdGFfZmlmb1tURE1fQ0hfUlhfQkRfUklOR19TSVpFXTsgLyogUnggUG9ydCBEYXRhIEJE
DQo+ICsJCQkJCQkJCVJpbmcgKi8NCj4gKwlzdHJ1Y3QgdGRtX2JkICpyeF9pbl9kYXRhOwkvKiBD
dXJyZW50IFBvcnQgUnggQkQgdG8gYmUgZmlsbGVkIGJ5DQo+ICsJCQkJCQlkZS1pbnRlcmxlYXZl
IGZ1bmN0aW9uICovDQo+ICsJc3RydWN0IHRkbV9iZCAqcnhfb3V0X2RhdGE7IC8qIEN1cnJlbnQg
UG9ydCBSeCBCRCB0byBiZSByZWFkIGJ5IEFwcCAqLw0KPiArCXN0cnVjdCB0ZG1fYmQgdHhfZGF0
YV9maWZvW1RETV9DSF9UWF9CRF9SSU5HX1NJWkVdOyAvKiBUeCBQb3J0IERhdGEgQkQNCj4gKwkJ
CQkJCQkJUmluZyAqLw0KPiArCXN0cnVjdCB0ZG1fYmQgKnR4X2luX2RhdGE7CS8qIEN1cnJlbnQg
UG9ydCBUeCBCRCB0byBiZSBmaWxsZWQgYnkNCj4gKwkJCQkJCUFwcCAqLw0KPiArCXN0cnVjdCB0
ZG1fYmQgKnR4X291dF9kYXRhOwkvKiBDdXJyZW50IFBvcnQgVHggQkQgdG8gYmUgcmVhZCBieQ0K
PiArCQkJCQkJaW50ZXJsZWF2ZSBmdW5jdGlvbiAqLw0KPiArCXNwaW5sb2NrX3QgcnhfY2hhbm5l
bF9sb2NrOwkvKiBTcGluIExvY2sgZm9yIFJ4IFBvcnQgKi8NCj4gKwlzcGlubG9ja190IHR4X2No
YW5uZWxfbG9jazsJLyogU3BpbiBMb2NrIGZvciBUeCBQb3J0ICovDQo+ICt9Ow0KPiArDQo+ICsv
KiBDaGFubmVsIGNvbmZpZyBwYXJhbXMgKi8NCj4gK3N0cnVjdCB0ZG1fY2hfY2ZnIHsNCj4gKwl1
bnNpZ25lZCBzaG9ydCBudW1fc2xvdHM7DQo+ICsJdW5zaWduZWQgc2hvcnQgZmlyc3Rfc2xvdDsN
Cj4gK307DQo+ICsNCj4gKy8qIHN0cnVjdCB0ZG1fY2hhbm5lbC0gcmVwcmVzZW50IGEgVERNIGNo
YW5uZWwgZm9yIGEgcG9ydCAqLyBzdHJ1Y3QgDQo+ICt0ZG1fY2hhbm5lbCB7DQo+ICsJdTE2IGNo
X2lkOwkJCS8qIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgKi8NCj4gKwlzdHJ1Y3QgbGlzdF9oZWFk
IGxpc3Q7CQkvKiBsaXN0IG9mIGNoYW5uZWxzIGluIGEgcG9ydCovDQo+ICsJc3RydWN0IHRkbV9w
b3J0ICpwb3J0OwkJLyogcG9ydCBmb3IgdGhpcyBjaGFubmVsICovDQo+ICsJdTE2IGluX3VzZTsJ
CQkvKiBjaGFubmVsIGlzIGVuYWJsZWQ/ICovDQo+ICsJc3RydWN0IHRkbV9jaF9jZmcgY2hfY2Zn
OwkvKiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8NCj4gKwlzdHJ1Y3QgdGRtX2NoX2RhdGEgKnBf
Y2hfZGF0YTsJLyogZGF0YSBzdG9yYWdlIHNwYWNlIGZvciBjaGFubmVsICovDQo+ICt9Ow0KPiAr
DQo+ICsvKiB0ZG1fYWRhcHRfYWxnb3JpdGhtIGlzIGZvciBhY2Nlc3NpbmcgdGhlIHJvdXRpbmVz
IG9mIGRldmljZSAqLyANCj4gK3N0cnVjdCB0ZG1fYWRhcHRfYWxnb3JpdGhtIHsNCj4gKwl1MzIg
KCp0ZG1fcmVhZCkoc3RydWN0IHRkbV9hZGFwdGVyICosIHUxNiAqKik7DQo+ICsJdTMyICgqdGRt
X2dldF93cml0ZV9idWYpKHN0cnVjdCB0ZG1fYWRhcHRlciAqLCB1MTYgKiopOw0KPiArCXUzMiAo
KnRkbV93cml0ZSkoc3RydWN0IHRkbV9hZGFwdGVyICosIHZvaWQgKiAsIHVuc2lnbmVkIGludCBs
ZW4pOw0KPiArCWludCAoKnRkbV9lbmFibGUpKHN0cnVjdCB0ZG1fYWRhcHRlciAqKTsNCj4gKwlp
bnQgKCp0ZG1fZGlzYWJsZSkoc3RydWN0IHRkbV9hZGFwdGVyICopOyB9Ow0KPiArDQo+ICsvKiB0
ZG1fYWRhcHRlcl9tb2RlIGlzIHRvIGRlZmluZSBpbiBtb2RlIG9mIHRoZSBkZXZpY2UgKi8gZW51
bSANCj4gK3RkbV9hZGFwdGVyX21vZGUgew0KPiArCWVfVERNX0FEQVBURVJfTU9ERV9OT05FID0g
MHgwMCwNCj4gKwllX1RETV9BREFQVEVSX01PREVfVDEgPSAweDAxLA0KPiArCWVfVERNX0FEQVBU
RVJfTU9ERV9FMSA9IDB4MDIsDQo+ICsJZV9URE1fQURBUFRFUl9NT0RFX1QxX1JBVyA9IDB4MTAs
DQo+ICsJZV9URE1fQURBUFRFUl9NT0RFX0UxX1JBVyA9IDB4MjAsDQo+ICt9Ow0KPiArDQo+ICsv
KiB0ZG1fcG9ydF9tb2RlIGRlZmluZXMgdGhlIG1vZGUgaW4gd2hpY2ggdGhlIHBvcnQgaXMgY29u
ZmlndXJlZCB0byANCj4gK29wZXJhdGUNCj4gKyAqIEl0IGNhbiBiZSBjaGFubmVsaXplZC9mdWxs
L2ZyYWN0aW9uYWwuDQo+ICsgKi8NCj4gK2VudW0gdGRtX3BvcnRfbW9kZSB7DQo+ICsJZV9URE1f
UE9SVF9DSEFOTkVMSVpFRCA9IDAJLyogQ2hhbm5lbGl6ZWQgbW9kZSAqLw0KPiArCSwgZV9URE1f
UE9SVF9GVUxMID0gMQkJLyogRnVsbCBtb2RlICovDQo+ICsJLCBlX1RETV9QT1JUX0ZSQUNUSU9O
QUwgPSAyCS8qIEZyYWN0aW9uYWwgbW9kZSAqLw0KPiArfTsNCj4gKw0KPiArLyogdGRtX3Byb2Nl
c3NfbW9kZSB1c2VkIGZvciB0ZXN0aW5nIHRoZSB0ZG0gZGV2aWNlIGluIG5vcm1hbCBtb2RlIG9y
IA0KPiAraW50ZXJuYWwNCj4gKyAqIGxvb3BiYWNrIG9yIGV4dGVybmFsIGxvb3BiYWNrDQo+ICsg
Ki8NCj4gK2VudW0gdGRtX3Byb2Nlc3NfbW9kZSB7DQo+ICsJZV9URE1fUFJPQ0VTU19OT1JNQUwg
PSAwCS8qIE5vcm1hbCBtb2RlICovDQo+ICsJLCBlX1RETV9QUk9DRVNTX0lOVF9MUEIgPSAxCS8q
IEludGVybmFsIGxvb3AgbW9kZSAqLw0KPiArCSwgZV9URE1fUFJPQ0VTU19FWFRfTFBCID0gMgkv
KiBFeHRlcm5hbCBMb29wYmFjayBtb2RlICovDQo+ICt9Ow0KPiArDQo+ICsNCj4gKy8qIFRETSBj
b25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8NCj4gK3N0cnVjdCBmc2xfdGRtX2FkYXB0X2NmZyB7
DQo+ICsJdTggbnVtX2NoOwkJLyogTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoaXMgYWRwYXRlciAq
Lw0KPiArCXU4IGNoX3NpemVfdHlwZTsJCS8qIHJlY2lldmVyL3RyYW5zbWl0IGNoYW5uZWwNCj4g
KwkJCQkJCXNpemUgZm9yIGFsbCBjaGFubmVscyAqLw0KPiArCXU4IHNsb3Rfd2lkdGg7CQkvKiAx
IG9yIDIgSXMgZGVmaW5lZCBieSBjaGFubmVsIHR5cGUgKi8NCj4gKwl1OCBmcmFtZV9sZW47CQkv
KiBMZW5ndGggb2YgZnJhbWUgaW4gc2FtcGxlcyAqLw0KPiArCXUzMiBudW1fZnJhbWVzOw0KPiAr
CXU4IGxvb3BiYWNrOwkJCS8qIGxvb3BiYWNrIG9yIG5vcm1hbCAqLw0KPiArCXU4IGFkYXBfbW9k
ZTsJCQkvKiAwPU5vbmUsIDE9IFQxLCAyPSBUMS1GVUxMLCAzPUUxLA0KPiArCQkJCQkJNCA9IEUx
LUZVTEwgKi8NCj4gKwlpbnQgbWF4X251bV9wb3J0czsJCS8qIE5vdCBVc2VkOiBNYXggTnVtYmVy
IG9mIHBvcnRzIHRoYXQNCj4gKwkJCQkJY2FuIGJlIGNyZWF0ZWQgb24gdGhpcyBhZGFwdGVyICov
DQo+ICsJaW50IG1heF90aW1lc2xvdHM7CQkvKiBNYXggTnVtYmVyIG9mIHRpbWVzbG90cyB0aGF0
IGFyZQ0KPiArCQkJCQlzdXBwb3J0ZWQgb24gdGhpcyBhZGFwdGVyICovDQo+ICt9Ow0KPiArDQo+
ICsvKg0KPiArICogdGRtX2FkYXB0ZXIgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGlkZW50aWZ5
IGEgcGh5c2ljYWwgdGRtIA0KPiArZGV2aWNlIGFsb25nDQo+ICsgKiB3aXRoIHRoZSBhY2Nlc3Mg
YWxnb3JpdGhtcyBuZWNlc3NhcnkgdG8gYWNjZXNzIGl0Lg0KPiArICovDQo+ICtzdHJ1Y3QgdGRt
X2FkYXB0ZXIgew0KPiArCXN0cnVjdCBtb2R1bGUgKm93bmVyOwkvKiBvd25lciBvZiB0aGUgYWRh
cHRlciBtb2R1bGUgKi8NCj4gKwl1bnNpZ25lZCBpbnQgaWQ7CS8qIEFkYXB0ZXIgSWQgKi8NCj4g
Kwl1bnNpZ25lZCBpbnQgY2xhc3M7CS8qIGNsYXNzZXMgdG8gYWxsb3cgcHJvYmluZyBmb3IgKi8N
Cj4gKwl1bnNpZ25lZCBpbnQgZHJ2X2NvdW50OwkvKiBOdW1iZXIgb2YgZHJpdmVycyBhc3NvY2lh
dGVkIHdpdGggdGhlDQo+ICsJCQkJIGFkYXB0ZXIgKi8NCj4gKw0KPiArCWNvbnN0IHN0cnVjdCB0
ZG1fYWRhcHRfYWxnb3JpdGhtICphbGdvOwkvKiB0aGUgYWxnb3JpdGhtIHRvIGFjY2VzcyB0aGUN
Cj4gKwkJCQkJCSBhZGFwdGVyKi8NCj4gKw0KPiArCWNoYXIgbmFtZVtURE1fTkFNRV9TSVpFXTsJ
LyogTmFtZSBvZiBBZGFwdGVyICovDQo+ICsJc3RydWN0IG11dGV4IGFkYXBfbG9jazsNCj4gKwlz
dHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CQkvKk5vdCBVc2VkKi8NCj4gKw0KPiArCXN0cnVjdCB0YXNr
bGV0X3N0cnVjdCB0ZG1fZGF0YV90YXNrbGV0OwkvKiB0YXNrbGV0IGhhbmRsZSB0byBwZXJmb3Jt
DQo+ICsJCQkJCQkgZGF0YSBwcm9jZXNzaW5nKi8NCj4gKwlpbnQgdGFza2xldF9jb25mOwkvKiBm
bGFnIGZvciB0YXNrbGV0IGNvbmZpZ3VyYXRpb24gKi8NCj4gKwlpbnQgdGRtX3J4X2ZsYWc7DQo+
ICsNCj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIG15cG9ydHM7CS8qIGxpc3Qgb2YgcG9ydHMsIGNyZWF0
ZWQgb24gdGhpcw0KPiArCQkJCQkgYWRhcHRlciAqLw0KPiArCXN0cnVjdCBsaXN0X2hlYWQgbGlz
dDsNCj4gKwlzcGlubG9ja190IHBvcnRsaXN0X2xvY2s7CS8qIFNwaW4gTG9jayBmb3IgcG9ydF9s
aXN0ICovDQo+ICsJdm9pZCAqZGF0YTsNCj4gKwlzdHJ1Y3QgZnNsX3RkbV9hZGFwdF9jZmcgYWRh
cHRfY2ZnOw0KPiArfTsNCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkICp0ZG1fZ2V0X2FkYXBk
YXRhKGNvbnN0IHN0cnVjdCB0ZG1fYWRhcHRlciAqZGV2KSB7DQo+ICsJcmV0dXJuIGRldi0+ZGF0
YTsNCj4gK30NCj4gKw0KPiArc3RhdGljIGlubGluZSB2b2lkIHRkbV9zZXRfYWRhcGRhdGEoc3Ry
dWN0IHRkbV9hZGFwdGVyICpkZXYsIHZvaWQgDQo+ICsqZGF0YSkgew0KPiArCWRldi0+ZGF0YSA9
IGRhdGE7DQo+ICt9DQo+ICsNCj4gKy8qIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0ZG0ubyAqLw0K
PiArDQo+ICtleHRlcm4gaW50IHRkbV9hZGRfYWRhcHRlcihzdHJ1Y3QgdGRtX2FkYXB0ZXIgKik7
IGV4dGVybiBpbnQgDQo+ICt0ZG1fZGVsX2FkYXB0ZXIoc3RydWN0IHRkbV9hZGFwdGVyICopOyBl
eHRlcm4gaW50IA0KPiArdGRtX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGRtX2RyaXZlciAqKTsg
ZXh0ZXJuIHZvaWQgDQo+ICt0ZG1fZGVsX2RyaXZlcihzdHJ1Y3QgdGRtX2RyaXZlciAqKTsgZXh0
ZXJuIHZvaWQgDQo+ICt0ZG1fdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRkbV9kcml2ZXIgKik7
IGV4dGVybiB2b2lkIA0KPiAraW5pdF9jb25maWdfYWRhcHRlcihzdHJ1Y3QgdGRtX2FkYXB0ZXIg
Kik7DQo+ICsNCj4gK2V4dGVybiB1bnNpZ25lZCBpbnQgdGRtX3BvcnRfb3BlbihzdHJ1Y3QgdGRt
X2RyaXZlciAqLCB2b2lkICoqKTsgDQo+ICtleHRlcm4gdW5zaWduZWQgaW50IHRkbV9wb3J0X2Ns
b3NlKHZvaWQgKik7IGV4dGVybiB1bnNpZ25lZCBpbnQgDQo+ICt0ZG1fcG9ydF9pb2N0bCh2b2lk
ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7IGV4dGVybiB1bnNpZ25lZCANCj4gK2lu
dCB0ZG1fY2hhbm5lbF9yZWFkKHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHUxNiAqKTsgZXh0ZXJu
IHVuc2lnbmVkIA0KPiAraW50IHRkbV9jaGFubmVsX3dyaXRlKHZvaWQgKiwgdm9pZCAqICwgdm9p
ZCAqLCB1MTYpOyBleHRlcm4gdW5zaWduZWQgDQo+ICtpbnQgdGRtX3BvcnRfcG9sbCh2b2lkICos
IHVuc2lnbmVkIGludCk7DQo+ICsNCj4gK2V4dGVybiBpbnQgdGRtX2NoYW5uZWxfb3Blbih1MTYs
IHUxNiwgc3RydWN0IHRkbV9wb3J0ICosIHZvaWQgKiopOyANCj4gK2V4dGVybiBpbnQgdGRtX2No
YW5uZWxfY2xvc2UodTE2LCB1MTYsIHN0cnVjdCB0ZG1fcG9ydCAqLA0KPiArCQkJCQkJc3RydWN0
IHRkbV9jaGFubmVsICopOw0KPiArDQo+ICtzdGF0aWMgaW5saW5lIGludCB0ZG1fYWRkX2RyaXZl
cihzdHJ1Y3QgdGRtX2RyaXZlciAqZHJpdmVyKSB7DQo+ICsJcmV0dXJuIHRkbV9yZWdpc3Rlcl9k
cml2ZXIoZHJpdmVyKTsNCj4gK30NCj4gKw0KPiArZXh0ZXJuIHN0cnVjdCB0ZG1fYWRhcHRlciAq
dGRtX2dldF9hZGFwdGVyKGludCBpZCk7IGV4dGVybiB2b2lkIA0KPiArdGRtX3B1dF9hZGFwdGVy
KHN0cnVjdCB0ZG1fYWRhcHRlciAqYWRhcCk7DQo+ICsNCj4gKyNlbmRpZiAvKiBfX0tFUk5FTF9f
ICovDQo+ICsNCj4gKyNkZWZpbmUgVERNX0VfT0sgMA0KPiArDQo+ICsjZW5kaWYgLyogX0xJTlVY
X1RETV9IICovDQoNCg0KDQo=

^ permalink raw reply

* [PATCH v2] powerpc/85xx: Enable MTD/NOR/NAND options by default in defconfig
From: Shengzhou Liu @ 2012-04-26 10:43 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: linux-mtd, Shengzhou Liu

Enable MTD/NOR/NAND options by default in mpc85xx_defconfig and
mpc85xx_smp_defconfig to support NOR, NAND flash.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
---
based on master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
changes of v2: remove typo "CONFIG_MPC8xxx_GPIO=y" compared with v1.

 arch/powerpc/configs/mpc85xx_defconfig     |   25 +++++++++++++++++++++++++
 arch/powerpc/configs/mpc85xx_smp_defconfig |   25 +++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
index d6b6df5..0f55408 100644
--- a/arch/powerpc/configs/mpc85xx_defconfig
+++ b/arch/powerpc/configs/mpc85xx_defconfig
@@ -74,6 +74,31 @@ CONFIG_INET_ESP=y
 CONFIG_IPV6=y
 CONFIG_IP_SCTP=m
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_FTL=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_FSL_ELBC=y
+CONFIG_MTD_NAND_FSL_IFC=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_M25P80=y
 CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
index 5b0e292..31ef74f 100644
--- a/arch/powerpc/configs/mpc85xx_smp_defconfig
+++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
@@ -76,6 +76,31 @@ CONFIG_INET_ESP=y
 CONFIG_IPV6=y
 CONFIG_IP_SCTP=m
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_FTL=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_FSL_ELBC=y
+CONFIG_MTD_NAND_FSL_IFC=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_M25P80=y
 CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
-- 
1.6.4

^ permalink raw reply related

* [PATCH] powerpc/85xx: Enable MTD/NOR/NAND options by default in defconfig
From: Shengzhou Liu @ 2012-04-26 10:34 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: linux-mtd, Shengzhou Liu

Enable MTD/NOR/NAND options by default in mpc85xx_defconfig and
mpc85xx_smp_defconfig to support NOR, NAND flash.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
---
based on master branch of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

 arch/powerpc/configs/mpc85xx_defconfig     |   26 ++++++++++++++++++++++++++
 arch/powerpc/configs/mpc85xx_smp_defconfig |   25 +++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
index d6b6df5..a42304d 100644
--- a/arch/powerpc/configs/mpc85xx_defconfig
+++ b/arch/powerpc/configs/mpc85xx_defconfig
@@ -39,6 +39,7 @@ CONFIG_TQM8560=y
 CONFIG_SBC8548=y
 CONFIG_QUICC_ENGINE=y
 CONFIG_QE_GPIO=y
+CONFIG_MPC8xxx_GPIO=y
 CONFIG_HIGHMEM=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
@@ -74,6 +75,31 @@ CONFIG_INET_ESP=y
 CONFIG_IPV6=y
 CONFIG_IP_SCTP=m
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_FTL=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_FSL_ELBC=y
+CONFIG_MTD_NAND_FSL_IFC=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_M25P80=y
 CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
index 5b0e292..31ef74f 100644
--- a/arch/powerpc/configs/mpc85xx_smp_defconfig
+++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
@@ -76,6 +76,31 @@ CONFIG_INET_ESP=y
 CONFIG_IPV6=y
 CONFIG_IP_SCTP=m
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_FTL=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_PHYSMAP_OF=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_OF_PARTS=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_FSL_ELBC=y
+CONFIG_MTD_NAND_FSL_IFC=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_ECC=y
+CONFIG_MTD_M25P80=y
 CONFIG_PROC_DEVICETREE=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=y
-- 
1.7.0.4

^ permalink raw reply related

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Benjamin Herrenschmidt @ 2012-04-26  9:19 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: khali, linuxppc-dev
In-Reply-To: <m2liliam9w.fsf@igel.home>

On Thu, 2012-04-26 at 11:13 +0200, Andreas Schwab wrote:
> Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
> 
> > What if you just comment out the tickle code ?
> 
> I haven't tried it yet, but I suspect it won't tickle the fcu any more
> since wf_control_set avoids writing an unchanged value (unlike the old
> driver).

Sure, the question is whether that fixes the "annoyance" :-)

I don't think we really need to tickle the FCU as long as we have that
#define set in windfarm_fcu to use the actual fan values rather than the
programmed one.

In fact, can you change that define around and see if it makes it behave
more like therm_pm72 overall ? IE That's the only -known- difference
between the old and new driver (+/- a bug / typo / etc..)

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Andreas Schwab @ 2012-04-26  9:13 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: khali, linuxppc-dev
In-Reply-To: <1335391128.21961.55.camel@pasglop>

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> What if you just comment out the tickle code ?

I haven't tried it yet, but I suspect it won't tickle the fcu any more
since wf_control_set avoids writing an unchanged value (unlike the old
driver).

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply

* (no subject)
From: Jessica Wang @ 2012-04-26  3:49 UTC (permalink / raw)
  To: Linuxppc-dev

please remove me from the list... thanks

^ permalink raw reply

* RE: [PATCH]     fsldma: fix performance degradation by optimizing spinlock use.
From: Li Yang-R58472 @ 2012-04-26  2:59 UTC (permalink / raw)
  To: Shi Xuelin-B29237, dan.j.williams@intel.com, vinod.koul@intel.com
  Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	Ira W. Snyder
In-Reply-To: <00ACF084E0EED647B22C27725E03EAFD06D7E2@039-SN2MPN1-011.039d.mgd.msft.net>

SGkgRGFuIGFuZCBWaW5vZCwNCg0KUGxlYXNlIGhlbHAgdG8gcGljayB0aGlzIHBhdGNoIHVwLiAg
SXQgYWRkcmVzc2VzIGEgZ3JlYXQgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiBmb3IgUkFJRCBvZmZs
b2FkaW5nLg0KDQpBY2tlZC1ieTogTGkgWWFuZyA8bGVvbGlAZnJlZXNjYWxlLmNvbT4NCg0KLSBM
ZW8NCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBTaGkgWHVlbGluLUIy
OTIzNw0KPiBTZW50OiBUaHVyc2RheSwgQXByaWwgMjYsIDIwMTIgMTA6MDQgQU0NCj4gVG86IGRh
bi5qLndpbGxpYW1zQGludGVsLmNvbQ0KPiBDYzogdmlub2Qua291bEBpbnRlbC5jb207IGxpbnV4
cHBjLWRldkBsaXN0cy5vemxhYnMub3JnOyBsaW51eC0NCj4ga2VybmVsQHZnZXIua2VybmVsLm9y
ZzsgSXJhIFcuIFNueWRlcjsgTGkgWWFuZy1SNTg0NzINCj4gU3ViamVjdDogUkU6IFtQQVRDSF0g
ZnNsZG1hOiBmaXggcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYnkgb3B0aW1pemluZw0KPiBzcGlu
bG9jayB1c2UuDQo+IA0KPiBIaSBEYW4gV2lsbGlhbXMsDQo+IA0KPiBEbyB5b3UgaGF2ZSBhbnkg
Y29tbWVudCBhYm91dCB0aGlzIHBhdGNoPw0KPiANCj4gVGhhbmtzLA0KPiBGb3JyZXN0DQo+IA0K
PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBJcmEgVy4gU255ZGVyIFttYWls
dG86aXdzQG92cm8uY2FsdGVjaC5lZHVdDQo+IFNlbnQ6IDIwMTLlubQx5pyIMTLml6UgMDoxNA0K
PiBUbzogU2hpIFh1ZWxpbi1CMjkyMzcNCj4gQ2M6IHZpbm9kLmtvdWxAaW50ZWwuY29tOyBkYW4u
ai53aWxsaWFtc0BpbnRlbC5jb207IGxpbnV4cHBjLQ0KPiBkZXZAbGlzdHMub3psYWJzLm9yZzsg
bGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIXSBmc2xk
bWE6IGZpeCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBieSBvcHRpbWl6aW5nDQo+IHNwaW5sb2Nr
IHVzZS4NCj4gDQo+IE9uIFdlZCwgSmFuIDExLCAyMDEyIGF0IDA3OjU0OjU1QU0gKzAwMDAsIFNo
aSBYdWVsaW4tQjI5MjM3IHdyb3RlOg0KPiA+IEhlbGxvIElyaXMsDQo+ID4NCj4gPiBBcyB3ZSBk
aXNjdXNzZWQgaW4gdGhlIHByZXZpb3VzIHBhdGNoLCBJIGFkZCBvbmUgc21wX21iKCkgaW4NCj4g
ZnNsX3R4X3N0YXR1cy4NCj4gPiBJbiBteSB0ZXN0aW5nIHdpdGggaW96b25lLCB0aGlzIHNtcF9t
YigpIGNvdWxkIGNhdXNlIDElfjIlIHBlcmZvcm1hbmNlDQo+IGRlZ3JhZGF0aW9uLg0KPiA+IEFu
eXdheSBpdCBpcyBhY2NlcHRhYmxlIGZvciBtZS4gRG8geW91IGhhdmUgYW55IG90aGVyIGNvbW1l
bnRzPw0KPiA+DQo+IA0KPiBUaGlzIHBhdGNoIGxvb2tzIGZpbmUgdG8gbWUuDQo+IA0KPiBJcmEN
Cj4gDQo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gPiBGcm9tOiBTaGkgWHVlbGlu
LUIyOTIzNw0KPiA+IFNlbnQ6IDIwMTHlubQxMuaciDI25pelIDE0OjAxDQo+ID4gVG86IGl3c0Bv
dnJvLmNhbHRlY2guZWR1OyB2aW5vZC5rb3VsQGludGVsLmNvbTsNCj4gZGFuLmoud2lsbGlhbXNA
aW50ZWwuY29tOyBsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZzsgbGludXgtDQo+IGtlcm5l
bEB2Z2VyLmtlcm5lbC5vcmcNCj4gPiBDYzogU2hpIFh1ZWxpbi1CMjkyMzcNCj4gPiBTdWJqZWN0
OiBbUEFUQ0hdIGZzbGRtYTogZml4IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGJ5IG9wdGltaXpp
bmcNCj4gc3BpbmxvY2sgdXNlLg0KPiA+DQo+ID4gRnJvbTogRm9ycmVzdCBzaGkgPGIyOTIzN0Bm
cmVlc2NhbGUuY29tPg0KPiA+DQo+ID4gICAgIGRtYSBzdGF0dXMgY2hlY2sgZnVuY3Rpb24gZnNs
X3R4X3N0YXR1cyBpcyBoZWF2aWx5IGNhbGxlZCBpbg0KPiA+ICAgICBhIHRpZ2h0IGxvb3AgYW5k
IHRoZSBkZXNjIGxvY2sgaW4gZnNsX3R4X3N0YXR1cyBjb250ZW5kZWQgYnkNCj4gPiAgICAgdGhl
IGRtYSBzdGF0dXMgdXBkYXRlIGZ1bmN0aW9uLiB0aGlzIGNhdXNlZCB0aGUgZG1hIHBlcmZvcm1h
bmNlDQo+ID4gICAgIGRlZ3JhZGVzIG11Y2guDQo+ID4NCj4gPiAgICAgdGhpcyBwYXRjaCByZWxl
YXNlcyB0aGUgbG9jayBpbiB0aGUgZnNsX3R4X3N0YXR1cyBmdW5jdGlvbiwgYW5kDQo+ID4gICAg
IGludHJvZHVjZSB0aGUgc21wX21iKCkgdG8gYXZvaWQgcG9zc2libGUgbWVtb3J5IGluY29uc2lz
dGVuY3kuDQo+ID4NCj4gPiAgICAgU2lnbmVkLW9mZi1ieTogRm9ycmVzdCBTaGkgPHh1ZWxpbi5z
aGlAZnJlZXNjYWxlLmNvbT4NCj4gPiAtLS0NCj4gPiAgZHJpdmVycy9kbWEvZnNsZG1hLmMgfCAg
ICA2ICstLS0tLQ0KPiA+ICAxIGZpbGVzIGNoYW5nZWQsIDEgaW5zZXJ0aW9ucygrKSwgNSBkZWxl
dGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9mc2xkbWEuYyBiL2Ry
aXZlcnMvZG1hL2ZzbGRtYS5jIGluZGV4DQo+IDhhNzgxNTQuLjAwOGZiNWUgMTAwNjQ0DQo+ID4g
LS0tIGEvZHJpdmVycy9kbWEvZnNsZG1hLmMNCj4gPiArKysgYi9kcml2ZXJzL2RtYS9mc2xkbWEu
Yw0KPiA+IEBAIC05ODYsMTUgKzk4NiwxMSBAQCBzdGF0aWMgZW51bSBkbWFfc3RhdHVzIGZzbF90
eF9zdGF0dXMoc3RydWN0DQo+IGRtYV9jaGFuICpkY2hhbiwNCj4gPiAgCXN0cnVjdCBmc2xkbWFf
Y2hhbiAqY2hhbiA9IHRvX2ZzbF9jaGFuKGRjaGFuKTsNCj4gPiAgCWRtYV9jb29raWVfdCBsYXN0
X2NvbXBsZXRlOw0KPiA+ICAJZG1hX2Nvb2tpZV90IGxhc3RfdXNlZDsNCj4gPiAtCXVuc2lnbmVk
IGxvbmcgZmxhZ3M7DQo+ID4gLQ0KPiA+IC0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmRlc2Nf
bG9jaywgZmxhZ3MpOw0KPiA+DQo+ID4gCWxhc3RfY29tcGxldGUgPSBjaGFuLT5jb21wbGV0ZWRf
Y29va2llOw0KPiA+ICsJc21wX21iKCk7DQo+ID4gCWxhc3RfdXNlZCA9IGRjaGFuLT5jb29raWU7
DQo+ID4NCj4gPiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmRlc2NfbG9jaywgZmxh
Z3MpOw0KPiA+IC0NCj4gPiAgCWRtYV9zZXRfdHhfc3RhdGUodHhzdGF0ZSwgbGFzdF9jb21wbGV0
ZSwgbGFzdF91c2VkLCAwKTsNCj4gPiAgCXJldHVybiBkbWFfYXN5bmNfaXNfY29tcGxldGUoY29v
a2llLCBsYXN0X2NvbXBsZXRlLCBsYXN0X3VzZWQpOyB9DQo+ID4gLS0NCj4gPiAxLjcuMC40DQo+
ID4NCj4gPg0KDQo=

^ permalink raw reply

* RE: [PATCH]     fsldma: fix performance degradation by optimizing spinlock use.
From: Shi Xuelin-B29237 @ 2012-04-26  2:03 UTC (permalink / raw)
  To: dan.j.williams@intel.com
  Cc: vinod.koul@intel.com, Li Yang-R58472,
	linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	Ira W. Snyder
In-Reply-To: <20120111161347.GA1430@ovro.caltech.edu>

SGkgRGFuIFdpbGxpYW1zLA0KDQpEbyB5b3UgaGF2ZSBhbnkgY29tbWVudCBhYm91dCB0aGlzIHBh
dGNoPw0KDQpUaGFua3MsDQpGb3JyZXN0DQoNCi0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQpG
cm9tOiBJcmEgVy4gU255ZGVyIFttYWlsdG86aXdzQG92cm8uY2FsdGVjaC5lZHVdIA0KU2VudDog
MjAxMuW5tDHmnIgxMuaXpSAwOjE0DQpUbzogU2hpIFh1ZWxpbi1CMjkyMzcNCkNjOiB2aW5vZC5r
b3VsQGludGVsLmNvbTsgZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tOyBsaW51eHBwYy1kZXZAbGlz
dHMub3psYWJzLm9yZzsgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZw0KU3ViamVjdDogUmU6
IFtQQVRDSF0gZnNsZG1hOiBmaXggcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYnkgb3B0aW1pemlu
ZyBzcGlubG9jayB1c2UuDQoNCk9uIFdlZCwgSmFuIDExLCAyMDEyIGF0IDA3OjU0OjU1QU0gKzAw
MDAsIFNoaSBYdWVsaW4tQjI5MjM3IHdyb3RlOg0KPiBIZWxsbyBJcmlzLA0KPiANCj4gQXMgd2Ug
ZGlzY3Vzc2VkIGluIHRoZSBwcmV2aW91cyBwYXRjaCwgSSBhZGQgb25lIHNtcF9tYigpIGluIGZz
bF90eF9zdGF0dXMuDQo+IEluIG15IHRlc3Rpbmcgd2l0aCBpb3pvbmUsIHRoaXMgc21wX21iKCkg
Y291bGQgY2F1c2UgMSV+MiUgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24uDQo+IEFueXdheSBpdCBp
cyBhY2NlcHRhYmxlIGZvciBtZS4gRG8geW91IGhhdmUgYW55IG90aGVyIGNvbW1lbnRzPw0KPiAN
Cg0KVGhpcyBwYXRjaCBsb29rcyBmaW5lIHRvIG1lLg0KDQpJcmENCg0KPiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBTaGkgWHVlbGluLUIyOTIzNyANCj4gU2VudDogMjAxMeW5
tDEy5pyIMjbml6UgMTQ6MDENCj4gVG86IGl3c0BvdnJvLmNhbHRlY2guZWR1OyB2aW5vZC5rb3Vs
QGludGVsLmNvbTsgZGFuLmoud2lsbGlhbXNAaW50ZWwuY29tOyBsaW51eHBwYy1kZXZAbGlzdHMu
b3psYWJzLm9yZzsgbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZw0KPiBDYzogU2hpIFh1ZWxp
bi1CMjkyMzcNCj4gU3ViamVjdDogW1BBVENIXSBmc2xkbWE6IGZpeCBwZXJmb3JtYW5jZSBkZWdy
YWRhdGlvbiBieSBvcHRpbWl6aW5nIHNwaW5sb2NrIHVzZS4NCj4gDQo+IEZyb206IEZvcnJlc3Qg
c2hpIDxiMjkyMzdAZnJlZXNjYWxlLmNvbT4NCj4gDQo+ICAgICBkbWEgc3RhdHVzIGNoZWNrIGZ1
bmN0aW9uIGZzbF90eF9zdGF0dXMgaXMgaGVhdmlseSBjYWxsZWQgaW4NCj4gICAgIGEgdGlnaHQg
bG9vcCBhbmQgdGhlIGRlc2MgbG9jayBpbiBmc2xfdHhfc3RhdHVzIGNvbnRlbmRlZCBieQ0KPiAg
ICAgdGhlIGRtYSBzdGF0dXMgdXBkYXRlIGZ1bmN0aW9uLiB0aGlzIGNhdXNlZCB0aGUgZG1hIHBl
cmZvcm1hbmNlDQo+ICAgICBkZWdyYWRlcyBtdWNoLg0KPiANCj4gICAgIHRoaXMgcGF0Y2ggcmVs
ZWFzZXMgdGhlIGxvY2sgaW4gdGhlIGZzbF90eF9zdGF0dXMgZnVuY3Rpb24sIGFuZA0KPiAgICAg
aW50cm9kdWNlIHRoZSBzbXBfbWIoKSB0byBhdm9pZCBwb3NzaWJsZSBtZW1vcnkgaW5jb25zaXN0
ZW5jeS4NCj4gDQo+ICAgICBTaWduZWQtb2ZmLWJ5OiBGb3JyZXN0IFNoaSA8eHVlbGluLnNoaUBm
cmVlc2NhbGUuY29tPg0KPiAtLS0NCj4gIGRyaXZlcnMvZG1hL2ZzbGRtYS5jIHwgICAgNiArLS0t
LS0NCj4gIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQ0K
PiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5jIGIvZHJpdmVycy9kbWEvZnNs
ZG1hLmMgaW5kZXggOGE3ODE1NC4uMDA4ZmI1ZSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9kbWEv
ZnNsZG1hLmMNCj4gKysrIGIvZHJpdmVycy9kbWEvZnNsZG1hLmMNCj4gQEAgLTk4NiwxNSArOTg2
LDExIEBAIHN0YXRpYyBlbnVtIGRtYV9zdGF0dXMgZnNsX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2No
YW4gKmRjaGFuLA0KPiAgCXN0cnVjdCBmc2xkbWFfY2hhbiAqY2hhbiA9IHRvX2ZzbF9jaGFuKGRj
aGFuKTsNCj4gIAlkbWFfY29va2llX3QgbGFzdF9jb21wbGV0ZTsNCj4gIAlkbWFfY29va2llX3Qg
bGFzdF91c2VkOw0KPiAtCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+IC0NCj4gLQlzcGluX2xvY2tf
aXJxc2F2ZSgmY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7DQo+ICANCj4gCWxhc3RfY29tcGxldGUg
PSBjaGFuLT5jb21wbGV0ZWRfY29va2llOw0KPiArCXNtcF9tYigpOw0KPiAJbGFzdF91c2VkID0g
ZGNoYW4tPmNvb2tpZTsNCj4gIA0KPiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmRl
c2NfbG9jaywgZmxhZ3MpOw0KPiAtDQo+ICAJZG1hX3NldF90eF9zdGF0ZSh0eHN0YXRlLCBsYXN0
X2NvbXBsZXRlLCBsYXN0X3VzZWQsIDApOw0KPiAgCXJldHVybiBkbWFfYXN5bmNfaXNfY29tcGxl
dGUoY29va2llLCBsYXN0X2NvbXBsZXRlLCBsYXN0X3VzZWQpOyB9DQo+IC0tDQo+IDEuNy4wLjQN
Cj4gDQo+IA0KDQo=

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Benjamin Herrenschmidt @ 2012-04-25 21:58 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: khali, linuxppc-dev
In-Reply-To: <m2aa1zxyt7.fsf@igel.home>

On Wed, 2012-04-25 at 23:54 +0200, Andreas Schwab wrote:
> 
> This fuzzing is what makes it much more annoying.
> 
Interesting, I didn't think that couple of percent of pwm would be
noticable (there's probably too much ambiant noise in the lab here for
me to notice).

What if you just comment out the tickle code ?

In theory it's only needed if we haven't changed any fan speed for a
long time (the FCU can then timeout and assume we aren't driving it,
ramping up all fans to full speed). I could implement that a bit more
intelligently.

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Andreas Schwab @ 2012-04-25 21:54 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: khali, linuxppc-dev
In-Reply-To: <1335388465.21961.35.camel@pasglop>

Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:

> Constant or changing ? The slots fan is set to a fixed speed, which I
> thought was constant (well, I "tickle" it a bit but roughly it's
> constant).

This fuzzing is what makes it much more annoying.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply

* Re: Regression in 32-bit ppc kernel
From: Benjamin Herrenschmidt @ 2012-04-25 21:44 UTC (permalink / raw)
  To: Larry Finger; +Cc: linuxppc-dev, Paul Mackerras, LKML
In-Reply-To: <4F98117C.7080309@lwfinger.net>

On Wed, 2012-04-25 at 10:00 -0500, Larry Finger wrote:
> 
> After a few tries, I managed to change over to pata_macio.
> Fortunately, most of 
> the system used dev-by-id or UUID, thus most of the process was
> getting all the 
> kernel pieces built in.
> 
> Unfortunately, the original problem remains. I have resumed the
> bisecting - only 
> 11 steps to go. I should have it by Friday! :)
> 
Thanks !

Do we know what the bad interrupt maps to ? Also what is the value of
NR_IRQ and do you have SPARSE_IRQ enabled ? Can you try with the latter
disabled and NR_IRQ set to something large, such as 128 ?

(You may be able to check the interrupt mapping in debugfs)

Cheers,
Ben.

^ permalink raw reply

* Re: [PATCH 00/15] PowerMac i2c API conversions & windfarm updates
From: Benjamin Herrenschmidt @ 2012-04-25 21:14 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: khali, linuxppc-dev
In-Reply-To: <m2sjfs85pv.fsf@igel.home>

On Wed, 2012-04-25 at 12:29 +0200, Andreas Schwab wrote:
> Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
> 
> > Also, does the new driver properly react to load ?
> 
> The old driver keeps the cpu fans running at 300 rpm (lowest speed?)
> for much longer when the cpus are put busy.  Only when the cpus are back
> idle it speeds them up to 1200 rpm or more for some time depending on
> how long the cpus were busy.  The new driver is faster at speeding up
> the fans to around 800 rpm when cpus get busy, and keeps them running
> longer at that speed, but doesn't appear to select much higher speeds.
> 
> The old driver appears to be better suited to desktops, whereas the new
> driver is probably better for servers.

That's odd... as I said, the algorithm is supposed to be the same...

> But the most annoying sound appears to be coming from the slots fan.

Constant or changing ? The slots fan is set to a fixed speed, which I
thought was constant (well, I "tickle" it a bit but roughly it's
constant). Or is that not the case for you ?

Darwin has an algorithm for it based on getting some data from the video
driver in the AGP slot, but I don't have that.

Cheers,
Ben.

^ permalink raw reply

* [PATCH 08/10] powerpc/ps3: Minor Kconfig cleanup
From: Geoff Levand @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: cbe-oss-dev, Andre Heider, linuxppc-dev
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/powerpc/platforms/ps3/Kconfig |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/platforms/ps3/Kconfig b/arch/powerpc/platforms/ps3/Kconfig
index b72425a..46b7f02 100644
--- a/arch/powerpc/platforms/ps3/Kconfig
+++ b/arch/powerpc/platforms/ps3/Kconfig
@@ -73,7 +73,7 @@ config PS3_PS3AV
 	help
 	  Include support for the PS3 AV Settings driver.
 
-	  This support is required for graphics and sound. In
+	  This support is required for PS3 graphics and sound. In
 	  general, all users will say Y or M.
 
 config PS3_SYS_MANAGER
@@ -84,7 +84,7 @@ config PS3_SYS_MANAGER
 	help
 	  Include support for the PS3 System Manager.
 
-	  This support is required for system control.  In
+	  This support is required for PS3 system control.  In
 	  general, all users will say Y or M.
 
 config PS3_REPOSITORY_WRITE
@@ -134,7 +134,7 @@ config PS3_FLASH
 
 	  This support is required to access the PS3 FLASH ROM, which
 	  contains the boot loader and some boot options.
-	  In general, all users will say Y or M.
+	  In general, PS3 OtherOS users will say Y or M.
 
 	  As this driver needs a fixed buffer of 256 KiB of memory, it can
 	  be disabled on the kernel command line using "ps3flash=off", to
@@ -168,7 +168,7 @@ config PS3GELIC_UDBG
 	  via the Ethernet port (UDP port number 18194).
 
 	  This driver uses a trivial implementation and is independent
-	  from the main network driver.
+	  from the main PS3 gelic network driver.
 
 	  If in doubt, say N here.
 
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 10/10] powerpc/ps3: Refresh ps3_defconfig
From: Geoff Levand @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: cbe-oss-dev, linuxppc-dev
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/powerpc/configs/ps3_defconfig |    6 ------
 1 file changed, 6 deletions(-)

diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig
index ded8678..c2f4b4a 100644
--- a/arch/powerpc/configs/ps3_defconfig
+++ b/arch/powerpc/configs/ps3_defconfig
@@ -6,7 +6,6 @@ CONFIG_NR_CPUS=2
 CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
-CONFIG_SPARSE_IRQ=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_EMBEDDED=y
@@ -25,7 +24,6 @@ CONFIG_PS3_DISK=y
 CONFIG_PS3_ROM=y
 CONFIG_PS3_FLASH=y
 CONFIG_PS3_VRAM=m
-CONFIG_PS3_LPM=m
 # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
 CONFIG_HIGH_RES_TIMERS=y
 # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
@@ -53,8 +51,6 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_DIAG is not set
 CONFIG_IPV6=y
 CONFIG_BT=m
-CONFIG_BT_L2CAP=y
-CONFIG_BT_SCO=y
 CONFIG_BT_RFCOMM=m
 CONFIG_BT_RFCOMM_TTY=y
 CONFIG_BT_BNEP=m
@@ -63,7 +59,6 @@ CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=m
 CONFIG_BT_HCIBTUSB=m
 CONFIG_CFG80211=m
-# CONFIG_WIRELESS_EXT_SYSFS is not set
 CONFIG_MAC80211=m
 CONFIG_MAC80211_RC_PID=y
 # CONFIG_MAC80211_RC_MINSTREL is not set
@@ -181,7 +176,6 @@ CONFIG_DEBUG_INFO=y
 CONFIG_DEBUG_WRITECOUNT=y
 CONFIG_DEBUG_MEMORY_INIT=y
 CONFIG_DEBUG_LIST=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
 # CONFIG_FTRACE is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_CRYPTO_CCM=m
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 09/10] drivers/ps3: Fix checkpatch warnings in ps3av.c
From: Valentin Ilie @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: cbe-oss-dev, Geert Uytterhoeven, linuxppc-dev, Valentin Ilie
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

Signed-off-by: Valentin Ilie <valentin.ilie@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 drivers/ps3/ps3av.c |   24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/drivers/ps3/ps3av.c b/drivers/ps3/ps3av.c
index a409fa0..93d0a8b 100644
--- a/drivers/ps3/ps3av.c
+++ b/drivers/ps3/ps3av.c
@@ -338,7 +338,7 @@ int ps3av_do_pkt(u32 cid, u16 send_len, size_t usr_buf_size,
 	mutex_unlock(&ps3av->mutex);
 	return 0;
 
-      err:
+err:
 	mutex_unlock(&ps3av->mutex);
 	printk(KERN_ERR "%s: failed cid:%x res:%d\n", __func__, cid, res);
 	return res;
@@ -477,7 +477,6 @@ int ps3av_set_audio_mode(u32 ch, u32 fs, u32 word_bits, u32 format, u32 source)
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(ps3av_set_audio_mode);
 
 static int ps3av_set_videomode(void)
@@ -501,7 +500,7 @@ static void ps3av_set_videomode_packet(u32 id)
 
 	video_mode = &video_mode_table[id & PS3AV_MODE_MASK];
 
-	avb_param.num_of_video_pkt = PS3AV_AVB_NUM_VIDEO;	/* num of head */
+	avb_param.num_of_video_pkt = PS3AV_AVB_NUM_VIDEO; /* num of head */
 	avb_param.num_of_audio_pkt = 0;
 	avb_param.num_of_av_video_pkt = ps3av->av_hw_conf.num_of_hdmi +
 					ps3av->av_hw_conf.num_of_avmulti;
@@ -521,7 +520,7 @@ static void ps3av_set_videomode_packet(u32 id)
 #ifndef PS3AV_HDMI_YUV
 		if (ps3av->av_port[i] == PS3AV_CMD_AVPORT_HDMI_0 ||
 		    ps3av->av_port[i] == PS3AV_CMD_AVPORT_HDMI_1)
-			av_video_cs = RGB8;	/* use RGB for HDMI */
+			av_video_cs = RGB8; /* use RGB for HDMI */
 #endif
 		len += ps3av_cmd_set_av_video_cs(&avb_param.buf[len],
 						 ps3av->av_port[i],
@@ -590,8 +589,8 @@ static void ps3avd(struct work_struct *work)
 #define SHIFT_VESA	8
 
 static const struct {
-	unsigned mask : 19;
-	unsigned id :  4;
+	unsigned mask:19;
+	unsigned id:4;
 } ps3av_preferred_modes[] = {
 	{ PS3AV_RESBIT_WUXGA      << SHIFT_VESA, PS3AV_MODE_WUXGA   },
 	{ PS3AV_RESBIT_1920x1080P << SHIFT_60,   PS3AV_MODE_1080P60 },
@@ -667,7 +666,8 @@ static enum ps3av_mode_num ps3av_hdmi_get_id(struct ps3av_info_monitor *info)
 	return id;
 }
 
-static void ps3av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info *monitor_info)
+static void ps3av_monitor_info_dump(
+	const struct ps3av_pkt_av_get_monitor_info *monitor_info)
 {
 	const struct ps3av_info_monitor *info = &monitor_info->info;
 	const struct ps3av_info_audio *audio = info->audio;
@@ -717,8 +717,8 @@ static void ps3av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info *
 
 	/* audio block */
 	for (i = 0; i < info->num_of_audio_block; i++) {
-		pr_debug("audio[%d] type: %02x max_ch: %02x fs: %02x sbit: "
-			 "%02x\n",
+		pr_debug(
+			"audio[%d] type: %02x max_ch: %02x fs: %02x sbit: %02x\n",
 			 i, audio->type, audio->max_num_of_ch, audio->fs,
 			 audio->sbit);
 		audio++;
@@ -870,21 +870,18 @@ int ps3av_set_video_mode(int id)
 
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(ps3av_set_video_mode);
 
 int ps3av_get_auto_mode(void)
 {
 	return ps3av_auto_videomode(&ps3av->av_hw_conf);
 }
-
 EXPORT_SYMBOL_GPL(ps3av_get_auto_mode);
 
 int ps3av_get_mode(void)
 {
 	return ps3av ? ps3av->ps3av_mode : 0;
 }
-
 EXPORT_SYMBOL_GPL(ps3av_get_mode);
 
 /* get resolution by video_mode */
@@ -902,7 +899,6 @@ int ps3av_video_mode2res(u32 id, u32 *xres, u32 *yres)
 	*yres = video_mode_table[id].y;
 	return 0;
 }
-
 EXPORT_SYMBOL_GPL(ps3av_video_mode2res);
 
 /* mute */
@@ -911,7 +907,6 @@ int ps3av_video_mute(int mute)
 	return ps3av_set_av_video_mute(mute ? PS3AV_CMD_MUTE_ON
 					    : PS3AV_CMD_MUTE_OFF);
 }
-
 EXPORT_SYMBOL_GPL(ps3av_video_mute);
 
 /* mute analog output only */
@@ -935,7 +930,6 @@ int ps3av_audio_mute(int mute)
 	return ps3av_set_audio_mute(mute ? PS3AV_CMD_MUTE_ON
 					 : PS3AV_CMD_MUTE_OFF);
 }
-
 EXPORT_SYMBOL_GPL(ps3av_audio_mute);
 
 static int __devinit ps3av_probe(struct ps3_system_bus_device *dev)
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 07/10] powerpc/ps3: Remove MEMORY_HOTPLUG requirement
From: Andre Heider @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: cbe-oss-dev, Andre Heider, linuxppc-dev
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

The dependency on hotplug memory was removed, so
remove the dependency in the Kconfig.

Signed-off-by: Andre Heider <a.heider@gmail.com>
Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/powerpc/platforms/ps3/Kconfig |    1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/powerpc/platforms/ps3/Kconfig b/arch/powerpc/platforms/ps3/Kconfig
index 4210aaa..b72425a 100644
--- a/arch/powerpc/platforms/ps3/Kconfig
+++ b/arch/powerpc/platforms/ps3/Kconfig
@@ -7,7 +7,6 @@ config PPC_PS3
 	select USB_OHCI_BIG_ENDIAN_MMIO
 	select USB_ARCH_HAS_EHCI
 	select USB_EHCI_BIG_ENDIAN_MMIO
-	select MEMORY_HOTPLUG
 	select PPC_PCI_CHOICE
 	help
 	  This option enables support for the Sony PS3 game console
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 03/10] powerpc/ps3: Add highmem repository write routines
From: Geoff Levand @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: cbe-oss-dev, Andre Heider, linuxppc-dev, Nathan Whitehorn
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

Add routines to allow Linux based bootloaders to create and/or
modify highmem region info in the PS3 system repository where
it can be retrived by later boot stages.

Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/powerpc/platforms/ps3/platform.h   |    9 ++++
 arch/powerpc/platforms/ps3/repository.c |   74 +++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+)

diff --git a/arch/powerpc/platforms/ps3/platform.h b/arch/powerpc/platforms/ps3/platform.h
index 1a633ed..4012a86 100644
--- a/arch/powerpc/platforms/ps3/platform.h
+++ b/arch/powerpc/platforms/ps3/platform.h
@@ -189,6 +189,15 @@ int ps3_repository_read_region_total(u64 *region_total);
 int ps3_repository_read_mm_info(u64 *rm_base, u64 *rm_size,
 	u64 *region_total);
 
+int ps3_repository_write_highmem_region_count(unsigned int region_count);
+int ps3_repository_write_highmem_base(unsigned int region_index,
+	u64 highmem_base);
+int ps3_repository_write_highmem_size(unsigned int region_index,
+	u64 highmem_size);
+int ps3_repository_write_highmem_info(unsigned int region_index,
+	u64 highmem_base, u64 highmem_size);
+int ps3_repository_delete_highmem_info(unsigned int region_index);
+
 /* repository pme info */
 
 int ps3_repository_read_num_be(unsigned int *num_be);
diff --git a/arch/powerpc/platforms/ps3/repository.c b/arch/powerpc/platforms/ps3/repository.c
index b31142c..c73f3a6 100644
--- a/arch/powerpc/platforms/ps3/repository.c
+++ b/arch/powerpc/platforms/ps3/repository.c
@@ -1058,6 +1058,80 @@ static int write_node(u64 n1, u64 n2, u64 n3, u64 n4, u64 v1, u64 v2)
 	return 0;
 }
 
+int ps3_repository_write_highmem_region_count(unsigned int region_count)
+{
+	int result;
+	u64 v1 = (u64)region_count;
+
+	result = write_node(
+		make_first_field("highmem", 0),
+		make_field("region", 0),
+		make_field("count", 0),
+		0,
+		v1, 0);
+	return result;
+}
+
+int ps3_repository_write_highmem_base(unsigned int region_index,
+	u64 highmem_base)
+{
+	return write_node(
+		make_first_field("highmem", 0),
+		make_field("region", region_index),
+		make_field("base", 0),
+		0,
+		highmem_base, 0);
+}
+
+int ps3_repository_write_highmem_size(unsigned int region_index,
+	u64 highmem_size)
+{
+	return write_node(
+		make_first_field("highmem", 0),
+		make_field("region", region_index),
+		make_field("size", 0),
+		0,
+		highmem_size, 0);
+}
+
+int ps3_repository_write_highmem_info(unsigned int region_index,
+	u64 highmem_base, u64 highmem_size)
+{
+	int result;
+
+	result = ps3_repository_write_highmem_base(region_index, highmem_base);
+	return result ? result
+		: ps3_repository_write_highmem_size(region_index, highmem_size);
+}
+
+static int ps3_repository_delete_highmem_base(unsigned int region_index)
+{
+	return delete_node(
+		make_first_field("highmem", 0),
+		make_field("region", region_index),
+		make_field("base", 0),
+		0);
+}
+
+static int ps3_repository_delete_highmem_size(unsigned int region_index)
+{
+	return delete_node(
+		make_first_field("highmem", 0),
+		make_field("region", region_index),
+		make_field("size", 0),
+		0);
+}
+
+int ps3_repository_delete_highmem_info(unsigned int region_index)
+{
+	int result;
+
+	result = ps3_repository_delete_highmem_base(region_index);
+	result += ps3_repository_delete_highmem_size(region_index);
+
+	return result ? -1 : 0;
+}
+
 #endif /* defined(CONFIG_PS3_WRITE_REPOSITORY) */
 
 #if defined(DEBUG)
-- 
1.7.9.5

^ permalink raw reply related

* [PATCH 02/10] powerpc/ps3: Add PS3 repository write support
From: Geoff Levand @ 2012-04-25 19:19 UTC (permalink / raw)
  To: Benjamin Herrenschmidt
  Cc: cbe-oss-dev, Andre Heider, linuxppc-dev, Nathan Whitehorn
In-Reply-To: <cover.1335379330.git.geoff@infradead.org>

Add a new config option CONFIG_PS3_REPOSITORY_WRITE that
conditionally builds in support to create, write and delete
nodes in the PS3 system repository.

This support will allow Linux based bootloaders to manage data
in the system repository for use by later boot stages,

Signed-off-by: Geoff Levand <geoff@infradead.org>
---
 arch/powerpc/platforms/ps3/Kconfig      |   13 +++++++
 arch/powerpc/platforms/ps3/repository.c |   58 +++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+)

diff --git a/arch/powerpc/platforms/ps3/Kconfig b/arch/powerpc/platforms/ps3/Kconfig
index 476d9d9..4210aaa 100644
--- a/arch/powerpc/platforms/ps3/Kconfig
+++ b/arch/powerpc/platforms/ps3/Kconfig
@@ -88,6 +88,19 @@ config PS3_SYS_MANAGER
 	  This support is required for system control.  In
 	  general, all users will say Y or M.
 
+config PS3_REPOSITORY_WRITE
+	bool "PS3 Repository write support" if PS3_ADVANCED
+	depends on PPC_PS3
+	default n
+	help
+	  Enables support for writing to the PS3 System Repository.
+
+	  This support is intended for bootloaders that need to store data
+	  in the repository for later boot stages.
+
+	  If in doubt, say N here and reduce the size of the kernel by a
+	  small amount.
+
 config PS3_STORAGE
 	depends on PPC_PS3
 	tristate
diff --git a/arch/powerpc/platforms/ps3/repository.c b/arch/powerpc/platforms/ps3/repository.c
index 7bdfea3..b31142c 100644
--- a/arch/powerpc/platforms/ps3/repository.c
+++ b/arch/powerpc/platforms/ps3/repository.c
@@ -1002,6 +1002,64 @@ int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
 			    lpar, rights);
 }
 
+#if defined(CONFIG_PS3_REPOSITORY_WRITE)
+
+static int create_node(u64 n1, u64 n2, u64 n3, u64 n4, u64 v1, u64 v2)
+{
+	int result;
+
+	dump_node(0, n1, n2, n3, n4, v1, v2);
+
+	result = lv1_create_repository_node(n1, n2, n3, n4, v1, v2);
+
+	if (result) {
+		pr_devel("%s:%d: lv1_create_repository_node failed: %s\n",
+			__func__, __LINE__, ps3_result(result));
+		return -ENOENT;
+	}
+
+	return 0;
+}
+
+static int delete_node(u64 n1, u64 n2, u64 n3, u64 n4)
+{
+	int result;
+
+	dump_node(0, n1, n2, n3, n4, 0, 0);
+
+	result = lv1_delete_repository_node(n1, n2, n3, n4);
+
+	if (result) {
+		pr_devel("%s:%d: lv1_delete_repository_node failed: %s\n",
+			__func__, __LINE__, ps3_result(result));
+		return -ENOENT;
+	}
+
+	return 0;
+}
+
+static int write_node(u64 n1, u64 n2, u64 n3, u64 n4, u64 v1, u64 v2)
+{
+	int result;
+
+	result = create_node(n1, n2, n3, n4, v1, v2);
+
+	if (!result)
+		return 0;
+
+	result = lv1_write_repository_node(n1, n2, n3, n4, v1, v2);
+
+	if (result) {
+		pr_devel("%s:%d: lv1_write_repository_node failed: %s\n",
+			__func__, __LINE__, ps3_result(result));
+		return -ENOENT;
+	}
+
+	return 0;
+}
+
+#endif /* defined(CONFIG_PS3_WRITE_REPOSITORY) */
+
 #if defined(DEBUG)
 
 int ps3_repository_dump_resource_info(const struct ps3_repository_device *repo)
-- 
1.7.9.5

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox