From owner-freebsd-bluetooth@FreeBSD.ORG Tue Apr 21 16:59:51 2009 Return-Path: Delivered-To: freebsd-bluetooth@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B05D106566B for ; Tue, 21 Apr 2009 16:59:51 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: from mail-gx0-f220.google.com (mail-gx0-f220.google.com [209.85.217.220]) by mx1.freebsd.org (Postfix) with ESMTP id EC20E8FC1B for ; Tue, 21 Apr 2009 16:59:50 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: by gxk20 with SMTP id 20so6288092gxk.19 for ; Tue, 21 Apr 2009 09:59:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type; bh=tQ1A9eu3A82/ZRAmzUEQS5a8b8gyTDAFq2LcREWONwQ=; b=gE6a4oY8IRWtxStVeA9YPOqak9nsMfLQ4ZJ1zl7COJBInEn331EwMo438C4sWDvmWq vzdhHp132kzyc9ljJe+YBUyYpTKuyHrkvZbxNySKJTR8lB1LQ5OF/SMitS7bfP2QaDx8 0oTPG6Wc9sOGZxZWTetDrPsGwx4ugwcU5FnkA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=e2EuhmMiOP23U0T4fTVQRqqH9QETNB8t3x4hiI7Hrc0G8bk4yqjUcHODQ3hQ7DjN9H aifaX45ce2Cbd0DqTg1HoRpBIAlUVVwWvxoIqjq4effuF2jW78KdOlwdkHpHxyLUEB1C oIF0jRmjZpVEFbJTBkpIEkF6RuEDqW7cLAjp0= MIME-Version: 1.0 Received: by 10.90.98.13 with SMTP id v13mr1426930agb.0.1240333190258; Tue, 21 Apr 2009 09:59:50 -0700 (PDT) In-Reply-To: <1240311202.361300.1366.nullmailer@galant.ukfsn.org> References: <1240311202.361300.1366.nullmailer@galant.ukfsn.org> Date: Tue, 21 Apr 2009 09:59:49 -0700 Message-ID: From: Maksim Yevmenkin To: Iain Hibbert Content-Type: multipart/mixed; boundary=0016364ed650356495046813930a Cc: freebsd-bluetooth@freebsd.org Subject: Re: libhci update X-BeenThere: freebsd-bluetooth@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Using Bluetooth in FreeBSD environments List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Apr 2009 16:59:51 -0000 --0016364ed650356495046813930a Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit On Tue, Apr 21, 2009 at 3:53 AM, Iain Hibbert wrote: > On Mon, 20 Apr 2009, Maksim Yevmenkin wrote: > >> >> thanks for the feedback. i'm attaching revisited patch. please take a >> >> look and let me know if this is something you happy with. >> > >> > (pls ignore typos & bad formatting, am on mobile device :) >> > >> > Bt_devrecv() should probably take void * for buffer? Also manpage suggests it >> > will only receive hci events. Do you think its worth doing some validation of received >> > data? (eg return EIO for truncated reads?) >> >> i will change uint8_t * to void *, no problem. i also updated man page >> and removed 'event' word :) > > Ok also in bt_devrecv() > - return type should be ssize_t > - size cannot be < 0 (use "size == 0")? sure. i changed it. > and what of validation of received data here? It could be worth checking > that the buffer is not truncated so that the caller does not have to worry > about it, but that does require checking the packet type.. why not? :) i added it as well. >> > Bt_devreq() needs to set/restore a filter too >> >> well, maybe. bt_devreq() operates on already opened socket. the >> assumption i'm making here is that application will set appropriate >> filter before calling bt_devreq(). otherwise, application would have >> to always set 'event' field to acceptable value (or zero). i could go >> either way here. just need to document implemented behavior better. > > Mm, its a good point - there are arguments either way (bloat vs guaranteed > success) but I think since the difference between devreq() and devrecv() > is that devreq() handles all the fiddly details for you, I think its worth > doing that aswell.. fine. it now sets and restores filter :) >> > Do you think its worth to cook dev_class into a normalised host >> > numeric value rather than 3 bytes ? >> >> right, hmm, i guess we could turn dev_class into uint32_t in le16 byte >> order (since everything else in bluetooth hci is in le16 order), but >> maybe its too much? spec breaks out dev_class as 3 bytes array and talks >> about bytes and bits within each byte. i'm kinda leaning towards leaving >> it as is, because otherwise application would have to translate byte/bit >> into uint32_t mask. it could be somewhat convenient, i guess. again, no >> strong feeling about it. could go either way. > > My thought was that some of the 'fields' do seem to cross over into > multiple bytes (eg the service class flags in the default format type) and > perhaps its easier to interpret as a single value where bits can be tested > in host order by such as (class & (1 << N))? I don't know how much that > helps but the assigned numbers document does seem to show it as a bit > array. (I'm not having a strong opinion either :) left it as 3 bytes array for now. >> > Probably need to specifically mention that the inquiry response to be >> > released using free() in manpage? >> >> it says so, i.e. >> >> The >> .Fa ii >> parameter specifies where to place inquiry results. >> On success, the function will return total number of inquiry results, >> will allocate buffer to store all the inquiry results and >> will return pointer to the allocated buffer in the >> .Fa ii >> parameter. >> It is up to the caller of the function to dispose of the buffer. > > No, I mean to specifically mention ".Xr free 3" as the method used to > dispose of the buffer. ah, i see. man page was updated. the revised diff is attached. please review. thanks, max --0016364ed650356495046813930a Content-Type: text/plain; charset=US-ASCII; name="bluetooth.hci.diff.txt" Content-Disposition: attachment; filename="bluetooth.hci.diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ftsuch0v0 SW5kZXg6IGhjaS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGhjaS5jCShyZXZpc2lvbiAxOTEzMjkpCisrKyBo Y2kuYwkod29ya2luZyBjb3B5KQpAQCAtMzAsMTUgKzMwLDQ5NyBAQAogICogJEZyZWVCU0QkCiAg Ki8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGJsdWV0b290aC5oPgogI2luY2x1 ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAj aW5jbHVkZSA8dW5pc3RkLmg+CiAKK3N0YXRpYyBpbnQgICAgYnRfZGV2YW55X2NiKGludCBzLCBz dHJ1Y3QgYnRfZGV2aW5mbyBjb25zdCAqZGksIHZvaWQgKnhkZXZuYW1lKTsKIHN0YXRpYyBjaGFy ICogYnRfZGV2Mm5vZGUgKGNoYXIgY29uc3QgKmRldm5hbWUsIGNoYXIgKm5vZGVuYW1lLCBpbnQg bm5sZW4pOwogCiBpbnQKK2J0X2Rldm9wZW4oY2hhciBjb25zdCAqZGV2bmFtZSkKK3sKKwlzdHJ1 Y3Qgc29ja2FkZHJfaGNpCWhhOworCWJkYWRkcl90CQliYTsKKwlpbnQJCQlzOworCisJaWYgKGRl dm5hbWUgPT0gTlVMTCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQor CisJbWVtc2V0KCZoYSwgMCwgc2l6ZW9mKGhhKSk7CisJaGEuaGNpX2xlbiA9IHNpemVvZihoYSk7 CisJaGEuaGNpX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKKworCWlmIChidF9hdG9uKGRldm5hbWUs ICZiYSkpIHsKKwkJaWYgKCFidF9kZXZuYW1lKGhhLmhjaV9ub2RlLCAmYmEpKQorCQkJcmV0dXJu ICgtMSk7CisJfSBlbHNlIGlmIChidF9kZXYybm9kZShkZXZuYW1lLCBoYS5oY2lfbm9kZSwKKwkJ CQkJc2l6ZW9mKGhhLmhjaV9ub2RlKSkgPT0gTlVMTCkgeworCQllcnJubyA9IEVOWElPOworCQly ZXR1cm4gKC0xKTsKKwl9CisKKwlzID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19SQVcsIEJM VUVUT09USF9QUk9UT19IQ0kpOworCWlmIChzIDwgMCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAo YmluZChzLCAoc3RydWN0IHNvY2thZGRyICopICZoYSwgc2l6ZW9mKGhhKSkgPCAwIHx8CisJICAg IGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSAmaGEsIHNpemVvZihoYSkpIDwgMCkgewor CQljbG9zZShzKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJcmV0dXJuIChzKTsKK30KKworaW50 CitidF9kZXZjbG9zZShpbnQgcykKK3sKKwlyZXR1cm4gKGNsb3NlKHMpKTsKK30KKworaW50Citi dF9kZXZzZW5kKGludCBzLCB1aW50MTZfdCBvcGNvZGUsIHZvaWQgKnBhcmFtLCBzaXplX3QgcGxl bikKK3sKKwluZ19oY2lfY21kX3BrdF90CWg7CisJc3RydWN0IGlvdmVjCQlpdlsyXTsKKwlpbnQJ CQlpdm47CisKKwlpZiAoKHBsZW4gPT0gMCAmJiBwYXJhbSAhPSBOVUxMKSB8fCAocGxlbiA+IDAg JiYgcGFyYW0gPT0gTlVMTCkpIHsgCisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsK Kwl9CisKKwlpdlswXS5pb3ZfYmFzZSA9ICZoOworCWl2WzBdLmlvdl9sZW4gPSBzaXplb2YoaCk7 CisJaXZuID0gMTsKKworCWgudHlwZSA9IE5HX0hDSV9DTURfUEtUOworCWgub3Bjb2RlID0gaHRv bGUxNihvcGNvZGUpOworCWlmIChwbGVuID4gMCkgeworCQloLmxlbmd0aCA9IHBsZW47CisKKwkJ aXZbMV0uaW92X2Jhc2UgPSBwYXJhbTsKKwkJaXZbMV0uaW92X2xlbiA9IHBsZW47CisJCWl2biA9 IDI7CisJfSBlbHNlCisJCWgubGVuZ3RoID0gMDsKKworCXdoaWxlICh3cml0ZXYocywgaXYsIGl2 bikgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpCisJCQlj b250aW51ZTsKKworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzc2l6 ZV90CitidF9kZXZyZWN2KGludCBzLCB2b2lkICpidWYsIHNpemVfdCBzaXplLCB0aW1lX3QgdG8p Cit7CisJZmRfc2V0CQlyZmQ7CisJc3RydWN0IHRpbWV2YWwJdHY7CisJc3NpemVfdAkJbjsKKwor CWlmIChidWYgPT0gTlVMTCB8fCBzaXplID09IDAgfHwgdG8gPCAwKSB7CisJCWVycm5vID0gRUlO VkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlGRF9aRVJPKCZyZmQpOworCUZEX1NFVChzLCAm cmZkKTsKKworCXR2LnR2X3NlYyA9IHRvOworCXR2LnR2X3VzZWMgPSAwOworCisJd2hpbGUgKChu ID0gc2VsZWN0KHMgKyAxLCAmcmZkLCBOVUxMLCBOVUxMLCAmdHYpKSA8IDApIHsKKwkJaWYgKGVy cm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCisJCXJldHVy biAoLTEpOworCX0KKworCWlmIChuID09IDApIHsKKwkJZXJybm8gPSBFVElNRURPVVQ7CisJCXJl dHVybiAoLTEpOworCX0KKworCWFzc2VydChGRF9JU1NFVChzLCAmcmZkKSk7CisKKwl3aGlsZSAo KG4gPSByZWFkKHMsIGJ1Ziwgc2l6ZSkpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8 IGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuICgtMSk7CisJfQorCisJ c3dpdGNoICgqKCh1aW50OF90ICopIGJ1ZikpIHsKKwljYXNlIE5HX0hDSV9DTURfUEtUOiB7CisJ CW5nX2hjaV9jbWRfcGt0X3QJKmggPSAobmdfaGNpX2NtZF9wa3RfdCAqKSBidWY7CisKKwkJaWYg KG4gPj0gc2l6ZW9mKCpoKSAmJiBuID09IChzaXplb2YoKmgpICsgaC0+bGVuZ3RoKSkKKwkJCXJl dHVybiAobik7CisJCX0gYnJlYWs7CisKKwljYXNlIE5HX0hDSV9BQ0xfREFUQV9QS1Q6IHsKKwkJ bmdfaGNpX2FjbGRhdGFfcGt0X3QJKmggPSAobmdfaGNpX2FjbGRhdGFfcGt0X3QgKikgYnVmOwor CisJCWlmIChuID49IHNpemVvZigqaCkgJiYgbiA9PSAoc2l6ZW9mKCpoKSArIGxlMTZ0b2goaC0+ bGVuZ3RoKSkpCisJCQlyZXR1cm4gKG4pOworCQl9IGJyZWFrOworCisJY2FzZSBOR19IQ0lfU0NP X0RBVEFfUEtUOiB7CisJCW5nX2hjaV9zY29kYXRhX3BrdF90CSpoID0gKG5nX2hjaV9zY29kYXRh X3BrdF90ICopIGJ1ZjsKKworCQlpZiAobiA+PSBzaXplb2YoKmgpICYmIG4gPT0gKHNpemVvZigq aCkgKyBoLT5sZW5ndGgpKQorCQkJcmV0dXJuIChuKTsKKwkJfSBicmVhazsKKworCWNhc2UgTkdf SENJX0VWRU5UX1BLVDogeworCQluZ19oY2lfZXZlbnRfcGt0X3QJKmggPSAobmdfaGNpX2V2ZW50 X3BrdF90ICopIGJ1ZjsKKworCQlpZiAobiA+PSBzaXplb2YoKmgpICYmIG4gPT0gKHNpemVvZigq aCkgKyBoLT5sZW5ndGgpKQorCQkJcmV0dXJuIChuKTsKKwkJfSBicmVhazsKKwl9CisKKwllcnJu byA9IEVJTzsKKwlyZXR1cm4gKC0xKTsKK30KKworaW50CitidF9kZXZyZXEoaW50IHMsIHN0cnVj dCBidF9kZXZyZXEgKnIsIHRpbWVfdCB0bykKK3sKKwl1aW50OF90CQkJCWJ1ZlszMjBdOyAvKiBt b3JlIHRoYW4gZW5vdWdoICovCisJbmdfaGNpX2V2ZW50X3BrdF90CQkqZSA9IChuZ19oY2lfZXZl bnRfcGt0X3QgKikgYnVmOworCW5nX2hjaV9jb21tYW5kX2NvbXBsX2VwCQkqY2MgPSAobmdfaGNp X2NvbW1hbmRfY29tcGxfZXAgKikoZSsxKTsKKwluZ19oY2lfY29tbWFuZF9zdGF0dXNfZXAJKmNz ID0gKG5nX2hjaV9jb21tYW5kX3N0YXR1c19lcCopKGUrMSk7CisJc3RydWN0IGJ0X2RldmZpbHRl cgkJb2xkLCBuZXc7CisJdGltZV90CQkJCXRfZW5kOworCXVpbnQxNl90CQkJb3Bjb2RlOworCXNz aXplX3QJCQkJbjsKKwlpbnQJCQkJZXJyb3I7CisKKwlpZiAocyA8IDAgfHwgciA9PSBOVUxMIHx8 IHRvIDwgMCkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJaWYg KChyLT5ybGVuID09IDAgJiYgci0+cnBhcmFtICE9IE5VTEwpIHx8CisJICAgIChyLT5ybGVuID4g MCAmJiByLT5ycGFyYW0gPT0gTlVMTCkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAo LTEpOworCX0KKworCW1lbXNldCgmbmV3LCAwLCBzaXplb2YobmV3KSk7CisJYnRfZGV2ZmlsdGVy X3BrdF9zZXQoJm5ldywgTkdfSENJX0VWRU5UX1BLVCk7CisJYnRfZGV2ZmlsdGVyX2V2dF9zZXQo Jm5ldywgTkdfSENJX0VWRU5UX0NPTU1BTkRfQ09NUEwpOworCWJ0X2RldmZpbHRlcl9ldnRfc2V0 KCZuZXcsIE5HX0hDSV9FVkVOVF9DT01NQU5EX1NUQVRVUyk7CisJaWYgKHItPmV2ZW50ICE9IDAp CisJCWJ0X2RldmZpbHRlcl9ldnRfc2V0KCZuZXcsIHItPmV2ZW50KTsKKworCWlmIChidF9kZXZm aWx0ZXIocywgJm5ldywgJm9sZCkgPCAwKQorCQlyZXR1cm4gKC0xKTsKKworCWVycm9yID0gMDsK KworCW4gPSBidF9kZXZzZW5kKHMsIHItPm9wY29kZSwgci0+Y3BhcmFtLCByLT5jbGVuKTsKKwlp ZiAobiA8IDApIHsKKwkJZXJyb3IgPSBlcnJubzsKKwkJZ290byBvdXQ7CQorCX0KKworCW9wY29k ZSA9IGh0b2xlMTYoci0+b3Bjb2RlKTsKKwl0X2VuZCA9IHRpbWUoTlVMTCkgKyB0bzsKKworCWRv IHsKKwkJdG8gPSB0X2VuZCAtIHRpbWUoTlVMTCk7CisJCWlmICh0byA8IDApCisJCQl0byA9IDA7 CisKKwkJbiA9IGJ0X2RldnJlY3YocywgYnVmLCBzaXplb2YoYnVmKSwgdG8pOworCQlpZiAobiA8 IDApIHsKKwkJCWVycm9yID0gZXJybm87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChlLT50 eXBlICE9IE5HX0hDSV9FVkVOVF9QS1QpIHsKKwkJCWVycm9yID0gRUlPOworCQkJZ290byBvdXQ7 CisJCX0KKworCQluIC09IHNpemVvZigqZSk7CisKKwkJc3dpdGNoIChlLT5ldmVudCkgeworCQlj YXNlIE5HX0hDSV9FVkVOVF9DT01NQU5EX0NPTVBMOgorCQkJaWYgKGNjLT5vcGNvZGUgPT0gb3Bj b2RlKSB7CisJCQkJbiAtPSBzaXplb2YoKmNjKTsKKworCQkJCWlmIChyLT5ybGVuID49IG4pIHsK KwkJCQkJci0+cmxlbiA9IG47CisJCQkJCW1lbWNweShyLT5ycGFyYW0sIGNjICsgMSwgci0+cmxl bik7CisJCQkJfQorCisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE5H X0hDSV9FVkVOVF9DT01NQU5EX1NUQVRVUzoKKwkJCWlmIChjcy0+b3Bjb2RlID09IG9wY29kZSkg eworCQkJCWlmIChyLT5ldmVudCAhPSBOR19IQ0lfRVZFTlRfQ09NTUFORF9TVEFUVVMpIHsKKwkJ CQkJaWYgKGNzLT5zdGF0dXMgIT0gMCkgeworCQkJCQkJZXJyb3IgPSBFSU87CisJCQkJCQlnb3Rv IG91dDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyLT5ybGVuID49IG4pIHsKKwkJ CQkJCXItPnJsZW4gPSBuOworCQkJCQkJbWVtY3B5KHItPnJwYXJhbSwgY3MsIHItPnJsZW4pOwor CQkJCQl9CisKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVm YXVsdDoKKwkJCWlmIChlLT5ldmVudCA9PSByLT5ldmVudCkgeworCQkJCWlmIChyLT5ybGVuID49 IG4pIHsKKwkJCQkJci0+cmxlbiA9IG47CisJCQkJCW1lbWNweShyLT5ycGFyYW0sIGUgKyAxLCBy LT5ybGVuKTsKKwkJCQl9CisKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJ fSB3aGlsZSAodG8gPiAwKTsKKworCWVycm9yID0gRVRJTUVET1VUOworb3V0OgorCWJ0X2RldmZp bHRlcihzLCAmb2xkLCBOVUxMKTsKKworCWlmIChlcnJvciAhPSAwKSB7CisJCWVycm5vID0gZXJy b3I7CisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2ludAorYnRfZGV2 ZmlsdGVyKGludCBzLCBzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpuZXcsIHN0cnVjdCBidF9k ZXZmaWx0ZXIgKm9sZCkKK3sKKwlzdHJ1Y3QgbmdfYnRzb2NrZXRfaGNpX3Jhd19maWx0ZXIJZjsK Kwlzb2NrbGVuX3QJCQkJbGVuOworCisJaWYgKG5ldyA9PSBOVUxMICYmIG9sZCA9PSBOVUxMKSB7 CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAob2xkICE9IE5V TEwpIHsKKwkJbGVuID0gc2l6ZW9mKGYpOworCQlpZiAoZ2V0c29ja29wdChzLCBTT0xfSENJX1JB VywgU09fSENJX1JBV19GSUxURVIsICZmLCAmbGVuKSA8IDApCisJCQlyZXR1cm4gKC0xKTsKKwor CQltZW1zZXQob2xkLCAwLCBzaXplb2YoKm9sZCkpOworCQltZW1jcHkob2xkLT5wYWNrZXRfbWFz aywgJmYucGFja2V0X21hc2ssCisJCQlzaXplb2Yob2xkLT5wYWNrZXRfbWFzaykpOworCQltZW1j cHkob2xkLT5ldmVudF9tYXNrLCAmZi5ldmVudF9tYXNrLAorCQkJc2l6ZW9mKG9sZC0+ZXZlbnRf bWFzaykpOworCX0KKworCWlmIChuZXcgIT0gTlVMTCkgeworCQltZW1zZXQoJmYsIDAsIHNpemVv ZihmKSk7CisJCW1lbWNweSgmZi5wYWNrZXRfbWFzaywgbmV3LT5wYWNrZXRfbWFzaywgc2l6ZW9m KGYucGFja2V0X21hc2spKTsKKwkJbWVtY3B5KCZmLmV2ZW50X21hc2ssIG5ldy0+ZXZlbnRfbWFz aywgc2l6ZW9mKGYuZXZlbnRfbWFzaykpOworCisJCWxlbiA9IHNpemVvZihmKTsKKwkJaWYgKHNl dHNvY2tvcHQocywgU09MX0hDSV9SQVcsIFNPX0hDSV9SQVdfRklMVEVSLCAmZiwgbGVuKSA8IDAp CisJCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitidF9kZXZm aWx0ZXJfcGt0X3NldChzdHJ1Y3QgYnRfZGV2ZmlsdGVyICpmaWx0ZXIsIHVpbnQ4X3QgdHlwZSkK K3sKKwliaXRfc2V0KGZpbHRlci0+cGFja2V0X21hc2ssIHR5cGUgLSAxKTsKK30KKwordm9pZAor YnRfZGV2ZmlsdGVyX3BrdF9jbHIoc3RydWN0IGJ0X2RldmZpbHRlciAqZmlsdGVyLCB1aW50OF90 IHR5cGUpCit7CisJYml0X2NsZWFyKGZpbHRlci0+cGFja2V0X21hc2ssIHR5cGUgLSAxKTsKK30K KworaW50CitidF9kZXZmaWx0ZXJfcGt0X3RzdChzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpm aWx0ZXIsIHVpbnQ4X3QgdHlwZSkKK3sKKwlyZXR1cm4gKGJpdF90ZXN0KGZpbHRlci0+cGFja2V0 X21hc2ssIHR5cGUgLSAxKSk7Cit9CisKK3ZvaWQKK2J0X2RldmZpbHRlcl9ldnRfc2V0KHN0cnVj dCBidF9kZXZmaWx0ZXIgKmZpbHRlciwgdWludDhfdCBldmVudCkKK3sKKwliaXRfc2V0KGZpbHRl ci0+ZXZlbnRfbWFzaywgZXZlbnQgLSAxKTsKK30KKwordm9pZAorYnRfZGV2ZmlsdGVyX2V2dF9j bHIoc3RydWN0IGJ0X2RldmZpbHRlciAqZmlsdGVyLCB1aW50OF90IGV2ZW50KQoreworCWJpdF9j bGVhcihmaWx0ZXItPmV2ZW50X21hc2ssIGV2ZW50IC0gMSk7Cit9CisKK2ludAorYnRfZGV2Zmls dGVyX2V2dF90c3Qoc3RydWN0IGJ0X2RldmZpbHRlciBjb25zdCAqZmlsdGVyLCB1aW50OF90IGV2 ZW50KQoreworCXJldHVybiAoYml0X3Rlc3QoZmlsdGVyLT5ldmVudF9tYXNrLCBldmVudCAtIDEp KTsKK30KKworaW50CitidF9kZXZpbnF1aXJ5KGNoYXIgY29uc3QgKmRldm5hbWUsIHRpbWVfdCBs ZW5ndGgsIGludCBudW1fcnNwLAorCQlzdHJ1Y3QgYnRfZGV2aW5xdWlyeSAqKmlpKQoreworCXVp bnQ4X3QJCQkJYnVmWzMyMF07CisJY2hhcgkJCQlfZGV2bmFtZVtIQ0lfREVWTkFNRV9TSVpFXTsK KwlzdHJ1Y3QgYnRfZGV2ZmlsdGVyCQlmOworCW5nX2hjaV9pbnF1aXJ5X2NwCQkqY3AgPSAobmdf aGNpX2lucXVpcnlfY3AgKikgYnVmOworCW5nX2hjaV9ldmVudF9wa3RfdAkJKmUgPSAobmdfaGNp X2V2ZW50X3BrdF90ICopIGJ1ZjsKKwluZ19oY2lfaW5xdWlyeV9yZXN1bHRfZXAJKmVwID0gKG5n X2hjaV9pbnF1aXJ5X3Jlc3VsdF9lcCAqKShlKzEpOworCW5nX2hjaV9pbnF1aXJ5X3Jlc3BvbnNl CQkqaXI7CisJc3RydWN0IGJ0X2RldmlucXVpcnkJCSppOworCWludAkJCQlzLCBuOworCXRpbWVf dAkJCQl0bzsKKworCWlmIChpaSA9PSBOVUxMKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1 cm4gKC0xKTsKKwl9CisKKwlpZiAoZGV2bmFtZSA9PSBOVUxMKSB7CisJCW1lbXNldChfZGV2bmFt ZSwgMCwgc2l6ZW9mKF9kZXZuYW1lKSk7CisJCWRldm5hbWUgPSBfZGV2bmFtZTsKKworCQluID0g YnRfZGV2ZW51bShidF9kZXZhbnlfY2IsIF9kZXZuYW1lKTsKKwkJaWYgKG4gPD0gMCkgeworCQkJ aWYgKG4gPT0gMCkKKwkJCQkqaWkgPSBOVUxMOworCisJCQlyZXR1cm4gKG4pOworCQl9CisJfQor CisJcyA9IGJ0X2Rldm9wZW4oZGV2bmFtZSk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm4gKC0xKTsK KworCWlmIChidF9kZXZmaWx0ZXIocywgTlVMTCwgJmYpIDwgMCkgeworCQlidF9kZXZjbG9zZShz KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJYnRfZGV2ZmlsdGVyX2V2dF9zZXQoJmYsIE5HX0hD SV9FVkVOVF9JTlFVSVJZX0NPTVBMKTsKKwlidF9kZXZmaWx0ZXJfZXZ0X3NldCgmZiwgTkdfSENJ X0VWRU5UX0lOUVVJUllfUkVTVUxUKTsKKworCWlmIChidF9kZXZmaWx0ZXIocywgJmYsIE5VTEwp IDwgMCkgeworCQlidF9kZXZjbG9zZShzKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyogQWx3 YXlzIHVzZSBHSUFDIExBUCAqLworCWNwLT5sYXBbMF0gPSAweDMzOworCWNwLT5sYXBbMV0gPSAw eDhiOworCWNwLT5sYXBbMl0gPSAweDllOworCisJLyogQ2FsY3VsYXRlIGlucXVpcmUgbGVuZ3Ro IGluIDEuMjggc2Vjb25kIHVuaXRzICovCisJdG8gPSAodGltZV90KSAoKGRvdWJsZSkgbGVuZ3Ro IC8gMS4yOCk7CisJaWYgKHRvIDw9IDApCisJCWNwLT5pbnF1aXJ5X2xlbmd0aCA9IDQ7CQkvKiA1 LjEyIHNlY29uZHMgKi8KKwllbHNlIGlmICh0byA+IDI1NCkKKwkJY3AtPmlucXVpcnlfbGVuZ3Ro ID0gMjU1OwkvKiAzMjYuNDAgc2Vjb25kcyAqLworCWVsc2UKKwkJY3AtPmlucXVpcnlfbGVuZ3Ro ID0gdG8gKyAxOworCisJdG8gPSAodGltZV90KSgoZG91YmxlKSBjcC0+aW5xdWlyeV9sZW5ndGgg KiAxLjI4KSArIDE7CisKKwlpZiAobnVtX3JzcCA8PSAwIHx8IG51bV9yc3AgPiAyNTUpCisJCW51 bV9yc3AgPSA4OworCWNwLT5udW1fcmVzcG9uc2VzID0gKHVpbnQ4X3QpIG51bV9yc3A7CisKKwlp ID0gKmlpID0gY2FsbG9jKG51bV9yc3AsIHNpemVvZihzdHJ1Y3QgYnRfZGV2aW5xdWlyeSkpOwor CWlmIChpID09IE5VTEwpIHsKKwkJYnRfZGV2Y2xvc2Uocyk7CisJCWVycm5vID0gRU5PTUVNOwor CQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAoYnRfZGV2c2VuZChzLAorCQlOR19IQ0lfT1BDT0RF KE5HX0hDSV9PR0ZfTElOS19DT05UUk9MLCBOR19IQ0lfT0NGX0lOUVVJUlkpLAorCQkJY3AsIHNp emVvZigqY3ApKSA8IDApIHsKKwkJZnJlZShpKTsKKwkJYnRfZGV2Y2xvc2Uocyk7CisJCXJldHVy biAoLTEpOworCX0KKword2FpdF9mb3JfbW9yZToKKworCW4gPSBidF9kZXZyZWN2KHMsIGJ1Ziwg c2l6ZW9mKGJ1ZiksIHRvKTsKKwlpZiAobiA8IDApIHsKKwkJZnJlZShpKTsKKwkJYnRfZGV2Y2xv c2Uocyk7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChuIDwgc2l6ZW9mKG5nX2hjaV9ldmVu dF9wa3RfdCkpIHsKKwkJZnJlZShpKTsKKwkJYnRfZGV2Y2xvc2Uocyk7CisJCWVycm5vID0gRUlP OworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlzd2l0Y2ggKGUtPmV2ZW50KSB7CisJY2FzZSBOR19I Q0lfRVZFTlRfSU5RVUlSWV9DT01QTDoKKwkJYnJlYWs7CisKKwljYXNlIE5HX0hDSV9FVkVOVF9J TlFVSVJZX1JFU1VMVDoKKwkJaXIgPSAobmdfaGNpX2lucXVpcnlfcmVzcG9uc2UgKikoZXAgKyAx KTsKKworI3VuZGVmCU1JTgorI2RlZmluZQlNSU4oYSwgYikJKCgoYSkgPCAoYikpPyAoYSkgOiAo YikpCisKKwkJZm9yIChuID0gMDsgbiA8IE1JTihlcC0+bnVtX3Jlc3BvbnNlcywgbnVtX3JzcCk7 IG4gKyspIHsKKwkJCWJkYWRkcl9jb3B5KCZpLT5iZGFkZHIsICZpci0+YmRhZGRyKTsKKwkJCWkt PnBzY2FuX3JlcF9tb2RlID0gaXItPnBhZ2Vfc2Nhbl9yZXBfbW9kZTsKKwkJCWktPnBzY2FuX3Bl cmlvZF9tb2RlID0gaXItPnBhZ2Vfc2Nhbl9wZXJpb2RfbW9kZTsKKwkJCW1lbWNweShpLT5kZXZf Y2xhc3MsIGlyLT51Y2xhc3MsIHNpemVvZihpLT5kZXZfY2xhc3MpKTsKKwkJCWktPmNsb2NrX29m ZnNldCA9IGxlMTZ0b2goaXItPmNsb2NrX29mZnNldCk7CisKKwkJCWlyICsrOworCQkJaSArKzsK KwkJCW51bV9yc3AgLS07CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKworCWRlZmF1bHQ6CisJ CWdvdG8gd2FpdF9mb3JfbW9yZTsKKwkJLyogTk9UIFJFQUNIRUQgKi8KKwl9CisKKwlidF9kZXZj bG9zZShzKTsKKwkJCisJcmV0dXJuIChpIC0gKmlpKTsKK30KKworaW50CiBidF9kZXZpbmZvKHN0 cnVjdCBidF9kZXZpbmZvICpkaSkKIHsKIAl1bmlvbiB7CkBAIC01Myw2ICs1MzUsNyBAQAogCQlz dHJ1Y3QgbmdfYnRzb2NrZXRfaGNpX3Jhd19ub2RlX2RlYnVnCQlyODsKIAl9CQkJCQkJcnA7CiAJ c3RydWN0IHNvY2thZGRyX2hjaQkJCQloYTsKKwlzb2NrbGVuX3QJCQkJCWhhbGVuOwogCWludAkJ CQkJCXMsIHJ2YWw7CiAKIAlpZiAoZGkgPT0gTlVMTCkgewpAQCAtNjAsMjcgKzU0MywxNCBAQAog CQlyZXR1cm4gKC0xKTsKIAl9CiAKLQltZW1zZXQoJmhhLCAwLCBzaXplb2YoaGEpKTsKLQloYS5o Y2lfbGVuID0gc2l6ZW9mKGhhKTsKLQloYS5oY2lfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotCi0J aWYgKGJ0X2F0b24oZGktPmRldm5hbWUsICZycC5yMS5iZGFkZHIpKSB7Ci0JCWlmICghYnRfZGV2 bmFtZShoYS5oY2lfbm9kZSwgJnJwLnIxLmJkYWRkcikpCi0JCQlyZXR1cm4gKC0xKTsKLQl9IGVs c2UgaWYgKGJ0X2RldjJub2RlKGRpLT5kZXZuYW1lLCBoYS5oY2lfbm9kZSwKLQkJCQkJc2l6ZW9m KGhhLmhjaV9ub2RlKSkgPT0gTlVMTCkgewotCQllcnJubyA9IEVOWElPOwotCQlyZXR1cm4gKC0x KTsKLQl9Ci0KLQlzID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19SQVcsIEJMVUVUT09USF9Q Uk9UT19IQ0kpOworCXMgPSBidF9kZXZvcGVuKGRpLT5kZXZuYW1lKTsKIAlpZiAocyA8IDApCiAJ CXJldHVybiAoLTEpOwogCiAJcnZhbCA9IC0xOwogCi0JaWYgKGJpbmQocywgKHN0cnVjdCBzb2Nr YWRkciAqKSAmaGEsIHNpemVvZihoYSkpIDwgMCB8fAotCSAgICBjb25uZWN0KHMsIChzdHJ1Y3Qg c29ja2FkZHIgKikgJmhhLCBzaXplb2YoaGEpKSA8IDApCisJaGFsZW4gPSBzaXplb2YoaGEpOwor CWlmIChnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyICopICZoYSwgJmhhbGVuKSA8IDAp CiAJCWdvdG8gYmFkOwogCXN0cmxjcHkoZGktPmRldm5hbWUsIGhhLmhjaV9ub2RlLCBzaXplb2Yo ZGktPmRldm5hbWUpKTsKIApAQCAtMTM4LDcgKzYwOCw3IEBACiAKIAlydmFsID0gMDsKIGJhZDoK LQljbG9zZShzKTsKKwlidF9kZXZjbG9zZShzKTsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0y MDUsNiArNjc1LDEzIEBACiAJcmV0dXJuIChjb3VudCk7CiB9CiAKK3N0YXRpYyBpbnQKK2J0X2Rl dmFueV9jYihpbnQgcywgc3RydWN0IGJ0X2RldmluZm8gY29uc3QgKmRpLCB2b2lkICp4ZGV2bmFt ZSkKK3sKKwlzdHJsY3B5KChjaGFyICopIHhkZXZuYW1lLCBkaS0+ZGV2bmFtZSwgSENJX0RFVk5B TUVfU0laRSk7CisJcmV0dXJuICgxKTsKK30KKwogc3RhdGljIGNoYXIgKgogYnRfZGV2Mm5vZGUo Y2hhciBjb25zdCAqZGV2bmFtZSwgY2hhciAqbm9kZW5hbWUsIGludCBubmxlbikKIHsKSW5kZXg6 IGJsdWV0b290aC4zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGJsdWV0b290aC4zCShyZXZpc2lvbiAxOTEzMjkp CisrKyBibHVldG9vdGguMwkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNyBAQAogLlwiICRJ ZDogYmx1ZXRvb3RoLjMsdiAxLjUgMjAwMy8wNS8yMCAyMzowNDozMCBtYXggRXhwICQKIC5cIiAk RnJlZUJTRCQKIC5cIgotLkRkIEZlYnJ1YXJ5IDEzLCAyMDA5CisuRGQgQXByaWwgOSwgMjAwOQog LkR0IEJMVUVUT09USCAzCiAuT3MKIC5TaCBOQU1FCkBAIC00MSw2ICs0MSwyMyBAQAogLk5tIGJ0 X2VuZHByb3RvZW50ICwKIC5ObSBidF9hdG9uICwKIC5ObSBidF9udG9hICwKKy5ObSBidF9kZXZh ZGRyICwKKy5ObSBidF9kZXZuYW1lICwKKy5ObSBidF9kZXZpbmZvICwKKy5ObSBidF9kZXZlbnVt ICwKKy5ObSBidF9kZXZvcGVuICwKKy5ObSBidF9kZXZjbG9zZSAsCisuTm0gYnRfZGV2c2VuZCAs CisuTm0gYnRfZGV2cmVjdiAsCisuTm0gYnRfZGV2cmVxICwKKy5ObSBidF9kZXZmaWx0ZXIgLAor Lk5tIGJ0X2RldmZpbHRlcl9wa3Rfc2V0ICwKKy5ObSBidF9kZXZmaWx0ZXJfcGt0X2NsciAsCisu Tm0gYnRfZGV2ZmlsdGVyX3BrdF90c3QgLAorLk5tIGJ0X2RldmZpbHRlcl9ldnRfc2V0ICwKKy5O bSBidF9kZXZmaWx0ZXJfZXZ0X2NsciAsCisuTm0gYnRfZGV2ZmlsdGVyX2V2dF90c3QgLAorLk5t IGJ0X2RldmlucXVpcnkgLAogLk5tIGJkYWRkcl9zYW1lICwKIC5ObSBiZGFkZHJfYW55ICwKIC5O bSBiZGFkZHJfY29weQpAQCAtODQsNiArMTAxLDMyIEBACiAuRnQgaW50CiAuRm4gYnRfZGV2ZW51 bSAiYnRfZGV2ZW51bV9jYl90ICpjYiIgInZvaWQgKmFyZyIKIC5GdCBpbnQKKy5GbiBidF9kZXZv cGVuICJjaGFyIGNvbnN0ICpkZXZuYW1lIgorLkZ0IGludAorLkZuIGJ0X2RldmNsb3NlICJpbnQg cyIKKy5GdCBpbnQKKy5GbiBidF9kZXZzZW5kICJpbnQgcyIgInVpbnQxNl90IG9wY29kZSIgInZv aWQgKnBhcmFtIiAic2l6ZV90IHBsZW4iCisuRnQgc3NpemVfdAorLkZuIGJ0X2RldnJlY3YgImlu dCBzIiAidm9pZCAqYnVmIiAic2l6ZV90IHNpemUiICJ0aW1lX3QgdG8iCisuRnQgaW50CisuRm4g YnRfZGV2cmVxICJpbnQgcyIgInN0cnVjdCBidF9kZXZyZXEgKnIiICJ0aW1lX3QgdG8iCisuRnQg aW50CisuRm4gYnRfZGV2ZmlsdGVyICJpbnQgcyIgInN0cnVjdCBidF9kZXZmaWx0ZXIgY29uc3Qg Km5ldyIgInN0cnVjdCBidF9kZXZmaWx0ZXIgKm9sZCIKKy5GdCB2b2lkCisuRm4gYnRfZGV2Zmls dGVyX3BrdF9zZXQgInN0cnVjdCBidF9kZXZmaWx0ZXIgKmZpbHRlciIgInVpbnQ4X3QgdHlwZSIK Ky5GdCB2b2lkCisuRm4gYnRfZGV2ZmlsdGVyX3BrdF9jbHQgInN0cnVjdCBidF9kZXZmaWx0ZXIg KmZpbHRlciIgInVpbnQ4X3QgdHlwZSIKKy5GdCBpbnQKKy5GbiBidF9kZXZmaWx0ZXJfcGt0X3Rz dCAic3RydWN0IGJ0X2RldmZpbHRlciBjb25zdCAqZmlsdGVyIiAidWludDhfdCB0eXBlIgorLkZ0 IHZvaWQKKy5GbiBidF9kZXZmaWx0ZXJfZXZ0X3NldCAic3RydWN0IGJ0X2RldmZpbHRlciAqZmls dGVyIiAidWludDhfdCBldmVudCIKKy5GdCB2b2lkCisuRm4gYnRfZGV2ZmlsdGVyX2V2dF9jbHQg InN0cnVjdCBidF9kZXZmaWx0ZXIgKmZpbHRlciIgInVpbnQ4X3QgZXZlbnQiCisuRnQgaW50Cisu Rm4gYnRfZGV2ZmlsdGVyX2V2dF90c3QgInN0cnVjdCBidF9kZXZmaWx0ZXIgY29uc3QgKmZpbHRl ciIgInVpbnQ4X3QgZXZlbnQiCisuRnQgaW50CisuRm4gYnRfZGV2aW5xdWlyeSAiY2hhciBjb25z dCAqZGV2bmFtZSIgInRpbWVfdCBsZW5ndGgiICJpbnQgbnVtX3JzcCIgInN0cnVjdCBidF9kZXZp bnF1aXJ5ICoqaWkiCisuRnQgaW50CiAuRm4gYmRhZGRyX3NhbWUgImNvbnN0IGJkYWRkcl90ICph IiAiY29uc3QgYmRhZGRyX3QgKmIiCiAuRnQgaW50CiAuRm4gYmRhZGRyX2FueSAiY29uc3QgYmRh ZGRyX3QgKmEiCkBAIC0zMTEsNiArMzU0LDIzNyBAQAogb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJy ZWQuCiAuUHAKIFRoZQorLkZuIGJ0X2Rldm9wZW4KK2Z1bmN0aW9uIG9wZW5zIEJsdWV0b290aCBk ZXZpY2Ugd2l0aCB0aGUgZ2l2ZW4KKy5GYSBkZXZuYW1lCithbmQgcmV0dXJucyBjb25uZWN0ZWQg YW5kIGJvdW5kCisuRHYgSENJCitzb2NrZXQuCitUaGUgZnVuY3Rpb24gcmV0dXJucyAtMSBpZiBh biBlcnJvciBoYXMgb2NjdXJyZWQuCisuUHAKK1RoZQorLkZuIGJ0X2RldmNsb3NlCitjbG9zZXMg cGFzc2VkCisuRHYgSENJCitzb2NrZXQKKy5GYSBzICwKK3ByZXZpb3VzbHkgb2J0YWluZWQgd2l0 aAorLlhyIGJ0X2Rldm9wZW4gMyAuCisuUHAKK1RoZQorLkZuIGJ0X2RldnNlbmQKK2Z1bmN0aW9u IHNlbmRzIEJsdWV0b290aAorLkR2IEhDSQorY29tbWFuZCB3aXRoIHRoZSBnaXZlbgorLkZhIG9w Y29kZQordG8gdGhlIHByb3ZpZGVkIHNvY2tldAorLkZhIHMgLAorcHJldmlvdXNseSBvYnRhaW5l ZCB3aXRoCisuWHIgYnRfZGV2b3BlbiAzIC4KK1RoZQorLkZhIG9wY29kZQorcGFyYW1ldGVyIGlz IGV4cHBlY3RlZCB0byBiZSBpbiB0aGUgaG9zdCBieXRlIG9yZGVyLgorVGhlCisuRmEgcGFyYW0K K2FuZAorLkZhIHBsZW4KK3BhcmFtZXRlcnMgc3BlY2lmeSBjb21tYW5kIHBhcmFtZXRlcnMuCitU aGUKKy5GbiBidF9kZXZzZW5kCitmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkKKy5EdiBIQ0kKK2Zp bHRlciBvbiB0aGUgcHJvdmlkZWQgc29ja2V0CisuRmEgcyAuCitUaGUgZnVuY3Rpb24gcmV0dXJu cyAwIG9uIHN1Y2Nlc3MsCitvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKy5QcAorVGhlCisu Rm4gYnRfZGV2cmVjdgorZnVuY3Rpb24gcmVjZWl2ZXMgb25lIEJsdWV0b290aAorLkR2IEhDSQor cGFja2V0IGZyb20gdGhlIHNvY2tldAorLkZhIHMgLAorcHJldmlvdXNseSBvYnRhaW5lZCB3aXRo CisuWHIgYnRfZGV2b3BlbiAzIC4KK1RoZSBwYWNrZXQgaXMgcGxhY2VkIGludG8gdGhlIHByb3Zp ZGVkIGJ1ZmZlcgorLkZhIGJ1Zgorb2Ygc2l6ZQorLkZhIHNpemUgLgorVGhlCisuRmEgdG8KK3Bh cmFtZXRlciBzcGVjaWZpZXMgcmVjZWl2ZSB0aW1lb3V0IGluIHNlY29uZHMuCitUaGUKKy5GbiBi dF9kZXZyZWN2CitmdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkKKy5EdiBIQ0kKK2ZpbHRlciBvbiB0 aGUgcHJvdmlkZWQgc29ja2V0CisuRmEgcyAuCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0b3RhbCBu dW1iZXIgb2YgYnl0ZXMgcmVjZXZpZWQsCitvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKy5Q cAorVGhlCisuRm4gYnRfZGV2cmVxCitmdW5jdGlvbiBtYWtlcyBCbHVldG9vdGgKKy5EdiBIQ0kK K3JlcXVlc3QgdG8gdGhlIHNvY2tldAorLkZhIHMgLAorcHJldmlvdXNseSBvYnRhaW5lZCB3aXRo CisuWHIgYnRfZGV2b3BlbiAzIC4KK1RoZSBmdW5jdGlvbiB3aWxsIHNlbmQgdGhlIHNwZWNpZmll ZCBjb21tYW5kIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQKK2V2ZW50LAorb3IgdGlt ZW91dAorLkZhIHRvCitzZWNvbmRzIHRvIG9jY3VyLgorVGhlCisuVnQgYnRfZGV2cmVxCitzdHJ1 Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQK K3N0cnVjdCBidF9kZXZyZXEKK3sKKyAgICAgICAgdWludDE2X3QgICAgICAgIG9wY29kZTsKKyAg ICAgICAgdWludDhfdCAgICAgICAgIGV2ZW50OworICAgICAgICB2b2lkICAgICAgICAgICAgKmNw YXJhbTsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIGNsZW47CisgICAgICAgIHZvaWQgICAgICAg ICAgICAqcnBhcmFtOworICAgICAgICBzaXplX3QgICAgICAgICAgcmxlbjsKK307CisuRWQKKy5Q cAorVGhlCisuRmEgb3Bjb2RlCitmaWVsZCBzcGVjaWZpZXMgdGhlIGNvbW1hbmQgYW5kIGlzIGV4 cGVjdGVkIHRvIGJlIGluIHRoZSBob3N0IGJ5dGUgb3JkZXIuCitUaGUKKy5GYSBjcGFyYW0KK2Fu ZAorLkZhIGNsZW4KK2ZpZWxkcyBzcGVjaWZ5IGNvbW1hbmQgcGFyYW1ldGVycyBkYXRhIGFuZCBj b21tYW5kIHBhcmFtZXRlcnMgZGF0YSBzaXplCityZXNwZWN0aXZlbHkuCitUaGUKKy5GYSBldmVu dAorZmllbGQgc3BlY2lmaWVzIHdoaWNoIEJsdWV0b290aAorLkR2IEhDSQorZXZlbnQgSUQgdGhl IGZ1bmN0aW9uIHNob3VsZCB3YWl0IGZvciwgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBzZXQgdG8g emVyby4KK1RoZQorLkR2IEhDSQorQ29tbWFuZCBDb21wbGV0ZSBhbmQgQ29tbWFuZCBTdGF0dXMg ZXZlbnRzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCitUaGUKKy5GYSBycGFyYW0KK2FuZAorLkZh IHJsZW4KK3BhcmFtZXRlcnMgc3BlY2lmeSBidWZmZXIgYW5kIGJ1ZmZlciBzaXplIHJlc3BlY3Rp dmVseSB3aGVyZSByZXR1cm4KK3BhcmFtZXRlcnMgc2hvdWxkIGJlIHBsYWNlZC4KK1RoZQorLkZu IGJ0X2RldnJlcQorZnVuY3Rpb24gdGVtcG9yYXJpbHkgbW9kaWZpZXMgZmlsdGVyIG9uIHRoZSBw cm92aWRlZAorLkR2IEhDSQorc29ja2V0CisuRmEgcyAuCitUaGUgZnVuY3Rpb24gcmV0dXJucyAw IG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorLlBwCitUaGUKKy5GbiBi dF9kZXZmaWx0ZXIKK2NvbnRyb2xzIHRoZSBsb2NhbAorLkR2IEhDSQorZmlsdGVyIGFzc29jaWF0 ZWQgd2l0aCB0aGUgc29ja2V0CisuRmEgcyAsCitwcmV2aW91c2x5IG9idGFpbmVkIHdpdGgKKy5Y ciBidF9kZXZvcGVuIDMgLgorRmlsdGVyaW5nIGNhbiBiZSBkb25lIG9uIHBhY2tldCB0eXBlcywg aS5lLgorLkR2IEFDTCAsCisuRHYgU0NPIG9yCisuRHYgSENJCitldmVudCBwYWNrZXRzLCBhbmQs IGluIGFkZGl0aW9uLCBvbgorLkR2IEhDSQorZXZlbnQgSURzLgorQmVmb3JlIGFwcGx5aW5nCisu RmEgbmV3CitmaWx0ZXIgKGlmIHByb3ZpZGVkKSB0aGUgZnVuY3Rpb24gd2lsbCB0cnkgdG8gb2J0 YWluIGN1cnJlbnQgZmlsdGVyCitmcm9tIHRoZSBzb2NrZXQKKy5GYSBzCithbmQgcGxhY2UgaXQg aW50byB0aGUKKy5GYSBvbGQKK3BhcmFtZXRlciAoaWYgcHJvdmlkZWQpLgorVGhlIGZ1bmN0aW9u IHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKy5QcAor VGhlCisuRm4gYnRfZGV2ZmlsdGVyX3BrdF9zZXQgLAorLkZuIGJ0X2RldmZpbHRlcl9wa3RfY2xy IAorYW5kCisuRm4gYnRfZGV2ZmlsdGVyX3BrdF90c3QKK2Z1bmN0aW9ucyBjYW4gYmUgdXNlZCB0 byBtb2RpZnkgYW5kIHRlc3QKKy5EdiBIQ0kKK2ZpbHRlcgorLkZhIGZpbHRlciAuCitUaGUKKy5G YSB0eXBlCitwYXJhbWV0ZXIgc3BlY2lmaWVzCisuRHYgSENJCitwYWNrZXQgdHlwZS4KKy5QcAor VGhlCisuRm4gYnRfZGV2ZmlsdGVyX2V2dF9zZXQgLAorLkZuIGJ0X2RldmZpbHRlcl9ldnRfY2xy IAorYW5kCisuRm4gYnRfZGV2ZmlsdGVyX2V2dF90c3QKK2Z1bmN0aW9ucyBjYW4gYmUgdXNlZCB0 byBtb2RpZnkgYW5kIHRlc3QKKy5EdiBIQ0kKK2V2ZW50IGZpbHRlcgorLkZhIGZpbHRlciAuCitU aGUKKy5GYSBldmVudAorcGFyYW1ldGVyIHNwZWNpZmllcworLkR2IEhDSQorZXZlbnQgSUQuCisu UHAKK1RoZQorLkZuIGJ0X2RldmlucXVpcnkKK2Z1bmN0aW9uIHBlcmZvcm1zIEJsdWV0b290aCBp bnF1aXJ5LgorVGhlCisuRmEgZGV2bmFtZQorcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBsb2Nh bCBCbHVldG9vdGggZGV2aWNlIHNob3VsZCBwZXJmb3JtIGFuIGlucXVpcnkuCitJZiBub3Qgc2Vj aWZpZWQsIGkuZS4KKy5EdiBOVUxMICwKK3RoZW4gZmlyc3QgYXZhaWxhYmxlIGRldmljZSB3aWxs IGJlIHVzZWQuCitUaGUKKy5GYSBsZW5ndGgKK3BhcmFtZXRlcnMgc3BlY2lmaWVzIHRoZSB0b3Rh bCBsZW5ndGggb2YgYW4gaW5xdWlyeSBpbiBzZWNvbmRzLgorSWYgbm90IHNwZWNpZmllZCwgaS5l LiAwLCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC4KK1RoZQorLkZhIG51bV9yc3AKK3BhcmFt ZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByZXNwb25zZXMgdGhhdCBjYW4gYmUgcmVjZWl2 ZWQgYmVmb3JlCit0aGUgaW5xdWlyeSBpcyBoYWx0ZWQuCitJZiBub3Qgc3BlY2lmaWVkLCBpLmUu IDAsIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLgorVGhlCisuRmEgaWkKK3BhcmFtZXRlciBz cGVjaWZpZXMgd2hlcmUgdG8gcGxhY2UgaW5xdWlyeSByZXN1bHRzLgorT24gc3VjY2VzcywgdGhl IGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRvdGFsIG51bWJlciBvZiBpbnF1aXJ5IHJlc3VsdHMsCit3 aWxsIGFsbG9jYXRlLAordXNpbmcKKy5YciBjYWxsb2MgMyAsCitidWZmZXIgdG8gc3RvcmUgYWxs IHRoZSBpbnF1aXJ5IHJlc3VsdHMgYW5kCit3aWxsIHJldHVybiBwb2ludGVyIHRvIHRoZSBhbGxv Y2F0ZWQgYnVmZmVyIGluIHRoZQorLkZhIGlpCitwYXJhbWV0ZXIuCitJdCBpcyB1cCB0byB0aGUg Y2FsbGVyIG9mIHRoZSBmdW5jdGlvbiB0byBkaXNwb3NlIG9mIHRoZSBidWZmZXIgdXNpbmcKKy5Y ciBmcmVlIDMKK2NhbGwuCitUaGUgZnVuY3Rpb24gcmV0dXJucyAtMSBpZiBhbiBlcnJvciBoYXMg b2NjdXJyZWQuCitUaGUKKy5WdCBidF9kZXZpbnF1aXJ5CitzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBh cyBmb2xsb3dzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK3N0cnVjdCBidF9kZXZpbnF1 aXJ5IHsKKyAgICAgICAgYmRhZGRyX3QgICAgICAgIGJkYWRkcjsKKyAgICAgICAgdWludDhfdCAg ICAgICAgIHBzY2FuX3JlcF9tb2RlOworICAgICAgICB1aW50OF90ICAgICAgICAgcHNjYW5fcGVy aW9kX21vZGU7CisgICAgICAgIHVpbnQ4X3QgICAgICAgICBkZXZfY2xhc3NbM107CisgICAgICAg IHVpbnQxNl90ICAgICAgICBjbG9ja19vZmZzZXQ7CisgICAgICAgIGludDhfdCAgICAgICAgICBy c3NpOworICAgICAgICB1aW50OF90ICAgICAgICAgZGF0YVsyNDBdOworfTsKKy5FZAorLlBwCitU aGUKIC5GbiBiZGFkZHJfc2FtZSAsCiAuRm4gYmRhZGRyX2FueQogYW5kCkBAIC00NDQsNiArNzE4 LDYgQEAKIC5TaCBBVVRIT1JTCiAuQW4gTWFrc2ltIFlldm1lbmtpbiBBcSBtX2V2bWVua2luQHlh aG9vLmNvbQogLlNoIEJVR1MKLVRoZXNlIGZ1bmN0aW9ucyB1c2Ugc3RhdGljIGRhdGEgc3RvcmFn ZTsKK1NvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIHVzZSBzdGF0aWMgZGF0YSBzdG9yYWdlOwogaWYg dGhlIGRhdGEgaXMgbmVlZGVkIGZvciBmdXR1cmUgdXNlLCBpdCBzaG91bGQgYmUKIGNvcGllZCBi ZWZvcmUgYW55IHN1YnNlcXVlbnQgY2FsbHMgb3ZlcndyaXRlIGl0LgpJbmRleDogYmx1ZXRvb3Ro LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gYmx1ZXRvb3RoLmgJKHJldmlzaW9uIDE5MTMyOSkKKysrIGJsdWV0 b290aC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8c3lzL2Vu ZGlhbi5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4K KyNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8c3lzL3VuLmg+CiAjaW5jbHVkZSA8ZXJy bm8uaD4KICNpbmNsdWRlIDxuZXRkYi5oPgpAQCAtNDYsNiArNDcsNyBAQAogI2luY2x1ZGUgPG5l dGdyYXBoL2JsdWV0b290aC9pbmNsdWRlL25nX2hjaS5oPgogI2luY2x1ZGUgPG5ldGdyYXBoL2Js dWV0b290aC9pbmNsdWRlL25nX2wyY2FwLmg+CiAjaW5jbHVkZSA8bmV0Z3JhcGgvYmx1ZXRvb3Ro L2luY2x1ZGUvbmdfYnRzb2NrZXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKIF9fQkVHSU5fREVD TFMKIApAQCAtMTI5LDggKzEzMSw0OCBAQAogCXVpbnQ4X3QJCV9wYWRkaW5nWzIwXTsJLyogbGVh dmUgc3BhY2UgZm9yIGZ1dHVyZSBhZGRpdGlvbnMgKi8KIH07CiAKK3N0cnVjdCBidF9kZXZyZXEK K3sKKwl1aW50MTZfdAlvcGNvZGU7CisJdWludDhfdAkJZXZlbnQ7CisJdm9pZAkJKmNwYXJhbTsK KwlzaXplX3QJCWNsZW47CisJdm9pZAkJKnJwYXJhbTsKKwlzaXplX3QJCXJsZW47Cit9OworCitz dHJ1Y3QgYnRfZGV2ZmlsdGVyIHsKKwliaXRzdHJfdAliaXRfZGVjbChwYWNrZXRfbWFzaywgOCk7 CisJYml0c3RyX3QJYml0X2RlY2woZXZlbnRfbWFzaywgMjU2KTsKK307CisKK3N0cnVjdCBidF9k ZXZpbnF1aXJ5IHsKKwliZGFkZHJfdCAgICAgICAgYmRhZGRyOworCXVpbnQ4X3QgICAgICAgICBw c2Nhbl9yZXBfbW9kZTsKKwl1aW50OF90ICAgICAgICAgcHNjYW5fcGVyaW9kX21vZGU7CisJdWlu dDhfdCAgICAgICAgIGRldl9jbGFzc1szXTsKKwl1aW50MTZfdCAgICAgICAgY2xvY2tfb2Zmc2V0 OworCWludDhfdCAgICAgICAgICByc3NpOworCXVpbnQ4X3QgICAgICAgICBkYXRhWzI0MF07Cit9 OworCiB0eXBlZGVmIGludAkoYnRfZGV2ZW51bV9jYl90KShpbnQsIHN0cnVjdCBidF9kZXZpbmZv IGNvbnN0ICosIHZvaWQgKik7CiAKK2ludAkJYnRfZGV2b3BlbiAoY2hhciBjb25zdCAqZGV2bmFt ZSk7CitpbnQJCWJ0X2RldmNsb3NlKGludCBzKTsKK2ludAkJYnRfZGV2c2VuZCAoaW50IHMsIHVp bnQxNl90IG9wY29kZSwgdm9pZCAqcGFyYW0sIHNpemVfdCBwbGVuKTsKK3NzaXplX3QJCWJ0X2Rl dnJlY3YgKGludCBzLCB2b2lkICpidWYsIHNpemVfdCBzaXplLCB0aW1lX3QgdG8pOworaW50CQli dF9kZXZyZXEgIChpbnQgcywgc3RydWN0IGJ0X2RldnJlcSAqciwgdGltZV90IHRvKTsKK2ludAkJ YnRfZGV2ZmlsdGVyKGludCBzLCBzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpuZXcsCisJCQkg ICAgIHN0cnVjdCBidF9kZXZmaWx0ZXIgKm9sZCk7Cit2b2lkCQlidF9kZXZmaWx0ZXJfcGt0X3Nl dChzdHJ1Y3QgYnRfZGV2ZmlsdGVyICpmaWx0ZXIsIHVpbnQ4X3QgdHlwZSk7Cit2b2lkCQlidF9k ZXZmaWx0ZXJfcGt0X2NscihzdHJ1Y3QgYnRfZGV2ZmlsdGVyICpmaWx0ZXIsIHVpbnQ4X3QgdHlw ZSk7CitpbnQJCWJ0X2RldmZpbHRlcl9wa3RfdHN0KHN0cnVjdCBidF9kZXZmaWx0ZXIgY29uc3Qg KmZpbHRlciwgdWludDhfdCB0eXBlKTsKK3ZvaWQJCWJ0X2RldmZpbHRlcl9ldnRfc2V0KHN0cnVj dCBidF9kZXZmaWx0ZXIgKmZpbHRlciwgdWludDhfdCBldmVudCk7Cit2b2lkCQlidF9kZXZmaWx0 ZXJfZXZ0X2NscihzdHJ1Y3QgYnRfZGV2ZmlsdGVyICpmaWx0ZXIsIHVpbnQ4X3QgZXZlbnQpOwor aW50CQlidF9kZXZmaWx0ZXJfZXZ0X3RzdChzdHJ1Y3QgYnRfZGV2ZmlsdGVyIGNvbnN0ICpmaWx0 ZXIsIHVpbnQ4X3QgZXZlbnQpOworaW50CQlidF9kZXZpbnF1aXJ5KGNoYXIgY29uc3QgKmRldm5h bWUsIHRpbWVfdCBsZW5ndGgsIGludCBudW1fcnNwLAorCQkJICAgICAgc3RydWN0IGJ0X2Rldmlu cXVpcnkgKippaSk7CiBpbnQJCWJ0X2RldmluZm8gKHN0cnVjdCBidF9kZXZpbmZvICpkaSk7CiBp bnQJCWJ0X2RldmVudW0gKGJ0X2RldmVudW1fY2JfdCAqY2IsIHZvaWQgKmFyZyk7CiAKSW5kZXg6 IE1ha2VmaWxlCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIE1ha2VmaWxlCShyZXZpc2lvbiAxOTEzMjkpCisrKyBN YWtlZmlsZQkod29ya2luZyBjb3B5KQpAQCAtMzMsNiArMzMsMTkgQEAKIE1MSU5LUys9CWJsdWV0 b290aC4zIGJ0X2RldmluZm8uMwogTUxJTktTKz0JYmx1ZXRvb3RoLjMgYnRfZGV2ZW51bS4zCiAK K01MSU5LUys9CWJsdWV0b290aC4zIGJ0X2Rldm9wZW4uMworTUxJTktTKz0JYmx1ZXRvb3RoLjMg YnRfZGV2Y2xvc2UuMworTUxJTktTKz0JYmx1ZXRvb3RoLjMgYnRfZGV2c2VuZC4zCitNTElOS1Mr PQlibHVldG9vdGguMyBidF9kZXZyZXEuMworTUxJTktTKz0JYmx1ZXRvb3RoLjMgYnRfZGV2Zmls dGVyLjMKK01MSU5LUys9CWJsdWV0b290aC4zIGJ0X2RldmZpbHRlcl9wa3Rfc2V0LjMKK01MSU5L Uys9CWJsdWV0b290aC4zIGJ0X2RldmZpbHRlcl9wa3RfY2xyLjMKK01MSU5LUys9CWJsdWV0b290 aC4zIGJ0X2RldmZpbHRlcl9wa3RfdHN0LjMKK01MSU5LUys9CWJsdWV0b290aC4zIGJ0X2RldmZp bHRlcl9ldnRfc2V0LjMKK01MSU5LUys9CWJsdWV0b290aC4zIGJ0X2RldmZpbHRlcl9ldnRfY2xy LjMKK01MSU5LUys9CWJsdWV0b290aC4zIGJ0X2RldmZpbHRlcl9ldnRfdHN0LjMKK01MSU5LUys9 CWJsdWV0b290aC4zIGJ0X2RldmlucXVpcnkuMworCiBNTElOS1MrPQlibHVldG9vdGguMyBiZGFk ZHJfc2FtZS4zCiBNTElOS1MrPQlibHVldG9vdGguMyBiZGFkZHJfYW55LjMKIE1MSU5LUys9CWJs dWV0b290aC4zIGJkYWRkcl9jb3B5LjMK --0016364ed650356495046813930a--