From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754043Ab0INNHY (ORCPT ); Tue, 14 Sep 2010 09:07:24 -0400 Received: from relay03-haj2.antispameurope.com ([83.246.65.53]:33826 "EHLO relay03-haj2.antispameurope.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753769Ab0INNHS (ORCPT ); Tue, 14 Sep 2010 09:07:18 -0400 Message-ID: <4C8F7381.50300@iis.fraunhofer.de> Date: Tue, 14 Sep 2010 15:07:13 +0200 From: Manuel Stahl User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.9) Gecko/20100825 Lightning/1.0b2 Thunderbird/3.1.3 MIME-Version: 1.0 To: Andrew Morton CC: linux-kernel@vger.kernel.org, Greg KH , linux-serial@vger.kernel.org Subject: Re: [PATCH] Add sc16is7x2 driver References: <4C80F419.5070601@iis.fraunhofer.de> <20100913172544.a81e8422.akpm@linux-foundation.org> In-Reply-To: <20100913172544.a81e8422.akpm@linux-foundation.org> Content-Type: multipart/mixed; boundary="------------000706050103030300000607" 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. --------------000706050103030300000607 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by iis.fhg.de id PAA24971 Hi Andrew, thank you for reviewing this driver. A cleaned up patch is attached. Am 14.09.2010 02:25, schrieb Andrew Morton: > On Fri, 03 Sep 2010 15:11:53 +0200 > Manuel Stahl wrote: > >> This patch adds support for the sc16is7x2 chips. >> > > The patch was pretty badly wordwrapped. Can you point out a few such places? >> +static unsigned int sc16is7x2_tx_empty(struct uart_port *port) >> +{ >> + struct sc16is7x2_channel *chan =3D >> + container_of(port, struct sc16is7x2_channel, uart); >> + struct sc16is7x2_chip *ts =3D chan->chip; >> + unsigned lsr; >> + >> + dev_dbg(&ts->spi->dev, "%s\n", __func__); >> + >> + mutex_lock(&chan->lock); >> + lsr =3D chan->lsr; >> + mutex_unlock(&chan->lock); > > It's strange to put locking around a single atomic read. What are we > trying to do here? > >> + return lsr& UART_LSR_TEMT ? TIOCSER_TEMT : 0; >> +} >> + >> >> ... >> >> +static void sc16is7x2_break_ctl(struct uart_port *port, int break_sta= te) >> +{ >> + struct sc16is7x2_channel *chan =3D >> + container_of(port, struct sc16is7x2_channel, uart); >> + struct sc16is7x2_chip *ts =3D chan->chip; >> + unsigned ch =3D port->line& 0x01; >> + unsigned long flags; >> + >> + dev_dbg(&ts->spi->dev, "%s\n", __func__); >> + >> + spin_lock_irqsave(&chan->uart.lock, flags); >> + if (break_state =3D=3D -1) >> + chan->lcr |=3D UART_LCR_SBC; >> + else >> + chan->lcr&=3D ~UART_LCR_SBC; >> + spin_unlock_irqrestore(&chan->uart.lock, flags); > > hm. Above we use the mutex to protect char->lcr but here we're using a > spinlock. I think in the break_ctl function it's not possible to use mutexes. What=20 would be the right way to protect the register cache? >> >> ... >> >> +static irqreturn_t sc16is7x2_interrupt(int irq, void *dev_id) >> +{ >> + struct sc16is7x2_chip *ts =3D dev_id; >> + >> + dev_dbg(&ts->spi->dev, "%s\n", __func__); >> + >> + if (!ts->force_end_work&& !work_pending(&ts->work)&& >> + !freezing(current)&& !ts->suspending) >> + queue_work(ts->workqueue,&ts->work); >> + >> + return IRQ_HANDLED; >> +} > > The kernel has infrastructure for "threaded irqs" nowadays. What this > driver is doing basically reimplements that concept. Did you consider > using threaded IRQs directly? Ah, I didn't know that. The irq stuff is based on the max3100 driver.=20 Where can I find some example how to use the new threaded irqs? Regards, --=20 Dipl.-Inf. Manuel Stahl Fraunhofer-Institut f=C3=BCr Integrierte Schaltungen IIS - Leistungsoptimierte Systeme - Nordostpark 93 Telefon +49 (0)911/58061-6419 90411 N=C3=BCrnberg Fax +49 (0)911/58061-6398 http://www.iis.fraunhofer.de manuel.stahl@iis.fraunhofer.de --------------000706050103030300000607 Content-Type: text/plain; name="add_sc16is7x2_driver.patch" Content-Disposition: attachment; filename="add_sc16is7x2_driver.patch" Content-Transfer-Encoding: base64 VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIHRoZSBzYzE2aXM3eDIgY2hpcHMuCgpTaWdu ZWQtb2ZmLWJ5OiBNYW51ZWwgU3RhaGwgPG1hbnVlbC5zdGFobEBpaXMuZnJhdW5ob2Zlci5k ZT4KLS0tCiBkcml2ZXJzL3NlcmlhbC9LY29uZmlnICAgICAgICB8ICAgIDkgKwogZHJpdmVy cy9zZXJpYWwvTWFrZWZpbGUgICAgICAgfCAgICAxICsKIGRyaXZlcnMvc2VyaWFsL3NjMTZp czd4Mi5jICAgIHwgMTM3NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oICAgfCAgICAzICsKIGluY2x1ZGUv bGludXgvc3BpL3NjMTZpczd4Mi5oIHwgICAxNyArCiA1IGZpbGVzIGNoYW5nZWQsIDE0MDUg aW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Nl cmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCAxMjkwMGY3Li45 OGZjMGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZl cnMvc2VyaWFsL0tjb25maWcKQEAgLTI2OSw2ICsyNjksMTUgQEAgY29uZmlnIFNFUklBTF84 MjUwX1JNOUsKIAogY29tbWVudCAiTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAor Y29uZmlnIFNFUklBTF9TQzE2SVM3WDIKKwl0cmlzdGF0ZSAiU0MxNklTN3gyIGNoaXBzIgor CWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBHUElPTElCCisJc2VsZWN0IFNFUklBTF9DT1JF CisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgYWRkIHN1cHBvcnQgZm9y IFNDMTZJUzd4MiBTUEkgVUFSVHMuCisJICBUaGUgR1BJT3MgYXJlIGV4cG9ydGVkIHZpYSBn cGlvbGliIGludGVyZmFjZS4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTRVJJ QUxfQU1CQV9QTDAxMAogCXRyaXN0YXRlICJBUk0gQU1CQSBQTDAxMCBzZXJpYWwgcG9ydCBz dXBwb3J0IgogCWRlcGVuZHMgb24gQVJNX0FNQkEgJiYgKEJST0tFTiB8fCAhQVJDSF9WRVJT QVRJTEUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMv c2VyaWFsL01ha2VmaWxlCmluZGV4IDFjYTRmZDUuLjRjNmEyOTcgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBA IC0yOCw2ICsyOCw3IEBAIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9CT0NBKSArPSA4MjUw X2JvY2Eubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0VYQVJfU1QxNkM1NTQpICs9IDgy NTBfZXhhcl9zdDE2YzU1NC5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfSFVCNikgKz0g ODI1MF9odWI2Lm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9NQ0EpICs9IDgyNTBfbWNh Lm8KK29iai0kKENPTkZJR19TRVJJQUxfU0MxNklTN1gyKQkrPSBzYzE2aXM3eDIubwogb2Jq LSQoQ09ORklHX1NFUklBTF9BTUJBX1BMMDEwKSArPSBhbWJhLXBsMDEwLm8KIG9iai0kKENP TkZJR19TRVJJQUxfQU1CQV9QTDAxMSkgKz0gYW1iYS1wbDAxMS5vCiBvYmotJChDT05GSUdf U0VSSUFMX0NMUFM3MTFYKSArPSBjbHBzNzExeC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Nl cmlhbC9zYzE2aXM3eDIuYyBiL2RyaXZlcnMvc2VyaWFsL3NjMTZpczd4Mi5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YmNkMDMKLS0tIC9kZXYvbnVsbAorKysg Yi9kcml2ZXJzL3NlcmlhbC9zYzE2aXM3eDIuYwpAQCAtMCwwICsxLDEzNzUgQEAKKy8qKgor ICogZHJpdmVycy9zZXJpYWwvc2MxNmlzN3gyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIw MDkgTWFudWVsIFN0YWhsIDxtYW51ZWwuc3RhaGxAaWlzLmZyYXVuaG9mZXIuZGU+CisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGUgU0MxNklTN3gyIGRldmlj ZSBpcyBhIFNQSSBkcml2ZW4gZHVhbCBVQVJUIHdpdGggR1BJT3MuCisgKgorICogVGhlIGRy aXZlciBleHBvcnRzIHR3byB1YXJ0cyBhbmQgYSBncGlvY2hpcCBpbnRlcmZhY2UuCisgKi8K KworLyogI2RlZmluZSBERUJVRyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4 Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6 ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc2MxNmlzN3gyLmg+CisjaW5jbHVkZSA8bGlu dXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5j bHVkZSA8bGludXgvZ3Bpby5oPgorCisjZGVmaW5lIFNDMTZJUzdYMl9NQUpPUgkJMjA0Cisj ZGVmaW5lIFNDMTZJUzdYMl9NSU5PUgkJMjA5CisjZGVmaW5lIE1BWF9TQzE2SVM3WDIJCTgK KyNkZWZpbmUgRklGT19TSVpFCQk2NAorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkic2MxNmlz N3gyIgorI2RlZmluZSBUWVBFX05BTUUJCSJTQzE2SVM3eDIiCisKKworCisjZGVmaW5lIFJF R19SRUFECTB4ODAKKyNkZWZpbmUgUkVHX1dSSVRFCTB4MDAKKworLyogU3BlY2lhbCByZWdp c3RlcnMgKi8KKyNkZWZpbmUgUkVHX1RYTFZMCTB4MDgJLyogVHJhbnNtaXR0ZXIgRklGTyBM ZXZlbCByZWdpc3RlciAqLworI2RlZmluZSBSRUdfUlhMVkwJMHgwOQkvKiBSZWNlaXZlciBG SUZPIExldmVsIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JT0QJCTB4MEEJLyogSU8gRGly ZWN0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JT1MJCTB4MEIJLyogSU8gU3RhdGUg cmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX0lPSQkJMHgwQwkvKiBJTyBJbnRlcnJ1cHQgRW5h YmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19JT0MJCTB4MEUJLyogSU8gQ29udHJvbCBy ZWdpc3RlciAqLworCisjZGVmaW5lIElPQ19TUkVTRVQJMHgwOCAgICAvKiBTb2Z0d2FyZSBy ZXNldCAqLworI2RlZmluZSBJT0NfR1BJTzMwCTB4MDQgICAgLyogR1BJTyAzOjAgdW5zZXQ6 IGFzIElPLCBzZXQ6IGFzIG1vZGVtIHBpbnMgKi8KKyNkZWZpbmUgSU9DX0dQSU83NAkweDAy ICAgIC8qIEdQSU8gNzo0IHVuc2V0OiBhcyBJTywgc2V0OiBhcyBtb2RlbSBwaW5zICovCisj ZGVmaW5lIElPQ19JT0xBVENICTB4MDEgICAgLyogVW5zZXQ6IGlucHV0IHVubGF0Y2hlZCwg c2V0OiBpbnB1dCBsYXRjaGVkICovCisKKy8qIFJlZGVmaW5lIHNvbWUgTUNSIGJpdHMgKi8K KyNpZmRlZiBVQVJUX01DUl9UQ1JUTFIKKyN1bmRlZiBVQVJUX01DUl9UQ1JUTFIKKyNlbmRp ZgorI2RlZmluZSBVQVJUX01DUl9UQ1JUTFIJCTB4MDQKKyNkZWZpbmUgVUFSVF9NQ1JfSVJE QQkJMHg0MAorCisvKiAxNmJpdCBTUEkgY29tbWFuZCB0byByZWFkIG9yIHdyaXRlIGEgcmVn aXN0ZXIgKi8KK3N0cnVjdCBzYzE2aXM3eDJfc3BpX3JlZyB7CisJdTggY21kOworCXU4IHZh bHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNjMTZpczd4Ml9jaGlwOworCisvKgorICog U29tZSByZWdpc3RlcnMgbXVzdCBiZSByZWFkIGJhY2sgdG8gbW9kaWZ5LgorICogVG8gc2F2 ZSB0aW1lIHdlIGNhY2hlIHRoZW0gaGVyZSBpbiBtZW1vcnkuCisgKiBUaGUgQGxvY2sgbXV0 ZXggaXMgdGhlcmUgdG8gcHJvdGVjdCB0aGVtLgorICovCitzdHJ1Y3Qgc2MxNmlzN3gyX2No YW5uZWwgeworCXN0cnVjdCBzYzE2aXM3eDJfY2hpcAkqY2hpcDsJLyogYmFjayBsaW5rICov CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCB1YXJ0X3BvcnQJdWFydDsKKwlzdHJ1 Y3Qgc3BpX3RyYW5zZmVyIGZpZm9fcng7CisJc3RydWN0IHNwaV90cmFuc2ZlciBmaWZvX3R4 WzNdOworCXU4CQlpaXI7CisJdTgJCWxzcjsKKwl1OAkJbXNyOworCXU4CQlpZXI7CQkvKiBj YWNoZSBmb3IgSUVSIHJlZ2lzdGVyICovCisJdTgJCWZjcjsJCS8qIGNhY2hlIGZvciBGQ1Ig cmVnaXN0ZXIgKi8KKwl1OAkJbGNyOwkJLyogY2FjaGUgZm9yIExDUiByZWdpc3RlciAqLwor CXU4CQltY3I7CQkvKiBjYWNoZSBmb3IgTUNSIHJlZ2lzdGVyICovCisJdTgJCSpyeF9idWY7 CisJdTgJCXdyaXRlX2ZpZm9fY21kOworCXU4CQlyZWFkX2ZpZm9fY21kOworCWJvb2wJCWFj dGl2ZTsKK307CisKK3N0cnVjdCBzYzE2aXM3eDJfY2hpcCB7CisJc3RydWN0IHNwaV9kZXZp Y2UgKnNwaTsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87CisJc3RydWN0IG11dGV4CSBsb2Nr OworCXN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCBjaGFubmVsWzJdOworCisJLyogZm9yIGhh bmRsaW5nIGlycXM6IG5lZWQgd29ya3F1ZXVlIHNpbmNlIHdlIGRvIHNwaV9zeW5jICovCisJ c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1 Y3Qgd29yazsKKwkvKiBzZXQgdG8gMSB0byBtYWtlIHRoZSB3b3JraGFuZGxlciBleGl0IGFz IHNvb24gYXMgcG9zc2libGUgKi8KKwlpbnQgZm9yY2VfZW5kX3dvcms7CisJLyogbmVlZCB0 byBrbm93IHdlIGFyZSBzdXNwZW5kaW5nIHRvIGF2b2lkIGRlYWRsb2NrIG9uIHdvcmtxdWV1 ZSAqLworCWludCBzdXNwZW5kaW5nOworCisJc3RydWN0IHNwaV9tZXNzYWdlIGZpZm9fbWVz c2FnZTsKKworI2RlZmluZSBVQVJUX0JVR19UWEVOCUJJVCgxKQkvKiBVQVJUIGhhcyBidWdn eSBUWCBJSVIgc3RhdHVzICovCisjZGVmaW5lIFVBUlRfQlVHX05PTVNSCUJJVCgyKQkvKiBV QVJUIGhhcyBidWdneSBNU1Igc3RhdHVzIGJpdHMgKEF1MXgwMCkgKi8KKyNkZWZpbmUgVUFS VF9CVUdfVEhSRQlCSVQoMykJLyogVUFSVCBoYXMgYnVnZ3kgVEhSRSByZWFzc2VydGlvbiAq LworCXUxNgkJYnVnczsJCS8qIHBvcnQgYnVncyAqLworCisjZGVmaW5lIExTUl9TQVZFX0ZM QUdTIFVBUlRfTFNSX0JSS19FUlJPUl9CSVRTCisJdTgJCWxzcl9zYXZlZF9mbGFnczsKKyNk ZWZpbmUgTVNSX1NBVkVfRkxBR1MgVUFSVF9NU1JfQU5ZX0RFTFRBCisJdTgJCW1zcl9zYXZl ZF9mbGFnczsKKwl1OAkJaW9fZGlyOwkJLyogY2FjaGUgZm9yIElPRGlyIHJlZ2lzdGVyICov CisJdTgJCWlvX3N0YXRlOwkvKiBjYWNoZSBmb3IgSU9TdGF0ZSByZWdpc3RlciAqLworCXU4 CQlpb19ncGlvOwkvKiBQSU4gaXMgR1BJTyAqLworCXU4CQlpb19jb250cm9sOwkvKiBjYWNo ZSBmb3IgSU9Db250cm9sIHJlZ2lzdGVyICovCit9OworCisvKiAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiBTUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq ICovCisKK3N0YXRpYyB1OCB3cml0ZV9jbWQodTggcmVnLCB1OCBjaCkKK3sKKwlyZXR1cm4g UkVHX1dSSVRFIHwgKHJlZyAmIDB4ZikgPDwgMyB8IChjaCAmIDB4MSkgPDwgMTsKK30KKwor c3RhdGljIHU4IHJlYWRfY21kKHU4IHJlZywgdTggY2gpCit7CisJcmV0dXJuIFJFR19SRUFE ICB8IChyZWcgJiAweGYpIDw8IDMgfCAoY2ggJiAweDEpIDw8IDE7Cit9CisKKy8qCisgKiBS ZXNlcnZlIG1lbW9yeSBmb3IgY29tbWFuZCBzZXF1ZW5jZQorICogQGNudCBudW1iZXIgb2Yg Y29tbWFuZHMKKyAqLworc3RhdGljIHN0cnVjdCBzYzE2aXM3eDJfc3BpX3JlZyAqCitzYzE2 aXM3eDJfYWxsb2Nfc3BpX2NtZHModW5zaWduZWQgY250KQoreworCXJldHVybiBrY2FsbG9j KGNudCwgc2l6ZW9mKHN0cnVjdCBzYzE2aXM3eDJfc3BpX3JlZyksIEdGUF9LRVJORUwpOwor fQorCisvKgorICogc2MxNmlzN3gyX2FkZF93cml0ZV9jbWQgLSBBZGQgd3JpdGUgY29tbWFu ZCB0byBzZXF1ZW5jZQorICovCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfYWRkX3dyaXRlX2Nt ZChzdHJ1Y3Qgc2MxNmlzN3gyX3NwaV9yZWcgKmNtZCwKKwkJdTggcmVnLCB1OCBjaCwgdTgg dmFsdWUpCit7CisJY21kLT5jbWQgPSB3cml0ZV9jbWQocmVnLCBjaCk7CisJY21kLT52YWx1 ZSA9IHZhbHVlOworfQorCisvKgorICogc2MxNmlzN3gyX2FkZF9yZWFkX2NtZCAtIEFkZCBy ZWFkIGNvbW1hbmQgdG8gc2VxdWVuY2UKKyAqLworc3RhdGljIHZvaWQgc2MxNmlzN3gyX2Fk ZF9yZWFkX2NtZChzdHJ1Y3Qgc2MxNmlzN3gyX3NwaV9yZWcgKmNtZCwKKwkJdTggcmVnLCB1 OCBjaCkKK3sKKwljbWQtPmNtZCA9IHJlYWRfY21kKHJlZywgY2gpOworCWNtZC0+dmFsdWUg PSAwOworfQorCisvKgorICogc2MxNmlzN3gyX2NvbXBsZXRlIC0gQ29tcGxldGlvbiBoYW5k bGVyIGZvciBhc3luYyBTUEkgdHJhbnNmZXJzCisgKi8KK3N0YXRpYyB2b2lkIHNjMTZpczd4 Ml9jb21wbGV0ZSh2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbSA9 IGNvbnRleHQ7CisJdTggKnR4X2NoYWluID0gbS0+c3RhdGU7CisKKwlrZnJlZSh0eF9jaGFp bik7CisJa2ZyZWUobSk7Cit9CisKKy8qCisgKiBzYzE2aXM3eDJfc3BpX2FzeW5jIC0gU2Vu ZCBjb21tYW5kIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBpbnQgc2MxNmlzN3gyX3NwaV9hc3lu YyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc2MxNmlzN3gyX3NwaV9yZWcg KmNtZHMsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXN0 cnVjdCBzcGlfbWVzc2FnZSAqbTsKKworCW0gPSBzcGlfbWVzc2FnZV9hbGxvYyhsZW4sIEdG UF9LRVJORUwpOworCWlmICghbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltLT5jb21wbGV0 ZSA9IHNjMTZpczd4Ml9jb21wbGV0ZTsKKwltLT5jb250ZXh0ID0gbTsKKwltLT5zdGF0ZSA9 IGNtZHM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zl cl9saXN0KSB7CisJCXQtPnR4X2J1ZiA9ICh1OCAqKWNtZHM7CisJCXQtPmxlbiA9IDI7CisJ CXQtPmNzX2NoYW5nZSA9IHRydWU7CisJCWNtZHMrKzsKKwl9CisKKwlyZXR1cm4gc3BpX2Fz eW5jKHNwaSwgbSk7Cit9CisKKy8qCisgKiBzYzE2aXM3eDJfd3JpdGVfYXN5bmMgLSBXcml0 ZSBhIG5ldyByZWdpc3RlciBjb250ZW50IChhc3luYykKKyAqLworc3RhdGljIGludCBzYzE2 aXM3eDJfd3JpdGVfYXN5bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcmVnLCB1OCBj aCwKKwkJdTggdmFsdWUpCit7CisJc3RydWN0IHNjMTZpczd4Ml9zcGlfcmVnICpjbWQgPSBz YzE2aXM3eDJfYWxsb2Nfc3BpX2NtZHMoMSk7CisKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIC1F Tk9NRU07CisJc2MxNmlzN3gyX2FkZF93cml0ZV9jbWQoY21kLCByZWcsIGNoLCB2YWx1ZSk7 CisJcmV0dXJuIHNjMTZpczd4Ml9zcGlfYXN5bmMoc3BpLCBjbWQsIDEpOworfQorCisvKgor ICogc2MxNmlzN3gyX3dyaXRlIC0gV3JpdGUgYSBuZXcgcmVnaXN0ZXIgY29udGVudCAoc3lu YykKKyAqLworc3RhdGljIGludCBzYzE2aXM3eDJfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2Ug KnNwaSwgdTggcmVnLCB1OCBjaCwgdTggdmFsKQoreworCXN0cnVjdCBzYzE2aXM3eDJfc3Bp X3JlZyBvdXQ7CisKKwlvdXQuY21kID0gd3JpdGVfY21kKHJlZywgY2gpOworCW91dC52YWx1 ZSA9IHZhbDsKKwlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJm91dCwgc2l6 ZW9mKG91dCkpOworfQorCisvKioKKyAqIHNjMTZpczd4Ml9yZWFkIC0gUmVhZCBiYWNrIHJl Z2lzdGVyIGNvbnRlbnQKKyAqIEBzcGk6IFRoZSBTUEkgZGV2aWNlCisgKiBAcmVnOiBSZWdp c3RlciBvZmZzZXQKKyAqIEBjaDogIENoYW5uZWwgKDAgb3IgMSkKKyAqCisgKiBSZXR1cm5z IHBvc2l0aXZlIDggYml0IHZhbHVlIGZyb20gZGV2aWNlIGlmIHN1Y2Nlc3NmdWwgb3IgYQor ICogbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBzYzE2aXM3eDJf cmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIGNo KQoreworCXJldHVybiBzcGlfdzhyOChzcGksIHJlYWRfY21kKHJlZywgY2gpKTsKK30KKwor LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVUFSVCAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiogKi8KKworLyogVWFydCBkaXZpc29yIGxhdGNoIHdyaXRl ICovCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfYWRkX2RsX3dyaXRlX2NtZChzdHJ1Y3Qgc2Mx NmlzN3gyX3NwaV9yZWcgKmNtZCwKKwkJdTggY2gsIGludCB2YWx1ZSkKK3sKKwlzYzE2aXM3 eDJfYWRkX3dyaXRlX2NtZCgmY21kWzBdLCBVQVJUX0RMTCwgY2gsIHZhbHVlICYgMHhmZik7 CisJc2MxNmlzN3gyX2FkZF93cml0ZV9jbWQoJmNtZFsxXSwgVUFSVF9ETE0sIGNoLCB2YWx1 ZSA+PiA4ICYgMHhmZik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2MxNmlzN3gyX3R4 X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNjMTZpczd4Ml9j aGFubmVsICpjaGFuID0KKwkJCWNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc2MxNmlzN3gy X2NoYW5uZWwsIHVhcnQpOworCXN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMgPSBjaGFuLT5j aGlwOworCXVuc2lnbmVkIGxzcjsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4i LCBfX2Z1bmNfXyk7CisKKwlsc3IgPSBjaGFuLT5sc3I7CisJcmV0dXJuIGxzciAmIFVBUlRf TFNSX1RFTVQgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50 IHNjMTZpczd4Ml9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1 Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQsIHN0 cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlw ICp0cyA9IGNoYW4tPmNoaXA7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBp bnQgcmV0OworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsK KworCXN0YXR1cyA9IGNoYW4tPm1zcjsKKworCXJldCA9IDA7CisJaWYgKHN0YXR1cyAmIFVB UlRfTVNSX0RDRCkKKwkJcmV0IHw9IFRJT0NNX0NBUjsKKwlpZiAoc3RhdHVzICYgVUFSVF9N U1JfUkkpCisJCXJldCB8PSBUSU9DTV9STkc7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RT UikKKwkJcmV0IHw9IFRJT0NNX0RTUjsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKQor CQlyZXQgfD0gVElPQ01fQ1RTOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25l ZCBpbnQgX19zZXRfbWN0cmwodW5zaWduZWQgaW50IG1jdHJsKQoreworCXVuc2lnbmVkIGNo YXIgbWNyID0gMDsKKworCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJbWNyIHw9IFVBUlRf TUNSX1JUUzsKKwlpZiAobWN0cmwgJiBUSU9DTV9EVFIpCisJCW1jciB8PSBVQVJUX01DUl9E VFI7CisJaWYgKG1jdHJsICYgVElPQ01fTE9PUCkKKwkJbWNyIHw9IFVBUlRfTUNSX0xPT1A7 CisKKwlyZXR1cm4gbWNyOworfQorCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfc2V0X21jdHJs KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKK3sKKwlzdHJ1 Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQsIHN0 cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlw ICp0cyA9IGNoYW4tPmNoaXA7CisJdW5zaWduZWQgY2ggPSBwb3J0LT5saW5lICYgMHgwMTsK KworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJc2MxNmlz N3gyX3dyaXRlX2FzeW5jKHRzLT5zcGksIFVBUlRfTUNSLCBjaCwgX19zZXRfbWN0cmwobWN0 cmwpKTsKK30KKworc3RhdGljIHZvaWQgX19zdG9wX3R4KHN0cnVjdCBzYzE2aXM3eDJfY2hh bm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hhbi0+Y2hp cDsKKwl1bnNpZ25lZCBjaCA9IGNoYW4tPnVhcnQubGluZSAmIDB4MDE7CisKKwlpZiAoY2hh bi0+aWVyICYgVUFSVF9JRVJfVEhSSSkgeworCQljaGFuLT5pZXIgJj0gflVBUlRfSUVSX1RI Ukk7CisJCXNjMTZpczd4Ml93cml0ZV9hc3luYyh0cy0+c3BpLCBVQVJUX0lFUiwgY2gsIGNo YW4tPmllcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfc3RvcF90eChzdHJ1 Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCAqY2hh biA9CisJCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNjMTZpczd4Ml9jaGFubmVsLCB1 YXJ0KTsKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hhbi0+Y2hpcDsKKworCWRl dl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlfX3N0b3BfdHgo Y2hhbik7Cit9CisKK3N0YXRpYyB2b2lkIHNjMTZpczd4Ml9zdGFydF90eChzdHJ1Y3QgdWFy dF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCAqY2hhbiA9CisJ CQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNjMTZpczd4Ml9jaGFubmVsLCB1YXJ0KTsK KwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hhbi0+Y2hpcDsKKwl1bnNpZ25lZCBj aCA9IHBvcnQtPmxpbmUgJiAweDAxOworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNc biIsIF9fZnVuY19fKTsKKworCWlmICghKGNoYW4tPmllciAmIFVBUlRfSUVSX1RIUkkpKSB7 CisJCWNoYW4tPmllciB8PSBVQVJUX0lFUl9USFJJOworCQlzYzE2aXM3eDJfd3JpdGVfYXN5 bmModHMtPnNwaSwgVUFSVF9JRVIsIGNoLCBjaGFuLT5pZXIpOworCX0KK30KKworc3RhdGlj IHZvaWQgc2MxNmlzN3gyX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlz dHJ1Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQs IHN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9j aGlwICp0cyA9IGNoYW4tPmNoaXA7CisJdW5zaWduZWQgY2ggPSBwb3J0LT5saW5lICYgMHgw MTsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlj aGFuLT5pZXIgJj0gflVBUlRfSUVSX1JMU0k7CisJY2hhbi0+dWFydC5yZWFkX3N0YXR1c19t YXNrICY9IH5VQVJUX0xTUl9EUjsKKwlzYzE2aXM3eDJfd3JpdGVfYXN5bmModHMtPnNwaSwg VUFSVF9JRVIsIGNoLCBjaGFuLT5pZXIpOworfQorCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJf ZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNjMTZpczd4 Ml9jaGFubmVsICpjaGFuID0KKwkJCWNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc2MxNmlz N3gyX2NoYW5uZWwsIHVhcnQpOworCXN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMgPSBjaGFu LT5jaGlwOworCXVuc2lnbmVkIGNoID0gcG9ydC0+bGluZSAmIDB4MDE7CisKKwlkZXZfZGJn KCZ0cy0+c3BpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJY2hhbi0+aWVyIHw9IFVB UlRfSUVSX01TSTsKKwlzYzE2aXM3eDJfd3JpdGVfYXN5bmModHMtPnNwaSwgVUFSVF9JRVIs IGNoLCBjaGFuLT5pZXIpOworfQorCitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfYnJlYWtfY3Rs KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwlzdHJ1Y3Qg c2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQsIHN0cnVj dCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0 cyA9IGNoYW4tPmNoaXA7CisJdW5zaWduZWQgY2ggPSBwb3J0LT5saW5lICYgMHgwMTsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNcbiIs IF9fZnVuY19fKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT51YXJ0LmxvY2ssIGZs YWdzKTsKKwlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCisJCWNoYW4tPmxjciB8PSBVQVJUX0xD Ul9TQkM7CisJZWxzZQorCQljaGFuLT5sY3IgJj0gflVBUlRfTENSX1NCQzsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZjaGFuLT51YXJ0LmxvY2ssIGZsYWdzKTsKKworCXNjMTZpczd4 Ml93cml0ZV9hc3luYyh0cy0+c3BpLCBVQVJUX0xDUiwgY2gsIGNoYW4tPmxjcik7Cit9CisK K3N0YXRpYyBpbnQgc2MxNmlzN3gyX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkK K3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29m KHBvcnQsIHN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZp czd4Ml9jaGlwICp0cyA9IGNoYW4tPmNoaXA7CisJdW5zaWduZWQgY2ggPSBwb3J0LT5saW5l ICYgMHgwMTsKKwlzdHJ1Y3Qgc2MxNmlzN3gyX3NwaV9yZWcgKmNtZHMsICpjbWQ7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzIChsaW5l ICVkKVxuIiwgX19mdW5jX18sIHBvcnQtPmxpbmUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUo JmNoYW4tPnVhcnQubG9jaywgZmxhZ3MpOworCWNoYW4tPmxjciA9IFVBUlRfTENSX1dMRU44 OworCWNoYW4tPm1jciA9IF9fc2V0X21jdHJsKGNoYW4tPnVhcnQubWN0cmwpOworCWNoYW4t PmZjciA9IDA7CisJY2hhbi0+aWVyID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT51YXJ0LmxvY2ssIGZsYWdzKTsKKwor CWNtZHMgPSBzYzE2aXM3eDJfYWxsb2Nfc3BpX2NtZHMoOCk7CisJaWYgKCFjbWRzKQorCQly ZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IGNtZHM7CisJLyogQ2xlYXIgdGhlIGludGVycnVw dCByZWdpc3RlcnMuICovCisJc2MxNmlzN3gyX2FkZF93cml0ZV9jbWQoY21kLCBVQVJUX0lF UiwgY2gsIDApOworCXNjMTZpczd4Ml9hZGRfcmVhZF9jbWQoKytjbWQsIFVBUlRfSUlSLCBj aCk7CisJc2MxNmlzN3gyX2FkZF9yZWFkX2NtZCgrK2NtZCwgVUFSVF9MU1IsIGNoKTsKKwlz YzE2aXM3eDJfYWRkX3JlYWRfY21kKCsrY21kLCBVQVJUX01TUiwgY2gpOworCisJc2MxNmlz N3gyX2FkZF93cml0ZV9jbWQoKytjbWQsIFVBUlRfRkNSLCBjaCwgVUFSVF9GQ1JfRU5BQkxF X0ZJRk8gfAorCQkgICAgICAgVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFS X1hNSVQpOworCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21kKCsrY21kLCBVQVJUX0ZDUiwgY2gs IGNoYW4tPmZjcik7CisJLyogTm93LCBpbml0aWFsaXplIHRoZSBVQVJUICovCisJc2MxNmlz N3gyX2FkZF93cml0ZV9jbWQoKytjbWQsIFVBUlRfTENSLCBjaCwgY2hhbi0+bGNyKTsKKwlz YzE2aXM3eDJfYWRkX3dyaXRlX2NtZCgrK2NtZCwgVUFSVF9NQ1IsIGNoLCBjaGFuLT5tY3Ip OworCisJc2MxNmlzN3gyX3NwaV9hc3luYyh0cy0+c3BpLCBjbWRzLCA4KTsKKworCWNoYW4t PmFjdGl2ZSA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjMTZpczd4 Ml9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzYzE2aXM3 eDJfY2hhbm5lbCAqY2hhbiA9CisJCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNjMTZp czd4Ml9jaGFubmVsLCB1YXJ0KTsKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hh bi0+Y2hpcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoID0gcG9ydC0+ bGluZSAmIDB4MDE7CisKKwlkZXZfZGJnKCZ0cy0+c3BpLT5kZXYsICIlc1xuIiwgX19mdW5j X18pOworCisJQlVHX09OKCFjaGFuKTsKKwlCVUdfT04oIXRzKTsKKworCWlmICh0cy0+c3Vz cGVuZGluZykKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gdGhp cyBwb3J0ICovCisJY2hhbi0+aWVyID0gMDsKKwljaGFuLT5hY3RpdmUgPSBmYWxzZTsKKwlz YzE2aXM3eDJfd3JpdGUodHMtPnNwaSwgVUFSVF9JRVIsIGNoLCBjaGFuLT5pZXIpOworCisJ LyogV2FpdCBmb3Igd29ya2VyIG9mIHRoaXMgY2hhbm5lbCB0byBmaW5pc2ggKi8KKwltdXRl eF9sb2NrKCZjaGFuLT5sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT51YXJ0 LmxvY2ssIGZsYWdzKTsKKwljaGFuLT5tY3IgPSBfX3NldF9tY3RybChjaGFuLT51YXJ0Lm1j dHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT51YXJ0LmxvY2ssIGZsYWdz KTsKKworCS8qIERpc2FibGUgYnJlYWsgY29uZGl0aW9uIGFuZCBGSUZPcyAqLworCWNoYW4t PmxjciAmPSB+VUFSVF9MQ1JfU0JDOworCisJc2MxNmlzN3gyX3dyaXRlKHRzLT5zcGksIFVB UlRfTUNSLCBjaCwgY2hhbi0+bWNyKTsKKwlzYzE2aXM3eDJfd3JpdGUodHMtPnNwaSwgVUFS VF9MQ1IsIGNoLCBjaGFuLT5sY3IpOworCisJbXV0ZXhfdW5sb2NrKCZjaGFuLT5sb2NrKTsK K30KKworc3RhdGljIHZvaWQKK3NjMTZpczd4Ml9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9w b3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCSAgICAgICBzdHJ1Y3Qg a3Rlcm1pb3MgKm9sZCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQor CQkJY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7 CisJc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0cyA9IGNoYW4tPmNoaXA7CisJc3RydWN0IHNj MTZpczd4Ml9zcGlfcmVnICpjbWRzOworCXVuc2lnbmVkIGNoID0gcG9ydC0+bGluZSAmIDB4 MDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYmF1ZCwgcXVvdDsK Kwl1OCBpZXIsIG1jciwgbGNyLCBmY3IgPSAwOworCXU4IGVmciA9IFVBUlRfRUZSX0VDQjsK KworCS8qIHNldCB3b3JkIGxlbmd0aCAqLworCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAm IENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWxjciA9IFVBUlRfTENSX1dMRU41OworCQlicmVh azsKKwljYXNlIENTNjoKKwkJbGNyID0gVUFSVF9MQ1JfV0xFTjY7CisJCWJyZWFrOworCWNh c2UgQ1M3OgorCQlsY3IgPSBVQVJUX0xDUl9XTEVONzsKKwkJYnJlYWs7CisJZGVmYXVsdDoK KwljYXNlIENTODoKKwkJbGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJCWJyZWFrOworCX0KKwor CWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQorCQlsY3IgfD0gVUFSVF9MQ1JfU1RP UDsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKKwkJbGNyIHw9IFVBUlRfTENS X1BBUklUWTsKKwlpZiAoISh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKSkKKwkJbGNyIHw9 IFVBUlRfTENSX0VQQVI7CisjaWZkZWYgQ01TUEFSCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcg JiBDTVNQQVIpCisJCWxjciB8PSBVQVJUX0xDUl9TUEFSOworI2VuZGlmCisKKwkvKiBBc2sg dGhlIGNvcmUgdG8gY2FsY3VsYXRlIHRoZSBkaXZpc29yIGZvciB1cy4gKi8KKwliYXVkID0g dWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwKKwkJCQkgIHBvcnQtPnVh cnRjbGsgLyAxNiAvIDB4ZmZmZiwKKwkJCQkgIHBvcnQtPnVhcnRjbGsgLyAxNik7CisJcXVv dCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7CisKKwlkZXZfZGJnKCZ0cy0+c3Bp LT5kZXYsICIlcyAoYmF1ZCAldSlcbiIsIF9fZnVuY19fLCBiYXVkKTsKKworCisJLyogY29u ZmlndXJlIHRoZSBmaWZvICovCisJaWYgKGJhdWQgPCAyNDAwKQorCQlmY3IgPSBVQVJUX0ZD Ul9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwllbHNlCisJCWZjciA9IFVB UlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfUl9UUklHXzAxOworCisJLyoKKwkgKiBN Q1ItYmFzZWQgYXV0byBmbG93IGNvbnRyb2wuICBXaGVuIEFGRSBpcyBlbmFibGVkLCBSVFMg d2lsbCBiZQorCSAqIGRlYXNzZXJ0ZWQgd2hlbiB0aGUgcmVjZWl2ZSBGSUZPIGNvbnRhaW5z IG1vcmUgY2hhcmFjdGVycyB0aGFuCisJICogdGhlIHRyaWdnZXIsIG9yIHRoZSBNQ1IgUlRT IGJpdCBpcyBjbGVhcmVkLiAgSW4gdGhlIGNhc2Ugd2hlcmUKKwkgKiB0aGUgcmVtb3RlIFVB UlQgaXMgbm90IHVzaW5nIENUUyBhdXRvIGZsb3cgY29udHJvbCwgd2UgbXVzdAorCSAqIGhh dmUgc3VmZmljaWVudCBGSUZPIGVudHJpZXMgZm9yIHRoZSBsYXRlbmN5IG9mIHRoZSByZW1v dGUKKwkgKiBVQVJUIHRvIHJlc3BvbmQuICBJT1csIGF0IGxlYXN0IDMyIGJ5dGVzIG9mIEZJ Rk8uCisJICovCisJY2hhbi0+bWNyICY9IH5VQVJUX01DUl9BRkU7CisJaWYgKHRlcm1pb3Mt PmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQljaGFuLT5tY3IgfD0gVUFSVF9NQ1JfQUZFOworCisJ LyoKKwkgKiBPaywgd2UncmUgbm93IGNoYW5naW5nIHRoZSBwb3J0IHN0YXRlLiAgRG8gaXQg d2l0aAorCSAqIGludGVycnVwdHMgZGlzYWJsZWQuCisJICovCisJc3Bpbl9sb2NrX2lycXNh dmUoJmNoYW4tPnVhcnQubG9jaywgZmxhZ3MpOworCisJLyogd2UgYXJlIHNlbmRpbmcgY2hh ciBmcm9tIGEgd29ya3F1ZXVlIHNvIGVuYWJsZSAqLworCWNoYW4tPnVhcnQuc3RhdGUtPnBv cnQudHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisKKwkvKiBVcGRhdGUgdGhlIHBlci1wb3J0IHRp bWVvdXQuICovCisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFn LCBiYXVkKTsKKworCWNoYW4tPnVhcnQucmVhZF9zdGF0dXNfbWFzayA9IFVBUlRfTFNSX09F IHwgVUFSVF9MU1JfVEhSRSB8IFVBUlRfTFNSX0RSOworCWlmICh0ZXJtaW9zLT5jX2lmbGFn ICYgSU5QQ0spCisJCWNoYW4tPnVhcnQucmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9G RSB8IFVBUlRfTFNSX1BFOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgKEJSS0lOVCB8IFBB Uk1SSykpCisJCWNoYW4tPnVhcnQucmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsK KworCS8qIENoYXJhY3RlcnMgdG8gaWdub3JlICovCisJY2hhbi0+dWFydC5pZ25vcmVfc3Rh dHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQljaGFu LT51YXJ0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9QRSB8IFVBUlRfTFNSX0ZF OworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLKSB7CisJCWNoYW4tPnVhcnQuaWdu b3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOworCQkvKgorCQkgKiBJZiB3ZSdyZSBp Z25vcmluZyBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsCisJCSAqIGlnbm9yZSBvdmVy cnVucyB0b28gKGZvciByZWFsIHJhdyBzdXBwb3J0KS4KKwkJICovCisJCWlmICh0ZXJtaW9z LT5jX2lmbGFnICYgSUdOUEFSKQorCQkJY2hhbi0+dWFydC5pZ25vcmVfc3RhdHVzX21hc2sg fD0gVUFSVF9MU1JfT0U7CisJfQorCisJLyogaWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENS RUFEIGlzIG5vdCBzZXQgKi8KKwlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgPT0g MCkKKwkJY2hhbi0+dWFydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfRFI7CisK KwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRz ICovCisJY2hhbi0+aWVyICY9IH5VQVJUX0lFUl9NU0k7CisJaWYgKFVBUlRfRU5BQkxFX01T KCZjaGFuLT51YXJ0LCB0ZXJtaW9zLT5jX2NmbGFnKSkKKwkJY2hhbi0+aWVyIHw9IFVBUlRf SUVSX01TSTsKKworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJZWZyIHw9 IFVBUlRfRUZSX0NUUyB8IFVBUlRfRUZSX1JUUzsKKworCW1jciA9IF9fc2V0X21jdHJsKGNo YW4tPnVhcnQubWN0cmwpOworCWllciA9IGNoYW4tPmllcjsKKwljaGFuLT5sY3IgPSBsY3I7 CQkJCS8qIFNhdmUgTENSICovCisJY2hhbi0+ZmNyID0gZmNyOwkJCQkvKiBTYXZlIEZDUiAq LworCWNoYW4tPm1jciA9IG1jcjsJCQkJLyogU2F2ZSBNQ1IgKi8KKworCWZjciB8PSBVQVJU X0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVDsKKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmNoYW4tPnVhcnQubG9jaywgZmxhZ3MpOworCisJLyogYnVpbGQgYSBj b21wb3VuZCBzcGkgbWVzc2FnZSB0byBzZXQgYWxsIHJlZ2lzdGVycyAqLworCWNtZHMgPSBz YzE2aXM3eDJfYWxsb2Nfc3BpX2NtZHMoOSk7CisJaWYgKCFjbWRzKQorCQlyZXR1cm47CisK KwkvKiBzZXQgRExBQiAqLworCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21kKCZjbWRzWzBdLCBV QVJUX0xDUiwgY2gsIFVBUlRfTENSX0RMQUIpOworCS8qIHNldCBkaXZpc29yLCBtdXN0IGJl IHNldCBiZWZvcmUgVUFSVF9FRlJfRUNCICovCisJc2MxNmlzN3gyX2FkZF9kbF93cml0ZV9j bWQoJmNtZHNbMV0sIGNoLCBxdW90KTsKKwlzYzE2aXM3eDJfYWRkX3dyaXRlX2NtZCgmY21k c1szXSwgVUFSVF9MQ1IsIGNoLCAweEJGKTsJLyogYWNjZXNzIEVGUiAqLworCXNjMTZpczd4 Ml9hZGRfd3JpdGVfY21kKCZjbWRzWzRdLCBVQVJUX0VGUiwgY2gsIGVmcik7CisJc2MxNmlz N3gyX2FkZF93cml0ZV9jbWQoJmNtZHNbNV0sIFVBUlRfTENSLCBjaCwgbGNyKTsJLyogcmVz ZXQgRExBQiAqLworCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21kKCZjbWRzWzZdLCBVQVJUX0ZD UiwgY2gsIGZjcik7CisJc2MxNmlzN3gyX2FkZF93cml0ZV9jbWQoJmNtZHNbN10sIFVBUlRf TUNSLCBjaCwgbWNyKTsKKwlzYzE2aXM3eDJfYWRkX3dyaXRlX2NtZCgmY21kc1s4XSwgVUFS VF9JRVIsIGNoLCBpZXIpOworCisJc2MxNmlzN3gyX3NwaV9hc3luYyh0cy0+c3BpLCBjbWRz LCA5KTsKKworCS8qIERvbid0IHJld3JpdGUgQjAgKi8KKwlpZiAodHR5X3Rlcm1pb3NfYmF1 ZF9yYXRlKHRlcm1pb3MpKQorCQl0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlKHRlcm1p b3MsIGJhdWQsIGJhdWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitzYzE2aXM3eDJf dHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hh bm5lbCAqY2hhbiA9CisJCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNjMTZpczd4Ml9j aGFubmVsLCB1YXJ0KTsKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hhbi0+Y2hp cDsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJcmV0 dXJuIFRZUEVfTkFNRTsKK30KKworc3RhdGljIHZvaWQgc2MxNmlzN3gyX3JlbGVhc2VfcG9y dChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hhbm5l bCAqY2hhbiA9CisJCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNjMTZpczd4Ml9jaGFu bmVsLCB1YXJ0KTsKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gY2hhbi0+Y2hpcDsK KworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJdHMtPmZv cmNlX2VuZF93b3JrID0gMTsKK30KKworc3RhdGljIGludCBzYzE2aXM3eDJfcmVxdWVzdF9w b3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNjMTZpczd4Ml9jaGFu bmVsICpjaGFuID0KKwkJCWNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgc2MxNmlzN3gyX2No YW5uZWwsIHVhcnQpOworCXN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMgPSBjaGFuLT5jaGlw OworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2MxNmlzN3gyX2NvbmZpZ19wb3J0KHN0cnVjdCB1 YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoYW5u ZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzYzE2aXM3eDJfY2hh bm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0cyA9IGNoYW4tPmNoaXA7 CisKKwlkZXZfZGJnKCZ0cy0+c3BpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCWlmIChm bGFncyAmIFVBUlRfQ09ORklHX1RZUEUpCisJCWNoYW4tPnVhcnQudHlwZSA9IFBPUlRfU0Mx NklTN1gyOworfQorCitzdGF0aWMgaW50CitzYzE2aXM3eDJfdmVyaWZ5X3BvcnQoc3RydWN0 IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnNlcikKK3sKKwlzdHJ1 Y3Qgc2MxNmlzN3gyX2NoYW5uZWwgKmNoYW4gPQorCQkJY29udGFpbmVyX29mKHBvcnQsIHN0 cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCwgdWFydCk7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlw ICp0cyA9IGNoYW4tPmNoaXA7CisKKwlkZXZfZGJnKCZ0cy0+c3BpLT5kZXYsICIlc1xuIiwg X19mdW5jX18pOworCWlmIChzZXItPmlycSA8IDAgfHwgc2VyLT5iYXVkX2Jhc2UgPCA5NjAw IHx8CisJCQlzZXItPnR5cGUgIT0gUE9SVF9TQzE2SVM3WDIpCisJCXJldHVybiAtRUlOVkFM OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIHNjMTZpczd4Ml91 YXJ0X29wcyA9IHsKKwkudHhfZW1wdHkJPSBzYzE2aXM3eDJfdHhfZW1wdHksCisJLnNldF9t Y3RybAk9IHNjMTZpczd4Ml9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IHNjMTZpczd4Ml9n ZXRfbWN0cmwsCisJLnN0b3BfdHggICAgICAgID0gc2MxNmlzN3gyX3N0b3BfdHgsCisJLnN0 YXJ0X3R4CT0gc2MxNmlzN3gyX3N0YXJ0X3R4LAorCS5zdG9wX3J4CT0gc2MxNmlzN3gyX3N0 b3BfcngsCisJLmVuYWJsZV9tcyAgICAgID0gc2MxNmlzN3gyX2VuYWJsZV9tcywKKwkuYnJl YWtfY3RsICAgICAgPSBzYzE2aXM3eDJfYnJlYWtfY3RsLAorCS5zdGFydHVwCT0gc2MxNmlz N3gyX3N0YXJ0dXAsCisJLnNodXRkb3duCT0gc2MxNmlzN3gyX3NodXRkb3duLAorCS5zZXRf dGVybWlvcwk9IHNjMTZpczd4Ml9zZXRfdGVybWlvcywKKwkudHlwZQkJPSBzYzE2aXM3eDJf dHlwZSwKKwkucmVsZWFzZV9wb3J0ICAgPSBzYzE2aXM3eDJfcmVsZWFzZV9wb3J0LAorCS5y ZXF1ZXN0X3BvcnQgICA9IHNjMTZpczd4Ml9yZXF1ZXN0X3BvcnQsCisJLmNvbmZpZ19wb3J0 CT0gc2MxNmlzN3gyX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydAk9IHNjMTZpczd4Ml92 ZXJpZnlfcG9ydCwKK307CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogR1BJTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGlj IGludCBzYzE2aXM3eDJfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVu c2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0KKwkJCWNv bnRhaW5lcl9vZihncGlvLCBzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAsIGdwaW8pOworCWludCBj b250cm9sID0gKG9mZnNldCA8IDQpID8gSU9DX0dQSU8zMCA6IElPQ19HUElPNzQ7CisJaW50 IHJldCA9IDA7CisKKwlCVUdfT04ob2Zmc2V0ID4gOCk7CisJZGV2X2RiZygmdHMtPnNwaS0+ ZGV2LCAiJXM6IG9mZnNldCA9ICVkXG4iLCBfX2Z1bmNfXywgb2Zmc2V0KTsKKworCW11dGV4 X2xvY2soJnRzLT5sb2NrKTsKKworCS8qIEdQSU8gMDozIGFuZCA0OjcgY2FuIG9ubHkgYmUg Y29udHJvbGxlZCBhcyBibG9jayAqLworCXRzLT5pb19ncGlvIHw9IEJJVChvZmZzZXQpOwor CWlmICh0cy0+aW9fY29udHJvbCAmIGNvbnRyb2wpIHsKKwkJZGV2X2RiZygmdHMtPnNwaS0+ ZGV2LCAiYWN0aXZhdGUgR1BJT3MgJXNcbiIsCisJCQkJKG9mZnNldCA8IDQpID8gIjAtMyIg OiAiNC03Iik7CisJCXRzLT5pb19jb250cm9sICY9IH5jb250cm9sOworCQlyZXQgPSBzYzE2 aXM3eDJfd3JpdGUodHMtPnNwaSwgUkVHX0lPQywgMCwgdHMtPmlvX2NvbnRyb2wpOworCX0K KworCW11dGV4X3VubG9jaygmdHMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIHZvaWQgc2MxNmlzN3gyX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1 bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0cyA9CisJCQlj b250YWluZXJfb2YoZ3Bpbywgc3RydWN0IHNjMTZpczd4Ml9jaGlwLCBncGlvKTsKKwlpbnQg Y29udHJvbCA9IChvZmZzZXQgPCA0KSA/IElPQ19HUElPMzAgOiBJT0NfR1BJTzc0OworCWlu dCBtYXNrID0gKG9mZnNldCA8IDQpID8gMHgwZiA6IDB4ZjA7CisKKwlCVUdfT04ob2Zmc2V0 ID4gOCk7CisKKwltdXRleF9sb2NrKCZ0cy0+bG9jayk7CisKKwkvKiBHUElPIDA6MyBhbmQg NDo3IGNhbiBvbmx5IGJlIGNvbnRyb2xsZWQgYXMgYmxvY2sgKi8KKwl0cy0+aW9fZ3BpbyAm PSB+QklUKG9mZnNldCk7CisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXM6IGlvX2dwaW8g PSAweCUwMlhcbiIsIF9fZnVuY19fLCB0cy0+aW9fZ3Bpbyk7CisJaWYgKCEodHMtPmlvX2Nv bnRyb2wgJiBjb250cm9sKSAmJiAhKHRzLT5pb19ncGlvICYgbWFzaykpIHsKKwkJZGV2X2Ri ZygmdHMtPnNwaS0+ZGV2LCAiZGVhY3RpdmF0ZSBHUElPcyAlc1xuIiwKKwkJCQkob2Zmc2V0 IDwgNCkgPyAiMC0zIiA6ICI0LTciKTsKKwkJdHMtPmlvX2NvbnRyb2wgfD0gY29udHJvbDsK KwkJc2MxNmlzN3gyX3dyaXRlKHRzLT5zcGksIFJFR19JT0MsIDAsIHRzLT5pb19jb250cm9s KTsKKwl9CisKKwltdXRleF91bmxvY2soJnRzLT5sb2NrKTsKK30KKworc3RhdGljIGludCBz YzE2aXM3eDJfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2ln bmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0KKwkJCWNvbnRh aW5lcl9vZihncGlvLCBzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAsIGdwaW8pOworCXVuc2lnbmVk IGlvX2RpcjsKKworCUJVR19PTihvZmZzZXQgPiA4KTsKKworCW11dGV4X2xvY2soJnRzLT5s b2NrKTsKKworCXRzLT5pb19kaXIgJj0gfkJJVChvZmZzZXQpOworCWlvX2RpciA9IHRzLT5p b19kaXI7CisKKwltdXRleF91bmxvY2soJnRzLT5sb2NrKTsKKworCXJldHVybiBzYzE2aXM3 eDJfd3JpdGVfYXN5bmModHMtPnNwaSwgUkVHX0lPRCwgMCwgaW9fZGlyKTsKK30KKworc3Rh dGljIGludCBzYzE2aXM3eDJfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpn cGlvLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qg c2MxNmlzN3gyX2NoaXAgKnRzID0KKwkJCWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3Qgc2Mx NmlzN3gyX2NoaXAsIGdwaW8pOworCXN0cnVjdCBzYzE2aXM3eDJfc3BpX3JlZyAqY21kczsK KworCUJVR19PTihvZmZzZXQgPiA4KTsKKworCW11dGV4X2xvY2soJnRzLT5sb2NrKTsKKwor CWlmICh2YWx1ZSkKKwkJdHMtPmlvX3N0YXRlIHw9IEJJVChvZmZzZXQpOworCWVsc2UKKwkJ dHMtPmlvX3N0YXRlICY9IH5CSVQob2Zmc2V0KTsKKworCXRzLT5pb19kaXIgfD0gQklUKG9m ZnNldCk7CisKKwljbWRzID0gc2MxNmlzN3gyX2FsbG9jX3NwaV9jbWRzKDIpOworCWlmIChj bWRzKSB7CisJCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21kKCZjbWRzWzBdLCBSRUdfSU9TLCAw LCB0cy0+aW9fc3RhdGUpOworCQlzYzE2aXM3eDJfYWRkX3dyaXRlX2NtZCgmY21kc1sxXSwg UkVHX0lPRCwgMCwgdHMtPmlvX2Rpcik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ0cy0+bG9j ayk7CisKKwlyZXR1cm4gc2MxNmlzN3gyX3NwaV9hc3luYyh0cy0+c3BpLCBjbWRzLCAyKTsK K30KKworc3RhdGljIGludCBzYzE2aXM3eDJfZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8s IHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0KKwkJ CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAsIGdwaW8pOworCWlu dCBsZXZlbCA9IC1FSU5WQUw7CisKKwlCVUdfT04ob2Zmc2V0ID4gOCk7CisKKwltdXRleF9s b2NrKCZ0cy0+bG9jayk7CisKKwlpZiAodHMtPmlvX2RpciAmIEJJVChvZmZzZXQpKSB7CisJ CS8qIE91dHB1dDogcmV0dXJuIGNhY2hlZCBsZXZlbCAqLworCQlsZXZlbCA9ICh0cy0+aW9f c3RhdGUgPj4gb2Zmc2V0KSAmIDB4MDE7CisJfSBlbHNlIHsKKwkJLyogSW5wdXQ6IHJlYWQg b3V0IGFsbCBwaW5zICovCisJCWxldmVsID0gc2MxNmlzN3gyX3JlYWQodHMtPnNwaSwgUkVH X0lPUywgMCk7CisJCWlmIChsZXZlbCA+PSAwKSB7CisJCQl0cy0+aW9fc3RhdGUgPSBsZXZl bDsKKwkJCWxldmVsID0gKHRzLT5pb19zdGF0ZSA+PiBvZmZzZXQpICYgMHgwMTsKKwkJfQor CX0KKworCW11dGV4X3VubG9jaygmdHMtPmxvY2spOworCisJcmV0dXJuIGxldmVsOworfQor CitzdGF0aWMgdm9pZCBzYzE2aXM3eDJfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVu c2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hpcCAq dHMgPQorCQkJY29udGFpbmVyX29mKGdwaW8sIHN0cnVjdCBzYzE2aXM3eDJfY2hpcCwgZ3Bp byk7CisJdW5zaWduZWQgaW9fc3RhdGU7CisKKwlCVUdfT04ob2Zmc2V0ID4gOCk7CisKKwlt dXRleF9sb2NrKCZ0cy0+bG9jayk7CisKKwlpZiAodmFsdWUpCisJCXRzLT5pb19zdGF0ZSB8 PSBCSVQob2Zmc2V0KTsKKwllbHNlCisJCXRzLT5pb19zdGF0ZSAmPSB+QklUKG9mZnNldCk7 CisJaW9fc3RhdGUgPSB0cy0+aW9fc3RhdGU7CisKKwltdXRleF91bmxvY2soJnRzLT5sb2Nr KTsKKworCXNjMTZpczd4Ml93cml0ZV9hc3luYyh0cy0+c3BpLCBSRUdfSU9TLCAwLCBpb19z dGF0ZSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElSUSAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2Mx NmlzN3gyX2hhbmRsZV9maWZvX3J4KHN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCAqY2hhbikK K3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1YXJ0ID0gJmNoYW4tPnVhcnQ7CisJc3RydWN0IHR0 eV9zdHJ1Y3QgKnR0eSA9IHVhcnQtPnN0YXRlLT5wb3J0LnR0eTsKKwl1OCAqcnhidWYgPSBj aGFuLT5maWZvX3J4LnJ4X2J1ZjsKKwl1OCBsc3IgPSBjaGFuLT5sc3I7CisJdW5zaWduZWQg aSwgY291bnQgPSBjaGFuLT5maWZvX3J4LmxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWNoYXIgZmxhZyA9IFRUWV9OT1JNQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+ bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGxzciAmIFVBUlRfTFNSX0JSS19FUlJP Ul9CSVRTKSkgeworCQkvKgorCQkgKiBGb3Igc3RhdGlzdGljcyBvbmx5CisJCSAqLworCQlp ZiAobHNyICYgVUFSVF9MU1JfQkkpIHsKKwkJCWxzciAmPSB+KFVBUlRfTFNSX0ZFIHwgVUFS VF9MU1JfUEUpOworCQkJY2hhbi0+dWFydC5pY291bnQuYnJrKys7CisJCQkvKgorCQkJICog V2UgZG8gdGhlIFN5c1JRIGFuZCBTQUsgY2hlY2tpbmcKKwkJCSAqIGhlcmUgYmVjYXVzZSBv dGhlcndpc2UgdGhlIGJyZWFrCisJCQkgKiBtYXkgZ2V0IG1hc2tlZCBieSBpZ25vcmVfc3Rh dHVzX21hc2sKKwkJCSAqIG9yIHJlYWRfc3RhdHVzX21hc2suCisJCQkgKi8KKwkJCWlmICh1 YXJ0X2hhbmRsZV9icmVhaygmY2hhbi0+dWFydCkpCisJCQkJZ290byBpZ25vcmVfY2hhcjsK KwkJfSBlbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9QRSkKKwkJCWNoYW4tPnVhcnQuaWNvdW50 LnBhcml0eSsrOworCQllbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9GRSkKKwkJCWNoYW4tPnVh cnQuaWNvdW50LmZyYW1lKys7CisJCWlmIChsc3IgJiBVQVJUX0xTUl9PRSkKKwkJCWNoYW4t PnVhcnQuaWNvdW50Lm92ZXJydW4rKzsKKworCQkvKgorCQkgKiBNYXNrIG9mZiBjb25kaXRp b25zIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkLgorCQkgKi8KKwkJbHNyICY9IGNoYW4tPnVh cnQucmVhZF9zdGF0dXNfbWFzazsKKworCQlpZiAobHNyICYgVUFSVF9MU1JfQkkpCisJCQlm bGFnID0gVFRZX0JSRUFLOworCQllbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9QRSkKKwkJCWZs YWcgPSBUVFlfUEFSSVRZOworCQllbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9GRSkKKwkJCWZs YWcgPSBUVFlfRlJBTUU7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGNvdW50OyBpKyspIHsK KwkJdWFydC0+aWNvdW50LnJ4Kys7CisKKwkJaWYgKCF1YXJ0X2hhbmRsZV9zeXNycV9jaGFy KHVhcnQsIHJ4YnVmW2ldKSkKKwkJCXVhcnRfaW5zZXJ0X2NoYXIodWFydCwgbHNyLCBVQVJU X0xTUl9PRSwKKwkJCQkJcnhidWZbaV0sIGZsYWcpOworCX0KKworaWdub3JlX2NoYXI6CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNv dW50ID4gMSkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKK30KKworc3RhdGljIHZv aWQgc2MxNmlzN3gyX2hhbmRsZV9maWZvX3R4KHN0cnVjdCBzYzE2aXM3eDJfY2hhbm5lbCAq Y2hhbikKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1YXJ0ID0gJmNoYW4tPnVhcnQ7CisJc3Ry dWN0IGNpcmNfYnVmICp4bWl0ID0gJnVhcnQtPnN0YXRlLT54bWl0OworCXVuc2lnbmVkIGNv dW50ID0gY2hhbi0+Zmlmb190eFsxXS5sZW4gKyBjaGFuLT5maWZvX3R4WzJdLmxlbjsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJQlVHX09OKCF1YXJ0KTsKKwlCVUdfT04oIXhtaXQp OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPmxvY2ssIGZsYWdzKTsKKworCXVhcnQt Pmljb3VudC50eCArPSBjb3VudDsKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1p dCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHVhcnQpOworCisJaWYg KHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJX19zdG9wX3R4KGNoYW4pOworCisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmdWFydC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgYm9v bCBzYzE2aXM3eDJfbXNnX2FkZF9maWZvX3J4KHN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMs IHVuc2lnbmVkIGNoKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbSA9ICYodHMtPmZpZm9f bWVzc2FnZSk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdCA9ICYodHMtPmNoYW5uZWxbY2hd LmZpZm9fcngpOworCWludCByeGx2bCA9IHNjMTZpczd4Ml9yZWFkKHRzLT5zcGksIFJFR19S WExWTCwgY2gpOworCisJaWYgKHJ4bHZsID4gMCkgeworCQl0LT5sZW4gPSByeGx2bCArIDE7 CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKHQsIG0pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJ cmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBzYzE2aXM3eDJfbXNnX2FkZF9maWZv X3R4KHN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMsIHVuc2lnbmVkIGNoKQoreworCXN0cnVj dCBzYzE2aXM3eDJfY2hhbm5lbCAqIGNvbnN0IGNoYW4gPSAmKHRzLT5jaGFubmVsW2NoXSk7 CisJc3RydWN0IHVhcnRfcG9ydCAqdWFydCA9ICZjaGFuLT51YXJ0OworCXN0cnVjdCBjaXJj X2J1ZiAqeG1pdCA9ICZ1YXJ0LT5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBjb3VudDsKKwli b29sIHNwbGl0X3RyYW5zZmVyOworCXU4IHR4bHZsOworCisJaWYgKGNoYW4tPnVhcnQueF9j aGFyICYmIGNoYW4tPmxzciAmIFVBUlRfTFNSX1RIUkUpIHsKKwkJZGV2X2RiZygmdHMtPnNw aS0+ZGV2LCAidHg6IHgtY2hhclxuIik7CisJCXNjMTZpczd4Ml93cml0ZSh0cy0+c3BpLCBV QVJUX1RYLCBjaCwgdWFydC0+eF9jaGFyKTsKKwkJdWFydC0+aWNvdW50LnR4Kys7CisJCXVh cnQtPnhfY2hhciA9IDA7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHVhcnRfdHhfc3Rv cHBlZCgmY2hhbi0+dWFydCkpIHsKKwkJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAidHg6IHN0 b3BwZWQhXG4iKTsKKwkJc2MxNmlzN3gyX3N0b3BfdHgodWFydCk7CisJCXJldHVybiBmYWxz ZTsKKwl9CisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQlfX3N0b3BfdHgoY2hh bik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl0eGx2bCA9IHNjMTZpczd4Ml9yZWFkKHRz LT5zcGksIFJFR19UWExWTCwgY2gpOworCWlmICh0eGx2bCA8PSAwKSB7CisJCWRldl9kYmco JnRzLT5zcGktPmRldiwgIiBmaWZvIGZ1bGxcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQor CisJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIHRvIHRoZSBmaWZvICovCisJY291 bnQgPSBtaW4odHhsdmwsICh1OCl1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSk7CisJ c3BsaXRfdHJhbnNmZXIgPSAoVUFSVF9YTUlUX1NJWkUgLSB4bWl0LT50YWlsKSA8PSBjb3Vu dDsKKworCS8qIGFkZCBjb21tYW5kIHRyYW5zZmVyICovCisJc3BpX21lc3NhZ2VfYWRkX3Rh aWwoJihjaGFuLT5maWZvX3R4WzBdKSwgJih0cy0+Zmlmb19tZXNzYWdlKSk7CisJLyogYWRk IGZpcnN0IGZpZm8gdHJhbnNmZXIgKi8KKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmKGNoYW4t PmZpZm9fdHhbMV0pLCAmKHRzLT5maWZvX21lc3NhZ2UpKTsKKworCWNoYW4tPmZpZm9fdHhb MV0udHhfYnVmID0geG1pdC0+YnVmICsgeG1pdC0+dGFpbDsKKworCWlmICghc3BsaXRfdHJh bnNmZXIpIHsKKwkJY2hhbi0+Zmlmb190eFsxXS5sZW4gPSBjb3VudDsKKwkJY2hhbi0+Zmlm b190eFsxXS5jc19jaGFuZ2UgPSB0cnVlOworCisJCWNoYW4tPmZpZm9fdHhbMl0ubGVuID0g MDsKKwl9IGVsc2UgeworCQljaGFuLT5maWZvX3R4WzFdLmxlbiA9IChVQVJUX1hNSVRfU0la RSAtIDEpIC0geG1pdC0+dGFpbDsKKwkJY2hhbi0+Zmlmb190eFsxXS5jc19jaGFuZ2UgPSBm YWxzZTsKKworCQljaGFuLT5maWZvX3R4WzJdLnR4X2J1ZiA9IHhtaXQtPmJ1ZjsKKwkJY2hh bi0+Zmlmb190eFsyXS5jc19jaGFuZ2UgPSB0cnVlOworCQljaGFuLT5maWZvX3R4WzJdLmxl biA9IGNvdW50IC0gY2hhbi0+Zmlmb190eFsxXS5sZW47CisJCS8qIGFkZCBzZWNvbmQgZmlm byB0cmFuc2ZlciAqLworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmKGNoYW4tPmZpZm9fdHhb Ml0pLCAmKHRzLT5maWZvX21lc3NhZ2UpKTsKKwl9CisKKwl4bWl0LT50YWlsID0gKHhtaXQt PnRhaWwgKyBjb3VudCkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwlyZXR1cm4gdHJ1ZTsK K30KKworc3RhdGljIHZvaWQgc2MxNmlzN3gyX2hhbmRsZV9tb2RlbShzdHJ1Y3Qgc2MxNmlz N3gyX2NoaXAgKnRzLCB1bnNpZ25lZCBjaCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoYW5u ZWwgKmNoYW4gPSAmKHRzLT5jaGFubmVsW2NoXSk7CisJc3RydWN0IHVhcnRfcG9ydCAqdWFy dCA9ICZjaGFuLT51YXJ0OworCisJaWYgKGNoYW4tPm1zciAmIFVBUlRfTVNSX0FOWV9ERUxU QQorCQkJJiYgY2hhbi0+aWVyICYgVUFSVF9JRVJfTVNJCisJCQkmJiB1YXJ0LT5zdGF0ZSAh PSBOVUxMKSB7CisJCWlmIChjaGFuLT5tc3IgJiBVQVJUX01TUl9URVJJKQorCQkJdWFydC0+ aWNvdW50LnJuZysrOworCQlpZiAoY2hhbi0+bXNyICYgVUFSVF9NU1JfRERTUikKKwkJCXVh cnQtPmljb3VudC5kc3IrKzsKKwkJaWYgKGNoYW4tPm1zciAmIFVBUlRfTVNSX0REQ0QpCisJ CQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKHVhcnQsIGNoYW4tPm1zciAmIFVBUlRfTVNSX0RD RCk7CisJCWlmIChjaGFuLT5tc3IgJiBVQVJUX01TUl9EQ1RTKQorCQkJdWFydF9oYW5kbGVf Y3RzX2NoYW5nZSh1YXJ0LCBjaGFuLT5tc3IgJiBVQVJUX01TUl9DVFMpOworCisJCXdha2Vf dXBfaW50ZXJydXB0aWJsZSgmdWFydC0+c3RhdGUtPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwor CX0KK30KKworc3RhdGljIHZvaWQgc2MxNmlzN3gyX3JlYWRfc3RhdHVzKHN0cnVjdCBzYzE2 aXM3eDJfY2hpcCAqdHMsIHVuc2lnbmVkIGNoKQoreworCXN0cnVjdCBzYzE2aXM3eDJfY2hh bm5lbCAqY2hhbiA9ICYodHMtPmNoYW5uZWxbY2hdKTsKKworCWNoYW4tPmlpciA9IHNjMTZp czd4Ml9yZWFkKHRzLT5zcGksIFVBUlRfSUlSLCBjaCk7CisJY2hhbi0+bXNyID0gc2MxNmlz N3gyX3JlYWQodHMtPnNwaSwgVUFSVF9NU1IsIGNoKTsKKwljaGFuLT5sc3IgPSBzYzE2aXM3 eDJfcmVhZCh0cy0+c3BpLCBVQVJUX0xTUiwgY2gpOworfQorCitzdGF0aWMgYm9vbCBzYzE2 aXM3eDJfaGFuZGxlX2NoYW5uZWwoc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0cywgdW5zaWdu ZWQgY2gpCit7CisJc3RydWN0IHNjMTZpczd4Ml9jaGFubmVsICpjaGFuID0gJih0cy0+Y2hh bm5lbFtjaF0pOworCXN0cnVjdCBzcGlfbWVzc2FnZSAqbSA9ICYodHMtPmZpZm9fbWVzc2Fn ZSk7CisJYm9vbCByeCwgdHg7CisKKwlkZXZfZGJnKCZ0cy0+c3BpLT5kZXYsICIlcyAoJWkp XG4iLCBfX2Z1bmNfXywgY2gpOworCisJc2MxNmlzN3gyX3JlYWRfc3RhdHVzKHRzLCBjaCk7 CisJc2MxNmlzN3gyX2hhbmRsZV9tb2RlbSh0cywgY2gpOworCisJc3BpX21lc3NhZ2VfaW5p dChtKTsKKwlyeCA9IHNjMTZpczd4Ml9tc2dfYWRkX2ZpZm9fcngodHMsIGNoKTsKKwl0eCA9 IHNjMTZpczd4Ml9tc2dfYWRkX2ZpZm9fdHgodHMsIGNoKTsKKworCWlmIChyeCB8fCB0eCkK KwkJc3BpX3N5bmModHMtPnNwaSwgbSk7CisKKwlpZiAocngpCisJCXNjMTZpczd4Ml9oYW5k bGVfZmlmb19yeChjaGFuKTsKKwlpZiAodHgpCisJCXNjMTZpczd4Ml9oYW5kbGVfZmlmb190 eChjaGFuKTsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzIGZpbmlzaGVkIChpaXIg PSAweCUwMngpXG4iLAorCQkJX19mdW5jX18sIGNoYW4tPmlpcik7CisKKwlyZXR1cm4gKGNo YW4tPmlpciAmIFVBUlRfSUlSX05PX0lOVCkgPT0gMHgwMDsKK30KKworc3RhdGljIHZvaWQg c2MxNmlzN3gyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCXN0cnVjdCBzYzE2 aXM3eDJfY2hpcCAqdHMgPQorCQkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBzYzE2aXM3eDJf Y2hpcCwgd29yayk7CisJdW5zaWduZWQgcGVuZGluZyA9IDA7CisJdW5zaWduZWQgY2ggPSAw OworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlCVUdf T04oIXcpOworCUJVR19PTighdHMpOworCisKKwlpZiAodHMtPmZvcmNlX2VuZF93b3JrKSB7 CisJCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzOiBmb3JjZSBlbmQhXG4iLCBfX2Z1bmNf Xyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodHMtPmNoYW5uZWxbMF0uYWN0aXZlKQorCQlw ZW5kaW5nIHw9IEJJVCgwKTsKKwlpZiAodHMtPmNoYW5uZWxbMV0uYWN0aXZlKQorCQlwZW5k aW5nIHw9IEJJVCgxKTsKKworCWRvIHsKKwkJbXV0ZXhfbG9jaygmKHRzLT5jaGFubmVsW2No XS5sb2NrKSk7CisJCWlmIChwZW5kaW5nICYgQklUKGNoKSAmJiB0cy0+Y2hhbm5lbFtjaF0u YWN0aXZlKSB7CisJCQlpZiAoIXNjMTZpczd4Ml9oYW5kbGVfY2hhbm5lbCh0cywgY2gpKQor CQkJCXBlbmRpbmcgJj0gfkJJVChjaCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCYodHMtPmNo YW5uZWxbY2hdLmxvY2spKTsKKwkJY2ggXj0gMTsJLyogc3dpdGNoIGNoYW5uZWwgKi8KKwl9 IHdoaWxlICghdHMtPmZvcmNlX2VuZF93b3JrICYmICFmcmVlemluZyhjdXJyZW50KSAmJiBw ZW5kaW5nKTsKKworCWRldl9kYmcoJnRzLT5zcGktPmRldiwgIiVzIGZpbmlzaGVkXG4iLCBf X2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYzE2aXM3eDJfaW50ZXJydXB0 KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRz ID0gZGV2X2lkOworCisJZGV2X2RiZygmdHMtPnNwaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19f KTsKKworCWlmICghdHMtPmZvcmNlX2VuZF93b3JrICYmICF3b3JrX3BlbmRpbmcoJnRzLT53 b3JrKSAmJgorCSAgICAhZnJlZXppbmcoY3VycmVudCkgJiYgIXRzLT5zdXNwZW5kaW5nKQor CQlxdWV1ZV93b3JrKHRzLT53b3JrcXVldWUsICZ0cy0+d29yayk7CisKKwlyZXR1cm4gSVJR X0hBTkRMRUQ7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElO SVQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBzdHJ1 Y3QgdWFydF9kcml2ZXIgc2MxNmlzN3gyX3VhcnRfZHJpdmVyOworCitzdGF0aWMgaW50IHNj MTZpczd4Ml9yZWdpc3Rlcl9ncGlvKHN0cnVjdCBzYzE2aXM3eDJfY2hpcCAqdHMsCisJCXN0 cnVjdCBzYzE2aXM3eDJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNjMTZp czd4Ml9zcGlfcmVnICpjbWRzOworCisJdHMtPmdwaW8ubGFiZWwgPSAocGRhdGEtPmxhYmVs KSA/IHBkYXRhLT5sYWJlbCA6IERSSVZFUl9OQU1FOworCXRzLT5ncGlvLnJlcXVlc3QJPSBz YzE2aXM3eDJfZ3Bpb19yZXF1ZXN0OworCXRzLT5ncGlvLmZyZWUJCT0gc2MxNmlzN3gyX2dw aW9fZnJlZTsKKwl0cy0+Z3Bpby5nZXQJCT0gc2MxNmlzN3gyX2dldDsKKwl0cy0+Z3Bpby5z ZXQJCT0gc2MxNmlzN3gyX3NldDsKKwl0cy0+Z3Bpby5kaXJlY3Rpb25faW5wdXQgPSBzYzE2 aXM3eDJfZGlyZWN0aW9uX2lucHV0OworCXRzLT5ncGlvLmRpcmVjdGlvbl9vdXRwdXQgPSBz YzE2aXM3eDJfZGlyZWN0aW9uX291dHB1dDsKKworCXRzLT5ncGlvLmJhc2UgPSBwZGF0YS0+ Z3Bpb19iYXNlOworCXRzLT5ncGlvLm5hbWVzID0gcGRhdGEtPm5hbWVzOworCXRzLT5ncGlv Lm5ncGlvID0gU0MxNklTN1gyX05SX0dQSU9TOworCXRzLT5ncGlvLmNhbl9zbGVlcCA9IDE7 CisJdHMtPmdwaW8uZGV2ID0gJnRzLT5zcGktPmRldjsKKwl0cy0+Z3Bpby5vd25lciA9IFRI SVNfTU9EVUxFOworCisJLyogZGlzYWJsZSBhbGwgR1BJT3MsIGVuYWJsZSBvbiByZXF1ZXN0 ICovCisJdHMtPmlvX2RpciA9IDB4MGY7CisJdHMtPmlvX3N0YXRlID0gMDsKKwl0cy0+aW9f Z3BpbyA9IDA7CisJdHMtPmlvX2NvbnRyb2wgPSBJT0NfR1BJTzMwIHwgSU9DX0dQSU83NDsK KworCWNtZHMgPSBzYzE2aXM3eDJfYWxsb2Nfc3BpX2NtZHMoNCk7CisJaWYgKCFjbWRzKQor CQlyZXR1cm4gLUVOT01FTTsKKworCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21kKCZjbWRzWzBd LCBSRUdfSU9JLCAwLCAwKTsKKwlzYzE2aXM3eDJfYWRkX3dyaXRlX2NtZCgmY21kc1sxXSwg UkVHX0lPQywgMCwgdHMtPmlvX2NvbnRyb2wpOworCXNjMTZpczd4Ml9hZGRfd3JpdGVfY21k KCZjbWRzWzJdLCBSRUdfSU9TLCAwLCB0cy0+aW9fc3RhdGUpOworCXNjMTZpczd4Ml9hZGRf d3JpdGVfY21kKCZjbWRzWzNdLCBSRUdfSU9ELCAwLCB0cy0+aW9fZGlyKTsKKwlzYzE2aXM3 eDJfc3BpX2FzeW5jKHRzLT5zcGksIGNtZHMsIDQpOworCisJcmV0dXJuIGdwaW9jaGlwX2Fk ZCgmdHMtPmdwaW8pOworfQorCitzdGF0aWMgaW50IHNjMTZpczd4Ml9yZWdpc3Rlcl91YXJ0 X3BvcnQoc3RydWN0IHNjMTZpczd4Ml9jaGlwICp0cywKKwkJc3RydWN0IHNjMTZpczd4Ml9w bGF0Zm9ybV9kYXRhICpwZGF0YSwgdW5zaWduZWQgY2gpCit7CisJc3RydWN0IHNjMTZpczd4 Ml9jaGFubmVsICpjaGFuID0gJih0cy0+Y2hhbm5lbFtjaF0pOworCXN0cnVjdCB1YXJ0X3Bv cnQgKnVhcnQgPSAmY2hhbi0+dWFydDsKKworCW11dGV4X2luaXQoJmNoYW4tPmxvY2spOwor CWNoYW4tPmFjdGl2ZSA9IGZhbHNlOwkvKiB3aWxsIGJlIHNldCBpbiBzdGFydHVwICovCisJ Y2hhbi0+Y2hpcCA9IHRzOworCisJY2hhbi0+cnhfYnVmID0ga3phbGxvYyhGSUZPX1NJWkUr MSwgR0ZQX0tFUk5FTCk7CisJCWlmIChjaGFuLT5yeF9idWYgPT0gTlVMTCkKKwkJCXJldHVy biAtRU5PTUVNOworCisJY2hhbi0+cmVhZF9maWZvX2NtZCA9IHJlYWRfY21kKFVBUlRfUlgs IGNoKTsKKwljaGFuLT5maWZvX3J4LmNzX2NoYW5nZSA9IHRydWU7CisJY2hhbi0+Zmlmb19y eC50eF9idWYgPSAmKGNoYW4tPnJlYWRfZmlmb19jbWQpOworCWNoYW4tPmZpZm9fcngucnhf YnVmID0gY2hhbi0+cnhfYnVmOworCisKKwljaGFuLT53cml0ZV9maWZvX2NtZCA9IHdyaXRl X2NtZChVQVJUX1RYLCBjaCk7CisJY2hhbi0+Zmlmb190eFswXS50eF9idWYgPSAmKGNoYW4t PndyaXRlX2ZpZm9fY21kKTsKKwljaGFuLT5maWZvX3R4WzBdLnJ4X2J1ZiA9IE5VTEw7CisJ Y2hhbi0+Zmlmb190eFswXS5sZW4gPSAxOworCWNoYW4tPmZpZm9fdHhbMF0uY3NfY2hhbmdl ID0gZmFsc2U7CisJY2hhbi0+Zmlmb190eFsxXS5yeF9idWYgPSBOVUxMOworCWNoYW4tPmZp Zm9fdHhbMl0ucnhfYnVmID0gTlVMTDsKKworCXVhcnQtPmlycSA9IHRzLT5zcGktPmlycTsK Kwl1YXJ0LT51YXJ0Y2xrID0gcGRhdGEtPnVhcnRjbGs7CisJdWFydC0+Zmlmb3NpemUgPSBG SUZPX1NJWkU7CisJdWFydC0+b3BzID0gJnNjMTZpczd4Ml91YXJ0X29wczsKKwl1YXJ0LT5m bGFncyA9IFVQRl9TS0lQX1RFU1QgfCBVUEZfQk9PVF9BVVRPQ09ORjsKKwl1YXJ0LT5saW5l ID0gcGRhdGEtPnVhcnRfYmFzZSArIGNoOworCXVhcnQtPnR5cGUgPSBQT1JUX1NDMTZJUzdY MjsKKwl1YXJ0LT5kZXYgPSAmdHMtPnNwaS0+ZGV2OworCisJcmV0dXJuIHVhcnRfYWRkX29u ZV9wb3J0KCZzYzE2aXM3eDJfdWFydF9kcml2ZXIsIHVhcnQpOworfQorCitzdGF0aWMgaW50 IHNjMTZpczd4Ml91bnJlZ2lzdGVyX3VhcnRfcG9ydChzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAg KnRzLAorCQl1bnNpZ25lZCBjaGFubmVsKQoreworCWludCByZXQ7CisKKwlrZnJlZSgmdHMt PmNoYW5uZWxbY2hhbm5lbF0ucnhfYnVmKTsKKwlyZXQgPSB1YXJ0X3JlbW92ZV9vbmVfcG9y dCgmc2MxNmlzN3gyX3VhcnRfZHJpdmVyLAorCQkJJnRzLT5jaGFubmVsW2NoYW5uZWxdLnVh cnQpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnRzLT5zcGktPmRldiwgIkZhaWxlZCB0byBy ZW1vdmUgdGhlIFVBUlQgcG9ydCAlYzogJWRcbiIsCisJCQknQScgKyBjaGFubmVsLCByZXQp OworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYzE2aXM3 eDJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gy X2NoaXAgKnRzOworCXN0cnVjdCBzYzE2aXM3eDJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJ aW50IHJldDsKKworCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBk YXRhIHx8ICFwZGF0YS0+Z3Bpb19iYXNlIC8qIHx8IHBkYXRhLT51YXJ0X2Jhc2UgKi8pIHsK KwkJZGV2X2RiZygmc3BpLT5kZXYsICJpbmNvcnJlY3Qgb3IgbWlzc2luZyBwbGF0Zm9ybSBk YXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdHMgPSBremFsbG9jKHNpemVv ZihzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRzKQorCQly ZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnRzLT5sb2NrKTsKKwlzcGlfc2V0X2Ry dmRhdGEoc3BpLCB0cyk7CisJdHMtPnNwaSA9IHNwaTsKKwl0cy0+Zm9yY2VfZW5kX3dvcmsg PSAxOworCisJLyogUmVzZXQgdGhlIGNoaXAgVE9ETzogYW5kIGRpc2FibGUgSVJRIG91dHB1 dCAqLworCXNjMTZpczd4Ml93cml0ZShzcGksIFJFR19JT0MsIDAsIElPQ19TUkVTRVQpOwor CisJcmV0ID0gcmVxdWVzdF9pcnEoc3BpLT5pcnEsIHNjMTZpczd4Ml9pbnRlcnJ1cHQsCisJ CQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfU0hBUkVELCAic2MxNmlzN3gyIiwgdHMp OworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oJnRzLT5zcGktPmRldiwgImNhbm5vdCByZWdp c3RlciBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGV4aXRfZGVzdHJveTsKKwl9CisKKwlyZXQg PSBzYzE2aXM3eDJfcmVnaXN0ZXJfdWFydF9wb3J0KHRzLCBwZGF0YSwgMCk7CisJaWYgKHJl dCkKKwkJZ290byBleGl0X2lycTsKKwlyZXQgPSBzYzE2aXM3eDJfcmVnaXN0ZXJfdWFydF9w b3J0KHRzLCBwZGF0YSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3VhcnQwOworCisJ cmV0ID0gc2MxNmlzN3gyX3JlZ2lzdGVyX2dwaW8odHMsIHBkYXRhKTsKKwlpZiAocmV0KQor CQlnb3RvIGV4aXRfdWFydDE7CisKKwl0cy0+d29ya3F1ZXVlID0gY3JlYXRlX2ZyZWV6ZWFi bGVfd29ya3F1ZXVlKERSSVZFUl9OQU1FKTsKKwlpZiAoIXRzLT53b3JrcXVldWUpIHsKKwkJ ZGV2X3dhcm4oJnRzLT5zcGktPmRldiwgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsK KwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGV4aXRfZ3BpbzsKKwl9CisJSU5JVF9XT1JLKCZ0 cy0+d29yaywgc2MxNmlzN3gyX3dvcmspOworCXRzLT5mb3JjZV9lbmRfd29yayA9IDA7CisK KwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgYXQgQ1MlZCAoaXJxICVkKSwgMiBV QVJUcywgOCBHUElPc1xuIgorCQkJIiAgICBlc2VyJWQsIGVzZXIlZCwgZ3Bpb2NoaXAlZFxu IiwKKwkJCXNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+aXJxLAorCQkJcGRhdGEtPnVhcnRfYmFz ZSwgcGRhdGEtPnVhcnRfYmFzZSArIDEsCisJCQlwZGF0YS0+Z3Bpb19iYXNlKTsKKworCXJl dHVybiByZXQ7CisKK2V4aXRfZ3BpbzoKKwlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJnRzLT5n cGlvKTsKKworZXhpdF91YXJ0MToKKwlzYzE2aXM3eDJfdW5yZWdpc3Rlcl91YXJ0X3BvcnQo dHMsIDEpOworCitleGl0X3VhcnQwOgorCXNjMTZpczd4Ml91bnJlZ2lzdGVyX3VhcnRfcG9y dCh0cywgMCk7CisKK2V4aXRfaXJxOgorCWZyZWVfaXJxKHNwaS0+aXJxLCB0cyk7CisKK2V4 aXRfZGVzdHJveToKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKwltdXRl eF9kZXN0cm95KCZ0cy0+bG9jayk7CisJa2ZyZWUodHMpOworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyBpbnQgX19kZXZleGl0IHNjMTZpczd4Ml9yZW1vdmUoc3RydWN0IHNwaV9kZXZp Y2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc2MxNmlzN3gyX2NoaXAgKnRzID0gc3BpX2dldF9kcnZk YXRhKHNwaSk7CisJaW50IHJldDsKKworCWlmICh0cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVO T0RFVjsKKworCWZyZWVfaXJxKHNwaS0+aXJxLCB0cyk7CisJdHMtPmZvcmNlX2VuZF93b3Jr ID0gMTsKKworCWlmICh0cy0+d29ya3F1ZXVlKSB7CisJCWZsdXNoX3dvcmtxdWV1ZSh0cy0+ d29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUodHMtPndvcmtxdWV1ZSk7CisJCXRz LT53b3JrcXVldWUgPSBOVUxMOworCX0KKworCXJldCA9IHNjMTZpczd4Ml91bnJlZ2lzdGVy X3VhcnRfcG9ydCh0cywgMCk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Vycm9yOworCXJl dCA9IHNjMTZpczd4Ml91bnJlZ2lzdGVyX3VhcnRfcG9ydCh0cywgMSk7CisJaWYgKHJldCkK KwkJZ290byBleGl0X2Vycm9yOworCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmdHMtPmdwaW8p OworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVtb3Zl IHRoZSBHUElPIGNvbnRyb2xsZXI6ICVkXG4iLAorCQkJcmV0KTsKKwkJZ290byBleGl0X2Vy cm9yOworCX0KKworCW11dGV4X2Rlc3Ryb3koJnRzLT5sb2NrKTsKKwlrZnJlZSh0cyk7CisK K2V4aXRfZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X2Ry aXZlciBzYzE2aXM3eDJfdWFydF9kcml2ZXIgPSB7CisJLm93bmVyICAgICAgICAgID0gVEhJ U19NT0RVTEUsCisJLmRyaXZlcl9uYW1lICAgID0gRFJJVkVSX05BTUUsCisJLmRldl9uYW1l ICAgICAgID0gImVzZXIiLAorCS5tYWpvciAgICAgICAgICA9IFNDMTZJUzdYMl9NQUpPUiwK KwkubWlub3IgICAgICAgICAgPSBTQzE2SVM3WDJfTUlOT1IsCisJLm5yICAgICAgICAgICAg ID0gTUFYX1NDMTZJUzdYMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBzYzE2 aXM3eDJfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSBEUklWRVJf TkFNRSwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHNjMTZp czd4Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNjMTZpczd4Ml9yZW1vdmUp LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2MxNmlzN3gyX2luaXQodm9pZCkKK3sKKwlp bnQgcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnNjMTZpczd4Ml91YXJ0X2RyaXZlcik7 CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgcmVnaXN0ZXIg c2MxNmlzN3gyIHVhcnQgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1 cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmc2MxNmlzN3gyX3NwaV9kcml2ZXIpOworfQorLyog cmVnaXN0ZXIgYWZ0ZXIgc3BpIHBvc3Rjb3JlIGluaXRjYWxsIGFuZCBiZWZvcmUKKyAqIHN1 YnN5cyBpbml0Y2FsbHMgdGhhdCBtYXkgcmVseSBvbiB0aGVzZSBHUElPcworICovCitzdWJz eXNfaW5pdGNhbGwoc2MxNmlzN3gyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Mx NmlzN3gyX2V4aXQodm9pZCkKK3sKKwl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzYzE2aXM3 eDJfdWFydF9kcml2ZXIpOworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmc2MxNmlzN3gyX3Nw aV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc2MxNmlzN3gyX2V4aXQpOworCitNT0RVTEVf QVVUSE9SKCJNYW51ZWwgU3RhaGwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01P RFVMRV9ERVNDUklQVElPTigiU0MxNklTN3gyIFNQSSBiYXNlZCBVQVJUIGNoaXAiKTsKK01P RFVMRV9BTElBUygic3BpOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s aW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4 IDU2M2UyMzQuLjdjMWRhMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2Nv cmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTQ3LDYgKzQ3LDkg QEAKICNkZWZpbmUgUE9SVF9VNl8xNjU1MEEJMTkJLyogU1QtRXJpY3Nzb24gVTZ4eHggaW50 ZXJuYWwgVUFSVCAqLwogI2RlZmluZSBQT1JUX01BWF84MjUwCTE5CS8qIG1heCBwb3J0IElE ICovCiAKKy8qIFNDMTZJUzd4MiBTUEkgVUFSVCAqLworI2RlZmluZSBQT1JUX1NDMTZJUzdY MgkxOQorCiAvKgogICogQVJNIHNwZWNpZmljIHR5cGUgbnVtYmVycy4gIFRoZXNlIGFyZSBu b3QgY3VycmVudGx5IGd1YXJhbnRlZWQKICAqIHRvIGJlIGltcGxlbWVudGVkLCBhbmQgd2ls bCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIFRoZXNlIGFyZQpkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9saW51eC9zcGkvc2MxNmlzN3gyLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zYzE2aXM3eDIu aApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzFmZTUwCi0tLSAvZGV2 L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc2MxNmlzN3gyLmgKQEAgLTAsMCArMSwx NyBAQAorI2lmbmRlZiBMSU5VWF9TUElfU0MxNklTNzUyX0gKKyNkZWZpbmUgTElOVVhfU1BJ X1NDMTZJUzc1Ml9ICisKKyNkZWZpbmUgU0MxNklTN1gyX05SX0dQSU9TIDgKKworc3RydWN0 IHNjMTZpczd4Ml9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQJdWFydGNsazsKKwkv KiB1YXJ0IGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBjaGFubmVsICovCisJdW5zaWduZWQJ dWFydF9iYXNlOworCS8qIG51bWJlciBhc3NpZ25lZCB0byB0aGUgZmlyc3QgR1BJTyAqLwor CXVuc2lnbmVkCWdwaW9fYmFzZTsKKwljaGFyCQkqbGFiZWw7CisJLyogbGlzdCBvZiBHUElP IG5hbWVzIChhcnJheSBsZW5ndGggPSBTQzE2SVM3WDJfTlJfR1BJT1MpICovCisJY29uc3Qg Y2hhcgkqY29uc3QgKm5hbWVzOworfTsKKworI2VuZGlmCg== --------------000706050103030300000607--