From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pd0-f182.google.com (mail-pd0-f182.google.com [209.85.192.182]) by kanga.kvack.org (Postfix) with ESMTP id 30BD26B0069 for ; Sun, 26 Oct 2014 00:31:48 -0400 (EDT) Received: by mail-pd0-f182.google.com with SMTP id fp1so391557pdb.27 for ; Sat, 25 Oct 2014 21:31:47 -0700 (PDT) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org. [140.211.169.12]) by mx.google.com with ESMTPS id km1si7665556pbd.22.2014.10.25.21.31.46 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 25 Oct 2014 21:31:47 -0700 (PDT) Date: Sat, 25 Oct 2014 21:32:01 -0700 From: Andrew Morton Subject: Re: UKSM: What's maintainers think about it? Message-Id: <20141025213201.005762f9.akpm@linux-foundation.org> In-Reply-To: References: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: owner-linux-mm@kvack.org List-ID: To: Timofey Titovets Cc: Linux Kernel , linux-mm@kvack.org On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > Good time of day, people. > I try to find 'mm' subsystem specific people and lists, but list > linux-mm looks dead and mail archive look like deprecated. > If i must to sent this message to another list or add CC people, let me know. linux-mm@kvack.org is alive and well. > If questions are already asked (i can't find activity before), feel > free to kick me. > > The main questions: > 1. Somebody test it? I see many reviews about it. > I already port it to latest linux-next-git kernel and its work without issues. > http://pastebin.com/6FMuKagS > (if it matter, i can describe use cases and results, if somebody ask it) > > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > offtop: now i try to communicate with dev's on kerneldedup.org forum, > but i have problems with email verification and wait admin > registration approval. > (i already sent questions to > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > because him looks like team leader) > > 3. I just want collect feedbacks from linux maintainers team, if you > decide what UKSM not needed in kernel, all other comments (as i > understand) not matter. > > Like KSM, but better. > UKSM - Ultra Kernel Samepage Merging > http://kerneldedup.org/en/projects/uksm/introduction/ It's the first I've heard of it. No, as far as I know there has been no attempt to upstream UKSM. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qa0-f42.google.com (mail-qa0-f42.google.com [209.85.216.42]) by kanga.kvack.org (Postfix) with ESMTP id A5C25900021 for ; Tue, 28 Oct 2014 09:31:42 -0400 (EDT) Received: by mail-qa0-f42.google.com with SMTP id cs9so442077qab.29 for ; Tue, 28 Oct 2014 06:31:42 -0700 (PDT) Received: from mail.mandriva.com.br (mail.mandriva.com.br. [177.220.134.171]) by mx.google.com with ESMTP id m7si2299088qac.52.2014.10.28.06.31.39 for ; Tue, 28 Oct 2014 06:31:40 -0700 (PDT) Date: Tue, 28 Oct 2014 11:31:31 -0200 From: Marco A Benatto Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028133131.GA1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141025213201.005762f9.akpm@linux-foundation.org> Sender: owner-linux-mm@kvack.org List-ID: To: Andrew Morton Cc: Timofey Titovets , Linux Kernel , linux-mm@kvack.org Hi All, I'm not mantainer at all, but I've being using UKSM for a long time and remember to port it to 3.16 family once. UKSM seems good and stable and, at least for me, doesn't raised any errors. AFAIK the only limitation I know (maybe I has been fixed already) it isn't able to work together with zram stuff due to some race-conditions. Cheers, Marco A Benatto Mandriva OEM Developer On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > > > Good time of day, people. > > I try to find 'mm' subsystem specific people and lists, but list > > linux-mm looks dead and mail archive look like deprecated. > > If i must to sent this message to another list or add CC people, let me know. > > linux-mm@kvack.org is alive and well. > > > If questions are already asked (i can't find activity before), feel > > free to kick me. > > > > The main questions: > > 1. Somebody test it? I see many reviews about it. > > I already port it to latest linux-next-git kernel and its work without issues. > > http://pastebin.com/6FMuKagS > > (if it matter, i can describe use cases and results, if somebody ask it) > > > > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > > offtop: now i try to communicate with dev's on kerneldedup.org forum, > > but i have problems with email verification and wait admin > > registration approval. > > (i already sent questions to > > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > > because him looks like team leader) > > > > 3. I just want collect feedbacks from linux maintainers team, if you > > decide what UKSM not needed in kernel, all other comments (as i > > understand) not matter. > > > > Like KSM, but better. > > UKSM - Ultra Kernel Samepage Merging > > http://kerneldedup.org/en/projects/uksm/introduction/ > > It's the first I've heard of it. No, as far as I know there has been > no attempt to upstream UKSM. > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f44.google.com (mail-wg0-f44.google.com [74.125.82.44]) by kanga.kvack.org (Postfix) with ESMTP id 3A273900021 for ; Tue, 28 Oct 2014 10:00:28 -0400 (EDT) Received: by mail-wg0-f44.google.com with SMTP id y10so914693wgg.27 for ; Tue, 28 Oct 2014 07:00:27 -0700 (PDT) Received: from mail-wg0-x22b.google.com (mail-wg0-x22b.google.com. [2a00:1450:400c:c00::22b]) by mx.google.com with ESMTPS id q8si14542426wiv.49.2014.10.28.07.00.26 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 28 Oct 2014 07:00:26 -0700 (PDT) Received: by mail-wg0-f43.google.com with SMTP id n12so906294wgh.26 for ; Tue, 28 Oct 2014 07:00:26 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <20141028133131.GA1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> From: Timofey Titovets Date: Tue, 28 Oct 2014 16:59:45 +0300 Message-ID: Subject: Re: UKSM: What's maintainers think about it? Content-Type: text/plain; charset=UTF-8 Sender: owner-linux-mm@kvack.org List-ID: To: Marco A Benatto Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > Hi All, > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > to port it to 3.16 family once. > UKSM seems good and stable and, at least for me, doesn't raised any errors. > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > to work together with zram stuff due to some race-conditions. > > Cheers, > > Marco A Benatto > Mandriva OEM Developer > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 As i did find, uksm not conflicting with zram (or zswap - on my system). --- Offtop: Why i open up question about UKSM? May be we (as community, who want to help) can split out UKSM in "several patches" in independent git repo. For allowing maintainers to review this. Is it morally correct? UKSM code licensed under GPL and as i think we can feel free for port and adopt code (with indicating the author) Please, fix me if i mistake or miss something. This is just stream of my thoughts %_% --- > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: >> >> > Good time of day, people. >> > I try to find 'mm' subsystem specific people and lists, but list >> > linux-mm looks dead and mail archive look like deprecated. >> > If i must to sent this message to another list or add CC people, let me know. >> >> linux-mm@kvack.org is alive and well. So cool, thanks for adding 'mm' to CC. >> > If questions are already asked (i can't find activity before), feel >> > free to kick me. >> > >> > The main questions: >> > 1. Somebody test it? I see many reviews about it. >> > I already port it to latest linux-next-git kernel and its work without issues. >> > http://pastebin.com/6FMuKagS >> > (if it matter, i can describe use cases and results, if somebody ask it) >> > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, >> > but i have problems with email verification and wait admin >> > registration approval. >> > (i already sent questions to >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , >> > because him looks like team leader) >> > >> > 3. I just want collect feedbacks from linux maintainers team, if you >> > decide what UKSM not needed in kernel, all other comments (as i >> > understand) not matter. >> > >> > Like KSM, but better. >> > UKSM - Ultra Kernel Samepage Merging >> > http://kerneldedup.org/en/projects/uksm/introduction/ >> >> It's the first I've heard of it. No, as far as I know there has been >> no attempt to upstream UKSM. >> >> -- >> To unsubscribe, send a message with 'unsubscribe linux-mm' in >> the body to majordomo@kvack.org. For more info on Linux MM, >> see: http://www.linux-mm.org/ . >> Don't email: email@kvack.org -- Have a nice day, Timofey. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vc0-f173.google.com (mail-vc0-f173.google.com [209.85.220.173]) by kanga.kvack.org (Postfix) with ESMTP id 1E7F3900021 for ; Tue, 28 Oct 2014 12:08:18 -0400 (EDT) Received: by mail-vc0-f173.google.com with SMTP id le20so539953vcb.4 for ; Tue, 28 Oct 2014 09:08:17 -0700 (PDT) Received: from mail.mandriva.com.br (mail.mandriva.com.br. [177.220.134.171]) by mx.google.com with ESMTP id az6si999774vdd.39.2014.10.28.09.08.16 for ; Tue, 28 Oct 2014 09:08:16 -0700 (PDT) Date: Tue, 28 Oct 2014 14:08:12 -0200 From: Marco A Benatto Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028160812.GB1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: owner-linux-mm@kvack.org List-ID: To: Timofey Titovets Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: > 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > > Hi All, > > > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > > to port it to 3.16 family once. > > UKSM seems good and stable and, at least for me, doesn't raised any errors. > > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > > to work together with zram stuff due to some race-conditions. > > > > Cheers, > > > > Marco A Benatto > > Mandriva OEM Developer > > > > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 > As i did find, uksm not conflicting with zram (or zswap - on my system). Interesting, I've contacted the mantainers to send some patches in April and they said me this: "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so fast by zswap before UKSM/KSM can have a chance to merge those can be merged. So one of the ideas that make a direct solution is that: 1. sleep the processes who trigger the zswap 2. wake up the UKSM thread and adjust the scan parameters properly to make it sample the whole memory in a limited time to judge if there are any VMAs need to be worked on. 3. If there are those VMAs then merge them at full speed. if there not, sleep UKSM. 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy the requests. If there is enough memory then return and redo the memory allocation. 5. if there is not, then go on to do zswapping. This is just an outline of ONE of the solutions. It need to be carefully tweaked. Direct page reclaiming of zswap is a time sensitive code path , we cannot add too much overhead by doing this, otherwise it loses its meaning." > --- > Offtop: > Why i open up question about UKSM? > > May be we (as community, who want to help) can split out UKSM in > "several patches" in independent git repo. For allowing maintainers to > review this. > > Is it morally correct? > > UKSM code licensed under GPL and as i think we can feel free for port > and adopt code (with indicating the author) > > Please, fix me if i mistake or miss something. > This is just stream of my thoughts %_% If there's no problem in do this, and if you don't mind, you can help you out on this. Cheers, > --- > > > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > >> > >> > Good time of day, people. > >> > I try to find 'mm' subsystem specific people and lists, but list > >> > linux-mm looks dead and mail archive look like deprecated. > >> > If i must to sent this message to another list or add CC people, let me know. > >> > >> linux-mm@kvack.org is alive and well. > > So cool, thanks for adding 'mm' to CC. > > >> > If questions are already asked (i can't find activity before), feel > >> > free to kick me. > >> > > >> > The main questions: > >> > 1. Somebody test it? I see many reviews about it. > >> > I already port it to latest linux-next-git kernel and its work without issues. > >> > http://pastebin.com/6FMuKagS > >> > (if it matter, i can describe use cases and results, if somebody ask it) > >> > > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, > >> > but i have problems with email verification and wait admin > >> > registration approval. > >> > (i already sent questions to > >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > >> > because him looks like team leader) > >> > > >> > 3. I just want collect feedbacks from linux maintainers team, if you > >> > decide what UKSM not needed in kernel, all other comments (as i > >> > understand) not matter. > >> > > >> > Like KSM, but better. > >> > UKSM - Ultra Kernel Samepage Merging > >> > http://kerneldedup.org/en/projects/uksm/introduction/ > >> > >> It's the first I've heard of it. No, as far as I know there has been > >> no attempt to upstream UKSM. > >> > >> -- > >> To unsubscribe, send a message with 'unsubscribe linux-mm' in > >> the body to majordomo@kvack.org. For more info on Linux MM, > >> see: http://www.linux-mm.org/ . > >> Don't email: email@kvack.org > > -- > Have a nice day, > Timofey. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qg0-f47.google.com (mail-qg0-f47.google.com [209.85.192.47]) by kanga.kvack.org (Postfix) with ESMTP id 800FA900021 for ; Tue, 28 Oct 2014 13:40:19 -0400 (EDT) Received: by mail-qg0-f47.google.com with SMTP id j107so911947qga.34 for ; Tue, 28 Oct 2014 10:40:18 -0700 (PDT) Received: from mail.mandriva.com.br (mail.mandriva.com.br. [177.220.134.171]) by mx.google.com with ESMTP id m2si3341990qai.115.2014.10.28.10.40.16 for ; Tue, 28 Oct 2014 10:40:16 -0700 (PDT) Date: Tue, 28 Oct 2014 15:40:12 -0200 From: Marco A Benatto Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028174011.GC1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: owner-linux-mm@kvack.org List-ID: To: Timofey Titovets Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: > 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > > Hi All, > > > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > > to port it to 3.16 family once. > > UKSM seems good and stable and, at least for me, doesn't raised any errors. > > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > > to work together with zram stuff due to some race-conditions. > > > > Cheers, > > > > Marco A Benatto > > Mandriva OEM Developer > > > > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 > As i did find, uksm not conflicting with zram (or zswap - on my system). Interesting, I've contacted the mantainers to send some patches in April and they said me this: "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so fast by zswap before UKSM/KSM can have a chance to merge those can be merged. So one of the ideas that make a direct solution is that: 1. sleep the processes who trigger the zswap 2. wake up the UKSM thread and adjust the scan parameters properly to make it sample the whole memory in a limited time to judge if there are any VMAs need to be worked on. 3. If there are those VMAs then merge them at full speed. if there not, sleep UKSM. 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy the requests. If there is enough memory then return and redo the memory allocation. 5. if there is not, then go on to do zswapping. This is just an outline of ONE of the solutions. It need to be carefully tweaked. Direct page reclaiming of zswap is a time sensitive code path , we cannot add too much overhead by doing this, otherwise it loses its meaning." > --- > Offtop: > Why i open up question about UKSM? > > May be we (as community, who want to help) can split out UKSM in > "several patches" in independent git repo. For allowing maintainers to > review this. > > Is it morally correct? > > UKSM code licensed under GPL and as i think we can feel free for port > and adopt code (with indicating the author) > > Please, fix me if i mistake or miss something. > This is just stream of my thoughts %_% > --- If there's no problem on that and if you don't mind, I can help you on this. What dou you think? Cheers, > > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > >> > >> > Good time of day, people. > >> > I try to find 'mm' subsystem specific people and lists, but list > >> > linux-mm looks dead and mail archive look like deprecated. > >> > If i must to sent this message to another list or add CC people, let me know. > >> > >> linux-mm@kvack.org is alive and well. > > So cool, thanks for adding 'mm' to CC. > > >> > If questions are already asked (i can't find activity before), feel > >> > free to kick me. > >> > > >> > The main questions: > >> > 1. Somebody test it? I see many reviews about it. > >> > I already port it to latest linux-next-git kernel and its work without issues. > >> > http://pastebin.com/6FMuKagS > >> > (if it matter, i can describe use cases and results, if somebody ask it) > >> > > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, > >> > but i have problems with email verification and wait admin > >> > registration approval. > >> > (i already sent questions to > >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > >> > because him looks like team leader) > >> > > >> > 3. I just want collect feedbacks from linux maintainers team, if you > >> > decide what UKSM not needed in kernel, all other comments (as i > >> > understand) not matter. > >> > > >> > Like KSM, but better. > >> > UKSM - Ultra Kernel Samepage Merging > >> > http://kerneldedup.org/en/projects/uksm/introduction/ > >> > >> It's the first I've heard of it. No, as far as I know there has been > >> no attempt to upstream UKSM. > >> > >> -- > >> To unsubscribe, send a message with 'unsubscribe linux-mm' in > >> the body to majordomo@kvack.org. For more info on Linux MM, > >> see: http://www.linux-mm.org/ . > >> Don't email: email@kvack.org > > -- > Have a nice day, > Timofey. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com [74.125.82.51]) by kanga.kvack.org (Postfix) with ESMTP id 013B46B0080 for ; Tue, 28 Oct 2014 17:36:56 -0400 (EDT) Received: by mail-wg0-f51.google.com with SMTP id l18so497948wgh.38 for ; Tue, 28 Oct 2014 14:36:56 -0700 (PDT) Received: from mail-wi0-x231.google.com (mail-wi0-x231.google.com. [2a00:1450:400c:c05::231]) by mx.google.com with ESMTPS id hs8si4210329wib.102.2014.10.28.14.36.54 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 28 Oct 2014 14:36:55 -0700 (PDT) Received: by mail-wi0-f177.google.com with SMTP id ex7so2982932wid.16 for ; Tue, 28 Oct 2014 14:36:54 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <20141028174011.GC1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> <20141028174011.GC1445@sirus.conectiva> From: Timofey Titovets Date: Wed, 29 Oct 2014 00:36:14 +0300 Message-ID: Subject: Re: UKSM: What's maintainers think about it? Content-Type: multipart/mixed; boundary=001a1134cdee2fe6780506827203 Sender: owner-linux-mm@kvack.org List-ID: To: Marco A Benatto Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org --001a1134cdee2fe6780506827203 Content-Type: text/plain; charset=UTF-8 2014-10-28 20:40 GMT+03:00 Marco A Benatto : > On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: >> 2014-10-28 16:31 GMT+03:00 Marco A Benatto : >> > Hi All, >> > >> > I'm not mantainer at all, but I've being using UKSM for a long time and remember >> > to port it to 3.16 family once. >> > UKSM seems good and stable and, at least for me, doesn't raised any errors. >> > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able >> > to work together with zram stuff due to some race-conditions. >> > >> > Cheers, >> > >> > Marco A Benatto >> > Mandriva OEM Developer >> > >> >> http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 >> As i did find, uksm not conflicting with zram (or zswap - on my system). > > Interesting, > > I've contacted the mantainers to send some patches in April and they said me this: > > "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so > fast by zswap before UKSM/KSM can have a chance to merge those can be merged. > > So one of the ideas that make a direct solution is that: > 1. sleep the processes who trigger the zswap > 2. wake up the UKSM thread and adjust the scan parameters properly to make it > sample the whole memory in a limited time to judge if there are any VMAs need to > be worked on. > 3. If there are those VMAs then merge them at full speed. if there not, > sleep UKSM. > 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy > the requests. If there is enough memory then return and redo the memory > allocation. > 5. if there is not, then go on to do zswapping. > > This is just an outline of ONE of the solutions. It need to be carefully > tweaked. Direct page reclaiming of zswap is a time sensitive code path > , we cannot add too much overhead by doing this, > otherwise it loses its meaning." > >> --- >> Offtop: >> Why i open up question about UKSM? >> >> May be we (as community, who want to help) can split out UKSM in >> "several patches" in independent git repo. For allowing maintainers to >> review this. >> >> Is it morally correct? >> >> UKSM code licensed under GPL and as i think we can feel free for port >> and adopt code (with indicating the author) >> >> Please, fix me if i mistake or miss something. >> This is just stream of my thoughts %_% >> --- > > If there's no problem on that and if you don't mind, I can help you on this. > What dou you think? So cool, lets do it =3 https://github.com/Nefelim4ag/linux-uksm I've created a temporary git-repository. I am trying to split one big patch into several independent patches. Patch is attached to e-mail. Perhaps we can move conversation to personal emails(for you - to working)? > Cheers, > > Marco A Benatto > Mandriva OEM Developer -- Have a nice day, Timofey. --001a1134cdee2fe6780506827203 Content-Type: text/x-patch; charset=US-ASCII; name="0002-uksm-0.1.2.3-for-linux-next-20141016.ge.1.patch" Content-Disposition: attachment; filename="0002-uksm-0.1.2.3-for-linux-next-20141016.ge.1.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i1trxlhu0 RnJvbSAxM2MyZDE5MTYxODllNmQ2YmQyNTA3Y2RiMWM3MmY0NmM0ODM5ZGI1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaW1vZmV5IFRpdG92ZXRzIDxuZWZlbGltNGFnQGdtYWlsLmNv bT4KRGF0ZTogRnJpLCAxNyBPY3QgMjAxNCAxMjozMjowNCArMDMwMApTdWJqZWN0OiBbUEFUQ0hd IHVrc20tMC4xLjIuMy1mb3ItbGludXgtbmV4dC0yMDE0MTAxNi5nZS4xCgpTaWduZWQtb2ZmLWJ5 OiBUaW1vZmV5IFRpdG92ZXRzIDxuZWZlbGltNGFnQGdtYWlsLmNvbT4KLS0tCiBEb2N1bWVudGF0 aW9uL3ZtLzAwLUlOREVYICAgICB8ICAgIDIgKwogRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dCAg ICAgfCAgIDU4ICsKIGZzL2V4ZWMuYyAgICAgICAgICAgICAgICAgICAgIHwgICAgNCArLQogZnMv cHJvYy9tZW1pbmZvLmMgICAgICAgICAgICAgfCAgICA2ICsKIGluY2x1ZGUvYXNtLWdlbmVyaWMv cGd0YWJsZS5oIHwgICAxNyArLQogaW5jbHVkZS9saW51eC9rc20uaCAgICAgICAgICAgfCAgIDQ0 ICstCiBpbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggICAgICB8ICAgIDMgKwogaW5jbHVkZS9saW51 eC9tbXpvbmUuaCAgICAgICAgfCAgICA1ICstCiBpbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVlLmgg ICB8ICAgNzcgKwogaW5jbHVkZS9saW51eC91a3NtLmggICAgICAgICAgfCAgMTQ2ICsrCiBrZXJu ZWwvZm9yay5jICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIGxpYi9NYWtlZmlsZSAgICAgICAg ICAgICAgICAgIHwgICAgMiArLQogbGliL3NyYWRpeC10cmVlLmMgICAgICAgICAgICAgfCAgNDc2 ICsrKysKIG1tL0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICAyNiArCiBtbS9NYWtlZmls ZSAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KIG1tL21lbW9yeS5jICAgICAgICAgICAgICAg ICAgIHwgICA0MSArLQogbW0vbW1hcC5jICAgICAgICAgICAgICAgICAgICAgfCAgIDQ1ICstCiBt bS9ybWFwLmMgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KIG1tL3Vrc20uYyAgICAgICAg ICAgICAgICAgICAgIHwgNTUzMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogbW0vdm1zdGF0LmMgICAgICAgICAgICAgICAgICAgfCAgICAzICsKIDIwIGZpbGVzIGNo YW5nZWQsIDY0NjUgaW5zZXJ0aW9ucygrKSwgMzIgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAx MDA2NDQgRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dAogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1 ZGUvbGludXgvc3JhZGl4LXRyZWUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgv dWtzbS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL3NyYWRpeC10cmVlLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBtbS91a3NtLmMKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtLzAwLUlOREVY IGIvRG9jdW1lbnRhdGlvbi92bS8wMC1JTkRFWAppbmRleCAwODFjNDk3Li43NWJkZTNkIDEwMDY0 NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vdm0v MDAtSU5ERVgKQEAgLTE2LDYgKzE2LDggQEAgaHdwb2lzb24udHh0CiAJLSBleHBsYWlucyB3aGF0 IGh3cG9pc29uIGlzCiBrc20udHh0CiAJLSBob3cgdG8gdXNlIHRoZSBLZXJuZWwgU2FtZXBhZ2Ug TWVyZ2luZyBmZWF0dXJlLgordWtzbS50eHQKKwktIEludHJvZHVjdGlvbiB0byBVbHRyYSBLU00K IG51bWEKIAktIGluZm9ybWF0aW9uIGFib3V0IE5VTUEgc3BlY2lmaWMgY29kZSBpbiB0aGUgTGlu dXggdm0uCiBudW1hX21lbW9yeV9wb2xpY3kudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L3ZtL3Vrc20udHh0IGIvRG9jdW1lbnRhdGlvbi92bS91a3NtLnR4dApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4wOGJkNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRh dGlvbi92bS91a3NtLnR4dApAQCAtMCwwICsxLDU4IEBACitUaGUgVWx0cmEgS2VybmVsIFNhbWVw YWdlIE1lcmdpbmcgZmVhdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorLyoKKyAqIFVsdHJhIEtTTS4gQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgTmFp IFhpYQorICoKKyAqIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgdXBvbiBLU00uIFNvbWUgYmFzaWMg ZGF0YSBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcworICogYXJlIGJvcnJvd2VkIGZyb20ga3NtLmMg LgorICoKKyAqIEl0cyBuZXcgZmVhdHVyZXM6CisgKiAxLiBGdWxsIHN5c3RlbSBzY2FuOgorICog ICAgICBJdCBhdXRvbWF0aWNhbGx5IHNjYW5zIGFsbCB1c2VyIHByb2Nlc3NlcycgYW5vbnltb3Vz IFZNQXMuIEtlcm5lbC11c2VyCisgKiAgICAgIGludGVyYWN0aW9uIHRvIHN1Ym1pdCBhIG1lbW9y eSBhcmVhIHRvIEtTTSBpcyBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIDIuIFJpY2ggYXJlYSBk ZXRlY3Rpb246CisgKiAgICAgIEl0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyByaWNoIGFyZWFzIGNv bnRhaW5pbmcgYWJ1bmRhbnQgZHVwbGljYXRlZAorICogICAgICBwYWdlcyBiYXNlZC4gUmljaCBh cmVhcyBhcmUgZ2l2ZW4gYSBmdWxsIHNjYW4gc3BlZWQuIFBvb3IgYXJlYXMgYXJlCisgKiAgICAg IHNhbXBsZWQgYXQgYSByZWFzb25hYmxlIHNwZWVkIHdpdGggdmVyeSBsb3cgQ1BVIGNvbnN1bXB0 aW9uLgorICoKKyAqIDMuIFVsdHJhIFBlci1wYWdlIHNjYW4gc3BlZWQgaW1wcm92ZW1lbnQ6Cisg KiAgICAgIEEgbmV3IGhhc2ggYWxnb3JpdGhtIGlzIHByb3Bvc2VkLiBBcyBhIHJlc3VsdCwgb24g YSBtYWNoaW5lIHdpdGgKKyAqICAgICAgQ29yZShUTSkyIFF1YWQgUTkzMDAgQ1BVIGluIDMyLWJp dCBtb2RlIGFuZCA4MDBNSFogRERSMiBtYWluIG1lbW9yeSwgaXQKKyAqICAgICAgY2FuIHNjYW4g bWVtb3J5IGFyZWFzIHRoYXQgZG9lcyBub3QgY29udGFpbiBkdXBsaWNhdGVkIHBhZ2VzIGF0IHNw ZWVkIG9mCisgKiAgICAgIDYyN01CL3NlYyB+IDI0NDVNQi9zZWMgYW5kIGNhbiBtZXJnZSBkdXBs aWNhdGVkIGFyZWFzIGF0IHNwZWVkIG9mCisgKiAgICAgIDQ3N01CL3NlYyB+IDkyM01CL3NlYy4K KyAqCisgKiA0LiBUaHJhc2hpbmcgYXJlYSBhdm9pZGFuY2U6CisgKiAgICAgIFRocmFzaGluZyBh cmVhKGFuIFZNQSB0aGF0IGhhcyBmcmVxdWVudCBLc20gcGFnZSBicmVhay1vdXQpIGNhbiBiZQor ICogICAgICBmaWx0ZXJlZCBvdXQuIE15IGJlbmNobWFyayBzaG93cyBpdCdzIG1vcmUgZWZmaWNp ZW50IHRoYW4gS1NNJ3MgcGVyLXBhZ2UKKyAqICAgICAgaGFzaCB2YWx1ZSBiYXNlZCB2b2xhdGls ZSBwYWdlIGRldGVjdGlvbi4KKyAqCisgKgorICogNS4gTWlzYyBjaGFuZ2VzIHVwb24gS1NNOgor ICogICAgICAqIEl0IGhhcyBhIGZ1bGx5IHg4Ni1vcGl0bWl6ZWQgbWVtY21wIGRlZGljYXRlZCBm b3IgNC1ieXRlLWFsaWduZWQgcGFnZQorICogICAgICAgIGNvbXBhcmlzb24uIEl0J3MgbXVjaCBm YXN0ZXIgdGhhbiBkZWZhdWx0IEMgdmVyc2lvbiBvbiB4ODYuCisgKiAgICAgICogcm1hcF9pdGVt IG5vdyBoYXMgYW4gc3RydWN0ICpwYWdlIG1lbWJlciB0byBsb29zZWx5IGNhY2hlIGEKKyAqICAg ICAgICBhZGRyZXNzLS0+cGFnZSBtYXBwaW5nLCB3aGljaCByZWR1Y2VzIHRvbyBtdWNoIHRpbWUt Y29zdGx5CisgKiAgICAgICAgZm9sbG93X3BhZ2UoKS4KKyAqICAgICAgKiBUaGUgVk1BIGNyZWF0 aW9uL2V4aXQgcHJvY2VkdXJlcyBhcmUgaG9va2VkIHRvIGxldCB0aGUgVWx0cmEgS1NNIGtub3cu CisgKiAgICAgICogdHJ5X3RvX21lcmdlX3R3b19wYWdlcygpIG5vdyBjYW4gcmV2ZXJ0IGEgcHRl IGlmIGl0IGZhaWxzLiBObyBicmVha18KKyAqICAgICAgICBrc20gaXMgbmVlZGVkIGZvciB0aGlz IGNhc2UuCisgKgorICogNi4gRnVsbCBaZXJvIFBhZ2UgY29uc2lkZXJhdGlvbihjb250cmlidXRl ZCBieSBGaWdvIFpoYW5nKQorICogICAgTm93IHVrc21kIGNvbnNpZGVyIGZ1bGwgemVybyBwYWdl cyBhcyBzcGVjaWFsIHBhZ2VzIGFuZCBtZXJnZSB0aGVtIHRvIGFuCisgKiAgICBzcGVjaWFsIHVu c3dhcHBhYmxlIHVrc20gemVybyBwYWdlLgorICovCisKK0NoYW5nZUxvZzoKKworMjAxMi0wNS0w NSBUaGUgY3JlYXRpb24gb2YgdGhpcyBEb2MKKzIwMTItMDUtMDggVUtTTSAwLjEuMS4xIGxpYmMg Y3Jhc2ggYnVnIGZpeCwgYXBpIGNsZWFuIHVwLCBkb2MgY2xlYW4gdXAuCisyMDEyLTA1LTI4IFVL U00gMC4xLjEuMiBidWcgZml4IHJlbGVhc2UKKzIwMTItMDYtMjYgVUtTTSAwLjEuMi1iZXRhMSBm aXJzdCBiZXRhIHJlbGVhc2UgZm9yIDAuMS4yCisyMDEyLTA3LTIgIFVLU00gMC4xLjItYmV0YTIK KzIwMTItMDctMTAgVUtTTSAwLjEuMi1iZXRhMworMjAxMi0wNy0yNiBVS1NNIDAuMS4yIEZpbmUg Z3JhaW5lZCBzcGVlZCBjb250cm9sLCBtb3JlIHNjYW4gb3B0aW1pemF0aW9uLgorMjAxMi0xMC0x MyBVS1NNIDAuMS4yLjEgQnVnIGZpeGVzLgorMjAxMi0xMi0zMSBVS1NNIDAuMS4yLjIgTWlub3Ig YnVnIGZpeGVzCisyMDE0LTA3LTAyIFVLU00gMC4xLjIuMyBGaXggYSAiIF9fdGhpc19jcHVfcmVh ZCgpIGluIHByZWVtcHRpYmxlIGJ1ZyIKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMu YwppbmRleCA3MzAyYjc1Li44NGIwZGY1IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMv ZXhlYy5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBjdXJyZW50LT5leGVjdXRhYmxlIGlzIG9ubHkg dXNlZCBieSB0aGUgcHJvY2ZzLiAgVGhpcyBhbGxvd3MgYSBkaXNwYXRjaAogICogdGFibGUgdG8g Y2hlY2sgZm9yIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzICBvZiBiaW5hcnkgZm9ybWF0cy4gIFdl IGtlZXAKICAqIHRyeWluZyB1bnRpbCB3ZSByZWNvZ25pemUgdGhlIGZpbGUgb3Igd2UgcnVuIG91 dCBvZiBzdXBwb3J0ZWQgYmluYXJ5Ci0gKiBmb3JtYXRzLiAKKyAqIGZvcm1hdHMuCiAgKi8KIAog I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51 eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlIDxsaW51eC9j b21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rc20uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNz Lmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC0xMTI4LDYgKzExMjksNyBAQCB2 b2lkIHNldHVwX25ld19leGVjKHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQogCS8qIEFuIGV4 ZWMgY2hhbmdlcyBvdXIgZG9tYWluLiBXZSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHRocmVh ZAogCSAgIGdyb3VwICovCiAJY3VycmVudC0+c2VsZl9leGVjX2lkKys7CisKIAlmbHVzaF9zaWdu YWxfaGFuZGxlcnMoY3VycmVudCwgMCk7CiAJZG9fY2xvc2Vfb25fZXhlYyhjdXJyZW50LT5maWxl cyk7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL21lbWluZm8uYyBiL2ZzL3Byb2MvbWVtaW5mby5j CmluZGV4IGFhMWVlZTAuLjVhOTE0OWMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbWVtaW5mby5jCisr KyBiL2ZzL3Byb2MvbWVtaW5mby5jCkBAIC0xMjEsNiArMTIxLDkgQEAgc3RhdGljIGludCBtZW1p bmZvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJCSJTVW5yZWNsYWlt OiAgICAgJThsdSBrQlxuIgogCQkiS2VybmVsU3RhY2s6ICAgICU4bHUga0JcbiIKIAkJIlBhZ2VU YWJsZXM6ICAgICAlOGx1IGtCXG4iCisjaWZkZWYgQ09ORklHX1VLU00KKwkJIktzbVplcm9QYWdl czogICAlOGx1IGtCXG4iCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUVVJQ0tMSVNUCiAJCSJRdWlj a2xpc3RzOiAgICAgJThsdSBrQlxuIgogI2VuZGlmCkBAIC0xNzUsNiArMTc4LDkgQEAgc3RhdGlj IGludCBtZW1pbmZvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiAJCUso Z2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9VTlJFQ0xBSU1BQkxFKSksCiAJCWdsb2JhbF9wYWdl X3N0YXRlKE5SX0tFUk5FTF9TVEFDSykgKiBUSFJFQURfU0laRSAvIDEwMjQsCiAJCUsoZ2xvYmFs X3BhZ2Vfc3RhdGUoTlJfUEFHRVRBQkxFKSksCisjaWZkZWYgQ09ORklHX1VLU00KKwkJSyhnbG9i YWxfcGFnZV9zdGF0ZShOUl9VS1NNX1pFUk9fUEFHRVMpKSwKKyNlbmRpZgogI2lmZGVmIENPTkZJ R19RVUlDS0xJU1QKIAkJSyhxdWlja2xpc3RfdG90YWxfc2l6ZSgpKSwKICNlbmRpZgpkaWZmIC0t Z2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmlj L3BndGFibGUuaAppbmRleCA3NTJlMzBkLi4xZTdjODI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Fz bS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApA QCAtNTM3LDEyICs1MzcsMjUgQEAgZXh0ZXJuIHZvaWQgdW50cmFja19wZm4oc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJdW5zaWduZWQgbG9uZyBzaXpl KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VLU00KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Vr c21femVyb19wZm4odW5zaWduZWQgbG9uZyBwZm4pCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcg dWtzbV96ZXJvX3BmbjsKKyAgICAgICAgcmV0dXJuIHBmbiA9PSB1a3NtX3plcm9fcGZuOworfQor I2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3Vrc21femVyb19wZm4odW5zaWduZWQgbG9uZyBw Zm4pCit7CisgICAgICAgIHJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBfX0hBVkVfQ09M T1JfWkVST19QQUdFCiBzdGF0aWMgaW5saW5lIGludCBpc196ZXJvX3Bmbih1bnNpZ25lZCBsb25n IHBmbikKIHsKIAlleHRlcm4gdW5zaWduZWQgbG9uZyB6ZXJvX3BmbjsKIAl1bnNpZ25lZCBsb25n IG9mZnNldF9mcm9tX3plcm9fcGZuID0gcGZuIC0gemVyb19wZm47Ci0JcmV0dXJuIG9mZnNldF9m cm9tX3plcm9fcGZuIDw9ICh6ZXJvX3BhZ2VfbWFzayA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4g b2Zmc2V0X2Zyb21femVyb19wZm4gPD0gKHplcm9fcGFnZV9tYXNrID4+IFBBR0VfU0hJRlQpIHx8 IGlzX3Vrc21femVyb19wZm4ocGZuKTsKIH0KIAogI2RlZmluZSBteV96ZXJvX3BmbihhZGRyKQlw YWdlX3RvX3BmbihaRVJPX1BBR0UoYWRkcikpCkBAIC01NTEsNyArNTY0LDcgQEAgc3RhdGljIGlu bGluZSBpbnQgaXNfemVyb19wZm4odW5zaWduZWQgbG9uZyBwZm4pCiBzdGF0aWMgaW5saW5lIGlu dCBpc196ZXJvX3Bmbih1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlleHRlcm4gdW5zaWduZWQgbG9u ZyB6ZXJvX3BmbjsKLQlyZXR1cm4gcGZuID09IHplcm9fcGZuOworCXJldHVybiAocGZuID09IHpl cm9fcGZuKSB8fCAoaXNfdWtzbV96ZXJvX3BmbihwZm4pKTsKIH0KIAogc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIG15X3plcm9fcGZuKHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBh L2luY2x1ZGUvbGludXgva3NtLmggYi9pbmNsdWRlL2xpbnV4L2tzbS5oCmluZGV4IDNiZTZiYjEu LjUxNTU3ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3NtLmgKKysrIGIvaW5jbHVkZS9s aW51eC9rc20uaApAQCAtMTksMjEgKzE5LDYgQEAgc3RydWN0IG1lbV9jZ3JvdXA7CiAjaWZkZWYg Q09ORklHX0tTTQogaW50IGtzbV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1 bnNpZ25lZCBsb25nIHN0YXJ0LAogCQl1bnNpZ25lZCBsb25nIGVuZCwgaW50IGFkdmljZSwgdW5z aWduZWQgbG9uZyAqdm1fZmxhZ3MpOwotaW50IF9fa3NtX2VudGVyKHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tKTsKLXZvaWQgX19rc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci0KLXN0YXRpYyBp bmxpbmUgaW50IGtzbV9mb3JrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbW1fc3RydWN0 ICpvbGRtbSkKLXsKLQlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJMRSwgJm9sZG1tLT5mbGFn cykpCi0JCXJldHVybiBfX2tzbV9lbnRlcihtbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgdm9pZCBrc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlpZiAodGVzdF9i aXQoTU1GX1ZNX01FUkdFQUJMRSwgJm1tLT5mbGFncykpCi0JCV9fa3NtX2V4aXQobW0pOwotfQog CiAvKgogICogQSBLU00gcGFnZSBpcyBvbmUgb2YgdGhvc2Ugd3JpdGUtcHJvdGVjdGVkICJzaGFy ZWQgcGFnZXMiIG9yICJtZXJnZWQgcGFnZXMiCkBAIC03Niw2ICs2MSwzMyBAQCBzdHJ1Y3QgcGFn ZSAqa3NtX21pZ2h0X25lZWRfdG9fY29weShzdHJ1Y3QgcGFnZSAqcGFnZSwKIGludCBybWFwX3dh bGtfa3NtKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3Yyk7 CiB2b2lkIGtzbV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdl ICpvbGRwYWdlKTsKIAorI2lmZGVmIENPTkZJR19LU01fTEVHQUNZCitpbnQgX19rc21fZW50ZXIo c3RydWN0IG1tX3N0cnVjdCAqbW0pOwordm9pZCBfX2tzbV9leGl0KHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tKTsKK3N0YXRpYyBpbmxpbmUgaW50IGtzbV9mb3JrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBz dHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSkKK3sKKwlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJM RSwgJm9sZG1tLT5mbGFncykpCisJCXJldHVybiBfX2tzbV9lbnRlcihtbSk7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrc21fZXhpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSkK K3sKKwlpZiAodGVzdF9iaXQoTU1GX1ZNX01FUkdFQUJMRSwgJm1tLT5mbGFncykpCisJCV9fa3Nt X2V4aXQobW0pOworfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19VS1NNKQorc3RhdGljIGlubGlu ZSBpbnQga3NtX2Zvcmsoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9s ZG1tKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3NtX2V4aXQoc3Ry dWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisjZW5kaWYgLyogIUNPTkZJR19VS1NNICovCisKICNl bHNlICAvKiAhQ09ORklHX0tTTSAqLwogCiBzdGF0aWMgaW5saW5lIGludCBrc21fZm9yayhzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0pCkBAIC0xMjMsNCArMTM1 LDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGtzbV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5l d3BhZ2UsIHN0cnVjdCBwYWdlICpvbGRwYWdlKQogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KICNl bmRpZiAvKiAhQ09ORklHX0tTTSAqLwogCisjaW5jbHVkZSA8bGludXgvdWtzbS5oPgorCiAjZW5k aWYgLyogX19MSU5VWF9LU01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBl cy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IDZlMGIyODYuLmViZDYyNDMgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21t X3R5cGVzLmgKQEAgLTMwOCw2ICszMDgsOSBAQCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgewogI2lm ZGVmIENPTkZJR19OVU1BCiAJc3RydWN0IG1lbXBvbGljeSAqdm1fcG9saWN5OwkvKiBOVU1BIHBv bGljeSBmb3IgdGhlIFZNQSAqLwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1VLU00KKwlzdHJ1Y3Qg dm1hX3Nsb3QgKnVrc21fdm1hX3Nsb3Q7CisjZW5kaWYKIH07CiAKIHN0cnVjdCBjb3JlX3RocmVh ZCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9t bXpvbmUuaAppbmRleCA0OGJmMTJlLi5kYTMxYWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4 L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTE1Nyw2ICsxNTcsOSBA QCBlbnVtIHpvbmVfc3RhdF9pdGVtIHsKIAlXT1JLSU5HU0VUX05PREVSRUNMQUlNLAogCU5SX0FO T05fVFJBTlNQQVJFTlRfSFVHRVBBR0VTLAogCU5SX0ZSRUVfQ01BX1BBR0VTLAorI2lmZGVmIENP TkZJR19VS1NNCisJTlJfVUtTTV9aRVJPX1BBR0VTLAorI2VuZGlmCiAJTlJfVk1fWk9ORV9TVEFU X0lURU1TIH07CiAKIC8qCkBAIC04NTYsNyArODU5LDcgQEAgc3RhdGljIGlubGluZSBpbnQgaXNf aGlnaG1lbV9pZHgoZW51bSB6b25lX3R5cGUgaWR4KQogfQogCiAvKioKLSAqIGlzX2hpZ2htZW0g LSBoZWxwZXIgZnVuY3Rpb24gdG8gcXVpY2tseSBjaGVjayBpZiBhIHN0cnVjdCB6b25lIGlzIGEg CisgKiBpc19oaWdobWVtIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHF1aWNrbHkgY2hlY2sgaWYgYSBz dHJ1Y3Qgem9uZSBpcyBhCiAgKiAgICAgICAgICAgICAgaGlnaG1lbSB6b25lIG9yIG5vdC4gIFRo aXMgaXMgYW4gYXR0ZW1wdCB0byBrZWVwIHJlZmVyZW5jZXMKICAqICAgICAgICAgICAgICB0byBa T05FX3tETUEvTk9STUFML0hJR0hNRU0vZXRjfSBpbiBnZW5lcmFsIGNvZGUgdG8gYSBtaW5pbXVt LgogICogQHpvbmUgLSBwb2ludGVyIHRvIHN0cnVjdCB6b25lIHZhcmlhYmxlCmRpZmYgLS1naXQg YS9pbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVlLmggYi9pbmNsdWRlL2xpbnV4L3NyYWRpeC10cmVl LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MGZkYgotLS0gL2Rldi9u dWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3JhZGl4LXRyZWUuaApAQCAtMCwwICsxLDc3IEBACisj aWZuZGVmIF9MSU5VWF9TUkFESVhfVFJFRV9ICisjZGVmaW5lIF9MSU5VWF9TUkFESVhfVFJFRV9I CisKKworI2RlZmluZSBJTklUX1NSQURJWF9UUkVFKHJvb3QsIG1hc2spCQkJCQlcCitkbyB7CQkJ CQkJCQkJXAorCShyb290KS0+aGVpZ2h0ID0gMDsJCQkJCQlcCisJKHJvb3QpLT5nZnBfbWFzayA9 IChtYXNrKTsJCQkJCVwKKwkocm9vdCktPnJub2RlID0gTlVMTDsJCQkJCQlcCit9IHdoaWxlICgw KQorCisjZGVmaW5lIFVMT05HX0JJVFMJKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisjZGVm aW5lIFNSQURJWF9UUkVFX0lOREVYX0JJVFMgICg4IC8qIENIQVJfQklUICovICogc2l6ZW9mKHVu c2lnbmVkIGxvbmcpKQorLy8jZGVmaW5lIFNSQURJWF9UUkVFX01BUF9TSElGVAk2CisvLyNkZWZp bmUgU1JBRElYX1RSRUVfTUFQX1NJWkUJKDFVTCA8PCBTUkFESVhfVFJFRV9NQVBfU0hJRlQpCisv LyNkZWZpbmUgU1JBRElYX1RSRUVfTUFQX01BU0sJKFNSQURJWF9UUkVFX01BUF9TSVpFLTEpCisK K3N0cnVjdCBzcmFkaXhfdHJlZV9ub2RlIHsKKwl1bnNpZ25lZCBpbnQJaGVpZ2h0OwkJLyogSGVp Z2h0IGZyb20gdGhlIGJvdHRvbSAqLworCXVuc2lnbmVkIGludAljb3VudDsJCQorCXVuc2lnbmVk IGludAlmdWxsczsJCS8qIE51bWJlciBvZiBmdWxsIHN1YmxldmVsIHRyZWVzICovIAorCXN0cnVj dCBzcmFkaXhfdHJlZV9ub2RlICpwYXJlbnQ7CisJdm9pZCAqc3RvcmVzWzBdOworfTsKKworLyog QSBzaW1wbGUgcmFkaXggdHJlZSBpbXBsZW1lbnRhdGlvbiAqLworc3RydWN0IHNyYWRpeF90cmVl X3Jvb3QgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBoZWlnaHQ7CisgICAgICAg IHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpybm9kZTsKKworCS8qIFdoZXJlIGZvdW5kIHRvIGhh dmUgYXZhaWxhYmxlIGVtcHR5IHN0b3JlcyBpbiBpdHMgc3VibGV2ZWxzICovCisgICAgICAgIHN0 cnVjdCBzcmFkaXhfdHJlZV9ub2RlICplbnRlcl9ub2RlOworCXVuc2lnbmVkIGludCBzaGlmdDsK Kwl1bnNpZ25lZCBpbnQgc3RvcmVzX3NpemU7CisJdW5zaWduZWQgaW50IG1hc2s7CisJdW5zaWdu ZWQgbG9uZyBtaW47CS8qIFRoZSBmaXJzdCBob2xlIGluZGV4ICovCisJdW5zaWduZWQgbG9uZyBu dW07CisJLy91bnNpZ25lZCBsb25nICpoZWlnaHRfdG9fbWF4aW5kZXg7CisKKwkvKiBIb3cgdGhl IG5vZGUgaXMgYWxsb2NhdGVkIGFuZCBmcmVlZC4gKi8KKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqKCphbGxvYykodm9pZCk7IAorCXZvaWQgKCpmcmVlKShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqbm9kZSk7CisKKwkvKiBXaGVuIGEgbmV3IG5vZGUgaXMgYWRkZWQgYW5kIHJlbW92ZWQgKi8K Kwl2b2lkICgqZXh0ZW5kKShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqcGFyZW50LCBzdHJ1Y3Qg c3JhZGl4X3RyZWVfbm9kZSAqY2hpbGQpOworCXZvaWQgKCphc3NpZ24pKHN0cnVjdCBzcmFkaXhf dHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbmRleCwgdm9pZCAqaXRlbSk7CisJdm9pZCAoKnJt KShzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZSwgdW5zaWduZWQgb2Zmc2V0KTsKK307CisK K3N0cnVjdCBzcmFkaXhfdHJlZV9wYXRoIHsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9k ZTsKKwlpbnQgb2Zmc2V0OworfTsKKworc3RhdGljIGlubGluZSAKK3ZvaWQgaW5pdF9zcmFkaXhf dHJlZV9yb290KHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIHNo aWZ0KQoreworCXJvb3QtPmhlaWdodCA9IDA7CisJcm9vdC0+cm5vZGUgPSBOVUxMOworCXJvb3Qt PnNoaWZ0ID0gc2hpZnQ7CisJcm9vdC0+c3RvcmVzX3NpemUgPSAxVUwgPDwgc2hpZnQ7CisJcm9v dC0+bWFzayA9IHJvb3QtPnN0b3Jlc19zaXplIC0gMTsKK30KKworCitleHRlcm4gdm9pZCAqc3Jh ZGl4X3RyZWVfbmV4dChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJICAgICAgIHN0 cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4LAorCQkgICAg ICAgaW50ICgqaXRlcikodm9pZCAqLCB1bnNpZ25lZCBsb25nKSk7CisKK2V4dGVybiBpbnQgc3Jh ZGl4X3RyZWVfZW50ZXIoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKippdGVt LCBpbnQgbnVtKTsKKworZXh0ZXJuIHZvaWQgc3JhZGl4X3RyZWVfZGVsZXRlX2Zyb21fbGVhZihz dHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwgCisJCQlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9k ZSAqbm9kZSwgdW5zaWduZWQgbG9uZyBpbmRleCk7CisKK2V4dGVybiB2b2lkICpzcmFkaXhfdHJl ZV9sb29rdXAoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5k ZXgpOworCisjZW5kaWYgLyogX0xJTlVYX1NSQURJWF9UUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvdWtzbS5oIGIvaW5jbHVkZS9saW51eC91a3NtLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0NGJjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUv bGludXgvdWtzbS5oCkBAIC0wLDAgKzEsMTQ2IEBACisjaWZuZGVmIF9fTElOVVhfVUtTTV9ICisj ZGVmaW5lIF9fTElOVVhfVUtTTV9ICisvKgorICogTWVtb3J5IG1lcmdpbmcgc3VwcG9ydC4KKyAq CisgKiBUaGlzIGNvZGUgZW5hYmxlcyBkeW5hbWljIHNoYXJpbmcgb2YgaWRlbnRpY2FsIHBhZ2Vz IGZvdW5kIGluIGRpZmZlcmVudAorICogbWVtb3J5IGFyZWFzLCBldmVuIGlmIHRoZXkgYXJlIG5v dCBzaGFyZWQgYnkgZm9yaygpLgorICovCisKKy8qIGlmICFDT05GSUdfVUtTTSB0aGlzIGZpbGUg c2hvdWxkIG5vdCBiZSBjb21waWxlZCBhdCBhbGwuICovCisjaWZkZWYgQ09ORklHX1VLU00KKwor I2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVk ZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxs aW51eC9zY2hlZC5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyB6ZXJvX3BmbiBfX3JlYWRfbW9z dGx5OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdWtzbV96ZXJvX3BmbiBfX3JlYWRfbW9zdGx5Owor ZXh0ZXJuIHN0cnVjdCBwYWdlICplbXB0eV91a3NtX3plcm9fcGFnZTsKKworLyogbXVzdCBiZSBk b25lIGJlZm9yZSBsaW5rZWQgdG8gbW0gKi8KK2V4dGVybiB2b2lkIHVrc21fdm1hX2FkZF9uZXco c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIHZvaWQgdWtzbV9yZW1vdmVfdm1h KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworI2RlZmluZSBVS1NNX1NMT1RfTkVFRF9T T1JUCSgxIDw8IDApCisjZGVmaW5lIFVLU01fU0xPVF9ORUVEX1JFUkFORCAJKDEgPDwgMSkKKyNk ZWZpbmUgVUtTTV9TTE9UX1NDQU5ORUQgICAgIAkoMSA8PCAyKSAvKiBJdCdzIHNjYW5uZWQgaW4g dGhpcyByb3VuZCAqLworI2RlZmluZSBVS1NNX1NMT1RfRlVMX1NDQU5ORUQgCSgxIDw8IDMpCisj ZGVmaW5lIFVLU01fU0xPVF9JTl9VS1NNIAkoMSA8PCA0KQorCitzdHJ1Y3Qgdm1hX3Nsb3Qgewor CXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpzbm9kZTsKKwl1bnNpZ25lZCBsb25nIHNpbmRleDsK KworCXN0cnVjdCBsaXN0X2hlYWQgc2xvdF9saXN0OworCXVuc2lnbmVkIGxvbmcgZnVsbHlfc2Nh bm5lZF9yb3VuZDsKKwl1bnNpZ25lZCBsb25nIGRlZHVwX251bTsKKwl1bnNpZ25lZCBsb25nIHBh Z2VzX3NjYW5uZWQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdW5zaWduZWQgbG9u ZyBwYWdlc190b19zY2FuOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7CisJc3RydWN0IHBhZ2Ug KipybWFwX2xpc3RfcG9vbDsKKwl1bnNpZ25lZCBpbnQgKnBvb2xfY291bnRzOworCXVuc2lnbmVk IGxvbmcgcG9vbF9zaXplOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBt bV9zdHJ1Y3QgKm1tOworCXVuc2lnbmVkIGxvbmcgY3RpbWVfajsKKwl1bnNpZ25lZCBsb25nIHBh Z2VzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwYWdlc19jb3dlZDsg LyogcGFnZXMgY293ZWQgdGhpcyByb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgcGFnZXNfbWVyZ2Vk OyAvKiBwYWdlcyBtZXJnZWQgdGhpcyByb3VuZCAqLworCXVuc2lnbmVkIGxvbmcgcGFnZXNfYmVt ZXJnZWQ7CisKKwkvKiB3aGVuIGl0IGhhcyBwYWdlIG1lcmdlZCBpbiB0aGlzIGV2YWwgcm91bmQg Ki8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlZHVwX2xpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHZv aWQgdWtzbV91bm1hcF96ZXJvX3BhZ2UocHRlX3QgcHRlKQoreworCWlmIChwdGVfcGZuKHB0ZSkg PT0gdWtzbV96ZXJvX3BmbikKKwkJX19kZWNfem9uZV9wYWdlX3N0YXRlKGVtcHR5X3Vrc21femVy b19wYWdlLCBOUl9VS1NNX1pFUk9fUEFHRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtz bV9tYXBfemVyb19wYWdlKHB0ZV90IHB0ZSkKK3sKKwlpZiAocHRlX3BmbihwdGUpID09IHVrc21f emVyb19wZm4pCisJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShlbXB0eV91a3NtX3plcm9fcGFnZSwg TlJfVUtTTV9aRVJPX1BBR0VTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fY293X3Bh Z2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlm ICh2bWEtPnVrc21fdm1hX3Nsb3QgJiYgUGFnZUtzbShwYWdlKSkKKwkJdm1hLT51a3NtX3ZtYV9z bG90LT5wYWdlc19jb3dlZCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtzbV9jb3dfcHRl KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCBwdGUpCit7CisJaWYgKHZtYS0+dWtz bV92bWFfc2xvdCAmJiBwdGVfcGZuKHB0ZSkgPT0gdWtzbV96ZXJvX3BmbikKKwkJdm1hLT51a3Nt X3ZtYV9zbG90LT5wYWdlc19jb3dlZCsrOworfQorCitzdGF0aWMgaW5saW5lIGludCB1a3NtX2Zs YWdzX2Nhbl9zY2FuKHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MpCit7CisjaWZuZGVmIFZNX1NBTwor I2RlZmluZSBWTV9TQU8gMAorI2VuZGlmCisJcmV0dXJuICEodm1fZmxhZ3MgJiAoVk1fUEZOTUFQ IHwgVk1fSU8gIHwgVk1fRE9OVEVYUEFORCB8CisJCQkgICAgIFZNX0hVR0VUTEIgfCBWTV9OT05M SU5FQVIgfCBWTV9NSVhFRE1BUCB8CisJCQkgICAgIFZNX1NIQVJFRCAgfCBWTV9NQVlTSEFSRSB8 IFZNX0dST1dTVVAgfCBWTV9HUk9XU0RPV04gfCBWTV9TQU8pKTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIHVrc21fdm1fZmxhZ3NfbW9kKHVuc2lnbmVkIGxvbmcgKnZtX2ZsYWdzX3ApCit7CisJ aWYgKHVrc21fZmxhZ3NfY2FuX3NjYW4oKnZtX2ZsYWdzX3ApKQorCQkqdm1fZmxhZ3NfcCB8PSBW TV9NRVJHRUFCTEU7Cit9CisKKy8qCisgKiBKdXN0IGEgd3JhcHBlciBmb3IgQlVHX09OIGZvciB3 aGVyZSBrc21femVyb3BhZ2UgbXVzdCBub3QgYmUuIFRPRE86IGl0IHdpbGwKKyAqIGJlIHJlbW92 ZWQgd2hlbiB1a3NtIHplcm8gcGFnZSBwYXRjaCBpcyBzdGFibGUgZW5vdWdoLgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQgdWtzbV9idWdvbl96ZXJvcGFnZShwdGVfdCBwdGUpCit7CisJQlVHX09O KHB0ZV9wZm4ocHRlKSA9PSB1a3NtX3plcm9fcGZuKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5l IHZvaWQgdWtzbV92bWFfYWRkX25ldyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKK30K Kworc3RhdGljIGlubGluZSB2b2lkIHVrc21fcmVtb3ZlX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fdW5tYXBfemVyb19wYWdl KHB0ZV90IHB0ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVrc21fbWFwX3plcm9fcGFn ZShwdGVfdCBwdGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1a3NtX2Nvd19wYWdlKHN0 cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKworc3Rh dGljIGlubGluZSB2b2lkIHVrc21fY293X3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwg cHRlX3QgcHRlKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB1a3NtX2ZsYWdzX2Nhbl9zY2Fu KHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCB1a3NtX3ZtX2ZsYWdzX21vZCh1bnNpZ25lZCBsb25nICp2bV9mbGFnc19wKQorewor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWtzbV9idWdvbl96ZXJvcGFnZShwdGVfdCBwdGUpCit7 Cit9CisjZW5kaWYgLyogIUNPTkZJR19VS1NNICovCisjZW5kaWYgLyogX19MSU5VWF9VS1NNX0gg Ki8KZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDliN2Q3 NDYuLjczYWQ5MGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2Zvcmsu YwpAQCAtNDEyLDcgKzQxMiw3IEBAIHN0YXRpYyBpbnQgZHVwX21tYXAoc3RydWN0IG1tX3N0cnVj dCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tKQogCQkJCWdvdG8gZmFpbF9ub21lbTsKIAkJ CWNoYXJnZSA9IGxlbjsKIAkJfQotCQl0bXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZtX2FyZWFfY2Fj aGVwLCBHRlBfS0VSTkVMKTsKKwkJdG1wID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNo ZXAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXRtcCkKIAkJCWdvdG8gZmFpbF9ub21lbTsKIAkJKnRt cCA9ICptcG50OwpAQCAtNDY3LDcgKzQ2Nyw3IEBAIHN0YXRpYyBpbnQgZHVwX21tYXAoc3RydWN0 IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tKQogCQlfX3ZtYV9saW5rX3Ji KG1tLCB0bXAsIHJiX2xpbmssIHJiX3BhcmVudCk7CiAJCXJiX2xpbmsgPSAmdG1wLT52bV9yYi5y Yl9yaWdodDsKIAkJcmJfcGFyZW50ID0gJnRtcC0+dm1fcmI7Ci0KKwkJdWtzbV92bWFfYWRkX25l dyh0bXApOwogCQltbS0+bWFwX2NvdW50Kys7CiAJCXJldHZhbCA9IGNvcHlfcGFnZV9yYW5nZSht bSwgb2xkbW0sIG1wbnQpOwogCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZp bGUKaW5kZXggODQwMDBlYy4uOTMyZmNiMCAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBi L2xpYi9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAgS0JVSUxEX0NGTEFHUyA9ICQoc3Vic3QgLXBn LCwkKE9SSUdfQ0ZMQUdTKSkKIGVuZGlmCiAKIGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNw cmludGYubyBjbWRsaW5lLm8gXAotCSByYnRyZWUubyByYWRpeC10cmVlLm8gZHVtcF9zdGFjay5v IHRpbWVycXVldWUub1wKKwkgcmJ0cmVlLm8gcmFkaXgtdHJlZS5vIHNyYWRpeC10cmVlLm8gZHVt cF9zdGFjay5vIHRpbWVycXVldWUub1wKIAkgaWRyLm8gaW50X3NxcnQubyBleHRhYmxlLm8gXAog CSBzaGExLm8gbWQ1Lm8gaXJxX3JlZ3MubyByZWNpcHJvY2FsX2Rpdi5vIGFyZ3Zfc3BsaXQubyBc CiAJIHByb3BvcnRpb25zLm8gZmxleF9wcm9wb3J0aW9ucy5vIHJhdGVsaW1pdC5vIHNob3dfbWVt Lm8gXApkaWZmIC0tZ2l0IGEvbGliL3NyYWRpeC10cmVlLmMgYi9saWIvc3JhZGl4LXRyZWUuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA2MzI5Ci0tLSAvZGV2L251bGwK KysrIGIvbGliL3NyYWRpeC10cmVlLmMKQEAgLTAsMCArMSw0NzYgQEAKKyNpbmNsdWRlIDxsaW51 eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5o PgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L2djZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NyYWRpeC10cmVlLmg+CisK K3N0YXRpYyBpbmxpbmUgaW50IHNyYWRpeF9ub2RlX2Z1bGwoc3RydWN0IHNyYWRpeF90cmVlX3Jv b3QgKnJvb3QsIHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlKQoreworCXJldHVybiBub2Rl LT5mdWxscyA9PSByb290LT5zdG9yZXNfc2l6ZSB8fCAKKwkJKG5vZGUtPmhlaWdodCA9PSAxICYm IG5vZGUtPmNvdW50ID09IHJvb3QtPnN0b3Jlc19zaXplKTsKK30KKworLyoKKyAqCUV4dGVuZCBh IHNyYWRpeCB0cmVlIHNvIGl0IGNhbiBzdG9yZSBrZXkgQGluZGV4LgorICovCitzdGF0aWMgaW50 IHNyYWRpeF90cmVlX2V4dGVuZChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWdu ZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl1bnNp Z25lZCBpbnQgaGVpZ2h0OworCisJaWYgKHVubGlrZWx5KHJvb3QtPnJub2RlID09IE5VTEwpKSB7 CisJCWlmICghKG5vZGUgPSByb290LT5hbGxvYygpKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJ CW5vZGUtPmhlaWdodCA9IDE7CisJCXJvb3QtPnJub2RlID0gbm9kZTsKKwkJcm9vdC0+aGVpZ2h0 ID0gMTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgdGhlIGhlaWdodCBzaG91bGQgYmUuICAq LworCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwlpbmRleCA+Pj0gcm9vdC0+c2hpZnQgKiBoZWln aHQ7CisKKwl3aGlsZSAoaW5kZXgpIHsKKwkJaW5kZXggPj49IHJvb3QtPnNoaWZ0OworCQloZWln aHQrKzsKKwl9CisKKwl3aGlsZSAoaGVpZ2h0ID4gcm9vdC0+aGVpZ2h0KSB7CisJCXVuc2lnbmVk IGludCBuZXdoZWlnaHQ7CisJCWlmICghKG5vZGUgPSByb290LT5hbGxvYygpKSkKKwkJCXJldHVy biAtRU5PTUVNOworCisJCS8qIEluY3JlYXNlIHRoZSBoZWlnaHQuICAqLworCQlub2RlLT5zdG9y ZXNbMF0gPSByb290LT5ybm9kZTsKKwkJcm9vdC0+cm5vZGUtPnBhcmVudCA9IG5vZGU7CisJCWlm IChyb290LT5leHRlbmQpCisJCQlyb290LT5leHRlbmQobm9kZSwgcm9vdC0+cm5vZGUpOworCisJ CW5ld2hlaWdodCA9IHJvb3QtPmhlaWdodCArIDE7CisJCW5vZGUtPmhlaWdodCA9IG5ld2hlaWdo dDsKKwkJbm9kZS0+Y291bnQgPSAxOworCQlpZiAoc3JhZGl4X25vZGVfZnVsbChyb290LCByb290 LT5ybm9kZSkpCisJCQlub2RlLT5mdWxscyA9IDE7CisKKwkJcm9vdC0+cm5vZGUgPSBub2RlOwor CQlyb290LT5oZWlnaHQgPSBuZXdoZWlnaHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisg KiBTZWFyY2ggdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBjdXJyZW50IG5vZGUsIHRoYXQgaXMgbm90 IE5VTEwKKyAqIGFuZCBjYW4gc2F0aWZ5IHJvb3QtPml0ZXIoKS4KKyAqLwordm9pZCAqc3JhZGl4 X3RyZWVfbmV4dChzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJICAgICAgIHN0cnVj dCBzcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4LAorCQkgICAgICAg aW50ICgqaXRlcikodm9pZCAqaXRlbSwgdW5zaWduZWQgbG9uZyBoZWlnaHQpKQoreworCXVuc2ln bmVkIGxvbmcgb2Zmc2V0OworCXZvaWQgKml0ZW07CisKKwlpZiAodW5saWtlbHkobm9kZSA9PSBO VUxMKSkgeworCQlub2RlID0gcm9vdC0+cm5vZGU7CisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0 IDwgcm9vdC0+c3RvcmVzX3NpemU7IG9mZnNldCsrKSB7CisJCQlpdGVtID0gbm9kZS0+c3RvcmVz W29mZnNldF07CisJCQlpZiAoaXRlbSAmJiAoIWl0ZXIgfHwgaXRlcihpdGVtLCBub2RlLT5oZWln aHQpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh1bmxpa2VseShvZmZzZXQgPj0gcm9vdC0+ c3RvcmVzX3NpemUpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKG5vZGUtPmhlaWdodCA9PSAx KQorCQkJcmV0dXJuIGl0ZW07CisJCWVsc2UKKwkJCWdvdG8gZ29fZG93bjsKKwl9CisKKwl3aGls ZSAobm9kZSkgeworCQlvZmZzZXQgPSAoaW5kZXggJiByb290LT5tYXNrKSArIDE7CQkJCQkKKwkJ Zm9yICg7b2Zmc2V0IDwgcm9vdC0+c3RvcmVzX3NpemU7IG9mZnNldCsrKSB7CisJCQlpdGVtID0g bm9kZS0+c3RvcmVzW29mZnNldF07CisJCQlpZiAoaXRlbSAmJiAoIWl0ZXIgfHwgaXRlcihpdGVt LCBub2RlLT5oZWlnaHQpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChvZmZzZXQgPCByb290 LT5zdG9yZXNfc2l6ZSkKKwkJCWJyZWFrOworCisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCWlu ZGV4ID4+PSByb290LT5zaGlmdDsKKwl9CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOwor CisJd2hpbGUgKG5vZGUtPmhlaWdodCA+IDEpIHsKK2dvX2Rvd246CisJCW5vZGUgPSBpdGVtOwor CQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHJvb3QtPnN0b3Jlc19zaXplOyBvZmZzZXQrKykg eworCQkJaXRlbSA9IG5vZGUtPnN0b3Jlc1tvZmZzZXRdOworCQkJaWYgKGl0ZW0gJiYgKCFpdGVy IHx8IGl0ZXIoaXRlbSwgbm9kZS0+aGVpZ2h0KSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAo dW5saWtlbHkob2Zmc2V0ID49IHJvb3QtPnN0b3Jlc19zaXplKSkKKwkJCXJldHVybiBOVUxMOwor CX0KKworCUJVR19PTihvZmZzZXQgPiByb290LT5zdG9yZXNfc2l6ZSk7CisKKwlyZXR1cm4gaXRl bTsKK30KKworLyoKKyAqIEJsaW5kbHkgaW5zZXJ0IHRoZSBpdGVtIHRvIHRoZSB0cmVlLiBUeXBp Y2FsbHksIHdlIHJldXNlIHRoZQorICogZmlyc3QgZW1wdHkgc3RvcmUgaXRlbS4KKyAqLworaW50 IHNyYWRpeF90cmVlX2VudGVyKHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoq aXRlbSwgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGludCBo ZWlnaHQ7CisJc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKm5vZGUsICp0bXAgPSBOVUxMOworCWlu dCBvZmZzZXQsIG9mZnNldF9zYXZlZDsKKwl2b2lkICoqc3RvcmUgPSBOVUxMOworCWludCBlcnJv ciwgaSwgaiwgc2hpZnQ7CisKK2dvX29uOgorCWluZGV4ID0gcm9vdC0+bWluOworCisJaWYgKHJv b3QtPmVudGVyX25vZGUgJiYgIXNyYWRpeF9ub2RlX2Z1bGwocm9vdCwgcm9vdC0+ZW50ZXJfbm9k ZSkpIHsKKwkJbm9kZSA9IHJvb3QtPmVudGVyX25vZGU7CisJCUJVR19PTigoaW5kZXggPj4gKHJv b3QtPnNoaWZ0ICogcm9vdC0+aGVpZ2h0KSkpOworCX0gZWxzZSB7CisJCW5vZGUgPSByb290LT5y bm9kZTsKKwkJaWYgKG5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogcm9v dC0+aGVpZ2h0KSkKKwkJICAgIHx8IHNyYWRpeF9ub2RlX2Z1bGwocm9vdCwgbm9kZSkpIHsKKwkJ CWVycm9yID0gc3JhZGl4X3RyZWVfZXh0ZW5kKHJvb3QsIGluZGV4KTsKKwkJCWlmIChlcnJvcikK KwkJCQlyZXR1cm4gZXJyb3I7CisKKwkJCW5vZGUgPSByb290LT5ybm9kZTsKKwkJfQorCX0KKwor CisJaGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogcm9vdC0+ c2hpZnQ7CisJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIHJvb3QtPm1hc2s7CisJd2hpbGUg KHNoaWZ0ID4gMCkgeworCQlvZmZzZXRfc2F2ZWQgPSBvZmZzZXQ7CisJCWZvciAoOyBvZmZzZXQg PCByb290LT5zdG9yZXNfc2l6ZTsgb2Zmc2V0KyspIHsKKwkJCXN0b3JlID0gJm5vZGUtPnN0b3Jl c1tvZmZzZXRdOworCQkJdG1wID0gKnN0b3JlOworCisJCQlpZiAoIXRtcCB8fCAhc3JhZGl4X25v ZGVfZnVsbChyb290LCB0bXApKQorCQkJCWJyZWFrOworCQl9CisJCUJVR19PTihvZmZzZXQgPj0g cm9vdC0+c3RvcmVzX3NpemUpOworCisJCWlmIChvZmZzZXQgIT0gb2Zmc2V0X3NhdmVkKSB7CisJ CQlpbmRleCArPSAob2Zmc2V0IC0gb2Zmc2V0X3NhdmVkKSA8PCBzaGlmdDsKKwkJCWluZGV4ICY9 IH4oKDFVTCA8PCBzaGlmdCkgLSAxKTsKKwkJfQorCisJCWlmICghdG1wKSB7CisJCQlpZiAoISh0 bXAgPSByb290LT5hbGxvYygpKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJdG1wLT5oZWln aHQgPSBzaGlmdCAvIHJvb3QtPnNoaWZ0OworCQkJKnN0b3JlID0gdG1wOworCQkJdG1wLT5wYXJl bnQgPSBub2RlOworCQkJbm9kZS0+Y291bnQrKzsKKy8vCQkJaWYgKHJvb3QtPmV4dGVuZCkKKy8v CQkJCXJvb3QtPmV4dGVuZChub2RlLCB0bXApOworCQl9CisKKwkJbm9kZSA9IHRtcDsKKwkJc2hp ZnQgLT0gcm9vdC0+c2hpZnQ7CisJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiByb290LT5t YXNrOworCX0KKworCUJVR19PTihub2RlLT5oZWlnaHQgIT0gMSk7CisKKworCXN0b3JlID0gJm5v ZGUtPnN0b3Jlc1tvZmZzZXRdOworCWZvciAoaSA9IDAsIGogPSAwOworCSAgICAgIGogPCByb290 LT5zdG9yZXNfc2l6ZSAtIG5vZGUtPmNvdW50ICYmIAorCSAgICAgIGkgPCByb290LT5zdG9yZXNf c2l6ZSAtIG9mZnNldCAmJiBqIDwgbnVtOyBpKyspIHsKKwkJaWYgKCFzdG9yZVtpXSkgeworCQkJ c3RvcmVbaV0gPSBpdGVtW2pdOworCQkJaWYgKHJvb3QtPmFzc2lnbikKKwkJCQlyb290LT5hc3Np Z24obm9kZSwgaW5kZXggKyBpLCBpdGVtW2pdKTsKKwkJCWorKzsKKwkJfQorCX0KKworCW5vZGUt PmNvdW50ICs9IGo7CisJcm9vdC0+bnVtICs9IGo7CisJbnVtIC09IGo7CisKKwl3aGlsZSAoc3Jh ZGl4X25vZGVfZnVsbChyb290LCBub2RlKSkgeworCQlub2RlID0gbm9kZS0+cGFyZW50OworCQlp ZiAoIW5vZGUpCisJCQlicmVhazsKKworCQlub2RlLT5mdWxscysrOworCX0KKworCWlmICh1bmxp a2VseSghbm9kZSkpIHsKKwkJLyogQWxsIG5vZGVzIGFyZSBmdWxsICovCisJCXJvb3QtPm1pbiA9 IDEgPDwgKHJvb3QtPmhlaWdodCAqIHJvb3QtPnNoaWZ0KTsKKwkJcm9vdC0+ZW50ZXJfbm9kZSA9 IE5VTEw7CisJfSBlbHNlIHsKKwkJcm9vdC0+bWluID0gaW5kZXggKyBpIC0gMTsKKwkJcm9vdC0+ bWluIHw9ICgxVUwgPDwgKG5vZGUtPmhlaWdodCAtIDEpKSAtIDE7CisJCXJvb3QtPm1pbisrOwor CQlyb290LT5lbnRlcl9ub2RlID0gbm9kZTsKKwl9CisKKwlpZiAobnVtKSB7CisJCWl0ZW0gKz0g ajsKKwkJZ290byBnb19vbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCXNyYWRp eF90cmVlX3NocmluayAgICAtICAgIHNocmluayBoZWlnaHQgb2YgYSBzcmFkaXggdHJlZSB0byBt aW5pbWFsCisgKiAgICAgIEByb290CQlzcmFkaXggdHJlZSByb290CisgKiAgCisgKi8KK3N0YXRp YyBpbmxpbmUgdm9pZCBzcmFkaXhfdHJlZV9zaHJpbmsoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3Qg KnJvb3QpCit7CisJLyogdHJ5IHRvIHNocmluayB0cmVlIGhlaWdodCAqLworCXdoaWxlIChyb290 LT5oZWlnaHQgPiAxKSB7CisJCXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICp0b19mcmVlID0gcm9v dC0+cm5vZGU7CisKKwkJLyoKKwkJICogVGhlIGNhbmRpZGF0ZSBub2RlIGhhcyBtb3JlIHRoYW4g b25lIGNoaWxkLCBvciBpdHMgY2hpbGQKKwkJICogaXMgbm90IGF0IHRoZSBsZWZ0bW9zdCBzdG9y ZSwgd2UgY2Fubm90IHNocmluay4KKwkJICovCisJCWlmICh0b19mcmVlLT5jb3VudCAhPSAxIHx8 ICF0b19mcmVlLT5zdG9yZXNbMF0pCisJCQlicmVhazsKKworCQlyb290LT5ybm9kZSA9IHRvX2Zy ZWUtPnN0b3Jlc1swXTsKKwkJcm9vdC0+cm5vZGUtPnBhcmVudCA9IE5VTEw7CisJCXJvb3QtPmhl aWdodC0tOworCQlpZiAodW5saWtlbHkocm9vdC0+ZW50ZXJfbm9kZSA9PSB0b19mcmVlKSkgewor CQkJcm9vdC0+ZW50ZXJfbm9kZSA9IE5VTEw7CisJCX0KKwkJcm9vdC0+ZnJlZSh0b19mcmVlKTsK Kwl9Cit9CisKKy8qCisgKiBEZWwgdGhlIGl0ZW0gb24gdGhlIGtub3duIGxlYWYgbm9kZSBhbmQg aW5kZXgKKyAqLwordm9pZCBzcmFkaXhfdHJlZV9kZWxldGVfZnJvbV9sZWFmKHN0cnVjdCBzcmFk aXhfdHJlZV9yb290ICpyb290LCAKKwkJCQkgIHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2Rl LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJc3RydWN0 IHNyYWRpeF90cmVlX25vZGUgKnN0YXJ0LCAqZW5kOworCisJQlVHX09OKG5vZGUtPmhlaWdodCAh PSAxKTsKKworCXN0YXJ0ID0gbm9kZTsKKwl3aGlsZSAobm9kZSAmJiAhKC0tbm9kZS0+Y291bnQp KQorCQlub2RlID0gbm9kZS0+cGFyZW50OworCisJZW5kID0gbm9kZTsKKwlpZiAoIW5vZGUpIHsK KwkJcm9vdC0+cm5vZGUgPSBOVUxMOworCQlyb290LT5oZWlnaHQgPSAwOworCQlyb290LT5taW4g PSAwOworCQlyb290LT5udW0gPSAwOworCQlyb290LT5lbnRlcl9ub2RlID0gTlVMTDsKKwl9IGVs c2UgeworCQlvZmZzZXQgPSAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogKG5vZGUtPmhlaWdodCAt IDEpKSkgJiByb290LT5tYXNrOworCQlpZiAocm9vdC0+cm0pCisJCQlyb290LT5ybShub2RlLCBv ZmZzZXQpOworCQlub2RlLT5zdG9yZXNbb2Zmc2V0XSA9IE5VTEw7CisJCXJvb3QtPm51bS0tOwor CQlpZiAocm9vdC0+bWluID4gaW5kZXgpIHsKKwkJCXJvb3QtPm1pbiA9IGluZGV4OworCQkJcm9v dC0+ZW50ZXJfbm9kZSA9IG5vZGU7CisJCX0KKwl9CisKKwlpZiAoc3RhcnQgIT0gZW5kKSB7CisJ CWRvIHsKKwkJCW5vZGUgPSBzdGFydDsKKwkJCXN0YXJ0ID0gc3RhcnQtPnBhcmVudDsKKwkJCWlm ICh1bmxpa2VseShyb290LT5lbnRlcl9ub2RlID09IG5vZGUpKQorCQkJCXJvb3QtPmVudGVyX25v ZGUgPSBlbmQ7CisJCQlyb290LT5mcmVlKG5vZGUpOworCQl9IHdoaWxlIChzdGFydCAhPSBlbmQp OworCisJCS8qCisJCSAqIE5vdGUgdGhhdCBzaHJpbmsgbWF5IGZyZWUgImVuZCIsIHNvIGVudGVy X25vZGUgc3RpbGwgbmVlZCB0bworCQkgKiBiZSBjaGVja2VkIGluc2lkZS4KKwkJICovCisJCXNy YWRpeF90cmVlX3Nocmluayhyb290KTsKKwl9IGVsc2UgaWYgKG5vZGUtPmNvdW50ID09IHJvb3Qt PnN0b3Jlc19zaXplIC0gMSkgeworCQkvKiBJdCBXQVMgYSBmdWxsIGxlYWYgbm9kZS4gVXBkYXRl IHRoZSBhbmNlc3RvcnMgKi8KKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwkJd2hpbGUgKG5vZGUp IHsKKwkJCW5vZGUtPmZ1bGxzLS07CisJCQlpZiAobm9kZS0+ZnVsbHMgIT0gcm9vdC0+c3RvcmVz X3NpemUgLSAxKQorCQkJCWJyZWFrOworCisJCQlub2RlID0gbm9kZS0+cGFyZW50OworCQl9CisJ fQorfQorCit2b2lkICpzcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHNyYWRpeF90cmVlX3Jvb3Qg KnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGhlaWdodCwgb2Zm c2V0OworCXN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpub2RlOworCWludCBzaGlmdDsKKworCW5v ZGUgPSByb290LT5ybm9kZTsKKwlpZiAobm9kZSA9PSBOVUxMIHx8IChpbmRleCA+PiAocm9vdC0+ c2hpZnQgKiByb290LT5oZWlnaHQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwloZWlnaHQgPSByb290 LT5oZWlnaHQ7CisJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiByb290LT5zaGlmdDsKKworCWRvIHsK KwkJb2Zmc2V0ID0gKGluZGV4ID4+IHNoaWZ0KSAmIHJvb3QtPm1hc2s7CisJCW5vZGUgPSBub2Rl LT5zdG9yZXNbb2Zmc2V0XTsKKwkJaWYgKCFub2RlKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc2hp ZnQgLT0gcm9vdC0+c2hpZnQ7CisJfSB3aGlsZSAoc2hpZnQgPj0gMCk7CisKKwlyZXR1cm4gbm9k ZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaXRlbSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBj cmVhdGUgaXQgaW4gcGxhY2UKKyAqIGFuZCByZXR1cm4gdGhlIGNyZWF0ZWQgaXRlbS4KKyAqLwor dm9pZCAqc3JhZGl4X3RyZWVfbG9va3VwX2NyZWF0ZShzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCAq cm9vdCwgCisJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICooKml0ZW1fYWxsb2MpKHZvaWQp KQoreworCXVuc2lnbmVkIGludCBoZWlnaHQsIG9mZnNldDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVf bm9kZSAqbm9kZSwgKnRtcDsKKwl2b2lkICppdGVtOworCWludCBzaGlmdCwgZXJyb3I7CisKKwlp ZiAocm9vdC0+cm5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNoaWZ0ICogcm9vdC0+ aGVpZ2h0KSkpIHsKKwkJaWYgKGl0ZW1fYWxsb2MpIHsKKwkJCWVycm9yID0gc3JhZGl4X3RyZWVf ZXh0ZW5kKHJvb3QsIGluZGV4KTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJ fSBlbHNlIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbm9kZSA9IHJvb3QtPnJub2Rl OworCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKKwlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIHJvb3Qt PnNoaWZ0OworCisJZG8geworCQlvZmZzZXQgPSAoaW5kZXggPj4gc2hpZnQpICYgcm9vdC0+bWFz azsKKwkJaWYgKCFub2RlLT5zdG9yZXNbb2Zmc2V0XSkgeworCQkJaWYgKCEodG1wID0gcm9vdC0+ YWxsb2MoKSkpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCXRtcC0+aGVpZ2h0ID0gc2hpZnQgLyBy b290LT5zaGlmdDsKKwkJCW5vZGUtPnN0b3Jlc1tvZmZzZXRdID0gdG1wOworCQkJdG1wLT5wYXJl bnQgPSBub2RlOworCQkJbm9kZS0+Y291bnQrKzsKKwkJCW5vZGUgPSB0bXA7CisJCX0gZWxzZSB7 CisJCQlub2RlID0gbm9kZS0+c3RvcmVzW29mZnNldF07CisJCX0KKworCQlzaGlmdCAtPSByb290 LT5zaGlmdDsKKwl9IHdoaWxlIChzaGlmdCA+IDApOworCisJQlVHX09OKG5vZGUtPmhlaWdodCAh PSAxKTsKKwlvZmZzZXQgPSBpbmRleCAmIHJvb3QtPm1hc2s7CisJaWYgKG5vZGUtPnN0b3Jlc1tv ZmZzZXRdKSB7CisJCXJldHVybiBub2RlLT5zdG9yZXNbb2Zmc2V0XTsKKwl9IGVsc2UgaWYgKGl0 ZW1fYWxsb2MpIHsKKwkJaWYgKCEoaXRlbSA9IGl0ZW1fYWxsb2MoKSkpCisJCQlyZXR1cm4gTlVM TDsKKworCQlub2RlLT5zdG9yZXNbb2Zmc2V0XSA9IGl0ZW07CisKKwkJLyoKKwkJICogTk9URTog d2UgZG8gTk9UIGNhbGwgcm9vdC0+YXNzaWduIGhlcmUsIHNpbmNlIHRoaXMgaXRlbSBpcworCQkg KiBuZXdseSBjcmVhdGVkIGJ5IHVzIGhhdmluZyBubyBtZWFuaW5nLiBDYWxsZXIgY2FuIGNhbGwg dGhpcworCQkgKiBpZiBpdCdzIG5lY2Vzc2FyeSB0byBkbyBzby4KKwkJICovCisKKwkJbm9kZS0+ Y291bnQrKzsKKwkJcm9vdC0+bnVtKys7CisKKwkJd2hpbGUgKHNyYWRpeF9ub2RlX2Z1bGwocm9v dCwgbm9kZSkpIHsKKwkJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCQlpZiAoIW5vZGUpCisJCQkJ YnJlYWs7CisKKwkJCW5vZGUtPmZ1bGxzKys7CisJCX0KKworCQlpZiAodW5saWtlbHkoIW5vZGUp KSB7CisJCQkvKiBBbGwgbm9kZXMgYXJlIGZ1bGwgKi8KKwkJCXJvb3QtPm1pbiA9IDEgPDwgKHJv b3QtPmhlaWdodCAqIHJvb3QtPnNoaWZ0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyb290LT5taW4g PT0gaW5kZXgpIHsKKwkJCQlyb290LT5taW4gfD0gKDFVTCA8PCAobm9kZS0+aGVpZ2h0IC0gMSkp IC0gMTsKKwkJCQlyb290LT5taW4rKzsKKwkJCQlyb290LT5lbnRlcl9ub2RlID0gbm9kZTsKKwkJ CX0KKwkJfQorCisJCXJldHVybiBpdGVtOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0K KworfQorCitpbnQgc3JhZGl4X3RyZWVfZGVsZXRlKHN0cnVjdCBzcmFkaXhfdHJlZV9yb290ICpy b290LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGludCBoZWlnaHQsIG9mZnNl dDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwlpbnQgc2hpZnQ7CisKKwlub2Rl ID0gcm9vdC0+cm5vZGU7CisJaWYgKG5vZGUgPT0gTlVMTCB8fCAoaW5kZXggPj4gKHJvb3QtPnNo aWZ0ICogcm9vdC0+aGVpZ2h0KSkpCisJCXJldHVybiAtRU5PRU5UOworCisJaGVpZ2h0ID0gcm9v dC0+aGVpZ2h0OworCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogcm9vdC0+c2hpZnQ7CisKKwlkbyB7 CisJCW9mZnNldCA9IChpbmRleCA+PiBzaGlmdCkgJiByb290LT5tYXNrOworCQlub2RlID0gbm9k ZS0+c3RvcmVzW29mZnNldF07CisJCWlmICghbm9kZSkKKwkJCXJldHVybiAtRU5PRU5UOworCisJ CXNoaWZ0IC09IHJvb3QtPnNoaWZ0OworCX0gd2hpbGUgKHNoaWZ0ID4gMCk7CisKKwlvZmZzZXQg PSBpbmRleCAmIHJvb3QtPm1hc2s7CisJaWYgKCFub2RlLT5zdG9yZXNbb2Zmc2V0XSkKKwkJcmV0 dXJuIC1FTk9FTlQ7CisKKwlzcmFkaXhfdHJlZV9kZWxldGVfZnJvbV9sZWFmKHJvb3QsIG5vZGUs IGluZGV4KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tj b25maWcKaW5kZXggMWQxYWU2Yi4uNTExZGRlNiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysg Yi9tbS9LY29uZmlnCkBAIC0zMzksNiArMzM5LDMyIEBAIGNvbmZpZyBLU00KIAkgIFNlZSBEb2N1 bWVudGF0aW9uL3ZtL2tzbS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb246IEtTTSBpcyBpbmFjdGl2 ZQogCSAgdW50aWwgYSBwcm9ncmFtIGhhcyBtYWR2aXNlZCB0aGF0IGFuIGFyZWEgaXMgTUFEVl9N RVJHRUFCTEUsIGFuZAogCSAgcm9vdCBoYXMgc2V0IC9zeXMva2VybmVsL21tL2tzbS9ydW4gdG8g MSAoaWYgQ09ORklHX1NZU0ZTIGlzIHNldCkuCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSBVS1NN L0tTTSBzdHJhdGVneSIKKwlkZWZhdWx0IFVLU00KKwlkZXBlbmRzIG9uIEtTTQorCWhlbHAKKwkg IFRoaXMgb3B0aW9uIGFsbG93cyB0byBzZWxlY3QgYSBVS1NNL0tTTSBzdHJhZ2V0eS4KKworY29u ZmlnIFVLU00KKwlib29sICJVbHRyYS1LU00gZm9yIHBhZ2UgbWVyZ2luZyIKKwlkZXBlbmRzIG9u IEtTTQorCWhlbHAKKwlVS1NNIGlzIGluc3BpcmVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgcHJvamVj dCBcdTIwMTQgS1NNKEtlcm5lbCBTYW1lCisJcGFnZSBNZXJnaW5nKSwgYnV0IHdpdGggYSBmdW5k YW1lbnRhbGx5IHJld3JpdHRlbiBjb3JlIGFsZ29yaXRobS4gV2l0aAorCWFuIGFkdmFuY2VkIGFs Z29yaXRobSwgVUtTTSBub3cgY2FuIHRyYW5zcGFyZW50bHkgc2NhbnMgYWxsIGFub255bW91c2x5 CisJbWFwcGVkIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggYW4gc2lnbmlmaWNhbnRseSBp bXByb3ZlZCBzY2FuIHNwZWVkCisJYW5kIENQVSBlZmZpY2llbmN5LiBTaW5jZSBLVk0gaXMgZnJp ZW5kbHkgdG8gS1NNLCBLVk0gY2FuIGFsc28gYmVuZWZpdCBmcm9tCisJVUtTTS4gTm93IFVLU00g aGFzIGl0cyBmaXJzdCBzdGFibGUgcmVsZWFzZSBhbmQgZmlyc3QgcmVhbCB3b3JsZCBlbnRlcnBy aXNlIHVzZXIuCisJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBnb3RvIGl0cyBwcm9qZWN0 IHBhZ2UuCisJKHd3dy5rZXJuZWxkZWR1cC5vcmcpCisKK2NvbmZpZyBLU01fTEVHQUNZCisJYm9v bCAiTGVnYWN5IEtTTSBpbXBsZW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIEtTTQorCWhlbHAKKwlU aGUgbGVnYWN5IEtTTSBpbXBsZW1lbnRhdGlvbiBmcm9tIFJlZGhhdC4KK2VuZGNob2ljZQogCiBj b25maWcgREVGQVVMVF9NTUFQX01JTl9BRERSCiAgICAgICAgIGludCAiTG93IGFkZHJlc3Mgc3Bh Y2UgdG8gcHJvdGVjdCBmcm9tIHVzZXIgYWxsb2NhdGlvbiIKZGlmZiAtLWdpdCBhL21tL01ha2Vm aWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggZTI1OWM1ZC4uMmYxN2ZmNSAxMDA2NDQKLS0tIGEvbW0v TWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTQ0LDcgKzQ0LDggQEAgb2JqLSQoQ09ORklH X1NQQVJTRU1FTSkJKz0gc3BhcnNlLm8KIG9iai0kKENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUCkg Kz0gc3BhcnNlLXZtZW1tYXAubwogb2JqLSQoQ09ORklHX1NMT0IpICs9IHNsb2Iubwogb2JqLSQo Q09ORklHX01NVV9OT1RJRklFUikgKz0gbW11X25vdGlmaWVyLm8KLW9iai0kKENPTkZJR19LU00p ICs9IGtzbS5vCitvYmotJChDT05GSUdfS1NNX0xFR0FDWSkgKz0ga3NtLm8KK29iai0kKENPTkZJ R19VS1NNKSArPSB1a3NtLm8KIG9iai0kKENPTkZJR19QQUdFX1BPSVNPTklORykgKz0gZGVidWct cGFnZWFsbG9jLm8KIG9iai0kKENPTkZJR19TTEFCKSArPSBzbGFiLm8KIG9iai0kKENPTkZJR19T TFVCKSArPSBzbHViLm8KZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5k ZXggNjRmODJhYS4uNmRhMWYyOCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVt b3J5LmMKQEAgLTExOCw2ICsxMTgsMjcgQEAgX19zZXR1cCgibm9yYW5kbWFwcyIsIGRpc2FibGVf cmFuZG1hcHMpOwogdW5zaWduZWQgbG9uZyB6ZXJvX3BmbiBfX3JlYWRfbW9zdGx5OwogdW5zaWdu ZWQgbG9uZyBoaWdoZXN0X21lbW1hcF9wZm4gX19yZWFkX21vc3RseTsKIAorI2lmZGVmIENPTkZJ R19VS1NNCit1bnNpZ25lZCBsb25nIHVrc21femVyb19wZm4gX19yZWFkX21vc3RseTsKK3N0cnVj dCBwYWdlICplbXB0eV91a3NtX3plcm9fcGFnZTsKKworc3RhdGljIGludCBfX2luaXQgc2V0dXBf dWtzbV96ZXJvX3BhZ2Uodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJYWRkciA9IF9f Z2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIDApOworCWlmICghYWRkcikK KwkJcGFuaWMoIk9oIGJveSwgdGhhdCBlYXJseSBvdXQgb2YgbWVtb3J5PyIpOworCisJZW1wdHlf dWtzbV96ZXJvX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoKHZvaWQgKikgYWRkcik7CisJU2V0UGFnZVJl c2VydmVkKGVtcHR5X3Vrc21femVyb19wYWdlKTsKKworCXVrc21femVyb19wZm4gPSBwYWdlX3Rv X3BmbihlbXB0eV91a3NtX3plcm9fcGFnZSk7CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNh bGwoc2V0dXBfdWtzbV96ZXJvX3BhZ2UpOworI2VuZGlmCisKIEVYUE9SVF9TWU1CT0woemVyb19w Zm4pOwogCiAvKgpAQCAtMTMxLDYgKzE1Miw3IEBAIHN0YXRpYyBpbnQgX19pbml0IGluaXRfemVy b19wZm4odm9pZCkKIGNvcmVfaW5pdGNhbGwoaW5pdF96ZXJvX3Bmbik7CiAKIAorCiAjaWYgZGVm aW5lZChTUExJVF9SU1NfQ09VTlRJTkcpCiAKIHZvaWQgc3luY19tbV9yc3Moc3RydWN0IG1tX3N0 cnVjdCAqbW0pCkBAIC04NzgsNiArOTAwLDExIEBAIGNvcHlfb25lX3B0ZShzdHJ1Y3QgbW1fc3Ry dWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSwKIAkJCXJzc1tNTV9BTk9OUEFH RVNdKys7CiAJCWVsc2UKIAkJCXJzc1tNTV9GSUxFUEFHRVNdKys7CisKKwkJLyogU2hvdWxkIHJl dHVybiBOVUxMIGluIHZtX25vcm1hbF9wYWdlKCkgKi8KKwkJdWtzbV9idWdvbl96ZXJvcGFnZShw dGUpOworCX0gZWxzZSB7CisJCXVrc21fbWFwX3plcm9fcGFnZShwdGUpOwogCX0KIAogb3V0X3Nl dF9wdGU6CkBAIC0xMTIwLDggKzExNDcsMTAgQEAgYWdhaW46CiAJCQlwdGVudCA9IHB0ZXBfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCBhZGRyLCBwdGUsCiAJCQkJCQkJdGxiLT5mdWxsbW0pOwogCQkJ dGxiX3JlbW92ZV90bGJfZW50cnkodGxiLCBwdGUsIGFkZHIpOwotCQkJaWYgKHVubGlrZWx5KCFw YWdlKSkKKwkJCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJCQl1a3NtX3VubWFwX3plcm9fcGFn ZShwdGVudCk7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAodW5saWtlbHkoZGV0YWlscykg JiYgZGV0YWlscy0+bm9ubGluZWFyX3ZtYQogCQkJICAgICYmIGxpbmVhcl9wYWdlX2luZGV4KGRl dGFpbHMtPm5vbmxpbmVhcl92bWEsCiAJCQkJCQlhZGRyKSAhPSBwYWdlLT5pbmRleCkgewpAQCAt MTk4Miw4ICsyMDExLDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3dfdXNlcl9wYWdlKHN0cnVj dCBwYWdlICpkc3QsIHN0cnVjdCBwYWdlICpzcmMsIHVuc2lnbmVkIGxvCiAJCQljbGVhcl9wYWdl KGthZGRyKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkcik7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKGRz dCk7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJY29weV91c2VyX2hpZ2hwYWdlKGRzdCwgc3JjLCB2 YSwgdm1hKTsKKwkJdWtzbV9jb3dfcGFnZSh2bWEsIHNyYyk7CisJfQogfQogCiAvKgpAQCAtMjE5 Nyw2ICsyMjI4LDcgQEAgZ290dGVuOgogCQluZXdfcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hp Z2hwYWdlX21vdmFibGUodm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8g b29tOworCQl1a3NtX2Nvd19wdGUodm1hLCBvcmlnX3B0ZSk7CiAJfSBlbHNlIHsKIAkJbmV3X3Bh Z2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsK IAkJaWYgKCFuZXdfcGFnZSkKQEAgLTIyMjIsOCArMjI1NCwxMSBAQCBnb3R0ZW46CiAJCQkJZGVj X21tX2NvdW50ZXJfZmFzdChtbSwgTU1fRklMRVBBR0VTKTsKIAkJCQlpbmNfbW1fY291bnRlcl9m YXN0KG1tLCBNTV9BTk9OUEFHRVMpOwogCQkJfQotCQl9IGVsc2UKKwkJCXVrc21fYnVnb25femVy b3BhZ2Uob3JpZ19wdGUpOworCQl9IGVsc2UgeworCQkJdWtzbV91bm1hcF96ZXJvX3BhZ2Uob3Jp Z19wdGUpOwogCQkJaW5jX21tX2NvdW50ZXJfZmFzdChtbSwgTU1fQU5PTlBBR0VTKTsKKwkJfQog CQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOwogCQll bnRyeSA9IG1rX3B0ZShuZXdfcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpOwogCQllbnRyeSA9IG1h eWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwpkaWZmIC0tZ2l0IGEvbW0vbW1h cC5jIGIvbW0vbW1hcC5jCmluZGV4IGVkMTFiNDMuLjllODczODMgMTAwNjQ0Ci0tLSBhL21tL21t YXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9u b3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgogI2luY2x1ZGUgPGxpbnV4L3By aW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2tzbS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3Mu aD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjc5LDYgKzI4MCw3IEBAIHN0YXRp YyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnJlbW92ZV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEpCiAJaWYgKHZtYS0+dm1fZmlsZSkKIAkJZnB1dCh2bWEtPnZtX2ZpbGUpOwogCW1wb2xf cHV0KHZtYV9wb2xpY3kodm1hKSk7CisJdWtzbV9yZW1vdmVfdm1hKHZtYSk7CiAJa21lbV9jYWNo ZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogCXJldHVybiBuZXh0OwogfQpAQCAtNzM5LDkg Kzc0MSwxNiBAQCBpbnQgdm1hX2FkanVzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5z aWduZWQgbG9uZyBzdGFydCwKIAlsb25nIGFkanVzdF9uZXh0ID0gMDsKIAlpbnQgcmVtb3ZlX25l eHQgPSAwOwogCisvKgorICogdG8gYXZvaWQgZGVhZGxvY2ssIGtzbV9yZW1vdmVfdm1hIG11c3Qg YmUgZG9uZSBiZWZvcmUgYW55IHNwaW5fbG9jayBpcworICogYWNxdWlyZWQKKyAqLworCXVrc21f cmVtb3ZlX3ZtYSh2bWEpOworCiAJaWYgKG5leHQgJiYgIWluc2VydCkgewogCQlzdHJ1Y3Qgdm1f YXJlYV9zdHJ1Y3QgKmV4cG9ydGVyID0gTlVMTDsKIAorCQl1a3NtX3JlbW92ZV92bWEobmV4dCk7 CiAJCWlmIChlbmQgPj0gbmV4dC0+dm1fZW5kKSB7CiAJCQkvKgogCQkJICogdm1hIGV4cGFuZHMs IG92ZXJsYXBwaW5nIGFsbCB0aGUgbmV4dCwgYW5kCkBAIC04MzUsNiArODQ0LDcgQEAgYWdhaW46 CQkJcmVtb3ZlX25leHQgPSAxICsgKGVuZCA+IG5leHQtPnZtX2VuZCk7CiAJCWVuZF9jaGFuZ2Vk ID0gdHJ1ZTsKIAl9CiAJdm1hLT52bV9wZ29mZiA9IHBnb2ZmOworCiAJaWYgKGFkanVzdF9uZXh0 KSB7CiAJCW5leHQtPnZtX3N0YXJ0ICs9IGFkanVzdF9uZXh0IDw8IFBBR0VfU0hJRlQ7CiAJCW5l eHQtPnZtX3Bnb2ZmICs9IGFkanVzdF9uZXh0OwpAQCAtOTA1LDE2ICs5MTUsMjIgQEAgYWdhaW46 CQkJcmVtb3ZlX25leHQgPSAxICsgKGVuZCA+IG5leHQtPnZtX2VuZCk7CiAJCSAqIHVwIHRoZSBj b2RlIHRvbyBtdWNoIHRvIGRvIGJvdGggaW4gb25lIGdvLgogCQkgKi8KIAkJbmV4dCA9IHZtYS0+ dm1fbmV4dDsKLQkJaWYgKHJlbW92ZV9uZXh0ID09IDIpCisJCWlmIChyZW1vdmVfbmV4dCA9PSAy KSB7CisJCQl1a3NtX3JlbW92ZV92bWEobmV4dCk7CiAJCQlnb3RvIGFnYWluOwotCQllbHNlIGlm IChuZXh0KQorCQl9IGVsc2UgaWYgKG5leHQpIHsKIAkJCXZtYV9nYXBfdXBkYXRlKG5leHQpOwot CQllbHNlCisJCX0gZWxzZSB7CiAJCQltbS0+aGlnaGVzdF92bV9lbmQgPSBlbmQ7CisJCX0KKwl9 IGVsc2UgeworCQlpZiAobmV4dCAmJiAhaW5zZXJ0KQorCQkJdWtzbV92bWFfYWRkX25ldyhuZXh0 KTsKIAl9CiAJaWYgKGluc2VydCAmJiBmaWxlKQogCQl1cHJvYmVfbW1hcChpbnNlcnQpOwogCisJ dWtzbV92bWFfYWRkX25ldyh2bWEpOwogCXZhbGlkYXRlX21tKG1tKTsKIAogCXJldHVybiAwOwpA QCAtMTMwNyw2ICsxMzIzLDkgQEAgdW5zaWduZWQgbG9uZyBkb19tbWFwX3Bnb2ZmKHN0cnVjdCBm aWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdm1fZmxhZ3MgPSBjYWxjX3ZtX3Byb3Rf Yml0cyhwcm90KSB8IGNhbGNfdm1fZmxhZ19iaXRzKGZsYWdzKSB8CiAJCQltbS0+ZGVmX2ZsYWdz IHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQzsKIAorCS8qIElmIHVrc20g aXMgZW5hYmxlZCwgd2UgYWRkIFZNX01FUkdBQkxFIHRvIG5ldyBWTUFzLiAqLworCXVrc21fdm1f ZmxhZ3NfbW9kKCZ2bV9mbGFncyk7CisKIAlpZiAoZmxhZ3MgJiBNQVBfTE9DS0VEKQogCQlpZiAo IWNhbl9kb19tbG9jaygpKQogCQkJcmV0dXJuIC1FUEVSTTsKQEAgLTE2NDgsNiArMTY2Nyw3IEBA IG11bm1hcF9iYWNrOgogCQkJYWxsb3dfd3JpdGVfYWNjZXNzKGZpbGUpOwogCX0KIAlmaWxlID0g dm1hLT52bV9maWxlOworCXVrc21fdm1hX2FkZF9uZXcodm1hKTsKIG91dDoKIAlwZXJmX2V2ZW50 X21tYXAodm1hKTsKIApAQCAtMTY4OSw2ICsxNzA5LDcgQEAgYWxsb3dfd3JpdGVfYW5kX2ZyZWVf dm1hOgogCWlmICh2bV9mbGFncyAmIFZNX0RFTllXUklURSkKIAkJYWxsb3dfd3JpdGVfYWNjZXNz KGZpbGUpOwogZnJlZV92bWE6CisJdWtzbV9yZW1vdmVfdm1hKHZtYSk7CiAJa21lbV9jYWNoZV9m cmVlKHZtX2FyZWFfY2FjaGVwLCB2bWEpOwogdW5hY2N0X2Vycm9yOgogCWlmIChjaGFyZ2VkKQpA QCAtMjQ4NCw2ICsyNTA1LDggQEAgc3RhdGljIGludCBfX3NwbGl0X3ZtYShzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJZWxzZQogCQllcnIgPSB2bWFf YWRqdXN0KHZtYSwgdm1hLT52bV9zdGFydCwgYWRkciwgdm1hLT52bV9wZ29mZiwgbmV3KTsKIAor CXVrc21fdm1hX2FkZF9uZXcobmV3KTsKKwogCS8qIFN1Y2Nlc3MuICovCiAJaWYgKCFlcnIpCiAJ CXJldHVybiAwOwpAQCAtMjcxOSw2ICsyNzQyLDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9f YnJrKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiAJCXJldHVybiBhZGRy OwogCiAJZmxhZ3MgPSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MgfCBWTV9BQ0NPVU5UIHwgbW0tPmRl Zl9mbGFnczsKKwl1a3NtX3ZtX2ZsYWdzX21vZCgmZmxhZ3MpOwogCiAJZXJyb3IgPSBnZXRfdW5t YXBwZWRfYXJlYShOVUxMLCBhZGRyLCBsZW4sIDAsIE1BUF9GSVhFRCk7CiAJaWYgKGVycm9yICYg flBBR0VfTUFTSykKQEAgLTI3NzcsNiArMjgwMSw3IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRv X2Jyayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogCXZtYS0+dm1fZmxh Z3MgPSBmbGFnczsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHZtX2dldF9wYWdlX3Byb3QoZmxhZ3Mp OwogCXZtYV9saW5rKG1tLCB2bWEsIHByZXYsIHJiX2xpbmssIHJiX3BhcmVudCk7CisJdWtzbV92 bWFfYWRkX25ldyh2bWEpOwogb3V0OgogCXBlcmZfZXZlbnRfbW1hcCh2bWEpOwogCW1tLT50b3Rh bF92bSArPSBsZW4gPj4gUEFHRV9TSElGVDsKQEAgLTI4MTIsNiArMjgzNywxMiBAQCB2b2lkIGV4 aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAkvKiBtbSdzIGxhc3QgdXNlciBoYXMgZ29u ZSwgYW5kIGl0cyBhYm91dCB0byBiZSBwdWxsZWQgZG93biAqLwogCW1tdV9ub3RpZmllcl9yZWxl YXNlKG1tKTsKIAorCS8qCisJICogVGFraW5nIHdyaXRlIGxvY2sgb24gbW1hcF9zZW0gZG9lcyBu b3QgaGFybSBvdGhlcnMsCisJICogYnV0IGl0J3MgY3J1Y2lhbCBmb3IgdWtzbSB0byBhdm9pZCBy YWNlcy4KKwkgKi8KKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCiAJaWYgKG1tLT5sb2Nr ZWRfdm0pIHsKIAkJdm1hID0gbW0tPm1tYXA7CiAJCXdoaWxlICh2bWEpIHsKQEAgLTI4NDgsNiAr Mjg3OSwxMSBAQCB2b2lkIGV4aXRfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIAl9CiAJdm1f dW5hY2N0X21lbW9yeShucl9hY2NvdW50ZWQpOwogCisJbW0tPm1tYXAgPSBOVUxMOworCW1tLT5t bV9yYiA9IFJCX1JPT1Q7CisJdm1hY2FjaGVfaW52YWxpZGF0ZShtbSk7CisJdXBfd3JpdGUoJm1t LT5tbWFwX3NlbSk7CisKIAlXQVJOX09OKGF0b21pY19sb25nX3JlYWQoJm1tLT5ucl9wdGVzKSA+ CiAJCQkoRklSU1RfVVNFUl9BRERSRVNTK1BNRF9TSVpFLTEpPj5QTURfU0hJRlQpOwogfQpAQCAt Mjk1Niw2ICsyOTkyLDcgQEAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpjb3B5X3ZtYShzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKip2bWFwLAogCQkJCW5ld192bWEtPnZtX29wcy0+b3BlbihuZXdfdm1h KTsKIAkJCXZtYV9saW5rKG1tLCBuZXdfdm1hLCBwcmV2LCByYl9saW5rLCByYl9wYXJlbnQpOwog CQkJKm5lZWRfcm1hcF9sb2NrcyA9IGZhbHNlOworCQkJdWtzbV92bWFfYWRkX25ldyhuZXdfdm1h KTsKIAkJfQogCX0KIAlyZXR1cm4gbmV3X3ZtYTsKQEAgLTMwNjksMTAgKzMxMDYsMTAgQEAgc3Rh dGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19pbnN0YWxsX3NwZWNpYWxfbWFwcGluZygKIAly ZXQgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0Owot CiAJbW0tPnRvdGFsX3ZtICs9IGxlbiA+PiBQQUdFX1NISUZUOwogCiAJcGVyZl9ldmVudF9tbWFw KHZtYSk7CisJdWtzbV92bWFfYWRkX25ldyh2bWEpOwogCiAJcmV0dXJuIHZtYTsKIApkaWZmIC0t Z2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDExNmE1MDUuLjhmM2NhZjIgMTAwNjQ0 Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTkwNiw5ICs5MDYsOSBAQCB2b2lk IHBhZ2VfbW92ZV9hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsCiAKIC8qKgogICogX19wYWdl X3NldF9hbm9uX3JtYXAgLSBzZXQgdXAgbmV3IGFub255bW91cyBybWFwCi0gKiBAcGFnZToJUGFn ZSB0byBhZGQgdG8gcm1hcAkKKyAqIEBwYWdlOglQYWdlIHRvIGFkZCB0byBybWFwCiAgKiBAdm1h OglWTSBhcmVhIHRvIGFkZCBwYWdlIHRvLgotICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRy ZXNzIG9mIHRoZSBtYXBwaW5nCQorICogQGFkZHJlc3M6CVVzZXIgdmlydHVhbCBhZGRyZXNzIG9m IHRoZSBtYXBwaW5nCiAgKiBAZXhjbHVzaXZlOgl0aGUgcGFnZSBpcyBleGNsdXNpdmVseSBvd25l ZCBieSB0aGUgY3VycmVudCBwcm9jZXNzCiAgKi8KIHN0YXRpYyB2b2lkIF9fcGFnZV9zZXRfYW5v bl9ybWFwKHN0cnVjdCBwYWdlICpwYWdlLApkaWZmIC0tZ2l0IGEvbW0vdWtzbS5jIGIvbW0vdWtz bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDk3NjYKLS0tIC9kZXYv bnVsbAorKysgYi9tbS91a3NtLmMKQEAgLTAsMCArMSw1NTMxIEBACisvKgorICogVWx0cmEgS1NN LiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBOYWkgWGlhCisgKgorICogVGhpcyBpcyBhbiBpbXBy b3ZlbWVudCB1cG9uIEtTTS4gU29tZSBiYXNpYyBkYXRhIHN0cnVjdHVyZXMgYW5kIHJvdXRpbmVz CisgKiBhcmUgYm9ycm93ZWQgZnJvbSBrc20uYyAuCisgKgorICogSXRzIG5ldyBmZWF0dXJlczoK KyAqIDEuIEZ1bGwgc3lzdGVtIHNjYW46CisgKiAgICAgIEl0IGF1dG9tYXRpY2FsbHkgc2NhbnMg YWxsIHVzZXIgcHJvY2Vzc2VzJyBhbm9ueW1vdXMgVk1Bcy4gS2VybmVsLXVzZXIKKyAqICAgICAg aW50ZXJhY3Rpb24gdG8gc3VibWl0IGEgbWVtb3J5IGFyZWEgdG8gS1NNIGlzIG5vIGxvbmdlciBu ZWVkZWQuCisgKgorICogMi4gUmljaCBhcmVhIGRldGVjdGlvbjoKKyAqICAgICAgSXQgYXV0b21h dGljYWxseSBkZXRlY3RzIHJpY2ggYXJlYXMgY29udGFpbmluZyBhYnVuZGFudCBkdXBsaWNhdGVk CisgKiAgICAgIHBhZ2VzIGJhc2VkLiBSaWNoIGFyZWFzIGFyZSBnaXZlbiBhIGZ1bGwgc2NhbiBz cGVlZC4gUG9vciBhcmVhcyBhcmUKKyAqICAgICAgc2FtcGxlZCBhdCBhIHJlYXNvbmFibGUgc3Bl ZWQgd2l0aCB2ZXJ5IGxvdyBDUFUgY29uc3VtcHRpb24uCisgKgorICogMy4gVWx0cmEgUGVyLXBh Z2Ugc2NhbiBzcGVlZCBpbXByb3ZlbWVudDoKKyAqICAgICAgQSBuZXcgaGFzaCBhbGdvcml0aG0g aXMgcHJvcG9zZWQuIEFzIGEgcmVzdWx0LCBvbiBhIG1hY2hpbmUgd2l0aAorICogICAgICBDb3Jl KFRNKTIgUXVhZCBROTMwMCBDUFUgaW4gMzItYml0IG1vZGUgYW5kIDgwME1IWiBERFIyIG1haW4g bWVtb3J5LCBpdAorICogICAgICBjYW4gc2NhbiBtZW1vcnkgYXJlYXMgdGhhdCBkb2VzIG5vdCBj b250YWluIGR1cGxpY2F0ZWQgcGFnZXMgYXQgc3BlZWQgb2YKKyAqICAgICAgNjI3TUIvc2VjIH4g MjQ0NU1CL3NlYyBhbmQgY2FuIG1lcmdlIGR1cGxpY2F0ZWQgYXJlYXMgYXQgc3BlZWQgb2YKKyAq ICAgICAgNDc3TUIvc2VjIH4gOTIzTUIvc2VjLgorICoKKyAqIDQuIFRocmFzaGluZyBhcmVhIGF2 b2lkYW5jZToKKyAqICAgICAgVGhyYXNoaW5nIGFyZWEoYW4gVk1BIHRoYXQgaGFzIGZyZXF1ZW50 IEtzbSBwYWdlIGJyZWFrLW91dCkgY2FuIGJlCisgKiAgICAgIGZpbHRlcmVkIG91dC4gTXkgYmVu Y2htYXJrIHNob3dzIGl0J3MgbW9yZSBlZmZpY2llbnQgdGhhbiBLU00ncyBwZXItcGFnZQorICog ICAgICBoYXNoIHZhbHVlIGJhc2VkIHZvbGF0aWxlIHBhZ2UgZGV0ZWN0aW9uLgorICoKKyAqCisg KiA1LiBNaXNjIGNoYW5nZXMgdXBvbiBLU006CisgKiAgICAgICogSXQgaGFzIGEgZnVsbHkgeDg2 LW9waXRtaXplZCBtZW1jbXAgZGVkaWNhdGVkIGZvciA0LWJ5dGUtYWxpZ25lZCBwYWdlCisgKiAg ICAgICAgY29tcGFyaXNvbi4gSXQncyBtdWNoIGZhc3RlciB0aGFuIGRlZmF1bHQgQyB2ZXJzaW9u IG9uIHg4Ni4KKyAqICAgICAgKiBybWFwX2l0ZW0gbm93IGhhcyBhbiBzdHJ1Y3QgKnBhZ2UgbWVt YmVyIHRvIGxvb3NlbHkgY2FjaGUgYQorICogICAgICAgIGFkZHJlc3MtLT5wYWdlIG1hcHBpbmcs IHdoaWNoIHJlZHVjZXMgdG9vIG11Y2ggdGltZS1jb3N0bHkKKyAqICAgICAgICBmb2xsb3dfcGFn ZSgpLgorICogICAgICAqIFRoZSBWTUEgY3JlYXRpb24vZXhpdCBwcm9jZWR1cmVzIGFyZSBob29r ZWQgdG8gbGV0IHRoZSBVbHRyYSBLU00ga25vdy4KKyAqICAgICAgKiB0cnlfdG9fbWVyZ2VfdHdv X3BhZ2VzKCkgbm93IGNhbiByZXZlcnQgYSBwdGUgaWYgaXQgZmFpbHMuIE5vIGJyZWFrXworICog ICAgICAgIGtzbSBpcyBuZWVkZWQgZm9yIHRoaXMgY2FzZS4KKyAqCisgKiA2LiBGdWxsIFplcm8g UGFnZSBjb25zaWRlcmF0aW9uKGNvbnRyaWJ1dGVkIGJ5IEZpZ28gWmhhbmcpCisgKiAgICBOb3cg dWtzbWQgY29uc2lkZXIgZnVsbCB6ZXJvIHBhZ2VzIGFzIHNwZWNpYWwgcGFnZXMgYW5kIG1lcmdl IHRoZW0gdG8gYW4KKyAqICAgIHNwZWNpYWwgdW5zd2FwcGFibGUgdWtzbSB6ZXJvIHBhZ2UuCisg Ki8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNp bmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxs aW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgv cGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlu bG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXku aD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgor I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNs dWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNp bmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgva3NtLmg+CisjaW5jbHVkZSA8 bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRl IDxjcnlwdG8vaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxp bnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2djZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zy ZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcmFkaXgtdHJlZS5oPgorCisvKiBGaXggbWlzc2Vk IGtlcm5lbC5oIGZvciBzdHJpY3Rfc3RydG91bCBmdW5jdGlvbiAqLworI2RlZmluZSBzdHJpY3Rf c3RydG91bCAga3N0cnRvdWwKKworI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUg ImludGVybmFsLmgiCisKKyNpZmRlZiBDT05GSUdfWDg2CisjdW5kZWYgbWVtY21wCisKKyNpZmRl ZiBDT05GSUdfWDg2XzMyCisjZGVmaW5lIG1lbWNtcCBtZW1jbXB4ODZfMzIKKy8qCisgKiBDb21w YXJlIDQtYnl0ZS1hbGlnbmVkIGFkZHJlc3MgczEgYW5kIHMyLCB3aXRoIGxlbmd0aCBuCisgKi8K K2ludCBtZW1jbXB4ODZfMzIodm9pZCAqczEsIHZvaWQgKnMyLCBzaXplX3QgbikKK3sKKwlzaXpl X3QgbnVtID0gbiAvIDQ7CisJcmVnaXN0ZXIgaW50IHJlczsKKworCV9fYXNtX18gX192b2xhdGls ZV9fCisJKAorCSAidGVzdGwgJTMsJTNcblx0IgorCSAicmVwZTsgY21wc2Rcblx0IgorCSAiamUg ICAgICAgIDFmXG5cdCIKKwkgInNiYmwgICAgICAlMCwlMFxuXHQiCisJICJvcmwgICAgICAgJDEs JTBcbiIKKwkgIjE6IgorCSA6ICI9JmEiIChyZXMpLCAiKyZTIiAoczEpLCAiKyZEIiAoczIpLCAi KyZjIiAobnVtKQorCSA6ICIwIiAoMCkKKwkgOiAiY2MiKTsKKworCXJldHVybiByZXM7Cit9CisK Ky8qCisgKiBDaGVjayB0aGUgcGFnZSBpcyBhbGwgemVybyA/CisgKi8KK3N0YXRpYyBpbnQgaXNf ZnVsbF96ZXJvKGNvbnN0IHZvaWQgKnMxLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGNoYXIg c2FtZTsKKworCWxlbiAvPSA0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18KKwkoInJlcGU7IHNj YXNsOyIKKwkgInNldGUgJTAiCisJIDogIj1xbSIgKHNhbWUpLCAiK0QiIChzMSksICIrYyIgKGxl bikKKwkgOiAiYSIgKDApCisJIDogImNjIik7CisKKwlyZXR1cm4gc2FtZTsKK30KKworCisjZWxp ZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisjZGVmaW5lIG1lbWNtcCBtZW1jbXB4ODZfNjQKKy8q CisgKiBDb21wYXJlIDgtYnl0ZS1hbGlnbmVkIGFkZHJlc3MgczEgYW5kIHMyLCB3aXRoIGxlbmd0 aCBuCisgKi8KK2ludCBtZW1jbXB4ODZfNjQodm9pZCAqczEsIHZvaWQgKnMyLCBzaXplX3QgbikK K3sKKwlzaXplX3QgbnVtID0gbiAvIDg7CisJcmVnaXN0ZXIgaW50IHJlczsKKworCV9fYXNtX18g X192b2xhdGlsZV9fCisJKAorCSAidGVzdHEgJXEzLCVxM1xuXHQiCisJICJyZXBlOyBjbXBzcVxu XHQiCisJICJqZSAgICAgICAgMWZcblx0IgorCSAic2JicSAgICAgICVxMCwlcTBcblx0IgorCSAi b3JxICAgICAgICQxLCVxMFxuIgorCSAiMToiCisJIDogIj0mYSIgKHJlcyksICIrJlMiIChzMSks ICIrJkQiIChzMiksICIrJmMiIChudW0pCisJIDogIjAiICgwKQorCSA6ICJjYyIpOworCisJcmV0 dXJuIHJlczsKK30KKworc3RhdGljIGludCBpc19mdWxsX3plcm8oY29uc3Qgdm9pZCAqczEsIHNp emVfdCBsZW4pCit7CisJdW5zaWduZWQgY2hhciBzYW1lOworCisJbGVuIC89IDg7CisKKwlfX2Fz bV9fIF9fdm9sYXRpbGVfXworCSgicmVwZTsgc2Nhc3E7IgorCSAic2V0ZSAlMCIKKwkgOiAiPXFt IiAoc2FtZSksICIrRCIgKHMxKSwgIitjIiAobGVuKQorCSA6ICJhIiAoMCkKKwkgOiAiY2MiKTsK KworCXJldHVybiBzYW1lOworfQorCisjZW5kaWYKKyNlbHNlCitzdGF0aWMgaW50IGlzX2Z1bGxf emVybyhjb25zdCB2b2lkICpzMSwgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nICpzcmMg PSBzMTsKKwlpbnQgaTsKKworCWxlbiAvPSBzaXplb2YoKnNyYyk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbGVuOyBpKyspIHsKKwkJaWYgKHNyY1tpXSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVy biAxOworfQorI2VuZGlmCisKKyNkZWZpbmUgVUtTTV9SVU5HX1JPVU5EX0ZJTklTSEVEICAoMSA8 PCAwKQorI2RlZmluZSBUSU1FX1JBVElPX1NDQUxFCTEwMDAwCisKKyNkZWZpbmUgU0xPVF9UUkVF X05PREVfU0hJRlQJOAorI2RlZmluZSBTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFCSgxVUwgPDwg U0xPVF9UUkVFX05PREVfU0hJRlQpCitzdHJ1Y3Qgc2xvdF90cmVlX25vZGUgeworCXVuc2lnbmVk IGxvbmcgc2l6ZTsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSBzbm9kZTsKKwl2b2lkICpzdG9y ZXNbU0xPVF9UUkVFX05PREVfU1RPUkVfU0laRV07Cit9OworCitzdGF0aWMgc3RydWN0IGttZW1f Y2FjaGUgKnNsb3RfdHJlZV9ub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBzcmFkaXhfdHJl ZV9ub2RlICpzbG90X3RyZWVfbm9kZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBzbG90X3RyZWVf bm9kZSAqcDsKKwlwID0ga21lbV9jYWNoZV96YWxsb2Moc2xvdF90cmVlX25vZGVfY2FjaGVwLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZwLT5zbm9k ZTsKK30KKworc3RhdGljIHZvaWQgc2xvdF90cmVlX25vZGVfZnJlZShzdHJ1Y3Qgc3JhZGl4X3Ry ZWVfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3Qgc2xvdF90cmVlX25vZGUgKnA7CisKKwlwID0gY29u dGFpbmVyX29mKG5vZGUsIHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCWttZW1fY2Fj aGVfZnJlZShzbG90X3RyZWVfbm9kZV9jYWNoZXAsIHApOworfQorCitzdGF0aWMgdm9pZCBzbG90 X3RyZWVfbm9kZV9leHRlbmQoc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKnBhcmVudCwKKwkJCQkg IHN0cnVjdCBzcmFkaXhfdHJlZV9ub2RlICpjaGlsZCkKK3sKKwlzdHJ1Y3Qgc2xvdF90cmVlX25v ZGUgKnAsICpjOworCisJcCA9IGNvbnRhaW5lcl9vZihwYXJlbnQsIHN0cnVjdCBzbG90X3RyZWVf bm9kZSwgc25vZGUpOworCWMgPSBjb250YWluZXJfb2YoY2hpbGQsIHN0cnVjdCBzbG90X3RyZWVf bm9kZSwgc25vZGUpOworCisJcC0+c2l6ZSArPSBjLT5zaXplOworfQorCit2b2lkIHNsb3RfdHJl ZV9ub2RlX2Fzc2lnbihzdHJ1Y3Qgc3JhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHVuc2ln bmVkIGluZGV4LCB2b2lkICppdGVtKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCA9IGl0ZW07 CisJc3RydWN0IHNsb3RfdHJlZV9ub2RlICpjdXI7CisKKwlzbG90LT5zbm9kZSA9IG5vZGU7CisJ c2xvdC0+c2luZGV4ID0gaW5kZXg7CisKKwl3aGlsZSAobm9kZSkgeworCQljdXIgPSBjb250YWlu ZXJfb2Yobm9kZSwgc3RydWN0IHNsb3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWN1ci0+c2l6ZSAr PSBzbG90LT5wYWdlczsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwl9Cit9CisKK3ZvaWQgc2xv dF90cmVlX25vZGVfcm0oc3RydWN0IHNyYWRpeF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIG9m ZnNldCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfdHJlZV9ub2Rl ICpjdXI7CisJdW5zaWduZWQgbG9uZyBwYWdlczsKKworCWlmIChub2RlLT5oZWlnaHQgPT0gMSkg eworCQlzbG90ID0gbm9kZS0+c3RvcmVzW29mZnNldF07CisJCXBhZ2VzID0gc2xvdC0+cGFnZXM7 CisJfSBlbHNlIHsKKwkJY3VyID0gY29udGFpbmVyX29mKG5vZGUtPnN0b3Jlc1tvZmZzZXRdLAor CQkJCSAgIHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCQlwYWdlcyA9IGN1ci0+c2l6 ZTsKKwl9CisKKwl3aGlsZSAobm9kZSkgeworCQljdXIgPSBjb250YWluZXJfb2Yobm9kZSwgc3Ry dWN0IHNsb3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWN1ci0+c2l6ZSAtPSBwYWdlczsKKwkJbm9k ZSA9IG5vZGUtPnBhcmVudDsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgc2xvdF9pdGVyX2luZGV4 OworaW50IHNsb3RfaXRlcih2b2lkICppdGVtLCAgdW5zaWduZWQgbG9uZyBoZWlnaHQpCit7CisJ c3RydWN0IHNsb3RfdHJlZV9ub2RlICpub2RlOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwor CWlmIChoZWlnaHQgPT0gMSkgeworCQlzbG90ID0gaXRlbTsKKwkJaWYgKHNsb3RfaXRlcl9pbmRl eCA8IHNsb3QtPnBhZ2VzKSB7CisJCQkvKmluIHRoaXMgb25lKi8KKwkJCXJldHVybiAxOworCQl9 IGVsc2UgeworCQkJc2xvdF9pdGVyX2luZGV4IC09IHNsb3QtPnBhZ2VzOworCQkJcmV0dXJuIDA7 CisJCX0KKworCX0gZWxzZSB7CisJCW5vZGUgPSBjb250YWluZXJfb2YoaXRlbSwgc3RydWN0IHNs b3RfdHJlZV9ub2RlLCBzbm9kZSk7CisJCWlmIChzbG90X2l0ZXJfaW5kZXggPCBub2RlLT5zaXpl KSB7CisJCQkvKmluIHRoaXMgb25lKi8KKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJc2xv dF9pdGVyX2luZGV4IC09IG5vZGUtPnNpemU7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKwor CitzdGF0aWMgaW5saW5lIHZvaWQgc2xvdF90cmVlX2luaXRfcm9vdChzdHJ1Y3Qgc3JhZGl4X3Ry ZWVfcm9vdCAqcm9vdCkKK3sKKwlpbml0X3NyYWRpeF90cmVlX3Jvb3Qocm9vdCwgU0xPVF9UUkVF X05PREVfU0hJRlQpOworCXJvb3QtPmFsbG9jID0gc2xvdF90cmVlX25vZGVfYWxsb2M7CisJcm9v dC0+ZnJlZSA9IHNsb3RfdHJlZV9ub2RlX2ZyZWU7CisJcm9vdC0+ZXh0ZW5kID0gc2xvdF90cmVl X25vZGVfZXh0ZW5kOworCXJvb3QtPmFzc2lnbiA9IHNsb3RfdHJlZV9ub2RlX2Fzc2lnbjsKKwly b290LT5ybSA9IHNsb3RfdHJlZV9ub2RlX3JtOworfQorCit2b2lkIHNsb3RfdHJlZV9pbml0KHZv aWQpCit7CisJc2xvdF90cmVlX25vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNsb3Rf dHJlZV9ub2RlIiwKKwkJCQlzaXplb2Yoc3RydWN0IHNsb3RfdHJlZV9ub2RlKSwgMCwKKwkJCQlT TEFCX1BBTklDIHwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJTlVMTCk7Cit9CisKKworLyog RWFjaCBydW5nIG9mIHRoaXMgbGFkZGVyIGlzIGEgbGlzdCBvZiBWTUFzIGhhdmluZyBhIHNhbWUg c2NhbiByYXRpbyAqLworc3RydWN0IHNjYW5fcnVuZyB7CisJLy9zdHJ1Y3QgbGlzdF9oZWFkIHNj YW5uZWRfbGlzdDsKKwlzdHJ1Y3Qgc3JhZGl4X3RyZWVfcm9vdCB2bWFfcm9vdDsKKwlzdHJ1Y3Qg c3JhZGl4X3RyZWVfcm9vdCB2bWFfcm9vdDI7CisKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKmN1cnJlbnRf c2NhbjsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OworCisJLyoKKwkgKiBUaGUgaW5p dGlhbCB2YWx1ZSBmb3IgY3VycmVudF9vZmZzZXQsIGl0IHNob3VsZCBsb29wIG92ZXIKKwkgKiBb MH4gc3RlcCAtIDFdIHRvIGxldCBhbGwgc2xvdCBoYXZlIGl0cyBjaGFuY2UgdG8gYmUgc2Nhbm5l ZC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldF9pbml0OworCXVuc2lnbmVkIGxvbmcgc3Rl cDsgLyogZHluYW1pYyBzdGVwIGZvciBjdXJyZW50X29mZnNldCAqLworCXVuc2lnbmVkIGludCBm bGFnczsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3NjYW47CisJLy91bnNpZ25lZCBsb25nIGZ1 bGx5X3NjYW5uZWRfc2xvdHM7CisJLyoKKwkgKiBhIGxpdHRsZSBiaXQgdHJpY2t5IC0gaWYgY3B1 X3RpbWVfcmF0aW8gPiAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB0aGUKKwkgKiB0aGUgY3B1IHRpbWUg cmF0aW8gaXQgY2FuIHNwZW5kIGluIHJ1bmdfaSBmb3IgZXZlcnkgc2NhbgorCSAqIHBlcmlvZC4g aWYgPCAwLCB0aGVuIGl0IGlzIHRoZSBjcHUgdGltZSByYXRpbyByZWxhdGl2ZSB0byB0aGUKKwkg KiBtYXggY3B1IHBlcmNlbnRhZ2UgdXNlciBzcGVjaWZpZWQuIEJvdGggaW4gdW5pdCBvZgorCSAq IDEvVElNRV9SQVRJT19TQ0FMRQorCSAqLworCWludCBjcHVfcmF0aW87CisKKwkvKgorCSAqIEhv dyBsb25nIGl0IHdpbGwgdGFrZSBmb3IgYWxsIHNsb3RzIGluIHRoaXMgcnVuZyB0byBiZSBmdWxs eQorCSAqIHNjYW5uZWQ/IElmIGl0J3MgemVybywgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY292 ZXIgdGltZToKKwkgKiBpdCdzIGZ1bGx5IHNjYW5uZWQuCisJICovCisJdW5zaWduZWQgaW50IGNv dmVyX21zZWNzOworCS8vdW5zaWduZWQgbG9uZyB2bWFfbnVtOworCS8vdW5zaWduZWQgbG9uZyBw YWdlczsgLyogU3VtIG9mIGFsbCBzbG90J3MgcGFnZXMgaW4gcnVuZyAqLworfTsKKworLyoqCisg KiBub2RlIG9mIGVpdGhlciB0aGUgc3RhYmxlIG9yIHVuc3RhbGUgcmJ0cmVlCisgKgorICovCitz dHJ1Y3QgdHJlZV9ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOyAvKiBsaW5rIGluIHRoZSBt YWluICh1bilzdGFibGUgcmJ0cmVlICovCisJc3RydWN0IHJiX3Jvb3Qgc3ViX3Jvb3Q7IC8qIHJi X3Jvb3QgZm9yIHN1YmxldmVsIGNvbGxpc2lvbiByYnRyZWUgKi8KKwl1MzIgaGFzaDsKKwl1bnNp Z25lZCBsb25nIGNvdW50OyAvKiBUT0RPOiBtZXJnZWQgd2l0aCBzdWJfcm9vdCAqLworCXN0cnVj dCBsaXN0X2hlYWQgYWxsX2xpc3Q7IC8qIGFsbCB0cmVlIG5vZGVzIGluIHN0YWJsZS91bnN0YWJs ZSB0cmVlICovCit9OworCisvKioKKyAqIHN0cnVjdCBzdGFibGVfbm9kZSAtIG5vZGUgb2YgdGhl IHN0YWJsZSByYnRyZWUKKyAqIEBub2RlOiByYiBub2RlIG9mIHRoaXMga3NtIHBhZ2UgaW4gdGhl IHN0YWJsZSB0cmVlCisgKiBAaGxpc3Q6IGhsaXN0IGhlYWQgb2Ygcm1hcF9pdGVtcyB1c2luZyB0 aGlzIGtzbSBwYWdlCisgKiBAa3BmbjogcGFnZSBmcmFtZSBudW1iZXIgb2YgdGhpcyBrc20gcGFn ZQorICovCitzdHJ1Y3Qgc3RhYmxlX25vZGUgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7IC8qIGxp bmsgaW4gc3ViLXJidHJlZSAqLworCXN0cnVjdCB0cmVlX25vZGUgKnRyZWVfbm9kZTsgLyogaXQn cyB0cmVlIG5vZGUgcm9vdCBpbiBzdGFibGUgdHJlZSwgTlVMTCBpZiBpdCdzIGluIGhlbGwgbGlz dCAqLworCXN0cnVjdCBobGlzdF9oZWFkIGhsaXN0OworCXVuc2lnbmVkIGxvbmcga3BmbjsKKwl1 MzIgaGFzaF9tYXg7IC8qIGlmID09MCB0aGVuIGl0J3Mgbm90IGJlZW4gY2FsY3VsYXRlZCB5ZXQg Ki8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsbF9saXN0OyAvKiBpbiBhIGxpc3QgZm9yIGFsbCBzdGFi bGUgbm9kZXMgKi8KK307CisKKy8qKgorICogc3RydWN0IG5vZGVfdm1hIC0gZ3JvdXAgcm1hcF9p dGVtcyBsaW5rZWQgaW4gYSBzYW1lIHN0YWJsZQorICogbm9kZSB0b2dldGhlci4KKyAqLworc3Ry dWN0IG5vZGVfdm1hIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwkJdW5z aWduZWQgbG9uZyBrZXk7ICAvKiBzbG90IGlzIHVzZWQgYXMga2V5IHNvcnRlZCBvbiBobGlzdCAq LworCX07CisJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CisJc3RydWN0IGhsaXN0X2hlYWQgcm1h cF9obGlzdDsKKwlzdHJ1Y3Qgc3RhYmxlX25vZGUgKmhlYWQ7Cit9OworCisvKioKKyAqIHN0cnVj dCBybWFwX2l0ZW0gLSByZXZlcnNlIG1hcHBpbmcgaXRlbSBmb3IgdmlydHVhbCBhZGRyZXNzZXMK KyAqIEBybWFwX2xpc3Q6IG5leHQgcm1hcF9pdGVtIGluIG1tX3Nsb3QncyBzaW5nbHktbGlua2Vk IHJtYXBfbGlzdAorICogQGFub25fdm1hOiBwb2ludGVyIHRvIGFub25fdm1hIGZvciB0aGlzIG1t LGFkZHJlc3MsIHdoZW4gaW4gc3RhYmxlIHRyZWUKKyAqIEBtbTogdGhlIG1lbW9yeSBzdHJ1Y3R1 cmUgdGhpcyBybWFwX2l0ZW0gaXMgcG9pbnRpbmcgaW50bworICogQGFkZHJlc3M6IHRoZSB2aXJ0 dWFsIGFkZHJlc3MgdGhpcyBybWFwX2l0ZW0gdHJhY2tzICgrIGZsYWdzIGluIGxvdyBiaXRzKQor ICogQG5vZGU6IHJiIG5vZGUgb2YgdGhpcyBybWFwX2l0ZW0gaW4gdGhlIHVuc3RhYmxlIHRyZWUK KyAqIEBoZWFkOiBwb2ludGVyIHRvIHN0YWJsZV9ub2RlIGhlYWRpbmcgdGhpcyBsaXN0IGluIHRo ZSBzdGFibGUgdHJlZQorICogQGhsaXN0OiBsaW5rIGludG8gaGxpc3Qgb2Ygcm1hcF9pdGVtcyBo YW5naW5nIG9mZiB0aGF0IHN0YWJsZV9ub2RlCisgKi8KK3N0cnVjdCBybWFwX2l0ZW0geworCXN0 cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25n IGFkZHJlc3M7CS8qICsgbG93IGJpdHMgdXNlZCBmb3IgZmxhZ3MgYmVsb3cgKi8KKwl1bnNpZ25l ZCBsb25nIGhhc2hfcm91bmQ7CisJdW5zaWduZWQgbG9uZyBlbnRyeV9pbmRleDsKKwl1bmlvbiB7 CisJCXN0cnVjdCB7Lyogd2hlbiBpbiB1bnN0YWJsZSB0cmVlICovCisJCQlzdHJ1Y3QgcmJfbm9k ZSBub2RlOworCQkJc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlOworCQkJdTMyIGhhc2hfbWF4 OworCQl9OworCQlzdHJ1Y3QgeyAvKiB3aGVuIGluIHN0YWJsZSB0cmVlICovCisJCQlzdHJ1Y3Qg bm9kZV92bWEgKmhlYWQ7CisJCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBobGlzdDsKKwkJCXN0cnVjdCBh bm9uX3ZtYSAqYW5vbl92bWE7CisJCX07CisJfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0 KSkpOworCitzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBybWFw X2l0ZW0gKml0ZW07CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl9OworCS8qIGxvd2VzdCBiaXQg aXMgdXNlZCBmb3IgaXNfYWRkciB0YWcgKi8KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkp OyAvKiA0IGFsaWduZWQgdG8gZml0IGluIHRvIHBhZ2VzKi8KKworCisvKiBCYXNpYyBkYXRhIHN0 cnVjdHVyZSBkZWZpbml0aW9uIGVuZHMgKi8KKworCisvKgorICogRmxhZ3MgZm9yIHJtYXBfaXRl bSB0byBqdWRnZSBpZiBpdCdzIGxpc3RlZCBpbiB0aGUgc3RhYmxlL3Vuc3RhYmxlIHRyZWUuCisg KiBUaGUgZmxhZ3MgdXNlIHRoZSBsb3cgYml0cyBvZiBybWFwX2l0ZW0uYWRkcmVzcworICovCisj ZGVmaW5lIFVOU1RBQkxFX0ZMQUcJMHgxCisjZGVmaW5lIFNUQUJMRV9GTEFHCTB4MgorI2RlZmlu ZSBnZXRfcm1hcF9hZGRyKHgpCSgoeCktPmFkZHJlc3MgJiBQQUdFX01BU0spCisKKy8qCisgKiBy bWFwX2xpc3RfZW50cnkgaGVscGVycworICovCisjZGVmaW5lIElTX0FERFJfRkxBRwkxCisjZGVm aW5lIGlzX2FkZHIocHRyKQkJKCh1bnNpZ25lZCBsb25nKShwdHIpICYgSVNfQUREUl9GTEFHKQor I2RlZmluZSBzZXRfaXNfYWRkcihwdHIpCSgocHRyKSB8PSBJU19BRERSX0ZMQUcpCisjZGVmaW5l IGdldF9jbGVhbl9hZGRyKHB0cikJKCgocHRyKSAmIH4oX190eXBlb2ZfXyhwdHIpKUlTX0FERFJf RkxBRykpCisKKworLyoKKyAqIEhpZ2ggc3BlZWQgY2FjaGVzIGZvciBmcmVxdWVudGx5IGFsbG9j YXRlZCBhbmQgZnJlZWQgc3RydWN0cworICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJt YXBfaXRlbV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc3RhYmxlX25vZGVfY2Fj aGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5vZGVfdm1hX2NhY2hlOworc3RhdGljIHN0 cnVjdCBrbWVtX2NhY2hlICp2bWFfc2xvdF9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNo ZSAqdHJlZV9ub2RlX2NhY2hlOworI2RlZmluZSBVS1NNX0tNRU1fQ0FDSEUoX19zdHJ1Y3QsIF9f ZmxhZ3MpIGttZW1fY2FjaGVfY3JlYXRlKCJ1a3NtXyIjX19zdHJ1Y3QsXAorCQlzaXplb2Yoc3Ry dWN0IF9fc3RydWN0KSwgX19hbGlnbm9mX18oc3RydWN0IF9fc3RydWN0KSxcCisJCShfX2ZsYWdz KSwgTlVMTCkKKworLyogQXJyYXkgb2YgYWxsIHNjYW5fcnVuZywgdWtzbV9zY2FuX2xhZGRlclsw XSBoYXZpbmcgdGhlIG1pbmltdW0gc2NhbiByYXRpbyAqLworI2RlZmluZSBTQ0FOX0xBRERFUl9T SVpFIDQKK3N0YXRpYyBzdHJ1Y3Qgc2Nhbl9ydW5nIHVrc21fc2Nhbl9sYWRkZXJbU0NBTl9MQURE RVJfU0laRV07CisKKy8qIFRoZSBldmFsdWF0aW9uIHJvdW5kcyB1a3NtZCBoYXMgZmluaXNoZWQg Ki8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdWtzbV9ldmFsX3JvdW5kID0gMTsKKworLyoK KyAqIHdlIGFkZCAxIHRvIHRoaXMgdmFyIHdoZW4gd2UgY29uc2lkZXIgd2Ugc2hvdWxkIHJlYnVp bGQgdGhlIHdob2xlCisgKiB1bnN0YWJsZSB0cmVlLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9u ZyB1a3NtX2hhc2hfcm91bmQgPSAxOworCisvKgorICogSG93IG1hbnkgdGltZXMgdGhlIHdob2xl IG1lbW9yeSBpcyBzY2FubmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGZ1bGx5 X3NjYW5uZWRfcm91bmQgPSAxOworCisvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHZpcnR1YWwgcGFn ZXMgb2YgYWxsIHZtYSBzbG90cyAqLworc3RhdGljIHU2NCB1a3NtX3BhZ2VzX3RvdGFsOworCisv KiBUaGUgbnVtYmVyIG9mIHBhZ2VzIGhhcyBiZWVuIHNjYW5uZWQgc2luY2UgdGhlIHN0YXJ0IHVw ICovCitzdGF0aWMgdTY0IHVrc21fcGFnZXNfc2Nhbm5lZDsKKworc3RhdGljIHU2NCBzY2FubmVk X3ZpcnR1YWxfcGFnZXM7CisKKy8qIFRoZSBudW1iZXIgb2YgcGFnZXMgaGFzIGJlZW4gc2Nhbm5l ZCBzaW5jZSBsYXN0IGVuY29kZV9iZW5lZml0IGNhbGwgKi8KK3N0YXRpYyB1NjQgdWtzbV9wYWdl c19zY2FubmVkX2xhc3Q7CisKKy8qIElmIHRoZSBzY2FubmVkIG51bWJlciBpcyB0b29vIGxhcmdl LCB3ZSBlbmNvZGUgaXQgaGVyZSAqLworc3RhdGljIHU2NCBwYWdlc19zY2FubmVkX3N0b3JlZDsK Kworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXNfc2Nhbm5lZF9iYXNlOworCisvKiBUaGUgbnVt YmVyIG9mIG5vZGVzIGluIHRoZSBzdGFibGUgdHJlZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcg dWtzbV9wYWdlc19zaGFyZWQ7CisKKy8qIFRoZSBudW1iZXIgb2YgcGFnZSBzbG90cyBhZGRpdGlv bmFsbHkgc2hhcmluZyB0aG9zZSBub2RlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdWtzbV9w YWdlc19zaGFyaW5nOworCisvKiBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSB1bnN0YWJsZSB0 cmVlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB1a3NtX3BhZ2VzX3Vuc2hhcmVkOworCisvKgor ICogTWlsbGlzZWNvbmRzIGtzbWQgc2hvdWxkIHNsZWVwIGJldHdlZW4gc2NhbnMsCisgKiA+PSAx MDBtcyB0byBiZSBjb25zaXN0ZW50IHdpdGgKKyAqIHNjYW5fdGltZV90b19zbGVlcF9tc2VjKCkK KyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1a3NtX3NsZWVwX2ppZmZpZXM7CisKKy8qIFRoZSBy ZWFsIHZhbHVlIGZvciB0aGUgdWtzbWQgbmV4dCBzbGVlcCAqLworc3RhdGljIHVuc2lnbmVkIGlu dCB1a3NtX3NsZWVwX3JlYWw7CisKKy8qIFNhdmVkIHZhbHVlIGZvciB1c2VyIGlucHV0IHVrc21f c2xlZXBfamlmZmllcyB3aGVuIGl0J3MgZW5sYXJnZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQg dWtzbV9zbGVlcF9zYXZlZDsKKworLyogTWF4IHBlcmNlbnRhZ2Ugb2YgY3B1IHV0aWxpemF0aW9u IGtzbWQgY2FuIHRha2UgdG8gc2NhbiBpbiBvbmUgYmF0Y2ggKi8KK3N0YXRpYyB1bnNpZ25lZCBp bnQgdWtzbV9tYXhfY3B1X3BlcmNlbnRhZ2U7CisKK3N0YXRpYyBpbnQgdWtzbV9jcHVfZ292ZXJu b3I7CisKK3N0YXRpYyBjaGFyICp1a3NtX2NwdV9nb3Zlcm5vcl9zdHJbNF0gPSB7ICJmdWxsIiwg Im1lZGl1bSIsICJsb3ciLCAicXVpZXQiIH07CisKK3N0cnVjdCB1a3NtX2NwdV9wcmVzZXRfcyB7 CisJaW50IGNwdV9yYXRpb1tTQ0FOX0xBRERFUl9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgY292ZXJf bXNlY3NbU0NBTl9MQURERVJfU0laRV07CisJdW5zaWduZWQgaW50IG1heF9jcHU7IC8qIHBlcmNl bnRhZ2UgKi8KK307CisKK3N0cnVjdCB1a3NtX2NwdV9wcmVzZXRfcyB1a3NtX2NwdV9wcmVzZXRb NF0gPSB7CisJeyB7MjAsIDQwLCAtMjUwMCwgLTEwMDAwfSwgezEwMDAsIDUwMCwgMjAwLCA1MH0s IDk1fSwKKwl7IHsyMCwgMzAsIC0yNTAwLCAtMTAwMDB9LCB7MTAwMCwgNTAwLCA0MDAsIDEwMH0s IDUwfSwKKwl7IHsxMCwgMjAsIC01MDAwLCAtMTAwMDB9LCB7MTUwMCwgMTAwMCwgMTAwMCwgMjUw fSwgMjB9LAorCXsgezEwLCAyMCwgNDAsIDc1fSwgezIwMDAsIDEwMDAsIDEwMDAsIDEwMDB9LCAx fSwKK307CisKKy8qIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB1a3NtX2VtYV9wYWdlX3RpbWUgaWYg aXQncyBub3QgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgVUtTTV9QQUdFX1RJTUVfREVGQVVMVAk1 MDAKKworLypjb3N0IHRvIHNjYW4gb25lIHBhZ2UgYnkgZXhwb3Rpb25hbCBtb3ZpbmcgYXZlcmFn ZSBpbiBuc2VjcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdWtzbV9lbWFfcGFnZV90aW1lID0g VUtTTV9QQUdFX1RJTUVfREVGQVVMVDsKKworLyogVGhlIGV4cG90aW9uYWwgbW92aW5nIGF2ZXJh Z2UgYWxwaGEgd2VpZ2h0LCBpbiBwZXJjZW50YWdlLiAqLworI2RlZmluZSBFTUFfQUxQSEEJMjAK KworLyoKKyAqIFRoZSB0aHJlc2hvbGQgdXNlZCB0byBmaWx0ZXIgb3V0IHRocmFzaGluZyBhcmVh cywKKyAqIElmIGl0ID09IDAsIGZpbHRlcmluZyBpcyBkaXNhYmxlZCwgb3RoZXJ3aXNlIGl0J3Mg dGhlIHBlcmNlbnRhZ2UgdXAtYm91bmQKKyAqIG9mIHRoZSB0aHJhc2hpbmcgcmF0aW8gb2YgYWxs IGFyZWFzLiBBbnkgYXJlYSB3aXRoIGEgYmlnZ2VyIHRocmFzaGluZyByYXRpbworICogd2lsbCBi ZSBjb25zaWRlcmVkIGFzIGhhdmluZyBhIHplcm8gZHVwbGljYXRpb24gcmF0aW8uCisgKi8KK3N0 YXRpYyB1bnNpZ25lZCBpbnQgdWtzbV90aHJhc2hfdGhyZXNob2xkID0gNTA7CisKKy8qIEhvdyBt dWNoIGRlZHVwIHJhdGlvIGlzIGNvbnNpZGVyZWQgdG8gYmUgYWJ1bmRhbnQqLworc3RhdGljIHVu c2lnbmVkIGludCB1a3NtX2FidW5kYW50X3RocmVzaG9sZCA9IDEwOworCisvKiBBbGwgc2xvdHMg aGF2aW5nIG1lcmdlZCBwYWdlcyBpbiB0aGlzIGV2YWwgcm91bmQuICovCitzdHJ1Y3QgbGlzdF9o ZWFkIHZtYV9zbG90X2RlZHVwID0gTElTVF9IRUFEX0lOSVQodm1hX3Nsb3RfZGVkdXApOworCisv KiBIb3cgbWFueSB0aW1lcyB0aGUga3NtZCBoYXMgc2xlcHQgc2luY2Ugc3RhcnR1cCAqLworc3Rh dGljIHVuc2lnbmVkIGxvbmcgbG9uZyB1a3NtX3NsZWVwX3RpbWVzOworCisjZGVmaW5lIFVLU01f UlVOX1NUT1AJMAorI2RlZmluZSBVS1NNX1JVTl9NRVJHRQkxCitzdGF0aWMgdW5zaWduZWQgaW50 IHVrc21fcnVuID0gMTsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHVrc21fdGhy ZWFkX3dhaXQpOworc3RhdGljIERFRklORV9NVVRFWCh1a3NtX3RocmVhZF9tdXRleCk7CisKKy8q CisgKiBMaXN0IHZtYV9zbG90X25ldyBpcyBmb3IgbmV3bHkgY3JlYXRlZCB2bWFfc2xvdCB3YWl0 aW5nIHRvIGJlIGFkZGVkIGJ5CisgKiBrc21kLiBJZiBvbmUgY2Fubm90IGJlIGFkZGVkKGUuZy4g ZHVlIHRvIGl0J3MgdG9vIHNtYWxsKSwgaXQncyBtb3ZlZCB0bworICogdm1hX3Nsb3Rfbm9hZGQu IHZtYV9zbG90X2RlbCBpcyB0aGUgbGlzdCBmb3Igdm1hX3Nsb3Qgd2hvc2UgY29ycmVzcG9uZGlu ZworICogVk1BIGhhcyBiZWVuIHJlbW92ZWQvZnJlZWQuCisgKi8KK3N0cnVjdCBsaXN0X2hlYWQg dm1hX3Nsb3RfbmV3ID0gTElTVF9IRUFEX0lOSVQodm1hX3Nsb3RfbmV3KTsKK3N0cnVjdCBsaXN0 X2hlYWQgdm1hX3Nsb3Rfbm9hZGQgPSBMSVNUX0hFQURfSU5JVCh2bWFfc2xvdF9ub2FkZCk7Citz dHJ1Y3QgbGlzdF9oZWFkIHZtYV9zbG90X2RlbCA9IExJU1RfSEVBRF9JTklUKHZtYV9zbG90X2Rl bCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZtYV9zbG90X2xpc3RfbG9jayk7CisKKy8qIFRo ZSB1bnN0YWJsZSB0cmVlIGhlYWRzICovCitzdGF0aWMgc3RydWN0IHJiX3Jvb3Qgcm9vdF91bnN0 YWJsZV90cmVlID0gUkJfUk9PVDsKKworLyoKKyAqIEFsbCB0cmVlX25vZGVzIGFyZSBpbiBhIGxp c3QgdG8gYmUgZnJlZWQgYXQgb25jZSB3aGVuIHVuc3RhYmxlIHRyZWUgaXMKKyAqIGZyZWVkIGFm dGVyIGVhY2ggc2NhbiByb3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdW5zdGFi bGVfdHJlZV9ub2RlX2xpc3QgPQorCQkJCUxJU1RfSEVBRF9JTklUKHVuc3RhYmxlX3RyZWVfbm9k ZV9saXN0KTsKKworLyogTGlzdCBjb250YWlucyBhbGwgc3RhYmxlIG5vZGVzICovCitzdGF0aWMg c3RydWN0IGxpc3RfaGVhZCBzdGFibGVfbm9kZV9saXN0ID0gTElTVF9IRUFEX0lOSVQoc3RhYmxl X25vZGVfbGlzdCk7CisKKy8qCisgKiBXaGVuIHRoZSBoYXNoIHN0cmVuZ3RoIGlzIGNoYW5nZWQs IHRoZSBzdGFibGUgdHJlZSBtdXN0IGJlIGRlbHRhX2hhc2hlZCBhbmQKKyAqIHJlLXN0cnVjdHVy ZWQuIFdlIHVzZSB0d28gc2V0IG9mIGJlbG93IHN0cnVjdHMgdG8gc3BlZWQgdXAgdGhlCisgKiBy ZS1zdHJ1Y3R1cmluZyBvZiBzdGFibGUgdHJlZS4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hl YWQKK3N0YWJsZV90cmVlX25vZGVfbGlzdFsyXSA9IHtMSVNUX0hFQURfSU5JVChzdGFibGVfdHJl ZV9ub2RlX2xpc3RbMF0pLAorCQkJICAgIExJU1RfSEVBRF9JTklUKHN0YWJsZV90cmVlX25vZGVf bGlzdFsxXSl9OworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqc3RhYmxlX3RyZWVfbm9kZV9s aXN0cCA9ICZzdGFibGVfdHJlZV9ub2RlX2xpc3RbMF07CitzdGF0aWMgc3RydWN0IHJiX3Jvb3Qg cm9vdF9zdGFibGVfdHJlZVsyXSA9IHtSQl9ST09ULCBSQl9ST09UfTsKK3N0YXRpYyBzdHJ1Y3Qg cmJfcm9vdCAqcm9vdF9zdGFibGVfdHJlZXAgPSAmcm9vdF9zdGFibGVfdHJlZVswXTsKK3N0YXRp YyB1bnNpZ25lZCBsb25nIHN0YWJsZV90cmVlX2luZGV4OworCisvKiBUaGUgaGFzaCBzdHJlbmd0 aCBuZWVkZWQgdG8gaGFzaCBhIGZ1bGwgcGFnZSAqLworI2RlZmluZSBIQVNIX1NUUkVOR1RIX0ZV TEwJCShQQUdFX1NJWkUgLyBzaXplb2YodTMyKSkKKworLyogVGhlIGhhc2ggc3RyZW5ndGggbmVl ZGVkIGZvciBsb29wLWJhY2sgaGFzaGluZyAqLworI2RlZmluZSBIQVNIX1NUUkVOR1RIX01BWAkJ KEhBU0hfU1RSRU5HVEhfRlVMTCArIDEwKQorCisvKiBUaGUgcmFuZG9tIG9mZnNldHMgaW4gYSBw YWdlICovCitzdGF0aWMgdTMyICpyYW5kb21fbnVtczsKKworLyogVGhlIGhhc2ggc3RyZW5ndGgg Ki8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyZW5ndGggPSBIQVNIX1NUUkVOR1RIX0ZV TEwgPj4gNDsKKworLyogVGhlIGRlbHRhIHZhbHVlIGVhY2ggdGltZSB0aGUgaGFzaCBzdHJlbmd0 aCBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0 cmVuZ3RoX2RlbHRhOworI2RlZmluZSBIQVNIX1NUUkVOR1RIX0RFTFRBX01BWAk1CisKKy8qIFRo ZSB0aW1lIHdlIGhhdmUgc2F2ZWQgZHVlIHRvIHJhbmRvbV9zYW1wbGVfaGFzaCAqLworc3RhdGlj IHU2NCByc2hhc2hfcG9zOworCisvKiBUaGUgdGltZSB3ZSBoYXZlIHdhc3RlZCBkdWUgdG8gaGFz aCBjb2xsaXNpb24gKi8KK3N0YXRpYyB1NjQgcnNoYXNoX25lZzsKKworc3RydWN0IHVrc21fYmVu ZWZpdCB7CisJdTY0IHBvczsKKwl1NjQgbmVnOworCXU2NCBzY2FubmVkOworCXVuc2lnbmVkIGxv bmcgYmFzZTsKK30gYmVuZWZpdDsKKworLyoKKyAqIFRoZSByZWxhdGl2ZSBjb3N0IG9mIG1lbWNt cCwgY29tcGFyZWQgdG8gMSB0aW1lIHVuaXQgb2YgcmFuZG9tIHNhbXBsZQorICogaGFzaCwgdGhp cyB2YWx1ZSBpcyB0ZXN0ZWQgd2hlbiBrc20gbW9kdWxlIGlzIGluaXRpYWxpemVkCisgKi8KK3N0 YXRpYyB1bnNpZ25lZCBsb25nIG1lbWNtcF9jb3N0OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAg cnNoYXNoX25lZ19jb250X3plcm87CitzdGF0aWMgdW5zaWduZWQgbG9uZyAgcnNoYXNoX2NvbnRf b2JzY3VyZTsKKworLyogVGhlIHBvc3NpYmxlIHN0YXRlcyBvZiBoYXNoIHN0cmVuZ3RoIGFkanVz dG1lbnQgaGV1cmlzdGljICovCitlbnVtIHJzaGFzaF9zdGF0ZXMgeworCQlSU0hBU0hfU1RJTEws CisJCVJTSEFTSF9UUllVUCwKKwkJUlNIQVNIX1RSWURPV04sCisJCVJTSEFTSF9ORVcsCisJCVJT SEFTSF9QUkVfU1RJTEwsCit9OworCisvKiBUaGUgcG9zc2libGUgZGlyZWN0aW9uIHdlIGFyZSBh Ym91dCB0byBhZGp1c3QgaGFzaCBzdHJlbmd0aCAqLworZW51bSByc2hhc2hfZGlyZWN0IHsKKwlH T19VUCwKKwlHT19ET1dOLAorCU9CU0NVUkUsCisJU1RJTEwsCit9OworCisvKiByYW5kb20gc2Ft cGxpbmcgaGFzaCBzdGF0ZSBtYWNoaW5lICovCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIHJzaGFz aF9zdGF0ZXMgc3RhdGU7CisJZW51bSByc2hhc2hfZGlyZWN0IHByZV9kaXJlY3Q7CisJdTggYmVs b3dfY291bnQ7CisJLyogS2VlcCBhIGxvb2t1cCB3aW5kb3cgb2Ygc2l6ZSA1LCBpZmYgYWJvdmVf Y291bnQvYmVsb3dfY291bnQgPiAzCisJICogaW4gdGhpcyB3aW5kb3cgd2Ugc3RvcCB0cnlpbmcu CisJICovCisJdTggbG9va3VwX3dpbmRvd19pbmRleDsKKwl1NjQgc3RhYmxlX2JlbmVmaXQ7CisJ dW5zaWduZWQgbG9uZyB0dXJuX3BvaW50X2Rvd247CisJdW5zaWduZWQgbG9uZyB0dXJuX2JlbmVm aXRfZG93bjsKKwl1bnNpZ25lZCBsb25nIHR1cm5fcG9pbnRfdXA7CisJdW5zaWduZWQgbG9uZyB0 dXJuX2JlbmVmaXRfdXA7CisJdW5zaWduZWQgbG9uZyBzdGFibGVfcG9pbnQ7Cit9IHJzaGFzaF9z dGF0ZTsKKworLyp6ZXJvIHBhZ2UgaGFzaCB0YWJsZSwgaGFzaF9zdHJlbmd0aCBbMCB+IEhBU0hf U1RSRU5HVEhfTUFYXSovCitzdGF0aWMgdTMyICp6ZXJvX2hhc2hfdGFibGU7CisKK3N0YXRpYyBp bmxpbmUgc3RydWN0IG5vZGVfdm1hICphbGxvY19ub2RlX3ZtYSh2b2lkKQoreworCXN0cnVjdCBu b2RlX3ZtYSAqbm9kZV92bWE7CisJbm9kZV92bWEgPSBrbWVtX2NhY2hlX3phbGxvYyhub2RlX3Zt YV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5vZGVfdm1hKSB7CisJCUlOSVRfSExJU1RfSEVB RCgmbm9kZV92bWEtPnJtYXBfaGxpc3QpOworCQlJTklUX0hMSVNUX05PREUoJm5vZGVfdm1hLT5o bGlzdCk7CisJfQorCXJldHVybiBub2RlX3ZtYTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZy ZWVfbm9kZV92bWEoc3RydWN0IG5vZGVfdm1hICpub2RlX3ZtYSkKK3sKKwlrbWVtX2NhY2hlX2Zy ZWUobm9kZV92bWFfY2FjaGUsIG5vZGVfdm1hKTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVj dCB2bWFfc2xvdCAqYWxsb2Nfdm1hX3Nsb3Qodm9pZCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNs b3Q7CisKKwkvKgorCSAqIEluIGNhc2Uga3NtIGlzIG5vdCBpbml0aWFsaXplZCBieSBub3cuCisJ ICogT29wcywgd2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FsbCBzaXRlIG9mIHVrc21faW5pdCgp IGluIHRoZSBmdXR1cmUuCisJICovCisJaWYgKCF2bWFfc2xvdF9jYWNoZSkKKwkJcmV0dXJuIE5V TEw7CisKKwlzbG90ID0ga21lbV9jYWNoZV96YWxsb2Modm1hX3Nsb3RfY2FjaGUsIEdGUF9LRVJO RUwpOworCWlmIChzbG90KSB7CisJCUlOSVRfTElTVF9IRUFEKCZzbG90LT5zbG90X2xpc3QpOwor CQlJTklUX0xJU1RfSEVBRCgmc2xvdC0+ZGVkdXBfbGlzdCk7CisJCXNsb3QtPmZsYWdzIHw9IFVL U01fU0xPVF9ORUVEX1JFUkFORDsKKwl9CisJcmV0dXJuIHNsb3Q7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBmcmVlX3ZtYV9zbG90KHN0cnVjdCB2bWFfc2xvdCAqdm1hX3Nsb3QpCit7CisJa21l bV9jYWNoZV9mcmVlKHZtYV9zbG90X2NhY2hlLCB2bWFfc2xvdCk7Cit9CisKKworCitzdGF0aWMg aW5saW5lIHN0cnVjdCBybWFwX2l0ZW0gKmFsbG9jX3JtYXBfaXRlbSh2b2lkKQoreworCXN0cnVj dCBybWFwX2l0ZW0gKnJtYXBfaXRlbTsKKworCXJtYXBfaXRlbSA9IGttZW1fY2FjaGVfemFsbG9j KHJtYXBfaXRlbV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJtYXBfaXRlbSkgeworCQkvKiBi dWcgb24gbG93ZXN0IGJpdCBpcyBub3QgY2xlYXIgZm9yIGZsYWcgdXNlICovCisJCUJVR19PTihp c19hZGRyKHJtYXBfaXRlbSkpOworCX0KKwlyZXR1cm4gcm1hcF9pdGVtOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgZnJlZV9ybWFwX2l0ZW0oc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtKQor eworCXJtYXBfaXRlbS0+c2xvdCA9IE5VTEw7CS8qIGRlYnVnIHNhZmV0eSAqLworCWttZW1fY2Fj aGVfZnJlZShybWFwX2l0ZW1fY2FjaGUsIHJtYXBfaXRlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUg c3RydWN0IHN0YWJsZV9ub2RlICphbGxvY19zdGFibGVfbm9kZSh2b2lkKQoreworCXN0cnVjdCBz dGFibGVfbm9kZSAqbm9kZTsKKwlub2RlID0ga21lbV9jYWNoZV9hbGxvYyhzdGFibGVfbm9kZV9j YWNoZSwgR0ZQX0tFUk5FTCB8IEdGUF9BVE9NSUMpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5V TEw7CisKKwlJTklUX0hMSVNUX0hFQUQoJm5vZGUtPmhsaXN0KTsKKwlsaXN0X2FkZCgmbm9kZS0+ YWxsX2xpc3QsICZzdGFibGVfbm9kZV9saXN0KTsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIGZyZWVfc3RhYmxlX25vZGUoc3RydWN0IHN0YWJsZV9ub2RlICpzdGFibGVf bm9kZSkKK3sKKwlsaXN0X2RlbCgmc3RhYmxlX25vZGUtPmFsbF9saXN0KTsKKwlrbWVtX2NhY2hl X2ZyZWUoc3RhYmxlX25vZGVfY2FjaGUsIHN0YWJsZV9ub2RlKTsKK30KKworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgdHJlZV9ub2RlICphbGxvY190cmVlX25vZGUoc3RydWN0IGxpc3RfaGVhZCAqbGlz dCkKK3sKKwlzdHJ1Y3QgdHJlZV9ub2RlICpub2RlOworCW5vZGUgPSBrbWVtX2NhY2hlX3phbGxv Yyh0cmVlX25vZGVfY2FjaGUsIEdGUF9LRVJORUwgfCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5vZGUp CisJCXJldHVybiBOVUxMOworCisJbGlzdF9hZGQoJm5vZGUtPmFsbF9saXN0LCBsaXN0KTsKKwly ZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdHJlZV9ub2RlKHN0cnVj dCB0cmVlX25vZGUgKm5vZGUpCit7CisJbGlzdF9kZWwoJm5vZGUtPmFsbF9saXN0KTsKKwlrbWVt X2NhY2hlX2ZyZWUodHJlZV9ub2RlX2NhY2hlLCBub2RlKTsKK30KKworc3RhdGljIHZvaWQgdWtz bV9kcm9wX2Fub25fdm1hKHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSkKK3sKKwlzdHJ1Y3Qg YW5vbl92bWEgKmFub25fdm1hID0gcm1hcF9pdGVtLT5hbm9uX3ZtYTsKKworCXB1dF9hbm9uX3Zt YShhbm9uX3ZtYSk7Cit9CisKKworLyoqCisgKiBSZW1vdmUgYSBzdGFibGUgbm9kZSBmcm9tIHN0 YWJsZV90cmVlLCBtYXkgdW5saW5rIGZyb20gaXRzIHRyZWVfbm9kZSBhbmQKKyAqIG1heSByZW1v dmUgaXRzIHBhcmVudCB0cmVlX25vZGUgaWYgbm8gb3RoZXIgc3RhYmxlIG5vZGUgaXMgcGVuZGlu Zy4KKyAqCisgKiBAc3RhYmxlX25vZGUgCVRoZSBub2RlIG5lZWQgdG8gYmUgcmVtb3ZlZAorICog QHVubGlua19yYiAJCVdpbGwgdGhpcyBub2RlIGJlIHVubGlua2VkIGZyb20gdGhlIHJidHJlZT8K KyAqIEByZW1vdmVfdHJlZV8Jbm9kZSBXaWxsIGl0cyB0cmVlX25vZGUgYmUgcmVtb3ZlZCBpZiBl bXB0eT8KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX25vZGVfZnJvbV9zdGFibGVfdHJlZShzdHJ1 Y3Qgc3RhYmxlX25vZGUgKnN0YWJsZV9ub2RlLAorCQkJCQkgaW50IHVubGlua19yYiwgIGludCBy ZW1vdmVfdHJlZV9ub2RlKQoreworCXN0cnVjdCBub2RlX3ZtYSAqbm9kZV92bWE7CisJc3RydWN0 IHJtYXBfaXRlbSAqcm1hcF9pdGVtOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaWYgKCFo bGlzdF9lbXB0eSgmc3RhYmxlX25vZGUtPmhsaXN0KSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKG5vZGVfdm1hLCBuLAorCQkJCQkgICZzdGFibGVfbm9kZS0+aGxpc3QsIGhsaXN0KSB7 CisJCQlobGlzdF9mb3JfZWFjaF9lbnRyeShybWFwX2l0ZW0sICZub2RlX3ZtYS0+cm1hcF9obGlz dCwgaGxpc3QpIHsKKwkJCQl1a3NtX3BhZ2VzX3NoYXJpbmctLTsKKworCQkJCXVrc21fZHJvcF9h bm9uX3ZtYShybWFwX2l0ZW0pOworCQkJCXJtYXBfaXRlbS0+YWRkcmVzcyAmPSBQQUdFX01BU0s7 CisJCQl9CisJCQlmcmVlX25vZGVfdm1hKG5vZGVfdm1hKTsKKwkJCWNvbmRfcmVzY2hlZCgpOwor CQl9CisKKwkJLyogdGhlIGxhc3Qgb25lIGlzIGNvdW50ZWQgYXMgc2hhcmVkICovCisJCXVrc21f cGFnZXNfc2hhcmVkLS07CisJCXVrc21fcGFnZXNfc2hhcmluZysrOworCX0KKworCWlmIChzdGFi bGVfbm9kZS0+dHJlZV9ub2RlICYmIHVubGlua19yYikgeworCQlyYl9lcmFzZSgmc3RhYmxlX25v ZGUtPm5vZGUsCisJCQkgJnN0YWJsZV9ub2RlLT50cmVlX25vZGUtPnN1Yl9yb290KTsKKworCQlp ZiAoUkJfRU1QVFlfUk9PVCgmc3RhYmxlX25vZGUtPnRyZWVfbm9kZS0+c3ViX3Jvb3QpICYmCisJ CSAgICByZW1vdmVfdHJlZV9ub2RlKSB7CisJCQlyYl9lcmFzZSgmc3RhYmxlX25vZGUtPnRyZWVf bm9kZS0+bm9kZSwKKwkJCQkgcm9vdF9zdGFibGVfdHJlZXApOworCQkJZnJlZV90cmVlX25vZGUo c3RhYmxlX25vZGUtPnRyZWVfbm9kZSk7CisJCX0gZWxzZSB7CisJCQlzdGFibGVfbm9kZS0+dHJl ZV9ub2RlLT5jb3VudC0tOworCQl9CisJfQorCisJZnJlZV9zdGFibGVfbm9kZShzdGFibGVfbm9k ZSk7Cit9CisKKworLyoKKyAqIGdldF91a3NtX3BhZ2U6IGNoZWNrcyBpZiB0aGUgcGFnZSBpbmRp Y2F0ZWQgYnkgdGhlIHN0YWJsZSBub2RlCisgKiBpcyBzdGlsbCBpdHMga3NtIHBhZ2UsIGRlc3Bp dGUgaGF2aW5nIGhlbGQgbm8gcmVmZXJlbmNlIHRvIGl0LgorICogSW4gd2hpY2ggY2FzZSB3ZSBj YW4gdHJ1c3QgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UsIGFuZCBpdAorICogcmV0dXJucyB0aGUg Z290dGVuIHBhZ2U7IGJ1dCBpZiB0aGUgcGFnZSBoYXMgbm93IGJlZW4gemFwcGVkLAorICogcmVt b3ZlIHRoZSBzdGFsZSBub2RlIGZyb20gdGhlIHN0YWJsZSB0cmVlIGFuZCByZXR1cm4gTlVMTC4K KyAqCisgKiBZb3Ugd291bGQgZXhwZWN0IHRoZSBzdGFibGVfbm9kZSB0byBob2xkIGEgcmVmZXJl bmNlIHRvIHRoZSBrc20gcGFnZS4KKyAqIEJ1dCBpZiBpdCBpbmNyZW1lbnRzIHRoZSBwYWdlJ3Mg Y291bnQsIHN3YXBwaW5nIG91dCBoYXMgdG8gd2FpdCBmb3IKKyAqIGtzbWQgdG8gY29tZSBhcm91 bmQgYWdhaW4gYmVmb3JlIGl0IGNhbiBmcmVlIHRoZSBwYWdlLCB3aGljaCBtYXkgdGFrZQorICog c2Vjb25kcyBvciBldmVuIG1pbnV0ZXM6IG11Y2ggdG9vIHVucmVzcG9uc2l2ZS4gIFNvIGluc3Rl YWQgd2UgdXNlIGEKKyAqICJrZXlob2xlIHJlZmVyZW5jZSI6IGFjY2VzcyB0byB0aGUga3NtIHBh Z2UgZnJvbSB0aGUgc3RhYmxlIG5vZGUgcGVlcHMKKyAqIG91dCB0aHJvdWdoIGl0cyBrZXlob2xl IHRvIHNlZSBpZiB0aGF0IHBhZ2Ugc3RpbGwgaG9sZHMgdGhlIHJpZ2h0IGtleSwKKyAqIHBvaW50 aW5nIGJhY2sgdG8gdGhpcyBzdGFibGUgbm9kZS4gIFRoaXMgcmVsaWVzIG9uIGZyZWVpbmcgYSBQ YWdlQW5vbgorICogcGFnZSB0byByZXNldCBpdHMgcGFnZS0+bWFwcGluZyB0byBOVUxMLCBhbmQg cmVsaWVzIG9uIG5vIG90aGVyIHVzZSBvZgorICogYSBwYWdlIHRvIHB1dCBzb21ldGhpbmcgdGhh dCBtaWdodCBsb29rIGxpa2Ugb3VyIGtleSBpbiBwYWdlLT5tYXBwaW5nLgorICoKKyAqIGluY2x1 ZGUvbGludXgvcGFnZW1hcC5oIHBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKCkgaXMgYSBnb29k IHJlZmVyZW5jZSwKKyAqIGJ1dCB0aGlzIGlzIGRpZmZlcmVudCAtIG1hZGUgc2ltcGxlciBieSB1 a3NtX3RocmVhZF9tdXRleCBiZWluZyBoZWxkLCBidXQKKyAqIGludGVyZXN0aW5nIGZvciBhc3N1 bWluZyB0aGF0IG5vIG90aGVyIHVzZSBvZiB0aGUgc3RydWN0IHBhZ2UgY291bGQgZXZlcgorICog cHV0IG91ciBleHBlY3RlZF9tYXBwaW5nIGludG8gcGFnZS0+bWFwcGluZyAob3IgYSBmaWVsZCBv ZiB0aGUgdW5pb24gd2hpY2gKKyAqIGNvaW5jaWRlcyB3aXRoIHBhZ2UtPm1hcHBpbmcpLiAgVGhl IFJDVSBjYWxscyBhcmUgbm90IGZvciBLU00gYXQgYWxsLCBidXQKKyAqIHRvIGtlZXAgdGhlIHBh Z2VfY291bnQgcHJvdG9jb2wgZGVzY3JpYmVkIHdpdGggcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRp dmUuCisgKgorICogTm90ZTogaXQgaXMgcG9zc2libGUgdGhhdCBnZXRfdWtzbV9wYWdlKCkgd2ls bCByZXR1cm4gTlVMTCBvbmUgbW9tZW50LAorICogdGhlbiBwYWdlIHRoZSBuZXh0LCBpZiB0aGUg cGFnZSBpcyBpbiBiZXR3ZWVuIHBhZ2VfZnJlZXplX3JlZnMoKSBhbmQKKyAqIHBhZ2VfdW5mcmVl emVfcmVmcygpOiB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYW55d2hlcmUsIHRoZSBwYWdl CisgKiBpcyBvbiBpdHMgd2F5IHRvIGJlaW5nIGZyZWVkOyBidXQgaXQgaXMgYW4gYW5vbWFseSB0 byBiZWFyIGluIG1pbmQuCisgKgorICogQHVubGlua19yYjogCQlpZiB0aGUgcmVtb3ZhbCBvZiB0 aGlzIG5vZGUgd2lsbCBmaXJzdGx5IHVubGluayBmcm9tCisgKiBpdHMgcmJ0cmVlLiBzdGFibGVf bm9kZV9yZWluc2VydCB3aWxsIHByZXZlbnQgdGhpcyB3aGVuIHJlc3RydWN0dXJpbmcgdGhlCisg KiBub2RlIGZyb20gaXRzIG9sZCB0cmVlLgorICoKKyAqIEByZW1vdmVfdHJlZV9ub2RlOglpZiB0 aGlzIGlzIHRoZSBsYXN0IG9uZSBvZiBpdHMgdHJlZV9ub2RlLCB3aWxsIHRoZQorICogdHJlZV9u b2RlIGJlIGZyZWVkID8gSWYgd2UgYXJlIGluc2VydGluZyBzdGFibGUgbm9kZSwgdGhpcyB0cmVl X25vZGUgbWF5CisgKiBiZSByZXVzZWQsIHNvIGRvbid0IGZyZWUgaXQuCisgKi8KK3N0YXRpYyBz dHJ1Y3QgcGFnZSAqZ2V0X3Vrc21fcGFnZShzdHJ1Y3Qgc3RhYmxlX25vZGUgKnN0YWJsZV9ub2Rl LAorCQkJCSBpbnQgdW5saW5rX3JiLCBpbnQgcmVtb3ZlX3RyZWVfbm9kZSkKK3sKKwlzdHJ1Y3Qg cGFnZSAqcGFnZTsKKwl2b2lkICpleHBlY3RlZF9tYXBwaW5nOworCisJcGFnZSA9IHBmbl90b19w YWdlKHN0YWJsZV9ub2RlLT5rcGZuKTsKKwlleHBlY3RlZF9tYXBwaW5nID0gKHZvaWQgKilzdGFi bGVfbm9kZSArCisJCQkJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX0tTTSk7CisJ cmN1X3JlYWRfbG9jaygpOworCWlmIChwYWdlLT5tYXBwaW5nICE9IGV4cGVjdGVkX21hcHBpbmcp CisJCWdvdG8gc3RhbGU7CisJaWYgKCFnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkKKwkJZ290 byBzdGFsZTsKKwlpZiAocGFnZS0+bWFwcGluZyAhPSBleHBlY3RlZF9tYXBwaW5nKSB7CisJCXB1 dF9wYWdlKHBhZ2UpOworCQlnb3RvIHN0YWxlOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwly ZXR1cm4gcGFnZTsKK3N0YWxlOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJlbW92ZV9ub2RlX2Zy b21fc3RhYmxlX3RyZWUoc3RhYmxlX25vZGUsIHVubGlua19yYiwgcmVtb3ZlX3RyZWVfbm9kZSk7 CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFJlbW92aW5nIHJtYXBfaXRlbSBmcm9tIHN0 YWJsZSBvciB1bnN0YWJsZSB0cmVlLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsZWFuIHRoZSBp bmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFibGUvdW5zdGFibGUgdHJlZS4KKyAqLworc3RhdGljIGlu bGluZSB2b2lkIHJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKHN0cnVjdCBybWFwX2l0ZW0gKnJt YXBfaXRlbSkKK3sKKwlpZiAocm1hcF9pdGVtLT5hZGRyZXNzICYgU1RBQkxFX0ZMQUcpIHsKKwkJ c3RydWN0IHN0YWJsZV9ub2RlICpzdGFibGVfbm9kZTsKKwkJc3RydWN0IG5vZGVfdm1hICpub2Rl X3ZtYTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJbm9kZV92bWEgPSBybWFwX2l0ZW0tPmhl YWQ7CisJCXN0YWJsZV9ub2RlID0gbm9kZV92bWEtPmhlYWQ7CisJCXBhZ2UgPSBnZXRfdWtzbV9w YWdlKHN0YWJsZV9ub2RlLCAxLCAxKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBvdXQ7CisKKwkJ LyoKKwkJICogcGFnZSBsb2NrIGlzIG5lZWRlZCBiZWNhdXNlIGl0J3MgcmFjaW5nIHdpdGgKKwkJ ICogdHJ5X3RvX3VubWFwX2tzbSgpLCBldGMuCisJCSAqLworCQlsb2NrX3BhZ2UocGFnZSk7CisJ CWhsaXN0X2RlbCgmcm1hcF9pdGVtLT5obGlzdCk7CisKKwkJaWYgKGhsaXN0X2VtcHR5KCZub2Rl X3ZtYS0+cm1hcF9obGlzdCkpIHsKKwkJCWhsaXN0X2RlbCgmbm9kZV92bWEtPmhsaXN0KTsKKwkJ CWZyZWVfbm9kZV92bWEobm9kZV92bWEpOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCisJ CXB1dF9wYWdlKHBhZ2UpOworCQlpZiAoaGxpc3RfZW1wdHkoJnN0YWJsZV9ub2RlLT5obGlzdCkp IHsKKwkJCS8qIGRvIE5PVCBjYWxsIHJlbW92ZV9ub2RlX2Zyb21fc3RhYmxlX3RyZWUoKSBoZXJl LAorCQkJICogaXQncyBwb3NzaWJsZSBmb3IgYSBmb3JrZWQgcm1hcF9pdGVtIG5vdCBpbgorCQkJ ICogc3RhYmxlIHRyZWUgd2hpbGUgdGhlIGluLXRyZWUgcm1hcF9pdGVtcyB3ZXJlCisJCQkgKiBk ZWxldGVkLgorCQkJICovCisJCQl1a3NtX3BhZ2VzX3NoYXJlZC0tOworCQl9IGVsc2UKKwkJCXVr c21fcGFnZXNfc2hhcmluZy0tOworCisKKwkJdWtzbV9kcm9wX2Fub25fdm1hKHJtYXBfaXRlbSk7 CisJfSBlbHNlIGlmIChybWFwX2l0ZW0tPmFkZHJlc3MgJiBVTlNUQUJMRV9GTEFHKSB7CisJCWlm IChybWFwX2l0ZW0tPmhhc2hfcm91bmQgPT0gdWtzbV9oYXNoX3JvdW5kKSB7CisKKwkJCXJiX2Vy YXNlKCZybWFwX2l0ZW0tPm5vZGUsCisJCQkJICZybWFwX2l0ZW0tPnRyZWVfbm9kZS0+c3ViX3Jv b3QpOworCQkJaWYgKFJCX0VNUFRZX1JPT1QoJnJtYXBfaXRlbS0+dHJlZV9ub2RlLT5zdWJfcm9v dCkpIHsKKwkJCQlyYl9lcmFzZSgmcm1hcF9pdGVtLT50cmVlX25vZGUtPm5vZGUsCisJCQkJCSAm cm9vdF91bnN0YWJsZV90cmVlKTsKKworCQkJCWZyZWVfdHJlZV9ub2RlKHJtYXBfaXRlbS0+dHJl ZV9ub2RlKTsKKwkJCX0gZWxzZQorCQkJCXJtYXBfaXRlbS0+dHJlZV9ub2RlLT5jb3VudC0tOwor CQl9CisJCXVrc21fcGFnZXNfdW5zaGFyZWQtLTsKKwl9CisKKwlybWFwX2l0ZW0tPmFkZHJlc3Mg Jj0gUEFHRV9NQVNLOworCXJtYXBfaXRlbS0+aGFzaF9tYXggPSAwOworCitvdXQ6CisJY29uZF9y ZXNjaGVkKCk7CQkvKiB3ZSdyZSBjYWxsZWQgZnJvbSBtYW55IGxvbmcgbG9vcHMgKi8KK30KKwor c3RhdGljIGlubGluZSBpbnQgc2xvdF9pbl91a3NtKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sK KwlyZXR1cm4gbGlzdF9lbXB0eSgmc2xvdC0+c2xvdF9saXN0KTsKK30KKworLyoKKyAqIFRlc3Qg aWYgdGhlIG1tIGlzIGV4aXRpbmcKKyAqLworc3RhdGljIGlubGluZSBib29sIHVrc21fdGVzdF9l eGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmbW0tPm1t X3VzZXJzKSA9PSAwOworfQorCisvKioKKyAqIE5lZWQgdG8gZG8gdHdvIHRoaW5nczoKKyAqIDEu IGNoZWNrIGlmIHNsb3Qgd2FzIG1vdmVkIHRvIGRlbCBsaXN0CisgKiAyLiBtYWtlIHN1cmUgdGhl IG1tYXBfc2VtIGlzIG1hbmlwdWxhdGVkIHVuZGVyIHZhbGlkIHZtYS4KKyAqCisgKiBNeSBjb25j ZXJuIGhlcmUgaXMgdGhhdCBpbiBzb21lIGNhc2VzLCB0aGlzIG1heSBtYWtlCisgKiB2bWFfc2xv dF9saXN0X2xvY2soKSB3YWl0ZXJzIHRvIHNlcmlhbGl6ZWQgZnVydGhlciBieSBzb21lCisgKiBz ZW0tPndhaXRfbG9jaywgY2FuIHRoaXMgcmVhbGx5IGJlIGV4cGVuc2l2ZT8KKyAqCisgKgorICog QHJldHVybgorICogMDogaWYgc3VjY2Vzc2Z1bGx5IGxvY2tlZCBtbWFwX3NlbQorICogLUVOT0VO VDogdGhpcyBzbG90IHdhcyBtb3ZlZCB0byBkZWwgbGlzdAorICogLUVCVVNZOiB2bWEgbG9jayBm YWlsZWQKKyAqLworc3RhdGljIGludCB0cnlfZG93bl9yZWFkX3Nsb3RfbW1hcF9zZW0oc3RydWN0 IHZtYV9zbG90ICpzbG90KQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVj dCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCByd19zZW1hcGhvcmUgKnNlbTsKKworCXNwaW5fbG9j aygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCS8qIHRoZSBzbG90X2xpc3Qgd2FzIHJlbW92ZWQg YW5kIGluaXRlZCBmcm9tIG5ldyBsaXN0LCB3aGVuIGl0IGVudGVycworCSAqIHVrc21fbGlzdC4g SWYgbm93IGl0J3Mgbm90IGVtcHR5LCB0aGVuIGl0IG11c3QgYmUgbW92ZWQgdG8gZGVsIGxpc3QK KwkgKi8KKwlpZiAoIXNsb3RfaW5fdWtzbShzbG90KSkgeworCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJQlVHX09OKHNsb3QtPnBh Z2VzICE9IHZtYV9wYWdlcyhzbG90LT52bWEpKTsKKwkvKiBPaywgdm1hIHN0aWxsIHZhbGlkICov CisJdm1hID0gc2xvdC0+dm1hOworCW1tID0gdm1hLT52bV9tbTsKKwlzZW0gPSAmbW0tPm1tYXBf c2VtOworCisJaWYgKHVrc21fdGVzdF9leGl0KG1tKSkgeworCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKGRvd25fcmVhZF90 cnlsb2NrKHNlbSkpIHsKKwkJc3Bpbl91bmxvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJCXJl dHVybiAwOworCX0KKworCXNwaW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOworCXJldHVy biAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordm1hX3BhZ2VfYWRk cmVzcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJ cGdvZmZfdCBwZ29mZiA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gUEFHRV9T SElGVCk7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCisJYWRkcmVzcyA9IHZtYS0+dm1fc3Rh cnQgKyAoKHBnb2ZmIC0gdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCk7CisJaWYgKHVubGlr ZWx5KGFkZHJlc3MgPCB2bWEtPnZtX3N0YXJ0IHx8IGFkZHJlc3MgPj0gdm1hLT52bV9lbmQpKSB7 CisJCS8qIHBhZ2Ugc2hvdWxkIGJlIHdpdGhpbiBAdm1hIG1hcHBpbmcgcmFuZ2UgKi8KKwkJcmV0 dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiBhZGRyZXNzOworfQorCisKKy8qIHJldHVybiAwIG9u IHN1Y2Nlc3Mgd2l0aCB0aGUgaXRlbSdzIG1tYXBfc2VtIGxvY2tlZCAqLworc3RhdGljIGlubGlu ZSBpbnQgZ2V0X21lcmdlYWJsZV9wYWdlX2xvY2tfbW1hcChzdHJ1Y3Qgcm1hcF9pdGVtICppdGVt KQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCA9IGl0 ZW0tPnNsb3Q7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwor CS8qCisJICogdHJ5X2Rvd25fcmVhZF9zbG90X21tYXBfc2VtKCkgcmV0dXJucyBub24temVybyBp ZiB0aGUgc2xvdAorCSAqIGhhcyBiZWVuIHJlbW92ZWQgYnkgdWtzbV9yZW1vdmVfdm1hKCkuCisJ ICovCisJaWYgKHRyeV9kb3duX3JlYWRfc2xvdF9tbWFwX3NlbShzbG90KSkKKwkJcmV0dXJuIC1F QlVTWTsKKworCW1tID0gc2xvdC0+dm1hLT52bV9tbTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdCht bSkpCisJCWdvdG8gZmFpbG91dF91cDsKKworCXBhZ2UgPSBpdGVtLT5wYWdlOworCXJjdV9yZWFk X2xvY2soKTsKKwlpZiAoIWdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSB7CisJCXJjdV9yZWFk X3VubG9jaygpOworCQlnb3RvIGZhaWxvdXRfdXA7CisJfQorCisJLyogTm8gbmVlZCB0byBjb25z aWRlciBodWdlIHBhZ2UgaGVyZS4gKi8KKwlpZiAoaXRlbS0+c2xvdC0+dm1hLT5hbm9uX3ZtYSAh PSBwYWdlX2Fub25fdm1hKHBhZ2UpIHx8CisJICAgIHZtYV9wYWdlX2FkZHJlc3MocGFnZSwgaXRl bS0+c2xvdC0+dm1hKSAhPSBnZXRfcm1hcF9hZGRyKGl0ZW0pKSB7CisJCS8qCisJCSAqIFRPRE86 CisJCSAqIHNob3VsZCB3ZSByZWxlYXNlIHRoaXMgaXRlbSBiZWNhc2Ugb2YgaXRzIHN0YWxlIHBh Z2UKKwkJICogbWFwcGluZz8KKwkJICovCisJCXB1dF9wYWdlKHBhZ2UpOworCQlyY3VfcmVhZF91 bmxvY2soKTsKKwkJZ290byBmYWlsb3V0X3VwOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwly ZXR1cm4gMDsKKworZmFpbG91dF91cDoKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVy biBlcnI7Cit9CisKKy8qCisgKiBXaGF0IGtpbmQgb2YgVk1BIGlzIGNvbnNpZGVyZWQgPworICov CitzdGF0aWMgaW5saW5lIGludCB2bWFfY2FuX2VudGVyKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAq dm1hKQoreworCXJldHVybiB1a3NtX2ZsYWdzX2Nhbl9zY2FuKHZtYS0+dm1fZmxhZ3MpOworfQor CisvKgorICogQ2FsbGVkIHdoZW5ldmVyIGEgZnJlc2ggbmV3IHZtYSBpcyBjcmVhdGVkIEEgbmV3 IHZtYV9zbG90LgorICogaXMgY3JlYXRlZCBhbmQgaW5zZXJ0ZWQgaW50byBhIGdsb2JhbCBsaXN0 IE11c3QgYmUgY2FsbGVkLgorICogYWZ0ZXIgdm1hIGlzIGluc2VydGVkIHRvIGl0cyBtbSAgICAg IAkJICAgIC4KKyAqLwordm9pZCB1a3NtX3ZtYV9hZGRfbmV3KHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKworCWlmICghdm1hX2Nhbl9lbnRl cih2bWEpKSB7CisJCXZtYS0+dWtzbV92bWFfc2xvdCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisK KwlzbG90ID0gYWxsb2Nfdm1hX3Nsb3QoKTsKKwlpZiAoIXNsb3QpIHsKKwkJdm1hLT51a3NtX3Zt YV9zbG90ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCXZtYS0+dWtzbV92bWFfc2xvdCA9IHNs b3Q7CisJdm1hLT52bV9mbGFncyB8PSBWTV9NRVJHRUFCTEU7CisJc2xvdC0+dm1hID0gdm1hOwor CXNsb3QtPm1tID0gdm1hLT52bV9tbTsKKwlzbG90LT5jdGltZV9qID0gamlmZmllczsKKwlzbG90 LT5wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOworCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2Nr KTsKKwlsaXN0X2FkZF90YWlsKCZzbG90LT5zbG90X2xpc3QsICZ2bWFfc2xvdF9uZXcpOworCXNw aW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOworfQorCisvKgorICogQ2FsbGVkIGFmdGVy IHZtYSBpcyB1bmxpbmtlZCBmcm9tIGl0cyBtbQorICovCit2b2lkIHVrc21fcmVtb3ZlX3ZtYShz dHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisK KwlpZiAoIXZtYS0+dWtzbV92bWFfc2xvdCkKKwkJcmV0dXJuOworCisJc2xvdCA9IHZtYS0+dWtz bV92bWFfc2xvdDsKKwlzcGluX2xvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJaWYgKHNsb3Rf aW5fdWtzbShzbG90KSkgeworCQkvKioKKwkJICogVGhpcyBzbG90IGhhcyBiZWVuIGFkZGVkIGJ5 IGtzbWQsIHNvIG1vdmUgdG8gdGhlIGRlbCBsaXN0CisJCSAqIHdhaXRpbmcga3NtZCB0byBmcmVl IGl0LgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmc2xvdC0+c2xvdF9saXN0LCAmdm1hX3Nsb3Rf ZGVsKTsKKwl9IGVsc2UgeworCQkvKioKKwkJICogSXQncyBzdGlsbCBvbiBuZXcgbGlzdC4gSXQn cyBvayB0byBmcmVlIHNsb3QgZGlyZWN0bHkuCisJCSAqLworCQlsaXN0X2RlbCgmc2xvdC0+c2xv dF9saXN0KTsKKwkJZnJlZV92bWFfc2xvdChzbG90KTsKKwl9CisJc3Bpbl91bmxvY2soJnZtYV9z bG90X2xpc3RfbG9jayk7CisJdm1hLT51a3NtX3ZtYV9zbG90ID0gTlVMTDsKK30KKworLyogICAz Mi8zIDwgdGhleSA8IDMyLzIgKi8KKyNkZWZpbmUgc2hpZnRsCTgKKyNkZWZpbmUgc2hpZnRyCTEy CisKKyNkZWZpbmUgSEFTSF9GUk9NX1RPKGZyb20sIHRvKSAJCQkJXAorZm9yIChpbmRleCA9IGZy b207IGluZGV4IDwgdG87IGluZGV4KyspIHsJCVwKKwlwb3MgPSByYW5kb21fbnVtc1tpbmRleF07 CQkJXAorCWhhc2ggKz0ga2V5W3Bvc107CQkJCVwKKwloYXNoICs9IChoYXNoIDw8IHNoaWZ0bCk7 CQkJXAorCWhhc2ggXj0gKGhhc2ggPj4gc2hpZnRyKTsJCQlcCit9CisKKworI2RlZmluZSBIQVNI X0ZST01fRE9XTl9UTyhmcm9tLCB0bykgCQkJXAorZm9yIChpbmRleCA9IGZyb20gLSAxOyBpbmRl eCA+PSB0bzsgaW5kZXgtLSkgewkJXAorCWhhc2ggXj0gKGhhc2ggPj4gc2hpZnRyKTsJCQlcCisJ aGFzaCBePSAoaGFzaCA+PiAoc2hpZnRyKjIpKTsJCQlcCisJaGFzaCAtPSAoaGFzaCA8PCBzaGlm dGwpOwkJCVwKKwloYXNoICs9IChoYXNoIDw8IChzaGlmdGwqMikpOwkJCVwKKwlwb3MgPSByYW5k b21fbnVtc1tpbmRleF07CQkJXAorCWhhc2ggLT0ga2V5W3Bvc107CQkJCVwKK30KKworLyoKKyAq IFRoZSBtYWluIHJhbmRvbSBzYW1wbGUgaGFzaCBmdW5jdGlvbi4KKyAqLworc3RhdGljIHUzMiBy YW5kb21fc2FtcGxlX2hhc2godm9pZCAqYWRkciwgdTMyIGhhc2hfc3RyZW5ndGgpCit7CisJdTMy IGhhc2ggPSAweGRlYWRiZWVmOworCWludCBpbmRleCwgcG9zLCBsb29wID0gaGFzaF9zdHJlbmd0 aDsKKwl1MzIgKmtleSA9ICh1MzIgKilhZGRyOworCisJaWYgKGxvb3AgPiBIQVNIX1NUUkVOR1RI X0ZVTEwpCisJCWxvb3AgPSBIQVNIX1NUUkVOR1RIX0ZVTEw7CisKKwlIQVNIX0ZST01fVE8oMCwg bG9vcCk7CisKKwlpZiAoaGFzaF9zdHJlbmd0aCA+IEhBU0hfU1RSRU5HVEhfRlVMTCkgeworCQls b29wID0gaGFzaF9zdHJlbmd0aCAtIEhBU0hfU1RSRU5HVEhfRlVMTDsKKwkJSEFTSF9GUk9NX1RP KDAsIGxvb3ApOworCX0KKworCXJldHVybiBoYXNoOworfQorCisKKy8qKgorICogSXQncyB1c2Vk IHdoZW4gaGFzaCBzdHJlbmd0aCBpcyBhZGp1c3RlZAorICoKKyAqIEBhZGRyIFRoZSBwYWdlJ3Mg dmlydHVhbCBhZGRyZXNzCisgKiBAZnJvbSBUaGUgb3JpZ2luYWwgaGFzaCBzdHJlbmd0aAorICog QHRvICAgVGhlIGhhc2ggc3RyZW5ndGggY2hhbmdlZCB0bworICogQGhhc2ggVGhlIGhhc2ggdmFs dWUgZ2VuZXJhdGVkIHdpdGggImZyb20iIGhhc2ggdmFsdWUKKyAqCisgKiByZXR1cm4gdGhlIGhh c2ggdmFsdWUKKyAqLworc3RhdGljIHUzMiBkZWx0YV9oYXNoKHZvaWQgKmFkZHIsIGludCBmcm9t LCBpbnQgdG8sIHUzMiBoYXNoKQoreworCXUzMiAqa2V5ID0gKHUzMiAqKWFkZHI7CisJaW50IGlu ZGV4LCBwb3M7IC8qIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbnQgdHlwZSAqLworCisJaWYgKHRvID4g ZnJvbSkgeworCQlpZiAoZnJvbSA+PSBIQVNIX1NUUkVOR1RIX0ZVTEwpIHsKKwkJCWZyb20gLT0g SEFTSF9TVFJFTkdUSF9GVUxMOworCQkJdG8gLT0gSEFTSF9TVFJFTkdUSF9GVUxMOworCQkJSEFT SF9GUk9NX1RPKGZyb20sIHRvKTsKKwkJfSBlbHNlIGlmICh0byA8PSBIQVNIX1NUUkVOR1RIX0ZV TEwpIHsKKwkJCUhBU0hfRlJPTV9UTyhmcm9tLCB0byk7CisJCX0gZWxzZSB7CisJCQlIQVNIX0ZS T01fVE8oZnJvbSwgSEFTSF9TVFJFTkdUSF9GVUxMKTsKKwkJCUhBU0hfRlJPTV9UTygwLCB0byAt IEhBU0hfU1RSRU5HVEhfRlVMTCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZnJvbSA8PSBIQVNI X1NUUkVOR1RIX0ZVTEwpIHsKKwkJCUhBU0hfRlJPTV9ET1dOX1RPKGZyb20sIHRvKTsKKwkJfSBl bHNlIGlmICh0byA+PSBIQVNIX1NUUkVOR1RIX0ZVTEwpIHsKKwkJCWZyb20gLT0gSEFTSF9TVFJF TkdUSF9GVUxMOworCQkJdG8gLT0gSEFTSF9TVFJFTkdUSF9GVUxMOworCQkJSEFTSF9GUk9NX0RP V05fVE8oZnJvbSwgdG8pOworCQl9IGVsc2UgeworCQkJSEFTSF9GUk9NX0RPV05fVE8oZnJvbSAt IEhBU0hfU1RSRU5HVEhfRlVMTCwgMCk7CisJCQlIQVNIX0ZST01fRE9XTl9UTyhIQVNIX1NUUkVO R1RIX0ZVTEwsIHRvKTsKKwkJfQorCX0KKworCXJldHVybiBoYXNoOworfQorCisKKworCisjZGVm aW5lIENBTl9PVkVSRkxPV19VNjQoeCwgZGVsdGEpIChVNjRfTUFYIC0gKHgpIDwgKGRlbHRhKSkK KworLyoqCisgKgorICogQ2FsbGVkIHdoZW46IHJzaGFzaF9wb3Mgb3IgcnNoYXNoX25lZyBpcyBh Ym91dCB0byBvdmVyZmxvdyBvciBhIHNjYW4gcm91bmQKKyAqIGhhcyBmaW5pc2hlZC4KKyAqCisg KiByZXR1cm4gMCBpZiBubyBwYWdlIGhhcyBiZWVuIHNjYW5uZWQgc2luY2UgbGFzdCBjYWxsLCAx IG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZW5jb2RlX2JlbmVmaXQodm9pZCkK K3sKKwl1NjQgc2Nhbm5lZF9kZWx0YSwgcG9zX2RlbHRhLCBuZWdfZGVsdGE7CisJdW5zaWduZWQg bG9uZyBiYXNlID0gYmVuZWZpdC5iYXNlOworCisJc2Nhbm5lZF9kZWx0YSA9IHVrc21fcGFnZXNf c2Nhbm5lZCAtIHVrc21fcGFnZXNfc2Nhbm5lZF9sYXN0OworCisJaWYgKCFzY2FubmVkX2RlbHRh KQorCQlyZXR1cm4gMDsKKworCXNjYW5uZWRfZGVsdGEgPj49IGJhc2U7CisJcG9zX2RlbHRhID0g cnNoYXNoX3BvcyA+PiBiYXNlOworCW5lZ19kZWx0YSA9IHJzaGFzaF9uZWcgPj4gYmFzZTsKKwor CWlmIChDQU5fT1ZFUkZMT1dfVTY0KGJlbmVmaXQucG9zLCBwb3NfZGVsdGEpIHx8CisJICAgIENB Tl9PVkVSRkxPV19VNjQoYmVuZWZpdC5uZWcsIG5lZ19kZWx0YSkgfHwKKwkgICAgQ0FOX09WRVJG TE9XX1U2NChiZW5lZml0LnNjYW5uZWQsIHNjYW5uZWRfZGVsdGEpKSB7CisJCWJlbmVmaXQuc2Nh bm5lZCA+Pj0gMTsKKwkJYmVuZWZpdC5uZWcgPj49IDE7CisJCWJlbmVmaXQucG9zID4+PSAxOwor CQliZW5lZml0LmJhc2UrKzsKKwkJc2Nhbm5lZF9kZWx0YSA+Pj0gMTsKKwkJcG9zX2RlbHRhID4+ PSAxOworCQluZWdfZGVsdGEgPj49IDE7CisJfQorCisJYmVuZWZpdC5wb3MgKz0gcG9zX2RlbHRh OworCWJlbmVmaXQubmVnICs9IG5lZ19kZWx0YTsKKwliZW5lZml0LnNjYW5uZWQgKz0gc2Nhbm5l ZF9kZWx0YTsKKworCUJVR19PTighYmVuZWZpdC5zY2FubmVkKTsKKworCXJzaGFzaF9wb3MgPSBy c2hhc2hfbmVnID0gMDsKKwl1a3NtX3BhZ2VzX3NjYW5uZWRfbGFzdCA9IHVrc21fcGFnZXNfc2Nh bm5lZDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfYmVuZWZp dCh2b2lkKQoreworCWJlbmVmaXQucG9zID0gMDsKKwliZW5lZml0Lm5lZyA9IDA7CisJYmVuZWZp dC5iYXNlID0gMDsKKwliZW5lZml0LnNjYW5uZWQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgaW5jX3JzaGFzaF9wb3ModW5zaWduZWQgbG9uZyBkZWx0YSkKK3sKKwlpZiAoQ0FOX09WRVJG TE9XX1U2NChyc2hhc2hfcG9zLCBkZWx0YSkpCisJCWVuY29kZV9iZW5lZml0KCk7CisKKwlyc2hh c2hfcG9zICs9IGRlbHRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX3JzaGFzaF9uZWco dW5zaWduZWQgbG9uZyBkZWx0YSkKK3sKKwlpZiAoQ0FOX09WRVJGTE9XX1U2NChyc2hhc2hfbmVn LCBkZWx0YSkpCisJCWVuY29kZV9iZW5lZml0KCk7CisKKwlyc2hhc2hfbmVnICs9IGRlbHRhOwor fQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIHBhZ2VfaGFzaChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5z aWduZWQgbG9uZyBoYXNoX3N0cmVuZ3RoLAorCQkJICAgIGludCBjb3N0X2FjY291bnRpbmcpCit7 CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGRlbHRhOworCisJdm9pZCAqYWRkciA9IGttYXBf YXRvbWljKHBhZ2UpOworCisJdmFsID0gcmFuZG9tX3NhbXBsZV9oYXNoKGFkZHIsIGhhc2hfc3Ry ZW5ndGgpOworCWt1bm1hcF9hdG9taWMoYWRkcik7CisKKwlpZiAoY29zdF9hY2NvdW50aW5nKSB7 CisJCWlmIChIQVNIX1NUUkVOR1RIX0ZVTEwgPiBoYXNoX3N0cmVuZ3RoKQorCQkJZGVsdGEgPSBI QVNIX1NUUkVOR1RIX0ZVTEwgLSBoYXNoX3N0cmVuZ3RoOworCQllbHNlCisJCQlkZWx0YSA9IDA7 CisKKwkJaW5jX3JzaGFzaF9wb3MoZGVsdGEpOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0 YXRpYyBpbnQgbWVtY21wX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlMSwgc3RydWN0IHBhZ2UgKnBh Z2UyLAorCQkJaW50IGNvc3RfYWNjb3VudGluZykKK3sKKwljaGFyICphZGRyMSwgKmFkZHIyOwor CWludCByZXQ7CisKKwlhZGRyMSA9IGttYXBfYXRvbWljKHBhZ2UxKTsKKwlhZGRyMiA9IGttYXBf YXRvbWljKHBhZ2UyKTsKKwlyZXQgPSBtZW1jbXAoYWRkcjEsIGFkZHIyLCBQQUdFX1NJWkUpOwor CWt1bm1hcF9hdG9taWMoYWRkcjIpOworCWt1bm1hcF9hdG9taWMoYWRkcjEpOworCisJaWYgKGNv c3RfYWNjb3VudGluZykKKwkJaW5jX3JzaGFzaF9uZWcobWVtY21wX2Nvc3QpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFnZXNfaWRlbnRpY2FsKHN0cnVjdCBwYWdl ICpwYWdlMSwgc3RydWN0IHBhZ2UgKnBhZ2UyKQoreworCXJldHVybiAhbWVtY21wX3BhZ2VzKHBh Z2UxLCBwYWdlMiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BhZ2VfZnVsbF96ZXJv KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNoYXIgKmFkZHI7CisJaW50IHJldDsKKworCWFkZHIg PSBrbWFwX2F0b21pYyhwYWdlKTsKKwlyZXQgPSBpc19mdWxsX3plcm8oYWRkciwgUEFHRV9TSVpF KTsKKwlrdW5tYXBfYXRvbWljKGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCB3cml0ZV9wcm90ZWN0X3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBw YWdlICpwYWdlLAorCQkJICAgICAgcHRlX3QgKm9yaWdfcHRlLCBwdGVfdCAqb2xkX3B0ZSkKK3sK KwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJdW5zaWduZWQgbG9uZyBhZGRy OworCXB0ZV90ICpwdGVwOworCXNwaW5sb2NrX3QgKnB0bDsKKwlpbnQgc3dhcHBlZDsKKwlpbnQg ZXJyID0gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIG1tdW5fc3RhcnQ7CS8qIEZvciBtbXVfbm90 aWZpZXJzICovCisJdW5zaWduZWQgbG9uZyBtbXVuX2VuZDsJCS8qIEZvciBtbXVfbm90aWZpZXJz ICovCisKKwlhZGRyID0gcGFnZV9hZGRyZXNzX2luX3ZtYShwYWdlLCB2bWEpOworCWlmIChhZGRy ID09IC1FRkFVTFQpCisJCWdvdG8gb3V0OworCisJQlVHX09OKFBhZ2VUcmFuc0NvbXBvdW5kKHBh Z2UpKTsKKworCW1tdW5fc3RhcnQgPSBhZGRyOworCW1tdW5fZW5kICAgPSBhZGRyICsgUEFHRV9T SVpFOworCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tLCBtbXVuX3N0YXJ0 LCBtbXVuX2VuZCk7CisKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKHBhZ2UsIG1tLCBhZGRy LCAmcHRsLCAwKTsKKwlpZiAoIXB0ZXApCisJCWdvdG8gb3V0X21uOworCisJaWYgKG9sZF9wdGUp CisJCSpvbGRfcHRlID0gKnB0ZXA7CisKKwlpZiAocHRlX3dyaXRlKCpwdGVwKSB8fCBwdGVfZGly dHkoKnB0ZXApKSB7CisJCXB0ZV90IGVudHJ5OworCisJCXN3YXBwZWQgPSBQYWdlU3dhcENhY2hl KHBhZ2UpOworCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcGFnZV90b19wZm4ocGFnZSkp OworCQkvKgorCQkgKiBPayB0aGlzIGlzIHRyaWNreSwgd2hlbiBnZXRfdXNlcl9wYWdlc19mYXN0 KCkgcnVuIGl0IGRvZXNudAorCQkgKiB0YWtlIGFueSBsb2NrLCB0aGVyZWZvcmUgdGhlIGNoZWNr IHRoYXQgd2UgYXJlIGdvaW5nIHRvIG1ha2UKKwkJICogd2l0aCB0aGUgcGFnZWNvdW50IGFnYWlu c3QgdGhlIG1hcGNvdW50IGlzIHJhY2V5IGFuZAorCQkgKiBPX0RJUkVDVCBjYW4gaGFwcGVuIHJp Z2h0IGFmdGVyIHRoZSBjaGVjay4KKwkJICogU28gd2UgY2xlYXIgdGhlIHB0ZSBhbmQgZmx1c2gg dGhlIHRsYiBiZWZvcmUgdGhlIGNoZWNrCisJCSAqIHRoaXMgYXNzdXJlIHVzIHRoYXQgbm8gT19E SVJFQ1QgY2FuIGhhcHBlbiBhZnRlciB0aGUgY2hlY2sKKwkJICogb3IgaW4gdGhlIG1pZGRsZSBv ZiB0aGUgY2hlY2suCisJCSAqLworCQllbnRyeSA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRy LCBwdGVwKTsKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCBubyBPX0RJUkVDVCBvciBzaW1pbGFyIEkv TyBpcyBpbiBwcm9ncmVzcyBvbiB0aGUKKwkJICogcGFnZQorCQkgKi8KKwkJaWYgKHBhZ2VfbWFw Y291bnQocGFnZSkgKyAxICsgc3dhcHBlZCAhPSBwYWdlX2NvdW50KHBhZ2UpKSB7CisJCQlzZXRf cHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBlbnRyeSk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0K KwkJaWYgKHB0ZV9kaXJ0eShlbnRyeSkpCisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJZW50 cnkgPSBwdGVfbWtjbGVhbihwdGVfd3Jwcm90ZWN0KGVudHJ5KSk7CisJCXNldF9wdGVfYXRfbm90 aWZ5KG1tLCBhZGRyLCBwdGVwLCBlbnRyeSk7CisJfQorCSpvcmlnX3B0ZSA9ICpwdGVwOworCWVy ciA9IDA7CisKK291dF91bmxvY2s6CisJcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOworb3V0 X21uOgorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChtbSwgbW11bl9zdGFydCwg bW11bl9lbmQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgTUVSR0VfRVJSX1BH RVJSCQkxIC8qIHRoZSBwYWdlIGlzIGludmFsaWQgY2Fubm90IGNvbnRpbnVlICovCisjZGVmaW5l IE1FUkdFX0VSUl9DT0xMSQkJMiAvKiB0aGVyZSBpcyBhIGNvbGxpc2lvbiAqLworI2RlZmluZSBN RVJHRV9FUlJfQ09MTElfTUFYCTMgLyogY29sbGlzaW9uIGF0IHRoZSBtYXggaGFzaCBzdHJlbmd0 aCAqLworI2RlZmluZSBNRVJHRV9FUlJfQ0hBTkdFRAk0IC8qIHRoZSBwYWdlIGhhcyBjaGFuZ2Vk IHNpbmNlIGxhc3QgaGFzaCAqLworCisKKy8qKgorICogcmVwbGFjZV9wYWdlIC0gcmVwbGFjZSBw YWdlIGluIHZtYSBieSBuZXcga3NtIHBhZ2UKKyAqIEB2bWE6ICAgICAgdm1hIHRoYXQgaG9sZHMg dGhlIHB0ZSBwb2ludGluZyB0byBwYWdlCisgKiBAcGFnZTogICAgIHRoZSBwYWdlIHdlIGFyZSBy ZXBsYWNpbmcgYnkga3BhZ2UKKyAqIEBrcGFnZTogICAgdGhlIGtzbSBwYWdlIHdlIHJlcGxhY2Ug cGFnZSBieQorICogQG9yaWdfcHRlOiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHB0ZQorICoK KyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBNRVJHRV9FUlJfUEdFUlIgb24gZmFpbHVyZS4KKyAq Lworc3RhdGljIGludCByZXBsYWNlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0 cnVjdCBwYWdlICpwYWdlLAorCQkJc3RydWN0IHBhZ2UgKmtwYWdlLCBwdGVfdCBvcmlnX3B0ZSkK K3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJcGdkX3QgKnBnZDsKKwlw dWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZXA7CisJc3BpbmxvY2tfdCAqcHRs OworCXB0ZV90IGVudHJ5OworCisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCBlcnIgPSBNRVJH RV9FUlJfUEdFUlI7CisJdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0OwkvKiBGb3IgbW11X25vdGlm aWVycyAqLworCXVuc2lnbmVkIGxvbmcgbW11bl9lbmQ7CQkvKiBGb3IgbW11X25vdGlmaWVycyAq LworCisJYWRkciA9IHBhZ2VfYWRkcmVzc19pbl92bWEocGFnZSwgdm1hKTsKKwlpZiAoYWRkciA9 PSAtRUZBVUxUKQorCQlnb3RvIG91dDsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwor CWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisJCWdvdG8gb3V0OworCisJcHVkID0gcHVkX29mZnNl dChwZ2QsIGFkZHIpOworCWlmICghcHVkX3ByZXNlbnQoKnB1ZCkpCisJCWdvdG8gb3V0OworCisJ cG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCUJVR19PTihwbWRfdHJhbnNfaHVnZSgqcG1k KSk7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKKwkJZ290byBvdXQ7CisKKwltbXVuX3N0YXJ0 ID0gYWRkcjsKKwltbXVuX2VuZCAgID0gYWRkciArIFBBR0VfU0laRTsKKwltbXVfbm90aWZpZXJf aW52YWxpZGF0ZV9yYW5nZV9zdGFydChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOworCisJcHRl cCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CisJaWYgKCFwdGVf c2FtZSgqcHRlcCwgb3JpZ19wdGUpKSB7CisJCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsK KwkJZ290byBvdXRfbW47CisJfQorCisJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHB0ZV9w Zm4oKnB0ZXApKTsKKwlwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkciwgcHRlcCk7CisJZW50cnkg PSBta19wdGUoa3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qIHNwZWNpYWwgdHJlYXRt ZW50IGlzIG5lZWRlZCBmb3IgemVyb19wYWdlICovCisJaWYgKChwYWdlX3RvX3BmbihrcGFnZSkg PT0gdWtzbV96ZXJvX3BmbikgfHwKKwkJCQkocGFnZV90b19wZm4oa3BhZ2UpID09IHplcm9fcGZu KSkKKwkJZW50cnkgPSBwdGVfbWtzcGVjaWFsKGVudHJ5KTsKKwllbHNlIHsKKwkJZ2V0X3BhZ2Uo a3BhZ2UpOworCQlwYWdlX2FkZF9hbm9uX3JtYXAoa3BhZ2UsIHZtYSwgYWRkcik7CisJfQorCisJ c2V0X3B0ZV9hdF9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIGVudHJ5KTsKKworCXBhZ2VfcmVtb3Zl X3JtYXAocGFnZSk7CisJaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKKwkJdHJ5X3RvX2ZyZWVfc3dh cChwYWdlKTsKKwlwdXRfcGFnZShwYWdlKTsKKworCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRs KTsKKwllcnIgPSAwOworb3V0X21uOgorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2Vu ZChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKwor LyoqCisgKiAgRnVsbHkgaGFzaCBhIHBhZ2Ugd2l0aCBIQVNIX1NUUkVOR1RIX01BWCByZXR1cm4g YSBub24temVybyBoYXNoIHZhbHVlLiBUaGUKKyAqICB6ZXJvIGhhc2ggdmFsdWUgYXQgSEFTSF9T VFJFTkdUSF9NQVggaXMgdXNlZCB0byBpbmRpY2F0ZWQgdGhhdCBpdHMKKyAqICBoYXNoX21heCBt ZW1iZXIgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQuCisgKgorICogQHBhZ2UgVGhlIHBhZ2UgbmVl ZHMgdG8gYmUgaGFzaGVkCisgKiBAaGFzaF9vbGQgVGhlIGhhc2ggdmFsdWUgY2FsY3VsYXRlZCB3 aXRoIGN1cnJlbnQgaGFzaCBzdHJlbmd0aAorICoKKyAqIHJldHVybiB0aGUgbmV3IGhhc2ggdmFs dWUgY2FsY3VsYXRlZCBhdCBIQVNIX1NUUkVOR1RIX01BWAorICovCitzdGF0aWMgaW5saW5lIHUz MiBwYWdlX2hhc2hfbWF4KHN0cnVjdCBwYWdlICpwYWdlLCB1MzIgaGFzaF9vbGQpCit7CisJdTMy IGhhc2hfbWF4ID0gMDsKKwl2b2lkICphZGRyOworCisJYWRkciA9IGttYXBfYXRvbWljKHBhZ2Up OworCWhhc2hfbWF4ID0gZGVsdGFfaGFzaChhZGRyLCBoYXNoX3N0cmVuZ3RoLAorCQkJICAgICAg SEFTSF9TVFJFTkdUSF9NQVgsIGhhc2hfb2xkKTsKKworCWt1bm1hcF9hdG9taWMoYWRkcik7CisK KwlpZiAoIWhhc2hfbWF4KQorCQloYXNoX21heCA9IDE7CisKKwlpbmNfcnNoYXNoX25lZyhIQVNI X1NUUkVOR1RIX01BWCAtIGhhc2hfc3RyZW5ndGgpOworCXJldHVybiBoYXNoX21heDsKK30KKwor LyoKKyAqIFdlIGNvbXBhcmUgdGhlIGhhc2ggYWdhaW4sIHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJl YWxseSBhIGhhc2ggY29sbGlzaW9uCisgKiBpbnN0ZWFkIG9mIGJlaW5nIGNhdXNlZCBieSBwYWdl IHdyaXRlLgorICovCitzdGF0aWMgaW5saW5lIGludCBjaGVja19jb2xsaXNpb24oc3RydWN0IHJt YXBfaXRlbSAqcm1hcF9pdGVtLAorCQkJCSAgdTMyIGhhc2gpCit7CisJaW50IGVycjsKKwlzdHJ1 Y3QgcGFnZSAqcGFnZSA9IHJtYXBfaXRlbS0+cGFnZTsKKworCS8qIGlmIHRoaXMgcm1hcF9pdGVt IGhhcyBhbHJlYWR5IGJlZW4gaGFzaF9tYXhlZCwgdGhlbiB0aGUgY29sbGlzaW9uCisJICogbXVz dCBhcHBlYXJzIGluIHRoZSBzZWNvbmQtbGV2ZWwgcmJ0cmVlIHNlYXJjaC4gSW4gdGhpcyBjYXNl IHdlIGNoZWNrCisJICogaWYgaXRzIGhhc2hfbWF4IHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuIE90 aGVyd2lzZSwgdGhlIGNvbGxpc2lvbgorCSAqIGhhcHBlbnMgaW4gdGhlIGZpcnN0LWxldmVsIHJi dHJlZSBzZWFyY2gsIHNvIHdlIGNoZWNrIGFnYWluc3QgaXQncworCSAqIGN1cnJlbnQgaGFzaCB2 YWx1ZS4KKwkgKi8KKwlpZiAocm1hcF9pdGVtLT5oYXNoX21heCkgeworCQlpbmNfcnNoYXNoX25l ZyhtZW1jbXBfY29zdCk7CisJCWluY19yc2hhc2hfbmVnKEhBU0hfU1RSRU5HVEhfTUFYIC0gaGFz aF9zdHJlbmd0aCk7CisKKwkJaWYgKHJtYXBfaXRlbS0+aGFzaF9tYXggPT0gcGFnZV9oYXNoX21h eChwYWdlLCBoYXNoKSkKKwkJCWVyciA9IE1FUkdFX0VSUl9DT0xMSTsKKwkJZWxzZQorCQkJZXJy ID0gTUVSR0VfRVJSX0NIQU5HRUQ7CisJfSBlbHNlIHsKKwkJaW5jX3JzaGFzaF9uZWcobWVtY21w X2Nvc3QgKyBoYXNoX3N0cmVuZ3RoKTsKKworCQlpZiAocGFnZV9oYXNoKHBhZ2UsIGhhc2hfc3Ry ZW5ndGgsIDApID09IGhhc2gpCisJCQllcnIgPSBNRVJHRV9FUlJfQ09MTEk7CisJCWVsc2UKKwkJ CWVyciA9IE1FUkdFX0VSUl9DSEFOR0VEOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgcGFnZSAqcGFnZV90cmFuc19jb21wb3VuZF9hbm9uKHN0cnVjdCBwYWdlICpwYWdl KQoreworCWlmIChQYWdlVHJhbnNDb21wb3VuZChwYWdlKSkgeworCQlzdHJ1Y3QgcGFnZSAqaGVh ZCA9IGNvbXBvdW5kX2hlYWQocGFnZSk7CisJCS8qCisJCSAqIGhlYWQgbWF5IGFjdHVhbGx5IGJl IHNwbGl0dGVkIGFuZCBmcmVlZCBmcm9tIHVuZGVyCisJCSAqIHVzIGJ1dCBpdCdzIG9rIGhlcmUu CisJCSAqLworCQlpZiAoUGFnZUFub24oaGVhZCkpCisJCQlyZXR1cm4gaGVhZDsKKwl9CisJcmV0 dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0 KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwYWdlICp0cmFu c2h1Z2VfaGVhZCA9IHBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbihwYWdlKTsKKwlpZiAodHJhbnNo dWdlX2hlYWQpIHsKKwkJLyogR2V0IHRoZSByZWZlcmVuY2Ugb24gdGhlIGhlYWQgdG8gc3BsaXQg aXQuICovCisJCWlmIChnZXRfcGFnZV91bmxlc3NfemVybyh0cmFuc2h1Z2VfaGVhZCkpIHsKKwkJ CS8qCisJCQkgKiBSZWNoZWNrIHdlIGdvdCB0aGUgcmVmZXJlbmNlIHdoaWxlIHRoZSBoZWFkCisJ CQkgKiB3YXMgc3RpbGwgYW5vbnltb3VzLgorCQkJICovCisJCQlpZiAoUGFnZUFub24odHJhbnNo dWdlX2hlYWQpKQorCQkJCXJldCA9IHNwbGl0X2h1Z2VfcGFnZSh0cmFuc2h1Z2VfaGVhZCk7CisJ CQllbHNlCisJCQkJLyoKKwkJCQkgKiBSZXRyeSBsYXRlciBpZiBzcGxpdF9odWdlX3BhZ2UgcnVu CisJCQkJICogZnJvbSB1bmRlciB1cy4KKwkJCQkgKi8KKwkJCQlyZXQgPSAxOworCQkJcHV0X3Bh Z2UodHJhbnNodWdlX2hlYWQpOworCQl9IGVsc2UKKwkJCS8qIFJldHJ5IGxhdGVyIGlmIHNwbGl0 X2h1Z2VfcGFnZSBydW4gZnJvbSB1bmRlciB1cy4gKi8KKwkJCXJldCA9IDE7CisJfQorCXJldHVy biByZXQ7Cit9CisKKy8qKgorICogVHJ5IHRvIG1lcmdlIGEgcm1hcF9pdGVtLnBhZ2Ugd2l0aCBh IGtwYWdlIGluIHN0YWJsZSBub2RlLiBrcGFnZSBtdXN0CisgKiBhbHJlYWR5IGJlIGEga3NtIHBh Z2UuCisgKgorICogQHJldHVybiAwIGlmIHRoZSBwYWdlcyB3ZXJlIG1lcmdlZCwgLUVGQVVMVCBv dGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX21lcmdlX3dpdGhfdWtzbV9wYWdlKHN0 cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqa3BhZ2Us IHUzMiBoYXNoKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcm1hcF9pdGVtLT5z bG90LT52bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXB0ZV90IG9y aWdfcHRlID0gX19wdGUoMCk7CisJaW50IGVyciA9IE1FUkdFX0VSUl9QR0VSUjsKKwlzdHJ1Y3Qg cGFnZSAqcGFnZTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdChtbSkpCisJCWdvdG8gb3V0OworCisJ cGFnZSA9IHJtYXBfaXRlbS0+cGFnZTsKKworCWlmIChwYWdlID09IGtwYWdlKSB7IC8qIGtzbSBw YWdlIGZvcmtlZCAqLworCQllcnIgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoUGFnZVRy YW5zQ29tcG91bmQocGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHBhZ2Up KQorCQlnb3RvIG91dDsKKwlCVUdfT04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkpOworCisJaWYg KCFQYWdlQW5vbihwYWdlKSB8fCAhUGFnZUtzbShrcGFnZSkpCisJCWdvdG8gb3V0OworCisJLyoK KwkgKiBXZSBuZWVkIHRoZSBwYWdlIGxvY2sgdG8gcmVhZCBhIHN0YWJsZSBQYWdlU3dhcENhY2hl IGluCisJICogd3JpdGVfcHJvdGVjdF9wYWdlKCkuICBXZSB1c2UgdHJ5bG9ja19wYWdlKCkgaW5z dGVhZCBvZgorCSAqIGxvY2tfcGFnZSgpIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGhl cmUgLSB3ZQorCSAqIHByZWZlciB0byBjb250aW51ZSBzY2FubmluZyBhbmQgbWVyZ2luZyBkaWZm ZXJlbnQgcGFnZXMsCisJICogdGhlbiBjb21lIGJhY2sgdG8gdGhpcyBwYWdlIHdoZW4gaXQgaXMg dW5sb2NrZWQuCisJICovCisJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCisJCWdvdG8gb3V0Owor CS8qCisJICogSWYgdGhpcyBhbm9ueW1vdXMgcGFnZSBpcyBtYXBwZWQgb25seSBoZXJlLCBpdHMg cHRlIG1heSBuZWVkCisJICogdG8gYmUgd3JpdGUtcHJvdGVjdGVkLiAgSWYgaXQncyBtYXBwZWQg ZWxzZXdoZXJlLCBhbGwgb2YgaXRzCisJICogcHRlcyBhcmUgbmVjZXNzYXJpbHkgYWxyZWFkeSB3 cml0ZS1wcm90ZWN0ZWQuICBCdXQgaW4gZWl0aGVyCisJICogY2FzZSwgd2UgbmVlZCB0byBsb2Nr IGFuZCBjaGVjayBwYWdlX2NvdW50IGlzIG5vdCByYWlzZWQuCisJICovCisJaWYgKHdyaXRlX3By b3RlY3RfcGFnZSh2bWEsIHBhZ2UsICZvcmlnX3B0ZSwgTlVMTCkgPT0gMCkgeworCQlpZiAocGFn ZXNfaWRlbnRpY2FsKHBhZ2UsIGtwYWdlKSkKKwkJCWVyciA9IHJlcGxhY2VfcGFnZSh2bWEsIHBh Z2UsIGtwYWdlLCBvcmlnX3B0ZSk7CisJCWVsc2UKKwkJCWVyciA9IGNoZWNrX2NvbGxpc2lvbihy bWFwX2l0ZW0sIGhhc2gpOworCX0KKworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkg JiYga3BhZ2UgJiYgIWVycikgeworCQltdW5sb2NrX3ZtYV9wYWdlKHBhZ2UpOworCQlpZiAoIVBh Z2VNbG9ja2VkKGtwYWdlKSkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlsb2NrX3BhZ2Uo a3BhZ2UpOworCQkJbWxvY2tfdm1hX3BhZ2Uoa3BhZ2UpOworCQkJcGFnZSA9IGtwYWdlOwkJLyog Zm9yIGZpbmFsIHVubG9jayAqLworCQl9CisJfQorCisJdW5sb2NrX3BhZ2UocGFnZSk7CitvdXQ6 CisJcmV0dXJuIGVycjsKK30KKworCisKKy8qKgorICogSWYgdHdvIHBhZ2VzIGZhaWwgdG8gbWVy Z2UgaW4gdHJ5X3RvX21lcmdlX3R3b19wYWdlcywgdGhlbiB3ZSBoYXZlIGEgY2hhbmNlCisgKiB0 byByZXN0b3JlIGEgcGFnZSBtYXBwaW5nIHRoYXQgaGFzIGJlZW4gY2hhbmdlZCBpbiB0cnlfdG9f bWVyZ2VfdHdvX3BhZ2VzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitzdGF0 aWMgaW50IHJlc3RvcmVfdWtzbV9wYWdlX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwg dW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICBwdGVfdCBvcmlnX3B0ZSwgcHRlX3Qgd3BydF9w dGUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXBnZF90ICpwZ2Q7 CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwOworCXNwaW5sb2NrX3Qg KnB0bDsKKworCWludCBlcnIgPSAtRUZBVUxUOworCisJcGdkID0gcGdkX29mZnNldChtbSwgYWRk cik7CisJaWYgKCFwZ2RfcHJlc2VudCgqcGdkKSkKKwkJZ290byBvdXQ7CisKKwlwdWQgPSBwdWRf b2Zmc2V0KHBnZCwgYWRkcik7CisJaWYgKCFwdWRfcHJlc2VudCgqcHVkKSkKKwkJZ290byBvdXQ7 CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1k KSkKKwkJZ290byBvdXQ7CisKKwlwdGVwID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBh ZGRyLCAmcHRsKTsKKwlpZiAoIXB0ZV9zYW1lKCpwdGVwLCB3cHJ0X3B0ZSkpIHsKKwkJLyogYWxy ZWFkeSBjb3BpZWQsIGxldCBpdCBiZSAqLworCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7 CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogR29vZCBib3ksIHN0aWxsIGhlcmUuIFdoZW4g d2Ugc3RpbGwgZ2V0IHRoZSBrc20gcGFnZSwgaXQgZG9lcyBub3QKKwkgKiByZXR1cm4gdG8gdGhl IGZyZWUgcGFnZSBwb29sLCB0aGVyZSBpcyBubyB3YXkgdGhhdCBhIHB0ZSB3YXMgY2hhbmdlZAor CSAqIHRvIG90aGVyIHBhZ2UgYW5kIGdldHMgYmFjayB0byB0aGlzIHBhZ2UuIEFuZCByZW1pbmQg dGhhdCBrc20gcGFnZQorCSAqIGRvIG5vdCByZXVzZSBpbiBkb193cF9wYWdlKCkuIFNvIGl0J3Mg c2FmZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbAorCSAqIHB0ZS4KKwkgKi8KKwlmbHVzaF9jYWNo ZV9wYWdlKHZtYSwgYWRkciwgcHRlX3BmbigqcHRlcCkpOworCXB0ZXBfY2xlYXJfZmx1c2godm1h LCBhZGRyLCBwdGVwKTsKKwlzZXRfcHRlX2F0X25vdGlmeShtbSwgYWRkciwgcHRlcCwgb3JpZ19w dGUpOworCisJcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOworCWVyciA9IDA7CitvdXQ6CisJ cmV0dXJuIGVycjsKK30KKworLyoqCisgKiB0cnlfdG9fbWVyZ2VfdHdvX3BhZ2VzKCkgLSB0YWtl IHR3byBpZGVudGljYWwgcGFnZXMgYW5kIHByZXBhcmUKKyAqIHRoZW0gdG8gYmUgbWVyZ2VkIGlu dG8gb25lIHBhZ2Uocm1hcF9pdGVtLT5wYWdlKQorICoKKyAqIEByZXR1cm4gMCBpZiB3ZSBzdWNj ZXNzZnVsbHkgbWVyZ2VkIHR3byBpZGVudGljYWwgcGFnZXMgaW50bworICogICAgICAgICBvbmUg a3NtIHBhZ2UuIE1FUkdFX0VSUl9DT0xMSSBpZiBpdCdzIG9ubHkgYSBoYXNoIGNvbGxpc2lvbgor ICogICAgICAgICBzZWFyY2ggaW4gcmJ0cmVlLiBNRVJHRV9FUlJfQ0hBTkdFRCBpZiBybWFwX2l0 ZW0gaGFzIGJlZW4KKyAqICAgICAgICAgY2hhbmdlZCBzaW5jZSBpdCdzIGhhc2hlZC4gTUVSR0Vf RVJSX1BHRVJSIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX21lcmdlX3R3 b19wYWdlcyhzdHJ1Y3Qgcm1hcF9pdGVtICpybWFwX2l0ZW0sCisJCQkJICBzdHJ1Y3Qgcm1hcF9p dGVtICp0cmVlX3JtYXBfaXRlbSwKKwkJCQkgIHUzMiBoYXNoKQoreworCXB0ZV90IG9yaWdfcHRl MSA9IF9fcHRlKDApLCBvcmlnX3B0ZTIgPSBfX3B0ZSgwKTsKKwlwdGVfdCB3cHJ0X3B0ZTEgPSBf X3B0ZSgwKSwgd3BydF9wdGUyID0gX19wdGUoMCk7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWExID0gcm1hcF9pdGVtLT5zbG90LT52bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEy ID0gdHJlZV9ybWFwX2l0ZW0tPnNsb3QtPnZtYTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJtYXBf aXRlbS0+cGFnZTsKKwlzdHJ1Y3QgcGFnZSAqdHJlZV9wYWdlID0gdHJlZV9ybWFwX2l0ZW0tPnBh Z2U7CisJaW50IGVyciA9IE1FUkdFX0VSUl9QR0VSUjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAq c2F2ZWRfbWFwcGluZzsKKworCisJaWYgKHJtYXBfaXRlbS0+cGFnZSA9PSB0cmVlX3JtYXBfaXRl bS0+cGFnZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoUGFnZVRyYW5zQ29tcG91bmQocGFnZSkgJiYg cGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHBhZ2UpKQorCQlnb3RvIG91dDsKKwlCVUdf T04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkpOworCisJaWYgKFBhZ2VUcmFuc0NvbXBvdW5kKHRy ZWVfcGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHRyZWVfcGFnZSkpCisJ CWdvdG8gb3V0OworCUJVR19PTihQYWdlVHJhbnNDb21wb3VuZCh0cmVlX3BhZ2UpKTsKKworCWlm ICghUGFnZUFub24ocGFnZSkgfHwgIVBhZ2VBbm9uKHRyZWVfcGFnZSkpCisJCWdvdG8gb3V0Owor CisJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCisJCWdvdG8gb3V0OworCisKKwlpZiAod3JpdGVf cHJvdGVjdF9wYWdlKHZtYTEsIHBhZ2UsICZ3cHJ0X3B0ZTEsICZvcmlnX3B0ZTEpICE9IDApIHsK KwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2hpbGUg d2UgaG9sZCBwYWdlIGxvY2ssIHVwZ3JhZGUgcGFnZSBmcm9tCisJICogUGFnZUFub24rYW5vbl92 bWEgdG8gUGFnZUtzbStOVUxMIHN0YWJsZV9ub2RlOgorCSAqIHN0YWJsZV90cmVlX2luc2VydCgp IHdpbGwgdXBkYXRlIHN0YWJsZV9ub2RlLgorCSAqLworCXNhdmVkX21hcHBpbmcgPSBwYWdlLT5t YXBwaW5nOworCXNldF9wYWdlX3N0YWJsZV9ub2RlKHBhZ2UsIE5VTEwpOworCW1hcmtfcGFnZV9h Y2Nlc3NlZChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCWlmICghdHJ5bG9ja19wYWdl KHRyZWVfcGFnZSkpCisJCWdvdG8gcmVzdG9yZV9vdXQ7CisKKwlpZiAod3JpdGVfcHJvdGVjdF9w YWdlKHZtYTIsIHRyZWVfcGFnZSwgJndwcnRfcHRlMiwgJm9yaWdfcHRlMikgIT0gMCkgeworCQl1 bmxvY2tfcGFnZSh0cmVlX3BhZ2UpOworCQlnb3RvIHJlc3RvcmVfb3V0OworCX0KKworCWlmIChw YWdlc19pZGVudGljYWwocGFnZSwgdHJlZV9wYWdlKSkgeworCQllcnIgPSByZXBsYWNlX3BhZ2Uo dm1hMiwgdHJlZV9wYWdlLCBwYWdlLCB3cHJ0X3B0ZTIpOworCQlpZiAoZXJyKSB7CisJCQl1bmxv Y2tfcGFnZSh0cmVlX3BhZ2UpOworCQkJZ290byByZXN0b3JlX291dDsKKwkJfQorCisJCWlmICgo dm1hMi0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpKSB7CisJCQltdW5sb2NrX3ZtYV9wYWdlKHRyZWVf cGFnZSk7CisJCQlpZiAoIVBhZ2VNbG9ja2VkKHBhZ2UpKSB7CisJCQkJdW5sb2NrX3BhZ2UodHJl ZV9wYWdlKTsKKwkJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQkJbWxvY2tfdm1hX3BhZ2UocGFnZSk7 CisJCQkJdHJlZV9wYWdlID0gcGFnZTsgLyogZm9yIGZpbmFsIHVubG9jayAqLworCQkJfQorCQl9 CisKKwkJdW5sb2NrX3BhZ2UodHJlZV9wYWdlKTsKKworCQlnb3RvIG91dDsgLyogc3VjY2VzcyAq LworCisJfSBlbHNlIHsKKwkJaWYgKHRyZWVfcm1hcF9pdGVtLT5oYXNoX21heCAmJgorCQkgICAg dHJlZV9ybWFwX2l0ZW0tPmhhc2hfbWF4ID09IHJtYXBfaXRlbS0+aGFzaF9tYXgpIHsKKwkJCWVy ciA9IE1FUkdFX0VSUl9DT0xMSV9NQVg7CisJCX0gZWxzZSBpZiAocGFnZV9oYXNoKHBhZ2UsIGhh c2hfc3RyZW5ndGgsIDApID09CisJCSAgICBwYWdlX2hhc2godHJlZV9wYWdlLCBoYXNoX3N0cmVu Z3RoLCAwKSkgeworCQkJaW5jX3JzaGFzaF9uZWcobWVtY21wX2Nvc3QgKyBoYXNoX3N0cmVuZ3Ro ICogMik7CisJCQllcnIgPSBNRVJHRV9FUlJfQ09MTEk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBN RVJHRV9FUlJfQ0hBTkdFRDsKKwkJfQorCisJCXVubG9ja19wYWdlKHRyZWVfcGFnZSk7CisJfQor CityZXN0b3JlX291dDoKKwlsb2NrX3BhZ2UocGFnZSk7CisJaWYgKCFyZXN0b3JlX3Vrc21fcGFn ZV9wdGUodm1hMSwgZ2V0X3JtYXBfYWRkcihybWFwX2l0ZW0pLAorCQkJCSAgb3JpZ19wdGUxLCB3 cHJ0X3B0ZTEpKQorCQlwYWdlLT5tYXBwaW5nID0gc2F2ZWRfbWFwcGluZzsKKworCXVubG9ja19w YWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhh c2hfY21wKHUzMiBuZXdfdmFsLCB1MzIgbm9kZV92YWwpCit7CisJaWYgKG5ld192YWwgPiBub2Rl X3ZhbCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAobmV3X3ZhbCA8IG5vZGVfdmFsKQorCQlyZXR1 cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgcm1hcF9p dGVtX2hhc2hfbWF4KHN0cnVjdCBybWFwX2l0ZW0gKml0ZW0sIHUzMiBoYXNoKQoreworCXUzMiBo YXNoX21heCA9IGl0ZW0tPmhhc2hfbWF4OworCisJaWYgKCFoYXNoX21heCkgeworCQloYXNoX21h eCA9IHBhZ2VfaGFzaF9tYXgoaXRlbS0+cGFnZSwgaGFzaCk7CisKKwkJaXRlbS0+aGFzaF9tYXgg PSBoYXNoX21heDsKKwl9CisKKwlyZXR1cm4gaGFzaF9tYXg7Cit9CisKKworCisvKioKKyAqIHN0 YWJsZV90cmVlX3NlYXJjaCgpIC0gc2VhcmNoIHRoZSBzdGFibGUgdHJlZSBmb3IgYSBwYWdlCisg KgorICogQGl0ZW06IAl0aGUgcm1hcF9pdGVtIHdlIGFyZSBjb21wYXJpbmcgd2l0aAorICogQGhh c2g6IAl0aGUgaGFzaCB2YWx1ZSBvZiB0aGlzIGl0ZW0tPnBhZ2UgYWxyZWFkeSBjYWxjdWxhdGVk CisgKgorICogQHJldHVybiAJdGhlIHBhZ2Ugd2UgaGF2ZSBmb3VuZCwgTlVMTCBvdGhlcndpc2Uu IFRoZSBwYWdlIHJldHVybmVkIGhhcworICogICAgICAgICAJYmVlbiBnb3R0ZW4uCisgKi8KK3N0 YXRpYyBzdHJ1Y3QgcGFnZSAqc3RhYmxlX3RyZWVfc2VhcmNoKHN0cnVjdCBybWFwX2l0ZW0gKml0 ZW0sIHUzMiBoYXNoKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcm9vdF9zdGFibGVfdHJl ZXAtPnJiX25vZGU7CisJc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlOworCXVuc2lnbmVkIGxv bmcgaGFzaF9tYXg7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBpdGVtLT5wYWdlOworCXN0cnVjdCBz dGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwlzdGFibGVfbm9kZSA9IHBhZ2Vfc3RhYmxlX25v ZGUocGFnZSk7CisJaWYgKHN0YWJsZV9ub2RlKSB7CisJCS8qIGtzbSBwYWdlIGZvcmtlZCwgdGhh dCBpcworCQkgKiBpZiAoUGFnZUtzbShwYWdlKSAmJiAhaW5fc3RhYmxlX3RyZWUocm1hcF9pdGVt KSkKKwkJICogaXQncyBhY3R1YWxseSBnb3R0ZW4gb25jZSBvdXRzaWRlLgorCQkgKi8KKwkJZ2V0 X3BhZ2UocGFnZSk7CisJCXJldHVybiBwYWdlOworCX0KKworCXdoaWxlIChub2RlKSB7CisJCWlu dCBjbXA7CisKKwkJdHJlZV9ub2RlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRyZWVfbm9kZSwg bm9kZSk7CisKKwkJY21wID0gaGFzaF9jbXAoaGFzaCwgdHJlZV9ub2RlLT5oYXNoKTsKKworCQlp ZiAoY21wIDwgMCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChjbXAgPiAw KQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlp ZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkg eworCQlzdGFibGVfbm9kZSA9IHJiX2VudHJ5KHRyZWVfbm9kZS0+c3ViX3Jvb3QucmJfbm9kZSwK KwkJCQkgICAgICAgc3RydWN0IHN0YWJsZV9ub2RlLCBub2RlKTsKKwkJQlVHX09OKCFzdGFibGVf bm9kZSk7CisKKwkJZ290byBnZXRfcGFnZV9vdXQ7CisJfQorCisJLyoKKwkgKiBvaywgd2UgaGF2 ZSB0byBzZWFyY2ggdGhlIHNlY29uZAorCSAqIGxldmVsIHN1YnRyZWUsIGhhc2ggdGhlIHBhZ2Ug dG8gYQorCSAqIGZ1bGwgc3RyZW5ndGguCisJICovCisJbm9kZSA9IHRyZWVfbm9kZS0+c3ViX3Jv b3QucmJfbm9kZTsKKwlCVUdfT04oIW5vZGUpOworCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hf bWF4KGl0ZW0sIGhhc2gpOworCisJd2hpbGUgKG5vZGUpIHsKKwkJaW50IGNtcDsKKworCQlzdGFi bGVfbm9kZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwkJ Y21wID0gaGFzaF9jbXAoaGFzaF9tYXgsIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJaWYg KGNtcCA8IDApCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY21wID4gMCkK KwkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBnZXRfcGFnZV9vdXQ7 CisJfQorCisJcmV0dXJuIE5VTEw7CisKK2dldF9wYWdlX291dDoKKwlwYWdlID0gZ2V0X3Vrc21f cGFnZShzdGFibGVfbm9kZSwgMSwgMSk7CisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBpbnQg dHJ5X21lcmdlX3JtYXBfaXRlbShzdHJ1Y3Qgcm1hcF9pdGVtICppdGVtLAorCQkJICAgICAgIHN0 cnVjdCBwYWdlICprcGFnZSwKKwkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqdHJlZV9wYWdlKQorewor CXNwaW5sb2NrX3QgKnB0bDsKKwlwdGVfdCAqcHRlcDsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJ c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBpdGVtLT5zbG90LT52bWE7CisKKwlhZGRyID0g Z2V0X3JtYXBfYWRkcihpdGVtKTsKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKGtwYWdlLCB2 bWEtPnZtX21tLCBhZGRyLCAmcHRsLCAwKTsKKwlpZiAoIXB0ZXApCisJCXJldHVybiAwOworCisJ aWYgKHB0ZV93cml0ZSgqcHRlcCkpIHsKKwkJLyogaGFzIGNoYW5nZWQsIGFib3J0ISAqLworCQlw dGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CisJCXJldHVybiAwOworCX0KKworCWdldF9wYWdl KHRyZWVfcGFnZSk7CisJcGFnZV9hZGRfYW5vbl9ybWFwKHRyZWVfcGFnZSwgdm1hLCBhZGRyKTsK KworCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyLCBwdGVfcGZuKCpwdGVwKSk7CisJcHRlcF9j bGVhcl9mbHVzaCh2bWEsIGFkZHIsIHB0ZXApOworCXNldF9wdGVfYXRfbm90aWZ5KHZtYS0+dm1f bW0sIGFkZHIsIHB0ZXAsCisJCQkgIG1rX3B0ZSh0cmVlX3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90 KSk7CisKKwlwYWdlX3JlbW92ZV9ybWFwKGtwYWdlKTsKKwlwdXRfcGFnZShrcGFnZSk7CisKKwlw dGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiB0 cnlfdG9fbWVyZ2Vfd2l0aF9zdGFibGVfcGFnZSgpIC0gd2hlbiB0d28gcm1hcF9pdGVtcyBuZWVk IHRvIGJlIGluc2VydGVkCisgKiBpbnRvIHN0YWJsZSB0cmVlLCB0aGUgcGFnZSB3YXMgZm91bmQg dG8gYmUgaWRlbnRpY2FsIHRvIGEgc3RhYmxlIGtzbSBwYWdlLAorICogdGhpcyBpcyB0aGUgbGFz dCBjaGFuY2Ugd2UgY2FuIG1lcmdlIHRoZW0gaW50byBvbmUuCisgKgorICogQGl0ZW0xOgl0aGUg cm1hcF9pdGVtIGhvbGRpbmcgdGhlIHBhZ2Ugd2hpY2ggd2Ugd2FudGVkIHRvIGluc2VydAorICog ICAgICAgCWludG8gc3RhYmxlIHRyZWUuCisgKiBAaXRlbTI6CXRoZSBvdGhlciBybWFwX2l0ZW0g d2UgZm91bmQgd2hlbiB1bnN0YWJsZSB0cmVlIHNlYXJjaAorICogQG9sZHBhZ2U6CXRoZSBwYWdl IGN1cnJlbnRseSBtYXBwZWQgYnkgdGhlIHR3byBybWFwX2l0ZW1zCisgKiBAdHJlZV9wYWdlOiAJ dGhlIHBhZ2Ugd2UgZm91bmQgaWRlbnRpY2FsIGluIHN0YWJsZSB0cmVlIG5vZGUKKyAqIEBzdWNj ZXNzMToJcmV0dXJuIGlmIGl0ZW0xIGlzIHN1Y2Nlc3NmdWxseSBtZXJnZWQKKyAqIEBzdWNjZXNz MjoJcmV0dXJuIGlmIGl0ZW0yIGlzIHN1Y2Nlc3NmdWxseSBtZXJnZWQKKyAqLworc3RhdGljIHZv aWQgdHJ5X21lcmdlX3dpdGhfc3RhYmxlKHN0cnVjdCBybWFwX2l0ZW0gKml0ZW0xLAorCQkJCSAg c3RydWN0IHJtYXBfaXRlbSAqaXRlbTIsCisJCQkJICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLAorCQkJ CSAgc3RydWN0IHBhZ2UgKnRyZWVfcGFnZSwKKwkJCQkgIGludCAqc3VjY2VzczEsIGludCAqc3Vj Y2VzczIpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWExID0gaXRlbTEtPnNsb3QtPnZt YTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTIgPSBpdGVtMi0+c2xvdC0+dm1hOworCSpz dWNjZXNzMSA9IDA7CisJKnN1Y2Nlc3MyID0gMDsKKworCWlmICh1bmxpa2VseSgqa3BhZ2UgPT0g dHJlZV9wYWdlKSkgeworCQkvKiBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIHJlYWxseSBoYXBwZW4g Ki8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVUtTTTogdW5leHBlY3RlZCBjb25kaXRpb24gZGV0 ZWN0ZWQgaW4gIgorCQkJInRyeV9tZXJnZV93aXRoX3N0YWJsZSgpIC0tICprcGFnZSA9PSB0cmVl X3BhZ2UgIVxuIik7CisJCSpzdWNjZXNzMSA9IDE7CisJCSpzdWNjZXNzMiA9IDE7CisJCXJldHVy bjsKKwl9CisKKwlpZiAoIVBhZ2VBbm9uKCprcGFnZSkgfHwgIVBhZ2VLc20oKmtwYWdlKSkKKwkJ Z290byBmYWlsZWQ7CisKKwlpZiAoIXRyeWxvY2tfcGFnZSh0cmVlX3BhZ2UpKQorCQlnb3RvIGZh aWxlZDsKKworCS8qIElmIHRoZSBvbGRwYWdlIGlzIHN0aWxsIGtzbSBhbmQgc3RpbGwgcG9pbnRl ZAorCSAqIHRvIGluIHRoZSByaWdodCBwbGFjZSwgYW5kIHN0aWxsIHdyaXRlIHByb3RlY3RlZCwK KwkgKiB3ZSBhcmUgY29uZmlkZW50IGl0J3Mgbm90IGNoYW5nZWQsIG5vIG5lZWQgdG8KKwkgKiBt ZW1jbXAgYW55bW9yZS4KKwkgKiBiZSB3YXJlLCB3ZSBjYW5ub3QgdGFrZSBuZXN0ZWQgcHRlIGxv Y2tzLAorCSAqIGRlYWRsb2NrIHJpc2suCisJICovCisJaWYgKCF0cnlfbWVyZ2Vfcm1hcF9pdGVt KGl0ZW0xLCAqa3BhZ2UsIHRyZWVfcGFnZSkpCisJCWdvdG8gdW5sb2NrX2ZhaWxlZDsKKworCS8q IG9rLCB0aGVuIHZtYTIsIHJlbWluZCB0aGF0IHB0ZTEgYWxyZWFkeSBzZXQgKi8KKwlpZiAoIXRy eV9tZXJnZV9ybWFwX2l0ZW0oaXRlbTIsICprcGFnZSwgdHJlZV9wYWdlKSkKKwkJZ290byBzdWNj ZXNzXzE7CisKKwkqc3VjY2VzczIgPSAxOworc3VjY2Vzc18xOgorCSpzdWNjZXNzMSA9IDE7CisK KworCWlmICgoKnN1Y2Nlc3MxICYmIHZtYTEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB8fAorCSAg ICAoKnN1Y2Nlc3MyICYmIHZtYTItPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSkgeworCQltdW5sb2Nr X3ZtYV9wYWdlKCprcGFnZSk7CisJCWlmICghUGFnZU1sb2NrZWQodHJlZV9wYWdlKSkKKwkJCW1s b2NrX3ZtYV9wYWdlKHRyZWVfcGFnZSk7CisJfQorCisJLyoKKwkgKiBXZSBkbyBub3QgbmVlZCBv bGRwYWdlIGFueSBtb3JlIGluIHRoZSBjYWxsZXIsIHNvIGNhbiBicmVhayB0aGUgbG9jaworCSAq IG5vdy4KKwkgKi8KKwl1bmxvY2tfcGFnZSgqa3BhZ2UpOworCSprcGFnZSA9IHRyZWVfcGFnZTsg LyogR2V0IHVubG9ja2VkIG91dHNpZGUuICovCisJcmV0dXJuOworCit1bmxvY2tfZmFpbGVkOgor CXVubG9ja19wYWdlKHRyZWVfcGFnZSk7CitmYWlsZWQ6CisJcmV0dXJuOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgc3RhYmxlX25vZGVfaGFzaF9tYXgoc3RydWN0IHN0YWJsZV9ub2RlICpub2Rl LAorCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBoYXNoKQoreworCXUzMiBoYXNoX21heCA9 IG5vZGUtPmhhc2hfbWF4OworCisJaWYgKCFoYXNoX21heCkgeworCQloYXNoX21heCA9IHBhZ2Vf aGFzaF9tYXgocGFnZSwgaGFzaCk7CisJCW5vZGUtPmhhc2hfbWF4ID0gaGFzaF9tYXg7CisJfQor fQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc3RhYmxlX25vZGUgKm5ld19zdGFibGVfbm9kZShz dHJ1Y3QgdHJlZV9ub2RlICp0cmVlX25vZGUsCisJCQkJICAgIHN0cnVjdCBwYWdlICprcGFnZSwg dTMyIGhhc2hfbWF4KQoreworCXN0cnVjdCBzdGFibGVfbm9kZSAqbmV3X3N0YWJsZV9ub2RlOwor CisJbmV3X3N0YWJsZV9ub2RlID0gYWxsb2Nfc3RhYmxlX25vZGUoKTsKKwlpZiAoIW5ld19zdGFi bGVfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXdfc3RhYmxlX25vZGUtPmtwZm4gPSBwYWdl X3RvX3BmbihrcGFnZSk7CisJbmV3X3N0YWJsZV9ub2RlLT5oYXNoX21heCA9IGhhc2hfbWF4Owor CW5ld19zdGFibGVfbm9kZS0+dHJlZV9ub2RlID0gdHJlZV9ub2RlOworCXNldF9wYWdlX3N0YWJs ZV9ub2RlKGtwYWdlLCBuZXdfc3RhYmxlX25vZGUpOworCisJcmV0dXJuIG5ld19zdGFibGVfbm9k ZTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHN0YWJsZV9ub2RlICpmaXJzdF9sZXZlbF9p bnNlcnQoc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2RlLAorCQkJCSAgICAgICBzdHJ1Y3Qgcm1h cF9pdGVtICpybWFwX2l0ZW0sCisJCQkJICAgICAgIHN0cnVjdCBybWFwX2l0ZW0gKnRyZWVfcm1h cF9pdGVtLAorCQkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLCB1MzIgaGFzaCwKKwkJCQkg ICAgICAgaW50ICpzdWNjZXNzMSwgaW50ICpzdWNjZXNzMikKK3sKKwlpbnQgY21wOworCXN0cnVj dCBwYWdlICp0cmVlX3BhZ2U7CisJdTMyIGhhc2hfbWF4ID0gMDsKKwlzdHJ1Y3Qgc3RhYmxlX25v ZGUgKnN0YWJsZV9ub2RlLCAqbmV3X3Nub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBO VUxMLCAqKm5ldzsKKworCS8qIHRoaXMgdHJlZSBub2RlIGNvbnRhaW5zIG5vIHN1Yi10cmVlIHll dCAqLworCXN0YWJsZV9ub2RlID0gcmJfZW50cnkodHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl LAorCQkJICAgICAgIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwl0cmVlX3BhZ2UgPSBn ZXRfdWtzbV9wYWdlKHN0YWJsZV9ub2RlLCAxLCAwKTsKKwlpZiAodHJlZV9wYWdlKSB7CisJCWNt cCA9IG1lbWNtcF9wYWdlcygqa3BhZ2UsIHRyZWVfcGFnZSwgMSk7CisJCWlmICghY21wKSB7CisJ CQl0cnlfbWVyZ2Vfd2l0aF9zdGFibGUocm1hcF9pdGVtLCB0cmVlX3JtYXBfaXRlbSwga3BhZ2Us CisJCQkJCSAgICAgIHRyZWVfcGFnZSwgc3VjY2VzczEsIHN1Y2Nlc3MyKTsKKwkJCXB1dF9wYWdl KHRyZWVfcGFnZSk7CisJCQlpZiAoISpzdWNjZXNzMSAmJiAhKnN1Y2Nlc3MyKQorCQkJCWdvdG8g ZmFpbGVkOworCisJCQlyZXR1cm4gc3RhYmxlX25vZGU7CisKKwkJfSBlbHNlIHsKKwkJCS8qCisJ CQkgKiBjb2xsaXNpb24gaW4gZmlyc3QgbGV2ZWwgdHJ5IHRvIGNyZWF0ZSBhIHN1YnRyZWUuCisJ CQkgKiBBIG5ldyBub2RlIG5lZWQgdG8gYmUgY3JlYXRlZC4KKwkJCSAqLworCQkJcHV0X3BhZ2Uo dHJlZV9wYWdlKTsKKworCQkJc3RhYmxlX25vZGVfaGFzaF9tYXgoc3RhYmxlX25vZGUsIHRyZWVf cGFnZSwKKwkJCQkJICAgICB0cmVlX25vZGUtPmhhc2gpOworCQkJaGFzaF9tYXggPSBybWFwX2l0 ZW1faGFzaF9tYXgocm1hcF9pdGVtLCBoYXNoKTsKKwkJCWNtcCA9IGhhc2hfY21wKGhhc2hfbWF4 LCBzdGFibGVfbm9kZS0+aGFzaF9tYXgpOworCisJCQlwYXJlbnQgPSAmc3RhYmxlX25vZGUtPm5v ZGU7CisJCQlpZiAoY21wIDwgMCkgeworCQkJCW5ldyA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQl9 IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJCX0g ZWxzZSB7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisJCX0KKworCX0gZWxzZSB7CisJCS8qIHRo ZSBvbmx5IHN0YWJsZV9ub2RlIGRlbGV0ZWQsIHdlIHJldXNlIGl0cyB0cmVlX25vZGUuCisJCSAq LworCQlwYXJlbnQgPSBOVUxMOworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl OworCX0KKworCW5ld19zbm9kZSA9IG5ld19zdGFibGVfbm9kZSh0cmVlX25vZGUsICprcGFnZSwg aGFzaF9tYXgpOworCWlmICghbmV3X3Nub2RlKQorCQlnb3RvIGZhaWxlZDsKKworCXJiX2xpbmtf bm9kZSgmbmV3X3Nub2RlLT5ub2RlLCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZu ZXdfc25vZGUtPm5vZGUsICZ0cmVlX25vZGUtPnN1Yl9yb290KTsKKwl0cmVlX25vZGUtPmNvdW50 Kys7CisJKnN1Y2Nlc3MxID0gKnN1Y2Nlc3MyID0gMTsKKworCXJldHVybiBuZXdfc25vZGU7CisK K2ZhaWxlZDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHN0YWJs ZV9ub2RlICpzdGFibGVfc3VidHJlZV9pbnNlcnQoc3RydWN0IHRyZWVfbm9kZSAqdHJlZV9ub2Rl LAorCQkJCQkgIHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkJICBzdHJ1Y3Qgcm1h cF9pdGVtICp0cmVlX3JtYXBfaXRlbSwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqKmtwYWdlLCB1MzIg aGFzaCwKKwkJCQkJICBpbnQgKnN1Y2Nlc3MxLCBpbnQgKnN1Y2Nlc3MyKQoreworCXN0cnVjdCBw YWdlICp0cmVlX3BhZ2U7CisJdTMyIGhhc2hfbWF4OworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3Rh YmxlX25vZGUsICpuZXdfc25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipuZXc7CisK K3Jlc2VhcmNoOgorCXBhcmVudCA9IE5VTEw7CisJbmV3ID0gJnRyZWVfbm9kZS0+c3ViX3Jvb3Qu cmJfbm9kZTsKKwlCVUdfT04oISpuZXcpOworCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hfbWF4 KHJtYXBfaXRlbSwgaGFzaCk7CisJd2hpbGUgKCpuZXcpIHsKKwkJaW50IGNtcDsKKworCQlzdGFi bGVfbm9kZSA9IHJiX2VudHJ5KCpuZXcsIHN0cnVjdCBzdGFibGVfbm9kZSwgbm9kZSk7CisKKwkJ Y21wID0gaGFzaF9jbXAoaGFzaF9tYXgsIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJaWYg KGNtcCA8IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcgPSAmcGFyZW50LT5yYl9sZWZ0 OworCQl9IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcgPSAm cGFyZW50LT5yYl9yaWdodDsKKwkJfSBlbHNlIHsKKwkJCXRyZWVfcGFnZSA9IGdldF91a3NtX3Bh Z2Uoc3RhYmxlX25vZGUsIDEsIDApOworCQkJaWYgKHRyZWVfcGFnZSkgeworCQkJCWNtcCA9IG1l bWNtcF9wYWdlcygqa3BhZ2UsIHRyZWVfcGFnZSwgMSk7CisJCQkJaWYgKCFjbXApIHsKKwkJCQkJ dHJ5X21lcmdlX3dpdGhfc3RhYmxlKHJtYXBfaXRlbSwKKwkJCQkJCXRyZWVfcm1hcF9pdGVtLCBr cGFnZSwKKwkJCQkJCXRyZWVfcGFnZSwgc3VjY2VzczEsIHN1Y2Nlc3MyKTsKKworCQkJCQlwdXRf cGFnZSh0cmVlX3BhZ2UpOworCQkJCQlpZiAoISpzdWNjZXNzMSAmJiAhKnN1Y2Nlc3MyKQorCQkJ CQkJZ290byBmYWlsZWQ7CisJCQkJCS8qCisJCQkJCSAqIHN1Y2Nlc3NmdWxseSBtZXJnZWQgd2l0 aCBhIHN0YWJsZQorCQkJCQkgKiBub2RlCisJCQkJCSAqLworCQkJCQlyZXR1cm4gc3RhYmxlX25v ZGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHV0X3BhZ2UodHJlZV9wYWdlKTsKKwkJCQkJZ290byBm YWlsZWQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIHN0YWJsZSBub2RlIG1h eSBiZSBkZWxldGVkLAorCQkJCSAqIGFuZCBzdWJ0cmVlIG1heWJlCisJCQkJICogcmVzdHJ1Y3Rl ZCwgY2Fubm90CisJCQkJICogY29udGludWUsIHJlc2VhcmNoIGl0LgorCQkJCSAqLworCQkJCWlm ICh0cmVlX25vZGUtPmNvdW50KSB7CisJCQkJCWdvdG8gcmVzZWFyY2g7CisJCQkJfSBlbHNlIHsK KwkJCQkJLyogcmV1c2UgdGhlIHRyZWUgbm9kZSovCisJCQkJCXBhcmVudCA9IE5VTEw7CisJCQkJ CW5ldyA9ICZ0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGU7CisJCQkJfQorCQkJfQorCQl9CisJ fQorCisJbmV3X3Nub2RlID0gbmV3X3N0YWJsZV9ub2RlKHRyZWVfbm9kZSwgKmtwYWdlLCBoYXNo X21heCk7CisJaWYgKCFuZXdfc25vZGUpCisJCWdvdG8gZmFpbGVkOworCisJcmJfbGlua19ub2Rl KCZuZXdfc25vZGUtPm5vZGUsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19z bm9kZS0+bm9kZSwgJnRyZWVfbm9kZS0+c3ViX3Jvb3QpOworCXRyZWVfbm9kZS0+Y291bnQrKzsK Kwkqc3VjY2VzczEgPSAqc3VjY2VzczIgPSAxOworCisJcmV0dXJuIG5ld19zbm9kZTsKKworZmFp bGVkOgorCXJldHVybiBOVUxMOworfQorCisKKy8qKgorICogc3RhYmxlX3RyZWVfaW5zZXJ0KCkg LSB0cnkgdG8gaW5zZXJ0IGEgbWVyZ2VkIHBhZ2UgaW4gdW5zdGFibGUgdHJlZSB0bworICogdGhl IHN0YWJsZSB0cmVlCisgKgorICogQGtwYWdlOgkJdGhlIHBhZ2UgbmVlZCB0byBiZSBpbnNlcnRl ZAorICogQGhhc2g6CQl0aGUgY3VycmVudCBoYXNoIG9mIHRoaXMgcGFnZQorICogQHJtYXBfaXRl bToJCXRoZSBybWFwX2l0ZW0gYmVpbmcgc2Nhbm5lZAorICogQHRyZWVfcm1hcF9pdGVtOgl0aGUg cm1hcF9pdGVtIGZvdW5kIG9uIHVuc3RhYmxlIHRyZWUKKyAqIEBzdWNjZXNzMToJCXJldHVybiBp ZiBybWFwX2l0ZW0gaXMgbWVyZ2VkCisgKiBAc3VjY2VzczI6CQlyZXR1cm4gaWYgdHJlZV9ybWFw X2l0ZW0gaXMgbWVyZ2VkCisgKgorICogQHJldHVybiAJCXRoZSBzdGFibGVfbm9kZSBvbiBzdGFi bGUgdHJlZSBpZiBhdCBsZWFzdCBvbmUKKyAqICAgICAgCQlybWFwX2l0ZW0gaXMgaW5zZXJ0ZWQg aW50byBzdGFibGUgdHJlZSwgTlVMTAorICogICAgICAJCW90aGVyd2lzZS4KKyAqLworc3RhdGlj IHN0cnVjdCBzdGFibGVfbm9kZSAqCitzdGFibGVfdHJlZV9pbnNlcnQoc3RydWN0IHBhZ2UgKipr cGFnZSwgdTMyIGhhc2gsCisJCSAgIHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJICAg c3RydWN0IHJtYXBfaXRlbSAqdHJlZV9ybWFwX2l0ZW0sCisJCSAgIGludCAqc3VjY2VzczEsIGlu dCAqc3VjY2VzczIpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmcm9vdF9zdGFibGVfdHJl ZXAtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHN0 YWJsZV9ub2RlICpzdGFibGVfbm9kZTsKKwlzdHJ1Y3QgdHJlZV9ub2RlICp0cmVlX25vZGU7CisJ dTMyIGhhc2hfbWF4ID0gMDsKKworCSpzdWNjZXNzMSA9ICpzdWNjZXNzMiA9IDA7CisKKwl3aGls ZSAoKm5ldykgeworCQlpbnQgY21wOworCisJCXRyZWVfbm9kZSA9IHJiX2VudHJ5KCpuZXcsIHN0 cnVjdCB0cmVlX25vZGUsIG5vZGUpOworCisJCWNtcCA9IGhhc2hfY21wKGhhc2gsIHRyZWVfbm9k ZS0+aGFzaCk7CisKKwkJaWYgKGNtcCA8IDApIHsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQluZXcg PSAmcGFyZW50LT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKGNtcCA+IDApIHsKKwkJCXBhcmVudCA9 ICpuZXc7CisJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJfSBlbHNlCisJCQlicmVhazsK Kwl9CisKKwlpZiAoKm5ldykgeworCQlpZiAodHJlZV9ub2RlLT5jb3VudCA9PSAxKSB7CisJCQlz dGFibGVfbm9kZSA9IGZpcnN0X2xldmVsX2luc2VydCh0cmVlX25vZGUsIHJtYXBfaXRlbSwKKwkJ CQkJCXRyZWVfcm1hcF9pdGVtLCBrcGFnZSwKKwkJCQkJCWhhc2gsIHN1Y2Nlc3MxLCBzdWNjZXNz Mik7CisJCX0gZWxzZSB7CisJCQlzdGFibGVfbm9kZSA9IHN0YWJsZV9zdWJ0cmVlX2luc2VydCh0 cmVlX25vZGUsCisJCQkJCXJtYXBfaXRlbSwgdHJlZV9ybWFwX2l0ZW0sIGtwYWdlLAorCQkJCQlo YXNoLCBzdWNjZXNzMSwgc3VjY2VzczIpOworCQl9CisJfSBlbHNlIHsKKworCQkvKiBubyB0cmVl IG5vZGUgZm91bmQgKi8KKwkJdHJlZV9ub2RlID0gYWxsb2NfdHJlZV9ub2RlKHN0YWJsZV90cmVl X25vZGVfbGlzdHApOworCQlpZiAoIXRyZWVfbm9kZSkgeworCQkJc3RhYmxlX25vZGUgPSBOVUxM OworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdGFibGVfbm9kZSA9IG5ld19zdGFibGVfbm9kZSh0 cmVlX25vZGUsICprcGFnZSwgaGFzaF9tYXgpOworCQlpZiAoIXN0YWJsZV9ub2RlKSB7CisJCQlm cmVlX3RyZWVfbm9kZSh0cmVlX25vZGUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl0cmVlX25v ZGUtPmhhc2ggPSBoYXNoOworCQlyYl9saW5rX25vZGUoJnRyZWVfbm9kZS0+bm9kZSwgcGFyZW50 LCBuZXcpOworCQlyYl9pbnNlcnRfY29sb3IoJnRyZWVfbm9kZS0+bm9kZSwgcm9vdF9zdGFibGVf dHJlZXApOworCQlwYXJlbnQgPSBOVUxMOworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5y Yl9ub2RlOworCisJCXJiX2xpbmtfbm9kZSgmc3RhYmxlX25vZGUtPm5vZGUsIHBhcmVudCwgbmV3 KTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZzdGFibGVfbm9kZS0+bm9kZSwgJnRyZWVfbm9kZS0+c3Vi X3Jvb3QpOworCQl0cmVlX25vZGUtPmNvdW50Kys7CisJCSpzdWNjZXNzMSA9ICpzdWNjZXNzMiA9 IDE7CisJfQorCitvdXQ6CisJcmV0dXJuIHN0YWJsZV9ub2RlOworfQorCisKKy8qKgorICogZ2V0 X3RyZWVfcm1hcF9pdGVtX3BhZ2UoKSAtIHRyeSB0byBnZXQgdGhlIHBhZ2UgYW5kIGxvY2sgdGhl IG1tYXBfc2VtCisgKgorICogQHJldHVybiAJMCBvbiBzdWNjZXNzLCAtRUJVU1kgaWYgdW5hYmxl IHRvIGxvY2sgdGhlIG1tYXBfc2VtLAorICogICAgICAgICAJLUVJTlZBTCBpZiB0aGUgcGFnZSBt YXBwaW5nIGhhcyBiZWVuIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF90cmVl X3JtYXBfaXRlbV9wYWdlKHN0cnVjdCBybWFwX2l0ZW0gKnRyZWVfcm1hcF9pdGVtKQoreworCWlu dCBlcnI7CisKKwllcnIgPSBnZXRfbWVyZ2VhYmxlX3BhZ2VfbG9ja19tbWFwKHRyZWVfcm1hcF9p dGVtKTsKKworCWlmIChlcnIgPT0gLUVJTlZBTCkgeworCQkvKiBpdHMgcGFnZSBtYXAgaGFzIGJl ZW4gY2hhbmdlZCwgcmVtb3ZlIGl0ICovCisJCXJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKHRy ZWVfcm1hcF9pdGVtKTsKKwl9CisKKwkvKiBUaGUgcGFnZSBpcyBnb3R0ZW4gYW5kIG1tYXBfc2Vt IGlzIGxvY2tlZCBub3cuICovCisJcmV0dXJuIGVycjsKK30KKworCisvKioKKyAqIHVuc3RhYmxl X3RyZWVfc2VhcmNoX2luc2VydCgpIC0gc2VhcmNoIGFuIHVuc3RhYmxlIHRyZWUgcm1hcF9pdGVt IHdpdGggdGhlCisgKiBzYW1lIGhhc2ggdmFsdWUuIEdldCBpdHMgcGFnZSBhbmQgdHJ5bG9jayB0 aGUgbW1hcF9zZW0KKyAqLworc3RhdGljIGlubGluZQorc3RydWN0IHJtYXBfaXRlbSAqdW5zdGFi bGVfdHJlZV9zZWFyY2hfaW5zZXJ0KHN0cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwKKwkJCQkJ ICAgICAgdTMyIGhhc2gpCisKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICZyb290X3Vuc3Rh YmxlX3RyZWUucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1 Y3QgdHJlZV9ub2RlICp0cmVlX25vZGU7CisJdTMyIGhhc2hfbWF4OworCXN0cnVjdCBybWFwX2l0 ZW0gKnRyZWVfcm1hcF9pdGVtOworCisJd2hpbGUgKCpuZXcpIHsKKwkJaW50IGNtcDsKKworCQl0 cmVlX25vZGUgPSByYl9lbnRyeSgqbmV3LCBzdHJ1Y3QgdHJlZV9ub2RlLCBub2RlKTsKKworCQlj bXAgPSBoYXNoX2NtcChoYXNoLCB0cmVlX25vZGUtPmhhc2gpOworCisJCWlmIChjbXAgPCAwKSB7 CisJCQlwYXJlbnQgPSAqbmV3OworCQkJbmV3ID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJfSBlbHNl IGlmIChjbXAgPiAwKSB7CisJCQlwYXJlbnQgPSAqbmV3OworCQkJbmV3ID0gJnBhcmVudC0+cmJf cmlnaHQ7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKCpuZXcpIHsKKwkJLyogZ290 IHRoZSB0cmVlX25vZGUgKi8KKwkJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkgeworCQkJdHJl ZV9ybWFwX2l0ZW0gPSByYl9lbnRyeSh0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGUsCisJCQkJ CQkgIHN0cnVjdCBybWFwX2l0ZW0sIG5vZGUpOworCQkJQlVHX09OKCF0cmVlX3JtYXBfaXRlbSk7 CisKKwkJCWdvdG8gZ2V0X3BhZ2Vfb3V0OworCQl9CisKKwkJLyogd2VsbCwgc2VhcmNoIHRoZSBj b2xsaXNpb24gc3VidHJlZSAqLworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2Rl OworCQlCVUdfT04oISpuZXcpOworCQloYXNoX21heCA9IHJtYXBfaXRlbV9oYXNoX21heChybWFw X2l0ZW0sIGhhc2gpOworCisJCXdoaWxlICgqbmV3KSB7CisJCQlpbnQgY21wOworCisJCQl0cmVl X3JtYXBfaXRlbSA9IHJiX2VudHJ5KCpuZXcsIHN0cnVjdCBybWFwX2l0ZW0sCisJCQkJCQkgIG5v ZGUpOworCisJCQljbXAgPSBoYXNoX2NtcChoYXNoX21heCwgdHJlZV9ybWFwX2l0ZW0tPmhhc2hf bWF4KTsKKwkJCXBhcmVudCA9ICpuZXc7CisJCQlpZiAoY21wIDwgMCkKKwkJCQluZXcgPSAmcGFy ZW50LT5yYl9sZWZ0OworCQkJZWxzZSBpZiAoY21wID4gMCkKKwkJCQluZXcgPSAmcGFyZW50LT5y Yl9yaWdodDsKKwkJCWVsc2UKKwkJCQlnb3RvIGdldF9wYWdlX291dDsKKwkJfQorCX0gZWxzZSB7 CisJCS8qIGFsbG9jIGEgbmV3IHRyZWVfbm9kZSAqLworCQl0cmVlX25vZGUgPSBhbGxvY190cmVl X25vZGUoJnVuc3RhYmxlX3RyZWVfbm9kZV9saXN0KTsKKwkJaWYgKCF0cmVlX25vZGUpCisJCQly ZXR1cm4gTlVMTDsKKworCQl0cmVlX25vZGUtPmhhc2ggPSBoYXNoOworCQlyYl9saW5rX25vZGUo JnRyZWVfbm9kZS0+bm9kZSwgcGFyZW50LCBuZXcpOworCQlyYl9pbnNlcnRfY29sb3IoJnRyZWVf bm9kZS0+bm9kZSwgJnJvb3RfdW5zdGFibGVfdHJlZSk7CisJCXBhcmVudCA9IE5VTEw7CisJCW5l dyA9ICZ0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGU7CisJfQorCisJLyogZGlkIG5vdCBmb3Vu ZCBldmVuIGluIHN1Yi10cmVlICovCisJcm1hcF9pdGVtLT50cmVlX25vZGUgPSB0cmVlX25vZGU7 CisJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFVOU1RBQkxFX0ZMQUc7CisJcm1hcF9pdGVtLT5oYXNo X3JvdW5kID0gdWtzbV9oYXNoX3JvdW5kOworCXJiX2xpbmtfbm9kZSgmcm1hcF9pdGVtLT5ub2Rl LCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZybWFwX2l0ZW0tPm5vZGUsICZ0cmVl X25vZGUtPnN1Yl9yb290KTsKKworCXVrc21fcGFnZXNfdW5zaGFyZWQrKzsKKwlyZXR1cm4gTlVM TDsKKworZ2V0X3BhZ2Vfb3V0OgorCWlmICh0cmVlX3JtYXBfaXRlbS0+cGFnZSA9PSBybWFwX2l0 ZW0tPnBhZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKGdldF90cmVlX3JtYXBfaXRlbV9wYWdl KHRyZWVfcm1hcF9pdGVtKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdHJlZV9ybWFwX2l0 ZW07Cit9CisKK3N0YXRpYyB2b2lkIGhvbGRfYW5vbl92bWEoc3RydWN0IHJtYXBfaXRlbSAqcm1h cF9pdGVtLAorCQkJICBzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQoreworCXJtYXBfaXRlbS0+ YW5vbl92bWEgPSBhbm9uX3ZtYTsKKwlnZXRfYW5vbl92bWEoYW5vbl92bWEpOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgaGxpc3RfYWRkX2FmdGVyKHN0cnVjdCBobGlzdF9ub2RlICpuLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dCkK K3sKKwluZXh0LT5uZXh0ID0gbi0+bmV4dDsKKwluLT5uZXh0ID0gbmV4dDsKKwluZXh0LT5wcHJl diA9ICZuLT5uZXh0OworCWlmKG5leHQtPm5leHQpCisJbmV4dC0+bmV4dC0+cHByZXYgID0gJm5l eHQtPm5leHQ7Cit9CisKKy8qKgorICogc3RhYmxlX3RyZWVfYXBwZW5kKCkgLSBhcHBlbmQgYSBy bWFwX2l0ZW0gdG8gYSBzdGFibGUgbm9kZS4gRGVkdXBsaWNhdGlvbgorICogcmF0aW8gc3RhdGlz dGljcyBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICovCitzdGF0aWMgdm9pZCBzdGFi bGVfdHJlZV9hcHBlbmQoc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtLAorCQkJICAgICAgIHN0 cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGUsIGludCBsb2dkZWR1cCkKK3sKKwlzdHJ1Y3Qg bm9kZV92bWEgKm5vZGVfdm1hID0gTlVMTCwgKm5ld19ub2RlX3ZtYSwgKm5vZGVfdm1hX2NvbnQg PSBOVUxMOworCXVuc2lnbmVkIGxvbmcga2V5ID0gKHVuc2lnbmVkIGxvbmcpcm1hcF9pdGVtLT5z bG90OworCXVuc2lnbmVkIGxvbmcgZmFjdG9yID0gcm1hcF9pdGVtLT5zbG90LT5ydW5nLT5zdGVw OworCisJQlVHX09OKCFzdGFibGVfbm9kZSk7CisJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFNUQUJM RV9GTEFHOworCisJaWYgKGhsaXN0X2VtcHR5KCZzdGFibGVfbm9kZS0+aGxpc3QpKSB7CisJCXVr c21fcGFnZXNfc2hhcmVkKys7CisJCWdvdG8gbm9kZV92bWFfbmV3OworCX0gZWxzZSB7CisJCXVr c21fcGFnZXNfc2hhcmluZysrOworCX0KKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGVfdm1h LCAmc3RhYmxlX25vZGUtPmhsaXN0LCBobGlzdCkgeworCQlpZiAobm9kZV92bWEtPmtleSA+PSBr ZXkpCisJCQlicmVhazsKKworCQlpZiAobG9nZGVkdXApIHsKKwkJCW5vZGVfdm1hLT5zbG90LT5w YWdlc19iZW1lcmdlZCArPSBmYWN0b3I7CisJCQlpZiAobGlzdF9lbXB0eSgmbm9kZV92bWEtPnNs b3QtPmRlZHVwX2xpc3QpKQorCQkJCWxpc3RfYWRkKCZub2RlX3ZtYS0+c2xvdC0+ZGVkdXBfbGlz dCwKKwkJCQkJICZ2bWFfc2xvdF9kZWR1cCk7CisJCX0KKwl9CisKKwlpZiAobm9kZV92bWEpIHsK KwkJaWYgKG5vZGVfdm1hLT5rZXkgPT0ga2V5KSB7CisJCQlub2RlX3ZtYV9jb250ID0gaGxpc3Rf ZW50cnlfc2FmZShub2RlX3ZtYS0+aGxpc3QubmV4dCwgc3RydWN0IG5vZGVfdm1hLCBobGlzdCk7 CisJCQlnb3RvIG5vZGVfdm1hX29rOworCQl9IGVsc2UgaWYgKG5vZGVfdm1hLT5rZXkgPiBrZXkp IHsKKwkJCW5vZGVfdm1hX2NvbnQgPSBub2RlX3ZtYTsKKwkJfQorCX0KKworbm9kZV92bWFfbmV3 OgorCS8qIG5vIHNhbWUgdm1hIGFscmVhZHkgaW4gbm9kZSwgYWxsb2MgYSBuZXcgbm9kZV92bWEg Ki8KKwluZXdfbm9kZV92bWEgPSBhbGxvY19ub2RlX3ZtYSgpOworCUJVR19PTighbmV3X25vZGVf dm1hKTsKKwluZXdfbm9kZV92bWEtPmhlYWQgPSBzdGFibGVfbm9kZTsKKwluZXdfbm9kZV92bWEt PnNsb3QgPSBybWFwX2l0ZW0tPnNsb3Q7CisKKwlpZiAoIW5vZGVfdm1hKSB7CisJCWhsaXN0X2Fk ZF9oZWFkKCZuZXdfbm9kZV92bWEtPmhsaXN0LCAmc3RhYmxlX25vZGUtPmhsaXN0KTsKKwl9IGVs c2UgaWYgKG5vZGVfdm1hLT5rZXkgIT0ga2V5KSB7CisJCWlmIChub2RlX3ZtYS0+a2V5IDwga2V5 KQorCQkJaGxpc3RfYWRkX2FmdGVyKCZub2RlX3ZtYS0+aGxpc3QsICZuZXdfbm9kZV92bWEtPmhs aXN0KTsKKwkJZWxzZSB7CisJCQlobGlzdF9hZGRfYmVmb3JlKCZuZXdfbm9kZV92bWEtPmhsaXN0 LAorCQkJCQkgJm5vZGVfdm1hLT5obGlzdCk7CisJCX0KKworCX0KKwlub2RlX3ZtYSA9IG5ld19u b2RlX3ZtYTsKKworbm9kZV92bWFfb2s6IC8qIG9rLCByZWFkeSB0byBhZGQgdG8gdGhlIGxpc3Qg Ki8KKwlybWFwX2l0ZW0tPmhlYWQgPSBub2RlX3ZtYTsKKwlobGlzdF9hZGRfaGVhZCgmcm1hcF9p dGVtLT5obGlzdCwgJm5vZGVfdm1hLT5ybWFwX2hsaXN0KTsKKwlob2xkX2Fub25fdm1hKHJtYXBf aXRlbSwgcm1hcF9pdGVtLT5zbG90LT52bWEtPmFub25fdm1hKTsKKwlpZiAobG9nZGVkdXApIHsK KwkJcm1hcF9pdGVtLT5zbG90LT5wYWdlc19tZXJnZWQrKzsKKwkJaWYgKG5vZGVfdm1hX2NvbnQp IHsKKwkJCW5vZGVfdm1hID0gbm9kZV92bWFfY29udDsKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5 X2NvbnRpbnVlKG5vZGVfdm1hLCBobGlzdCkgeworCQkJCW5vZGVfdm1hLT5zbG90LT5wYWdlc19i ZW1lcmdlZCArPSBmYWN0b3I7CisJCQkJaWYgKGxpc3RfZW1wdHkoJm5vZGVfdm1hLT5zbG90LT5k ZWR1cF9saXN0KSkKKwkJCQkJbGlzdF9hZGQoJm5vZGVfdm1hLT5zbG90LT5kZWR1cF9saXN0LAor CQkJCQkJICZ2bWFfc2xvdF9kZWR1cCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBXZSB1 c2UgYnJlYWtfa3NtIHRvIGJyZWFrIENPVyBvbiBhIGtzbSBwYWdlOiBpdCdzIGEgc3RyaXBwZWQg ZG93bgorICoKKyAqCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkciwgMSwgMSwg MSwgJnBhZ2UsIE5VTEwpID09IDEpCisgKgkJcHV0X3BhZ2UocGFnZSk7CisgKgorICogYnV0IHRh a2luZyBncmVhdCBjYXJlIG9ubHkgdG8gdG91Y2ggYSBrc20gcGFnZSwgaW4gYSBWTV9NRVJHRUFC TEUgdm1hLAorICogaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gaGFzIHVubWFwcGVkIGFuZCByZW1h cHBlZCBtbSxhZGRyIG1lYW53aGlsZS4KKyAqIENvdWxkIGEga3NtIHBhZ2UgYXBwZWFyIGFueXdo ZXJlIGVsc2U/ICBBY3R1YWxseSB5ZXMsIGluIGEgVk1fUEZOTUFQCisgKiBtbWFwIG9mIC9kZXYv bWVtIG9yIC9kZXYva21lbSwgd2hlcmUgd2Ugd291bGQgbm90IHdhbnQgdG8gdG91Y2ggaXQuCisg Ki8KK3N0YXRpYyBpbnQgYnJlYWtfa3NtKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNp Z25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldCA9IDA7CisK KwlkbyB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlwYWdlID0gZm9sbG93X3BhZ2Uodm1hLCBhZGRy LCBGT0xMX0dFVCk7CisJCWlmIChJU19FUlJfT1JfTlVMTChwYWdlKSkKKwkJCWJyZWFrOworCQlp ZiAoUGFnZUtzbShwYWdlKSkgeworCQkJcmV0ID0gaGFuZGxlX21tX2ZhdWx0KHZtYS0+dm1fbW0s IHZtYSwgYWRkciwKKwkJCQkJICAgICAgRkFVTFRfRkxBR19XUklURSk7CisJCX0gZWxzZQorCQkJ cmV0ID0gVk1fRkFVTFRfV1JJVEU7CisJCXB1dF9wYWdlKHBhZ2UpOworCX0gd2hpbGUgKCEocmV0 ICYgKFZNX0ZBVUxUX1dSSVRFIHwgVk1fRkFVTFRfU0lHQlVTIHwgVk1fRkFVTFRfT09NKSkpOwor CS8qCisJICogV2UgbXVzdCBsb29wIGJlY2F1c2UgaGFuZGxlX21tX2ZhdWx0KCkgbWF5IGJhY2sg b3V0IGlmIHRoZXJlJ3MKKwkgKiBhbnkgZGlmZmljdWx0eSBlLmcuIGlmIHB0ZSBhY2Nlc3NlZCBi aXQgZ2V0cyB1cGRhdGVkIGNvbmN1cnJlbnRseS4KKwkgKgorCSAqIFZNX0ZBVUxUX1dSSVRFIGlz IHdoYXQgd2UgaGF2ZSBiZWVuIGhvcGluZyBmb3I6IGl0IGluZGljYXRlcyB0aGF0CisJICogQ09X IGhhcyBiZWVuIGJyb2tlbiwgZXZlbiBpZiB0aGUgdm1hIGRvZXMgbm90IHBlcm1pdCBWTV9XUklU RTsKKwkgKiBidXQgbm90ZSB0aGF0IGEgY29uY3VycmVudCBmYXVsdCBtaWdodCBicmVhayBQYWdl S3NtIGZvciB1cy4KKwkgKgorCSAqIFZNX0ZBVUxUX1NJR0JVUyBjb3VsZCBvY2N1ciBpZiB3ZSBy YWNlIHdpdGggdHJ1bmNhdGlvbiBvZiB0aGUKKwkgKiBiYWNraW5nIGZpbGUsIHdoaWNoIGFsc28g aW52YWxpZGF0ZXMgYW5vbnltb3VzIHBhZ2VzOiB0aGF0J3MKKwkgKiBva2F5LCB0aGF0IHRydW5j YXRpb24gd2lsbCBoYXZlIHVubWFwcGVkIHRoZSBQYWdlS3NtIGZvciB1cy4KKwkgKgorCSAqIFZN X0ZBVUxUX09PTTogYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyAobGF0ZSBKdWx5IDIwMDkpLCBzZXR0 aW5nCisJICogYXNpZGUgbWVtX2Nncm91cCBsaW1pdHMsIFZNX0ZBVUxUX09PTSB3b3VsZCBvbmx5 IGJlIHNldCBpZiB0aGUKKwkgKiBjdXJyZW50IHRhc2sgaGFzIFRJRl9NRU1ESUUgc2V0LCBhbmQg d2lsbCBiZSBPT00ga2lsbGVkIG9uIHJldHVybgorCSAqIHRvIHVzZXI7IGFuZCBrc21kLCBoYXZp bmcgbm8gbW0sIHdvdWxkIG5ldmVyIGJlIGNob3NlbiBmb3IgdGhhdC4KKwkgKgorCSAqIEJ1dCBp ZiB0aGUgbW0gaXMgaW4gYSBsaW1pdGVkIG1lbV9jZ3JvdXAsIHRoZW4gdGhlIGZhdWx0IG1heSBm YWlsCisJICogd2l0aCBWTV9GQVVMVF9PT00gZXZlbiBpZiB0aGUgY3VycmVudCB0YXNrIGlzIG5v dCBUSUZfTUVNRElFOyBhbmQKKwkgKiBldmVuIGtzbWQgY2FuIGZhaWwgaW4gdGhpcyB3YXkgLSB0 aG91Z2ggaXQncyB1c3VhbGx5IGJyZWFraW5nIGtzbQorCSAqIGp1c3QgdG8gdW5kbyBhIG1lcmdl IGl0IG1hZGUgYSBtb21lbnQgYmVmb3JlLCBzbyB1bmxpa2VseSB0byBvb20uCisJICoKKwkgKiBU aGF0J3MgYSBwaXR5OiB3ZSBtaWdodCB0aGVyZWZvcmUgaGF2ZSBtb3JlIGtlcm5lbCBwYWdlcyBh bGxvY2F0ZWQKKwkgKiB0aGFuIHdlJ3JlIGNvdW50aW5nIGFzIG5vZGVzIGluIHRoZSBzdGFibGUg dHJlZTsgYnV0IHVrc21fZG9fc2NhbgorCSAqIHdpbGwgcmV0cnkgdG8gYnJlYWtfY293IG9uIGVh Y2ggcGFzcywgc28gc2hvdWxkIHJlY292ZXIgdGhlIHBhZ2UKKwkgKiBpbiBkdWUgY291cnNlLiAg VGhlIGltcG9ydGFudCB0aGluZyBpcyB0byBub3QgbGV0IFZNX01FUkdFQUJMRQorCSAqIGJlIGNs ZWFyZWQgd2hpbGUgYW55IHN1Y2ggcGFnZXMgbWlnaHQgcmVtYWluIGluIHRoZSBhcmVhLgorCSAq LworCXJldHVybiAocmV0ICYgVk1fRkFVTFRfT09NKSA/IC1FTk9NRU0gOiAwOworfQorCitzdGF0 aWMgdm9pZCBicmVha19jb3coc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtKQoreworCXN0cnVj dCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcm1hcF9pdGVtLT5zbG90LT52bWE7CisJc3RydWN0IG1t X3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9ybWFw X2FkZHIocm1hcF9pdGVtKTsKKworCWlmICh1a3NtX3Rlc3RfZXhpdChtbSkpCisJCWdvdG8gb3V0 OworCisJYnJlYWtfa3NtKHZtYSwgYWRkcik7CitvdXQ6CisJcmV0dXJuOworfQorCisvKgorICog VGhvdWdoIGl0J3MgdmVyeSB0ZW1wdGluZyB0byB1bm1lcmdlIGluX3N0YWJsZV90cmVlKHJtYXBf aXRlbSlzIHJhdGhlcgorICogdGhhbiBjaGVjayBldmVyeSBwdGUgb2YgYSBnaXZlbiB2bWEsIHRo ZSBsb2NraW5nIGRvZXNuJ3QgcXVpdGUgd29yayBmb3IKKyAqIHRoYXQgLSBhbiBybWFwX2l0ZW0g aXMgYXNzaWduZWQgdG8gdGhlIHN0YWJsZSB0cmVlIGFmdGVyIGluc2VydGluZyBrc20KKyAqIHBh Z2UgYW5kIHVwcGluZyBtbWFwX3NlbS4gIE5vciBkb2VzIGl0IGZpdCB3aXRoIHRoZSB3YXkgd2Ug c2tpcCBkdXAnaW5nCisgKiBybWFwX2l0ZW1zIGZyb20gcGFyZW50IHRvIGNoaWxkIGF0IGZvcmsg dGltZSAoc28gYXMgbm90IHRvIHdhc3RlIHRpbWUKKyAqIGlmIGV4aXQgY29tZXMgYmVmb3JlIHRo ZSBuZXh0IHNjYW4gcmVhY2hlcyBpdCkuCisgKgorICogU2ltaWxhcmx5LCBhbHRob3VnaCB3ZSdk IGxpa2UgdG8gcmVtb3ZlIHJtYXBfaXRlbXMgKHNvIHVwZGF0aW5nIGNvdW50cworICogYW5kIGZy ZWVpbmcgbWVtb3J5KSB3aGVuIHVubWVyZ2luZyBhbiBhcmVhLCBpdCdzIGVhc2llciB0byBsZWF2 ZSB0aGF0CisgKiB0byB0aGUgbmV4dCBwYXNzIG9mIGtzbWQgLSBjb25zaWRlciwgZm9yIGV4YW1w bGUsIGhvdyBrc21kIG1pZ2h0IGJlCisgKiBpbiBjbXBfYW5kX21lcmdlX3BhZ2Ugb24gb25lIG9m IHRoZSBybWFwX2l0ZW1zIHdlIHdvdWxkIGJlIHJlbW92aW5nLgorICovCitpbmxpbmUgaW50IHVu bWVyZ2VfdWtzbV9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgICAgdW5z aWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBh ZGRyOworCWludCBlcnIgPSAwOworCisJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQgJiYg IWVycjsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJaWYgKHVrc21fdGVzdF9leGl0KHZtYS0+dm1f bW0pKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWVyciA9 IC1FUkVTVEFSVFNZUzsKKwkJZWxzZQorCQkJZXJyID0gYnJlYWtfa3NtKHZtYSwgYWRkcik7CisJ fQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfdWtzbV9wYWdlc19z Y2FubmVkKHZvaWQpCit7CisJdTY0IGRlbHRhOworCisKKwlpZiAodWtzbV9wYWdlc19zY2FubmVk ID09IFU2NF9NQVgpIHsKKwkJZW5jb2RlX2JlbmVmaXQoKTsKKworCQlkZWx0YSA9IHVrc21fcGFn ZXNfc2Nhbm5lZCA+PiBwYWdlc19zY2FubmVkX2Jhc2U7CisKKwkJaWYgKENBTl9PVkVSRkxPV19V NjQocGFnZXNfc2Nhbm5lZF9zdG9yZWQsIGRlbHRhKSkgeworCQkJcGFnZXNfc2Nhbm5lZF9zdG9y ZWQgPj49IDE7CisJCQlkZWx0YSA+Pj0gMTsKKwkJCXBhZ2VzX3NjYW5uZWRfYmFzZSsrOworCQl9 CisKKwkJcGFnZXNfc2Nhbm5lZF9zdG9yZWQgKz0gZGVsdGE7CisKKwkJdWtzbV9wYWdlc19zY2Fu bmVkID0gdWtzbV9wYWdlc19zY2FubmVkX2xhc3QgPSAwOworCX0KKworCXVrc21fcGFnZXNfc2Nh bm5lZCsrOworfQorCitzdGF0aWMgaW5saW5lIGludCBmaW5kX3plcm9fcGFnZV9oYXNoKGludCBz dHJlbmd0aCwgdTMyIGhhc2gpCit7CisJcmV0dXJuICh6ZXJvX2hhc2hfdGFibGVbc3RyZW5ndGhd ID09IGhhc2gpOworfQorCitzdGF0aWMKK2ludCBjbXBfYW5kX21lcmdlX3plcm9fcGFnZShzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IHBh Z2UgKnplcm9fcGFnZSA9IGVtcHR5X3Vrc21femVyb19wYWdlOworCXN0cnVjdCBtbV9zdHJ1Y3Qg Km1tID0gdm1hLT52bV9tbTsKKwlwdGVfdCBvcmlnX3B0ZSA9IF9fcHRlKDApOworCWludCBlcnIg PSAtRUZBVUxUOworCisJaWYgKHVrc21fdGVzdF9leGl0KG1tKSkKKwkJZ290byBvdXQ7CisKKwlp ZiAoUGFnZVRyYW5zQ29tcG91bmQocGFnZSkgJiYgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3Nw bGl0KHBhZ2UpKQorCQlnb3RvIG91dDsKKwlCVUdfT04oUGFnZVRyYW5zQ29tcG91bmQocGFnZSkp OworCisJaWYgKCFQYWdlQW5vbihwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXRyeWxvY2tf cGFnZShwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAod3JpdGVfcHJvdGVjdF9wYWdlKHZtYSwg cGFnZSwgJm9yaWdfcHRlLCAwKSA9PSAwKSB7CisJCWlmIChpc19wYWdlX2Z1bGxfemVybyhwYWdl KSkKKwkJCWVyciA9IHJlcGxhY2VfcGFnZSh2bWEsIHBhZ2UsIHplcm9fcGFnZSwgb3JpZ19wdGUp OworCX0KKworCXVubG9ja19wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8q CisgKiBjbXBfYW5kX21lcmdlX3BhZ2UoKSAtIGZpcnN0IHNlZSBpZiBwYWdlIGNhbiBiZSBtZXJn ZWQgaW50byB0aGUgc3RhYmxlCisgKiB0cmVlOyBpZiBub3QsIGNvbXBhcmUgaGFzaCB0byBwcmV2 aW91cyBhbmQgaWYgaXQncyB0aGUgc2FtZSwgc2VlIGlmIHBhZ2UKKyAqIGNhbiBiZSBpbnNlcnRl ZCBpbnRvIHRoZSB1bnN0YWJsZSB0cmVlLCBvciBtZXJnZWQgd2l0aCBhIHBhZ2UgYWxyZWFkeSB0 aGVyZQorICogYW5kIGJvdGggdHJhbnNmZXJyZWQgdG8gdGhlIHN0YWJsZSB0cmVlLgorICoKKyAq IEBwYWdlOiB0aGUgcGFnZSB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgaWRlbnRpY2FsIHBhZ2UgdG8u CisgKiBAcm1hcF9pdGVtOiB0aGUgcmV2ZXJzZSBtYXBwaW5nIGludG8gdGhlIHZpcnR1YWwgYWRk cmVzcyBvZiB0aGlzIHBhZ2UKKyAqLworc3RhdGljIHZvaWQgY21wX2FuZF9tZXJnZV9wYWdlKHN0 cnVjdCBybWFwX2l0ZW0gKnJtYXBfaXRlbSwgdTMyIGhhc2gpCit7CisJc3RydWN0IHJtYXBfaXRl bSAqdHJlZV9ybWFwX2l0ZW07CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKmtw YWdlID0gTlVMTDsKKwl1MzIgaGFzaF9tYXg7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgc3Vj Y2VzczEsIHN1Y2Nlc3MyOworCXN0cnVjdCBzdGFibGVfbm9kZSAqc25vZGU7CisJaW50IGNtcDsK KwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTCwgKipuZXc7CisKKwlyZW1vdmVfcm1hcF9p dGVtX2Zyb21fdHJlZShybWFwX2l0ZW0pOworCXBhZ2UgPSBybWFwX2l0ZW0tPnBhZ2U7CisKKwkv KiBXZSBmaXJzdCBzdGFydCB3aXRoIHNlYXJjaGluZyB0aGUgcGFnZSBpbnNpZGUgdGhlIHN0YWJs ZSB0cmVlICovCisJa3BhZ2UgPSBzdGFibGVfdHJlZV9zZWFyY2gocm1hcF9pdGVtLCBoYXNoKTsK KwlpZiAoa3BhZ2UpIHsKKwkJZXJyID0gdHJ5X3RvX21lcmdlX3dpdGhfdWtzbV9wYWdlKHJtYXBf aXRlbSwga3BhZ2UsCisJCQkJCQkgaGFzaCk7CisJCWlmICghZXJyKSB7CisJCQkvKgorCQkJICog VGhlIHBhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBtZXJnZWQsIGFkZAorCQkJICogaXRzIHJtYXBfaXRl bSB0byB0aGUgc3RhYmxlIHRyZWUuCisJCQkgKiBwYWdlIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2Ug aXQncworCQkJICogcmFjaW5nIHdpdGggdHJ5X3RvX3VubWFwX2tzbSgpLCBldGMuCisJCQkgKi8K KwkJCWxvY2tfcGFnZShrcGFnZSk7CisJCQlzbm9kZSA9IHBhZ2Vfc3RhYmxlX25vZGUoa3BhZ2Up OworCQkJc3RhYmxlX3RyZWVfYXBwZW5kKHJtYXBfaXRlbSwgc25vZGUsIDEpOworCQkJdW5sb2Nr X3BhZ2Uoa3BhZ2UpOworCQkJcHV0X3BhZ2Uoa3BhZ2UpOworCQkJcmV0dXJuOyAvKiBzdWNjZXNz ICovCisJCX0KKwkJcHV0X3BhZ2Uoa3BhZ2UpOworCisJCS8qCisJCSAqIGlmIGl0J3MgYSBjb2xs aXNpb24gYW5kIGl0IGhhcyBiZWVuIHNlYXJjaCBpbiBzdWItcmJ0cmVlCisJCSAqIChoYXNoX21h eCAhPSAwKSwgd2Ugd2FudCB0byBhYm9ydCwgYmVjYXVzZSBpZiBpdCBpcworCQkgKiBzdWNjZXNz ZnVsbHkgbWVyZ2VkIGluIHVuc3RhYmxlIHRyZWUsIHRoZSBjb2xsaXNpb24gdHJlbmRzIHRvCisJ CSAqIGhhcHBlbiBhZ2Fpbi4KKwkJICovCisJCWlmIChlcnIgPT0gTUVSR0VfRVJSX0NPTExJICYm IHJtYXBfaXRlbS0+aGFzaF9tYXgpCisJCQlyZXR1cm47CisJfQorCisJdHJlZV9ybWFwX2l0ZW0g PQorCQl1bnN0YWJsZV90cmVlX3NlYXJjaF9pbnNlcnQocm1hcF9pdGVtLCBoYXNoKTsKKwlpZiAo dHJlZV9ybWFwX2l0ZW0pIHsKKwkJZXJyID0gdHJ5X3RvX21lcmdlX3R3b19wYWdlcyhybWFwX2l0 ZW0sIHRyZWVfcm1hcF9pdGVtLCBoYXNoKTsKKwkJLyoKKwkJICogQXMgc29vbiBhcyB3ZSBtZXJn ZSB0aGlzIHBhZ2UsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZQorCQkgKiBybWFwX2l0ZW0gb2YgdGhl IHBhZ2Ugd2UgaGF2ZSBtZXJnZWQgd2l0aCBmcm9tIHRoZSB1bnN0YWJsZQorCQkgKiB0cmVlLCBh bmQgaW5zZXJ0IGl0IGluc3RlYWQgYXMgbmV3IG5vZGUgaW4gdGhlIHN0YWJsZSB0cmVlLgorCQkg Ki8KKwkJaWYgKCFlcnIpIHsKKwkJCWtwYWdlID0gcGFnZTsKKwkJCXJlbW92ZV9ybWFwX2l0ZW1f ZnJvbV90cmVlKHRyZWVfcm1hcF9pdGVtKTsKKwkJCWxvY2tfcGFnZShrcGFnZSk7CisJCQlzbm9k ZSA9IHN0YWJsZV90cmVlX2luc2VydCgma3BhZ2UsIGhhc2gsCisJCQkJCQkgICBybWFwX2l0ZW0s IHRyZWVfcm1hcF9pdGVtLAorCQkJCQkJICAgJnN1Y2Nlc3MxLCAmc3VjY2VzczIpOworCisJCQkv KgorCQkJICogRG8gbm90IGxvZyBkZWR1cCBmb3IgdHJlZSBpdGVtLCBpdCdzIG5vdCBjb3VudGVk IGFzCisJCQkgKiBzY2FubmVkIGluIHRoaXMgcm91bmQuCisJCQkgKi8KKwkJCWlmIChzdWNjZXNz MikKKwkJCQlzdGFibGVfdHJlZV9hcHBlbmQodHJlZV9ybWFwX2l0ZW0sIHNub2RlLCAwKTsKKwor CQkJLyoKKwkJCSAqIFRoZSBvcmRlciBvZiB0aGVzZSB0d28gc3RhYmxlIGFwcGVuZCBpcyBpbXBv cnRhbnQ6CisJCQkgKiB3ZSBhcmUgc2Nhbm5pbmcgcm1hcF9pdGVtLgorCQkJICovCisJCQlpZiAo c3VjY2VzczEpCisJCQkJc3RhYmxlX3RyZWVfYXBwZW5kKHJtYXBfaXRlbSwgc25vZGUsIDEpOwor CisJCQkvKgorCQkJICogVGhlIG9yaWdpbmFsIGtwYWdlIG1heSBiZSB1bmxvY2tlZCBpbnNpZGUK KwkJCSAqIHN0YWJsZV90cmVlX2luc2VydCgpIGFscmVhZHkuIFRoaXMgcGFnZQorCQkJICogc2hv dWxkIGJlIHVubG9ja2VkIGJlZm9yZSBkb2luZworCQkJICogYnJlYWtfY293KCkuCisJCQkgKi8K KwkJCXVubG9ja19wYWdlKGtwYWdlKTsKKworCQkJaWYgKCFzdWNjZXNzMSkKKwkJCQlicmVha19j b3cocm1hcF9pdGVtKTsKKworCQkJaWYgKCFzdWNjZXNzMikKKwkJCQlicmVha19jb3codHJlZV9y bWFwX2l0ZW0pOworCisJCX0gZWxzZSBpZiAoZXJyID09IE1FUkdFX0VSUl9DT0xMSSkgeworCQkJ QlVHX09OKHRyZWVfcm1hcF9pdGVtLT50cmVlX25vZGUtPmNvdW50ID4gMSk7CisKKwkJCXJtYXBf aXRlbV9oYXNoX21heCh0cmVlX3JtYXBfaXRlbSwKKwkJCQkJICAgdHJlZV9ybWFwX2l0ZW0tPnRy ZWVfbm9kZS0+aGFzaCk7CisKKwkJCWhhc2hfbWF4ID0gcm1hcF9pdGVtX2hhc2hfbWF4KHJtYXBf aXRlbSwgaGFzaCk7CisJCQljbXAgPSBoYXNoX2NtcChoYXNoX21heCwgdHJlZV9ybWFwX2l0ZW0t Pmhhc2hfbWF4KTsKKwkJCXBhcmVudCA9ICZ0cmVlX3JtYXBfaXRlbS0+bm9kZTsKKwkJCWlmIChj bXAgPCAwKQorCQkJCW5ldyA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQllbHNlIGlmIChjbXAgPiAw KQorCQkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQkJZWxzZQorCQkJCWdvdG8gcHV0X3Vw X291dDsKKworCQkJcm1hcF9pdGVtLT50cmVlX25vZGUgPSB0cmVlX3JtYXBfaXRlbS0+dHJlZV9u b2RlOworCQkJcm1hcF9pdGVtLT5hZGRyZXNzIHw9IFVOU1RBQkxFX0ZMQUc7CisJCQlybWFwX2l0 ZW0tPmhhc2hfcm91bmQgPSB1a3NtX2hhc2hfcm91bmQ7CisJCQlyYl9saW5rX25vZGUoJnJtYXBf aXRlbS0+bm9kZSwgcGFyZW50LCBuZXcpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZybWFwX2l0ZW0t Pm5vZGUsCisJCQkJCSZ0cmVlX3JtYXBfaXRlbS0+dHJlZV9ub2RlLT5zdWJfcm9vdCk7CisJCQly bWFwX2l0ZW0tPnRyZWVfbm9kZS0+Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBl aXRoZXIgb25lIG9mIHRoZSBwYWdlIGhhcyBjaGFuZ2VkIG9yIHRoZXkgY29sbGlkZQorCQkJICog YXQgdGhlIG1heCBoYXNoLCB3ZSBjb25zaWRlciB0aGVtIGFzIGlsbCBpdGVtcy4KKwkJCSAqLwor CQkJcmVtb3ZlX3JtYXBfaXRlbV9mcm9tX3RyZWUodHJlZV9ybWFwX2l0ZW0pOworCQl9CitwdXRf dXBfb3V0OgorCQlwdXRfcGFnZSh0cmVlX3JtYXBfaXRlbS0+cGFnZSk7CisJCXVwX3JlYWQoJnRy ZWVfcm1hcF9pdGVtLT5zbG90LT52bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJfQorfQorCisKKwor CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3Bvb2xfaW5kZXgoc3RydWN0IHZtYV9z bG90ICpzbG90LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxv bmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXggPSAoc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3Rf ZW50cnkgKikgKiBpbmRleCkgPj4gUEFHRV9TSElGVDsKKwlpZiAocG9vbF9pbmRleCA+PSBzbG90 LT5wb29sX3NpemUpCisJCUJVRygpOworCXJldHVybiBwb29sX2luZGV4OworfQorCitzdGF0aWMg aW5saW5lIHVuc2lnbmVkIGxvbmcgaW5kZXhfcGFnZV9vZmZzZXQodW5zaWduZWQgbG9uZyBpbmRl eCkKK3sKKwlyZXR1cm4gb2Zmc2V0X2luX3BhZ2Uoc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3RfZW50 cnkgKikgKiBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBybWFwX2xpc3RfZW50 cnkgKmdldF9ybWFwX2xpc3RfZW50cnkoc3RydWN0IHZtYV9zbG90ICpzbG90LAorCQkJCQkgICAg dW5zaWduZWQgbG9uZyBpbmRleCwgaW50IG5lZWRfYWxsb2MpCit7CisJdW5zaWduZWQgbG9uZyBw b29sX2luZGV4OworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKmFkZHI7CisKKworCXBvb2xf aW5kZXggPSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJaWYgKCFzbG90LT5ybWFwX2xp c3RfcG9vbFtwb29sX2luZGV4XSkgeworCQlpZiAoIW5lZWRfYWxsb2MpCisJCQlyZXR1cm4gTlVM TDsKKworCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyB8IF9fR0ZQ X05PV0FSTik7CisJCWlmICghcGFnZSkKKwkJCXJldHVybiBOVUxMOworCisJCXNsb3QtPnJtYXBf bGlzdF9wb29sW3Bvb2xfaW5kZXhdID0gcGFnZTsKKwl9CisKKwlhZGRyID0ga21hcChzbG90LT5y bWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSk7CisJYWRkciArPSBpbmRleF9wYWdlX29mZnNldChp bmRleCk7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9ybWFw X2xpc3RfZW50cnkoc3RydWN0IHZtYV9zbG90ICpzbG90LAorCQkJCSAgICAgICB1bnNpZ25lZCBs b25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXgg PSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJQlVHX09OKCFzbG90LT5ybWFwX2xpc3Rf cG9vbFtwb29sX2luZGV4XSk7CisJa3VubWFwKHNsb3QtPnJtYXBfbGlzdF9wb29sW3Bvb2xfaW5k ZXhdKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW50cnlfaXNfbmV3KHN0cnVjdCBybWFwX2xp c3RfZW50cnkgKmVudHJ5KQoreworCXJldHVybiAhZW50cnktPml0ZW07Cit9CisKK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfaW5kZXhfb3JpZ19hZGRyKHN0cnVjdCB2bWFfc2xvdCAq c2xvdCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJcmV0dXJuIHNsb3QtPnZtYS0+ dm1fc3RhcnQgKyAoaW5kZXggPDwgUEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBnZXRfZW50cnlfYWRkcmVzcyhzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5ICplbnRy eSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoaXNfYWRkcihlbnRyeS0+YWRkcikp CisJCWFkZHIgPSBnZXRfY2xlYW5fYWRkcihlbnRyeS0+YWRkcik7CisJZWxzZSBpZiAoZW50cnkt Pml0ZW0pCisJCWFkZHIgPSBnZXRfcm1hcF9hZGRyKGVudHJ5LT5pdGVtKTsKKwllbHNlCisJCUJV RygpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJtYXBfaXRl bSAqZ2V0X2VudHJ5X2l0ZW0oc3RydWN0IHJtYXBfbGlzdF9lbnRyeSAqZW50cnkpCit7CisJaWYg KGlzX2FkZHIoZW50cnktPmFkZHIpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyeS0+ aXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluY19ybWFwX2xpc3RfcG9vbF9jb3VudChz dHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGluZGV4KQorewor CXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRleDsKKworCXBvb2xfaW5kZXggPSBnZXRfcG9vbF9pbmRl eChzbG90LCBpbmRleCk7CisJQlVHX09OKCFzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4 XSk7CisJc2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0rKzsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIGRlY19ybWFwX2xpc3RfcG9vbF9jb3VudChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsCisJ CQkJCSAgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgcG9vbF9pbmRl eDsKKworCXBvb2xfaW5kZXggPSBnZXRfcG9vbF9pbmRleChzbG90LCBpbmRleCk7CisJQlVHX09O KCFzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSk7CisJQlVHX09OKCFzbG90LT5wb29s X2NvdW50c1twb29sX2luZGV4XSk7CisJc2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0tLTsK K30KKworc3RhdGljIGlubGluZSBpbnQgZW50cnlfaGFzX3JtYXAoc3RydWN0IHJtYXBfbGlzdF9l bnRyeSAqZW50cnkpCit7CisJcmV0dXJuICFpc19hZGRyKGVudHJ5LT5hZGRyKSAmJiBlbnRyeS0+ aXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXBfZW50cmllcyhzdHJ1Y3Qgcm1hcF9s aXN0X2VudHJ5ICplbnRyeTEsCisJCQkJdW5zaWduZWQgbG9uZyBpbmRleDEsCisJCQkJc3RydWN0 IHJtYXBfbGlzdF9lbnRyeSAqZW50cnkyLAorCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgyKQorewor CXN0cnVjdCBybWFwX2xpc3RfZW50cnkgdG1wOworCisJLyogc3dhcHBpbmcgdHdvIG5ldyBlbnRy aWVzIGlzIG1lYW5pbmdsZXNzICovCisJQlVHX09OKGVudHJ5X2lzX25ldyhlbnRyeTEpICYmIGVu dHJ5X2lzX25ldyhlbnRyeTIpKTsKKworCXRtcCA9ICplbnRyeTE7CisJKmVudHJ5MSA9ICplbnRy eTI7CisJKmVudHJ5MiA9IHRtcDsKKworCWlmIChlbnRyeV9oYXNfcm1hcChlbnRyeTEpKQorCQll bnRyeTEtPml0ZW0tPmVudHJ5X2luZGV4ID0gaW5kZXgxOworCisJaWYgKGVudHJ5X2hhc19ybWFw KGVudHJ5MikpCisJCWVudHJ5Mi0+aXRlbS0+ZW50cnlfaW5kZXggPSBpbmRleDI7CisKKwlpZiAo ZW50cnlfaGFzX3JtYXAoZW50cnkxKSAmJiAhZW50cnlfaGFzX3JtYXAoZW50cnkyKSkgeworCQlp bmNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkxLT5pdGVtLT5zbG90LCBpbmRleDEpOworCQlk ZWNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkxLT5pdGVtLT5zbG90LCBpbmRleDIpOworCX0g ZWxzZSBpZiAoIWVudHJ5X2hhc19ybWFwKGVudHJ5MSkgJiYgZW50cnlfaGFzX3JtYXAoZW50cnky KSkgeworCQlpbmNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkyLT5pdGVtLT5zbG90LCBpbmRl eDIpOworCQlkZWNfcm1hcF9saXN0X3Bvb2xfY291bnQoZW50cnkyLT5pdGVtLT5zbG90LCBpbmRl eDEpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZW50cnlfaXRlbShzdHJ1Y3Qg cm1hcF9saXN0X2VudHJ5ICplbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVj dCBybWFwX2l0ZW0gKml0ZW07CisKKwlpZiAoIWlzX2FkZHIoZW50cnktPmFkZHIpKSB7CisJCUJV R19PTighZW50cnktPml0ZW0pOworCQlpdGVtID0gZW50cnktPml0ZW07CisJCWVudHJ5LT5hZGRy ID0gZ2V0X3JtYXBfYWRkcihpdGVtKTsKKwkJc2V0X2lzX2FkZHIoZW50cnktPmFkZHIpOworCQlp bmRleCA9IGl0ZW0tPmVudHJ5X2luZGV4OworCQlyZW1vdmVfcm1hcF9pdGVtX2Zyb21fdHJlZShp dGVtKTsKKwkJZGVjX3JtYXBfbGlzdF9wb29sX2NvdW50KGl0ZW0tPnNsb3QsIGluZGV4KTsKKwkJ ZnJlZV9ybWFwX2l0ZW0oaXRlbSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBwb29sX2Vu dHJ5X2JvdW5kYXJ5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBsaW5l YXJfYWRkcjsKKworCWxpbmVhcl9hZGRyID0gc2l6ZW9mKHN0cnVjdCBybWFwX2xpc3RfZW50cnkg KikgKiBpbmRleDsKKwlyZXR1cm4gaW5kZXggJiYgIW9mZnNldF9pbl9wYWdlKGxpbmVhcl9hZGRy KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyeV9mcmVlX2xhc3RfcG9vbChzdHJ1Y3Qgdm1h X3Nsb3QgKnNsb3QsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwl1bnNpZ25l ZCBsb25nIHBvb2xfaW5kZXg7CisKKwlwb29sX2luZGV4ID0gZ2V0X3Bvb2xfaW5kZXgoc2xvdCwg aW5kZXgpOworCWlmIChzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2luZGV4XSAmJgorCSAgICAh c2xvdC0+cG9vbF9jb3VudHNbcG9vbF9pbmRleF0pIHsKKwkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1h cF9saXN0X3Bvb2xbcG9vbF9pbmRleF0pOworCQlzbG90LT5ybWFwX2xpc3RfcG9vbFtwb29sX2lu ZGV4XSA9IE5VTEw7CisJCXNsb3QtPmZsYWdzIHw9IFVLU01fU0xPVF9ORUVEX1NPUlQ7CisJfQor Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2bWFfaXRlbV9pbmRleChzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJICAgc3RydWN0IHJtYXBfaXRlbSAqaXRlbSkKK3sK KwlyZXR1cm4gKGdldF9ybWFwX2FkZHIoaXRlbSkgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NI SUZUOworfQorCitzdGF0aWMgaW50IHdpdGhpbl9zYW1lX3Bvb2woc3RydWN0IHZtYV9zbG90ICpz bG90LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaSwgdW5zaWduZWQgbG9uZyBqKQoreworCXVuc2ln bmVkIGxvbmcgcG9vbF9pLCBwb29sX2o7CisKKwlwb29sX2kgPSBnZXRfcG9vbF9pbmRleChzbG90 LCBpKTsKKwlwb29sX2ogPSBnZXRfcG9vbF9pbmRleChzbG90LCBqKTsKKworCXJldHVybiAocG9v bF9pID09IHBvb2xfaik7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcm1hcF9lbnRyeV9saXN0KHN0 cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1bnNpZ25lZCBsb25nIGksIGo7CisJc3RydWN0IHJt YXBfbGlzdF9lbnRyeSAqZW50cnksICpzd2FwX2VudHJ5OworCisJZW50cnkgPSBnZXRfcm1hcF9s aXN0X2VudHJ5KHNsb3QsIDAsIDApOworCWZvciAoaSA9IDA7IGkgPCBzbG90LT5wYWdlczsgKSB7 CisKKwkJaWYgKCFlbnRyeSkKKwkJCWdvdG8gc2tpcF93aG9sZV9wb29sOworCisJCWlmIChlbnRy eV9pc19uZXcoZW50cnkpKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChpc19hZGRyKGVu dHJ5LT5hZGRyKSkgeworCQkJZW50cnktPmFkZHIgPSAwOworCQkJZ290byBuZXh0X2VudHJ5Owor CQl9CisKKwkJaiA9IHZtYV9pdGVtX2luZGV4KHNsb3QtPnZtYSwgZW50cnktPml0ZW0pOworCQlp ZiAoaiA9PSBpKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmICh3aXRoaW5fc2FtZV9wb29s KHNsb3QsIGksIGopKQorCQkJc3dhcF9lbnRyeSA9IGVudHJ5ICsgaiAtIGk7CisJCWVsc2UKKwkJ CXN3YXBfZW50cnkgPSBnZXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIGosIDEpOworCisJCXN3YXBf ZW50cmllcyhlbnRyeSwgaSwgc3dhcF9lbnRyeSwgaik7CisJCWlmICghd2l0aGluX3NhbWVfcG9v bChzbG90LCBpLCBqKSkKKwkJCXB1dF9ybWFwX2xpc3RfZW50cnkoc2xvdCwgaik7CisJCWNvbnRp bnVlOworCitza2lwX3dob2xlX3Bvb2w6CisJCWkgKz0gUEFHRV9TSVpFIC8gc2l6ZW9mKCplbnRy eSk7CisJCWlmIChpIDwgc2xvdC0+cGFnZXMpCisJCQllbnRyeSA9IGdldF9ybWFwX2xpc3RfZW50 cnkoc2xvdCwgaSwgMCk7CisJCWNvbnRpbnVlOworCituZXh0X2VudHJ5OgorCQlpZiAoaSA+PSBz bG90LT5wYWdlcyAtIDEgfHwKKwkJICAgICF3aXRoaW5fc2FtZV9wb29sKHNsb3QsIGksIGkgKyAx KSkgeworCQkJcHV0X3JtYXBfbGlzdF9lbnRyeShzbG90LCBpKTsKKwkJCWlmIChpICsgMSA8IHNs b3QtPnBhZ2VzKQorCQkJCWVudHJ5ID0gZ2V0X3JtYXBfbGlzdF9lbnRyeShzbG90LCBpICsgMSwg MCk7CisJCX0gZWxzZQorCQkJZW50cnkrKzsKKwkJaSsrOworCQljb250aW51ZTsKKwl9CisKKwkv KiBmcmVlIGVtcHR5IHBvb2wgZW50cmllcyB3aGljaCBjb250YWluIG5vIHJtYXBfaXRlbSAqLwor CS8qIENBTiBiZSBzaW1wbGllZCB0byBiYXNlZCBvbiBvbmx5IHBvb2xfY291bnRzIHdoZW4gYnVn IGZyZWVkICEhISEhICovCisJZm9yIChpID0gMDsgaSA8IHNsb3QtPnBvb2xfc2l6ZTsgaSsrKSB7 CisJCXVuc2lnbmVkIGNoYXIgaGFzX3JtYXA7CisJCXZvaWQgKmFkZHI7CisKKwkJaWYgKCFzbG90 LT5ybWFwX2xpc3RfcG9vbFtpXSkKKwkJCWNvbnRpbnVlOworCisJCWhhc19ybWFwID0gMDsKKwkJ YWRkciA9IGttYXAoc2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0pOworCQlCVUdfT04oIWFkZHIpOwor CQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKCplbnRyeSk7IGorKykgeworCQkJ ZW50cnkgPSAoc3RydWN0IHJtYXBfbGlzdF9lbnRyeSAqKWFkZHIgKyBqOworCQkJaWYgKGlzX2Fk ZHIoZW50cnktPmFkZHIpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFlbnRyeS0+aXRlbSkKKwkJ CQljb250aW51ZTsKKwkJCWhhc19ybWFwID0gMTsKKwkJfQorCQlrdW5tYXAoc2xvdC0+cm1hcF9s aXN0X3Bvb2xbaV0pOworCQlpZiAoIWhhc19ybWFwKSB7CisJCQlCVUdfT04oc2xvdC0+cG9vbF9j b3VudHNbaV0pOworCQkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0pOworCQkJ c2xvdC0+cm1hcF9saXN0X3Bvb2xbaV0gPSBOVUxMOworCQl9CisJfQorCisJc2xvdC0+ZmxhZ3Mg Jj0gflVLU01fU0xPVF9ORUVEX1NPUlQ7Cit9CisKKy8qCisgKiB2bWFfZnVsbHlfc2Nhbm5lZCgp IC0gaWYgYWxsIHRoZSBwYWdlcyBpbiB0aGlzIHNsb3QgaGF2ZSBiZWVuIHNjYW5uZWQuCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50IHZtYV9mdWxseV9zY2FubmVkKHN0cnVjdCB2bWFfc2xvdCAqc2xv dCkKK3sKKwlyZXR1cm4gc2xvdC0+cGFnZXNfc2Nhbm5lZCA9PSBzbG90LT5wYWdlczsKK30KKwor LyoqCisgKiBnZXRfbmV4dF9ybWFwX2l0ZW0oKSAtIEdldCB0aGUgbmV4dCBybWFwX2l0ZW0gaW4g YSB2bWFfc2xvdCBhY2NvcmRpbmcgdG8KKyAqIGl0cyByYW5kb20gcGVybXV0YXRpb24uIFRoaXMg ZnVuY3Rpb24gaXMgZW1iZWRkZWQgd2l0aCB0aGUgcmFuZG9tCisgKiBwZXJtdXRhdGlvbiBpbmRl eCBtYW5hZ2VtZW50IGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgcm1hcF9pdGVtICpnZXRfbmV4 dF9ybWFwX2l0ZW0oc3RydWN0IHZtYV9zbG90ICpzbG90LCB1MzIgKmhhc2gpCit7CisJdW5zaWdu ZWQgbG9uZyByYW5kX3JhbmdlLCBhZGRyLCBzd2FwX2luZGV4LCBzY2FuX2luZGV4OworCXN0cnVj dCBybWFwX2l0ZW0gKml0ZW0gPSBOVUxMOworCXN0cnVjdCBybWFwX2xpc3RfZW50cnkgKnNjYW5f ZW50cnksICpzd2FwX2VudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXNjYW5f aW5kZXggPSBzd2FwX2luZGV4ID0gc2xvdC0+cGFnZXNfc2Nhbm5lZCAlIHNsb3QtPnBhZ2VzOwor CisJaWYgKHBvb2xfZW50cnlfYm91bmRhcnkoc2Nhbl9pbmRleCkpCisJCXRyeV9mcmVlX2xhc3Rf cG9vbChzbG90LCBzY2FuX2luZGV4IC0gMSk7CisKKwlpZiAodm1hX2Z1bGx5X3NjYW5uZWQoc2xv dCkpIHsKKwkJaWYgKHNsb3QtPmZsYWdzICYgVUtTTV9TTE9UX05FRURfU09SVCkKKwkJCXNsb3Qt PmZsYWdzIHw9IFVLU01fU0xPVF9ORUVEX1JFUkFORDsKKwkJZWxzZQorCQkJc2xvdC0+ZmxhZ3Mg Jj0gflVLU01fU0xPVF9ORUVEX1JFUkFORDsKKwkJaWYgKHNsb3QtPmZsYWdzICYgVUtTTV9TTE9U X05FRURfU09SVCkKKwkJCXNvcnRfcm1hcF9lbnRyeV9saXN0KHNsb3QpOworCX0KKworCXNjYW5f ZW50cnkgPSBnZXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHNjYW5faW5kZXgsIDEpOworCWlmICgh c2Nhbl9lbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZW50cnlfaXNfbmV3KHNjYW5fZW50 cnkpKSB7CisJCXNjYW5fZW50cnktPmFkZHIgPSBnZXRfaW5kZXhfb3JpZ19hZGRyKHNsb3QsIHNj YW5faW5kZXgpOworCQlzZXRfaXNfYWRkcihzY2FuX2VudHJ5LT5hZGRyKTsKKwl9CisKKwlpZiAo c2xvdC0+ZmxhZ3MgJiBVS1NNX1NMT1RfTkVFRF9SRVJBTkQpIHsKKwkJcmFuZF9yYW5nZSA9IHNs b3QtPnBhZ2VzIC0gc2Nhbl9pbmRleDsKKwkJQlVHX09OKCFyYW5kX3JhbmdlKTsKKwkJc3dhcF9p bmRleCA9IHNjYW5faW5kZXggKyAocHJhbmRvbV91MzIoKSAlIHJhbmRfcmFuZ2UpOworCX0KKwor CWlmIChzd2FwX2luZGV4ICE9IHNjYW5faW5kZXgpIHsKKwkJc3dhcF9lbnRyeSA9IGdldF9ybWFw X2xpc3RfZW50cnkoc2xvdCwgc3dhcF9pbmRleCwgMSk7CisJCWlmIChlbnRyeV9pc19uZXcoc3dh cF9lbnRyeSkpIHsKKwkJCXN3YXBfZW50cnktPmFkZHIgPSBnZXRfaW5kZXhfb3JpZ19hZGRyKHNs b3QsCisJCQkJCQkJICAgICAgIHN3YXBfaW5kZXgpOworCQkJc2V0X2lzX2FkZHIoc3dhcF9lbnRy eS0+YWRkcik7CisJCX0KKwkJc3dhcF9lbnRyaWVzKHNjYW5fZW50cnksIHNjYW5faW5kZXgsIHN3 YXBfZW50cnksIHN3YXBfaW5kZXgpOworCX0KKworCWFkZHIgPSBnZXRfZW50cnlfYWRkcmVzcyhz Y2FuX2VudHJ5KTsKKwlpdGVtID0gZ2V0X2VudHJ5X2l0ZW0oc2Nhbl9lbnRyeSk7CisJQlVHX09O KGFkZHIgPiBzbG90LT52bWEtPnZtX2VuZCB8fCBhZGRyIDwgc2xvdC0+dm1hLT52bV9zdGFydCk7 CisKKwlwYWdlID0gZm9sbG93X3BhZ2Uoc2xvdC0+dm1hLCBhZGRyLCBGT0xMX0dFVCk7CisJaWYg KElTX0VSUl9PUl9OVUxMKHBhZ2UpKQorCQlnb3RvIG5vcGFnZTsKKworCWlmICghUGFnZUFub24o cGFnZSkgJiYgIXBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbihwYWdlKSkKKwkJZ290byBwdXRwYWdl OworCisJLypjaGVjayBpcyB6ZXJvX3BhZ2UgcGZuIG9yIHVrc21femVyb19wYWdlKi8KKwlpZiAo KHBhZ2VfdG9fcGZuKHBhZ2UpID09IHplcm9fcGZuKQorCQkJfHwgKHBhZ2VfdG9fcGZuKHBhZ2Up ID09IHVrc21femVyb19wZm4pKQorCQlnb3RvIHB1dHBhZ2U7CisKKwlmbHVzaF9hbm9uX3BhZ2Uo c2xvdC0+dm1hLCBwYWdlLCBhZGRyKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCisJ Kmhhc2ggPSBwYWdlX2hhc2gocGFnZSwgaGFzaF9zdHJlbmd0aCwgMSk7CisJaW5jX3Vrc21fcGFn ZXNfc2Nhbm5lZCgpOworCS8qaWYgdGhlIHBhZ2UgY29udGVudCBhbGwgemVybywgcmUtbWFwIHRv IHplcm8tcGFnZSovCisJaWYgKGZpbmRfemVyb19wYWdlX2hhc2goaGFzaF9zdHJlbmd0aCwgKmhh c2gpKSB7CisJCWlmICghY21wX2FuZF9tZXJnZV96ZXJvX3BhZ2Uoc2xvdC0+dm1hLCBwYWdlKSkg eworCQkJc2xvdC0+cGFnZXNfbWVyZ2VkKys7CisJCQlpbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2Us IE5SX1VLU01fWkVST19QQUdFUyk7CisJCQlkZWNfbW1fY291bnRlcihzbG90LT5tbSwgTU1fQU5P TlBBR0VTKTsKKworCQkJLyogRm9yIGZ1bGwtemVybyBwYWdlcywgbm8gbmVlZCB0byBjcmVhdGUg cm1hcCBpdGVtICovCisJCQlnb3RvIHB1dHBhZ2U7CisJCX0gZWxzZSB7CisJCQlpbmNfcnNoYXNo X25lZyhtZW1jbXBfY29zdCAvIDIpOworCQl9CisJfQorCisJaWYgKCFpdGVtKSB7CisJCWl0ZW0g PSBhbGxvY19ybWFwX2l0ZW0oKTsKKwkJaWYgKGl0ZW0pIHsKKwkJCS8qIEl0IGhhcyBhbHJlYWR5 IGJlZW4gemVyb2VkICovCisJCQlpdGVtLT5zbG90ID0gc2xvdDsKKwkJCWl0ZW0tPmFkZHJlc3Mg PSBhZGRyOworCQkJaXRlbS0+ZW50cnlfaW5kZXggPSBzY2FuX2luZGV4OworCQkJc2Nhbl9lbnRy eS0+aXRlbSA9IGl0ZW07CisJCQlpbmNfcm1hcF9saXN0X3Bvb2xfY291bnQoc2xvdCwgc2Nhbl9p bmRleCk7CisJCX0gZWxzZQorCQkJZ290byBwdXRwYWdlOworCX0KKworCUJVR19PTihpdGVtLT5z bG90ICE9IHNsb3QpOworCS8qIHRoZSBwYWdlIG1heSBoYXZlIGNoYW5nZWQgKi8KKwlpdGVtLT5w YWdlID0gcGFnZTsKKwlwdXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHNjYW5faW5kZXgpOworCWlm IChzd2FwX2VudHJ5KQorCQlwdXRfcm1hcF9saXN0X2VudHJ5KHNsb3QsIHN3YXBfaW5kZXgpOwor CXJldHVybiBpdGVtOworCitwdXRwYWdlOgorCXB1dF9wYWdlKHBhZ2UpOworCXBhZ2UgPSBOVUxM Oworbm9wYWdlOgorCS8qIG5vIHBhZ2UsIHN0b3JlIGFkZHIgYmFjayBhbmQgZnJlZSBybWFwX2l0 ZW0gaWYgcG9zc2libGUgKi8KKwlmcmVlX2VudHJ5X2l0ZW0oc2Nhbl9lbnRyeSk7CisJcHV0X3Jt YXBfbGlzdF9lbnRyeShzbG90LCBzY2FuX2luZGV4KTsKKwlpZiAoc3dhcF9lbnRyeSkKKwkJcHV0 X3JtYXBfbGlzdF9lbnRyeShzbG90LCBzd2FwX2luZGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KKwor c3RhdGljIGlubGluZSBpbnQgaW5fc3RhYmxlX3RyZWUoc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9p dGVtKQoreworCXJldHVybiBybWFwX2l0ZW0tPmFkZHJlc3MgJiBTVEFCTEVfRkxBRzsKK30KKwor LyoqCisgKiBzY2FuX3ZtYV9vbmVfcGFnZSgpIC0gc2NhbiB0aGUgbmV4dCBwYWdlIGluIGEgdm1h X3Nsb3QuIENhbGxlZCB3aXRoCisgKiBtbWFwX3NlbSBsb2NrZWQuCisgKi8KK3N0YXRpYyBub2lu bGluZSB2b2lkIHNjYW5fdm1hX29uZV9wYWdlKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1 MzIgaGFzaDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgcm1hcF9pdGVtICpybWFw X2l0ZW0gPSBOVUxMOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gc2xvdC0+dm1hOwor CisJbW0gPSB2bWEtPnZtX21tOworCUJVR19PTighbW0pOworCUJVR19PTighc2xvdCk7CisKKwly bWFwX2l0ZW0gPSBnZXRfbmV4dF9ybWFwX2l0ZW0oc2xvdCwgJmhhc2gpOworCWlmICghcm1hcF9p dGVtKQorCQlnb3RvIG91dDE7CisKKwlpZiAoUGFnZUtzbShybWFwX2l0ZW0tPnBhZ2UpICYmIGlu X3N0YWJsZV90cmVlKHJtYXBfaXRlbSkpCisJCWdvdG8gb3V0MjsKKworCWNtcF9hbmRfbWVyZ2Vf cGFnZShybWFwX2l0ZW0sIGhhc2gpOworb3V0MjoKKwlwdXRfcGFnZShybWFwX2l0ZW0tPnBhZ2Up Oworb3V0MToKKwlzbG90LT5wYWdlc19zY2FubmVkKys7CisJaWYgKHNsb3QtPmZ1bGx5X3NjYW5u ZWRfcm91bmQgIT0gZnVsbHlfc2Nhbm5lZF9yb3VuZCkKKwkJc2Nhbm5lZF92aXJ0dWFsX3BhZ2Vz Kys7CisKKwlpZiAodm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpCisJCXNsb3QtPmZ1bGx5X3NjYW5u ZWRfcm91bmQgPSBmdWxseV9zY2FubmVkX3JvdW5kOworfQorCitzdGF0aWMgaW5saW5lIHVuc2ln bmVkIGxvbmcgcnVuZ19nZXRfcGFnZXMoc3RydWN0IHNjYW5fcnVuZyAqcnVuZykKK3sKKwlzdHJ1 Y3Qgc2xvdF90cmVlX25vZGUgKm5vZGU7CisKKwlpZiAoIXJ1bmctPnZtYV9yb290LnJub2RlKQor CQlyZXR1cm4gMDsKKworCW5vZGUgPSBjb250YWluZXJfb2YocnVuZy0+dm1hX3Jvb3Qucm5vZGUs IHN0cnVjdCBzbG90X3RyZWVfbm9kZSwgc25vZGUpOworCisJcmV0dXJuIG5vZGUtPnNpemU7Cit9 CisKKyNkZWZpbmUgUlVOR19TQU1QTEVEX01JTgkzCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgdWtz bV9jYWxjX3J1bmdfc3RlcChzdHJ1Y3Qgc2Nhbl9ydW5nICpydW5nLAorCQkJIHVuc2lnbmVkIGxv bmcgcGFnZV90aW1lLCB1bnNpZ25lZCBsb25nIHJhdGlvKQoreworCXVuc2lnbmVkIGxvbmcgc2Ft cGxlZCwgcGFnZXM7CisKKwkvKiB3aWxsIGJlIGZ1bGx5IHNjYW5uZWQgPyAqLworCWlmICghcnVu Zy0+Y292ZXJfbXNlY3MpIHsKKwkJcnVuZy0+c3RlcCA9IDE7CisJCXJldHVybjsKKwl9CisKKwlz YW1wbGVkID0gcnVuZy0+Y292ZXJfbXNlY3MgKiAoTlNFQ19QRVJfTVNFQyAvIFRJTUVfUkFUSU9f U0NBTEUpCisJCSAgKiByYXRpbyAvIHBhZ2VfdGltZTsKKworCS8qCisJICogIEJlZm9yZSB3ZSBm aW5zaXNoIGEgc2NhbiByb3VuZCBhbmQgZXhwZW5zaXZlIHBlci1yb3VuZCBqb2JzLAorCSAqICB3 ZSBuZWVkIHRvIGhhdmUgYSBjaGFuY2UgdG8gZXN0aW1hdGUgdGhlIHBlciBwYWdlIHRpbWUuIFNv CisJICogIHRoZSBzYW1wbGVkIG51bWJlciBjYW4gbm90IGJlIHRvbyBzbWFsbC4KKwkgKi8KKwlp ZiAoc2FtcGxlZCA8IFJVTkdfU0FNUExFRF9NSU4pCisJCXNhbXBsZWQgPSBSVU5HX1NBTVBMRURf TUlOOworCisJcGFnZXMgPSBydW5nX2dldF9wYWdlcyhydW5nKTsKKwlpZiAobGlrZWx5KHBhZ2Vz ID4gc2FtcGxlZCkpCisJCXJ1bmctPnN0ZXAgPSBwYWdlcyAvIHNhbXBsZWQ7CisJZWxzZQorCQly dW5nLT5zdGVwID0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RlcF9uZWVkX3JlY2FsYyhz dHJ1Y3Qgc2Nhbl9ydW5nICpydW5nKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZXMsIHN0ZXBtYXg7 CisKKwlwYWdlcyA9IHJ1bmdfZ2V0X3BhZ2VzKHJ1bmcpOworCXN0ZXBtYXggPSBwYWdlcyAvIFJV TkdfU0FNUExFRF9NSU47CisKKwlyZXR1cm4gcGFnZXMgJiYgKHJ1bmctPnN0ZXAgPiBwYWdlcyB8 fAorCQkJIChzdGVwbWF4ICYmIHJ1bmctPnN0ZXAgPiBzdGVwbWF4KSk7Cit9CisKK3N0YXRpYyBp bmxpbmUKK3ZvaWQgcmVzZXRfY3VycmVudF9zY2FuKHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcsIGlu dCBmaW5pc2hlZCwgaW50IHN0ZXBfcmVjYWxjKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsK KworCWlmIChmaW5pc2hlZCkKKwkJcnVuZy0+ZmxhZ3MgfD0gVUtTTV9SVU5HX1JPVU5EX0ZJTklT SEVEOworCisJaWYgKHN0ZXBfcmVjYWxjIHx8IHN0ZXBfbmVlZF9yZWNhbGMocnVuZykpIHsKKwkJ dWtzbV9jYWxjX3J1bmdfc3RlcChydW5nLCB1a3NtX2VtYV9wYWdlX3RpbWUsIHJ1bmctPmNwdV9y YXRpbyk7CisJCUJVR19PTihzdGVwX25lZWRfcmVjYWxjKHJ1bmcpKTsKKwl9CisKKwlzbG90X2l0 ZXJfaW5kZXggPSBwcmFuZG9tX3UzMigpICUgcnVuZy0+c3RlcDsKKwlCVUdfT04oIXJ1bmctPnZt YV9yb290LnJub2RlKTsKKwlzbG90ID0gc3JhZGl4X3RyZWVfbmV4dCgmcnVuZy0+dm1hX3Jvb3Qs IE5VTEwsIDAsIHNsb3RfaXRlcik7CisJQlVHX09OKCFzbG90KTsKKworCXJ1bmctPmN1cnJlbnRf c2NhbiA9IHNsb3Q7CisJcnVuZy0+Y3VycmVudF9vZmZzZXQgPSBzbG90X2l0ZXJfaW5kZXg7Cit9 CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnNsb3RfZ2V0X3Jvb3Qo c3RydWN0IHZtYV9zbG90ICpzbG90KQoreworCXJldHVybiAmc2xvdC0+cnVuZy0+dm1hX3Jvb3Q7 Cit9CisKKy8qCisgKiByZXR1cm4gaWYgcmVzZXR0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWR2YW5j ZV9jdXJyZW50X3NjYW4oc3RydWN0IHNjYW5fcnVuZyAqcnVuZykKK3sKKwl1bnNpZ25lZCBzaG9y dCBuOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdCwgKm5leHQgPSBOVUxMOworCisJQlVHX09OKCFy dW5nLT52bWFfcm9vdC5udW0pOworCisJc2xvdCA9IHJ1bmctPmN1cnJlbnRfc2NhbjsKKwluID0g KHNsb3QtPnBhZ2VzIC0gcnVuZy0+Y3VycmVudF9vZmZzZXQpICUgcnVuZy0+c3RlcDsKKwlzbG90 X2l0ZXJfaW5kZXggPSBydW5nLT5zdGVwIC0gbjsKKwluZXh0ID0gc3JhZGl4X3RyZWVfbmV4dCgm cnVuZy0+dm1hX3Jvb3QsIHNsb3QtPnNub2RlLAorCQkJCXNsb3QtPnNpbmRleCwgc2xvdF9pdGVy KTsKKworCWlmIChuZXh0KSB7CisJCXJ1bmctPmN1cnJlbnRfb2Zmc2V0ID0gc2xvdF9pdGVyX2lu ZGV4OworCQlydW5nLT5jdXJyZW50X3NjYW4gPSBuZXh0OworCQlyZXR1cm4gMDsKKwl9IGVsc2Ug eworCQlyZXNldF9jdXJyZW50X3NjYW4ocnVuZywgMSwgMCk7CisJCXJldHVybiAxOworCX0KK30K Kworc3RhdGljIGlubGluZSB2b2lkIHJ1bmdfcm1fc2xvdChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Qp Cit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZyA9IHNsb3QtPnJ1bmc7CisJc3RydWN0IHNyYWRp eF90cmVlX3Jvb3QgKnJvb3Q7CisKKwlpZiAocnVuZy0+Y3VycmVudF9zY2FuID09IHNsb3QpCisJ CWFkdmFuY2VfY3VycmVudF9zY2FuKHJ1bmcpOworCisJcm9vdCA9IHNsb3RfZ2V0X3Jvb3Qoc2xv dCk7CisJc3JhZGl4X3RyZWVfZGVsZXRlX2Zyb21fbGVhZihyb290LCBzbG90LT5zbm9kZSwgc2xv dC0+c2luZGV4KTsKKwlzbG90LT5zbm9kZSA9IE5VTEw7CisJaWYgKHN0ZXBfbmVlZF9yZWNhbGMo cnVuZykpIHsKKwkJdWtzbV9jYWxjX3J1bmdfc3RlcChydW5nLCB1a3NtX2VtYV9wYWdlX3RpbWUs IHJ1bmctPmNwdV9yYXRpbyk7CisJCUJVR19PTihzdGVwX25lZWRfcmVjYWxjKHJ1bmcpKTsKKwl9 CisKKwkvKiBJbiBjYXNlIGFkdmFuY2VfY3VycmVudF9zY2FuIGxvb3AgYmFjayB0byB0aGlzIHNs b3QgYWdhaW4gKi8KKwlpZiAocnVuZy0+dm1hX3Jvb3QubnVtICYmIHJ1bmctPmN1cnJlbnRfc2Nh biA9PSBzbG90KQorCQlyZXNldF9jdXJyZW50X3NjYW4oc2xvdC0+cnVuZywgMSwgMCk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBydW5nX2FkZF9uZXdfc2xvdHMoc3RydWN0IHNjYW5fcnVuZyAq cnVuZywKKwkJCXN0cnVjdCB2bWFfc2xvdCAqKnNsb3RzLCB1bnNpZ25lZCBsb25nIG51bSkKK3sK KwlpbnQgZXJyOworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJ c3RydWN0IHNyYWRpeF90cmVlX3Jvb3QgKnJvb3QgPSAmcnVuZy0+dm1hX3Jvb3Q7CisKKwllcnIg PSBzcmFkaXhfdHJlZV9lbnRlcihyb290LCAodm9pZCAqKilzbG90cywgbnVtKTsKKwlCVUdfT04o ZXJyKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlzbG90ID0gc2xvdHNbaV07 CisJCXNsb3QtPnJ1bmcgPSBydW5nOworCQlCVUdfT04odm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkp OworCX0KKworCWlmIChydW5nLT52bWFfcm9vdC5udW0gPT0gbnVtKQorCQlyZXNldF9jdXJyZW50 X3NjYW4ocnVuZywgMCwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ1bmdfYWRkX29uZV9z bG90KHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcsCisJCQkJICAgICBzdHJ1Y3Qgdm1hX3Nsb3QgKnNs b3QpCit7CisJaW50IGVycjsKKworCWVyciA9IHNyYWRpeF90cmVlX2VudGVyKCZydW5nLT52bWFf cm9vdCwgKHZvaWQgKiopJnNsb3QsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlz bG90LT5ydW5nID0gcnVuZzsKKwlpZiAocnVuZy0+dm1hX3Jvb3QubnVtID09IDEpCisJCXJlc2V0 X2N1cnJlbnRfc2NhbihydW5nLCAwLCAxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0 dXJuIHRydWUgaWYgdGhlIHNsb3QgaXMgZGVsZXRlZCBmcm9tIGl0cyBydW5nLgorICovCitzdGF0 aWMgaW5saW5lIGludCB2bWFfcnVuZ19lbnRlcihzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QsIHN0cnVj dCBzY2FuX3J1bmcgKnJ1bmcpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqb2xkX3J1bmcgPSBzbG90 LT5ydW5nOworCWludCBlcnI7CisKKwlpZiAob2xkX3J1bmcgPT0gcnVuZykKKwkJcmV0dXJuIDA7 CisKKwlydW5nX3JtX3Nsb3Qoc2xvdCk7CisJZXJyID0gcnVuZ19hZGRfb25lX3Nsb3QocnVuZywg c2xvdCk7CisJaWYgKGVycikgeworCQllcnIgPSBydW5nX2FkZF9vbmVfc2xvdChvbGRfcnVuZywg c2xvdCk7CisJCVdBUk5fT04oZXJyKTsgLyogT09QUywgYmFkbHkgT09NLCB3ZSBsb3N0IHRoaXMg c2xvdCAqLworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bWFfcnVu Z191cChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsK KworCXJ1bmcgPSBzbG90LT5ydW5nOworCWlmIChzbG90LT5ydW5nICE9ICZ1a3NtX3NjYW5fbGFk ZGVyW1NDQU5fTEFEREVSX1NJWkUtMV0pCisJCXJ1bmcrKzsKKworCXJldHVybiB2bWFfcnVuZ19l bnRlcihzbG90LCBydW5nKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdm1hX3J1bmdfZG93bihz dHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKworCXJ1 bmcgPSBzbG90LT5ydW5nOworCWlmIChzbG90LT5ydW5nICE9ICZ1a3NtX3NjYW5fbGFkZGVyWzBd KQorCQlydW5nLS07CisKKwlyZXR1cm4gdm1hX3J1bmdfZW50ZXIoc2xvdCwgcnVuZyk7Cit9CisK Ky8qKgorICogY2FsX2RlZHVwX3JhdGlvKCkgLSBDYWxjdWxhdGUgdGhlIGRlZHVwbGljYXRpb24g cmF0aW8gZm9yIHRoaXMgc2xvdC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsX2RlZHVw X3JhdGlvKHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwor CUJVR19PTihzbG90LT5wYWdlc19zY2FubmVkID09IHNsb3QtPmxhc3Rfc2Nhbm5lZCk7CisKKwly ZXQgPSBzbG90LT5wYWdlc19tZXJnZWQ7CisKKwkvKiBUaHJhc2hpbmcgYXJlYSBmaWx0ZXJpbmcg Ki8KKwlpZiAocmV0ICYmIHVrc21fdGhyYXNoX3RocmVzaG9sZCkgeworCQlpZiAoc2xvdC0+cGFn ZXNfY293ZWQgKiAxMDAgLyBzbG90LT5wYWdlc19tZXJnZWQKKwkJICAgID4gdWtzbV90aHJhc2hf dGhyZXNob2xkKSB7CisJCQlyZXQgPSAwOworCQl9IGVsc2UgeworCQkJcmV0ID0gc2xvdC0+cGFn ZXNfbWVyZ2VkIC0gc2xvdC0+cGFnZXNfY293ZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0Owor fQorCisvKioKKyAqIGNhbF9kZWR1cF9yYXRpbygpIC0gQ2FsY3VsYXRlIHRoZSBkZWR1cGxpY2F0 aW9uIHJhdGlvIGZvciB0aGlzIHNsb3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbF9k ZWR1cF9yYXRpb19vbGQoc3RydWN0IHZtYV9zbG90ICpzbG90KQoreworCXVuc2lnbmVkIGxvbmcg cmV0OworCXVuc2lnbmVkIGxvbmcgcGFnZXNfc2Nhbm5lZDsKKworCXBhZ2VzX3NjYW5uZWQgPSBz bG90LT5wYWdlc19zY2FubmVkOworCWlmICghcGFnZXNfc2Nhbm5lZCkgeworCQlpZiAodWtzbV90 aHJhc2hfdGhyZXNob2xkKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXBhZ2VzX3NjYW5uZWQg PSBzbG90LT5wYWdlc19zY2FubmVkOworCX0KKworCXJldCA9IHNsb3QtPnBhZ2VzX2JlbWVyZ2Vk ICogMTAwIC8gcGFnZXNfc2Nhbm5lZDsKKworCS8qIFRocmFzaGluZyBhcmVhIGZpbHRlcmluZyAq LworCWlmIChyZXQgJiYgdWtzbV90aHJhc2hfdGhyZXNob2xkKSB7CisJCWlmIChzbG90LT5wYWdl c19jb3dlZCAqIDEwMCAvIHNsb3QtPnBhZ2VzX2JlbWVyZ2VkCisJCSAgICA+IHVrc21fdGhyYXNo X3RocmVzaG9sZCkgeworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHNsb3QtPnBh Z2VzX2JlbWVyZ2VkIC0gc2xvdC0+cGFnZXNfY293ZWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0 OworfQorCisvKioKKyAqIHN0YWJsZV9ub2RlX3JlaW5zZXJ0KCkgLSBXaGVuIHRoZSBoYXNoX3N0 cmVuZ3RoIGhhcyBiZWVuIGFkanVzdGVkLCB0aGUKKyAqIHN0YWJsZSB0cmVlIG5lZWQgdG8gYmUg cmVzdHJ1Y3R1cmVkLCB0aGlzIGlzIHRoZSBmdW5jdGlvbiByZS1pbnNlcnRpbmcgdGhlCisgKiBz dGFibGUgbm9kZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN0YWJsZV9ub2RlX3JlaW5zZXJ0 KHN0cnVjdCBzdGFibGVfbm9kZSAqbmV3X25vZGUsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLAor CQkJCQlzdHJ1Y3QgcmJfcm9vdCAqcm9vdF90cmVlcCwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAq dHJlZV9ub2RlX2xpc3RwLAorCQkJCQl1MzIgaGFzaCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5l dyA9ICZyb290X3RyZWVwLT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxM OworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisJc3RydWN0IHRyZWVfbm9kZSAq dHJlZV9ub2RlOworCXN0cnVjdCBwYWdlICp0cmVlX3BhZ2U7CisJaW50IGNtcDsKKworCXdoaWxl ICgqbmV3KSB7CisJCWludCBjbXA7CisKKwkJdHJlZV9ub2RlID0gcmJfZW50cnkoKm5ldywgc3Ry dWN0IHRyZWVfbm9kZSwgbm9kZSk7CisKKwkJY21wID0gaGFzaF9jbXAoaGFzaCwgdHJlZV9ub2Rl LT5oYXNoKTsKKworCQlpZiAoY21wIDwgMCkgeworCQkJcGFyZW50ID0gKm5ldzsKKwkJCW5ldyA9 ICZwYXJlbnQtPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoY21wID4gMCkgeworCQkJcGFyZW50ID0g Km5ldzsKKwkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQl9IGVsc2UKKwkJCWJyZWFrOwor CX0KKworCWlmICgqbmV3KSB7CisJCS8qIGZpbmQgYSBzdGFibGUgdHJlZSBub2RlIHdpdGggc2Ft ZSBmaXJzdCBsZXZlbCBoYXNoIHZhbHVlICovCisJCXN0YWJsZV9ub2RlX2hhc2hfbWF4KG5ld19u b2RlLCBwYWdlLCBoYXNoKTsKKwkJaWYgKHRyZWVfbm9kZS0+Y291bnQgPT0gMSkgeworCQkJc3Rh YmxlX25vZGUgPSByYl9lbnRyeSh0cmVlX25vZGUtPnN1Yl9yb290LnJiX25vZGUsCisJCQkJCSAg ICAgICBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5vZGUpOworCQkJdHJlZV9wYWdlID0gZ2V0X3Vrc21f cGFnZShzdGFibGVfbm9kZSwgMSwgMCk7CisJCQlpZiAodHJlZV9wYWdlKSB7CisJCQkJc3RhYmxl X25vZGVfaGFzaF9tYXgoc3RhYmxlX25vZGUsCisJCQkJCQkgICAgICB0cmVlX3BhZ2UsIGhhc2gp OworCQkJCXB1dF9wYWdlKHRyZWVfcGFnZSk7CisKKwkJCQkvKiBwcmVwYXJlIGZvciBzdGFibGUg bm9kZSBpbnNlcnRpb24gKi8KKworCQkJCWNtcCA9IGhhc2hfY21wKG5ld19ub2RlLT5oYXNoX21h eCwKKwkJCQkJCSAgIHN0YWJsZV9ub2RlLT5oYXNoX21heCk7CisJCQkJcGFyZW50ID0gJnN0YWJs ZV9ub2RlLT5ub2RlOworCQkJCWlmIChjbXAgPCAwKQorCQkJCQluZXcgPSAmcGFyZW50LT5yYl9s ZWZ0OworCQkJCWVsc2UgaWYgKGNtcCA+IDApCisJCQkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0 OworCQkJCWVsc2UKKwkJCQkJZ290byBmYWlsZWQ7CisKKwkJCQlnb3RvIGFkZF9ub2RlOworCQkJ fSBlbHNlIHsKKwkJCQkvKiB0aGUgb25seSBzdGFibGVfbm9kZSBkZWxldGVkLCB0aGUgdHJlZSBu b2RlCisJCQkJICogd2FzIG5vdCBkZWxldGVkLgorCQkJCSAqLworCQkJCWdvdG8gdHJlZV9ub2Rl X3JldXNlOworCQkJfQorCQl9CisKKwkJLyogd2VsbCwgc2VhcmNoIHRoZSBjb2xsaXNpb24gc3Vi dHJlZSAqLworCQluZXcgPSAmdHJlZV9ub2RlLT5zdWJfcm9vdC5yYl9ub2RlOworCQlwYXJlbnQg PSBOVUxMOworCQlCVUdfT04oISpuZXcpOworCQl3aGlsZSAoKm5ldykgeworCQkJaW50IGNtcDsK KworCQkJc3RhYmxlX25vZGUgPSByYl9lbnRyeSgqbmV3LCBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5v ZGUpOworCisJCQljbXAgPSBoYXNoX2NtcChuZXdfbm9kZS0+aGFzaF9tYXgsCisJCQkJCSAgIHN0 YWJsZV9ub2RlLT5oYXNoX21heCk7CisKKwkJCWlmIChjbXAgPCAwKSB7CisJCQkJcGFyZW50ID0g Km5ldzsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9sZWZ0OworCQkJfSBlbHNlIGlmIChjbXAgPiAw KSB7CisJCQkJcGFyZW50ID0gKm5ldzsKKwkJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJ CX0gZWxzZSB7CisJCQkJLyogb2gsIG5vLCBzdGlsbCBhIGNvbGxpc2lvbiAqLworCQkJCWdvdG8g ZmFpbGVkOworCQkJfQorCQl9CisKKwkJZ290byBhZGRfbm9kZTsKKwl9CisKKwkvKiBubyB0cmVl IG5vZGUgZm91bmQgKi8KKwl0cmVlX25vZGUgPSBhbGxvY190cmVlX25vZGUodHJlZV9ub2RlX2xp c3RwKTsKKwlpZiAoIXRyZWVfbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVLU006IG1lbW9y eSBhbGxvY2F0aW9uIGVycm9yIVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0gZWxzZSB7CisJCXRy ZWVfbm9kZS0+aGFzaCA9IGhhc2g7CisJCXJiX2xpbmtfbm9kZSgmdHJlZV9ub2RlLT5ub2RlLCBw YXJlbnQsIG5ldyk7CisJCXJiX2luc2VydF9jb2xvcigmdHJlZV9ub2RlLT5ub2RlLCByb290X3Ry ZWVwKTsKKwordHJlZV9ub2RlX3JldXNlOgorCQkvKiBwcmVwYXJlIGZvciBzdGFibGUgbm9kZSBp bnNlcnRpb24gKi8KKwkJcGFyZW50ID0gTlVMTDsKKwkJbmV3ID0gJnRyZWVfbm9kZS0+c3ViX3Jv b3QucmJfbm9kZTsKKwl9CisKK2FkZF9ub2RlOgorCXJiX2xpbmtfbm9kZSgmbmV3X25vZGUtPm5v ZGUsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19ub2RlLT5ub2RlLCAmdHJl ZV9ub2RlLT5zdWJfcm9vdCk7CisJbmV3X25vZGUtPnRyZWVfbm9kZSA9IHRyZWVfbm9kZTsKKwl0 cmVlX25vZGUtPmNvdW50Kys7CisJcmV0dXJuOworCitmYWlsZWQ6CisJLyogVGhpcyBjYW4gb25s eSBoYXBwZW4gd2hlbiB0d28gbm9kZXMgaGF2ZSBjb2xsaWRlZAorCSAqIGluIHR3byBsZXZlbHMu CisJICovCisJbmV3X25vZGUtPnRyZWVfbm9kZSA9IE5VTEw7CisJcmV0dXJuOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgZnJlZV9hbGxfdHJlZV9ub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0 KQoreworCXN0cnVjdCB0cmVlX25vZGUgKm5vZGUsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUobm9kZSwgdG1wLCBsaXN0LCBhbGxfbGlzdCkgeworCQlmcmVlX3RyZWVfbm9kZShu b2RlKTsKKwl9Cit9CisKKy8qKgorICogc3RhYmxlX3RyZWVfZGVsdGFfaGFzaCgpIC0gRGVsdGEg aGFzaCB0aGUgc3RhYmxlIHRyZWUgZnJvbSBwcmV2aW91cyBoYXNoCisgKiBzdHJlbmd0aCB0byB0 aGUgY3VycmVudCBoYXNoX3N0cmVuZ3RoLiBJdCByZS1zdHJ1Y3R1cmVzIHRoZSBob2xlIHRyZWUu CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFibGVfdHJlZV9kZWx0YV9oYXNoKHUzMiBwcmV2 X2hhc2hfc3RyZW5ndGgpCit7CisJc3RydWN0IHN0YWJsZV9ub2RlICpub2RlLCAqdG1wOworCXN0 cnVjdCByYl9yb290ICpyb290X25ld190cmVlcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXdfdHJl ZV9ub2RlX2xpc3RwOworCisJc3RhYmxlX3RyZWVfaW5kZXggPSAoc3RhYmxlX3RyZWVfaW5kZXgg KyAxKSAlIDI7CisJcm9vdF9uZXdfdHJlZXAgPSAmcm9vdF9zdGFibGVfdHJlZVtzdGFibGVfdHJl ZV9pbmRleF07CisJbmV3X3RyZWVfbm9kZV9saXN0cCA9ICZzdGFibGVfdHJlZV9ub2RlX2xpc3Rb c3RhYmxlX3RyZWVfaW5kZXhdOworCSpyb290X25ld190cmVlcCA9IFJCX1JPT1Q7CisJQlVHX09O KCFsaXN0X2VtcHR5KG5ld190cmVlX25vZGVfbGlzdHApKTsKKworCS8qCisJICogd2UgbmVlZCB0 byBiZSBzYWZlLCB0aGUgbm9kZSBjb3VsZCBiZSByZW1vdmVkIGJ5IGdldF91a3NtX3BhZ2UoKQor CSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0bXAsICZzdGFibGVfbm9kZV9s aXN0LCBhbGxfbGlzdCkgeworCQl2b2lkICphZGRyOworCQlzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdl OworCQl1MzIgaGFzaDsKKworCQkvKgorCQkgKiBXZSBhcmUgY29tcGxldGVseSByZS1zdHJ1Y3R1 cmluZyB0aGUgc3RhYmxlIG5vZGVzIHRvIGEgbmV3CisJCSAqIHN0YWJsZSB0cmVlLiBXZSBkb24n dCB3YW50IHRvIHRvdWNoIHRoZSBvbGQgdHJlZSB1bmxpbmtzIGFuZAorCQkgKiBvbGQgdHJlZV9u b2Rlcy4gVGhlIG9sZCB0cmVlX25vZGVzIHdpbGwgYmUgZnJlZWQgYXQgb25jZS4KKwkJICovCisJ CW5vZGVfcGFnZSA9IGdldF91a3NtX3BhZ2Uobm9kZSwgMCwgMCk7CisJCWlmICghbm9kZV9wYWdl KQorCQkJY29udGludWU7CisKKwkJaWYgKG5vZGUtPnRyZWVfbm9kZSkgeworCQkJaGFzaCA9IG5v ZGUtPnRyZWVfbm9kZS0+aGFzaDsKKworCQkJYWRkciA9IGttYXBfYXRvbWljKG5vZGVfcGFnZSk7 CisKKwkJCWhhc2ggPSBkZWx0YV9oYXNoKGFkZHIsIHByZXZfaGFzaF9zdHJlbmd0aCwKKwkJCQkJ ICBoYXNoX3N0cmVuZ3RoLCBoYXNoKTsKKwkJCWt1bm1hcF9hdG9taWMoYWRkcik7CisJCX0gZWxz ZSB7CisJCQkvKgorCQkJICppdCB3YXMgbm90IGluc2VydGVkIHRvIHJidHJlZSBkdWUgdG8gY29s bGlzaW9uIGluIGxhc3QKKwkJCSAqcm91bmQgc2Nhbi4KKwkJCSAqLworCQkJaGFzaCA9IHBhZ2Vf aGFzaChub2RlX3BhZ2UsIGhhc2hfc3RyZW5ndGgsIDApOworCQl9CisKKwkJc3RhYmxlX25vZGVf cmVpbnNlcnQobm9kZSwgbm9kZV9wYWdlLCByb290X25ld190cmVlcCwKKwkJCQkgICAgIG5ld190 cmVlX25vZGVfbGlzdHAsIGhhc2gpOworCQlwdXRfcGFnZShub2RlX3BhZ2UpOworCX0KKworCXJv b3Rfc3RhYmxlX3RyZWVwID0gcm9vdF9uZXdfdHJlZXA7CisJZnJlZV9hbGxfdHJlZV9ub2Rlcyhz dGFibGVfdHJlZV9ub2RlX2xpc3RwKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoc3RhYmxlX3RyZWVf bm9kZV9saXN0cCkpOworCXN0YWJsZV90cmVlX25vZGVfbGlzdHAgPSBuZXdfdHJlZV9ub2RlX2xp c3RwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX2hhc2hfc3RyZW5ndGgodW5zaWduZWQg bG9uZyBkZWx0YSkKK3sKKwloYXNoX3N0cmVuZ3RoICs9IDEgPDwgZGVsdGE7CisJaWYgKGhhc2hf c3RyZW5ndGggPiBIQVNIX1NUUkVOR1RIX01BWCkKKwkJaGFzaF9zdHJlbmd0aCA9IEhBU0hfU1RS RU5HVEhfTUFYOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjX2hhc2hfc3RyZW5ndGgodW5z aWduZWQgbG9uZyBkZWx0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGNoYW5nZSA9IDEgPDwgZGVsdGE7 CisKKwlpZiAoaGFzaF9zdHJlbmd0aCA8PSBjaGFuZ2UgKyAxKQorCQloYXNoX3N0cmVuZ3RoID0g MTsKKwllbHNlCisJCWhhc2hfc3RyZW5ndGggLT0gY2hhbmdlOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQgaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEodm9pZCkKK3sKKwloYXNoX3N0cmVuZ3RoX2Rl bHRhKys7CisJaWYgKGhhc2hfc3RyZW5ndGhfZGVsdGEgPiBIQVNIX1NUUkVOR1RIX0RFTFRBX01B WCkKKwkJaGFzaF9zdHJlbmd0aF9kZWx0YSA9IEhBU0hfU1RSRU5HVEhfREVMVEFfTUFYOworfQor CisvKgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jdXJyZW50X25lZ19yYXRpbyh2 b2lkKQoreworCWlmICghcnNoYXNoX3BvcyB8fCByc2hhc2hfbmVnID4gcnNoYXNoX3BvcykKKwkJ cmV0dXJuIDEwMDsKKworCXJldHVybiBkaXY2NF91NjQoMTAwICogcnNoYXNoX25lZyAsIHJzaGFz aF9wb3MpOworfQorKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jdXJyZW50 X25lZ19yYXRpbyh2b2lkKQoreworCXU2NCBwb3MgPSBiZW5lZml0LnBvczsKKwl1NjQgbmVnID0g YmVuZWZpdC5uZWc7CisKKwlpZiAoIW5lZykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXBvcyB8fCBu ZWcgPiBwb3MpCisJCXJldHVybiAxMDA7CisKKwlpZiAobmVnID4gZGl2NjRfdTY0KFU2NF9NQVgs IDEwMCkpCisJCXBvcyA9IGRpdjY0X3U2NChwb3MsIDEwMCk7CisJZWxzZQorCQluZWcgKj0gMTAw OworCisJcmV0dXJuIGRpdjY0X3U2NChuZWcsIHBvcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5z aWduZWQgbG9uZyBnZXRfY3VycmVudF9iZW5lZml0KHZvaWQpCit7CisJdTY0IHBvcyA9IGJlbmVm aXQucG9zOworCXU2NCBuZWcgPSBiZW5lZml0Lm5lZzsKKwl1NjQgc2Nhbm5lZCA9IGJlbmVmaXQu c2Nhbm5lZDsKKworCWlmIChuZWcgPiBwb3MpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRpdjY0 X3U2NCgocG9zIC0gbmVnKSwgc2Nhbm5lZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGp1ZGdl X3JzaGFzaF9kaXJlY3Rpb24odm9pZCkKK3sKKwl1NjQgY3VycmVudF9uZWdfcmF0aW8sIHN0YWJs ZV9iZW5lZml0OworCXU2NCBjdXJyZW50X2JlbmVmaXQsIGRlbHRhID0gMDsKKwlpbnQgcmV0ID0g U1RJTEw7CisKKwkvKiBUcnkgdG8gcHJvYmUgYSB2YWx1ZSBhZnRlciB0aGUgYm9vdCwgYW5kIGlu IGNhc2UgdGhlIHN5c3RlbQorCSAgIGFyZSBzdGlsbCBmb3IgYSBsb25nIHRpbWUuICovCisJaWYg KChmdWxseV9zY2FubmVkX3JvdW5kICYgMHhGRlVMTCkgPT0gMTApIHsKKwkJcmV0ID0gT0JTQ1VS RTsKKwkJZ290byBvdXQ7CisJfQorCisJY3VycmVudF9uZWdfcmF0aW8gPSBnZXRfY3VycmVudF9u ZWdfcmF0aW8oKTsKKworCWlmIChjdXJyZW50X25lZ19yYXRpbyA9PSAwKSB7CisJCXJzaGFzaF9u ZWdfY29udF96ZXJvKys7CisJCWlmIChyc2hhc2hfbmVnX2NvbnRfemVybyA+IDIpCisJCQlyZXR1 cm4gR09fRE9XTjsKKwkJZWxzZQorCQkJcmV0dXJuIFNUSUxMOworCX0KKwlyc2hhc2hfbmVnX2Nv bnRfemVybyA9IDA7CisKKwlpZiAoY3VycmVudF9uZWdfcmF0aW8gPiA5MCkgeworCQlyZXQgPSBH T19VUDsKKwkJZ290byBvdXQ7CisJfQorCisJY3VycmVudF9iZW5lZml0ID0gZ2V0X2N1cnJlbnRf YmVuZWZpdCgpOworCXN0YWJsZV9iZW5lZml0ID0gcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0 OworCisJaWYgKCFzdGFibGVfYmVuZWZpdCkgeworCQlyZXQgPSBPQlNDVVJFOworCQlnb3RvIG91 dDsKKwl9CisKKwlpZiAoY3VycmVudF9iZW5lZml0ID4gc3RhYmxlX2JlbmVmaXQpCisJCWRlbHRh ID0gY3VycmVudF9iZW5lZml0IC0gc3RhYmxlX2JlbmVmaXQ7CisJZWxzZSBpZiAoY3VycmVudF9i ZW5lZml0IDwgc3RhYmxlX2JlbmVmaXQpCisJCWRlbHRhID0gc3RhYmxlX2JlbmVmaXQgLSBjdXJy ZW50X2JlbmVmaXQ7CisKKwlkZWx0YSA9IGRpdjY0X3U2NCgxMDAgKiBkZWx0YSAsIHN0YWJsZV9i ZW5lZml0KTsKKworCWlmIChkZWx0YSA+IDUwKSB7CisJCXJzaGFzaF9jb250X29ic2N1cmUrKzsK KwkJaWYgKHJzaGFzaF9jb250X29ic2N1cmUgPiAyKQorCQkJcmV0dXJuIE9CU0NVUkU7CisJCWVs c2UKKwkJCXJldHVybiBTVElMTDsKKwl9CisKK291dDoKKwlyc2hhc2hfY29udF9vYnNjdXJlID0g MDsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJzaGFzaF9hZGp1c3QoKSAtIFRoZSBtYWlu IGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHJhbmRvbSBzYW1wbGluZyBzdGF0ZQorICogbWFjaGlu ZSBmb3IgaGFzaCBzdHJlbmd0aCBhZGFwdGluZy4KKyAqCisgKiByZXR1cm4gdHJ1ZSBpZiBoYXNo X3N0cmVuZ3RoIGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgaW5saW5lIGludCByc2hhc2hfYWRq dXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwcmV2X2hhc2hfc3RyZW5ndGggPSBoYXNoX3N0 cmVuZ3RoOworCisJaWYgKCFlbmNvZGVfYmVuZWZpdCgpKQorCQlyZXR1cm4gMDsKKworCXN3aXRj aCAocnNoYXNoX3N0YXRlLnN0YXRlKSB7CisJY2FzZSBSU0hBU0hfU1RJTEw6CisJCXN3aXRjaCAo anVkZ2VfcnNoYXNoX2RpcmVjdGlvbigpKSB7CisJCWNhc2UgR09fVVA6CisJCQlpZiAocnNoYXNo X3N0YXRlLnByZV9kaXJlY3QgPT0gR09fRE9XTikKKwkJCQloYXNoX3N0cmVuZ3RoX2RlbHRhID0g MDsKKworCQkJaW5jX2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNf aGFzaF9zdHJlbmd0aF9kZWx0YSgpOworCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0ID0g Z2V0X2N1cnJlbnRfYmVuZWZpdCgpOworCQkJcnNoYXNoX3N0YXRlLnByZV9kaXJlY3QgPSBHT19V UDsKKwkJCWJyZWFrOworCisJCWNhc2UgR09fRE9XTjoKKwkJCWlmIChyc2hhc2hfc3RhdGUucHJl X2RpcmVjdCA9PSBHT19VUCkKKwkJCQloYXNoX3N0cmVuZ3RoX2RlbHRhID0gMDsKKworCQkJZGVj X2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNfaGFzaF9zdHJlbmd0 aF9kZWx0YSgpOworCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9iZW5lZml0ID0gZ2V0X2N1cnJlbnRf YmVuZWZpdCgpOworCQkJcnNoYXNoX3N0YXRlLnByZV9kaXJlY3QgPSBHT19ET1dOOworCQkJYnJl YWs7CisKKwkJY2FzZSBPQlNDVVJFOgorCQkJcnNoYXNoX3N0YXRlLnN0YWJsZV9wb2ludCA9IGhh c2hfc3RyZW5ndGg7CisJCQlyc2hhc2hfc3RhdGUudHVybl9wb2ludF9kb3duID0gaGFzaF9zdHJl bmd0aDsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X3VwID0gaGFzaF9zdHJlbmd0aDsKKwkJ CXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfZG93biA9IGdldF9jdXJyZW50X2JlbmVmaXQoKTsK KwkJCXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfdXAgPSBnZXRfY3VycmVudF9iZW5lZml0KCk7 CisJCQlyc2hhc2hfc3RhdGUubG9va3VwX3dpbmRvd19pbmRleCA9IDA7CisJCQlyc2hhc2hfc3Rh dGUuc3RhdGUgPSBSU0hBU0hfVFJZRE9XTjsKKwkJCWRlY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3Ry ZW5ndGhfZGVsdGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJCWJyZWFrOwor CisJCWNhc2UgU1RJTEw6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJ CWJyZWFrOworCisJY2FzZSBSU0hBU0hfVFJZRE9XTjoKKwkJaWYgKHJzaGFzaF9zdGF0ZS5sb29r dXBfd2luZG93X2luZGV4KysgJSA1ID09IDApCisJCQlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQg PSAwOworCisJCWlmIChnZXRfY3VycmVudF9iZW5lZml0KCkgPCByc2hhc2hfc3RhdGUuc3RhYmxl X2JlbmVmaXQpCisJCQlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQrKzsKKwkJZWxzZSBpZiAoZ2V0 X2N1cnJlbnRfYmVuZWZpdCgpID4KKwkJCSByc2hhc2hfc3RhdGUudHVybl9iZW5lZml0X2Rvd24p IHsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X2Rvd24gPSBoYXNoX3N0cmVuZ3RoOworCQkJ cnNoYXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9kb3duID0gZ2V0X2N1cnJlbnRfYmVuZWZpdCgpOwor CQl9CisKKwkJaWYgKHJzaGFzaF9zdGF0ZS5iZWxvd19jb3VudCA+PSAzIHx8CisJCSAgICBqdWRn ZV9yc2hhc2hfZGlyZWN0aW9uKCkgPT0gR09fVVAgfHwKKwkJICAgIGhhc2hfc3RyZW5ndGggPT0g MSkgeworCQkJaGFzaF9zdHJlbmd0aCA9IHJzaGFzaF9zdGF0ZS5zdGFibGVfcG9pbnQ7CisJCQlo YXNoX3N0cmVuZ3RoX2RlbHRhID0gMDsKKwkJCWluY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3RyZW5n dGhfZGVsdGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJCXJzaGFzaF9zdGF0 ZS5sb29rdXBfd2luZG93X2luZGV4ID0gMDsKKwkJCXJzaGFzaF9zdGF0ZS5zdGF0ZSA9IFJTSEFT SF9UUllVUDsKKwkJCWhhc2hfc3RyZW5ndGhfZGVsdGEgPSAwOworCQl9IGVsc2UgeworCQkJZGVj X2hhc2hfc3RyZW5ndGgoaGFzaF9zdHJlbmd0aF9kZWx0YSk7CisJCQlpbmNfaGFzaF9zdHJlbmd0 aF9kZWx0YSgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSU0hBU0hfVFJZVVA6CisJCWlmIChy c2hhc2hfc3RhdGUubG9va3VwX3dpbmRvd19pbmRleCsrICUgNSA9PSAwKQorCQkJcnNoYXNoX3N0 YXRlLmJlbG93X2NvdW50ID0gMDsKKworCQlpZiAoZ2V0X2N1cnJlbnRfYmVuZWZpdCgpIDwgcnNo YXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9kb3duKQorCQkJcnNoYXNoX3N0YXRlLmJlbG93X2NvdW50 Kys7CisJCWVsc2UgaWYgKGdldF9jdXJyZW50X2JlbmVmaXQoKSA+IHJzaGFzaF9zdGF0ZS50dXJu X2JlbmVmaXRfdXApIHsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX3BvaW50X3VwID0gaGFzaF9zdHJl bmd0aDsKKwkJCXJzaGFzaF9zdGF0ZS50dXJuX2JlbmVmaXRfdXAgPSBnZXRfY3VycmVudF9iZW5l Zml0KCk7CisJCX0KKworCQlpZiAocnNoYXNoX3N0YXRlLmJlbG93X2NvdW50ID49IDMgfHwKKwkJ ICAgIGp1ZGdlX3JzaGFzaF9kaXJlY3Rpb24oKSA9PSBHT19ET1dOIHx8CisJCSAgICBoYXNoX3N0 cmVuZ3RoID09IEhBU0hfU1RSRU5HVEhfTUFYKSB7CisJCQloYXNoX3N0cmVuZ3RoID0gcnNoYXNo X3N0YXRlLnR1cm5fYmVuZWZpdF91cCA+CisJCQkJcnNoYXNoX3N0YXRlLnR1cm5fYmVuZWZpdF9k b3duID8KKwkJCQlyc2hhc2hfc3RhdGUudHVybl9wb2ludF91cCA6CisJCQkJcnNoYXNoX3N0YXRl LnR1cm5fcG9pbnRfZG93bjsKKworCQkJcnNoYXNoX3N0YXRlLnN0YXRlID0gUlNIQVNIX1BSRV9T VElMTDsKKwkJfSBlbHNlIHsKKwkJCWluY19oYXNoX3N0cmVuZ3RoKGhhc2hfc3RyZW5ndGhfZGVs dGEpOworCQkJaW5jX2hhc2hfc3RyZW5ndGhfZGVsdGEoKTsKKwkJfQorCisJCWJyZWFrOworCisJ Y2FzZSBSU0hBU0hfTkVXOgorCWNhc2UgUlNIQVNIX1BSRV9TVElMTDoKKwkJcnNoYXNoX3N0YXRl LnN0YWJsZV9iZW5lZml0ID0gZ2V0X2N1cnJlbnRfYmVuZWZpdCgpOworCQlyc2hhc2hfc3RhdGUu c3RhdGUgPSBSU0hBU0hfU1RJTEw7CisJCWhhc2hfc3RyZW5ndGhfZGVsdGEgPSAwOworCQlicmVh azsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiByc2hhc2hfbmVnID0gcnNoYXNoX3Bv cyA9IDA7ICovCisJcmVzZXRfYmVuZWZpdCgpOworCisJaWYgKHByZXZfaGFzaF9zdHJlbmd0aCAh PSBoYXNoX3N0cmVuZ3RoKQorCQlzdGFibGVfdHJlZV9kZWx0YV9oYXNoKHByZXZfaGFzaF9zdHJl bmd0aCk7CisKKwlyZXR1cm4gcHJldl9oYXNoX3N0cmVuZ3RoICE9IGhhc2hfc3RyZW5ndGg7Cit9 CisKKy8qKgorICogcm91bmRfdXBkYXRlX2xhZGRlcigpIC0gVGhlIG1haW4gZnVuY3Rpb24gdG8g ZG8gdXBkYXRlIG9mIGFsbCB0aGUKKyAqIGFkanVzdG1lbnRzIHdoZW5ldmVyIGEgc2NhbiByb3Vu ZCBpcyBmaW5pc2hlZC4KKyAqLworc3RhdGljIG5vaW5saW5lIHZvaWQgcm91bmRfdXBkYXRlX2xh ZGRlcih2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZGVkdXA7CisJc3RydWN0IHZt YV9zbG90ICpzbG90LCAqdG1wX3Nsb3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXVrc21fc2Nhbl9sYWRkZXJbaV0uZmxhZ3MgJj0gflVLU01fUlVOR19S T1VORF9GSU5JU0hFRDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2xvdCwgdG1w X3Nsb3QsICZ2bWFfc2xvdF9kZWR1cCwgZGVkdXBfbGlzdCkgeworCisJCS8qIHNsb3QgbWF5IGJl IHJ1bmdfcm1fc2xvdCgpIHdoZW4gbW0gZXhpdHMgKi8KKwkJaWYgKHNsb3QtPnNub2RlKSB7CisJ CQlkZWR1cCA9IGNhbF9kZWR1cF9yYXRpb19vbGQoc2xvdCk7CisJCQlpZiAoZGVkdXAgJiYgZGVk dXAgPj0gdWtzbV9hYnVuZGFudF90aHJlc2hvbGQpCisJCQkJdm1hX3J1bmdfdXAoc2xvdCk7CisJ CX0KKworCQlzbG90LT5wYWdlc19iZW1lcmdlZCA9IDA7CisJCXNsb3QtPnBhZ2VzX2Nvd2VkID0g MDsKKworCQlsaXN0X2RlbF9pbml0KCZzbG90LT5kZWR1cF9saXN0KTsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIHVrc21fZGVsX3ZtYV9zbG90KHN0cnVjdCB2bWFfc2xvdCAqc2xvdCkKK3sKKwlpbnQg aSwgajsKKwlzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5ICplbnRyeTsKKworCWlmIChzbG90LT5zbm9k ZSkgeworCQkvKgorCQkgKiBJbiBjYXNlIGl0IGp1c3QgZmFpbGVkIHdoZW4gZW50ZXJpbmcgdGhl IHJ1bmcsIGl0J3Mgbm90CisJCSAqIG5lY2Vzc2FyeS4KKwkJICovCisJCXJ1bmdfcm1fc2xvdChz bG90KTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNsb3QtPmRlZHVwX2xpc3QpKQorCQlsaXN0 X2RlbCgmc2xvdC0+ZGVkdXBfbGlzdCk7CisKKwlpZiAoIXNsb3QtPnJtYXBfbGlzdF9wb29sIHx8 ICFzbG90LT5wb29sX2NvdW50cykgeworCQkvKiBJbiBjYXNlIGl0IE9PTWVkIGluIHVrc21fdm1h X2VudGVyKCkgKi8KKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNsb3QtPnBv b2xfc2l6ZTsgaSsrKSB7CisJCXZvaWQgKmFkZHI7CisKKwkJaWYgKCFzbG90LT5ybWFwX2xpc3Rf cG9vbFtpXSkKKwkJCWNvbnRpbnVlOworCisJCWFkZHIgPSBrbWFwKHNsb3QtPnJtYXBfbGlzdF9w b29sW2ldKTsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIHNpemVvZigqZW50cnkpOyBq KyspIHsKKwkJCWVudHJ5ID0gKHN0cnVjdCBybWFwX2xpc3RfZW50cnkgKilhZGRyICsgajsKKwkJ CWlmIChpc19hZGRyKGVudHJ5LT5hZGRyKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghZW50cnkt Pml0ZW0pCisJCQkJY29udGludWU7CisKKwkJCXJlbW92ZV9ybWFwX2l0ZW1fZnJvbV90cmVlKGVu dHJ5LT5pdGVtKTsKKwkJCWZyZWVfcm1hcF9pdGVtKGVudHJ5LT5pdGVtKTsKKwkJCXNsb3QtPnBv b2xfY291bnRzW2ldLS07CisJCX0KKwkJQlVHX09OKHNsb3QtPnBvb2xfY291bnRzW2ldKTsKKwkJ a3VubWFwKHNsb3QtPnJtYXBfbGlzdF9wb29sW2ldKTsKKwkJX19mcmVlX3BhZ2Uoc2xvdC0+cm1h cF9saXN0X3Bvb2xbaV0pOworCX0KKwlrZnJlZShzbG90LT5ybWFwX2xpc3RfcG9vbCk7CisJa2Zy ZWUoc2xvdC0+cG9vbF9jb3VudHMpOworCitvdXQ6CisJc2xvdC0+cnVuZyA9IE5VTEw7CisJQlVH X09OKHVrc21fcGFnZXNfdG90YWwgPCBzbG90LT5wYWdlcyk7CisJaWYgKHNsb3QtPmZsYWdzICYg VUtTTV9TTE9UX0lOX1VLU00pCisJCXVrc21fcGFnZXNfdG90YWwgLT0gc2xvdC0+cGFnZXM7CisK KwlpZiAoc2xvdC0+ZnVsbHlfc2Nhbm5lZF9yb3VuZCA9PSBmdWxseV9zY2FubmVkX3JvdW5kKQor CQlzY2FubmVkX3ZpcnR1YWxfcGFnZXMgLT0gc2xvdC0+cGFnZXM7CisJZWxzZQorCQlzY2FubmVk X3ZpcnR1YWxfcGFnZXMgLT0gc2xvdC0+cGFnZXNfc2Nhbm5lZDsKKwlmcmVlX3ZtYV9zbG90KHNs b3QpOworfQorCisKKyNkZWZpbmUgU1BJTl9MT0NLX1BFUklPRAkzMgorc3RhdGljIHN0cnVjdCB2 bWFfc2xvdCAqY2xlYW51cF9zbG90c1tTUElOX0xPQ0tfUEVSSU9EXTsKK3N0YXRpYyBpbmxpbmUg dm9pZCBjbGVhbnVwX3ZtYV9zbG90cyh2b2lkKQoreworCXN0cnVjdCB2bWFfc2xvdCAqc2xvdDsK KwlpbnQgaTsKKworCWkgPSAwOworCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKwl3 aGlsZSAoIWxpc3RfZW1wdHkoJnZtYV9zbG90X2RlbCkpIHsKKwkJc2xvdCA9IGxpc3RfZW50cnko dm1hX3Nsb3RfZGVsLm5leHQsCisJCQkJICBzdHJ1Y3Qgdm1hX3Nsb3QsIHNsb3RfbGlzdCk7CisJ CWxpc3RfZGVsKCZzbG90LT5zbG90X2xpc3QpOworCQljbGVhbnVwX3Nsb3RzW2krK10gPSBzbG90 OworCQlpZiAoaSA9PSBTUElOX0xPQ0tfUEVSSU9EKSB7CisJCQlzcGluX3VubG9jaygmdm1hX3Ns b3RfbGlzdF9sb2NrKTsKKwkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQl1a3NtX2RlbF92bWFfc2xv dChjbGVhbnVwX3Nsb3RzW2ldKTsKKwkJCWkgPSAwOworCQkJc3Bpbl9sb2NrKCZ2bWFfc2xvdF9s aXN0X2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ2bWFfc2xvdF9saXN0X2xvY2spOwor CisJd2hpbGUgKC0taSA+PSAwKQorCQl1a3NtX2RlbF92bWFfc2xvdChjbGVhbnVwX3Nsb3RzW2ld KTsKK30KKworLyoKKypleHBvdGlvbmFsIG1vdmluZyBhdmVyYWdlIGZvcm11bGEKKyovCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZW1hKHVuc2lnbmVkIGxvbmcgY3VyciwgdW5zaWduZWQg bG9uZyBsYXN0X2VtYSkKK3sKKwkvKgorCSAqIEZvciBhIHZlcnkgaGlnaCBidXJzdCwgZXZlbiB0 aGUgZW1hIGNhbm5vdCB3b3JrIHdlbGwsIGEgZmFsc2UgdmVyeQorCSAqIGhpZ2ggcGVyLXBhZ2Ug dGltZSBlc3RpbWF0aW9uIGNhbiByZXN1bHQgaW4gZmVlZGJhY2sgaW4gdmVyeSBoaWdoCisJICog b3ZlcmhlYWQgb2YgY29udGV4dCBzd2l0aCBhbmQgcnVuZyB1cGRhdGUgLS0gdGhpcyB3aWxsIHRo ZW4gbGVhZAorCSAqIHRvIGhpZ2hlciBwZXItcGFwZXIgdGltZSwgdGhpcyBtYXkgbm90IGNvbnZl cmdlLgorCSAqCisJICogSW5zdGVhZCwgd2UgdHJ5IHRvIGFwcHJvYWNoIHRoaXMgdmFsdWUgaW4g YSBiaW5hcnkgbWFubmVyLgorCSAqLworCWlmIChjdXJyID4gbGFzdF9lbWEgKiAxMCkKKwkJcmV0 dXJuIGxhc3RfZW1hICogMjsKKworCXJldHVybiAoRU1BX0FMUEhBICogY3VyciArICgxMDAgLSBF TUFfQUxQSEEpICogbGFzdF9lbWEpIC8gMTAwOworfQorCisvKgorICogY29udmVydCBjcHUgcmF0 aW8gaW4gMS9USU1FX1JBVElPX1NDQUxFIGNvbmZpZ3VyZWQgYnkgdXNlciB0bworICogbmFub3Nl Y29uZHMgYmFzZWQgb24gY3VycmVudCB1a3NtX3NsZWVwX2ppZmZpZXMuCisgKi8KK3N0YXRpYyBp bmxpbmUgdW5zaWduZWQgbG9uZyBjcHVfcmF0aW9fdG9fbnNlYyh1bnNpZ25lZCBpbnQgcmF0aW8p Cit7CisJcmV0dXJuIE5TRUNfUEVSX1VTRUMgKiBqaWZmaWVzX3RvX3VzZWNzKHVrc21fc2xlZXBf amlmZmllcykgLworCQkoVElNRV9SQVRJT19TQ0FMRSAtIHJhdGlvKSAqIHJhdGlvOworfQorCisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydW5nX3JlYWxfcmF0aW8oaW50IGNwdV90aW1l X3JhdGlvKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJQlVHX09OKCFjcHVfdGltZV9yYXRp byk7CisKKwlpZiAoY3B1X3RpbWVfcmF0aW8gPiAwKQorCQlyZXQgPSBjcHVfdGltZV9yYXRpbzsK KwllbHNlCisJCXJldCA9ICh1bnNpZ25lZCBsb25nKSgtY3B1X3RpbWVfcmF0aW8pICoKKwkJCXVr c21fbWF4X2NwdV9wZXJjZW50YWdlIC8gMTAwVUw7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogMTsK K30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgdWtzbV9jYWxjX3NjYW5fcGFnZXModm9pZCkKK3sK KwlzdHJ1Y3Qgc2Nhbl9ydW5nICpsYWRkZXIgPSB1a3NtX3NjYW5fbGFkZGVyOworCXVuc2lnbmVk IGxvbmcgc2xlZXBfdXNlY3MsIG5zZWNzOworCXVuc2lnbmVkIGxvbmcgcmF0aW87CisJaW50IGk7 CisJdW5zaWduZWQgbG9uZyBwZXJfcGFnZTsKKworCWlmICh1a3NtX2VtYV9wYWdlX3RpbWUgPiAx MDAwMDAgfHwKKwkgICAgKCgodW5zaWduZWQgbG9uZykgdWtzbV9ldmFsX3JvdW5kICYgKDI1NlVM IC0gMSkpID09IDBVTCkpCisJCXVrc21fZW1hX3BhZ2VfdGltZSA9IFVLU01fUEFHRV9USU1FX0RF RkFVTFQ7CisKKwlwZXJfcGFnZSA9IHVrc21fZW1hX3BhZ2VfdGltZTsKKwlCVUdfT04oIXBlcl9w YWdlKTsKKworCS8qCisJICogRm9yIGV2ZXJ5IDggZXZhbCByb3VuZCwgd2UgdHJ5IHRvIHByb2Jl IGEgdWtzbV9zbGVlcF9qaWZmaWVzIHZhbHVlCisJICogYmFzZWQgb24gc2F2ZWQgdXNlciBpbnB1 dC4KKwkgKi8KKwlpZiAoKCh1bnNpZ25lZCBsb25nKSB1a3NtX2V2YWxfcm91bmQgJiAoOFVMIC0g MSkpID09IDBVTCkKKwkJdWtzbV9zbGVlcF9qaWZmaWVzID0gdWtzbV9zbGVlcF9zYXZlZDsKKwor CS8qIFdlIHJlcXVpcmUgYSBydW5nIHNjYW4gYXQgbGVhc3QgMSBwYWdlIGluIGEgcGVyaW9kLiAq LworCW5zZWNzID0gcGVyX3BhZ2U7CisJcmF0aW8gPSBydW5nX3JlYWxfcmF0aW8obGFkZGVyWzBd LmNwdV9yYXRpbyk7CisJaWYgKGNwdV9yYXRpb190b19uc2VjKHJhdGlvKSA8IG5zZWNzKSB7CisJ CXNsZWVwX3VzZWNzID0gbnNlY3MgKiAoVElNRV9SQVRJT19TQ0FMRSAtIHJhdGlvKSAvIHJhdGlv CisJCQkJLyBOU0VDX1BFUl9VU0VDOworCQl1a3NtX3NsZWVwX2ppZmZpZXMgPSB1c2Vjc190b19q aWZmaWVzKHNsZWVwX3VzZWNzKSArIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNDQU5fTEFE REVSX1NJWkU7IGkrKykgeworCQlyYXRpbyA9IHJ1bmdfcmVhbF9yYXRpbyhsYWRkZXJbaV0uY3B1 X3JhdGlvKTsKKwkJbGFkZGVyW2ldLnBhZ2VzX3RvX3NjYW4gPSBjcHVfcmF0aW9fdG9fbnNlYyhy YXRpbykgLworCQkJCQlwZXJfcGFnZTsKKwkJQlVHX09OKCFsYWRkZXJbaV0ucGFnZXNfdG9fc2Nh bik7CisJCXVrc21fY2FsY19ydW5nX3N0ZXAoJmxhZGRlcltpXSwgcGVyX3BhZ2UsIHJhdGlvKTsK Kwl9Cit9CisKKy8qCisgKiBGcm9tIHRoZSBzY2FuIHRpbWUgb2YgdGhpcyByb3VuZCAobnMpIHRv IG5leHQgZXhwZWN0ZWQgbWluIHNsZWVwIHRpbWUKKyAqIChtcyksIGJlIGNhcmVmdWwgb2YgdGhl IHBvc3NpYmxlIG92ZXJmbG93cy4gcmF0aW8gaXMgdGFrZW4gZnJvbQorICogcnVuZ19yZWFsX3Jh dGlvKCkKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgaW50IHNjYW5fdGltZV90b19zbGVl cCh1bnNpZ25lZCBsb25nIGxvbmcgc2Nhbl90aW1lLCB1bnNpZ25lZCBsb25nIHJhdGlvKQorewor CXNjYW5fdGltZSA+Pj0gMjA7IC8qIHRvIG1zZWMgbGV2ZWwgbm93ICovCisJQlVHX09OKHNjYW5f dGltZSA+IChVTE9OR19NQVggLyBUSU1FX1JBVElPX1NDQUxFKSk7CisKKwlyZXR1cm4gKHVuc2ln bmVkIGludCkgKCh1bnNpZ25lZCBsb25nKSBzY2FuX3RpbWUgKgorCQkJICAgICAgIChUSU1FX1JB VElPX1NDQUxFIC0gcmF0aW8pIC8gcmF0aW8pOworfQorCisjZGVmaW5lIF9fcm91bmRfbWFzayh4 LCB5KSAoKF9fdHlwZW9mX18oeCkpKCh5KS0xKSkKKyNkZWZpbmUgcm91bmRfdXAoeCwgeSkgKCgo KHgpLTEpIHwgX19yb3VuZF9tYXNrKHgsIHkpKSsxKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGxvbmcgdm1hX3Bvb2xfc2l6ZShzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJcmV0dXJuIHJv dW5kX3VwKHNpemVvZihzdHJ1Y3Qgcm1hcF9saXN0X2VudHJ5KSAqIHNsb3QtPnBhZ2VzLAorCQkJ UEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOworfQorCitzdGF0aWMgdm9pZCB1a3NtX3ZtYV9lbnRl cihzdHJ1Y3Qgdm1hX3Nsb3QgKipzbG90cywgdW5zaWduZWQgbG9uZyBudW0pCit7CisJc3RydWN0 IHNjYW5fcnVuZyAqcnVuZzsKKwl1bnNpZ25lZCBsb25nIHBvb2xfc2l6ZSwgaTsKKwlzdHJ1Y3Qg dm1hX3Nsb3QgKnNsb3Q7CisJaW50IGZhaWxlZDsKKworCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRl clswXTsKKworCWZhaWxlZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXNs b3QgPSBzbG90c1tpXTsKKworCQlwb29sX3NpemUgPSB2bWFfcG9vbF9zaXplKHNsb3QpOworCQlz bG90LT5ybWFwX2xpc3RfcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICoKKwkJ CQkJICAgICAgIHBvb2xfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2xvdC0+cm1hcF9saXN0 X3Bvb2wpCisJCQlicmVhazsKKworCQlzbG90LT5wb29sX2NvdW50cyA9IGt6YWxsb2Moc2l6ZW9m KHVuc2lnbmVkIGludCkgKiBwb29sX3NpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYg KCFzbG90LT5wb29sX2NvdW50cykgeworCQkJa2ZyZWUoc2xvdC0+cm1hcF9saXN0X3Bvb2wpOwor CQkJYnJlYWs7CisJCX0KKworCQlzbG90LT5wb29sX3NpemUgPSBwb29sX3NpemU7CisJCUJVR19P TihDQU5fT1ZFUkZMT1dfVTY0KHVrc21fcGFnZXNfdG90YWwsIHNsb3QtPnBhZ2VzKSk7CisJCXNs b3QtPmZsYWdzIHw9IFVLU01fU0xPVF9JTl9VS1NNOworCQl1a3NtX3BhZ2VzX3RvdGFsICs9IHNs b3QtPnBhZ2VzOworCX0KKworCWlmIChpKQorCQlydW5nX2FkZF9uZXdfc2xvdHMocnVuZywgc2xv dHMsIGkpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHZtYV9zbG90ICpiYXRjaF9z bG90c1tTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFXTsKKworc3RhdGljIHZvaWQgdWtzbV9lbnRl cl9hbGxfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3Q7CisJdW5zaWduZWQg bG9uZyBpbmRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X3ZtYV9saXN0OworCWludCBpOwor CisJaSA9IDA7CisJaW5kZXggPSAwOworCUlOSVRfTElTVF9IRUFEKCZlbXB0eV92bWFfbGlzdCk7 CisKKwlzcGluX2xvY2soJnZtYV9zbG90X2xpc3RfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5 KCZ2bWFfc2xvdF9uZXcpKSB7CisJCXNsb3QgPSBsaXN0X2VudHJ5KHZtYV9zbG90X25ldy5uZXh0 LAorCQkJCSAgc3RydWN0IHZtYV9zbG90LCBzbG90X2xpc3QpOworCisJCWlmICghc2xvdC0+dm1h LT5hbm9uX3ZtYSkgeworCQkJbGlzdF9tb3ZlKCZzbG90LT5zbG90X2xpc3QsICZlbXB0eV92bWFf bGlzdCk7CisJCX0gZWxzZSBpZiAodm1hX2Nhbl9lbnRlcihzbG90LT52bWEpKSB7CisJCQliYXRj aF9zbG90c1tpbmRleCsrXSA9IHNsb3Q7CisJCQlsaXN0X2RlbF9pbml0KCZzbG90LT5zbG90X2xp c3QpOworCQl9IGVsc2UgeworCQkJbGlzdF9tb3ZlKCZzbG90LT5zbG90X2xpc3QsICZ2bWFfc2xv dF9ub2FkZCk7CisJCX0KKworCQlpZiAoKytpID09IFNQSU5fTE9DS19QRVJJT0QgfHwKKwkJICAg IChpbmRleCAmJiAhKGluZGV4ICUgU0xPVF9UUkVFX05PREVfU1RPUkVfU0laRSkpKSB7CisJCQlz cGluX3VubG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCQkJaWYgKGluZGV4ICYmICEoaW5k ZXggJSBTTE9UX1RSRUVfTk9ERV9TVE9SRV9TSVpFKSkgeworCQkJCXVrc21fdm1hX2VudGVyKGJh dGNoX3Nsb3RzLCBpbmRleCk7CisJCQkJaW5kZXggPSAwOworCQkJfQorCQkJaSA9IDA7CisJCQlj b25kX3Jlc2NoZWQoKTsKKwkJCXNwaW5fbG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKwkJfQor CX0KKworCWxpc3Rfc3BsaWNlKCZlbXB0eV92bWFfbGlzdCwgJnZtYV9zbG90X25ldyk7CisKKwlz cGluX3VubG9jaygmdm1hX3Nsb3RfbGlzdF9sb2NrKTsKKworCWlmIChpbmRleCkKKwkJdWtzbV92 bWFfZW50ZXIoYmF0Y2hfc2xvdHMsIGluZGV4KTsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBy dW5nX3JvdW5kX2ZpbmlzaGVkKHN0cnVjdCBzY2FuX3J1bmcgKnJ1bmcpCit7CisJcmV0dXJuIHJ1 bmctPmZsYWdzICYgVUtTTV9SVU5HX1JPVU5EX0ZJTklTSEVEOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQganVkZ2Vfc2xvdChzdHJ1Y3Qgdm1hX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IHNjYW5f cnVuZyAqcnVuZyA9IHNsb3QtPnJ1bmc7CisJdW5zaWduZWQgbG9uZyBkZWR1cDsKKwlpbnQgZGVs ZXRlZDsKKworCWRlZHVwID0gY2FsX2RlZHVwX3JhdGlvKHNsb3QpOworCWlmICh2bWFfZnVsbHlf c2Nhbm5lZChzbG90KSAmJiB1a3NtX3RocmFzaF90aHJlc2hvbGQpCisJCWRlbGV0ZWQgPSB2bWFf cnVuZ19lbnRlcihzbG90LCAmdWtzbV9zY2FuX2xhZGRlclswXSk7CisJZWxzZSBpZiAoZGVkdXAg JiYgZGVkdXAgPj0gdWtzbV9hYnVuZGFudF90aHJlc2hvbGQpCisJCWRlbGV0ZWQgPSB2bWFfcnVu Z191cChzbG90KTsKKwllbHNlCisJCWRlbGV0ZWQgPSB2bWFfcnVuZ19kb3duKHNsb3QpOworCisJ c2xvdC0+cGFnZXNfbWVyZ2VkID0gMDsKKwlzbG90LT5wYWdlc19jb3dlZCA9IDA7CisKKwlpZiAo dm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpCisJCXNsb3QtPnBhZ2VzX3NjYW5uZWQgPSAwOworCisJ c2xvdC0+bGFzdF9zY2FubmVkID0gc2xvdC0+cGFnZXNfc2Nhbm5lZDsKKworCS8qIElmIGl0cyBk ZWxldGVkIGluIGFib3ZlLCB0aGVuIHJ1bmcgd2FzIGFscmVhZHkgYWR2YW5jZWQuICovCisJaWYg KCFkZWxldGVkKQorCQlhZHZhbmNlX2N1cnJlbnRfc2NhbihydW5nKTsKK30KKworCitzdGF0aWMg aW5saW5lIGludCBoYXNoX3JvdW5kX2ZpbmlzaGVkKHZvaWQpCit7CisJaWYgKHNjYW5uZWRfdmly dHVhbF9wYWdlcyA+ICh1a3NtX3BhZ2VzX3RvdGFsID4+IDIpKSB7CisJCXNjYW5uZWRfdmlydHVh bF9wYWdlcyA9IDA7CisJCWlmICh1a3NtX3BhZ2VzX3NjYW5uZWQpCisJCQlmdWxseV9zY2FubmVk X3JvdW5kKys7CisKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQor CisjZGVmaW5lIFVLU01fTU1TRU1fQkFUQ0gJNQorI2RlZmluZSBCVVNZX1JFVFJZCQkxMDAKKwor LyoqCisgKiB1a3NtX2RvX3NjYW4oKSAgLSB0aGUgbWFpbiB3b3JrZXIgZnVuY3Rpb24uCisgKi8K K3N0YXRpYyBub2lubGluZSB2b2lkIHVrc21fZG9fc2Nhbih2b2lkKQoreworCXN0cnVjdCB2bWFf c2xvdCAqc2xvdCwgKml0ZXI7CisJc3RydWN0IG1tX3N0cnVjdCAqYnVzeV9tbTsKKwl1bnNpZ25l ZCBjaGFyIHJvdW5kX2ZpbmlzaGVkLCBhbGxfcnVuZ3NfZW10cHk7CisJaW50IGksIGVyciwgbW1z ZW1fYmF0Y2g7CisJdW5zaWduZWQgbG9uZyBwY29zdDsKKwlsb25nIGxvbmcgZGVsdGFfZXhlYzsK Kwl1bnNpZ25lZCBsb25nIHZwYWdlcywgbWF4X2NwdV9yYXRpbzsKKwl1bnNpZ25lZCBsb25nIGxv bmcgc3RhcnRfdGltZSwgZW5kX3RpbWUsIHNjYW5fdGltZTsKKwl1bnNpZ25lZCBpbnQgZXhwZWN0 ZWRfamlmZmllczsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwl2cGFnZXMgPSAwOworCisJc3RhcnRf dGltZSA9IHRhc2tfc2NoZWRfcnVudGltZShjdXJyZW50KTsKKwltYXhfY3B1X3JhdGlvID0gMDsK KwltbXNlbV9iYXRjaCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0laRTsp IHsKKwkJc3RydWN0IHNjYW5fcnVuZyAqcnVuZyA9ICZ1a3NtX3NjYW5fbGFkZGVyW2ldOworCQl1 bnNpZ25lZCBsb25nIHJhdGlvOworCQlpbnQgYnVzeV9yZXRyeTsKKworCQlpZiAoIXJ1bmctPnBh Z2VzX3RvX3NjYW4pIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFydW5n LT52bWFfcm9vdC5udW0pIHsKKwkJCXJ1bmctPnBhZ2VzX3RvX3NjYW4gPSAwOworCQkJaSsrOwor CQkJY29udGludWU7CisJCX0KKworCQlyYXRpbyA9IHJ1bmdfcmVhbF9yYXRpbyhydW5nLT5jcHVf cmF0aW8pOworCQlpZiAocmF0aW8gPiBtYXhfY3B1X3JhdGlvKQorCQkJbWF4X2NwdV9yYXRpbyA9 IHJhdGlvOworCisJCWJ1c3lfcmV0cnkgPSBCVVNZX1JFVFJZOworCQkvKgorCQkgKiBEbyBub3Qg Y29uc2lkZXIgcnVuZ19yb3VuZF9maW5pc2hlZCgpIGhlcmUsIGp1c3QgdXNlZCB1cCB0aGUKKwkJ ICogcnVuZy0+cGFnZXNfdG9fc2NhbiBxdW90YS4KKwkJICovCisJCXdoaWxlIChydW5nLT5wYWdl c190b19zY2FuICYmIHJ1bmctPnZtYV9yb290Lm51bSAmJgorCQkgICAgICAgbGlrZWx5KCFmcmVl emluZyhjdXJyZW50KSkpIHsKKwkJCWludCByZXNldCA9IDA7CisKKwkJCXNsb3QgPSBydW5nLT5j dXJyZW50X3NjYW47CisKKwkJCUJVR19PTih2bWFfZnVsbHlfc2Nhbm5lZChzbG90KSk7CisKKwkJ CWlmIChtbXNlbV9iYXRjaCkgeworCQkJCWVyciA9IDA7CisJCQl9IGVsc2UgeworCQkJCWVyciA9 IHRyeV9kb3duX3JlYWRfc2xvdF9tbWFwX3NlbShzbG90KTsKKwkJCX0KKworCQkJaWYgKGVyciA9 PSAtRU5PRU5UKSB7CitybV9zbG90OgorCQkJCXJ1bmdfcm1fc2xvdChzbG90KTsKKwkJCQljb250 aW51ZTsKKwkJCX0KKworCQkJYnVzeV9tbSA9IHNsb3QtPm1tOworCisJCQlpZiAoZXJyID09IC1F QlVTWSkgeworCQkJCS8qIHNraXAgb3RoZXIgdm1hcyBvbiB0aGUgc2FtZSBtbSAqLworCQkJCWRv IHsKKwkJCQkJcmVzZXQgPSBhZHZhbmNlX2N1cnJlbnRfc2NhbihydW5nKTsKKwkJCQkJaXRlciA9 IHJ1bmctPmN1cnJlbnRfc2NhbjsKKwkJCQkJYnVzeV9yZXRyeS0tOworCQkJCQlpZiAoaXRlci0+ dm1hLT52bV9tbSAhPSBidXN5X21tIHx8CisJCQkJCSAgICAhYnVzeV9yZXRyeSB8fCByZXNldCkK KwkJCQkJCWJyZWFrOworCQkJCX0gd2hpbGUgKDEpOworCisJCQkJaWYgKGl0ZXItPnZtYS0+dm1f bW0gIT0gYnVzeV9tbSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBz Y2FuIHJvdW5kIGZpbnNpc2hlZCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCUJV R19PTighdm1hX2Nhbl9lbnRlcihzbG90LT52bWEpKTsKKwkJCWlmICh1a3NtX3Rlc3RfZXhpdChz bG90LT52bWEtPnZtX21tKSkgeworCQkJCW1tc2VtX2JhdGNoID0gMDsKKwkJCQl1cF9yZWFkKCZz bG90LT52bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJCQkJZ290byBybV9zbG90OworCQkJfQorCisJ CQlpZiAobW1zZW1fYmF0Y2gpCisJCQkJbW1zZW1fYmF0Y2gtLTsKKwkJCWVsc2UKKwkJCQltbXNl bV9iYXRjaCA9IFVLU01fTU1TRU1fQkFUQ0g7CisKKwkJCS8qIE9rLCB3ZSBoYXZlIHRha2UgdGhl IG1tYXBfc2VtLCByZWFkeSB0byBzY2FuICovCisJCQlzY2FuX3ZtYV9vbmVfcGFnZShzbG90KTsK KwkJCXJ1bmctPnBhZ2VzX3RvX3NjYW4tLTsKKwkJCXZwYWdlcysrOworCisJCQlpZiAocnVuZy0+ Y3VycmVudF9vZmZzZXQgKyBydW5nLT5zdGVwID4gc2xvdC0+cGFnZXMgLSAxCisJCQkgICAgfHwg dm1hX2Z1bGx5X3NjYW5uZWQoc2xvdCkpIHsKKwkJCQl1cF9yZWFkKCZzbG90LT52bWEtPnZtX21t LT5tbWFwX3NlbSk7CisJCQkJanVkZ2Vfc2xvdChzbG90KTsKKwkJCQltbXNlbV9iYXRjaCA9IDA7 CisJCQl9IGVsc2UgeworCQkJCXJ1bmctPmN1cnJlbnRfb2Zmc2V0ICs9IHJ1bmctPnN0ZXA7CisJ CQkJaWYgKCFtbXNlbV9iYXRjaCkKKwkJCQkJdXBfcmVhZCgmc2xvdC0+dm1hLT52bV9tbS0+bW1h cF9zZW0pOworCQkJfQorCisJCQlidXN5X3JldHJ5ID0gQlVTWV9SRVRSWTsKKwkJCWNvbmRfcmVz Y2hlZCgpOworCQl9CisKKwkJaWYgKG1tc2VtX2JhdGNoKSB7CisJCQl1cF9yZWFkKCZzbG90LT52 bWEtPnZtX21tLT5tbWFwX3NlbSk7CisJCQltbXNlbV9iYXRjaCA9IDA7CisJCX0KKworCQlpZiAo ZnJlZXppbmcoY3VycmVudCkpCisJCQlicmVhazsKKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJ ZW5kX3RpbWUgPSB0YXNrX3NjaGVkX3J1bnRpbWUoY3VycmVudCk7CisJZGVsdGFfZXhlYyA9IGVu ZF90aW1lIC0gc3RhcnRfdGltZTsKKworCWlmIChmcmVlemluZyhjdXJyZW50KSkKKwkJcmV0dXJu OworCisJY2xlYW51cF92bWFfc2xvdHMoKTsKKwl1a3NtX2VudGVyX2FsbF9zbG90cygpOworCisJ cm91bmRfZmluaXNoZWQgPSAxOworCWFsbF9ydW5nc19lbXRweSA9IDE7CisJZm9yIChpID0gMDsg aSA8IFNDQU5fTEFEREVSX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2Nhbl9ydW5nICpydW5nID0g JnVrc21fc2Nhbl9sYWRkZXJbaV07CisKKwkJaWYgKHJ1bmctPnZtYV9yb290Lm51bSkgeworCQkJ YWxsX3J1bmdzX2VtdHB5ID0gMDsKKwkJCWlmICghcnVuZ19yb3VuZF9maW5pc2hlZChydW5nKSkK KwkJCQlyb3VuZF9maW5pc2hlZCA9IDA7CisJCX0KKwl9CisKKwlpZiAoYWxsX3J1bmdzX2VtdHB5 KQorCQlyb3VuZF9maW5pc2hlZCA9IDA7CisKKwlpZiAocm91bmRfZmluaXNoZWQpIHsKKwkJcm91 bmRfdXBkYXRlX2xhZGRlcigpOworCQl1a3NtX2V2YWxfcm91bmQrKzsKKworCQlpZiAoaGFzaF9y b3VuZF9maW5pc2hlZCgpICYmIHJzaGFzaF9hZGp1c3QoKSkgeworCQkJLyogUmVzZXQgdGhlIHVu c3RhYmxlIHJvb3QgaWZmIGhhc2ggc3RyZW5ndGggY2hhbmdlZCAqLworCQkJdWtzbV9oYXNoX3Jv dW5kKys7CisJCQlyb290X3Vuc3RhYmxlX3RyZWUgPSBSQl9ST09UOworCQkJZnJlZV9hbGxfdHJl ZV9ub2RlcygmdW5zdGFibGVfdHJlZV9ub2RlX2xpc3QpOworCQl9CisKKwkJLyoKKwkJICogQSBu dW1iZXIgb2YgcGFnZXMgY2FuIGhhbmcgYXJvdW5kIGluZGVmaW5pdGVseSBvbiBwZXItY3B1CisJ CSAqIHBhZ2V2ZWNzLCByYWlzZWQgcGFnZSBjb3VudCBwcmV2ZW50aW5nIHdyaXRlX3Byb3RlY3Rf cGFnZQorCQkgKiBmcm9tIG1lcmdpbmcgdGhlbS4gIFRob3VnaCBpdCBkb2Vzbid0IHJlYWxseSBt YXR0ZXIgbXVjaCwKKwkJICogaXQgaXMgcHV6emxpbmcgdG8gc2VlIHNvbWUgc3R1Y2sgaW4gcGFn ZXNfdm9sYXRpbGUgdW50aWwKKwkJICogb3RoZXIgYWN0aXZpdHkgam9zdGxlcyB0aGVtIG91dCwg YW5kIHRoZXkgYWxzbyBwcmV2ZW50ZWQKKwkJICogTFRQJ3MgS1NNIHRlc3QgZnJvbSBzdWNjZWVk aW5nIGRldGVybWluaXN0aWNhbGx5OyBzbyBkcmFpbgorCQkgKiB0aGVtIGhlcmUgKGhlcmUgcmF0 aGVyIHRoYW4gb24gZW50cnkgdG8gdWtzbV9kb19zY2FuKCksCisJCSAqIHNvIHdlIGRvbid0IElQ SSB0b28gb2Z0ZW4gd2hlbiBwYWdlc190b19zY2FuIGlzIHNldCBsb3cpLgorCQkgKi8KKwkJbHJ1 X2FkZF9kcmFpbl9hbGwoKTsKKwl9CisKKworCWlmICh2cGFnZXMgJiYgZGVsdGFfZXhlYyA+IDAp IHsKKwkJcGNvc3QgPSAodW5zaWduZWQgbG9uZykgZGVsdGFfZXhlYyAvIHZwYWdlczsKKwkJaWYg KGxpa2VseSh1a3NtX2VtYV9wYWdlX3RpbWUpKQorCQkJdWtzbV9lbWFfcGFnZV90aW1lID0gZW1h KHBjb3N0LCB1a3NtX2VtYV9wYWdlX3RpbWUpOworCQllbHNlCisJCQl1a3NtX2VtYV9wYWdlX3Rp bWUgPSBwY29zdDsKKwl9CisKKwl1a3NtX2NhbGNfc2Nhbl9wYWdlcygpOworCXVrc21fc2xlZXBf cmVhbCA9IHVrc21fc2xlZXBfamlmZmllczsKKwkvKiBpbiBjYXNlIG9mIHJhZGljYWwgY3B1IGJ1 cnN0cywgYXBwbHkgdGhlIHVwcGVyIGJvdW5kICovCisJZW5kX3RpbWUgPSB0YXNrX3NjaGVkX3J1 bnRpbWUoY3VycmVudCk7CisJaWYgKG1heF9jcHVfcmF0aW8gJiYgZW5kX3RpbWUgPiBzdGFydF90 aW1lKSB7CisJCXNjYW5fdGltZSA9IGVuZF90aW1lIC0gc3RhcnRfdGltZTsKKwkJZXhwZWN0ZWRf amlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXMoCisJCQlzY2FuX3RpbWVfdG9fc2xlZXAoc2Nhbl90 aW1lLCBtYXhfY3B1X3JhdGlvKSk7CisKKwkJaWYgKGV4cGVjdGVkX2ppZmZpZXMgPiB1a3NtX3Ns ZWVwX3JlYWwpCisJCQl1a3NtX3NsZWVwX3JlYWwgPSBleHBlY3RlZF9qaWZmaWVzOworCisJCS8q IFdlIGhhdmUgYSAxIHNlY29uZCB1cCBib3VuZCBmb3IgcmVzcG9uc2l2ZW5lc3MuICovCisJCWlm IChqaWZmaWVzX3RvX21zZWNzKHVrc21fc2xlZXBfcmVhbCkgPiBNU0VDX1BFUl9TRUMpCisJCQl1 a3NtX3NsZWVwX3JlYWwgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCX0KKworCXJldHVybjsK K30KKworc3RhdGljIGludCBrc21kX3Nob3VsZF9ydW4odm9pZCkKK3sKKwlyZXR1cm4gdWtzbV9y dW4gJiBVS1NNX1JVTl9NRVJHRTsKK30KKworc3RhdGljIGludCB1a3NtX3NjYW5fdGhyZWFkKHZv aWQgKm5vdGhpbmcpCit7CisJc2V0X2ZyZWV6YWJsZSgpOworCXNldF91c2VyX25pY2UoY3VycmVu dCwgNSk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltdXRleF9sb2Nr KCZ1a3NtX3RocmVhZF9tdXRleCk7CisJCWlmIChrc21kX3Nob3VsZF9ydW4oKSkgeworCQkJdWtz bV9kb19zY2FuKCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZ1a3NtX3RocmVhZF9tdXRleCk7CisK KwkJdHJ5X3RvX2ZyZWV6ZSgpOworCisJCWlmIChrc21kX3Nob3VsZF9ydW4oKSkgeworCQkJc2No ZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHVrc21fc2xlZXBfcmVhbCk7CisJCQl1a3NtX3Ns ZWVwX3RpbWVzKys7CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZSh1a3NtX3Ro cmVhZF93YWl0LAorCQkJCWtzbWRfc2hvdWxkX3J1bigpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3Ao KSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBybWFwX3dhbGtfa3NtKHN0cnVjdCBw YWdlICpwYWdlLCBzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgKnJ3YykKK3sKKwlzdHJ1Y3Qgc3Rh YmxlX25vZGUgKnN0YWJsZV9ub2RlOworCXN0cnVjdCBub2RlX3ZtYSAqbm9kZV92bWE7CisJc3Ry dWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtOworCWludCByZXQgPSBTV0FQX0FHQUlOOworCWludCBz ZWFyY2hfbmV3X2ZvcmtzID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlWTV9CVUdf T05fUEFHRSghUGFnZUtzbShwYWdlKSwgcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2Nr ZWQocGFnZSksIHBhZ2UpOworCisJc3RhYmxlX25vZGUgPSBwYWdlX3N0YWJsZV9ub2RlKHBhZ2Up OworCWlmICghc3RhYmxlX25vZGUpCisJCXJldHVybiByZXQ7CithZ2FpbjoKKwlobGlzdF9mb3Jf ZWFjaF9lbnRyeShub2RlX3ZtYSwgJnN0YWJsZV9ub2RlLT5obGlzdCwgaGxpc3QpIHsKKwkJaGxp c3RfZm9yX2VhY2hfZW50cnkocm1hcF9pdGVtLCAmbm9kZV92bWEtPnJtYXBfaGxpc3QsIGhsaXN0 KSB7CisJCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gcm1hcF9pdGVtLT5hbm9uX3ZtYTsK KwkJCXN0cnVjdCBhbm9uX3ZtYV9jaGFpbiAqdm1hYzsKKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hOworCisJCQlhbm9uX3ZtYV9sb2NrX3JlYWQoYW5vbl92bWEpOworCQkJYW5vbl92bWFf aW50ZXJ2YWxfdHJlZV9mb3JlYWNoKHZtYWMsICZhbm9uX3ZtYS0+cmJfcm9vdCwKKwkJCQkJCSAg ICAgICAwLCBVTE9OR19NQVgpIHsKKwkJCQl2bWEgPSB2bWFjLT52bWE7CisJCQkJYWRkcmVzcyA9 IGdldF9ybWFwX2FkZHIocm1hcF9pdGVtKTsKKworCQkJCWlmIChhZGRyZXNzIDwgdm1hLT52bV9z dGFydCB8fAorCQkJCSAgICBhZGRyZXNzID49IHZtYS0+dm1fZW5kKQorCQkJCQljb250aW51ZTsK KworCQkJCWlmICgocm1hcF9pdGVtLT5zbG90LT52bWEgPT0gdm1hKSA9PQorCQkJCSAgICBzZWFy Y2hfbmV3X2ZvcmtzKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChyd2MtPmludmFsaWRfdm1h ICYmIHJ3Yy0+aW52YWxpZF92bWEodm1hLCByd2MtPmFyZykpCisJCQkJCWNvbnRpbnVlOworCisJ CQkJcmV0ID0gcndjLT5ybWFwX29uZShwYWdlLCB2bWEsIGFkZHJlc3MsIHJ3Yy0+YXJnKTsKKwkJ CQlpZiAocmV0ICE9IFNXQVBfQUdBSU4pIHsKKwkJCQkJYW5vbl92bWFfdW5sb2NrX3JlYWQoYW5v bl92bWEpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlpZiAocndjLT5kb25lICYmIHJ3 Yy0+ZG9uZShwYWdlKSkgeworCQkJCQlhbm9uX3ZtYV91bmxvY2tfcmVhZChhbm9uX3ZtYSk7CisJ CQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KKwkJCWFub25fdm1hX3VubG9ja19yZWFkKGFub25f dm1hKTsKKwkJfQorCX0KKwlpZiAoIXNlYXJjaF9uZXdfZm9ya3MrKykKKwkJZ290byBhZ2FpbjsK K291dDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorLyogQ29t bW9uIGtzbSBpbnRlcmZhY2UgYnV0IG1heSBiZSBzcGVjaWZpYyB0byB1a3NtICovCit2b2lkIGtz bV9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpvbGRwYWdl KQoreworCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwlWTV9CVUdfT05fUEFH RSghUGFnZUxvY2tlZChvbGRwYWdlKSwgb2xkcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VM b2NrZWQobmV3cGFnZSksIG5ld3BhZ2UpOworCVZNX0JVR19PTihuZXdwYWdlLT5tYXBwaW5nICE9 IG9sZHBhZ2UtPm1hcHBpbmcpOworCisJc3RhYmxlX25vZGUgPSBwYWdlX3N0YWJsZV9ub2RlKG5l d3BhZ2UpOworCWlmIChzdGFibGVfbm9kZSkgeworCQlWTV9CVUdfT04oc3RhYmxlX25vZGUtPmtw Zm4gIT0gcGFnZV90b19wZm4ob2xkcGFnZSkpOworCQlzdGFibGVfbm9kZS0+a3BmbiA9IHBhZ2Vf dG9fcGZuKG5ld3BhZ2UpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfTUlHUkFUSU9OICovCisK KyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorc3RhdGljIHN0cnVjdCBzdGFibGVfbm9k ZSAqdWtzbV9jaGVja19zdGFibGVfdHJlZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQkJ CSB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlm b3IgKG5vZGUgPSByYl9maXJzdChyb290X3N0YWJsZV90cmVlcCk7IG5vZGU7IG5vZGUgPSByYl9u ZXh0KG5vZGUpKSB7CisJCXN0cnVjdCBzdGFibGVfbm9kZSAqc3RhYmxlX25vZGU7CisKKwkJc3Rh YmxlX25vZGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3RhYmxlX25vZGUsIG5vZGUpOworCQlp ZiAoc3RhYmxlX25vZGUtPmtwZm4gPj0gc3RhcnRfcGZuICYmCisJCSAgICBzdGFibGVfbm9kZS0+ a3BmbiA8IGVuZF9wZm4pCisJCQlyZXR1cm4gc3RhYmxlX25vZGU7CisJfQorCXJldHVybiBOVUxM OworfQorCitzdGF0aWMgaW50IHVrc21fbWVtb3J5X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9i bG9jayAqc2VsZiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqYXJnKQor eworCXN0cnVjdCBtZW1vcnlfbm90aWZ5ICptbiA9IGFyZzsKKwlzdHJ1Y3Qgc3RhYmxlX25vZGUg KnN0YWJsZV9ub2RlOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIE1FTV9HT0lOR19PRkZM SU5FOgorCQkvKgorCQkgKiBLZWVwIGl0IHZlcnkgc2ltcGxlIGZvciBub3c6IGp1c3QgbG9jayBv dXQga3NtZCBhbmQKKwkJICogTUFEVl9VTk1FUkdFQUJMRSB3aGlsZSBhbnkgbWVtb3J5IGlzIGdv aW5nIG9mZmxpbmUuCisJCSAqIG11dGV4X2xvY2tfbmVzdGVkKCkgaXMgbmVjZXNzYXJ5IGJlY2F1 c2UgbG9ja2RlcCB3YXMgYWxhcm1lZAorCQkgKiB0aGF0IGhlcmUgd2UgdGFrZSB1a3NtX3RocmVh ZF9tdXRleCBpbnNpZGUgbm90aWZpZXIgY2hhaW4KKwkJICogbXV0ZXgsIGFuZCBsYXRlciB0YWtl IG5vdGlmaWVyIGNoYWluIG11dGV4IGluc2lkZQorCQkgKiB1a3NtX3RocmVhZF9tdXRleCB0byB1 bmxvY2sgaXQuICAgQnV0IHRoYXQncyBzYWZlIGJlY2F1c2UgYm90aAorCQkgKiBhcmUgaW5zaWRl IG1lbV9ob3RwbHVnX211dGV4LgorCQkgKi8KKwkJbXV0ZXhfbG9ja19uZXN0ZWQoJnVrc21fdGhy ZWFkX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJCWJyZWFrOworCisJY2FzZSBNRU1f T0ZGTElORToKKwkJLyoKKwkJICogTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGJ5IHBhZ2UgbWln cmF0aW9uOyBidXQgdGhlcmUgbWlnaHQKKwkJICogYmUgYSBmZXcgc3RhYmxlX25vZGVzIGxlZnQg b3Zlciwgc3RpbGwgcG9pbnRpbmcgdG8gc3RydWN0CisJCSAqIHBhZ2VzIHdoaWNoIGhhdmUgYmVl biBvZmZsaW5lZDogcHJ1bmUgdGhvc2UgZnJvbSB0aGUgdHJlZS4KKwkJICovCisJCXdoaWxlICgo c3RhYmxlX25vZGUgPSB1a3NtX2NoZWNrX3N0YWJsZV90cmVlKG1uLT5zdGFydF9wZm4sCisJCQkJ CW1uLT5zdGFydF9wZm4gKyBtbi0+bnJfcGFnZXMpKSAhPSBOVUxMKQorCQkJcmVtb3ZlX25vZGVf ZnJvbV9zdGFibGVfdHJlZShzdGFibGVfbm9kZSwgMSwgMSk7CisJCS8qIGZhbGx0aHJvdWdoICov CisKKwljYXNlIE1FTV9DQU5DRUxfT0ZGTElORToKKwkJbXV0ZXhfdW5sb2NrKCZ1a3NtX3RocmVh ZF9tdXRleCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmIC8q IENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovCisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKy8qCisg KiBUaGlzIGFsbCBjb21waWxlcyB3aXRob3V0IENPTkZJR19TWVNGUywgYnV0IGlzIGEgd2FzdGUg b2Ygc3BhY2UuCisgKi8KKworI2RlZmluZSBVS1NNX0FUVFJfUk8oX25hbWUpIFwKKwlzdGF0aWMg c3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKKyNk ZWZpbmUgVUtTTV9BVFRSKF9uYW1lKSBcCisJc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBf bmFtZSMjX2F0dHIgPSBcCisJCV9fQVRUUihfbmFtZSwgMDY0NCwgX25hbWUjI19zaG93LCBfbmFt ZSMjX3N0b3JlKQorCitzdGF0aWMgc3NpemVfdCBtYXhfY3B1X3BlcmNlbnRhZ2Vfc2hvdyhzdHJ1 Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBj aGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHVrc21fbWF4X2NwdV9w ZXJjZW50YWdlKTsKK30KKworc3RhdGljIHNzaXplX3QgbWF4X2NwdV9wZXJjZW50YWdlX3N0b3Jl KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICph dHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWdu ZWQgbG9uZyBtYXhfY3B1X3BlcmNlbnRhZ2U7CisJaW50IGVycjsKKworCWVyciA9IHN0cmljdF9z dHJ0b3VsKGJ1ZiwgMTAsICZtYXhfY3B1X3BlcmNlbnRhZ2UpOworCWlmIChlcnIgfHwgbWF4X2Nw dV9wZXJjZW50YWdlID4gMTAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXhfY3B1X3Bl cmNlbnRhZ2UgPT0gMTAwKQorCQltYXhfY3B1X3BlcmNlbnRhZ2UgPSA5OTsKKwllbHNlIGlmICht YXhfY3B1X3BlcmNlbnRhZ2UgPCAxMCkKKwkJbWF4X2NwdV9wZXJjZW50YWdlID0gMTA7CisKKwl1 a3NtX21heF9jcHVfcGVyY2VudGFnZSA9IG1heF9jcHVfcGVyY2VudGFnZTsKKworCXJldHVybiBj b3VudDsKK30KK1VLU01fQVRUUihtYXhfY3B1X3BlcmNlbnRhZ2UpOworCitzdGF0aWMgc3NpemVf dCBzbGVlcF9taWxsaXNlY3Nfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3Ry dWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYo YnVmLCAiJXVcbiIsIGppZmZpZXNfdG9fbXNlY3ModWtzbV9zbGVlcF9qaWZmaWVzKSk7Cit9CisK K3N0YXRpYyBzc2l6ZV90IHNsZWVwX21pbGxpc2Vjc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29i aiwKKwkJCQkgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0 IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgbXNlY3M7CisJaW50 IGVycjsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZtc2Vjcyk7CisJaWYgKGVy ciB8fCBtc2VjcyA+IE1TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1a3NtX3Ns ZWVwX2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKG1zZWNzKTsKKwl1a3NtX3NsZWVwX3NhdmVk ID0gdWtzbV9zbGVlcF9qaWZmaWVzOworCisJcmV0dXJuIGNvdW50OworfQorVUtTTV9BVFRSKHNs ZWVwX21pbGxpc2Vjcyk7CisKKworc3RhdGljIHNzaXplX3QgY3B1X2dvdmVybm9yX3Nob3coc3Ry dWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNo YXIgKmJ1ZikKK3sKKwlpbnQgbiA9IHNpemVvZih1a3NtX2NwdV9nb3Zlcm5vcl9zdHIpIC8gc2l6 ZW9mKGNoYXIgKik7CisJaW50IGk7CisKKwlidWZbMF0gPSAnXDAnOworCWZvciAoaSA9IDA7IGkg PCBuIDsgaSsrKSB7CisJCWlmICh1a3NtX2NwdV9nb3Zlcm5vciA9PSBpKQorCQkJc3RyY2F0KGJ1 ZiwgIlsiKTsKKworCQlzdHJjYXQoYnVmLCB1a3NtX2NwdV9nb3Zlcm5vcl9zdHJbaV0pOworCisJ CWlmICh1a3NtX2NwdV9nb3Zlcm5vciA9PSBpKQorCQkJc3RyY2F0KGJ1ZiwgIl0iKTsKKworCQlz dHJjYXQoYnVmLCAiICIpOworCX0KKwlzdHJjYXQoYnVmLCAiXG4iKTsKKworCXJldHVybiBzdHJs ZW4oYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcGVyZm9ybWFuY2VfdmFsdWVz KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKwlzdHJ1Y3QgdWtz bV9jcHVfcHJlc2V0X3MgKnByZXNldCA9IHVrc21fY3B1X3ByZXNldCArIHVrc21fY3B1X2dvdmVy bm9yOworCisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0laRTsgaSsrKSB7CisJCXJ1 bmcgPSB1a3NtX3NjYW5fbGFkZGVyICsgaTsKKwkJcnVuZy0+Y3B1X3JhdGlvID0gcHJlc2V0LT5j cHVfcmF0aW9baV07CisJCXJ1bmctPmNvdmVyX21zZWNzID0gcHJlc2V0LT5jb3Zlcl9tc2Vjc1tp XTsKKwl9CisKKwl1a3NtX21heF9jcHVfcGVyY2VudGFnZSA9IHByZXNldC0+bWF4X2NwdTsKK30K Kworc3RhdGljIHNzaXplX3QgY3B1X2dvdmVybm9yX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2Jq LAorCQkJCSAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFy ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbiA9IHNpemVvZih1a3NtX2NwdV9nb3Zlcm5v cl9zdHIpIC8gc2l6ZW9mKGNoYXIgKik7CisKKwlmb3IgKG4tLTsgbiA+PTAgOyBuLS0pIHsKKwkJ aWYgKCFzdHJuY21wKGJ1ZiwgdWtzbV9jcHVfZ292ZXJub3Jfc3RyW25dLAorCQkJICAgICBzdHJs ZW4odWtzbV9jcHVfZ292ZXJub3Jfc3RyW25dKSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAobiA8 IDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UKKwkJdWtzbV9jcHVfZ292ZXJub3IgPSBuOwor CisJaW5pdF9wZXJmb3JtYW5jZV92YWx1ZXMoKTsKKworCXJldHVybiBjb3VudDsKK30KK1VLU01f QVRUUihjcHVfZ292ZXJub3IpOworCitzdGF0aWMgc3NpemVfdCBydW5fc2hvdyhzdHJ1Y3Qga29i amVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQor eworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB1a3NtX3J1bik7Cit9CisKK3N0YXRpYyBz c2l6ZV90IHJ1bl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmli dXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBl cnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1Ziwg MTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IFVJTlRfTUFYKQorCQlyZXR1cm4gLUVJ TlZBTDsKKwlpZiAoZmxhZ3MgPiBVS1NNX1JVTl9NRVJHRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwltdXRleF9sb2NrKCZ1a3NtX3RocmVhZF9tdXRleCk7CisJaWYgKHVrc21fcnVuICE9IGZsYWdz KSB7CisJCXVrc21fcnVuID0gZmxhZ3M7CisJfQorCW11dGV4X3VubG9jaygmdWtzbV90aHJlYWRf bXV0ZXgpOworCisJaWYgKGZsYWdzICYgVUtTTV9SVU5fTUVSR0UpCisJCXdha2VfdXBfaW50ZXJy dXB0aWJsZSgmdWtzbV90aHJlYWRfd2FpdCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitVS1NNX0FU VFIocnVuKTsKKworc3RhdGljIHNzaXplX3QgYWJ1bmRhbnRfdGhyZXNob2xkX3Nob3coc3RydWN0 IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNo YXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdWtzbV9hYnVuZGFudF90 aHJlc2hvbGQpOworfQorCitzdGF0aWMgc3NpemVfdCBhYnVuZGFudF90aHJlc2hvbGRfc3RvcmUo c3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICph dHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBl cnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1Ziwg MTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IDk5KQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXVrc21fYWJ1bmRhbnRfdGhyZXNob2xkID0gZmxhZ3M7CisKKwlyZXR1cm4gY291bnQ7Cit9 CitVS1NNX0FUVFIoYWJ1bmRhbnRfdGhyZXNob2xkKTsKKworc3RhdGljIHNzaXplX3QgdGhyYXNo X3RocmVzaG9sZF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGtv YmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAi JXVcbiIsIHVrc21fdGhyYXNoX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRocmFz aF90aHJlc2hvbGRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgc3RydWN0 IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90 IGNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVyciA9IHN0 cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZmbGFncyk7CisJaWYgKGVyciB8fCBmbGFncyA+IDk5KQor CQlyZXR1cm4gLUVJTlZBTDsKKworCXVrc21fdGhyYXNoX3RocmVzaG9sZCA9IGZsYWdzOworCisJ cmV0dXJuIGNvdW50OworfQorVUtTTV9BVFRSKHRocmFzaF90aHJlc2hvbGQpOworCitzdGF0aWMg c3NpemVfdCBjcHVfcmF0aW9zX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAg c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGksIHNpemU7 CisJc3RydWN0IHNjYW5fcnVuZyAqcnVuZzsKKwljaGFyICpwID0gYnVmOworCisJZm9yIChpID0g MDsgaSA8IFNDQU5fTEFEREVSX1NJWkU7IGkrKykgeworCQlydW5nID0gJnVrc21fc2Nhbl9sYWRk ZXJbaV07CisKKwkJaWYgKHJ1bmctPmNwdV9yYXRpbyA+IDApCisJCQlzaXplID0gc3ByaW50Zihw LCAiJWQgIiwgcnVuZy0+Y3B1X3JhdGlvKTsKKwkJZWxzZQorCQkJc2l6ZSA9IHNwcmludGYocCwg Ik1BWC8lZCAiLAorCQkJCQlUSU1FX1JBVElPX1NDQUxFIC8gLXJ1bmctPmNwdV9yYXRpbyk7CisK KwkJcCArPSBzaXplOworCX0KKworCSpwKysgPSAnXG4nOworCSpwID0gJ1wwJzsKKworCXJldHVy biBwIC0gYnVmOworfQorCitzdGF0aWMgc3NpemVfdCBjcHVfcmF0aW9zX3N0b3JlKHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJ CQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaSwgY3B1cmF0 aW9zW1NDQU5fTEFEREVSX1NJWkVdLCBlcnI7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlzdHJ1 Y3Qgc2Nhbl9ydW5nICpydW5nOworCWNoYXIgKnAsICplbmQgPSBOVUxMOworCisJcCA9IGt6YWxs b2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlt ZW1jcHkocCwgYnVmLCBjb3VudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJfU0la RTsgaSsrKSB7CisJCWlmIChpICE9IFNDQU5fTEFEREVSX1NJWkUgLTEpIHsKKwkJCWVuZCA9IHN0 cmNocihwLCAnICcpOworCQkJaWYgKCFlbmQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCSpl bmQgPSAnXDAnOworCQl9CisKKwkJaWYgKHN0cnN0cihwLCAiTUFYLyIpKSB7CisJCQlwID0gc3Ry Y2hyKHAsICcvJykgKyAxOworCQkJZXJyID0gc3RyaWN0X3N0cnRvdWwocCwgMTAsICZ2YWx1ZSk7 CisJCQlpZiAoZXJyIHx8IHZhbHVlID4gVElNRV9SQVRJT19TQ0FMRSB8fCAhdmFsdWUpCisJCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJCWNwdXJhdGlvc1tpXSA9IC0gKGludCkgKFRJTUVfUkFUSU9f U0NBTEUgLyB2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBzdHJpY3Rfc3RydG91bChwLCAx MCwgJnZhbHVlKTsKKwkJCWlmIChlcnIgfHwgdmFsdWUgPiBUSU1FX1JBVElPX1NDQUxFIHx8ICF2 YWx1ZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY3B1cmF0aW9zW2ldID0gdmFsdWU7CisJ CX0KKworCQlwID0gZW5kICsgMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRlcltpXTsKKworCQlydW5nLT5j cHVfcmF0aW8gPSBjcHVyYXRpb3NbaV07CisJfQorCisJcmV0dXJuIGNvdW50OworfQorVUtTTV9B VFRSKGNwdV9yYXRpb3MpOworCitzdGF0aWMgc3NpemVfdCBldmFsX2ludGVydmFsc19zaG93KHN0 cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0 ciwgY2hhciAqYnVmKQoreworCWludCBpLCBzaXplOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7 CisJY2hhciAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0FOX0xBRERFUl9TSVpFOyBp KyspIHsKKwkJcnVuZyA9ICZ1a3NtX3NjYW5fbGFkZGVyW2ldOworCQlzaXplID0gc3ByaW50Zihw LCAiJXUgIiwgcnVuZy0+Y292ZXJfbXNlY3MpOworCQlwICs9IHNpemU7CisJfQorCisJKnArKyA9 ICdcbic7CisJKnAgPSAnXDAnOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6 ZV90IGV2YWxfaW50ZXJ2YWxzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAg IHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjb25zdCBjaGFyICpidWYs IHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaSwgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsdWVzW1ND QU5fTEFEREVSX1NJWkVdOworCXN0cnVjdCBzY2FuX3J1bmcgKnJ1bmc7CisJY2hhciAqcCwgKmVu ZCA9IE5VTEw7CisKKwlwID0ga3phbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQor CQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShwLCBidWYsIGNvdW50KTsKKworCWZvciAoaSA9 IDA7IGkgPCBTQ0FOX0xBRERFUl9TSVpFOyBpKyspIHsKKwkJaWYgKGkgIT0gU0NBTl9MQURERVJf U0laRSAtMSkgeworCQkJZW5kID0gc3RyY2hyKHAsICcgJyk7CisJCQlpZiAoIWVuZCkKKwkJCQly ZXR1cm4gLUVJTlZBTDsKKworCQkJKmVuZCA9ICdcMCc7CisJCX0KKworCQllcnIgPSBzdHJpY3Rf c3RydG91bChwLCAxMCwgJnZhbHVlc1tpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVJTlZB TDsKKworCQlwID0gZW5kICsgMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0NBTl9MQURERVJf U0laRTsgaSsrKSB7CisJCXJ1bmcgPSAmdWtzbV9zY2FuX2xhZGRlcltpXTsKKworCQlydW5nLT5j b3Zlcl9tc2VjcyA9IHZhbHVlc1tpXTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitVS1NNX0FU VFIoZXZhbF9pbnRlcnZhbHMpOworCitzdGF0aWMgc3NpemVfdCBlbWFfcGVyX3BhZ2VfdGltZV9z aG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0 dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHVrc21fZW1h X3BhZ2VfdGltZSk7Cit9CitVS1NNX0FUVFJfUk8oZW1hX3Blcl9wYWdlX3RpbWUpOworCitzdGF0 aWMgc3NpemVfdCBwYWdlc19zaGFyZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkg c3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJWx1XG4iLCB1a3NtX3BhZ2VzX3NoYXJlZCk7Cit9CitVS1NNX0FUVFJfUk8ocGFn ZXNfc2hhcmVkKTsKKworc3RhdGljIHNzaXplX3QgcGFnZXNfc2hhcmluZ19zaG93KHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCB1a3NtX3BhZ2VzX3NoYXJpbmcp OworfQorVUtTTV9BVFRSX1JPKHBhZ2VzX3NoYXJpbmcpOworCitzdGF0aWMgc3NpemVfdCBwYWdl c191bnNoYXJlZF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgIHN0cnVjdCBrb2Jq X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVs dVxuIiwgdWtzbV9wYWdlc191bnNoYXJlZCk7Cit9CitVS1NNX0FUVFJfUk8ocGFnZXNfdW5zaGFy ZWQpOworCitzdGF0aWMgc3NpemVfdCBmdWxsX3NjYW5zX3Nob3coc3RydWN0IGtvYmplY3QgKmtv YmosCisJCQkgICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7 CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwgZnVsbHlfc2Nhbm5lZF9yb3VuZCk7Cit9 CitVS1NNX0FUVFJfUk8oZnVsbF9zY2Fucyk7CisKK3N0YXRpYyBzc2l6ZV90IHBhZ2VzX3NjYW5u ZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0 ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IDA7CisJdTY0IGRl bHRhLCByZXQ7CisKKwlpZiAocGFnZXNfc2Nhbm5lZF9zdG9yZWQpIHsKKwkJYmFzZSA9IHBhZ2Vz X3NjYW5uZWRfYmFzZTsKKwkJcmV0ID0gcGFnZXNfc2Nhbm5lZF9zdG9yZWQ7CisJCWRlbHRhID0g dWtzbV9wYWdlc19zY2FubmVkID4+IGJhc2U7CisJCWlmIChDQU5fT1ZFUkZMT1dfVTY0KHJldCwg ZGVsdGEpKSB7CisJCQlyZXQgPj49IDE7CisJCQlkZWx0YSA+Pj0gMTsKKwkJCWJhc2UrKzsKKwkJ CXJldCArPSBkZWx0YTsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHVrc21fcGFnZXNfc2Nhbm5l ZDsKKwl9CisKKwl3aGlsZSAocmV0ID4gVUxPTkdfTUFYKSB7CisJCXJldCA+Pj0gMTsKKwkJYmFz ZSsrOworCX0KKworCWlmIChiYXNlKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHUgKiAyXiVs dVxuIiwgKHVuc2lnbmVkIGxvbmcpcmV0LCBiYXNlKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRm KGJ1ZiwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpcmV0KTsKK30KK1VLU01fQVRUUl9STyhwYWdl c19zY2FubmVkKTsKKworc3RhdGljIHNzaXplX3QgaGFzaF9zdHJlbmd0aF9zaG93KHN0cnVjdCBr b2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBoYXNoX3N0cmVuZ3RoKTsKK30K K1VLU01fQVRUUl9STyhoYXNoX3N0cmVuZ3RoKTsKKworc3RhdGljIHNzaXplX3Qgc2xlZXBfdGlt ZXNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0 ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIHVr c21fc2xlZXBfdGltZXMpOworfQorVUtTTV9BVFRSX1JPKHNsZWVwX3RpbWVzKTsKKworCitzdGF0 aWMgc3RydWN0IGF0dHJpYnV0ZSAqdWtzbV9hdHRyc1tdID0geworCSZtYXhfY3B1X3BlcmNlbnRh Z2VfYXR0ci5hdHRyLAorCSZzbGVlcF9taWxsaXNlY3NfYXR0ci5hdHRyLAorCSZjcHVfZ292ZXJu b3JfYXR0ci5hdHRyLAorCSZydW5fYXR0ci5hdHRyLAorCSZlbWFfcGVyX3BhZ2VfdGltZV9hdHRy LmF0dHIsCisJJnBhZ2VzX3NoYXJlZF9hdHRyLmF0dHIsCisJJnBhZ2VzX3NoYXJpbmdfYXR0ci5h dHRyLAorCSZwYWdlc191bnNoYXJlZF9hdHRyLmF0dHIsCisJJmZ1bGxfc2NhbnNfYXR0ci5hdHRy LAorCSZwYWdlc19zY2FubmVkX2F0dHIuYXR0ciwKKwkmaGFzaF9zdHJlbmd0aF9hdHRyLmF0dHIs CisJJnNsZWVwX3RpbWVzX2F0dHIuYXR0ciwKKwkmdGhyYXNoX3RocmVzaG9sZF9hdHRyLmF0dHIs CisJJmFidW5kYW50X3RocmVzaG9sZF9hdHRyLmF0dHIsCisJJmNwdV9yYXRpb3NfYXR0ci5hdHRy LAorCSZldmFsX2ludGVydmFsc19hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1 Y3QgYXR0cmlidXRlX2dyb3VwIHVrc21fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB1a3NtX2F0 dHJzLAorCS5uYW1lID0gInVrc20iLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KKwor c3RhdGljIGlubGluZSB2b2lkIGluaXRfc2Nhbl9sYWRkZXIodm9pZCkKK3sKKwlpbnQgaTsKKwlz dHJ1Y3Qgc2Nhbl9ydW5nICpydW5nOworCisJZm9yIChpID0gMDsgaSA8IFNDQU5fTEFEREVSX1NJ WkU7IGkrKykgeworCQlydW5nID0gdWtzbV9zY2FuX2xhZGRlciArIGk7CisJCXNsb3RfdHJlZV9p bml0X3Jvb3QoJnJ1bmctPnZtYV9yb290KTsKKwl9CisKKwlpbml0X3BlcmZvcm1hbmNlX3ZhbHVl cygpOworCXVrc21fY2FsY19zY2FuX3BhZ2VzKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNh bF9wb3NpdGl2ZV9uZWdhdGl2ZV9jb3N0cyh2b2lkKQoreworCXN0cnVjdCBwYWdlICpwMSwgKnAy OworCXVuc2lnbmVkIGNoYXIgKmFkZHIxLCAqYWRkcjI7CisJdW5zaWduZWQgbG9uZyBpLCB0aW1l X3N0YXJ0LCBoYXNoX2Nvc3Q7CisJdW5zaWduZWQgbG9uZyBsb29wbnVtID0gMDsKKworCS8qSU1Q T1JUQU5UOiB2b2xhdGlsZSBpcyBuZWVkZWQgdG8gcHJldmVudCBvdmVyLW9wdGltaXphdGlvbiBi eSBnY2MuICovCisJdm9sYXRpbGUgdTMyIGhhc2g7CisJdm9sYXRpbGUgaW50IHJldDsKKworCXAx ID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXAxKQorCQlyZXR1cm4gLUVOT01FTTsK KworCXAyID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXAyKQorCQlyZXR1cm4gLUVO T01FTTsKKworCWFkZHIxID0ga21hcF9hdG9taWMocDEpOworCWFkZHIyID0ga21hcF9hdG9taWMo cDIpOworCW1lbXNldChhZGRyMSwgcHJhbmRvbV91MzIoKSwgUEFHRV9TSVpFKTsKKwltZW1jcHko YWRkcjIsIGFkZHIxLCBQQUdFX1NJWkUpOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHR3byBw YWdlcyBkaWZmZXIgaW4gbGFzdCBieXRlICovCisJYWRkcjJbUEFHRV9TSVpFLTFdID0gfmFkZHIy W1BBR0VfU0laRS0xXTsKKwlrdW5tYXBfYXRvbWljKGFkZHIyKTsKKwlrdW5tYXBfYXRvbWljKGFk ZHIxKTsKKworCXRpbWVfc3RhcnQgPSBqaWZmaWVzOworCXdoaWxlIChqaWZmaWVzIC0gdGltZV9z dGFydCA8IDEwMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCQloYXNoID0gcGFn ZV9oYXNoKHAxLCBIQVNIX1NUUkVOR1RIX0ZVTEwsIDApOworCQlsb29wbnVtICs9IDEwMDsKKwl9 CisJaGFzaF9jb3N0ID0gKGppZmZpZXMgLSB0aW1lX3N0YXJ0KTsKKworCXRpbWVfc3RhcnQgPSBq aWZmaWVzOworCWZvciAoaSA9IDA7IGkgPCBsb29wbnVtOyBpKyspCisJCXJldCA9IHBhZ2VzX2lk ZW50aWNhbChwMSwgcDIpOworCW1lbWNtcF9jb3N0ID0gSEFTSF9TVFJFTkdUSF9GVUxMICogKGpp ZmZpZXMgLSB0aW1lX3N0YXJ0KTsKKwltZW1jbXBfY29zdCAvPSBoYXNoX2Nvc3Q7CisJcHJpbnRr KEtFUk5fSU5GTyAiVUtTTTogcmVsYXRpdmUgbWVtY21wX2Nvc3QgPSAlbHUgIgorCQkJICJoYXNo PSV1IGNtcF9yZXQ9JWQuXG4iLAorCSAgICAgICBtZW1jbXBfY29zdCwgaGFzaCwgcmV0KTsKKwor CV9fZnJlZV9wYWdlKHAxKTsKKwlfX2ZyZWVfcGFnZShwMik7CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgaW5pdF96ZXJvcGFnZV9oYXNoX3RhYmxlKHZvaWQpCit7CisJc3RydWN0IHBhZ2Ug KnBhZ2U7CisJY2hhciAqYWRkcjsKKwlpbnQgaTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9L RVJORUwpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGRyID0ga21hcF9h dG9taWMocGFnZSk7CisJbWVtc2V0KGFkZHIsIDAsIFBBR0VfU0laRSk7CisJa3VubWFwX2F0b21p YyhhZGRyKTsKKworCXplcm9faGFzaF90YWJsZSA9IGttYWxsb2MoSEFTSF9TVFJFTkdUSF9NQVgg KiBzaXplb2YodTMyKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCF6ZXJvX2hhc2hfdGFibGUpCisJ CXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfU1RSRU5HVEhfTUFYOyBp KyspCisJCXplcm9faGFzaF90YWJsZVtpXSA9IHBhZ2VfaGFzaChwYWdlLCBpLCAwKTsKKworCV9f ZnJlZV9wYWdlKHBhZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlu aXRfcmFuZG9tX3NhbXBsaW5nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXJhbmRvbV9u dW1zID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmFuZG9tX251bXMp CisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfU1RSRU5HVEhfRlVM TDsgaSsrKQorCQlyYW5kb21fbnVtc1tpXSA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9T VFJFTkdUSF9GVUxMOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByYW5kX3JhbmdlLCBzd2FwX2lu ZGV4LCB0bXA7CisKKwkJcmFuZF9yYW5nZSA9IEhBU0hfU1RSRU5HVEhfRlVMTCAtIGk7CisJCXN3 YXBfaW5kZXggPSBpICsgcHJhbmRvbV91MzIoKSAlIHJhbmRfcmFuZ2U7CisJCXRtcCA9IHJhbmRv bV9udW1zW2ldOworCQlyYW5kb21fbnVtc1tpXSA9ICByYW5kb21fbnVtc1tzd2FwX2luZGV4XTsK KwkJcmFuZG9tX251bXNbc3dhcF9pbmRleF0gPSB0bXA7CisJfQorCisJcnNoYXNoX3N0YXRlLnN0 YXRlID0gUlNIQVNIX05FVzsKKwlyc2hhc2hfc3RhdGUuYmVsb3dfY291bnQgPSAwOworCXJzaGFz aF9zdGF0ZS5sb29rdXBfd2luZG93X2luZGV4ID0gMDsKKworCXJldHVybiBjYWxfcG9zaXRpdmVf bmVnYXRpdmVfY29zdHMoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWtzbV9zbGFiX2luaXQo dm9pZCkKK3sKKwlybWFwX2l0ZW1fY2FjaGUgPSBVS1NNX0tNRU1fQ0FDSEUocm1hcF9pdGVtLCAw KTsKKwlpZiAoIXJtYXBfaXRlbV9jYWNoZSkKKwkJZ290byBvdXQ7CisKKwlzdGFibGVfbm9kZV9j YWNoZSA9IFVLU01fS01FTV9DQUNIRShzdGFibGVfbm9kZSwgMCk7CisJaWYgKCFzdGFibGVfbm9k ZV9jYWNoZSkKKwkJZ290byBvdXRfZnJlZTE7CisKKwlub2RlX3ZtYV9jYWNoZSA9IFVLU01fS01F TV9DQUNIRShub2RlX3ZtYSwgMCk7CisJaWYgKCFub2RlX3ZtYV9jYWNoZSkKKwkJZ290byBvdXRf ZnJlZTI7CisKKwl2bWFfc2xvdF9jYWNoZSA9IFVLU01fS01FTV9DQUNIRSh2bWFfc2xvdCwgMCk7 CisJaWYgKCF2bWFfc2xvdF9jYWNoZSkKKwkJZ290byBvdXRfZnJlZTM7CisKKwl0cmVlX25vZGVf Y2FjaGUgPSBVS1NNX0tNRU1fQ0FDSEUodHJlZV9ub2RlLCAwKTsKKwlpZiAoIXRyZWVfbm9kZV9j YWNoZSkKKwkJZ290byBvdXRfZnJlZTQ7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU0OgorCWtt ZW1fY2FjaGVfZGVzdHJveSh2bWFfc2xvdF9jYWNoZSk7CitvdXRfZnJlZTM6CisJa21lbV9jYWNo ZV9kZXN0cm95KG5vZGVfdm1hX2NhY2hlKTsKK291dF9mcmVlMjoKKwlrbWVtX2NhY2hlX2Rlc3Ry b3koc3RhYmxlX25vZGVfY2FjaGUpOworb3V0X2ZyZWUxOgorCWttZW1fY2FjaGVfZGVzdHJveShy bWFwX2l0ZW1fY2FjaGUpOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9p ZCBfX2luaXQgdWtzbV9zbGFiX2ZyZWUodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koc3Rh YmxlX25vZGVfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShybWFwX2l0ZW1fY2FjaGUpOwor CWttZW1fY2FjaGVfZGVzdHJveShub2RlX3ZtYV9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95 KHZtYV9zbG90X2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJlZV9ub2RlX2NhY2hlKTsK K30KKworLyogQ29tbW9uIGludGVyZmFjZSB0byBrc20sIGRpZmZlcmVudCB0byBpdC4gKi8KK2lu dCBrc21fbWFkdmlzZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBz dGFydCwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIGludCBhZHZpY2UsIHVuc2lnbmVkIGxvbmcgKnZt X2ZsYWdzKQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKGFkdmljZSkgeworCWNhc2UgTUFEVl9N RVJHRUFCTEU6CisJCXJldHVybiAwOwkJLyoganVzdCBpZ25vcmUgdGhlIGFkdmljZSAqLworCisJ Y2FzZSBNQURWX1VOTUVSR0VBQkxFOgorCQlpZiAoISgqdm1fZmxhZ3MgJiBWTV9NRVJHRUFCTEUp KQorCQkJcmV0dXJuIDA7CQkvKiBqdXN0IGlnbm9yZSB0aGUgYWR2aWNlICovCisKKwkJaWYgKHZt YS0+YW5vbl92bWEpIHsKKwkJCWVyciA9IHVubWVyZ2VfdWtzbV9wYWdlcyh2bWEsIHN0YXJ0LCBl bmQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJdWtzbV9yZW1vdmVf dm1hKHZtYSk7CisJCSp2bV9mbGFncyAmPSB+Vk1fTUVSR0VBQkxFOworCQlicmVhazsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworLyogQ29tbW9uIGludGVyZmFjZSB0byBrc20sIGFjdHVhbGx5IHRo ZSBzYW1lLiAqLworc3RydWN0IHBhZ2UgKmtzbV9taWdodF9uZWVkX3RvX2NvcHkoc3RydWN0IHBh Z2UgKnBhZ2UsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBh ZGRyZXNzKQoreworCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBwYWdlX2Fub25fdm1hKHBh Z2UpOworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKworCWlmIChQYWdlS3NtKHBhZ2UpKSB7CisJ CWlmIChwYWdlX3N0YWJsZV9ub2RlKHBhZ2UpKQorCQkJcmV0dXJuIHBhZ2U7CS8qIG5vIG5lZWQg dG8gY29weSBpdCAqLworCX0gZWxzZSBpZiAoIWFub25fdm1hKSB7CisJCXJldHVybiBwYWdlOwkJ Lyogbm8gbmVlZCB0byBjb3B5IGl0ICovCisJfSBlbHNlIGlmIChhbm9uX3ZtYS0+cm9vdCA9PSB2 bWEtPmFub25fdm1hLT5yb290ICYmCisJCSBwYWdlLT5pbmRleCA9PSBsaW5lYXJfcGFnZV9pbmRl eCh2bWEsIGFkZHJlc3MpKSB7CisJCXJldHVybiBwYWdlOwkJLyogc3RpbGwgbm8gbmVlZCB0byBj b3B5IGl0ICovCisJfQorCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlyZXR1cm4gcGFnZTsJ CS8qIGxldCBkb19zd2FwX3BhZ2UgcmVwb3J0IHRoZSBlcnJvciAqLworCisJbmV3X3BhZ2UgPSBh bGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLCBhZGRyZXNzKTsKKwlpZiAo bmV3X3BhZ2UpIHsKKwkJY29weV91c2VyX2hpZ2hwYWdlKG5ld19wYWdlLCBwYWdlLCBhZGRyZXNz LCB2bWEpOworCisJCVNldFBhZ2VEaXJ0eShuZXdfcGFnZSk7CisJCV9fU2V0UGFnZVVwdG9kYXRl KG5ld19wYWdlKTsKKwkJX19zZXRfcGFnZV9sb2NrZWQobmV3X3BhZ2UpOworCX0KKworCXJldHVy biBuZXdfcGFnZTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWtzbV9pbml0KHZvaWQpCit7CisJ c3RydWN0IHRhc2tfc3RydWN0ICp1a3NtX3RocmVhZDsKKwlpbnQgZXJyOworCisJdWtzbV9zbGVl cF9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcygxMDApOworCXVrc21fc2xlZXBfc2F2ZWQgPSB1 a3NtX3NsZWVwX2ppZmZpZXM7CisKKwlzbG90X3RyZWVfaW5pdCgpOworCWluaXRfc2Nhbl9sYWRk ZXIoKTsKKworCisJZXJyID0gaW5pdF9yYW5kb21fc2FtcGxpbmcoKTsKKwlpZiAoZXJyKQorCQln b3RvIG91dF9mcmVlMjsKKworCWVyciA9IHVrc21fc2xhYl9pbml0KCk7CisJaWYgKGVycikKKwkJ Z290byBvdXRfZnJlZTE7CisKKwllcnIgPSBpbml0X3plcm9wYWdlX2hhc2hfdGFibGUoKTsKKwlp ZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlMDsKKworCXVrc21fdGhyZWFkID0ga3RocmVhZF9ydW4o dWtzbV9zY2FuX3RocmVhZCwgTlVMTCwgInVrc21kIik7CisJaWYgKElTX0VSUih1a3NtX3RocmVh ZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1a3NtOiBjcmVhdGluZyBrdGhyZWFkIGZhaWxlZFxu Iik7CisJCWVyciA9IFBUUl9FUlIodWtzbV90aHJlYWQpOworCQlnb3RvIG91dF9mcmVlOworCX0K KworI2lmZGVmIENPTkZJR19TWVNGUworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cChtbV9rb2Jq LCAmdWtzbV9hdHRyX2dyb3VwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWtz bTogcmVnaXN0ZXIgc3lzZnMgZmFpbGVkXG4iKTsKKwkJa3RocmVhZF9zdG9wKHVrc21fdGhyZWFk KTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisjZWxzZQorCXVrc21fcnVuID0gVUtTTV9SVU5fTUVS R0U7CS8qIG5vIHdheSBmb3IgdXNlciB0byBzdGFydCBpdCAqLworCisjZW5kaWYgLyogQ09ORklH X1NZU0ZTICovCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQorCS8qCisJICogQ2hv b3NlIGEgaGlnaCBwcmlvcml0eSBzaW5jZSB0aGUgY2FsbGJhY2sgdGFrZXMgdWtzbV90aHJlYWRf bXV0ZXg6CisJICogbGF0ZXIgY2FsbGJhY2tzIGNvdWxkIG9ubHkgYmUgdGFraW5nIGxvY2tzIHdo aWNoIG5lc3Qgd2l0aGluIHRoYXQuCisJICovCisJaG90cGx1Z19tZW1vcnlfbm90aWZpZXIodWtz bV9tZW1vcnlfY2FsbGJhY2ssIDEwMCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6 CisJa2ZyZWUoemVyb19oYXNoX3RhYmxlKTsKK291dF9mcmVlMDoKKwl1a3NtX3NsYWJfZnJlZSgp Oworb3V0X2ZyZWUxOgorCWtmcmVlKHJhbmRvbV9udW1zKTsKK291dF9mcmVlMjoKKwlrZnJlZSh1 a3NtX3NjYW5fbGFkZGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgTU9EVUxFCitzdWJz eXNfaW5pdGNhbGwoa3NtX2luaXQpOworI2Vsc2UKK2xhdGVfaW5pdGNhbGwodWtzbV9pbml0KTsK KyNlbmRpZgorCmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IDFi MTJkMzkuLjJmYTk2MzEgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5j CkBAIC03OTUsNiArNzk1LDkgQEAgY29uc3QgY2hhciAqIGNvbnN0IHZtc3RhdF90ZXh0W10gPSB7 CiAJIm5yX2Fub25fdHJhbnNwYXJlbnRfaHVnZXBhZ2VzIiwKIAkibnJfZnJlZV9jbWEiLAogCisj aWZkZWYgQ09ORklHX1VLU00KKyAgICAgICAibnJfdWtzbV96ZXJvX3BhZ2VzIiwKKyNlbmRpZgog CS8qIGVudW0gd3JpdGViYWNrX3N0YXRfaXRlbSBjb3VudGVycyAqLwogCSJucl9kaXJ0eV90aHJl c2hvbGQiLAogCSJucl9kaXJ0eV9iYWNrZ3JvdW5kX3RocmVzaG9sZCIsCi0tIAoyLjEuMgoK --001a1134cdee2fe6780506827203-- -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wg0-f42.google.com (mail-wg0-f42.google.com [74.125.82.42]) by kanga.kvack.org (Postfix) with ESMTP id 6EAF4800CA for ; Fri, 7 Nov 2014 19:58:12 -0500 (EST) Received: by mail-wg0-f42.google.com with SMTP id k14so4898289wgh.1 for ; Fri, 07 Nov 2014 16:58:11 -0800 (PST) Received: from mail-wg0-x231.google.com (mail-wg0-x231.google.com. [2a00:1450:400c:c00::231]) by mx.google.com with ESMTPS id n16si5785490wie.33.2014.11.07.16.58.11 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 07 Nov 2014 16:58:11 -0800 (PST) Received: by mail-wg0-f49.google.com with SMTP id x13so4911219wgg.22 for ; Fri, 07 Nov 2014 16:58:11 -0800 (PST) Message-ID: <545D6AA1.9010907@gmail.com> Date: Sat, 08 Nov 2014 03:58:09 +0300 From: Timofey Titovets MIME-Version: 1.0 Subject: [RFC PATCH] KSM: Auto add flag new VMA as VM_MERGEABLE References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> <20141028174011.GC1445@sirus.conectiva> In-Reply-To: <20141028174011.GC1445@sirus.conectiva> Content-Type: multipart/mixed; boundary="------------000205070309000407000305" Sender: owner-linux-mm@kvack.org List-ID: To: Linux Kernel Cc: linux-mm@kvack.org, marco.antonio.780@gmail.com, Timofey Titovets This is a multi-part message in MIME format. --------------000205070309000407000305 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi list. This is a small patch what allow ksm dedupe "whole" system memory. I think what people with tiny pc and android developers will be happy after this patch. I just like clear memory =]. I have tested it and it working very good. For testing apply it and enable ksm: echo 1 | sudo tee /sys/kernel/mm/ksm/run This show how much memory saved: echo $[$(cat /sys/kernel/mm/ksm/pages_shared)*$(getconf PAGE_SIZE)/1024 ]KB (i use linux-next-git 20141031) It add very small overhead to mmap call's. Please check my code, may be i should move new functions to other file? I think about sysfs switcher like: /sys/kernel/mm/ksm/mark_new_vma # 0 or 1 if 1 new vma will be marked like VM_MERGEABLE. Can you advise me something? I implement 2 new functions: ksm_vm_flags_mod() - working only in mm/mmap.c file, change default flags ksm_vma_add_new() - add new created vma to ksm internal tree If you see broken patch lines i have also attach patch. From db8ad0877146a69e1e5d5ab98825cefcf44a95bb Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sat, 8 Nov 2014 03:02:52 +0300 Subject: [PATCH] KSM: Add auto flag new VMA as VM_MERGEABLE Signed-off-by: Timofey Titovets --- include/linux/ksm.h | 31 +++++++++++++++++++++++++++++++ mm/mmap.c | 17 +++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 3be6bb1..c3fff64 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h @@ -76,6 +76,29 @@ struct page *ksm_might_need_to_copy(struct page *page, int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc); void ksm_migrate_page(struct page *newpage, struct page *oldpage); +/* + * Allow to mark new vma as VM_MERGEABLE + */ +#ifndef VM_SAO +#define VM_SAO 0 +#endif +static inline void ksm_vm_flags_mod(unsigned long *vm_flags) +{ + if (*vm_flags & (VM_MERGEABLE | VM_SHARED | VM_MAYSHARE | + VM_PFNMAP | VM_IO | VM_DONTEXPAND | + VM_HUGETLB | VM_NONLINEAR | VM_MIXEDMAP | VM_SAO) ) + return; + *vm_flags |= VM_MERGEABLE; +} + +static inline void ksm_vma_add_new(struct vm_area_struct *vma) +{ + struct mm_struct *mm = vma->vm_mm; + if (!test_bit(MMF_VM_MERGEABLE, &mm->flags)) { + __ksm_enter(mm); + } +} + #else /* !CONFIG_KSM */ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) @@ -92,6 +115,14 @@ static inline int PageKsm(struct page *page) return 0; } +static inline void ksm_vm_flags_mod(unsigned long *vm_flags_p) +{ +} + +void ksm_vma_add_new(struct vm_area_struct *vma) +{ +} + #ifdef CONFIG_MMU static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, unsigned long end, int advice, unsigned long *vm_flags) diff --git a/mm/mmap.c b/mm/mmap.c index 7f85520..ce0073e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -911,10 +912,14 @@ again: remove_next = 1 + (end > next->vm_end); vma_gap_update(next); else mm->highest_vm_end = end; + } else { + if (next && !insert) + ksm_vma_add_new(next); } if (insert && file) uprobe_mmap(insert); + ksm_vma_add_new(vma); validate_mm(mm); return 0; @@ -1307,6 +1312,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) | mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&vm_flags); + if (flags & MAP_LOCKED) if (!can_do_mlock()) return -EPERM; @@ -1648,6 +1656,7 @@ munmap_back: allow_write_access(file); } file = vma->vm_file; + ksm_vma_add_new(vma); out: perf_event_mmap(vma); @@ -2484,6 +2493,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, else err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new); + ksm_vma_add_new(vma); + /* Success. */ if (!err) return 0; @@ -2659,6 +2670,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) if (error) return error; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&flags); + /* * mm->mmap_sem is required to protect against another thread * changing the mappings in case we sleep. @@ -2708,6 +2722,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) vma->vm_flags = flags; vma->vm_page_prot = vm_get_page_prot(flags); vma_link(mm, vma, prev, rb_link, rb_parent); + ksm_vma_add_new(vma); out: perf_event_mmap(vma); mm->total_vm += len >> PAGE_SHIFT; @@ -2887,6 +2902,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, new_vma->vm_ops->open(new_vma); vma_link(mm, new_vma, prev, rb_link, rb_parent); *need_rmap_locks = false; + ksm_vma_add_new(new_vma); } } return new_vma; @@ -3004,6 +3020,7 @@ static struct vm_area_struct *__install_special_mapping( mm->total_vm += len >> PAGE_SHIFT; perf_event_mmap(vma); + ksm_vma_add_new(vma); return vma; -- 2.1.3 --------------000205070309000407000305 Content-Type: text/x-patch; name="0001-KSM-Add-auto-flag-new-VMA-as-VM_MERGEABLE.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-KSM-Add-auto-flag-new-VMA-as-VM_MERGEABLE.patch" --------------000205070309000407000305-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752526AbaJYT0k (ORCPT ); Sat, 25 Oct 2014 15:26:40 -0400 Received: from mail-wi0-f179.google.com ([209.85.212.179]:58374 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751899AbaJYT0i (ORCPT ); Sat, 25 Oct 2014 15:26:38 -0400 MIME-Version: 1.0 From: Timofey Titovets Date: Sat, 25 Oct 2014 22:25:56 +0300 Message-ID: Subject: UKSM: What's maintainers think about it? To: Linux Kernel Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Good time of day, people. I try to find 'mm' subsystem specific people and lists, but list linux-mm looks dead and mail archive look like deprecated. If i must to sent this message to another list or add CC people, let me know. If questions are already asked (i can't find activity before), feel free to kick me. The main questions: 1. Somebody test it? I see many reviews about it. I already port it to latest linux-next-git kernel and its work without issues. http://pastebin.com/6FMuKagS (if it matter, i can describe use cases and results, if somebody ask it) 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? offtop: now i try to communicate with dev's on kerneldedup.org forum, but i have problems with email verification and wait admin registration approval. (i already sent questions to http://kerneldedup.org/forum/home.php?mod=space&username=xianai , because him looks like team leader) 3. I just want collect feedbacks from linux maintainers team, if you decide what UKSM not needed in kernel, all other comments (as i understand) not matter. Like KSM, but better. UKSM - Ultra Kernel Samepage Merging http://kerneldedup.org/en/projects/uksm/introduction/ From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750986AbaJZEbs (ORCPT ); Sun, 26 Oct 2014 00:31:48 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:45182 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750741AbaJZEbr (ORCPT ); Sun, 26 Oct 2014 00:31:47 -0400 Date: Sat, 25 Oct 2014 21:32:01 -0700 From: Andrew Morton To: Timofey Titovets Cc: Linux Kernel , linux-mm@kvack.org Subject: Re: UKSM: What's maintainers think about it? Message-Id: <20141025213201.005762f9.akpm@linux-foundation.org> In-Reply-To: References: X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > Good time of day, people. > I try to find 'mm' subsystem specific people and lists, but list > linux-mm looks dead and mail archive look like deprecated. > If i must to sent this message to another list or add CC people, let me know. linux-mm@kvack.org is alive and well. > If questions are already asked (i can't find activity before), feel > free to kick me. > > The main questions: > 1. Somebody test it? I see many reviews about it. > I already port it to latest linux-next-git kernel and its work without issues. > http://pastebin.com/6FMuKagS > (if it matter, i can describe use cases and results, if somebody ask it) > > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > offtop: now i try to communicate with dev's on kerneldedup.org forum, > but i have problems with email verification and wait admin > registration approval. > (i already sent questions to > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > because him looks like team leader) > > 3. I just want collect feedbacks from linux maintainers team, if you > decide what UKSM not needed in kernel, all other comments (as i > understand) not matter. > > Like KSM, but better. > UKSM - Ultra Kernel Samepage Merging > http://kerneldedup.org/en/projects/uksm/introduction/ It's the first I've heard of it. No, as far as I know there has been no attempt to upstream UKSM. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755163AbaJ1NjE (ORCPT ); Tue, 28 Oct 2014 09:39:04 -0400 Received: from mail.mandriva.com.br ([177.220.134.171]:51398 "EHLO mail.mandriva.com.br" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753266AbaJ1NjC (ORCPT ); Tue, 28 Oct 2014 09:39:02 -0400 X-Greylist: delayed 441 seconds by postgrey-1.27 at vger.kernel.org; Tue, 28 Oct 2014 09:39:02 EDT Date: Tue, 28 Oct 2014 11:31:31 -0200 From: Marco A Benatto To: Andrew Morton Cc: Timofey Titovets , Linux Kernel , linux-mm@kvack.org Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028133131.GA1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141025213201.005762f9.akpm@linux-foundation.org> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi All, I'm not mantainer at all, but I've being using UKSM for a long time and remember to port it to 3.16 family once. UKSM seems good and stable and, at least for me, doesn't raised any errors. AFAIK the only limitation I know (maybe I has been fixed already) it isn't able to work together with zram stuff due to some race-conditions. Cheers, Marco A Benatto Mandriva OEM Developer On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > > > Good time of day, people. > > I try to find 'mm' subsystem specific people and lists, but list > > linux-mm looks dead and mail archive look like deprecated. > > If i must to sent this message to another list or add CC people, let me know. > > linux-mm@kvack.org is alive and well. > > > If questions are already asked (i can't find activity before), feel > > free to kick me. > > > > The main questions: > > 1. Somebody test it? I see many reviews about it. > > I already port it to latest linux-next-git kernel and its work without issues. > > http://pastebin.com/6FMuKagS > > (if it matter, i can describe use cases and results, if somebody ask it) > > > > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > > offtop: now i try to communicate with dev's on kerneldedup.org forum, > > but i have problems with email verification and wait admin > > registration approval. > > (i already sent questions to > > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > > because him looks like team leader) > > > > 3. I just want collect feedbacks from linux maintainers team, if you > > decide what UKSM not needed in kernel, all other comments (as i > > understand) not matter. > > > > Like KSM, but better. > > UKSM - Ultra Kernel Samepage Merging > > http://kerneldedup.org/en/projects/uksm/introduction/ > > It's the first I've heard of it. No, as far as I know there has been > no attempt to upstream UKSM. > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753541AbaJ1OAa (ORCPT ); Tue, 28 Oct 2014 10:00:30 -0400 Received: from mail-wi0-f182.google.com ([209.85.212.182]:56683 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753437AbaJ1OA1 (ORCPT ); Tue, 28 Oct 2014 10:00:27 -0400 MIME-Version: 1.0 In-Reply-To: <20141028133131.GA1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> From: Timofey Titovets Date: Tue, 28 Oct 2014 16:59:45 +0300 Message-ID: Subject: Re: UKSM: What's maintainers think about it? To: Marco A Benatto Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > Hi All, > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > to port it to 3.16 family once. > UKSM seems good and stable and, at least for me, doesn't raised any errors. > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > to work together with zram stuff due to some race-conditions. > > Cheers, > > Marco A Benatto > Mandriva OEM Developer > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 As i did find, uksm not conflicting with zram (or zswap - on my system). --- Offtop: Why i open up question about UKSM? May be we (as community, who want to help) can split out UKSM in "several patches" in independent git repo. For allowing maintainers to review this. Is it morally correct? UKSM code licensed under GPL and as i think we can feel free for port and adopt code (with indicating the author) Please, fix me if i mistake or miss something. This is just stream of my thoughts %_% --- > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: >> >> > Good time of day, people. >> > I try to find 'mm' subsystem specific people and lists, but list >> > linux-mm looks dead and mail archive look like deprecated. >> > If i must to sent this message to another list or add CC people, let me know. >> >> linux-mm@kvack.org is alive and well. So cool, thanks for adding 'mm' to CC. >> > If questions are already asked (i can't find activity before), feel >> > free to kick me. >> > >> > The main questions: >> > 1. Somebody test it? I see many reviews about it. >> > I already port it to latest linux-next-git kernel and its work without issues. >> > http://pastebin.com/6FMuKagS >> > (if it matter, i can describe use cases and results, if somebody ask it) >> > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, >> > but i have problems with email verification and wait admin >> > registration approval. >> > (i already sent questions to >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , >> > because him looks like team leader) >> > >> > 3. I just want collect feedbacks from linux maintainers team, if you >> > decide what UKSM not needed in kernel, all other comments (as i >> > understand) not matter. >> > >> > Like KSM, but better. >> > UKSM - Ultra Kernel Samepage Merging >> > http://kerneldedup.org/en/projects/uksm/introduction/ >> >> It's the first I've heard of it. No, as far as I know there has been >> no attempt to upstream UKSM. >> >> -- >> To unsubscribe, send a message with 'unsubscribe linux-mm' in >> the body to majordomo@kvack.org. For more info on Linux MM, >> see: http://www.linux-mm.org/ . >> Don't email: email@kvack.org -- Have a nice day, Timofey. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754244AbaJ1QIX (ORCPT ); Tue, 28 Oct 2014 12:08:23 -0400 Received: from mail.mandriva.com.br ([177.220.134.171]:52653 "EHLO mail.mandriva.com.br" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751582AbaJ1QIT (ORCPT ); Tue, 28 Oct 2014 12:08:19 -0400 Date: Tue, 28 Oct 2014 14:08:12 -0200 From: Marco A Benatto To: Timofey Titovets Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028160812.GB1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: > 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > > Hi All, > > > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > > to port it to 3.16 family once. > > UKSM seems good and stable and, at least for me, doesn't raised any errors. > > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > > to work together with zram stuff due to some race-conditions. > > > > Cheers, > > > > Marco A Benatto > > Mandriva OEM Developer > > > > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 > As i did find, uksm not conflicting with zram (or zswap - on my system). Interesting, I've contacted the mantainers to send some patches in April and they said me this: "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so fast by zswap before UKSM/KSM can have a chance to merge those can be merged. So one of the ideas that make a direct solution is that: 1. sleep the processes who trigger the zswap 2. wake up the UKSM thread and adjust the scan parameters properly to make it sample the whole memory in a limited time to judge if there are any VMAs need to be worked on. 3. If there are those VMAs then merge them at full speed. if there not, sleep UKSM. 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy the requests. If there is enough memory then return and redo the memory allocation. 5. if there is not, then go on to do zswapping. This is just an outline of ONE of the solutions. It need to be carefully tweaked. Direct page reclaiming of zswap is a time sensitive code path , we cannot add too much overhead by doing this, otherwise it loses its meaning." > --- > Offtop: > Why i open up question about UKSM? > > May be we (as community, who want to help) can split out UKSM in > "several patches" in independent git repo. For allowing maintainers to > review this. > > Is it morally correct? > > UKSM code licensed under GPL and as i think we can feel free for port > and adopt code (with indicating the author) > > Please, fix me if i mistake or miss something. > This is just stream of my thoughts %_% If there's no problem in do this, and if you don't mind, you can help you out on this. Cheers, > --- > > > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > >> > >> > Good time of day, people. > >> > I try to find 'mm' subsystem specific people and lists, but list > >> > linux-mm looks dead and mail archive look like deprecated. > >> > If i must to sent this message to another list or add CC people, let me know. > >> > >> linux-mm@kvack.org is alive and well. > > So cool, thanks for adding 'mm' to CC. > > >> > If questions are already asked (i can't find activity before), feel > >> > free to kick me. > >> > > >> > The main questions: > >> > 1. Somebody test it? I see many reviews about it. > >> > I already port it to latest linux-next-git kernel and its work without issues. > >> > http://pastebin.com/6FMuKagS > >> > (if it matter, i can describe use cases and results, if somebody ask it) > >> > > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, > >> > but i have problems with email verification and wait admin > >> > registration approval. > >> > (i already sent questions to > >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > >> > because him looks like team leader) > >> > > >> > 3. I just want collect feedbacks from linux maintainers team, if you > >> > decide what UKSM not needed in kernel, all other comments (as i > >> > understand) not matter. > >> > > >> > Like KSM, but better. > >> > UKSM - Ultra Kernel Samepage Merging > >> > http://kerneldedup.org/en/projects/uksm/introduction/ > >> > >> It's the first I've heard of it. No, as far as I know there has been > >> no attempt to upstream UKSM. > >> > >> -- > >> To unsubscribe, send a message with 'unsubscribe linux-mm' in > >> the body to majordomo@kvack.org. For more info on Linux MM, > >> see: http://www.linux-mm.org/ . > >> Don't email: email@kvack.org > > -- > Have a nice day, > Timofey. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754061AbaJ1RkV (ORCPT ); Tue, 28 Oct 2014 13:40:21 -0400 Received: from mail.mandriva.com.br ([177.220.134.171]:53901 "EHLO mail.mandriva.com.br" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751660AbaJ1RkS (ORCPT ); Tue, 28 Oct 2014 13:40:18 -0400 Date: Tue, 28 Oct 2014 15:40:12 -0200 From: Marco A Benatto To: Timofey Titovets Cc: Andrew Morton , Linux Kernel , linux-mm@kvack.org Subject: Re: UKSM: What's maintainers think about it? Message-ID: <20141028174011.GC1445@sirus.conectiva> References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Oct 28, 2014 at 04:59:45PM +0300, Timofey Titovets wrote: > 2014-10-28 16:31 GMT+03:00 Marco A Benatto : > > Hi All, > > > > I'm not mantainer at all, but I've being using UKSM for a long time and remember > > to port it to 3.16 family once. > > UKSM seems good and stable and, at least for me, doesn't raised any errors. > > AFAIK the only limitation I know (maybe I has been fixed already) it isn't able > > to work together with zram stuff due to some race-conditions. > > > > Cheers, > > > > Marco A Benatto > > Mandriva OEM Developer > > > > http://kerneldedup.org/forum/forum.php?mod=viewthread&tid=106 > As i did find, uksm not conflicting with zram (or zswap - on my system). Interesting, I've contacted the mantainers to send some patches in April and they said me this: "The biggest problem between UKSM/KSM and zswap is that pages can be reclaimed so fast by zswap before UKSM/KSM can have a chance to merge those can be merged. So one of the ideas that make a direct solution is that: 1. sleep the processes who trigger the zswap 2. wake up the UKSM thread and adjust the scan parameters properly to make it sample the whole memory in a limited time to judge if there are any VMAs need to be worked on. 3. If there are those VMAs then merge them at full speed. if there not, sleep UKSM. 4. Wake up the zswap code pathes and judge that if memory is enough to satisfy the requests. If there is enough memory then return and redo the memory allocation. 5. if there is not, then go on to do zswapping. This is just an outline of ONE of the solutions. It need to be carefully tweaked. Direct page reclaiming of zswap is a time sensitive code path , we cannot add too much overhead by doing this, otherwise it loses its meaning." > --- > Offtop: > Why i open up question about UKSM? > > May be we (as community, who want to help) can split out UKSM in > "several patches" in independent git repo. For allowing maintainers to > review this. > > Is it morally correct? > > UKSM code licensed under GPL and as i think we can feel free for port > and adopt code (with indicating the author) > > Please, fix me if i mistake or miss something. > This is just stream of my thoughts %_% > --- If there's no problem on that and if you don't mind, I can help you on this. What dou you think? Cheers, > > On Sat, Oct 25, 2014 at 09:32:01PM -0700, Andrew Morton wrote: > >> On Sat, 25 Oct 2014 22:25:56 +0300 Timofey Titovets wrote: > >> > >> > Good time of day, people. > >> > I try to find 'mm' subsystem specific people and lists, but list > >> > linux-mm looks dead and mail archive look like deprecated. > >> > If i must to sent this message to another list or add CC people, let me know. > >> > >> linux-mm@kvack.org is alive and well. > > So cool, thanks for adding 'mm' to CC. > > >> > If questions are already asked (i can't find activity before), feel > >> > free to kick me. > >> > > >> > The main questions: > >> > 1. Somebody test it? I see many reviews about it. > >> > I already port it to latest linux-next-git kernel and its work without issues. > >> > http://pastebin.com/6FMuKagS > >> > (if it matter, i can describe use cases and results, if somebody ask it) > >> > > >> > 2. Developers of UKSM already tried to merge it? Somebody talked with uksm devs? > >> > offtop: now i try to communicate with dev's on kerneldedup.org forum, > >> > but i have problems with email verification and wait admin > >> > registration approval. > >> > (i already sent questions to > >> > http://kerneldedup.org/forum/home.php?mod=space&username=xianai , > >> > because him looks like team leader) > >> > > >> > 3. I just want collect feedbacks from linux maintainers team, if you > >> > decide what UKSM not needed in kernel, all other comments (as i > >> > understand) not matter. > >> > > >> > Like KSM, but better. > >> > UKSM - Ultra Kernel Samepage Merging > >> > http://kerneldedup.org/en/projects/uksm/introduction/ > >> > >> It's the first I've heard of it. No, as far as I know there has been > >> no attempt to upstream UKSM. > >> > >> -- > >> To unsubscribe, send a message with 'unsubscribe linux-mm' in > >> the body to majordomo@kvack.org. For more info on Linux MM, > >> see: http://www.linux-mm.org/ . > >> Don't email: email@kvack.org > > -- > Have a nice day, > Timofey. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753391AbaKHA6P (ORCPT ); Fri, 7 Nov 2014 19:58:15 -0500 Received: from mail-wg0-f45.google.com ([74.125.82.45]:37015 "EHLO mail-wg0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753061AbaKHA6N (ORCPT ); Fri, 7 Nov 2014 19:58:13 -0500 Message-ID: <545D6AA1.9010907@gmail.com> Date: Sat, 08 Nov 2014 03:58:09 +0300 From: Timofey Titovets User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Linux Kernel CC: linux-mm@kvack.org, marco.antonio.780@gmail.com, Timofey Titovets Subject: [RFC PATCH] KSM: Auto add flag new VMA as VM_MERGEABLE References: <20141025213201.005762f9.akpm@linux-foundation.org> <20141028133131.GA1445@sirus.conectiva> <20141028174011.GC1445@sirus.conectiva> In-Reply-To: <20141028174011.GC1445@sirus.conectiva> Content-Type: multipart/mixed; boundary="------------000205070309000407000305" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------000205070309000407000305 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi list. This is a small patch what allow ksm dedupe "whole" system memory. I think what people with tiny pc and android developers will be happy after this patch. I just like clear memory =]. I have tested it and it working very good. For testing apply it and enable ksm: echo 1 | sudo tee /sys/kernel/mm/ksm/run This show how much memory saved: echo $[$(cat /sys/kernel/mm/ksm/pages_shared)*$(getconf PAGE_SIZE)/1024 ]KB (i use linux-next-git 20141031) It add very small overhead to mmap call's. Please check my code, may be i should move new functions to other file? I think about sysfs switcher like: /sys/kernel/mm/ksm/mark_new_vma # 0 or 1 if 1 new vma will be marked like VM_MERGEABLE. Can you advise me something? I implement 2 new functions: ksm_vm_flags_mod() - working only in mm/mmap.c file, change default flags ksm_vma_add_new() - add new created vma to ksm internal tree If you see broken patch lines i have also attach patch. From db8ad0877146a69e1e5d5ab98825cefcf44a95bb Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sat, 8 Nov 2014 03:02:52 +0300 Subject: [PATCH] KSM: Add auto flag new VMA as VM_MERGEABLE Signed-off-by: Timofey Titovets --- include/linux/ksm.h | 31 +++++++++++++++++++++++++++++++ mm/mmap.c | 17 +++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 3be6bb1..c3fff64 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h @@ -76,6 +76,29 @@ struct page *ksm_might_need_to_copy(struct page *page, int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc); void ksm_migrate_page(struct page *newpage, struct page *oldpage); +/* + * Allow to mark new vma as VM_MERGEABLE + */ +#ifndef VM_SAO +#define VM_SAO 0 +#endif +static inline void ksm_vm_flags_mod(unsigned long *vm_flags) +{ + if (*vm_flags & (VM_MERGEABLE | VM_SHARED | VM_MAYSHARE | + VM_PFNMAP | VM_IO | VM_DONTEXPAND | + VM_HUGETLB | VM_NONLINEAR | VM_MIXEDMAP | VM_SAO) ) + return; + *vm_flags |= VM_MERGEABLE; +} + +static inline void ksm_vma_add_new(struct vm_area_struct *vma) +{ + struct mm_struct *mm = vma->vm_mm; + if (!test_bit(MMF_VM_MERGEABLE, &mm->flags)) { + __ksm_enter(mm); + } +} + #else /* !CONFIG_KSM */ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) @@ -92,6 +115,14 @@ static inline int PageKsm(struct page *page) return 0; } +static inline void ksm_vm_flags_mod(unsigned long *vm_flags_p) +{ +} + +void ksm_vma_add_new(struct vm_area_struct *vma) +{ +} + #ifdef CONFIG_MMU static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, unsigned long end, int advice, unsigned long *vm_flags) diff --git a/mm/mmap.c b/mm/mmap.c index 7f85520..ce0073e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -911,10 +912,14 @@ again: remove_next = 1 + (end > next->vm_end); vma_gap_update(next); else mm->highest_vm_end = end; + } else { + if (next && !insert) + ksm_vma_add_new(next); } if (insert && file) uprobe_mmap(insert); + ksm_vma_add_new(vma); validate_mm(mm); return 0; @@ -1307,6 +1312,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) | mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&vm_flags); + if (flags & MAP_LOCKED) if (!can_do_mlock()) return -EPERM; @@ -1648,6 +1656,7 @@ munmap_back: allow_write_access(file); } file = vma->vm_file; + ksm_vma_add_new(vma); out: perf_event_mmap(vma); @@ -2484,6 +2493,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, else err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new); + ksm_vma_add_new(vma); + /* Success. */ if (!err) return 0; @@ -2659,6 +2670,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) if (error) return error; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&flags); + /* * mm->mmap_sem is required to protect against another thread * changing the mappings in case we sleep. @@ -2708,6 +2722,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) vma->vm_flags = flags; vma->vm_page_prot = vm_get_page_prot(flags); vma_link(mm, vma, prev, rb_link, rb_parent); + ksm_vma_add_new(vma); out: perf_event_mmap(vma); mm->total_vm += len >> PAGE_SHIFT; @@ -2887,6 +2902,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, new_vma->vm_ops->open(new_vma); vma_link(mm, new_vma, prev, rb_link, rb_parent); *need_rmap_locks = false; + ksm_vma_add_new(new_vma); } } return new_vma; @@ -3004,6 +3020,7 @@ static struct vm_area_struct *__install_special_mapping( mm->total_vm += len >> PAGE_SHIFT; perf_event_mmap(vma); + ksm_vma_add_new(vma); return vma; -- 2.1.3 --------------000205070309000407000305 Content-Type: text/x-patch; name="0001-KSM-Add-auto-flag-new-VMA-as-VM_MERGEABLE.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-KSM-Add-auto-flag-new-VMA-as-VM_MERGEABLE.patch" >>From db8ad0877146a69e1e5d5ab98825cefcf44a95bb Mon Sep 17 00:00:00 2001 From: Timofey Titovets Date: Sat, 8 Nov 2014 03:02:52 +0300 Subject: [PATCH] KSM: Add auto flag new VMA as VM_MERGEABLE Signed-off-by: Timofey Titovets --- include/linux/ksm.h | 31 +++++++++++++++++++++++++++++++ mm/mmap.c | 17 +++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 3be6bb1..c3fff64 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h @@ -76,6 +76,29 @@ struct page *ksm_might_need_to_copy(struct page *page, int rmap_walk_ksm(struct page *page, struct rmap_walk_control *rwc); void ksm_migrate_page(struct page *newpage, struct page *oldpage); +/* + * Allow to mark new vma as VM_MERGEABLE + */ +#ifndef VM_SAO +#define VM_SAO 0 +#endif +static inline void ksm_vm_flags_mod(unsigned long *vm_flags) +{ + if (*vm_flags & (VM_MERGEABLE | VM_SHARED | VM_MAYSHARE | + VM_PFNMAP | VM_IO | VM_DONTEXPAND | + VM_HUGETLB | VM_NONLINEAR | VM_MIXEDMAP | VM_SAO) ) + return; + *vm_flags |= VM_MERGEABLE; +} + +static inline void ksm_vma_add_new(struct vm_area_struct *vma) +{ + struct mm_struct *mm = vma->vm_mm; + if (!test_bit(MMF_VM_MERGEABLE, &mm->flags)) { + __ksm_enter(mm); + } +} + #else /* !CONFIG_KSM */ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) @@ -92,6 +115,14 @@ static inline int PageKsm(struct page *page) return 0; } +static inline void ksm_vm_flags_mod(unsigned long *vm_flags_p) +{ +} + +void ksm_vma_add_new(struct vm_area_struct *vma) +{ +} + #ifdef CONFIG_MMU static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, unsigned long end, int advice, unsigned long *vm_flags) diff --git a/mm/mmap.c b/mm/mmap.c index 7f85520..ce0073e 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -911,10 +912,14 @@ again: remove_next = 1 + (end > next->vm_end); vma_gap_update(next); else mm->highest_vm_end = end; + } else { + if (next && !insert) + ksm_vma_add_new(next); } if (insert && file) uprobe_mmap(insert); + ksm_vma_add_new(vma); validate_mm(mm); return 0; @@ -1307,6 +1312,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags) | mm->def_flags | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&vm_flags); + if (flags & MAP_LOCKED) if (!can_do_mlock()) return -EPERM; @@ -1648,6 +1656,7 @@ munmap_back: allow_write_access(file); } file = vma->vm_file; + ksm_vma_add_new(vma); out: perf_event_mmap(vma); @@ -2484,6 +2493,8 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma, else err = vma_adjust(vma, vma->vm_start, addr, vma->vm_pgoff, new); + ksm_vma_add_new(vma); + /* Success. */ if (!err) return 0; @@ -2659,6 +2670,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) if (error) return error; + /* If ksm is enabled, we add VM_MERGABLE to new VMAs. */ + ksm_vm_flags_mod(&flags); + /* * mm->mmap_sem is required to protect against another thread * changing the mappings in case we sleep. @@ -2708,6 +2722,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) vma->vm_flags = flags; vma->vm_page_prot = vm_get_page_prot(flags); vma_link(mm, vma, prev, rb_link, rb_parent); + ksm_vma_add_new(vma); out: perf_event_mmap(vma); mm->total_vm += len >> PAGE_SHIFT; @@ -2887,6 +2902,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, new_vma->vm_ops->open(new_vma); vma_link(mm, new_vma, prev, rb_link, rb_parent); *need_rmap_locks = false; + ksm_vma_add_new(new_vma); } } return new_vma; @@ -3004,6 +3020,7 @@ static struct vm_area_struct *__install_special_mapping( mm->total_vm += len >> PAGE_SHIFT; perf_event_mmap(vma); + ksm_vma_add_new(vma); return vma; -- 2.1.3 --------------000205070309000407000305--