From owner-freebsd-bluetooth@FreeBSD.ORG Thu Jan 15 01:05:53 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 9D4A11065670; Thu, 15 Jan 2009 01:05:53 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: from rv-out-0506.google.com (rv-out-0506.google.com [209.85.198.225]) by mx1.freebsd.org (Postfix) with ESMTP id 4B6F58FC13; Thu, 15 Jan 2009 01:05:53 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: by rv-out-0506.google.com with SMTP id b25so838955rvf.43 for ; Wed, 14 Jan 2009 17:05:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:cc:mime-version:content-type; bh=yvsEvnIytEyq4I3Y44ncN/7B93LNJ5S6tPQvhl+l7YM=; b=lO6xcOUnItwQMcaLwAa6CxhmfN2DZBqGdWAa/Bnr8fM3Dzxv1PsgsmLBGanHQBqj55 6ocDYUf+PSa996x7NRI7SEP651MFffracrXnW+ke20ahAK0w3/DkjDNN9vqNs+isU8mz Zt2CzmxkOWT2AfRcsLVnI7nQQ2FZYKLg2KrD4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:mime-version:content-type; b=A+qrWVY3EGMv2EPbEyqqRCWTAXRuP6sTuas/E+EvTVsclDiJCq3SBDGJm05BL0ER2m uh/HFwDDlVmEYSmCUsscOzmah/daszCrskGlkV/xeL1RY86JIZWDSMmMiq1h/tdOtLCF z/eXcSkNANdRGfxuVPxydq0KA2oI8fBcr6UEY= Received: by 10.141.98.13 with SMTP id a13mr296643rvm.85.1231981552996; Wed, 14 Jan 2009 17:05:52 -0800 (PST) Received: by 10.141.210.11 with HTTP; Wed, 14 Jan 2009 17:05:52 -0800 (PST) Message-ID: Date: Wed, 14 Jan 2009 17:05:52 -0800 From: "Maksim Yevmenkin" To: "freebsd-bluetooth@freebsd.org" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_379362_12485152.1231981552982" Cc: Alfred Perlstein , hselasky@c2i.net Subject: USB2: ng_ubt2 patch 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: Thu, 15 Jan 2009 01:05:54 -0000 ------=_Part_379362_12485152.1231981552982 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline dear bluetooth users, please find attached patch for ng_ubt2 (well it is almost a complete rewrite). this is an early preview and likely to have bugs. i briefly kicked the tires to make sure it compiles and did some very quick testing, i.e. run few hci commands, sdp transfers etc. this is my first attempt to write something under usb2, so any review/comments/suggestions/etc. are greatly appreciated. thanks, max ------=_Part_379362_12485152.1231981552982 Content-Type: text/plain; name=ng_ubt2.diff.txt Content-Transfer-Encoding: base64 X-Attachment-Id: f_fpypub6h0 Content-Disposition: attachment; filename=ng_ubt2.diff.txt SW5kZXg6IG5nX3VidDIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZ191YnQyLmMJKHJldmlzaW9uIDE4Njgw MCkKKysrIG5nX3VidDIuYwkod29ya2luZyBjb3B5KQpAQCAtMyw3ICszLDcgQEAKICAqLwogCiAv Ki0KLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIE1ha3NpbSBZZXZtZW5raW4gPG1fZXZtZW5r aW5AeWFob28uY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDkgTWFrc2ltIFlldm1lbmtp biA8bV9ldm1lbmtpbkB5YWhvby5jb20+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg b3Igd2l0aG91dApAQCAtMzEsNiArMzEsNjkgQEAKICAqICRGcmVlQlNEJAogICovCiAKKy8qCisg KiBOT1RFOiBuZ191YnQyIGRyaXZlciBoYXMgYSBzcGxpdCBwZXJzb25hbGl0eS4gT24gb25lIHNp ZGUgaXQgaXMKKyAqIGEgVVNCMiBkZXZpY2UgZHJpdmVyIGFuZCBvbiB0aGUgb3RoZXIgaXQgaXMg YSBOZXRncmFwaCBub2RlLiBUaGlzCisgKiBkcml2ZXIgd2lsbCAqTk9UKiBjcmVhdGUgdHJhZGl0 aW9uYWwgL2Rldi8gZW50aWVzLCBvbmx5IE5ldGdyYXBoIAorICogbm9kZS4KKyAqCisgKiBOT1RF IE9OIExPQ0tTIFVTRUQ6IG5nX3VidDIgZHJpdmVzIHVzZXMgMyBsb2NrcyAobXV0ZXhlcykKKyAq CisgKiAxKSBzY19pZl8wX210eCAtIGxvY2sgZm9yIGRldmljZSdzIGludGVyZmFjZSAjMC4gVGhp cyBsb2NrIGlzIHVzZWQKKyAqICAgIGJ5IFVTQjIgZm9yIGFueSBVU0IgcmVxdWVzdCBnb2luZyBv dmVyIGRldmljZSdzIGludGVyZmFjZSAjMCwgaS5lLgorICogICAgaW50ZXJydXB0LCBjb250cm9s IGFuZCBidWxrIHRyYW5zZmVycy4KKyAqIAorICogMikgc2NfaWZfMV9tdHggLSBsb2NrIGZvciBk ZXZpY2UncyBpbnRlcmZhY2UgIzEuIFRoaXMgbG9jayBpcyB1c2VkCisgKiAgICBieSBVU0IyIGZv ciBhbnkgVVNCIHJlcXVlc3QgZ29pbmcgb3ZlciBkZXZpY2UncyBpbnRlcmZhY2UgIzEsIGkuZQor ICogICAgaXNvYy4gdHJhbnNmZXJzLgorICogCisgKiAzKSBzY19tYnVmcV9tdHggLSBsb2NrIGZv ciBtYnVmcSBhbmQgdGFzayBmbGFncy4gVGhpcyBsb2NrIGlzIHVzZWQKKyAqICAgIHRvIHByb3Rl Y3QgZGV2aWNlJ3Mgb3V0Z29pbmcgbWJ1ZiBxdWV1ZXMgYW5kIHRhc2sgZmxhZ3MuIFRoaXMgbG9j aworICogICAgKlNIT1VMRCBOT1QqIGJlIGdyYWJiZWQgZm9yIGxvbmcgdGltZS4gSW4gZmFjdCwg dGhpbmsgb2YgaXQgYXMgYSAKKyAqICAgIHNwaW4gbG9jay4KKyAqCisgKiBOT1RFIE9OIExPQ0tJ TkcgU1RSQVRFR1k6IG5nX3VidDIgZHJpdmVyIG9wZXJhdGVzIGluIDMgZGlmZmVyZW50IGNvbnRl eHRzLgorICoKKyAqIDEpIFVTQiBjb250ZXh0LiBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgVVNCIHJl bGF0ZWQgc3R1ZmYgaGFwcGVucy4gQWxsCisgKiAgICBjYWxsYmFja3MgcnVuIGluIHRoaXMgY29u dGV4dC4gQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIChieSBVU0IyKSB3aXRoCisgKiAgICBhcHBy b3ByaWF0ZSBpbnRlcmZhY2UgbG9jayBoZWxkLiBJdCBpcyAoZ2VuZXJhbGx5KSBhbGxvd2VkIHRv IGdyYWIKKyAqICAgIGFueSBhZGRpdGlvbmFsIGxvY2tzLgorICoKKyAqIDIpIE5ldGdyYXBoIGNv bnRleHQuIFRoaXMgaXMgd2hlcmUgYWxsIHRoZSBOZXRncmFwaCByZWxhdGVkIGhhcHBlbnMuIFNp bmNlCisgKiAgICB3ZSBtYXJrIG5vZGUgYXMgV1JJVEVSLCB0aGUgTmV0Z3JhcGggbm9kZSB3aWxs IGJlICJsb2NrZWQiIChmcm9tIE5ldGdyYXBoCisgKiAgICBwb2ludCBvZiB2aWV3KS4gQW55IHZh cmlhYmxlIHRoYXQgaXMgb25seSBtb2RpZmllZCBmcm9tIHRoZSBOZXRncmFwaAorICogICAgY29u dGV4dCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdG9uYWwgbG9ja2luZy4gSXQgaXMgZ2VuZXJh bGx5ICpOT1QqCisgKiAgICBhbGxvd2VkIHRvIGdyYWIgKkFOWSogYWRkaXRpb25hbCBsb2NrLiBX aGF0ZXZlciB5b3UgZG8sICpETyBOT1QqIG5vdAorICogICAgZ3JhYiBhbnkgbG9uZy1zbGVlcCBs b2NrIGluIHRoZSBOZXRncmFwaCBjb250ZXh0LiBJbiBmYWN0LCB0aGUgb25seQorICogICAgbG9j ayB0aGF0IGlzIGFsbG93ZWQgaW4gTmV0Z3JhcGggY29udGV4dCBpcyB0aGUgc2NfbWJ1ZnFfbXR4 IGxvY2suCisgKgorICogMykgVGFza3F1ZXVlIGNvbnRleHQuIFRoaXMgaXMgd2hlcmUgdWJ0X3Rh c2sgcnVucy4gU2luY2Ugd2UgYXJlIE5PVCBhbGxvd2VkCisgKiAgICB0byBncmFiIGFueSBsb2Nr cyBpbiB0aGUgTmV0Z3JhcGggY29udGV4dCwgYW5kLCBVU0IyIHJlcXVpcmVzIHVzIHRvCisgKiAg ICBncmFiIGludGVyZmFjZSBsb2NrIGJlZm9yZSBkb2luZyB0aGluZ3Mgd2l0aCB0cmFuc2ZlcnMs IHdlIG5lZWQgdG8KKyAqICAgIHRyYW5zaXRpb24gZnJvbSB0aGUgTmV0Z3JhcGggY29udGV4dCB0 byB0aGUgVGFza3F1ZXVlIGNvbnRleHQgYmVmb3JlCisgKiAgICB3ZSBjYW4gY2FsbCBpbnRvIFVT QjIgc3Vic3lzdGVtLgorICoKKyAqIFNvLCB0byBwdXQgZXZlcnl0aGluZyB0b2dldGhlciwgdGhl IHJ1bGVzIGFyZSBhcyBmb2xsb3dzLgorICoJSXQgaXMgT0sgdG8gY2FsbCBmcm9tIHRoZSBVU0Ig Y29udGV4dCBvciB0aGUgVGFza3F1ZXVlIGNvbnRleHQgaW50bworICogdGhlIE5ldGdyYXBoIGNv bnRleHQgKGkuZS4gY2FsbCBOR19TRU5EX3h4eCBmdW5jdGlvbnMpLiBJbiBvdGhlciB3b3Jkcwor ICogaXQgaXMgYWxsb3dlZCB0byBjYWxsIGludG8gdGhlIE5ldGdyYXBoIGNvbnRleHQgd2l0aCBs b2NrcyBoZWxkLgorICoJSXMgaXQgKk5PVCogT0sgdG8gY2FsbCBmcm9tIHRoZSBOZXRncmFwaCBj b250ZXh0IGludG8gdGhlIFVTQiBjb250ZXh0LAorICogYmVjYXVzZSBVU0IyIHJlcXVpcmVzIHVz IHRvIGdyYWIgaW50ZXJmYWNlIGxvY2tzIGFuZCB3ZSBjYW4gbm90IGRvIHRoYXQuCisgKiBUbyBh dm9pZCB0aGlzLCB3ZSBzZXQgdGFzayBmbGFncyB0byBpbmRpY2F0ZSB3aGljaCBhY3Rpb25zIHdl IHdhbnQgdG8KKyAqIHBlcmZvcm0gYW5kIHNjaGVkdWxlIHVidF90YXNrIHdoaWNoIHdvdWxkIHJ1 biBpbiBUYXNrcXVldWUgY29udGV4dC4KKyAqCUlzIGlzIE9LIHRvIGNhbGwgZnJvbSB0aGUgVGFz a3F1ZXVlIGNvbnRleHQgaW50byB0aGUgVVNCIGNvbnRleHQsCisgKiBhbmQsIHVidF90YXNrIGRv ZXMganVzdCB0aGF0IChpLmUuIGdyYWJzIGFwcHJvcHJpYXRlIGludGVyZmFjZSBsb2NrcworICog YmVmb3JlIGNhbGxpbmcgaW50byBVU0IyKS4KKyAqCUFjY2VzcyB0byBvdXRnb2luZyBxdWV1ZXMg YW5kIHRhc2sgZmxhZ3MgaXMgY29udHJvbGxlZCBieSBzY19tYnVmcV9tdHgKKyAqIGxvY2suIEl0 IGlzIHVuYXZvaWRhYmxlIGV2aWwuIEFnYWluLCBzY19tYnVmcV9tdHggc2hvdWxkIHJlYWxseSBi ZSBhIHNwaW4KKyAqIGxvY2suCisgKglBbGwgVVNCIGNhbGxiYWNrcyBhY2NlcHQgTmV0Z3JhcGgg bm9kZSBwb2ludGVyIGFzIHByaXZhdGUgZGF0YS4gVG8KKyAqIGVuc3VyZSB0aGF0IE5ldGdyYXBo IG5vZGUgcG9pbnQgcmVtYWlucyB2YWxpZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZQorICogdHJh bnNmZXIsIHdlIGdyYWIgYSByZWZlcnJlbmNlIHRvIHRoZSBub2RlLiBJbiBvdGhlciB3b3Jkcywg aWYgdHJhbnNmZXIgaXMKKyAqIHBlbmRpbmcsIHRoZW4gd2Ugc2hvdWxkIGhhdmUgYSByZWZlcnJl bmNlIG9uIHRoZSBub2RlLiBOR19OT0RFX1tOT1RfXVZBTElECisgKiBtYWNybyBpcyB1c2VkIHRv IGNoZWNrIGlmIG5vZGUgaXMgc3RpbGwgcHJlc2VudC4KKyAqLworCiAjaW5jbHVkZSA8ZGV2L3Vz YjIvaW5jbHVkZS91c2IyX2RldmlkLmg+CiAjaW5jbHVkZSA8ZGV2L3VzYjIvaW5jbHVkZS91c2Iy X3N0YW5kYXJkLmg+CiAjaW5jbHVkZSA8ZGV2L3VzYjIvaW5jbHVkZS91c2IyX21mdW5jLmg+CkBA IC00Niw2ICsxMDksNyBAQAogI2luY2x1ZGUgPGRldi91c2IyL2NvcmUvdXNiMl9idXNkbWEuaD4K IAogI2luY2x1ZGUgPHN5cy9tYnVmLmg+CisjaW5jbHVkZSA8c3lzL3Rhc2txdWV1ZS5oPgogCiAj aW5jbHVkZSA8bmV0Z3JhcGgvbmdfbWVzc2FnZS5oPgogI2luY2x1ZGUgPG5ldGdyYXBoL25ldGdy YXBoLmg+CkBAIC01Nyw3MSArMTIxLDU2IEBACiAjaW5jbHVkZSA8ZGV2L3VzYjIvYmx1ZXRvb3Ro L3VzYjJfYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8ZGV2L3VzYjIvYmx1ZXRvb3RoL25nX3VidDJf dmFyLmg+CiAKLS8qCi0gKiBVU0IgbWV0aG9kcwotICovCitzdGF0aWMgaW50CQl1YnRfbW9kZXZl bnQobW9kdWxlX3QsIGludCwgdm9pZCAqKTsKK3N0YXRpYyBkZXZpY2VfcHJvYmVfdAl1YnRfcHJv YmU7CitzdGF0aWMgZGV2aWNlX2F0dGFjaF90CXVidF9hdHRhY2g7CitzdGF0aWMgZGV2aWNlX2Rl dGFjaF90CXVidF9kZXRhY2g7CiAKLXN0YXRpYyBkZXZpY2VfcHJvYmVfdCB1YnRfcHJvYmU7Ci1z dGF0aWMgZGV2aWNlX2F0dGFjaF90IHVidF9hdHRhY2g7Ci1zdGF0aWMgZGV2aWNlX2RldGFjaF90 IHVidF9kZXRhY2g7CitzdGF0aWMgaW50CQl1YnRfdGFza19zY2hlZHVsZSh1YnRfc29mdGNfcCwg dWludDMyX3QpOworc3RhdGljIHRhc2tfZm5fdAl1YnRfdGFzazsKIAotc3RhdGljIGRldmNsYXNz X3QgdWJ0X2RldmNsYXNzOworLyogTmV0Z3JhcGggbWV0aG9kcyAqLworc3RhdGljIG5nX2NvbnN0 cnVjdG9yX3QJbmdfdWJ0X2NvbnN0cnVjdG9yOworc3RhdGljIG5nX3NodXRkb3duX3QJbmdfdWJ0 X3NodXRkb3duOworc3RhdGljIG5nX25ld2hvb2tfdAluZ191YnRfbmV3aG9vazsKK3N0YXRpYyBu Z19jb25uZWN0X3QJbmdfdWJ0X2Nvbm5lY3Q7CitzdGF0aWMgbmdfZGlzY29ubmVjdF90CW5nX3Vi dF9kaXNjb25uZWN0Oworc3RhdGljIG5nX3Jjdm1zZ190CW5nX3VidF9yY3Ztc2c7CitzdGF0aWMg bmdfcmN2ZGF0YV90CW5nX3VidF9yY3ZkYXRhOwogCi1zdGF0aWMgZGV2aWNlX21ldGhvZF90IHVi dF9tZXRob2RzW10gPSB7Ci0JREVWTUVUSE9EKGRldmljZV9wcm9iZSwgdWJ0X3Byb2JlKSwKLQlE RVZNRVRIT0QoZGV2aWNlX2F0dGFjaCwgdWJ0X2F0dGFjaCksCi0JREVWTUVUSE9EKGRldmljZV9k ZXRhY2gsIHVidF9kZXRhY2gpLAotCXswLCAwfQotfTsKLQotc3RhdGljIGRyaXZlcl90IHVidF9k cml2ZXIgPSB7Ci0JLm5hbWUgPSAidWJ0IiwKLQkubWV0aG9kcyA9IHVidF9tZXRob2RzLAotCS5z aXplID0gc2l6ZW9mKHN0cnVjdCB1YnRfc29mdGMpLAotfTsKLQotLyoKLSAqIE5ldGdyYXBoIG1l dGhvZHMKLSAqLwotCi1zdGF0aWMgbmdfY29uc3RydWN0b3JfdCBuZ191YnRfY29uc3RydWN0b3I7 Ci1zdGF0aWMgbmdfc2h1dGRvd25fdCBuZ191YnRfc2h1dGRvd247Ci1zdGF0aWMgbmdfbmV3aG9v a190IG5nX3VidF9uZXdob29rOwotc3RhdGljIG5nX2Nvbm5lY3RfdCBuZ191YnRfY29ubmVjdDsK LXN0YXRpYyBuZ19kaXNjb25uZWN0X3QgbmdfdWJ0X2Rpc2Nvbm5lY3Q7Ci1zdGF0aWMgbmdfcmN2 bXNnX3QgbmdfdWJ0X3Jjdm1zZzsKLXN0YXRpYyBuZ19yY3ZkYXRhX3QgbmdfdWJ0X3JjdmRhdGE7 Ci0KIC8qIFF1ZXVlIGxlbmd0aCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZ19wYXJzZV9zdHJ1 Y3RfZmllbGQgbmdfdWJ0X25vZGVfcWxlbl90eXBlX2ZpZWxkc1tdID0KK3N0YXRpYyBjb25zdCBz dHJ1Y3QgbmdfcGFyc2Vfc3RydWN0X2ZpZWxkCW5nX3VidF9ub2RlX3FsZW5fdHlwZV9maWVsZHNb XSA9CiB7Ci0JeyJxdWV1ZSIsICZuZ19wYXJzZV9pbnQzMl90eXBlLH0sCi0JeyJxbGVuIiwgJm5n X3BhcnNlX2ludDMyX3R5cGUsfSwKLQl7TlVMTCx9CisJeyAicXVldWUiLCAmbmdfcGFyc2VfaW50 MzJfdHlwZSwgfSwKKwl7ICJxbGVuIiwgICZuZ19wYXJzZV9pbnQzMl90eXBlLCB9LAorCXsgTlVM TCwgfQogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmdfcGFyc2VfdHlwZSBuZ191YnRfbm9kZV9x bGVuX3R5cGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5nX3BhcnNlX3R5cGUJCW5nX3VidF9u b2RlX3FsZW5fdHlwZSA9Cit7CiAJJm5nX3BhcnNlX3N0cnVjdF90eXBlLAogCSZuZ191YnRfbm9k ZV9xbGVuX3R5cGVfZmllbGRzCiB9OwogCiAvKiBTdGF0IGluZm8gKi8KLXN0YXRpYyBjb25zdCBz dHJ1Y3QgbmdfcGFyc2Vfc3RydWN0X2ZpZWxkIG5nX3VidF9ub2RlX3N0YXRfdHlwZV9maWVsZHNb XSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IG5nX3BhcnNlX3N0cnVjdF9maWVsZAluZ191YnRfbm9k ZV9zdGF0X3R5cGVfZmllbGRzW10gPQogewotCXsicGNrdHNfcmVjdiIsICZuZ19wYXJzZV91aW50 MzJfdHlwZSx9LAotCXsiYnl0ZXNfcmVjdiIsICZuZ19wYXJzZV91aW50MzJfdHlwZSx9LAotCXsi cGNrdHNfc2VudCIsICZuZ19wYXJzZV91aW50MzJfdHlwZSx9LAotCXsiYnl0ZXNfc2VudCIsICZu Z19wYXJzZV91aW50MzJfdHlwZSx9LAotCXsib2Vycm9ycyIsICZuZ19wYXJzZV91aW50MzJfdHlw ZSx9LAotCXsiaWVycm9ycyIsICZuZ19wYXJzZV91aW50MzJfdHlwZSx9LAotCXtOVUxMLH0KKwl7 ICJwY2t0c19yZWN2IiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLCB9LAorCXsgImJ5dGVzX3JlY3Yi LCAmbmdfcGFyc2VfdWludDMyX3R5cGUsIH0sCisJeyAicGNrdHNfc2VudCIsICZuZ19wYXJzZV91 aW50MzJfdHlwZSwgfSwKKwl7ICJieXRlc19zZW50IiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLCB9 LAorCXsgIm9lcnJvcnMiLCAgICAmbmdfcGFyc2VfdWludDMyX3R5cGUsIH0sCisJeyAiaWVycm9y cyIsICAgICZuZ19wYXJzZV91aW50MzJfdHlwZSwgfSwKKwl7IE5VTEwsIH0KIH07Ci1zdGF0aWMg Y29uc3Qgc3RydWN0IG5nX3BhcnNlX3R5cGUgbmdfdWJ0X25vZGVfc3RhdF90eXBlID0geworc3Rh dGljIGNvbnN0IHN0cnVjdCBuZ19wYXJzZV90eXBlCQluZ191YnRfbm9kZV9zdGF0X3R5cGUgPQor ewogCSZuZ19wYXJzZV9zdHJ1Y3RfdHlwZSwKIAkmbmdfdWJ0X25vZGVfc3RhdF90eXBlX2ZpZWxk cwogfTsKIAogLyogTmV0Z3JhcGggbm9kZSBjb21tYW5kIGxpc3QgKi8KLXN0YXRpYyBjb25zdCBz dHJ1Y3QgbmdfY21kbGlzdCBuZ191YnRfY21kbGlzdFtdID0geworc3RhdGljIGNvbnN0IHN0cnVj dCBuZ19jbWRsaXN0CQkJbmdfdWJ0X2NtZGxpc3RbXSA9Cit7CiAJewogCQlOR01fVUJUX0NPT0tJ RSwKIAkJTkdNX1VCVF9OT0RFX1NFVF9ERUJVRywKQEAgLTE2NCwzMTYgKzIxMywyODAgQEAKIAkJ TlVMTCwKIAkJTlVMTAogCX0sCi0JezAsfQorCXsgMCwgfQogfTsKIAogLyogTmV0Z3JhcGggbm9k ZSB0eXBlICovCi1zdGF0aWMgc3RydWN0IG5nX3R5cGUgdHlwZXN0cnVjdCA9IHsKLQkudmVyc2lv biA9IE5HX0FCSV9WRVJTSU9OLAotCS5uYW1lID0gTkdfVUJUX05PREVfVFlQRSwKLQkuY29uc3Ry dWN0b3IgPSBuZ191YnRfY29uc3RydWN0b3IsCi0JLnJjdm1zZyA9IG5nX3VidF9yY3Ztc2csCi0J LnNodXRkb3duID0gbmdfdWJ0X3NodXRkb3duLAotCS5uZXdob29rID0gbmdfdWJ0X25ld2hvb2ss Ci0JLmNvbm5lY3QgPSBuZ191YnRfY29ubmVjdCwKLQkucmN2ZGF0YSA9IG5nX3VidF9yY3ZkYXRh LAotCS5kaXNjb25uZWN0ID0gbmdfdWJ0X2Rpc2Nvbm5lY3QsCi0JLmNtZGxpc3QgPSBuZ191YnRf Y21kbGlzdAorc3RhdGljIHN0cnVjdCBuZ190eXBlCXR5cGVzdHJ1Y3QgPQoreworCS52ZXJzaW9u ID0gCU5HX0FCSV9WRVJTSU9OLAorCS5uYW1lID0JCU5HX1VCVF9OT0RFX1RZUEUsCisJLmNvbnN0 cnVjdG9yID0JbmdfdWJ0X2NvbnN0cnVjdG9yLAorCS5yY3Ztc2cgPQluZ191YnRfcmN2bXNnLAor CS5zaHV0ZG93biA9CW5nX3VidF9zaHV0ZG93biwKKwkubmV3aG9vayA9CW5nX3VidF9uZXdob29r LAorCS5jb25uZWN0ID0JbmdfdWJ0X2Nvbm5lY3QsCisJLnJjdmRhdGEgPQluZ191YnRfcmN2ZGF0 YSwKKwkuZGlzY29ubmVjdCA9CW5nX3VidF9kaXNjb25uZWN0LAorCS5jbWRsaXN0ID0JbmdfdWJ0 X2NtZGxpc3QKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCIHNwZWNpZmljCisgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qIFVTQiBtZXRob2RzICov CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9jdHJsX3dyaXRlX2NhbGxiYWNrOworc3RhdGlj IHVzYjJfY2FsbGJhY2tfdAl1YnRfaW50cl9yZWFkX2NhbGxiYWNrOworc3RhdGljIHVzYjJfY2Fs bGJhY2tfdAl1YnRfaW50cl9yZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrOworc3RhdGljIHVzYjJf Y2FsbGJhY2tfdAl1YnRfYnVsa19yZWFkX2NhbGxiYWNrOworc3RhdGljIHVzYjJfY2FsbGJhY2tf dAl1YnRfYnVsa19yZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrOworc3RhdGljIHVzYjJfY2FsbGJh Y2tfdAl1YnRfYnVsa193cml0ZV9jYWxsYmFjazsKK3N0YXRpYyB1c2IyX2NhbGxiYWNrX3QJdWJ0 X2J1bGtfd3JpdGVfY2xlYXJfc3RhbGxfY2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190 CXVidF9pc29jX3JlYWRfY2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9pc29j X3dyaXRlX2NhbGxiYWNrOwogCi1zdGF0aWMgdXNiMl9jYWxsYmFja190IHVidF9jdHJsX3dyaXRl X2NhbGxiYWNrOwotc3RhdGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfaW50cl9yZWFkX2NhbGxiYWNr Owotc3RhdGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfaW50cl9yZWFkX2NsZWFyX3N0YWxsX2NhbGxi YWNrOwotc3RhdGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfYnVsa19yZWFkX2NhbGxiYWNrOwotc3Rh dGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfYnVsa19yZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrOwot c3RhdGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfYnVsa193cml0ZV9jYWxsYmFjazsKLXN0YXRpYyB1 c2IyX2NhbGxiYWNrX3QgdWJ0X2J1bGtfd3JpdGVfY2xlYXJfc3RhbGxfY2FsbGJhY2s7Ci1zdGF0 aWMgdXNiMl9jYWxsYmFja190IHVidF9pc29jX3JlYWRfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9j YWxsYmFja190IHVidF9pc29jX3dyaXRlX2NhbGxiYWNrOworc3RhdGljIGludAl1YnRfaXNvY19y ZWFkX29uZV9mcmFtZShzdHJ1Y3QgdXNiMl94ZmVyICosIHVpbnQzMl90KTsKIAotc3RhdGljIGlu dAl1YnRfbW9kZXZlbnQobW9kdWxlX3QsIGludCwgdm9pZCAqKTsKLXN0YXRpYyB2b2lkCXVidF9p bnRyX3JlYWRfY29tcGxldGUobm9kZV9wLCBob29rX3AsIHZvaWQgKiwgaW50KTsKLXN0YXRpYyB2 b2lkCXVidF9idWxrX3JlYWRfY29tcGxldGUobm9kZV9wLCBob29rX3AsIHZvaWQgKiwgaW50KTsK LXN0YXRpYyB2b2lkCXVidF9pc29jX3JlYWRfY29tcGxldGUobm9kZV9wLCBob29rX3AsIHZvaWQg KiwgaW50KTsKKy8qCisgKiBVU0IgY29uZmlnCisgKiAKKyAqIFRoZSBmb2xsb3dpbmcgZGVzcmli ZXMgdXNiIHRyYW5zZmVycyB0aGF0IGNvdWxkIGJlIHN1Ym1pdHRlZAorICogb24gVVNCIGRldmlj ZSdzIGludGVyZmFjZSAwCisgKgorICogSW50ZXJmYWNlIDAgb24gdGhlIFVTQiBkZXZpY2UgbXVz dCBwcmVzZW50IHRoZSBmb2xsb3dpbmcgZW5kcG9pbnRzCisgKgkxKSBJbnRlcnJ1cHQgZW5kcG9p bnQgdG8gcmVjZWl2ZSBIQ0kgZXZlbnRzCisgKgkyKSBCdWxrIElOIGVuZHBvaW50IHRvIHJlY2Vp dmUgQUNMIGRhdGEKKyAqCTMpIEJ1bGsgT1VUIGVuZHBvaW50IHRvIHNlbmQgQUNMIGRhdGEKKyAq LwogCi0vKiBVU0IgY29uZmlnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYjJfY29uZmlnIHVi dF9jb25maWdfaWZfMFtVQlRfSUZfMF9OX1RSQU5TRkVSXSA9IHsKLQorc3RhdGljIGNvbnN0IHN0 cnVjdCB1c2IyX2NvbmZpZwkJdWJ0X2NvbmZpZ19pZl8wW1VCVF9JRl8wX05fVFJBTlNGRVJdID0K K3sKKwkvKiBPdXRnb2luZyBidWxrIHRyYW5zZmVyIC0gQUNMIHBhY2tldHMgKi8KIAlbMF0gPSB7 Ci0JCS50eXBlID0gVUVfQlVMSywKLQkJLmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJl Y3Rpb24gPSBVRV9ESVJfT1VULAotCQkubWguYnVmc2l6ZSA9IFVCVF9CVUxLX1dSSVRFX0JVRkZF Ul9TSVpFLAotCQkubWguZmxhZ3MgPSB7LnBpcGVfYm9mID0gMSx9LAotCQkubWguY2FsbGJhY2sg PSAmdWJ0X2J1bGtfd3JpdGVfY2FsbGJhY2ssCisJCS50eXBlID0JCVVFX0JVTEssCisJCS5lbmRw b2ludCA9CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0JVUVfRElSX09VVCwKKwkJLm1oLmJ1 ZnNpemUgPQlVQlRfQlVMS19XUklURV9CVUZGRVJfU0laRSwKKwkJLm1oLmZsYWdzID0JeyAucGlw ZV9ib2YgPSAxLCB9LAorCQkubWguY2FsbGJhY2sgPQkmdWJ0X2J1bGtfd3JpdGVfY2FsbGJhY2ss CiAJfSwKLQorCS8qIEluY29taW5nIGJ1bGsgdHJhbnNmZXIgLSBBQ0wgcGFja2V0cyAqLwogCVsx XSA9IHsKLQkJLnR5cGUgPSBVRV9CVUxLLAotCQkuZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJ LmRpcmVjdGlvbiA9IFVFX0RJUl9JTiwKLQkJLm1oLmJ1ZnNpemUgPSBVQlRfQlVMS19SRUFEX0JV RkZFUl9TSVpFLAotCQkubWguZmxhZ3MgPSB7LnBpcGVfYm9mID0gMSwuc2hvcnRfeGZlcl9vayA9 IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9idWxrX3JlYWRfY2FsbGJhY2ssCisJCS50eXBl ID0JCVVFX0JVTEssCisJCS5lbmRwb2ludCA9CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0J VUVfRElSX0lOLAorCQkubWguYnVmc2l6ZSA9CVVCVF9CVUxLX1JFQURfQlVGRkVSX1NJWkUsCisJ CS5taC5mbGFncyA9CXsgLnBpcGVfYm9mID0gMSwgLnNob3J0X3hmZXJfb2sgPSAxLCB9LAorCQku bWguY2FsbGJhY2sgPQkmdWJ0X2J1bGtfcmVhZF9jYWxsYmFjaywKIAl9LAotCisJLyogSW5jb21p bmcgaW50ZXJydXB0IHRyYW5zZmVyIC0gSENJIGV2ZW50cyAqLwogCVsyXSA9IHsKLQkJLnR5cGUg PSBVRV9JTlRFUlJVUFQsCi0JCS5lbmRwb2ludCA9IFVFX0FERFJfQU5ZLAotCQkuZGlyZWN0aW9u ID0gVUVfRElSX0lOLAotCQkubWguZmxhZ3MgPSB7LnBpcGVfYm9mID0gMSwuc2hvcnRfeGZlcl9v ayA9IDEsfSwKLQkJLm1oLmJ1ZnNpemUgPSAweDExMCwJLyogYnl0ZXMgKi8KLQkJLm1oLmNhbGxi YWNrID0gJnVidF9pbnRyX3JlYWRfY2FsbGJhY2ssCisJCS50eXBlID0JCVVFX0lOVEVSUlVQVCwK KwkJLmVuZHBvaW50ID0JVUVfQUREUl9BTlksCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfSU4sCisJ CS5taC5mbGFncyA9CXsgLnBpcGVfYm9mID0gMSwgLnNob3J0X3hmZXJfb2sgPSAxLCB9LAorCQku bWguYnVmc2l6ZSA9CVVCVF9JTlRSX0JVRkZFUl9TSVpFLAorCQkubWguY2FsbGJhY2sgPQkmdWJ0 X2ludHJfcmVhZF9jYWxsYmFjaywKIAl9LAotCisJLyogT3V0Z29pbmcgY29udHJvbCB0cmFuc2Zl ciAtIEhDSSBjb21tYW5kcyAqLwogCVszXSA9IHsKLQkJLnR5cGUgPSBVRV9DT05UUk9MLAotCQku ZW5kcG9pbnQgPSAweDAwLAkvKiBDb250cm9sIHBpcGUgKi8KLQkJLmRpcmVjdGlvbiA9IFVFX0RJ Ul9BTlksCi0JCS5taC5idWZzaXplID0gKHNpemVvZihzdHJ1Y3QgdXNiMl9kZXZpY2VfcmVxdWVz dCkgKyBVQlRfQ1RSTF9CVUZGRVJfU0laRSksCi0JCS5taC5jYWxsYmFjayA9ICZ1YnRfY3RybF93 cml0ZV9jYWxsYmFjaywKLQkJLm1oLnRpbWVvdXQgPSA1MDAwLAkvKiA1IHNlY29uZHMgKi8KKwkJ LnR5cGUgPQkJVUVfQ09OVFJPTCwKKwkJLmVuZHBvaW50ID0JMHgwMCwJLyogY29udHJvbCBwaXBl ICovCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfQU5ZLAorCQkubWguYnVmc2l6ZSA9CShzaXplb2Yo c3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QpICsKKwkJCQkgVUJUX0NUUkxfQlVGRkVSX1NJWkUp LCAvKiBieXRlcyAqLworCQkubWguY2FsbGJhY2sgPQkmdWJ0X2N0cmxfd3JpdGVfY2FsbGJhY2ss CisJCS5taC50aW1lb3V0ID0JNTAwMCwJLyogNSBzZWNvbmRzICovCiAJfSwKLQorCS8qIE91dGdv aW5nIGNvbnRyb2wgdHJhbnNmZXIgdG8gY2xlYXIgc3RhbGwgb24gb3V0Z29pbmcgYnVsayB0cmFu c2ZlciAqLwogCVs0XSA9IHsKLQkJLnR5cGUgPSBVRV9DT05UUk9MLAotCQkuZW5kcG9pbnQgPSAw eDAwLAkvKiBDb250cm9sIHBpcGUgKi8KLQkJLmRpcmVjdGlvbiA9IFVFX0RJUl9BTlksCi0JCS5t aC5idWZzaXplID0gc2l6ZW9mKHN0cnVjdCB1c2IyX2RldmljZV9yZXF1ZXN0KSwKLQkJLm1oLmNh bGxiYWNrID0gJnVidF9idWxrX3dyaXRlX2NsZWFyX3N0YWxsX2NhbGxiYWNrLAotCQkubWgudGlt ZW91dCA9IDEwMDAsCS8qIDEgc2Vjb25kICovCi0JCS5taC5pbnRlcnZhbCA9IDUwLAkvKiA1MG1z ICovCisJCS50eXBlID0JCVVFX0NPTlRST0wsCisJCS5lbmRwb2ludCA9CTB4MDAsCS8qIGNvbnRy b2wgcGlwZSAqLworCQkuZGlyZWN0aW9uID0JVUVfRElSX0FOWSwKKwkJLm1oLmJ1ZnNpemUgPQlz aXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QpLAorCQkubWguY2FsbGJhY2sgPQkmdWJ0 X2J1bGtfd3JpdGVfY2xlYXJfc3RhbGxfY2FsbGJhY2ssCisJCS5taC50aW1lb3V0ID0JMTAwMCwJ LyogMSBzZWNvbmQgKi8KKwkJLm1oLmludGVydmFsID0JNTAsCS8qIDUwbXMgKi8KIAl9LAotCisJ LyogT3V0Z29pbmcgY29udHJvbCB0cmFuc2ZlciB0byBjbGVhciBzdGFsbCBvbiBpbmNvbWluZyBi dWxrIHRyYW5zZmVyICovCiAJWzVdID0gewotCQkudHlwZSA9IFVFX0NPTlRST0wsCi0JCS5lbmRw b2ludCA9IDB4MDAsCS8qIENvbnRyb2wgcGlwZSAqLwotCQkuZGlyZWN0aW9uID0gVUVfRElSX0FO WSwKLQkJLm1oLmJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QpLAot CQkubWguY2FsbGJhY2sgPSAmdWJ0X2J1bGtfcmVhZF9jbGVhcl9zdGFsbF9jYWxsYmFjaywKLQkJ Lm1oLnRpbWVvdXQgPSAxMDAwLAkvKiAxIHNlY29uZCAqLwotCQkubWguaW50ZXJ2YWwgPSA1MCwJ LyogNTBtcyAqLworCQkudHlwZSA9CQlVRV9DT05UUk9MLAorCQkuZW5kcG9pbnQgPQkweDAwLAkv KiBjb250cm9sIHBpcGUgKi8KKwkJLmRpcmVjdGlvbiA9CVVFX0RJUl9BTlksCisJCS5taC5idWZz aXplID0Jc2l6ZW9mKHN0cnVjdCB1c2IyX2RldmljZV9yZXF1ZXN0KSwKKwkJLm1oLmNhbGxiYWNr ID0JJnVidF9idWxrX3JlYWRfY2xlYXJfc3RhbGxfY2FsbGJhY2ssCisJCS5taC50aW1lb3V0ID0J MTAwMCwJLyogMSBzZWNvbmQgKi8KKwkJLm1oLmludGVydmFsID0JNTAsCS8qIDUwbXMgKi8KIAl9 LAotCisJLyoKKwkgKiBPdXRnb2luZyBjb250cm9sIHRyYW5zZmVyIHRvIGNsZWFyIHN0YWxsIG9u IGluY29taW5nCisJICogaW50ZXJydXB0IHRyYW5zZmVyCisJICovCiAJWzZdID0gewotCQkudHlw ZSA9IFVFX0NPTlRST0wsCi0JCS5lbmRwb2ludCA9IDB4MDAsCS8qIENvbnRyb2wgcGlwZSAqLwot CQkuZGlyZWN0aW9uID0gVUVfRElSX0FOWSwKLQkJLm1oLmJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0 IHVzYjJfZGV2aWNlX3JlcXVlc3QpLAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2ludHJfcmVhZF9j bGVhcl9zdGFsbF9jYWxsYmFjaywKLQkJLm1oLnRpbWVvdXQgPSAxMDAwLAkvKiAxIHNlY29uZCAq LwotCQkubWguaW50ZXJ2YWwgPSA1MCwJLyogNTBtcyAqLworCQkudHlwZSA9CQlVRV9DT05UUk9M LAorCQkuZW5kcG9pbnQgPQkweDAwLAkvKiBjb250cm9sIHBpcGUgKi8KKwkJLmRpcmVjdGlvbiA9 CVVFX0RJUl9BTlksCisJCS5taC5idWZzaXplID0Jc2l6ZW9mKHN0cnVjdCB1c2IyX2RldmljZV9y ZXF1ZXN0KSwKKwkJLm1oLmNhbGxiYWNrID0JJnVidF9pbnRyX3JlYWRfY2xlYXJfc3RhbGxfY2Fs bGJhY2ssCisJCS5taC50aW1lb3V0ID0JMTAwMCwJLyogMSBzZWNvbmQgKi8KKwkJLm1oLmludGVy dmFsID0JNTAsCS8qIDUwbXMgKi8KIAl9LAogfTsKIAotLyogVVNCIGNvbmZpZyAqLwotc3RhdGlj IGNvbnN0IHN0cnVjdCB1c2IyX2NvbmZpZwotCXVidF9jb25maWdfaWZfMV9mdWxsX3NwZWVkW1VC VF9JRl8xX05fVFJBTlNGRVJdID0geworLyoKKyAqIFVTQiBjb25maWcKKyAqCisgKiBUaGUgZm9s bG93aW5nIGRlc3JpYmVzIHVzYiB0cmFuc2ZlcnMgdGhhdCBjb3VsZCBiZSBzdWJtaXR0ZWQKKyAq IG9uIFVTQiBkZXZpY2UncyBpbnRlcmZhY2UgMQorICoKKyAqIEludGVyZmFjZSAxIG9uIHRoZSBV QlMgZGV2aWNlIG11c3QgcHJlc2VudCBtdXN0IDIgZW5kcG9pbnRzCisgKgkxKSBJc29jaHJvbm91 cyBJTiBlbmRwb2ludCB0byByZWNlaXZlIFNDTyBkYXRhCisgKgkyKSBJc29jaHJvbm91cyBPVVQg ZW5kcG9pbnQgdG8gc2VuZCBTQ08gZGF0YQorICoKKyAqIEludGVyZmFjZSAxICh3aXRoIGlzb2No cm9ub3VzIGVuZHBvaW50cykgaGFzIHNldmVyYWwgYWx0ZXJuYXRlCisgKiBjb25maWd1cmF0aW9u cyB3aXRoIGRpZmZlcmVudCBwYWNrZXQgc2l6ZS4KKyAqCisgKiBEZXZpY2UgaXMgZXhwZWN0ZWQg dG8gYmUgYSBoaWdoIHNwZWVkIGRldmljZS4KKyAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHVz YjJfY29uZmlnCQl1YnRfY29uZmlnX2lmXzFbVUJUX0lGXzFfTl9UUkFOU0ZFUl0gPQoreworCS8q IEluY29taW5nIGlzb2Nocm9ub3VzIHRyYW5zZmVyICMxIC0gU0NPIHBhY2tldHMgKi8KIAlbMF0g PSB7Ci0JCS50eXBlID0gVUVfSVNPQ0hST05PVVMsCi0JCS5lbmRwb2ludCA9IFVFX0FERFJfQU5Z LAotCQkuZGlyZWN0aW9uID0gVUVfRElSX0lOLAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAi d01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJB TUVTLAotCQkubWguZmxhZ3MgPSB7LnNob3J0X3hmZXJfb2sgPSAxLH0sCi0JCS5taC5jYWxsYmFj ayA9ICZ1YnRfaXNvY19yZWFkX2NhbGxiYWNrLAorCQkudHlwZSA9CQlVRV9JU09DSFJPTk9VUywK KwkJLmVuZHBvaW50ID0JVUVfQUREUl9BTlksCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfSU4sCisJ CS5taC5idWZzaXplID0JMCwJLyogdXNlICJ3TWF4UGFja2V0U2l6ZSAqIGZyYW1lcyIgKi8KKwkJ Lm1oLmZyYW1lcyA9CVVCVF9JU09DX05GUkFNRVMsCisJCS5taC5mbGFncyA9CXsgLnNob3J0X3hm ZXJfb2sgPSAxLCB9LAorCQkubWguY2FsbGJhY2sgPQkmdWJ0X2lzb2NfcmVhZF9jYWxsYmFjaywK IAl9LAotCisJLyogSW5jb21pbmcgaXNvY2hyb25vdXMgdHJhbnNmZXIgIzIgLSBTQ08gcGFja2V0 cyAqLwogCVsxXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJPTk9VUywKLQkJLmVuZHBvaW50ID0g VUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfSU4sCi0JCS5taC5idWZzaXplID0g MCwJLyogdXNlICJ3TWF4UGFja2V0U2l6ZSAqIGZyYW1lcyIgKi8KLQkJLm1oLmZyYW1lcyA9IFVC VF9JU09DX05GUkFNRVMsCi0JCS5taC5mbGFncyA9IHsuc2hvcnRfeGZlcl9vayA9IDEsfSwKLQkJ Lm1oLmNhbGxiYWNrID0gJnVidF9pc29jX3JlYWRfY2FsbGJhY2ssCisJCS50eXBlID0JCVVFX0lT T0NIUk9OT1VTLAorCQkuZW5kcG9pbnQgPQlVRV9BRERSX0FOWSwKKwkJLmRpcmVjdGlvbiA9CVVF X0RJUl9JTiwKKwkJLm1oLmJ1ZnNpemUgPQkwLAkvKiB1c2UgIndNYXhQYWNrZXRTaXplICogZnJh bWVzIiAqLworCQkubWguZnJhbWVzID0JVUJUX0lTT0NfTkZSQU1FUywKKwkJLm1oLmZsYWdzID0J eyAuc2hvcnRfeGZlcl9vayA9IDEsIH0sCisJCS5taC5jYWxsYmFjayA9CSZ1YnRfaXNvY19yZWFk X2NhbGxiYWNrLAogCX0sCi0KKwkvKiBPdXRnb2luZyBpc29jaHJvbm91cyB0cmFuc2ZlciAjMSAt IFNDTyBwYWNrZXRzICovCiAJWzJdID0gewotCQkudHlwZSA9IFVFX0lTT0NIUk9OT1VTLAotCQku ZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlvbiA9IFVFX0RJUl9PVVQsCi0JCS5t aC5idWZzaXplID0gMCwJLyogdXNlICJ3TWF4UGFja2V0U2l6ZSAqIGZyYW1lcyIgKi8KLQkJLm1o LmZyYW1lcyA9IFVCVF9JU09DX05GUkFNRVMsCi0JCS5taC5mbGFncyA9IHsuc2hvcnRfeGZlcl9v ayA9IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9pc29jX3dyaXRlX2NhbGxiYWNrLAorCQku dHlwZSA9CQlVRV9JU09DSFJPTk9VUywKKwkJLmVuZHBvaW50ID0JVUVfQUREUl9BTlksCisJCS5k aXJlY3Rpb24gPQlVRV9ESVJfT1VULAorCQkubWguYnVmc2l6ZSA9CTAsCS8qIHVzZSAid01heFBh Y2tldFNpemUgKiBmcmFtZXMiICovCisJCS5taC5mcmFtZXMgPQlVQlRfSVNPQ19ORlJBTUVTLAor CQkubWguZmxhZ3MgPQl7IC5zaG9ydF94ZmVyX29rID0gMSwgfSwKKwkJLm1oLmNhbGxiYWNrID0J JnVidF9pc29jX3dyaXRlX2NhbGxiYWNrLAogCX0sCi0KKwkvKiBPdXRnb2luZyBpc29jaHJvbm91 cyB0cmFuc2ZlciAjMiAtIFNDTyBwYWNrZXRzICovCiAJWzNdID0gewotCQkudHlwZSA9IFVFX0lT T0NIUk9OT1VTLAotCQkuZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlvbiA9IFVF X0RJUl9PVVQsCi0JCS5taC5idWZzaXplID0gMCwJLyogdXNlICJ3TWF4UGFja2V0U2l6ZSAqIGZy YW1lcyIgKi8KLQkJLm1oLmZyYW1lcyA9IFVCVF9JU09DX05GUkFNRVMsCi0JCS5taC5mbGFncyA9 IHsuc2hvcnRfeGZlcl9vayA9IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9pc29jX3dyaXRl X2NhbGxiYWNrLAorCQkudHlwZSA9CQlVRV9JU09DSFJPTk9VUywKKwkJLmVuZHBvaW50ID0JVUVf QUREUl9BTlksCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfT1VULAorCQkubWguYnVmc2l6ZSA9CTAs CS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCisJCS5taC5mcmFtZXMgPQlVQlRf SVNPQ19ORlJBTUVTLAorCQkubWguZmxhZ3MgPQl7IC5zaG9ydF94ZmVyX29rID0gMSwgfSwKKwkJ Lm1oLmNhbGxiYWNrID0JJnVidF9pc29jX3dyaXRlX2NhbGxiYWNrLAogCX0sCiB9OwogCi0vKiBV U0IgY29uZmlnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYjJfY29uZmlnCi0JdWJ0X2NvbmZp Z19pZl8xX2hpZ2hfc3BlZWRbVUJUX0lGXzFfTl9UUkFOU0ZFUl0gPSB7Ci0KLQlbMF0gPSB7Ci0J CS50eXBlID0gVUVfSVNPQ0hST05PVVMsCi0JCS5lbmRwb2ludCA9IFVFX0FERFJfQU5ZLAotCQku ZGlyZWN0aW9uID0gVUVfRElSX0lOLAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBh Y2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTICog OCwKLQkJLm1oLmZsYWdzID0gey5zaG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sg PSAmdWJ0X2lzb2NfcmVhZF9jYWxsYmFjaywKLQl9LAotCi0JWzFdID0gewotCQkudHlwZSA9IFVF X0lTT0NIUk9OT1VTLAotCQkuZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlvbiA9 IFVFX0RJUl9JTiwKLQkJLm1oLmJ1ZnNpemUgPSAwLAkvKiB1c2UgIndNYXhQYWNrZXRTaXplICog ZnJhbWVzIiAqLwotCQkubWguZnJhbWVzID0gVUJUX0lTT0NfTkZSQU1FUyAqIDgsCi0JCS5taC5m bGFncyA9IHsuc2hvcnRfeGZlcl9vayA9IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9pc29j X3JlYWRfY2FsbGJhY2ssCi0JfSwKLQotCVsyXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJPTk9V UywKLQkJLmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfT1VU LAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICov Ci0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTICogOCwKLQkJLm1oLmZsYWdzID0gey5z aG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2lzb2Nfd3JpdGVfY2Fs bGJhY2ssCi0JfSwKLQotCVszXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJPTk9VUywKLQkJLmVu ZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfT1VULAotCQkubWgu YnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5taC5m cmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTICogOCwKLQkJLm1oLmZsYWdzID0gey5zaG9ydF94ZmVy X29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2lzb2Nfd3JpdGVfY2FsbGJhY2ssCi0J fSwKLX07Ci0KIC8qCi0gKiBNb2R1bGUKLSAqLwotCi1EUklWRVJfTU9EVUxFKG5nX3VidCwgdXNo dWIsIHVidF9kcml2ZXIsIHVidF9kZXZjbGFzcywgdWJ0X21vZGV2ZW50LCAwKTsKLU1PRFVMRV9W RVJTSU9OKG5nX3VidCwgTkdfQkxVRVRPT1RIX1ZFUlNJT04pOwotTU9EVUxFX0RFUEVORChuZ191 YnQsIG5ldGdyYXBoLCBOR19BQklfVkVSU0lPTiwgTkdfQUJJX1ZFUlNJT04sIE5HX0FCSV9WRVJT SU9OKTsKLU1PRFVMRV9ERVBFTkQobmdfdWJ0LCBuZ19oY2ksIE5HX0JMVUVUT09USF9WRVJTSU9O LCBOR19CTFVFVE9PVEhfVkVSU0lPTiwgTkdfQkxVRVRPT1RIX1ZFUlNJT04pOwotTU9EVUxFX0RF UEVORChuZ191YnQsIHVzYjJfYmx1ZXRvb3RoLCAxLCAxLCAxKTsKLU1PRFVMRV9ERVBFTkQobmdf dWJ0LCB1c2IyX2NvcmUsIDEsIDEsIDEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKLSAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQiBzcGVj aWZpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgot ICogTG9hZC9VbmxvYWQgdGhlIGRyaXZlciBtb2R1bGUKLSAqLwotCi1zdGF0aWMgaW50Ci11YnRf bW9kZXZlbnQobW9kdWxlX3QgbW9kLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVy cm9yOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgTU9EX0xPQUQ6Ci0JCWVycm9yID0gbmdf bmV3dHlwZSgmdHlwZXN0cnVjdCk7Ci0JCWlmIChlcnJvciAhPSAwKSB7Ci0JCQlwcmludGYoIiVz OiBDb3VsZCBub3QgcmVnaXN0ZXIgIgotCQkJICAgICJOZXRncmFwaCBub2RlIHR5cGUsIGVycm9y PSVkXG4iLAotCQkJICAgIE5HX1VCVF9OT0RFX1RZUEUsIGVycm9yKTsKLQkJfQotCQlicmVhazsK LQotCWNhc2UgTU9EX1VOTE9BRDoKLQkJZXJyb3IgPSBuZ19ybXR5cGUoJnR5cGVzdHJ1Y3QpOwot CQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVycm9yID0gRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0J fQotCXJldHVybiAoZXJyb3IpOwotfQkJCQkJLyogdWJ0X21vZGV2ZW50ICovCi0KLS8qCiAgKiBJ ZiBmb3Igc29tZSByZWFzb24gZGV2aWNlIHNob3VsZCBub3QgYmUgYXR0YWNoZWQgdGhlbiBwdXQK ICAqIFZlbmRvcklEL1Byb2R1Y3RJRCBwYWlyIGludG8gdGhlIGxpc3QgYmVsb3cuIFRoZSBmb3Jt YXQgaXMKICAqIGFzIGZvbGxvd3M6CiAgKgotICoJeyBWRU5ET1JfSUQsIFBST0RVQ1RfSUQgfSwK KyAqCXsgVVNCX1ZQSShWRU5ET1JfSUQsIFBST0RVQ1RfSUQsIDApIH0sCiAgKgogICogd2hlcmUg VkVORE9SX0lEIGFuZCBQUk9EVUNUX0lEIGFyZSBoZXggbnVtYmVycy4KICAqLwogc3RhdGljIGNv bnN0IHN0cnVjdCB1c2IyX2RldmljZV9pZCB1YnRfaWdub3JlX2RldnNbXSA9IHsKIAkvKiBBVk0g VVNCIEJsdWV0b290aC1BZGFwdGVyIEJsdWVGcml0eiEgdjEuMCAqLwotCXtVU0JfVlBJKFVTQl9W RU5ET1JfQVZNLCAweDIyMDAsIDApfSwKKwl7IFVTQl9WUEkoVVNCX1ZFTkRPUl9BVk0sIDB4MjIw MCwgMCkgfSwKIH07CiAKIC8qIExpc3Qgb2Ygc3VwcG9ydGVkIGJsdWV0b290aCBkZXZpY2VzICov CiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYjJfZGV2aWNlX2lkIHVidF9kZXZzW10gPSB7Ci0JLyog R2VuZXJpYyBCbHVldG9vdGggY2xhc3MgZGV2aWNlcy4gKi8KLQl7VVNCX0lGQUNFX0NMQVNTKFVE Q0xBU1NfV0lSRUxFU1MpLAotCQlVU0JfSUZBQ0VfU1VCQ0xBU1MoVURTVUJDTEFTU19SRiksCi0J VVNCX0lGQUNFX1BST1RPQ09MKFVEUFJPVE9fQkxVRVRPT1RIKX0sCisJLyogR2VuZXJpYyBCbHVl dG9vdGggY2xhc3MgZGV2aWNlcyAqLworCXsgVVNCX0lGQUNFX0NMQVNTKFVEQ0xBU1NfV0lSRUxF U1MpLAorCSAgVVNCX0lGQUNFX1NVQkNMQVNTKFVEU1VCQ0xBU1NfUkYpLAorCSAgVVNCX0lGQUNF X1BST1RPQ09MKFVEUFJPVE9fQkxVRVRPT1RIKSB9LAogCiAJLyogQVZNIFVTQiBCbHVldG9vdGgt QWRhcHRlciBCbHVlRnJpdHohIHYyLjAgKi8KLQl7VVNCX1ZQSShVU0JfVkVORE9SX0FWTSwgMHgz ODAwLCAwKX0sCisJeyBVU0JfVlBJKFVTQl9WRU5ET1JfQVZNLCAweDM4MDAsIDApIH0sCiB9Owog CiAvKgotICogUHJvYmUgZm9yIGEgVVNCIEJsdWV0b290aCBkZXZpY2UKKyAqIFByb2JlIGZvciBh IFVTQiBCbHVldG9vdGggZGV2aWNlLgorICogVVNCIGNvbnRleHQuCiAgKi8KIAogc3RhdGljIGlu dAogdWJ0X3Byb2JlKGRldmljZV90IGRldikKIHsKLQlzdHJ1Y3QgdXNiMl9hdHRhY2hfYXJnICp1 YWEgPSBkZXZpY2VfZ2V0X2l2YXJzKGRldik7CisJc3RydWN0IHVzYjJfYXR0YWNoX2FyZwkqdWFh ID0gZGV2aWNlX2dldF9pdmFycyhkZXYpOwogCi0JaWYgKHVhYS0+dXNiMl9tb2RlICE9IFVTQl9N T0RFX0hPU1QpIHsKKwlpZiAodWFhLT51c2IyX21vZGUgIT0gVVNCX01PREVfSE9TVCkKIAkJcmV0 dXJuIChFTlhJTyk7Ci0JfQotCWlmICh1YWEtPmluZm8uYklmYWNlSW5kZXggIT0gMCkgeworCisJ aWYgKHVhYS0+aW5mby5iSWZhY2VJbmRleCAhPSAwKQogCQlyZXR1cm4gKEVOWElPKTsKLQl9CisK IAlpZiAodXNiMl9sb29rdXBfaWRfYnlfdWFhKHVidF9pZ25vcmVfZGV2cywKLQkgICAgc2l6ZW9m KHVidF9pZ25vcmVfZGV2cyksIHVhYSkgPT0gMCkgeworCQkJc2l6ZW9mKHVidF9pZ25vcmVfZGV2 cyksIHVhYSkgPT0gMCkKIAkJcmV0dXJuIChFTlhJTyk7Ci0JfQorCiAJcmV0dXJuICh1c2IyX2xv b2t1cF9pZF9ieV91YWEodWJ0X2RldnMsIHNpemVvZih1YnRfZGV2cyksIHVhYSkpOwotfQorfSAv KiB1YnRfcHJvYmUgKi8KIAogLyoKLSAqIEF0dGFjaCB0aGUgZGV2aWNlCisgKiBBdHRhY2ggdGhl IGRldmljZS4KKyAqIFVTQiBjb250ZXh0LgogICovCiAKIHN0YXRpYyBpbnQKIHVidF9hdHRhY2go ZGV2aWNlX3QgZGV2KQogewotCXN0cnVjdCB1c2IyX2F0dGFjaF9hcmcgKnVhYSA9IGRldmljZV9n ZXRfaXZhcnMoZGV2KTsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29mdGMo ZGV2KTsKLQljb25zdCBzdHJ1Y3QgdXNiMl9jb25maWcgKmlzb2Nfc2V0dXA7Ci0Jc3RydWN0IHVz YjJfZW5kcG9pbnRfZGVzY3JpcHRvciAqZWQ7Ci0JdWludDE2X3Qgd01heFBhY2tldFNpemU7Ci0J dWludDhfdCBhbHRfaW5kZXg7Ci0JdWludDhfdCBpZmFjZV9pbmRleDsKLQl1aW50OF90IGk7Ci0J dWludDhfdCBqOworCXN0cnVjdCB1c2IyX2F0dGFjaF9hcmcJCSp1YWEgPSBkZXZpY2VfZ2V0X2l2 YXJzKGRldik7CisJc3RydWN0IHVidF9zb2Z0YwkJKnNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYp OworCXN0cnVjdCB1c2IyX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmVkOworCXVpbnQxNl90CQkJd01h eFBhY2tldFNpemU7CisJdWludDhfdAkJCQlhbHRfaW5kZXgsIGlmYWNlX2luZGV4LCBpLCBqOwog CiAJZGV2aWNlX3NldF91c2IyX2Rlc2MoZGV2KTsKIAogCXNucHJpbnRmKHNjLT5zY19uYW1lLCBz aXplb2Yoc2MtPnNjX25hbWUpLAotCSAgICAiJXMiLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldikp OworCQkiJXMiLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldikpOwogCisJLyogRXhwZWN0IGhpZ2gt c3BlZWQgZGV2aWNlICovCisJaWYgKHVzYjJfZ2V0X3NwZWVkKHVhYS0+ZGV2aWNlKSAhPSBVU0Jf U1BFRURfSElHSCkKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJkZXZpY2UgaXMgbm90IGEgaGlnaC1z cGVlZCBkZXZpY2UhXG4iKTsKKworCS8qIAorCSAqIENyZWF0ZSBOZXRncmFwaCBub2RlCisJICov CisKKwlzYy0+c2NfaG9vayA9IE5VTEw7CisKKwlpZiAobmdfbWFrZV9ub2RlX2NvbW1vbigmdHlw ZXN0cnVjdCwgJnNjLT5zY19ub2RlKSAhPSAwKSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiY291 bGQgbm90IGNyZWF0ZSBOZXRncmFwaCBub2RlXG4iKTsKKwkJcmV0dXJuIChFTlhJTyk7CisJfQor CisJLyogTmFtZSBOZXRncmFwaCBub2RlICovCisJaWYgKG5nX25hbWVfbm9kZShzYy0+c2Nfbm9k ZSwgc2MtPnNjX25hbWUpICE9IDApIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJjb3VsZCBub3Qg bmFtZSBOZXRncmFwaCBub2RlXG4iKTsKKwkJTkdfTk9ERV9VTlJFRihzYy0+c2Nfbm9kZSk7CisJ CXJldHVybiAoRU5YSU8pOworCX0KKwlOR19OT0RFX1NFVF9QUklWQVRFKHNjLT5zY19ub2RlLCBz Yyk7CisJTkdfTk9ERV9GT1JDRV9XUklURVIoc2MtPnNjX25vZGUpOworCiAJLyoKIAkgKiBJbml0 aWFsaXplIGRldmljZSBzb2Z0YyBzdHJ1Y3R1cmUKIAkgKi8KQEAgLTQ4MSwzNCArNDk0LDI4IEBA CiAJLyogc3RhdGUgKi8KIAlzYy0+c2NfZGVidWcgPSBOR19VQlRfV0FSTl9MRVZFTDsKIAlzYy0+ c2NfZmxhZ3MgPSAwOwotCU5HX1VCVF9TVEFUX1JFU0VUKHNjLT5zY19zdGF0KTsKKwlVQlRfU1RB VF9SRVNFVChzYyk7CiAKLQkvKiBjb250cm9sIHBpcGUgKi8KKwkvKiBpbml0aWFsaXplIGxvY2tz ICovCisJbXR4X2luaXQoJnNjLT5zY19tYnVmcV9tdHgsICJ1YnQgbWJ1ZnEiLCBOVUxMLCBNVFhf REVGKTsKKwltdHhfaW5pdCgmc2MtPnNjX2lmXzBfbXR4LCAidWJ0IGlmMCIsIE5VTEwsIE1UWF9E RUYgfCBNVFhfUkVDVVJTRSk7CisJbXR4X2luaXQoJnNjLT5zY19pZl8xX210eCwgInVidCBpZjEi LCBOVUxMLCBNVFhfREVGIHwgTVRYX1JFQ1VSU0UpOworCisJLyogaW5pdGlhbGl6ZSBwYWNrZXQg cXVldWVzICovCiAJTkdfQlRfTUJVRlFfSU5JVCgmc2MtPnNjX2NtZHEsIFVCVF9ERUZBVUxUX1FM RU4pOwotCi0JLyogYnVsay1vdXQgcGlwZSAqLwogCU5HX0JUX01CVUZRX0lOSVQoJnNjLT5zY19h Y2xxLCBVQlRfREVGQVVMVF9RTEVOKTsKKwlOR19CVF9NQlVGUV9JTklUKCZzYy0+c2Nfc2NvcSwg VUJUX0RFRkFVTFRfUUxFTik7CiAKLQkvKiBpc29jLW91dCBwaXBlICovCi0JTkdfQlRfTUJVRlFf SU5JVCgmc2MtPnNjX3Njb3EsCi0JICAgICh1c2IyX2dldF9zcGVlZCh1YWEtPmRldmljZSkgPT0g VVNCX1NQRUVEX0hJR0gpID8KLQkgICAgKDIgKiBVQlRfSVNPQ19ORlJBTUVTICogOCkgOgotCSAg ICAoMiAqIFVCVF9JU09DX05GUkFNRVMpKTsKKwkvKiBpbml0aWFsaXplIGdsdWUgdGFzayAqLwor CXNjLT5zY190YXNrX2ZsYWdzID0gMDsKKwlUQVNLX0lOSVQoJnNjLT5zY190YXNrLCAwLCB1YnRf dGFzaywgc2MtPnNjX25vZGUpOwogCi0JLyogaXNvYy1pbiBwaXBlICovCi0JTkdfQlRfTUJVRlFf SU5JVCgmc2MtPnNjX3NjaXEsCi0JICAgICh1c2IyX2dldF9zcGVlZCh1YWEtPmRldmljZSkgPT0g VVNCX1NQRUVEX0hJR0gpID8KLQkgICAgKDIgKiBVQlRfSVNPQ19ORlJBTUVTICogOCkgOgotCSAg ICAoMiAqIFVCVF9JU09DX05GUkFNRVMpKTsKLQotCS8qIG5ldGdyYXBoIHBhcnQgKi8KLQlzYy0+ c2Nfbm9kZSA9IE5VTEw7Ci0Jc2MtPnNjX2hvb2sgPSBOVUxMOwotCiAJLyoKIAkgKiBDb25maWd1 cmUgQmx1ZXRvb3RoIFVTQiBkZXZpY2UuIERpc2NvdmVyIGFsbCByZXF1aXJlZCBVU0IKIAkgKiBp bnRlcmZhY2VzIGFuZCBlbmRwb2ludHMuCiAJICoKKwkgKiBEZXZpY2UgaXMgZXhwZWN0ZWQgdG8g YmUgYSBoaWdoLXNwZWVkIGRldmljZS4KKwkgKgogCSAqIFVTQiBkZXZpY2UgbXVzdCBwcmVzZW50 IHR3byBpbnRlcmZhY2VzOgogCSAqIDEpIEludGVyZmFjZSAwIHRoYXQgaGFzIDMgZW5kcG9pbnRz CiAJICoJMSkgSW50ZXJydXB0IGVuZHBvaW50IHRvIHJlY2VpdmUgSENJIGV2ZW50cwpAQCAtNTI3 LDc5MSArNTM0LDk5NSBAQAogCSAqIEludGVyZmFjZSAwCiAJICovCiAKLQltdHhfaW5pdCgmc2Mt PnNjX210eCwgInVidCBsb2NrIiwgTlVMTCwgTVRYX0RFRiB8IE1UWF9SRUNVUlNFKTsKLQogCWlm YWNlX2luZGV4ID0gMDsKLQlpZiAodXNiMl90cmFuc2Zlcl9zZXR1cAotCSAgICAodWFhLT5kZXZp Y2UsICZpZmFjZV9pbmRleCwgc2MtPnNjX3hmZXJfaWZfMCwgdWJ0X2NvbmZpZ19pZl8wLAotCSAg ICBVQlRfSUZfMF9OX1RSQU5TRkVSLCBzYywgJnNjLT5zY19tdHgpKSB7Ci0JCWRldmljZV9wcmlu dGYoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIHRyYW5zZmVycyAiCi0JCSAgICAiZm9yIGludGVy ZmFjZSAwIVxuIik7CisJaWYgKHVzYjJfdHJhbnNmZXJfc2V0dXAodWFhLT5kZXZpY2UsICZpZmFj ZV9pbmRleCwgc2MtPnNjX3hmZXJfaWZfMCwKKwkJCXVidF9jb25maWdfaWZfMCwgVUJUX0lGXzBf Tl9UUkFOU0ZFUiwKKwkJCXNjLT5zY19ub2RlLCAmc2MtPnNjX2lmXzBfbXR4KSkgeworCQlkZXZp Y2VfcHJpbnRmKGRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSB0cmFuc2ZlcnMgZm9yICIgXAorCQkJ ImludGVyZmFjZSAwIVxuIik7CiAJCWdvdG8gZGV0YWNoOwogCX0KKwogCS8qCiAJICogSW50ZXJm YWNlIDEKLQkgKiAoc2VhcmNoIGFsdGVybmF0ZSBzZXR0aW5ncywgYW5kIGZpbmQKLQkgKiAgdGhl IGRlc2NyaXB0b3Igd2l0aCB0aGUgbGFyZ2VzdAorCSAqIChzZWFyY2ggYWx0ZXJuYXRlIHNldHRp bmdzLCBhbmQgZmluZCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBsYXJnZXN0CiAJICogIHdNYXhQ YWNrZXRTaXplKQogCSAqLwotCWlzb2Nfc2V0dXAgPQotCSAgICAoKHVzYjJfZ2V0X3NwZWVkKHVh YS0+ZGV2aWNlKSA9PSBVU0JfU1BFRURfSElHSCkgPwotCSAgICB1YnRfY29uZmlnX2lmXzFfaGln aF9zcGVlZCA6Ci0JICAgIHVidF9jb25maWdfaWZfMV9mdWxsX3NwZWVkKTsKIAogCXdNYXhQYWNr ZXRTaXplID0gMDsKLQotCS8qIHNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgZGVzY3JpcHRvcnMgbG9v a2luZyBmb3IgYmlkaXIgbW9kZSAqLwotCi0JYWx0X2luZGV4ID0gMCAtIDE7CisJYWx0X2luZGV4 ID0gMDsKIAlpID0gMDsKIAlqID0gMDsKKworCS8qIFNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgZGVz Y3JpcHRvcnMgbG9va2luZyBmb3IgYmlkaXIgbW9kZSAqLwogCXdoaWxlICgxKSB7CiAJCXVpbnQx Nl90IHRlbXA7CiAKLQkJZWQgPSB1c2IyX2ZpbmRfZWRlc2MoCi0JCSAgICB1c2IyX2dldF9jb25m aWdfZGVzY3JpcHRvcih1YWEtPmRldmljZSksIDEsIGksIGopOworCQllZCA9IHVzYjJfZmluZF9l ZGVzYyh1c2IyX2dldF9jb25maWdfZGVzY3JpcHRvcih1YWEtPmRldmljZSksCisJCQkJMSwgaSwg aik7CiAJCWlmIChlZCA9PSBOVUxMKSB7Ci0JCQlpZiAoaiA9PSAwKSB7Ci0JCQkJLyogZW5kIG9m IGludGVyZmFjZXMgKi8KLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7CisJCQlpZiAoaiAhPSAwKSB7 CiAJCQkJLyogbmV4dCBpbnRlcmZhY2UgKi8KIAkJCQlqID0gMDsKLQkJCQlpKys7CisJCQkJaSAr KzsKIAkJCQljb250aW51ZTsKIAkJCX0KKworCQkJYnJlYWs7CS8qIGVuZCBvZiBpbnRlcmZhY2Vz ICovCiAJCX0KKwogCQl0ZW1wID0gVUdFVFcoZWQtPndNYXhQYWNrZXRTaXplKTsKIAkJaWYgKHRl bXAgPiB3TWF4UGFja2V0U2l6ZSkgewogCQkJd01heFBhY2tldFNpemUgPSB0ZW1wOwogCQkJYWx0 X2luZGV4ID0gaTsKIAkJfQotCQlqKys7Ci0JfQogCi0JaWYgKHVzYjJfc2V0X2FsdF9pbnRlcmZh Y2VfaW5kZXgodWFhLT5kZXZpY2UsIDEsIGFsdF9pbmRleCkpIHsKLQkJZGV2aWNlX3ByaW50Zihk ZXYsICJDb3VsZCBub3Qgc2V0IGFsdGVybmF0ZSAiCi0JCSAgICAic2V0dGluZyAlZCBmb3IgaW50 ZXJmYWNlIDEhXG4iLCBhbHRfaW5kZXgpOwotCQlnb3RvIGRldGFjaDsKKwkJaiArKzsKIAl9Ci0J aWZhY2VfaW5kZXggPSAxOwotCWlmICh1c2IyX3RyYW5zZmVyX3NldHVwCi0JICAgICh1YWEtPmRl dmljZSwgJmlmYWNlX2luZGV4LCBzYy0+c2NfeGZlcl9pZl8xLAotCSAgICBpc29jX3NldHVwLCBV QlRfSUZfMV9OX1RSQU5TRkVSLCBzYywgJnNjLT5zY19tdHgpKSB7Ci0JCWRldmljZV9wcmludGYo ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIHRyYW5zZmVycyAiCi0JCSAgICAiZm9yIGludGVyZmFj ZSAxIVxuIik7Ci0JCWdvdG8gZGV0YWNoOwotCX0KLQkvKiBjcmVhdGUgTmV0Z3JhcGggbm9kZSAq LwogCi0JaWYgKG5nX21ha2Vfbm9kZV9jb21tb24oJnR5cGVzdHJ1Y3QsICZzYy0+c2Nfbm9kZSkg IT0gMCkgewotCQlwcmludGYoIiVzOiBDb3VsZCBub3QgY3JlYXRlIE5ldGdyYXBoIG5vZGVcbiIs Ci0JCSAgICBzYy0+c2NfbmFtZSk7Ci0JCXNjLT5zY19ub2RlID0gTlVMTDsKKwkvKiBTZXQgYWx0 IGNvbmZpZ3VyYXRpb24gb25seSBpZiB3ZSBmb3VuZCBpdCAqLworCWlmICh3TWF4UGFja2V0U2l6 ZSA+IDAgJiYKKwkgICAgdXNiMl9zZXRfYWx0X2ludGVyZmFjZV9pbmRleCh1YWEtPmRldmljZSwg MSwgYWx0X2luZGV4KSkgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgImNvdWxkIG5vdCBzZXQgYWx0 ZXJuYXRlIHNldHRpbmcgJWQgIiBcCisJCQkiZm9yIGludGVyZmFjZSAxIVxuIiwgYWx0X2luZGV4 KTsKIAkJZ290byBkZXRhY2g7CiAJfQotCS8qIG5hbWUgbm9kZSAqLwogCi0JaWYgKG5nX25hbWVf bm9kZShzYy0+c2Nfbm9kZSwgc2MtPnNjX25hbWUpICE9IDApIHsKLQkJcHJpbnRmKCIlczogQ291 bGQgbm90IG5hbWUgTmV0Z3JhcGggbm9kZVxuIiwKLQkJICAgIHNjLT5zY19uYW1lKTsKLQkJTkdf Tk9ERV9VTlJFRihzYy0+c2Nfbm9kZSk7Ci0JCXNjLT5zY19ub2RlID0gTlVMTDsKKwlpZmFjZV9p bmRleCA9IDE7CisJaWYgKHVzYjJfdHJhbnNmZXJfc2V0dXAodWFhLT5kZXZpY2UsICZpZmFjZV9p bmRleCwgc2MtPnNjX3hmZXJfaWZfMSwKKwkJCXVidF9jb25maWdfaWZfMSwgVUJUX0lGXzFfTl9U UkFOU0ZFUiwKKwkJCXNjLT5zY19ub2RlLCAmc2MtPnNjX2lmXzFfbXR4KSkgeworCQlkZXZpY2Vf cHJpbnRmKGRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSB0cmFuc2ZlcnMgZm9yICIgXAorCQkJImlu dGVyZmFjZSAxIVxuIik7CiAJCWdvdG8gZGV0YWNoOwogCX0KLQlOR19OT0RFX1NFVF9QUklWQVRF KHNjLT5zY19ub2RlLCBzYyk7Ci0JTkdfTk9ERV9GT1JDRV9XUklURVIoc2MtPnNjX25vZGUpOwog Ci0JLyogY2xhaW0gYWxsIGludGVyZmFjZXMgb24gdGhlIGRldmljZSAqLwotCi0JZm9yIChpID0g MTs7IGkrKykgewotCi0JCWlmICh1c2IyX2dldF9pZmFjZSh1YWEtPmRldmljZSwgaSkgPT0gTlVM TCkgewotCQkJYnJlYWs7Ci0JCX0KKwkvKiBDbGFpbSBhbGwgaW50ZXJmYWNlcyBvbiB0aGUgZGV2 aWNlICovCisJZm9yIChpID0gMTsgdXNiMl9nZXRfaWZhY2UodWFhLT5kZXZpY2UsIGkpICE9IE5V TEw7IGkgKyspCiAJCXVzYjJfc2V0X3BhcmVudF9pZmFjZSh1YWEtPmRldmljZSwgaSwgdWFhLT5p bmZvLmJJZmFjZUluZGV4KTsKLQl9CiAKLQlyZXR1cm4gKDApOwkJCS8qIHN1Y2Nlc3MgKi8KKwly ZXR1cm4gKDApOyAvKiBzdWNjZXNzICovCiAKIGRldGFjaDoKIAl1YnRfZGV0YWNoKGRldik7CiAK IAlyZXR1cm4gKEVOWElPKTsKLX0KK30gLyogdWJ0X2F0dGFjaCAqLwogCiAvKgotICogRGV0YWNo IHRoZSBkZXZpY2UKKyAqIERldGFjaCB0aGUgZGV2aWNlLgorICogVVNCIGNvbnRleHQuCiAgKi8K IAogaW50CiB1YnRfZGV0YWNoKGRldmljZV90IGRldikKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpz YyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYyA9IGRldmlj ZV9nZXRfc29mdGMoZGV2KTsKIAotCS8qIGRlc3Ryb3kgTmV0Z3JhcGggbm9kZSAqLwotCisJLyog RGVzdHJveSBOZXRncmFwaCBub2RlICovCiAJaWYgKHNjLT5zY19ub2RlICE9IE5VTEwpIHsKIAkJ TkdfTk9ERV9TRVRfUFJJVkFURShzYy0+c2Nfbm9kZSwgTlVMTCk7CiAJCW5nX3Jtbm9kZV9zZWxm KHNjLT5zY19ub2RlKTsKIAkJc2MtPnNjX25vZGUgPSBOVUxMOwogCX0KLQkvKiBmcmVlIFVTQiB0 cmFuc2ZlcnMsIGlmIGFueSAqLwogCisJLyogRnJlZSBVU0IgdHJhbnNmZXJzLCBpZiBhbnkgKi8K IAl1c2IyX3RyYW5zZmVyX3Vuc2V0dXAoc2MtPnNjX3hmZXJfaWZfMCwgVUJUX0lGXzBfTl9UUkFO U0ZFUik7Ci0KIAl1c2IyX3RyYW5zZmVyX3Vuc2V0dXAoc2MtPnNjX3hmZXJfaWZfMSwgVUJUX0lG XzFfTl9UUkFOU0ZFUik7CiAKLQltdHhfZGVzdHJveSgmc2MtPnNjX210eCk7Ci0KLQkvKiBkZXN0 cm95IHF1ZXVlcyAqLwotCisJLyogRGVzdHJveSBxdWV1ZXMgKi8KKwlVQlRfTUJVRlFfTE9DSyhz Yyk7CiAJTkdfQlRfTUJVRlFfREVTVFJPWSgmc2MtPnNjX2NtZHEpOwogCU5HX0JUX01CVUZRX0RF U1RST1koJnNjLT5zY19hY2xxKTsKIAlOR19CVF9NQlVGUV9ERVNUUk9ZKCZzYy0+c2Nfc2NvcSk7 Ci0JTkdfQlRfTUJVRlFfREVTVFJPWSgmc2MtPnNjX3NjaXEpOworCVVCVF9NQlVGUV9VTkxPQ0so c2MpOwogCisJbXR4X2Rlc3Ryb3koJnNjLT5zY19pZl8wX210eCk7CisJbXR4X2Rlc3Ryb3koJnNj LT5zY19pZl8xX210eCk7CisJbXR4X2Rlc3Ryb3koJnNjLT5zY19tYnVmcV9tdHgpOworCiAJcmV0 dXJuICgwKTsKLX0KK30gLyogdWJ0X2RldGFjaCAqLwogCisvKiAKKyAqIENhbGxlZCB3aGVuIG91 dGdvaW5nIGNvbnRyb2wgcmVxdWVzdCAoSENJIGNvbW1hbmQpIGhhcyBjb21wbGV0ZWQsIGkuZS4K KyAqIEhDSSBjb21tYW5kIHdhcyBzZW50IHRvIHRoZSBkZXZpY2UuCisgKiBVU0IgY29udGV4dC4K KyAqLworCiBzdGF0aWMgdm9pZAogdWJ0X2N0cmxfd3JpdGVfY2FsbGJhY2soc3RydWN0IHVzYjJf eGZlciAqeGZlcikKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IHhmZXItPnByaXZfc2M7Ci0J c3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QgcmVxOwotCXN0cnVjdCBtYnVmICptOworCW5vZGVf cAkJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCQkqc2M7CisJc3Ry dWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QJcmVxOworCXN0cnVjdCBtYnVmCQkJKm07CiAKKwlpZiAo TkdfTk9ERV9OT1RfVkFMSUQobm9kZSkpIHsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsKKwkJcmV0 dXJuOyAvKiBuZXRncmFwaCBub2RlIGlzIGdvbmUgKi8KKwl9CisKKwlzYyA9IE5HX05PREVfUFJJ VkFURShub2RlKTsKKwogCXN3aXRjaCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkgewogCWNhc2UgVVNC X1NUX1RSQU5TRkVSUkVEOgotdHJfdHJhbnNmZXJyZWQ6CisJCWlmICh4ZmVyLT5lcnJvciAhPSAw KQorCQkJVUJUX1NUQVRfT0VSUk9SKHNjKTsKKwkJZWxzZSB7CisJCQlVQlRfSU5GTyhzYywgInNl bnQgJWQgYnl0ZXMgdG8gY29udHJvbCBwaXBlXG4iLAorCQkJCXhmZXItPmFjdGxlbik7CiAKLQkJ aWYgKHhmZXItPmVycm9yKSB7Ci0JCQlOR19VQlRfU1RBVF9PRVJST1Ioc2MtPnNjX3N0YXQpOwot CQl9IGVsc2UgewotCQkJTkdfVUJUX1NUQVRfQllURVNfU0VOVChzYy0+c2Nfc3RhdCwgeGZlci0+ YWN0bGVuKTsKLQkJCU5HX1VCVF9TVEFUX1BDS1RTX1NFTlQoc2MtPnNjX3N0YXQpOworCQkJVUJU X1NUQVRfQllURVNfU0VOVChzYywgeGZlci0+YWN0bGVuKTsKKwkJCVVCVF9TVEFUX1BDS1RTX1NF TlQoc2MpOwogCQl9CisJCS8qIEZBTExUSFJPVUdIICovCiAKIAljYXNlIFVTQl9TVF9TRVRVUDoK LQotCQkvKiBnZXQgbmV4dCBtYnVmLCBpZiBhbnkgKi8KLQorc2VuZF9uZXh0OgorCQkvKiBHZXQg bmV4dCBjb21tYW5kIG1idWYsIGlmIGFueSAqLworCQlVQlRfTUJVRlFfTE9DSyhzYyk7CiAJCU5H X0JUX01CVUZRX0RFUVVFVUUoJnNjLT5zY19jbWRxLCBtKTsKKwkJVUJUX01CVUZRX1VOTE9DSyhz Yyk7CiAKIAkJaWYgKG0gPT0gTlVMTCkgewotCQkJTkdfVUJUX0lORk8oc2MsICJIQ0kgY29tbWFu ZCBxdWV1ZSBpcyBlbXB0eVxuIik7CisJCQlVQlRfSU5GTyhzYywgIkhDSSBjb21tYW5kIHF1ZXVl IGlzIGVtcHR5XG4iKTsKKwkJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIHRyYW5zZmVyIGNvbXBs ZXRlZCAqLwogCQkJcmV0dXJuOwogCQl9Ci0JCS8qCi0JCSAqIGNoZWNrIEhDSSBjb21tYW5kIGZy YW1lIHNpemUgYW5kCi0JCSAqIGNvcHkgaXQgdG8gVVNCIHRyYW5zZmVyIGJ1ZmZlcjoKLQkJICov CiAKLQkJaWYgKG0tPm1fcGt0aGRyLmxlbiA+IFVCVF9DVFJMX0JVRkZFUl9TSVpFKSB7Ci0JCQlw YW5pYygiSENJIGNvbW1hbmQgZnJhbWUgdG9vIGJpZywgc2l6ZT0lemQsIGxlbj0lZFxuIiwKLQkJ CSAgICBVQlRfQ1RSTF9CVUZGRVJfU0laRSwgbS0+bV9wa3RoZHIubGVuKTsKLQkJfQotCQkvKiBp bml0aWFsaXplIGEgVVNCIGNvbnRyb2wgcmVxdWVzdCBhbmQgdGhlbiBzY2hlZHVsZSBpdCAqLwot CisJCS8qIEluaXRpYWxpemUgYSBVU0IgY29udHJvbCByZXF1ZXN0IGFuZCB0aGVuIHNjaGVkdWxl IGl0ICovCiAJCWJ6ZXJvKCZyZXEsIHNpemVvZihyZXEpKTsKLQogCQlyZXEuYm1SZXF1ZXN0VHlw ZSA9IFVCVF9IQ0lfUkVRVUVTVDsKIAkJVVNFVFcocmVxLndMZW5ndGgsIG0tPm1fcGt0aGRyLmxl bik7CiAKLQkJTkdfVUJUX0lORk8oc2MsICJTZW5kaW5nIGNvbnRyb2wgcmVxdWVzdCwgYm1SZXF1 ZXN0VHlwZT0weCUwMngsICIKLQkJICAgICJ3TGVuZ3RoPSVkXG4iLCByZXEuYm1SZXF1ZXN0VHlw ZSwgVUdFVFcocmVxLndMZW5ndGgpKTsKKwkJVUJUX0lORk8oc2MsICJTZW5kaW5nIGNvbnRyb2wg cmVxdWVzdCwgIiBcCisJCQkiYm1SZXF1ZXN0VHlwZT0weCUwMngsIHdMZW5ndGg9JWRcbiIsCisJ CQlyZXEuYm1SZXF1ZXN0VHlwZSwgVUdFVFcocmVxLndMZW5ndGgpKTsKIAogCQl1c2IyX2NvcHlf aW4oeGZlci0+ZnJidWZmZXJzLCAwLCAmcmVxLCBzaXplb2YocmVxKSk7CiAJCXVzYjJfbV9jb3B5 X2luKHhmZXItPmZyYnVmZmVycyArIDEsIDAsIG0sIDAsIG0tPm1fcGt0aGRyLmxlbik7CiAKIAkJ eGZlci0+ZnJsZW5ndGhzWzBdID0gc2l6ZW9mKHJlcSk7CiAJCXhmZXItPmZybGVuZ3Roc1sxXSA9 IG0tPm1fcGt0aGRyLmxlbjsKLQkJeGZlci0+bmZyYW1lcyA9IHhmZXItPmZybGVuZ3Roc1sxXSA/ IDIgOiAxOworCQl4ZmVyLT5uZnJhbWVzID0gMjsKIAogCQlOR19GUkVFX00obSk7CiAKIAkJdXNi Ml9zdGFydF9oYXJkd2FyZSh4ZmVyKTsKLQkJcmV0dXJuOworCQlicmVhazsKIAotCWRlZmF1bHQ6 CQkJLyogRXJyb3IgKi8KLQkJaWYgKHhmZXItPmVycm9yID09IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7 Ci0JCQkvKiBpZ25vcmUgKi8KLQkJCXJldHVybjsKKwlkZWZhdWx0OiAvKiBFcnJvciAqLworCQlp ZiAoeGZlci0+ZXJyb3IgIT0gVVNCX0VSUl9DQU5DRUxMRUQpIHsKKwkJCVVCVF9XQVJOKHNjLCAi Y29udHJvbCB0cmFuc2ZlciBmYWlsZWQ6ICVzXG4iLAorCQkJCXVzYjJfZXJyc3RyKHhmZXItPmVy cm9yKSk7CisKKwkJCVVCVF9TVEFUX09FUlJPUihzYyk7CisJCQlnb3RvIHNlbmRfbmV4dDsKIAkJ fQotCQlnb3RvIHRyX3RyYW5zZmVycmVkOworCisJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIHRy YW5zZmVyIGNhbmNlbGxlZCAqLworCQlicmVhazsKIAl9Ci19Cit9IC8qIHVidF9jdHJsX3dyaXRl X2NhbGxiYWNrICovCiAKKy8qIAorICogQ2FsbGVkIHdoZW4gaW5jb21pbmcgaW50ZXJydXB0IHRy YW5zZmVyIChIQ0kgZXZlbnQpIGhhcyBjb21wbGV0ZWQsIGkuZS4KKyAqIEhDSSBldmVudCB3YXMg cmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlLgorICogVVNCIGNvbnRleHQuCisgKi8KKwogc3RhdGlj IHZvaWQKIHVidF9pbnRyX3JlYWRfY2FsbGJhY2soc3RydWN0IHVzYjJfeGZlciAqeGZlcikKIHsK LQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IHhmZXItPnByaXZfc2M7Ci0Jc3RydWN0IG1idWYgKm07 Ci0JdWludDMyX3QgbWF4X2xlbjsKLQl1aW50OF90ICpwdHI7CisJbm9kZV9wCQkJbm9kZSA9IHhm ZXItPnByaXZfc2M7CisJc3RydWN0IHVidF9zb2Z0Ywkqc2M7CisJc3RydWN0IG1idWYJCSptOwor CW5nX2hjaV9ldmVudF9wa3RfdAkqaGRyOworCWludAkJCWVycm9yOwogCisJaWYgKE5HX05PREVf Tk9UX1ZBTElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVybjsgLyog bmV0Z3JhcGggbm9kZSBpcyBnb25lICovCisJfQorCisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9k ZSk7CisKKwlpZiAoKHNjLT5zY19ob29rID09IE5VTEwpIHx8IE5HX0hPT0tfTk9UX1ZBTElEKHNj LT5zY19ob29rKSkgeworCQlVQlRfSU5GTyhzYywgIm5vIHVwc3RyZWFtIGhvb2tcbiIpOworCQlO R19OT0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47IC8qIHVwc3RyZWFtIGhvb2sgaXMgZ29uZSAq LworCX0KKworCW0gPSBOVUxMOworCiAJc3dpdGNoIChVU0JfR0VUX1NUQVRFKHhmZXIpKSB7CiAJ Y2FzZSBVU0JfU1RfVFJBTlNGRVJSRUQ6Ci0KLQkJLyogYWxsb2NhdGUgYSBuZXcgbWJ1ZiAqLwot CisJCS8qIEFsbG9jYXRlIGEgbmV3IG1idWYgKi8KIAkJTUdFVEhEUihtLCBNX0RPTlRXQUlULCBN VF9EQVRBKTsKLQogCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQlnb3RvIHRyX3NldHVwOworCQkJVUJU X1NUQVRfSUVSUk9SKHNjKTsKKwkJCWdvdG8gc3VibWl0X25leHQ7CiAJCX0KKwogCQlNQ0xHRVQo bSwgTV9ET05UV0FJVCk7Ci0KIAkJaWYgKCEobS0+bV9mbGFncyAmIE1fRVhUKSkgewotCQkJTkdf RlJFRV9NKG0pOwotCQkJZ290byB0cl9zZXR1cDsKKwkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CisJ CQlnb3RvIHN1Ym1pdF9uZXh0OwogCQl9Ci0JCWlmICghKHNjLT5zY19mbGFncyAmIFVCVF9IQVZF X0ZSQU1FX1RZUEUpKSB7Ci0JCQkqbXRvZChtLCB1aW50OF90ICopPSBOR19IQ0lfRVZFTlRfUEtU OwotCQkJbS0+bV9wa3RoZHIubGVuID0gbS0+bV9sZW4gPSAxOwotCQl9IGVsc2UgewotCQkJbS0+ bV9wa3RoZHIubGVuID0gbS0+bV9sZW4gPSAwOworCisJCS8qIEFkZCBIQ0kgcGFja2V0IHR5cGUg Ki8KKwkJKm10b2QobSwgdWludDhfdCAqKT0gTkdfSENJX0VWRU5UX1BLVDsKKwkJbS0+bV9wa3Ro ZHIubGVuID0gbS0+bV9sZW4gPSAxOworCisJCWlmICh4ZmVyLT5hY3RsZW4gPiBNQ0xCWVRFUyAt IDEpCisJCQl4ZmVyLT5hY3RsZW4gPSBNQ0xCWVRFUyAtIDE7CisKKwkJdXNiMl9jb3B5X291dCh4 ZmVyLT5mcmJ1ZmZlcnMsIDAsIG10b2QobSwgdWludDhfdCAqKSArIDEsCisJCQl4ZmVyLT5hY3Rs ZW4pOworCQltLT5tX3BrdGhkci5sZW4gKz0geGZlci0+YWN0bGVuOworCQltLT5tX2xlbiArPSB4 ZmVyLT5hY3RsZW47CisKKwkJVUJUX0lORk8oc2MsICJnb3QgJWQgYnl0ZXMgZnJvbSBpbnRlcnJ1 cHQgcGlwZVxuIiwKKwkJCXhmZXItPmFjdGxlbik7CisKKwkJLyogVmFsaWRhdGUgcGFja2V0IGFu ZCBzZW5kIGl0IHVwIHRoZSBzdGFjayAqLworCQlpZiAobS0+bV9wa3RoZHIubGVuIDwgc2l6ZW9m KCpoZHIpKSB7CisJCQlVQlRfSU5GTyhzYywgIkhDSSBldmVudCBwYWNrZXQgaXMgdG9vIHNob3J0 XG4iKTsKKworCQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsKKwkJCWdvdG8gc3VibWl0X25leHQ7CiAJ CX0KIAotCQltYXhfbGVuID0gKE1DTEJZVEVTIC0gbS0+bV9sZW4pOworCQloZHIgPSBtdG9kKG0s IG5nX2hjaV9ldmVudF9wa3RfdCAqKTsKKwkJaWYgKGhkci0+bGVuZ3RoICE9IChtLT5tX3BrdGhk ci5sZW4gLSBzaXplb2YoKmhkcikpKSB7CisJCQlVQlRfRVJSKHNjLCAiSW52YWxpZCBIQ0kgZXZl bnQgcGFja2V0IHNpemUsICIgXAorCQkJCSJsZW5ndGg9JWQsIHBrdGxlbj0lZFxuIiwKKwkJCQlo ZHItPmxlbmd0aCwgbS0+bV9wa3RoZHIubGVuKTsKIAotCQlpZiAoeGZlci0+YWN0bGVuID4gbWF4 X2xlbikgewotCQkJeGZlci0+YWN0bGVuID0gbWF4X2xlbjsKKwkJCVVCVF9TVEFUX0lFUlJPUihz Yyk7CisJCQlnb3RvIHN1Ym1pdF9uZXh0OwogCQl9Ci0JCXB0ciA9ICgodWludDhfdCAqKShtLT5t X2RhdGEpKSArIG0tPm1fbGVuOwogCi0JCXVzYjJfY29weV9vdXQoeGZlci0+ZnJidWZmZXJzLCAw LCBwdHIsIHhmZXItPmFjdGxlbik7CisJCVVCVF9JTkZPKHNjLCAiZ290IGNvbXBsZXRlIEhDSSBl dmVudCBmcmFtZSwgcGt0bGVuPSVkLCAiIFwKKwkJCSJsZW5ndGg9JWRcbiIsIG0tPm1fcGt0aGRy LmxlbiwgaGRyLT5sZW5ndGgpOwogCi0JCW0tPm1fcGt0aGRyLmxlbiArPSB4ZmVyLT5hY3RsZW47 Ci0JCW0tPm1fbGVuICs9IHhmZXItPmFjdGxlbjsKKwkJVUJUX1NUQVRfUENLVFNfUkVDVihzYyk7 CisJCVVCVF9TVEFUX0JZVEVTX1JFQ1Yoc2MsIG0tPm1fcGt0aGRyLmxlbik7CiAKLQkJTkdfVUJU X0lORk8oc2MsICJnb3QgJWQgYnl0ZXMgZnJvbSBpbnRlcnJ1cHQgIgotCQkgICAgInBpcGVcbiIs IHhmZXItPmFjdGxlbik7CisJCU5HX1NFTkRfREFUQV9PTkxZKGVycm9yLCBzYy0+c2NfaG9vaywg bSk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsKIAotCQlzYy0+ c2NfaW50cl9idWZmZXIgPSBtOworCQkvKiBtID09IE5VTEwgYXQgdGhpcyBwb2ludCAqLworCQkv KiBGQUxMVEhST1VHSCAqLwogCiAJY2FzZSBVU0JfU1RfU0VUVVA6Ci10cl9zZXR1cDoKK3N1Ym1p dF9uZXh0OgorCQlOR19GUkVFX00obSk7IC8qIGNoZWNrcyBmb3IgbSAhPSBOVUxMICovCiAKLQkJ aWYgKHNjLT5zY19pbnRyX2J1ZmZlcikgewotCQkJbmdfc2VuZF9mbihzYy0+c2Nfbm9kZSwgTlVM TCwgdWJ0X2ludHJfcmVhZF9jb21wbGV0ZSwgTlVMTCwgMCk7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJ aWYgKHNjLT5zY19mbGFncyAmIFVCVF9GTEFHX0lOVFJfU1RBTEwpIHsKIAkJCXVzYjJfdHJhbnNm ZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMFs2XSk7Ci0JCQlyZXR1cm47CisJCX0gZWxzZSB7CisJ CQl4ZmVyLT5mcmxlbmd0aHNbMF0gPSB4ZmVyLT5tYXhfZGF0YV9sZW5ndGg7CisJCQl1c2IyX3N0 YXJ0X2hhcmR3YXJlKHhmZXIpOwogCQl9Ci0JCXhmZXItPmZybGVuZ3Roc1swXSA9IHhmZXItPm1h eF9kYXRhX2xlbmd0aDsKKwkJYnJlYWs7CiAKLQkJdXNiMl9zdGFydF9oYXJkd2FyZSh4ZmVyKTsK LQkJcmV0dXJuOwotCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLworCWRlZmF1bHQ6IC8qIEVycm9y ICovCiAJCWlmICh4ZmVyLT5lcnJvciAhPSBVU0JfRVJSX0NBTkNFTExFRCkgewotCQkJLyogdHJ5 IHRvIGNsZWFyIHN0YWxsIGZpcnN0ICovCisJCQkvKiBUcnkgdG8gY2xlYXIgc3RhbGwgZmlyc3Qg Ki8KIAkJCXNjLT5zY19mbGFncyB8PSBVQlRfRkxBR19JTlRSX1NUQUxMOwogCQkJdXNiMl90cmFu c2Zlcl9zdGFydChzYy0+c2NfeGZlcl9pZl8wWzZdKTsKLQkJfQotCQlyZXR1cm47Ci0KKwkJfSBl bHNlCisJCQlOR19OT0RFX1VOUkVGKG5vZGUpOyAvKiB0cmFuc2ZlciBjYW5jZWxsZWQgKi8KKwkJ YnJlYWs7CiAJfQotfQorfSAvKiB1YnRfaW50cl9yZWFkX2NhbGxiYWNrICovCiAKKy8qCisgKiBD YWxsZWQgd2hlbiBvdXRnb2luZyBjb250cm9sIHRyYW5zZmVyIGluaXRpYXRlZCB0byBjbGVhciBz dGFsbCBvbgorICogaW50ZXJydXB0IHBpcGUgaGFzIGNvbXBsZXRlZC4KKyAqIFVTQiBjb250ZXh0 LgorICovCisKIHN0YXRpYyB2b2lkCiB1YnRfaW50cl9yZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNr KHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVy LT5wcml2X3NjOwotCXN0cnVjdCB1c2IyX3hmZXIgKnhmZXJfb3RoZXIgPSBzYy0+c2NfeGZlcl9p Zl8wWzJdOworCW5vZGVfcAkJCW5vZGUgPSB4ZmVyLT5wcml2X3NjOworCXN0cnVjdCB1YnRfc29m dGMJKnNjOworCXN0cnVjdCB1c2IyX3hmZXIJKnhmZXJfb3RoZXI7CiAKKwlpZiAoTkdfTk9ERV9O T1RfVkFMSUQobm9kZSkpIHsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsKKwkJcmV0dXJuOyAvKiBu ZXRncmFwaCBub2RlIGlzIGdvbmUgKi8KKwl9CisKKwlzYyA9IE5HX05PREVfUFJJVkFURShub2Rl KTsKKwl4ZmVyX290aGVyID0gc2MtPnNjX3hmZXJfaWZfMFsyXTsKKwogCWlmICh1c2IyX2NsZWFy X3N0YWxsX2NhbGxiYWNrKHhmZXIsIHhmZXJfb3RoZXIpKSB7CiAJCURQUklOVEYoInN0YWxsIGNs ZWFyZWRcbiIpOwogCQlzYy0+c2NfZmxhZ3MgJj0gflVCVF9GTEFHX0lOVFJfU1RBTEw7CiAJCXVz YjJfdHJhbnNmZXJfc3RhcnQoeGZlcl9vdGhlcik7Ci0JfQotfQorCX0gZWxzZQorCQlOR19OT0RF X1VOUkVGKG5vZGUpOyAvKiBYWFggY2FudCBjbGVhciBzdGFsbCAqLworfSAvKiB1YnRfaW50cl9y ZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrICovCiAKKy8qCisgKiBDYWxsZWQgd2hlbiBpbmNvbWlu ZyBidWxrIHRyYW5zZmVyIChBQ0wgcGFja2V0KSBoYXMgY29tcGxldGVkLCBpLmUuCisgKiBBQ0wg cGFja2V0IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBVU0IgY29udGV4dC4KKyAq LworCiBzdGF0aWMgdm9pZAotdWJ0X2ludHJfcmVhZF9jb21wbGV0ZShub2RlX3Agbm9kZSwgaG9v a19wIGhvb2ssIHZvaWQgKmFyZzEsIGludCBhcmcyKQordWJ0X2J1bGtfcmVhZF9jYWxsYmFjayhz dHJ1Y3QgdXNiMl94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0gTkdfTk9E RV9QUklWQVRFKG5vZGUpOwotCXN0cnVjdCBtYnVmICptOwotCW5nX2hjaV9ldmVudF9wa3RfdCAq aGRyOwotCWludCBlcnJvcjsKKwlub2RlX3AJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1 Y3QgdWJ0X3NvZnRjCSpzYzsKKwlzdHJ1Y3QgbWJ1ZgkJKm07CisJbmdfaGNpX2FjbGRhdGFfcGt0 X3QJKmhkcjsKKwl1aW50MTZfdAkJbGVuOworCWludAkJCWVycm9yOwogCi0JaWYgKHNjID09IE5V TEwpIHsKLQkJcmV0dXJuOworCWlmIChOR19OT0RFX05PVF9WQUxJRChub2RlKSkgeworCQlOR19O T0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLwog CX0KLQltdHhfbG9jaygmc2MtPnNjX210eCk7CiAKLQltID0gc2MtPnNjX2ludHJfYnVmZmVyOwor CXNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUpOwogCi0JaWYgKG0pIHsKKwlpZiAoKHNjLT5zY19o b29rID09IE5VTEwpIHx8IE5HX0hPT0tfTk9UX1ZBTElEKHNjLT5zY19ob29rKSkgeworCQlVQlRf SU5GTyhzYywgIm5vIHVwc3RyZWFtIGhvb2tcbiIpOworCQlOR19OT0RFX1VOUkVGKG5vZGUpOwor CQlyZXR1cm47IC8qIHVwc3RyZWFtIGhvb2sgaXMgZ29uZSAqLworCX0KIAotCQlzYy0+c2NfaW50 cl9idWZmZXIgPSBOVUxMOworCW0gPSBOVUxMOwogCi0JCWhkciA9IG10b2QobSwgbmdfaGNpX2V2 ZW50X3BrdF90ICopOwotCi0JCWlmICgoc2MtPnNjX2hvb2sgPT0gTlVMTCkgfHwgTkdfSE9PS19O T1RfVkFMSUQoc2MtPnNjX2hvb2spKSB7Ci0JCQlOR19VQlRfSU5GTyhzYywgIk5vIHVwc3RyZWFt IGhvb2tcbiIpOwotCQkJZ290byBkb25lOworCXN3aXRjaCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkg eworCWNhc2UgVVNCX1NUX1RSQU5TRkVSUkVEOgorCQkvKiBBbGxvY2F0ZSBuZXcgbWJ1ZiAqLwor CQlNR0VUSERSKG0sIE1fRE9OVFdBSVQsIE1UX0RBVEEpOworCQlpZiAobSA9PSBOVUxMKSB7CisJ CQlVQlRfU1RBVF9JRVJST1Ioc2MpOworCQkJZ290byBzdWJtaXRfbmV4dDsKIAkJfQotCQlOR19V QlRfU1RBVF9CWVRFU19SRUNWKHNjLT5zY19zdGF0LCBtLT5tX3BrdGhkci5sZW4pOwogCi0JCWlm IChtLT5tX3BrdGhkci5sZW4gPCBzaXplb2YoKmhkcikpIHsKLQkJCU5HX1VCVF9JTkZPKHNjLCAi UGFja2V0IHRvbyBzaG9ydFxuIik7Ci0JCQlnb3RvIGRvbmU7CisJCU1DTEdFVChtLCBNX0RPTlRX QUlUKTsKKwkJaWYgKCEobS0+bV9mbGFncyAmIE1fRVhUKSkgeworCQkJVUJUX1NUQVRfSUVSUk9S KHNjKTsKKwkJCWdvdG8gc3VibWl0X25leHQ7CiAJCX0KLQkJaWYgKGhkci0+bGVuZ3RoID09ICht LT5tX3BrdGhkci5sZW4gLSBzaXplb2YoKmhkcikpKSB7Ci0JCQlOR19VQlRfSU5GTyhzYywgIkdv dCBjb21wbGV0ZSBIQ0kgZXZlbnQgZnJhbWUsICIKLQkJCSAgICAicGt0bGVuPSVkLCBsZW5ndGg9 JWRcbiIsCi0JCQkgICAgbS0+bV9wa3RoZHIubGVuLCBoZHItPmxlbmd0aCk7CiAKLQkJCU5HX1VC VF9TVEFUX1BDS1RTX1JFQ1Yoc2MtPnNjX3N0YXQpOworCQkvKiBBZGQgSENJIHBhY2tldCB0eXBl ICovCisJCSptdG9kKG0sIHVpbnQ4X3QgKik9IE5HX0hDSV9BQ0xfREFUQV9QS1Q7CisJCW0tPm1f cGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gMTsKIAotCQkJTkdfU0VORF9EQVRBX09OTFkoZXJyb3Is IHNjLT5zY19ob29rLCBtKTsKKwkJaWYgKHhmZXItPmFjdGxlbiA+IE1DTEJZVEVTIC0gMSkKKwkJ CXhmZXItPmFjdGxlbiA9IE1DTEJZVEVTIC0gMTsKIAotCQkJbSA9IE5VTEw7CisJCXVzYjJfY29w eV9vdXQoeGZlci0+ZnJidWZmZXJzLCAwLCBtdG9kKG0sIHVpbnQ4X3QgKikgKyAxLAorCQkJeGZl ci0+YWN0bGVuKTsKKwkJbS0+bV9wa3RoZHIubGVuICs9IHhmZXItPmFjdGxlbjsKKwkJbS0+bV9s ZW4gKz0geGZlci0+YWN0bGVuOwogCi0JCQlpZiAoZXJyb3IgIT0gMCkgewotCQkJCU5HX1VCVF9T VEFUX0lFUlJPUihzYy0+c2Nfc3RhdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlOR19VQlRfRVJS KHNjLCAiSW52YWxpZCBIQ0kgZXZlbnQgZnJhbWUgc2l6ZSwgIgotCQkJICAgICJsZW5ndGg9JWQs IHBrdGxlbj0lZFxuIiwKLQkJCSAgICBoZHItPmxlbmd0aCwgbS0+bV9wa3RoZHIubGVuKTsKKwkJ VUJUX0lORk8oc2MsICJnb3QgJWQgYnl0ZXMgZnJvbSBidWxrLWluIHBpcGVcbiIsCisJCQl4ZmVy LT5hY3RsZW4pOwogCi0JCQlOR19VQlRfU1RBVF9JRVJST1Ioc2MtPnNjX3N0YXQpOwotCQl9Ci0J fQotZG9uZToKLQlpZiAobSkgewotCQlOR19GUkVFX00obSk7Ci0JfQotCS8qIHN0YXJ0IFVTQiB0 cmFuc2ZlciBpZiBub3QgYWxyZWFkeSBzdGFydGVkICovCisJCS8qIFZhbGlkYXRlIHBhY2tldCBh bmQgc2VuZCBpdCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYgKG0tPm1fcGt0aGRyLmxlbiA8IHNpemVv ZigqaGRyKSkgeworCQkJVUJUX0lORk8oc2MsICJIQ0kgQUNMIHBhY2tldCBpcyB0b28gc2hvcnRc biIpOwogCi0JdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcl9pZl8wWzJdKTsKLQotCW10 eF91bmxvY2soJnNjLT5zY19tdHgpOwotfQotCi1zdGF0aWMgdm9pZAotdWJ0X2J1bGtfcmVhZF9j YWxsYmFjayhzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyKQotewotCXN0cnVjdCB1YnRfc29mdGMgKnNj ID0geGZlci0+cHJpdl9zYzsKLQlzdHJ1Y3QgbWJ1ZiAqbTsKLQl1aW50MzJfdCBtYXhfbGVuOwot CXVpbnQ4X3QgKnB0cjsKLQotCXN3aXRjaCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkgewotCWNhc2Ug VVNCX1NUX1RSQU5TRkVSUkVEOgotCi0JCS8qIGFsbG9jYXRlIG5ldyBtYnVmICovCi0KLQkJTUdF VEhEUihtLCBNX0RPTlRXQUlULCBNVF9EQVRBKTsKLQotCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQln b3RvIHRyX3NldHVwOworCQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsKKwkJCWdvdG8gc3VibWl0X25l eHQ7CiAJCX0KLQkJTUNMR0VUKG0sIE1fRE9OVFdBSVQpOwogCi0JCWlmICghKG0tPm1fZmxhZ3Mg JiBNX0VYVCkpIHsKLQkJCU5HX0ZSRUVfTShtKTsKLQkJCWdvdG8gdHJfc2V0dXA7Ci0JCX0KLQkJ aWYgKCEoc2MtPnNjX2ZsYWdzICYgVUJUX0hBVkVfRlJBTUVfVFlQRSkpIHsKLQkJCSptdG9kKG0s IHVpbnQ4X3QgKik9IE5HX0hDSV9BQ0xfREFUQV9QS1Q7Ci0JCQltLT5tX3BrdGhkci5sZW4gPSBt LT5tX2xlbiA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQltLT5tX3BrdGhkci5sZW4gPSBtLT5tX2xlbiA9 IDA7Ci0JCX0KKwkJaGRyID0gbXRvZChtLCBuZ19oY2lfYWNsZGF0YV9wa3RfdCAqKTsKKwkJbGVu ID0gbGUxNnRvaChoZHItPmxlbmd0aCk7CisJCWlmIChsZW4gIT0gKG0tPm1fcGt0aGRyLmxlbiAt IHNpemVvZigqaGRyKSkpIHsKKwkJCVVCVF9FUlIoc2MsICJJbnZhbGlkIEFDTCBwYWNrZXQgc2l6 ZSwgbGVuZ3RoPSVkLCAiIFwKKwkJCQkicGt0bGVuPSVkXG4iLCBsZW4sIG0tPm1fcGt0aGRyLmxl bik7CiAKLQkJbWF4X2xlbiA9IChNQ0xCWVRFUyAtIG0tPm1fbGVuKTsKLQotCQlpZiAoeGZlci0+ YWN0bGVuID4gbWF4X2xlbikgewotCQkJeGZlci0+YWN0bGVuID0gbWF4X2xlbjsKKwkJCVVCVF9T VEFUX0lFUlJPUihzYyk7CisJCQlnb3RvIHN1Ym1pdF9uZXh0OwogCQl9Ci0JCXB0ciA9ICgodWlu dDhfdCAqKShtLT5tX2RhdGEpKSArIG0tPm1fbGVuOwogCi0JCXVzYjJfY29weV9vdXQoeGZlci0+ ZnJidWZmZXJzLCAwLCBwdHIsIHhmZXItPmFjdGxlbik7CisJCVVCVF9JTkZPKHNjLCAiZ290IGNv bXBsZXRlIEFDTCBkYXRhIHBhY2tldCwgcGt0bGVuPSVkLCAiIFwKKwkJCSJsZW5ndGg9JWRcbiIs IG0tPm1fcGt0aGRyLmxlbiwgbGVuKTsKIAotCQltLT5tX3BrdGhkci5sZW4gKz0geGZlci0+YWN0 bGVuOwotCQltLT5tX2xlbiArPSB4ZmVyLT5hY3RsZW47CisJCVVCVF9TVEFUX1BDS1RTX1JFQ1Yo c2MpOworCQlVQlRfU1RBVF9CWVRFU19SRUNWKHNjLCBtLT5tX3BrdGhkci5sZW4pOwogCi0JCU5H X1VCVF9JTkZPKHNjLCAiZ290ICVkIGJ5dGVzIGZyb20gYnVsay1pbiAiCi0JCSAgICAicGlwZVxu IiwgeGZlci0+YWN0bGVuKTsKKwkJTkdfU0VORF9EQVRBX09OTFkoZXJyb3IsIHNjLT5zY19ob29r LCBtKTsKKwkJaWYgKGVycm9yICE9IDApCisJCQlVQlRfU1RBVF9JRVJST1Ioc2MpOwogCi0JCXNj LT5zY19idWxrX2luX2J1ZmZlciA9IG07CisJCS8qIG0gPT0gTlVMTCBhdCB0aGlzIHBvaW50ICov CisJCS8qIEZBTExUSE9VR0ggKi8KIAogCWNhc2UgVVNCX1NUX1NFVFVQOgotdHJfc2V0dXA6Ci0J CWlmIChzYy0+c2NfYnVsa19pbl9idWZmZXIpIHsKLQkJCW5nX3NlbmRfZm4oc2MtPnNjX25vZGUs IE5VTEwsIHVidF9idWxrX3JlYWRfY29tcGxldGUsIE5VTEwsIDApOwotCQkJcmV0dXJuOwotCQl9 Ci0JCWlmIChzYy0+c2NfZmxhZ3MgJiBVQlRfRkxBR19SRUFEX1NUQUxMKSB7CitzdWJtaXRfbmV4 dDoKKwkJTkdfRlJFRV9NKG0pOyAvKiBjaGVja3MgZm9yIG0gIT0gTlVMTCAqLworCisJCWlmIChz Yy0+c2NfZmxhZ3MgJiBVQlRfRkxBR19SRUFEX1NUQUxMKQogCQkJdXNiMl90cmFuc2Zlcl9zdGFy dChzYy0+c2NfeGZlcl9pZl8wWzVdKTsKLQkJCXJldHVybjsKKwkJZWxzZSB7CisJCQl4ZmVyLT5m cmxlbmd0aHNbMF0gPSB4ZmVyLT5tYXhfZGF0YV9sZW5ndGg7CisJCQl1c2IyX3N0YXJ0X2hhcmR3 YXJlKHhmZXIpOwogCQl9Ci0JCXhmZXItPmZybGVuZ3Roc1swXSA9IHhmZXItPm1heF9kYXRhX2xl bmd0aDsKKwkJYnJlYWs7CiAKLQkJdXNiMl9zdGFydF9oYXJkd2FyZSh4ZmVyKTsKLQkJcmV0dXJu OwotCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLworCWRlZmF1bHQ6IC8qIEVycm9yICovCiAJCWlm ICh4ZmVyLT5lcnJvciAhPSBVU0JfRVJSX0NBTkNFTExFRCkgewotCQkJLyogdHJ5IHRvIGNsZWFy IHN0YWxsIGZpcnN0ICovCisJCQkvKiBUcnkgdG8gY2xlYXIgc3RhbGwgZmlyc3QgKi8KIAkJCXNj LT5zY19mbGFncyB8PSBVQlRfRkxBR19SRUFEX1NUQUxMOwogCQkJdXNiMl90cmFuc2Zlcl9zdGFy dChzYy0+c2NfeGZlcl9pZl8wWzVdKTsKLQkJfQotCQlyZXR1cm47Ci0KKwkJfSBlbHNlCisJCQlO R19OT0RFX1VOUkVGKG5vZGUpOyAvKiB0cmFuc2ZlciBjYW5jZWxsZWQgKi8KKwkJYnJlYWs7CiAJ fQotfQorfSAvKiB1YnRfYnVsa19yZWFkX2NhbGxiYWNrICovCiAKKy8qCisgKiBDYWxsZWQgd2hl biBvdXRnb2luZyBjb250cm9sIHRyYW5zZmVyIGluaXRpYXRlZCB0byBjbGVhciBzdGFsbCBvbgor ICogaW5jb21pbmcgYnVsayBwaXBlIGhhcyBjb21wbGV0ZWQuCisgKiBVU0IgY29udGV4dC4KKyAq LworCiBzdGF0aWMgdm9pZAogdWJ0X2J1bGtfcmVhZF9jbGVhcl9zdGFsbF9jYWxsYmFjayhzdHJ1 Y3QgdXNiMl94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0geGZlci0+cHJp dl9zYzsKLQlzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyX290aGVyID0gc2MtPnNjX3hmZXJfaWZfMFsx XTsKKwlub2RlX3AJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpz YzsKKwlzdHJ1Y3QgdXNiMl94ZmVyCSp4ZmVyX290aGVyOwogCisJaWYgKE5HX05PREVfTk9UX1ZB TElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVybjsgLyogbmV0Z3Jh cGggbm9kZSBpcyBnb25lICovCisJfQorCisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CisJ eGZlcl9vdGhlciA9IHNjLT5zY194ZmVyX2lmXzBbMV07CisKIAlpZiAodXNiMl9jbGVhcl9zdGFs bF9jYWxsYmFjayh4ZmVyLCB4ZmVyX290aGVyKSkgewogCQlEUFJJTlRGKCJzdGFsbCBjbGVhcmVk XG4iKTsKIAkJc2MtPnNjX2ZsYWdzICY9IH5VQlRfRkxBR19SRUFEX1NUQUxMOwogCQl1c2IyX3Ry YW5zZmVyX3N0YXJ0KHhmZXJfb3RoZXIpOwotCX0KLX0KKwl9IGVsc2UKKwkJTkdfTk9ERV9VTlJF Rihub2RlKTsgLyogWFhYIGNhbnQgY2xlYXIgc3RhbGwgKi8KK30gLyogdWJ0X2J1bGtfcmVhZF9j bGVhcl9zdGFsbF9jYWxsYmFjayAqLwogCisvKgorICogQ2FsbGVkIHdoZW4gb3V0Z29pbmcgYnVs ayB0cmFuc2ZlciAoQUNMIHBhY2tldCkgaGFzIGNvbXBsZXRlZCwgaS5lLgorICogQUNMIHBhY2tl dCB3YXMgc2VudCB0byB0aGUgZGV2aWNlLgorICogVVNCIGNvbnRleHQuCisgKi8KKwogc3RhdGlj IHZvaWQKLXVidF9idWxrX3JlYWRfY29tcGxldGUobm9kZV9wIG5vZGUsIGhvb2tfcCBob29rLCB2 b2lkICphcmcxLCBpbnQgYXJnMikKK3VidF9idWxrX3dyaXRlX2NhbGxiYWNrKHN0cnVjdCB1c2Iy X3hmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUo bm9kZSk7Ci0Jc3RydWN0IG1idWYgKm07Ci0JbmdfaGNpX2FjbGRhdGFfcGt0X3QgKmhkcjsKLQl1 aW50MTZfdCBsZW47Ci0JaW50IGVycm9yOworCW5vZGVfcAkJCW5vZGUgPSB4ZmVyLT5wcml2X3Nj OworCXN0cnVjdCB1YnRfc29mdGMJKnNjOworCXN0cnVjdCBtYnVmCQkqbTsKIAotCWlmIChzYyA9 PSBOVUxMKSB7Ci0JCXJldHVybjsKKwlpZiAoTkdfTk9ERV9OT1RfVkFMSUQobm9kZSkpIHsKKwkJ TkdfTk9ERV9VTlJFRihub2RlKTsKKwkJcmV0dXJuOyAvKiBuZXRncmFwaCBub2RlIGlzIGdvbmUg Ki8KIAl9Ci0JbXR4X2xvY2soJnNjLT5zY19tdHgpOwogCi0JbSA9IHNjLT5zY19idWxrX2luX2J1 ZmZlcjsKKwlzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKIAotCWlmIChtKSB7Ci0KLQkJc2Mt PnNjX2J1bGtfaW5fYnVmZmVyID0gTlVMTDsKLQotCQloZHIgPSBtdG9kKG0sIG5nX2hjaV9hY2xk YXRhX3BrdF90ICopOwotCi0JCWlmIChzYy0+c2NfaG9vayA9PSBOVUxMIHx8IE5HX0hPT0tfTk9U X1ZBTElEKHNjLT5zY19ob29rKSkgewotCQkJTkdfVUJUX0lORk8oc2MsICJObyB1cHN0cmVhbSBo b29rXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlOR19VQlRfU1RBVF9CWVRFU19SRUNWKHNj LT5zY19zdGF0LCBtLT5tX3BrdGhkci5sZW4pOwotCi0JCWlmIChtLT5tX3BrdGhkci5sZW4gPCBz aXplb2YoKmhkcikpIHsKLQkJCU5HX1VCVF9JTkZPKHNjLCAiUGFja2V0IHRvbyBzaG9ydFxuIik7 Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJbGVuID0gbGUxNnRvaChoZHItPmxlbmd0aCk7Ci0KLQkJ aWYgKGxlbiA9PSAobS0+bV9wa3RoZHIubGVuIC0gc2l6ZW9mKCpoZHIpKSkgewotCQkJTkdfVUJU X0lORk8oc2MsICJHb3QgY29tcGxldGUgQUNMIGRhdGEgZnJhbWUsICIKLQkJCSAgICAicGt0bGVu PSVkLCBsZW5ndGg9JWRcbiIsCi0JCQkgICAgbS0+bV9wa3RoZHIubGVuLCBsZW4pOwotCi0JCQlO R19VQlRfU1RBVF9QQ0tUU19SRUNWKHNjLT5zY19zdGF0KTsKLQotCQkJTkdfU0VORF9EQVRBX09O TFkoZXJyb3IsIHNjLT5zY19ob29rLCBtKTsKLQotCQkJbSA9IE5VTEw7Ci0KLQkJCWlmIChlcnJv ciAhPSAwKSB7Ci0JCQkJTkdfVUJUX1NUQVRfSUVSUk9SKHNjLT5zY19zdGF0KTsKLQkJCX0KLQkJ fSBlbHNlIHsKLQkJCU5HX1VCVF9FUlIoc2MsICJJbnZhbGlkIEFDTCBmcmFtZSBzaXplLCAiCi0J CQkgICAgImxlbmd0aD0lZCwgcGt0bGVuPSVkXG4iLAotCQkJICAgIGxlbiwgbS0+bV9wa3RoZHIu bGVuKTsKLQotCQkJTkdfVUJUX1NUQVRfSUVSUk9SKHNjLT5zY19zdGF0KTsKLQkJfQotCX0KLWRv bmU6Ci0JaWYgKG0pIHsKLQkJTkdfRlJFRV9NKG0pOwotCX0KLQkvKiBzdGFydCBVU0IgdHJhbnNm ZXIgaWYgbm90IGFscmVhZHkgc3RhcnRlZCAqLwotCi0JdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+ c2NfeGZlcl9pZl8wWzFdKTsKLQotCW10eF91bmxvY2soJnNjLT5zY19tdHgpOwotfQotCi1zdGF0 aWMgdm9pZAotdWJ0X2J1bGtfd3JpdGVfY2FsbGJhY2soc3RydWN0IHVzYjJfeGZlciAqeGZlcikK LXsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IHhmZXItPnByaXZfc2M7Ci0Jc3RydWN0IG1idWYg Km07Ci0KIAlzd2l0Y2ggKFVTQl9HRVRfU1RBVEUoeGZlcikpIHsKIAljYXNlIFVTQl9TVF9UUkFO U0ZFUlJFRDoKLQkJTkdfVUJUX0lORk8oc2MsICJzZW50ICVkIGJ5dGVzIHRvIGJ1bGstb3V0ICIK LQkJICAgICJwaXBlXG4iLCB4ZmVyLT5hY3RsZW4pOwotCQlOR19VQlRfU1RBVF9CWVRFU19TRU5U KHNjLT5zY19zdGF0LCB4ZmVyLT5hY3RsZW4pOwotCQlOR19VQlRfU1RBVF9QQ0tUU19TRU5UKHNj LT5zY19zdGF0KTsKKwkJaWYgKHhmZXItPmVycm9yICE9IDApCisJCQlVQlRfU1RBVF9PRVJST1Io c2MpOworCQllbHNlIHsKKwkJCVVCVF9JTkZPKHNjLCAic2VudCAlZCBieXRlcyB0byBidWxrLW91 dCBwaXBlXG4iLAorCQkJCXhmZXItPmFjdGxlbik7CiAKLQljYXNlIFVTQl9TVF9TRVRVUDoKLQkJ aWYgKHNjLT5zY19mbGFncyAmIFVCVF9GTEFHX1dSSVRFX1NUQUxMKSB7Ci0JCQl1c2IyX3RyYW5z ZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBbNF0pOwotCQkJcmV0dXJuOworCQkJVUJUX1NUQVRf QllURVNfU0VOVChzYywgeGZlci0+YWN0bGVuKTsKKwkJCVVCVF9TVEFUX1BDS1RTX1NFTlQoc2Mp OwogCQl9Ci0JCS8qIGdldCBuZXh0IG1idWYsIGlmIGFueSAqLworCQkvKiBGQUxMVEhST1VHSCAq LwogCisJY2FzZSBVU0JfU1RfU0VUVVA6CisJCS8qIEdldCBuZXh0IG1idWYsIGlmIGFueSAqLwor CQlVQlRfTUJVRlFfTE9DSyhzYyk7CiAJCU5HX0JUX01CVUZRX0RFUVVFVUUoJnNjLT5zY19hY2xx LCBtKTsKKwkJVUJUX01CVUZRX1VOTE9DSyhzYyk7CiAKIAkJaWYgKG0gPT0gTlVMTCkgewotCQkJ TkdfVUJUX0lORk8oc2MsICJBQ0wgZGF0YSBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCQlyZXR1cm47 CisJCQlVQlRfSU5GTyhzYywgIkFDTCBkYXRhIHF1ZXVlIGlzIGVtcHR5XG4iKTsKKwkJCU5HX05P REVfVU5SRUYobm9kZSk7CisJCQlyZXR1cm47IC8qIHRyYW5zZmVyIGNvbXBsZXRlZCAqLwogCQl9 CisKIAkJLyoKLQkJICogY2hlY2sgQUNMIGRhdGEgZnJhbWUgc2l6ZSBhbmQKLQkJICogY29weSBp dCBiYWNrIHRvIGEgbGluZWFyIFVTQgotCQkgKiB0cmFuc2ZlciBidWZmZXI6CisJCSAqIENvcHkg QUNMIGRhdGEgZnJhbWUgYmFjayB0byBhIGxpbmVhciBVU0IgdHJhbnNmZXIgYnVmZmVyCisJCSAq IGFuZCBzY2hlZHVsZSB0cmFuc2ZlcgogCQkgKi8KIAotCQlpZiAobS0+bV9wa3RoZHIubGVuID4g VUJUX0JVTEtfV1JJVEVfQlVGRkVSX1NJWkUpIHsKLQkJCXBhbmljKCJBQ0wgZGF0YSBmcmFtZSB0 b28gYmlnLCBzaXplPSVkLCBsZW49JWRcbiIsCi0JCQkgICAgVUJUX0JVTEtfV1JJVEVfQlVGRkVS X1NJWkUsCi0JCQkgICAgbS0+bV9wa3RoZHIubGVuKTsKLQkJfQogCQl1c2IyX21fY29weV9pbih4 ZmVyLT5mcmJ1ZmZlcnMsIDAsIG0sIDAsIG0tPm1fcGt0aGRyLmxlbik7CisJCXhmZXItPmZybGVu Z3Roc1swXSA9IG0tPm1fcGt0aGRyLmxlbjsKIAotCQlOR19VQlRfSU5GTyhzYywgImJ1bGstb3V0 IHRyYW5zZmVyIGhhcyBiZWVuIHN0YXJ0ZWQsICIKLQkJICAgICJsZW49JWRcbiIsIG0tPm1fcGt0 aGRyLmxlbik7CisJCVVCVF9JTkZPKHNjLCAiYnVsay1vdXQgdHJhbnNmZXIgaGFzIGJlZW4gc3Rh cnRlZCwgbGVuPSVkXG4iLAorCQkJbS0+bV9wa3RoZHIubGVuKTsKIAotCQl4ZmVyLT5mcmxlbmd0 aHNbMF0gPSBtLT5tX3BrdGhkci5sZW47Ci0KIAkJTkdfRlJFRV9NKG0pOwogCiAJCXVzYjJfc3Rh cnRfaGFyZHdhcmUoeGZlcik7Ci0JCXJldHVybjsKKwkJYnJlYWs7CiAKLQlkZWZhdWx0OgkJCS8q IEVycm9yICovCisJZGVmYXVsdDogLyogRXJyb3IgKi8KIAkJaWYgKHhmZXItPmVycm9yICE9IFVT Ql9FUlJfQ0FOQ0VMTEVEKSB7CisJCQlVQlRfV0FSTihzYywgImJ1bGstb3V0IHRyYW5zZmVyIGZh aWxlZDogJXNcbiIsCisJCQkJdXNiMl9lcnJzdHIoeGZlci0+ZXJyb3IpKTsKIAotCQkJTkdfVUJU X1dBUk4oc2MsICJidWxrLW91dCB0cmFuc2ZlciBmYWlsZWQ6ICVzXG4iLAotCQkJICAgIHVzYjJf ZXJyc3RyKHhmZXItPmVycm9yKSk7CisJCQlVQlRfU1RBVF9PRVJST1Ioc2MpOwogCi0JCQlOR19V QlRfU1RBVF9PRVJST1Ioc2MtPnNjX3N0YXQpOwotCiAJCQkvKiB0cnkgdG8gY2xlYXIgc3RhbGwg Zmlyc3QgKi8KIAkJCXNjLT5zY19mbGFncyB8PSBVQlRfRkxBR19XUklURV9TVEFMTDsKIAkJCXVz YjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMFs0XSk7Ci0JCX0KLQkJcmV0dXJuOwot CisJCX0gZWxzZQorCQkJTkdfTk9ERV9VTlJFRihub2RlKTsgLyogdHJhbnNmZXIgY2FuY2VsbGVk ICovCisJCWJyZWFrOwogCX0KLX0KK30gLyogdWJ0X2J1bGtfd3JpdGVfY2FsbGJhY2sgKi8KIAor LyoKKyAqIENhbGxlZCB3aGVuIG91dGdvaW5nIGNvbnRyb2wgdHJhbnNmZXIgaW5pdGlhdGVkIHRv IGNsZWFyIHN0YWxsIG9uCisgKiBvdXRnb2luZyBidWxrIHBpcGUgaGFzIGNvbXBsZXRlZC4KKyAq IFVTQiBjb250ZXh0LgorICovCisKIHN0YXRpYyB2b2lkCiB1YnRfYnVsa193cml0ZV9jbGVhcl9z dGFsbF9jYWxsYmFjayhzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29m dGMgKnNjID0geGZlci0+cHJpdl9zYzsKLQlzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyX290aGVyID0g c2MtPnNjX3hmZXJfaWZfMFswXTsKKwlub2RlX3AJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlz dHJ1Y3QgdWJ0X3NvZnRjCSpzYzsKKwlzdHJ1Y3QgdXNiMl94ZmVyCSp4ZmVyX290aGVyOwogCisJ aWYgKE5HX05PREVfTk9UX1ZBTElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJ CXJldHVybjsgLyogbmV0Z3JhcGggbm9kZSBpcyBnb25lICovCisJfQorCisJc2MgPSBOR19OT0RF X1BSSVZBVEUobm9kZSk7CisJeGZlcl9vdGhlciA9IHNjLT5zY194ZmVyX2lmXzBbMF07CisKIAlp ZiAodXNiMl9jbGVhcl9zdGFsbF9jYWxsYmFjayh4ZmVyLCB4ZmVyX290aGVyKSkgewogCQlEUFJJ TlRGKCJzdGFsbCBjbGVhcmVkXG4iKTsKIAkJc2MtPnNjX2ZsYWdzICY9IH5VQlRfRkxBR19XUklU RV9TVEFMTDsKIAkJdXNiMl90cmFuc2Zlcl9zdGFydCh4ZmVyX290aGVyKTsKLQl9Ci19CisJfSBl bHNlCisJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIFhYWCBjYW50IGNsZWFyIHN0YWxsICovCit9 IC8qIHVidF9idWxrX3dyaXRlX2NsZWFyX3N0YWxsX2NhbGxiYWNrICovCiAKKy8qCisgKiBDYWxs ZWQgd2hlbiBpbmNvbWluZyBpc29jIHRyYW5zZmVyIChTQ08gcGFja2V0KSBoYXMgY29tcGxldGVk LCBpLmUuCisgKiBTQ08gcGFja2V0IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBV U0IgY29udGV4dC4KKyAqLworCiBzdGF0aWMgdm9pZAogdWJ0X2lzb2NfcmVhZF9jYWxsYmFjayhz dHJ1Y3QgdXNiMl94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0geGZlci0+ cHJpdl9zYzsKLQluZ19oY2lfc2NvZGF0YV9wa3RfdCBoZHI7Ci0Jc3RydWN0IG1idWYgKm07Ci0J dWludDhfdCAqcHRyOwotCXVpbnQzMl90IG1heF9sZW47Ci0JdWludDMyX3QgbjsKLQl1aW50MzJf dCBvZmZzZXQ7CisJbm9kZV9wCQkJbm9kZSA9IHhmZXItPnByaXZfc2M7CisJc3RydWN0IHVidF9z b2Z0Ywkqc2M7CisJaW50CQkJbjsKIAorCWlmIChOR19OT0RFX05PVF9WQUxJRChub2RlKSkgewor CQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29u ZSAqLworCX0KKworCXNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUpOworCisJaWYgKChzYy0+c2Nf aG9vayA9PSBOVUxMKSB8fCBOR19IT09LX05PVF9WQUxJRChzYy0+c2NfaG9vaykpIHsKKwkJVUJU X0lORk8oc2MsICJubyB1cHN0cmVhbSBob29rXG4iKTsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsK KwkJcmV0dXJuOyAvKiB1cHN0cmVhbSBob29rIGlzIGdvbmUgKi8KKwl9CisKIAlzd2l0Y2ggKFVT Ql9HRVRfU1RBVEUoeGZlcikpIHsKIAljYXNlIFVTQl9TVF9UUkFOU0ZFUlJFRDoKLXRyX3RyYW5z ZmVycmVkOgotCQlvZmZzZXQgPSAwOworCQlmb3IgKG4gPSAwOyBuIDwgeGZlci0+bmZyYW1lczsg biArKykKKwkJCWlmICh1YnRfaXNvY19yZWFkX29uZV9mcmFtZSh4ZmVyLCBuKSA8IDApCisJCQkJ YnJlYWs7CisJCS8qIEZBTExUSFJPVUdIICovCiAKLQkJZm9yIChuID0gMDsgbiA8IHhmZXItPm5m cmFtZXM7IG4rKykgeworCWNhc2UgVVNCX1NUX1NFVFVQOgorcmVhZF9uZXh0OgorCQlmb3IgKG4g PSAwOyBuIDwgeGZlci0+bmZyYW1lczsgbiArKykKKwkJCXhmZXItPmZybGVuZ3Roc1tuXSA9IHhm ZXItPm1heF9mcmFtZV9zaXplOwogCi0JCQlpZiAoeGZlci0+ZnJsZW5ndGhzW25dID49IHNpemVv ZihoZHIpKSB7CisJCXVzYjJfc3RhcnRfaGFyZHdhcmUoeGZlcik7CisJCWJyZWFrOwogCi0JCQkJ dXNiMl9jb3B5X291dCh4ZmVyLT5mcmJ1ZmZlcnMsIG9mZnNldCwKLQkJCQkgICAgJmhkciwgc2l6 ZW9mKGhkcikpOworCWRlZmF1bHQ6IC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgaWYgKHhm ZXItPmVycm9yICE9IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAg ICBVQlRfU1RBVF9JRVJST1Ioc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFk X25leHQ7CisJCQkvKiBOT1QgUkVBQ0hFRCAqLworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlm IChoZHIubGVuZ3RoID09ICh4ZmVyLT5mcmxlbmd0aHNbbl0gLSBzaXplb2YoaGRyKSkpIHsKKwkJ TkdfTk9ERV9VTlJFRihub2RlKTsgLyogdHJhbnNmZXIgaXMgY2FuY2VsbGVkICovCisJCWJyZWFr OworCX0KK30gLyogdWJ0X2lzb2NfcmVhZF9jYWxsYmFjayAqLwogCi0JCQkJCU5HX1VCVF9JTkZP KHNjLCAiZ290IGNvbXBsZXRlIFNDTyBkYXRhICIKLQkJCQkJICAgICJmcmFtZSwgbGVuZ3RoPSVk XG4iLCBoZHIubGVuZ3RoKTsKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24uIENhbGxlZCBmcm9tIHVi dF9pc29jX3JlYWRfY2FsbGJhY2soKSB0byByZWFkCisgKiBTQ08gZGF0YSBmcm9tIG9uZSBmcmFt ZS4KKyAqIFVTQiBjb250ZXh0LgorICovCiAKLQkJCQkJaWYgKCFOR19CVF9NQlVGUV9GVUxMKCZz Yy0+c2Nfc2NpcSkpIHsKK3N0YXRpYyBpbnQKK3VidF9pc29jX3JlYWRfb25lX2ZyYW1lKHN0cnVj dCB1c2IyX3hmZXIgKnhmZXIsIHVpbnQzMl90IGZyYW1lX25vKQoreworCXN0cnVjdCB1YnRfc29m dGMJKnNjID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1Y3QgbWJ1ZgkJKm07CisJaW50CQkJbGVuLCB3 YW50LCBnb3QsIGVycm9yOwogCi0JCQkJCQkvKiBhbGxvY2F0ZSBhIG5ldyBtYnVmICovCisJLyog R2V0IGV4aXN0aW5nIFNDTyByZWFzc2VtYmx5IGJ1ZmZlciAqLworCW0gPSBzYy0+c2NfaXNvY19p bl9idWZmZXI7CisJc2MtPnNjX2lzb2NfaW5fYnVmZmVyID0gTlVMTDsKIAotCQkJCQkJTUdFVEhE UihtLCBNX0RPTlRXQUlULCBNVF9EQVRBKTsKKwkvKiBXaGlsZSB3ZSBoYXZlIGRhdGEgaW4gdGhl IGZyYW1lICovCisJd2hpbGUgKChsZW4gPSB4ZmVyLT5mcmxlbmd0aHNbZnJhbWVfbm9dKSA+IDAp IHsKKwkJaWYgKG0gPT0gTlVMTCkgeworCQkJLyogU3RhcnQgbmV3IHJlYXNzZW1ibHkgYnVmZmVy ICovCisJCQlNR0VUSERSKG0sIE1fRE9OVFdBSVQsIE1UX0RBVEEpOworCQkJaWYgKG0gPT0gTlVM TCkgeworCQkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CisJCQkJcmV0dXJuICgtMSk7CS8qIFhYWCBv dXQgb2Ygc3luYyEgKi8KKwkJCX0KIAotCQkJCQkJaWYgKG0gPT0gTlVMTCkgewotCQkJCQkJCWdv dG8gdHJfc2V0dXA7Ci0JCQkJCQl9Ci0JCQkJCQlNQ0xHRVQobSwgTV9ET05UV0FJVCk7CisJCQlN Q0xHRVQobSwgTV9ET05UV0FJVCk7CisJCQlpZiAoIShtLT5tX2ZsYWdzICYgTV9FWFQpKSB7CisJ CQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsKKwkJCQlOR19GUkVFX00obSk7CisJCQkJcmV0dXJuICgt MSk7CS8qIFhYWCBvdXQgb2Ygc3luYyEgKi8KKwkJCX0KIAotCQkJCQkJaWYgKCEobS0+bV9mbGFn cyAmIE1fRVhUKSkgewotCQkJCQkJCU5HX0ZSRUVfTShtKTsKLQkJCQkJCQlnb3RvIHRyX3NldHVw OwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIGZpeCBTQ08gZGF0YSBmcmFtZSBoZWFkZXIK LQkJCQkJCSAqIGlmIHJlcXVpcmVkCi0JCQkJCQkgKi8KKwkJCS8qIEV4cGVjdCBTQ08gaGVhZGVy ICovCisJCQkqbXRvZChtLCB1aW50OF90ICopID0gTkdfSENJX1NDT19EQVRBX1BLVDsKKwkJCW0t Pm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gZ290ID0gMTsKKwkJCXdhbnQgPSBzaXplb2Yobmdf aGNpX3Njb2RhdGFfcGt0X3QpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENoZWNrIGlmIHdl IGhhdmUgU0NPIGhlYWRlciBhbmQgaWYgc28gCisJCQkgKiBhZGp1c3QgYW1vdW50IG9mIGRhdGEg d2Ugd2FudAorCQkJICovCisJCQlnb3QgPSBtLT5tX3BrdGhkci5sZW47CisJCQl3YW50ID0gc2l6 ZW9mKG5nX2hjaV9zY29kYXRhX3BrdF90KTsKIAotCQkJCQkJaWYgKCEoc2MtPnNjX2ZsYWdzICYg VUJUX0hBVkVfRlJBTUVfVFlQRSkpIHsKLQkJCQkJCQkqbXRvZChtLCB1aW50OF90ICopPSBOR19I Q0lfU0NPX0RBVEFfUEtUOwotCQkJCQkJCW0tPm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gMTsK LQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbS0+bV9wa3RoZHIubGVuID0gbS0+bV9sZW4gPSAwOwot CQkJCQkJfQorCQkJaWYgKGdvdCA+PSB3YW50KQorCQkJCXdhbnQgKz0gbXRvZChtLCBuZ19oY2lf c2NvZGF0YV9wa3RfdCAqKS0+bGVuZ3RoOworCQl9CiAKLQkJCQkJCW1heF9sZW4gPSAoTUNMQllU RVMgLSBtLT5tX2xlbik7CisJCS8qIEFwcGVuZCBmcmFtZSBkYXRhIHRvIHRoZSBTQ08gcmVhc3Nl bWJseSBidWZmZXIgKi8KKwkJaWYgKGdvdCArIGxlbiA+IHdhbnQpCisJCQlsZW4gPSB3YW50IC0g Z290OwogCi0JCQkJCQlpZiAoeGZlci0+ZnJsZW5ndGhzW25dID4gbWF4X2xlbikgewotCQkJCQkJ CXhmZXItPmZybGVuZ3Roc1tuXSA9IG1heF9sZW47Ci0JCQkJCQl9Ci0JCQkJCQlwdHIgPSAoKHVp bnQ4X3QgKikobS0+bV9kYXRhKSkgKyBtLT5tX2xlbjsKKwkJdXNiMl9jb3B5X291dCh4ZmVyLT5m cmJ1ZmZlcnMsIGZyYW1lX25vICogeGZlci0+bWF4X2ZyYW1lX3NpemUsCisJCQltdG9kKG0sIHVp bnQ4X3QgKikgKyBtLT5tX3BrdGhkci5sZW4sIGxlbik7CiAKLQkJCQkJCXVzYjJfY29weV9vdXQK LQkJCQkJCSAgICAoeGZlci0+ZnJidWZmZXJzLCBvZmZzZXQsCi0JCQkJCQkgICAgcHRyLCB4ZmVy LT5mcmxlbmd0aHNbbl0pOworCQltLT5tX3BrdGhkci5sZW4gKz0gbGVuOworCQltLT5tX2xlbiAr PSBsZW47CisJCXhmZXItPmZybGVuZ3Roc1tmcmFtZV9ub10gLT0gbGVuOwogCi0JCQkJCQltLT5t X3BrdGhkci5sZW4gKz0geGZlci0+ZnJsZW5ndGhzW25dOwotCQkJCQkJbS0+bV9sZW4gKz0geGZl ci0+ZnJsZW5ndGhzW25dOworCQkvKiBDaGVjayBpZiB3ZSBnb3QgZXZlcnl0aGluZyB3ZSB3YW50 ZWQsIGlmIG5vdCAtIGNvbnRpbnVlICovCisJCWlmIChnb3QgIT0gd2FudCkKKwkJCWNvbnRpbnVl OwogCi0JCQkJCQlOR19CVF9NQlVGUV9FTlFVRVVFKCZzYy0+c2Nfc2NpcSwgbSk7Ci0JCQkJCX0K LQkJCQl9Ci0JCQl9Ci0JCQlvZmZzZXQgKz0geGZlci0+bWF4X2ZyYW1lX3NpemU7CisJCS8qIElm IHdlIGdvdCBoZXJlIHRoZW4gd2UgZ290IGNvbXBsZXRlIFNDTyBmcmFtZSAqLworCQlVQlRfSU5G TyhzYywgImdvdCBjb21wbGV0ZSBTQ08gZGF0YSBmcmFtZSwgcGt0bGVuPSVkLCAiIFwKKwkJCSJs ZW5ndGg9JWRcbiIsIG0tPm1fcGt0aGRyLmxlbiwKKwkJCW10b2QobSwgbmdfaGNpX3Njb2RhdGFf cGt0X3QgKiktPmxlbmd0aCk7CisKKwkJVUJUX1NUQVRfUENLVFNfUkVDVihzYyk7CisJCVVCVF9T VEFUX0JZVEVTX1JFQ1Yoc2MsIG0tPm1fcGt0aGRyLmxlbik7CisKKwkJTkdfU0VORF9EQVRBX09O TFkoZXJyb3IsIHNjLT5zY19ob29rLCBtKTsKKwkJaWYgKGVycm9yICE9IDApCisJCQlVQlRfU1RB VF9JRVJST1Ioc2MpOworCisJCS8qIG0gPT0gTlVMTCBhdCB0aGlzIHBvaW50ICovCisJfQorCisJ LyogUHV0IFNDTyByZWFzc2VtYmx5IGJ1ZmZlciBiYWNrICovCisJc2MtPnNjX2lzb2NfaW5fYnVm ZmVyID0gbTsKKworCXJldHVybiAoMCk7Cit9IC8qIHVidF9pc29jX3JlYWRfb25lX2ZyYW1lICov CisKKy8qCisgKiBDYWxsZWQgd2hlbiBvdXRnb2luZyBpc29jIHRyYW5zZmVyIChTQ08gcGFja2V0 KSBoYXMgY29tcGxldGVkLCBpLmUuCisgKiBTQ08gcGFja2V0IHdhcyBzZW50IHRvIHRoZSBkZXZp Y2UuCisgKiBVU0IgY29udGV4dC4KKyAqLworCitzdGF0aWMgdm9pZAordWJ0X2lzb2Nfd3JpdGVf Y2FsbGJhY2soc3RydWN0IHVzYjJfeGZlciAqeGZlcikKK3sKKwlub2RlX3AJCQlub2RlID0geGZl ci0+cHJpdl9zYzsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYzsKKwlzdHJ1Y3QgbWJ1ZgkJKm07CisJ dWludDMyX3QJCW4sIHNwYWNlLCBvZmZzZXQ7CisKKwlpZiAoTkdfTk9ERV9OT1RfVkFMSUQobm9k ZSkpIHsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsKKwkJcmV0dXJuOyAvKiBuZXRncmFwaCBub2Rl IGlzIGdvbmUgKi8KKwl9CisKKwlzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKKworCXN3aXRj aCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkgeworCWNhc2UgVVNCX1NUX1RSQU5TRkVSUkVEOgorCQlp ZiAoeGZlci0+ZXJyb3IpCisJCQlVQlRfU1RBVF9PRVJST1Ioc2MpOworCQllbHNlIHsKKwkJCVVC VF9JTkZPKHNjLCAic2VudCAlZCBieXRlcyB0byBpc29jLW91dCBwaXBlXG4iLAorCQkJCXhmZXIt PmFjdGxlbik7CisKKwkJCVVCVF9TVEFUX0JZVEVTX1NFTlQoc2MsIHhmZXItPmFjdGxlbik7CisJ CQlVQlRfU1RBVF9QQ0tUU19TRU5UKHNjKTsKIAkJfQorCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJ Y2FzZSBVU0JfU1RfU0VUVVA6Ci10cl9zZXR1cDoKK3NlbmRfbmV4dDoKKwkJb2Zmc2V0ID0gMDsK KwkJc3BhY2UgPSB4ZmVyLT5tYXhfZnJhbWVfc2l6ZSAqIHhmZXItPm5mcmFtZXM7CisJCW0gPSBO VUxMOwogCi0JCWlmIChOR19CVF9NQlVGUV9MRU4oJnNjLT5zY19zY2lxKSA+IDApIHsKLQkJCW5n X3NlbmRfZm4oc2MtPnNjX25vZGUsIE5VTEwsIHVidF9pc29jX3JlYWRfY29tcGxldGUsIE5VTEws IDApOworCQl3aGlsZSAoc3BhY2UgPiAwKSB7CisJCQlpZiAobSA9PSBOVUxMKSB7CisJCQkJVUJU X01CVUZRX0xPQ0soc2MpOworCQkJCU5HX0JUX01CVUZRX0RFUVVFVUUoJnNjLT5zY19zY29xLCBt KTsKKwkJCQlVQlRfTUJVRlFfVU5MT0NLKHNjKTsKKworCQkJCWlmIChtID09IE5VTEwpCisJCQkJ CWJyZWFrOworCQkJfQorCisJCQluID0gbWluKHNwYWNlLCBtLT5tX3BrdGhkci5sZW4pOworCQkJ aWYgKG4gPiAwKSB7CisJCQkJdXNiMl9tX2NvcHlfaW4oeGZlci0+ZnJidWZmZXJzLG9mZnNldCwg bSwwLCBuKTsKKwkJCQltX2FkaihtLCBuKTsKKworCQkJCW9mZnNldCArPSBuOworCQkJCXNwYWNl IC09IG47CisJCQl9CisKKwkJCWlmIChtLT5tX3BrdGhkci5sZW4gPT0gMCkKKwkJCQlOR19GUkVF X00obSk7CiAJCX0KLQkJZm9yIChuID0gMDsgbiA8IHhmZXItPm5mcmFtZXM7IG4rKykgewotCQkJ eGZlci0+ZnJsZW5ndGhzW25dID0geGZlci0+bWF4X2ZyYW1lX3NpemU7CisKKwkJaWYgKG9mZnNl dCA9PSAwKSB7CisJCQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQkJcmV0dXJuOyAvKiBub3RoaW5n IHRvIHNlbmQgKi8KIAkJfQogCisJCS8qIFB1dCB3aGF0ZXZlciBpcyBsZWZ0IGZyb20gbWJ1ZiBi YWNrIG9uIHF1ZXVlICovCisJCWlmIChtICE9IE5VTEwpIHsKKwkJCVVCVF9NQlVGUV9MT0NLKHNj KTsKKwkJCU5HX0JUX01CVUZRX1BSRVBFTkQoJnNjLT5zY19zY29xLCBtKTsKKwkJCVVCVF9NQlVG UV9VTkxPQ0soc2MpOworCQl9CisKKwkJLyogQ2FsY3VsYXRlIHNpemVkIGZvciBpc29jIGZyYW1l cyAqLworCQlmb3IgKG4gPSAwOyBvZmZzZXQgPiAwOyBuICsrKSB7CisJCQl4ZmVyLT5mcmxlbmd0 aHNbbl0gPSBtaW4ob2Zmc2V0LCB4ZmVyLT5tYXhfZnJhbWVfc2l6ZSk7CisJCQlvZmZzZXQgLT0g eGZlci0+bWF4X2ZyYW1lX3NpemU7CisJCX0KKwogCQl1c2IyX3N0YXJ0X2hhcmR3YXJlKHhmZXIp OwotCQlyZXR1cm47CisJCWJyZWFrOwogCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLwotCQlpZiAo eGZlci0+ZXJyb3IgPT0gVVNCX0VSUl9DQU5DRUxMRUQpIHsKLQkJCS8qIGlnbm9yZSAqLwotCQkJ cmV0dXJuOworCWRlZmF1bHQ6IC8qIEVycm9yICovCisJCWlmICh4ZmVyLT5lcnJvciAhPSBVU0Jf RVJSX0NBTkNFTExFRCkgeworCQkJVUJUX1NUQVRfT0VSUk9SKHNjKTsKKwkJCWdvdG8gc2VuZF9u ZXh0OworCQkJLyogTk9UIFJFQUNIRUQgKi8KIAkJfQotCQlnb3RvIHRyX3RyYW5zZmVycmVkOwor CisJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIHRyYW5zZmVyIGNhbmNlbGxlZCAqLworCQlicmVh azsKIAl9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x1ZSAKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNjaGVkdWxlIGdsdWUgdGFz ay4gU2hvdWxkIGJlIGNhbGxlZCB3aXRoIHNjX21idWZxX210eCBoZWxkLgorICogTmV0Z3JhcGgg Y29udGV4dC4KKyAqLworCitzdGF0aWMgaW50Cit1YnRfdGFza19zY2hlZHVsZSh1YnRfc29mdGNf cCBzYywgdWludDMyX3QgYWN0aW9uKQoreworCW10eF9hc3NlcnQoJnNjLT5zY19tYnVmcV9tdHgs IE1BX09XTkVEKTsKKworCWlmICgoc2MtPnNjX3Rhc2tfZmxhZ3MgJiBhY3Rpb24pID09IDApIHsK KwkJLyoKKwkJICogVHJ5IHRvIGhhbmRsZSBjb3JuZXIgY2FzZSB3aGVuICJzdGFydCBhbGwiIGFu ZCAic3RvcCBhbGwiCisJCSAqIGFjdGlvbnMgY2FuIGJvdGggYmUgc2V0IGJlZm9yZSB0YXNrIGlz IGV4ZWN1dGVkLgorCQkgKgorCQkgKiBBc3N1bWUgdGhlIGZvbGxvd2luZzoKKwkJICogMSkgInN0 b3AgYWxsIiBhZnRlciAic3RhcnQgYWxsIiBjYW5jZWxzICJzdGFydCBhbGwiLCBhbmQsCisJCSAq ICAgIGtlZXBzICJzdG9wIGFsbCIKKwkJICoKKwkJICogMikgInN0YXJ0IGFsbCIgYWZ0ZXIgInN0 b3AgYWxsIiBpcyBmaW5lIGJlY2F1c2UgdGFzayBpcworCQkgKiBleGVjdXRpbmcgInN0b3AgYWxs IiBmaXJzdAorCQkgKi8KKworCQlpZiAoYWN0aW9uID09IFVCVF9GTEFHX1RfU1RPUF9BTEwgJiYK KwkJICAgIChzYy0+c2NfdGFza19mbGFncyAmIFVCVF9GTEFHX1RfU1RBUlRfQUxMKSAhPSAwKQor CQkJc2MtPnNjX3Rhc2tfZmxhZ3MgJj0gflVCVF9GTEFHX1RfU1RBUlRfQUxMOworCisJCXNjLT5z Y190YXNrX2ZsYWdzIHw9IGFjdGlvbjsKKwl9CisKKwlpZiAoc2MtPnNjX3Rhc2tfZmxhZ3MgJiBV QlRfRkxBR19UX1BFTkRJTkcpCisJCXJldHVybiAoMSk7CisKKwlpZiAodGFza3F1ZXVlX2VucXVl dWUodGFza3F1ZXVlX3N3aSwgJnNjLT5zY190YXNrKSA9PSAwKSB7CisJCU5HX05PREVfUkVGKHNj LT5zY19ub2RlKTsKKwkJc2MtPnNjX3Rhc2tfZmxhZ3MgfD0gVUJUX0ZMQUdfVF9QRU5ESU5HOwor CQlyZXR1cm4gKDEpOworCX0KKworCS8qIFhYWDogaSB0aGluayB0aGlzIHNob3VsZCBuZXZlciBo YXBwZW4gKi8KKworCXJldHVybiAoMCk7Cit9IC8qIHVidF90YXNrX3NjaGVkdWxlICovCisKKy8q CisgKiBHbHVlIHRhc2suIEV4YW1pbmVzIHNjX3Rhc2tfZmxhZ3MgYW5kIGRvZXMgdGhpbmdzIGRl cGVuZGluZyBvbiBpdC4KKyAqIFRhc2txdWV1ZSBjb250ZXh0LgorICovCisKIHN0YXRpYyB2b2lk Ci11YnRfaXNvY19yZWFkX2NvbXBsZXRlKG5vZGVfcCBub2RlLCBob29rX3AgaG9vaywgdm9pZCAq YXJnMSwgaW50IGFyZzIpCit1YnRfdGFzayh2b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKIHsK LQl1YnRfc29mdGNfcCBzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKLQlzdHJ1Y3QgbWJ1ZiAq bTsKLQlpbnQgZXJyb3I7CisJbm9kZV9wCQlub2RlID0gY29udGV4dDsKKwl1YnRfc29mdGNfcAlz YzsKKwl1aW50MzJfdAl0YXNrX2ZsYWdzOwogCi0JaWYgKHNjID09IE5VTEwpIHsKLQkJcmV0dXJu OworCWlmIChOR19OT0RFX05PVF9WQUxJRChub2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5vZGUp OworCQlyZXR1cm47IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLwogCX0KLQltdHhfbG9jaygm c2MtPnNjX210eCk7CiAKLQl3aGlsZSAoMSkgeworCXNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUp OwogCi0JCU5HX0JUX01CVUZRX0RFUVVFVUUoJnNjLT5zY19zY2lxLCBtKTsKKwlVQlRfTUJVRlFf TE9DSyhzYyk7CisJdGFza19mbGFncyA9IHNjLT5zY190YXNrX2ZsYWdzOworCXNjLT5zY190YXNr X2ZsYWdzID0gMDsKKwlVQlRfTUJVRlFfVU5MT0NLKHNjKTsKIAotCQlpZiAobSA9PSBOVUxMKSB7 Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2MtPnNjX2hvb2sgPT0gTlVMTCB8fCBOR19IT09LX05P VF9WQUxJRChzYy0+c2NfaG9vaykpIHsKLQkJCU5HX1VCVF9JTkZPKHNjLCAiTm8gdXBzdHJlYW0g aG9va1xuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJTkdfVUJUX0lORk8oc2MsICJHb3QgY29t cGxldGUgU0NPIGRhdGEgZnJhbWUsICIKLQkJICAgICJwa3RsZW49JWQgYnl0ZXNcbiIsIG0tPm1f cGt0aGRyLmxlbik7CisJLyogU3RvcCBhbGwgVVNCIHRyYW5zZmVycyAqLworCWlmICh0YXNrX2Zs YWdzICYgVUJUX0ZMQUdfVF9TVE9QX0FMTCkgeworCQkvKgorCQkgKiBJbnRlcmZhY2UgIzAKKwkJ ICovCiAKLQkJTkdfVUJUX1NUQVRfUENLVFNfUkVDVihzYy0+c2Nfc3RhdCk7Ci0JCU5HX1VCVF9T VEFUX0JZVEVTX1JFQ1Yoc2MtPnNjX3N0YXQsIG0tPm1fcGt0aGRyLmxlbik7CisJCW10eF9sb2Nr KCZzYy0+c2NfaWZfMF9tdHgpOwogCi0JCU5HX1NFTkRfREFUQV9PTkxZKGVycm9yLCBzYy0+c2Nf aG9vaywgbSk7CisJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2NfeGZlcl9pZl8wWzBdKTsgLyog YnVsayBvdXQgKi8KKwkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzBbMV0pOyAv KiBidWxrIGluICovCisJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2NfeGZlcl9pZl8wWzJdKTsg LyogaW50ciBpbiAqLworCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFszXSk7 IC8qIGN0cmwgb3V0ICovCisJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2NfeGZlcl9pZl8wWzRd KTsKKwkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzBbNV0pOworCQl1c2IyX3Ry YW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFs2XSk7CiAKLQkJbSA9IE5VTEw7CisJCW10eF91 bmxvY2soJnNjLT5zY19pZl8wX210eCk7CiAKLQkJaWYgKGVycm9yKSB7Ci0JCQlOR19VQlRfU1RB VF9JRVJST1Ioc2MtPnNjX3N0YXQpOwotCQl9Ci1kb25lOgotCQlpZiAobSkgewotCQkJTkdfRlJF RV9NKG0pOwotCQl9CisJCS8qCisJCSAqIEludGVyZmFjZSAjMQorCQkgKi8KKworCQltdHhfbG9j aygmc2MtPnNjX2lmXzFfbXR4KTsKKworCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJf aWZfMVswXSk7IC8qIGlzb2MgaW4gIzEgKi8KKwkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194 ZmVyX2lmXzFbMV0pOyAvKiBpc29jIGluICMyICovCisJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+ c2NfeGZlcl9pZl8xWzJdKTsgLyogaXNvYyBvdXQgIzEgKi8KKwkJdXNiMl90cmFuc2Zlcl9zdG9w KHNjLT5zY194ZmVyX2lmXzFbM10pOyAvKiBpc29jIG91dCAjMiAqLworCisJCW10eF91bmxvY2so JnNjLT5zY19pZl8xX210eCk7CiAJfQogCi0JbXR4X3VubG9jaygmc2MtPnNjX210eCk7Ci19CisJ LyogU3RhcnQgYWxsIGluY29taW5nIFVTQiB0cmFuc2ZlcnMgKi8KKwlpZiAodGFza19mbGFncyAm IFVCVF9GTEFHX1RfU1RBUlRfQUxMKSB7CisJCS8qCisJCSAqIEludGVyZmFjZSAjMAorCQkgKi8K IAotc3RhdGljIHZvaWQKLXVidF9pc29jX3dyaXRlX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIg KnhmZXIpCi17Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVyLT5wcml2X3NjOwotCXN0cnVj dCBtYnVmICptOwotCXVpbnQzMl90IG47Ci0JdWludDMyX3QgbGVuOwotCXVpbnQzMl90IG9mZnNl dDsKKwkJbXR4X2xvY2soJnNjLT5zY19pZl8wX210eCk7CiAKLQlzd2l0Y2ggKFVTQl9HRVRfU1RB VEUoeGZlcikpIHsKLQljYXNlIFVTQl9TVF9UUkFOU0ZFUlJFRDoKLXRyX3RyYW5zZmVycmVkOgot CQlpZiAoeGZlci0+ZXJyb3IpIHsKLQkJCU5HX1VCVF9TVEFUX09FUlJPUihzYy0+c2Nfc3RhdCk7 Ci0JCX0gZWxzZSB7Ci0JCQlOR19VQlRfU1RBVF9CWVRFU19TRU5UKHNjLT5zY19zdGF0LCB4ZmVy LT5hY3RsZW4pOwotCQkJTkdfVUJUX1NUQVRfUENLVFNfU0VOVChzYy0+c2Nfc3RhdCk7Ci0JCX0K KwkJTkdfTk9ERV9SRUYobm9kZSk7CisJCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJf aWZfMFsxXSk7IC8qIGJ1bGsgaW4gKi8KIAotCWNhc2UgVVNCX1NUX1NFVFVQOgotCQlvZmZzZXQg PSAwOworCQlOR19OT0RFX1JFRihub2RlKTsKKwkJdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2Nf eGZlcl9pZl8wWzJdKTsgLyogaW50ciBpbiAqLwogCi0JCWZvciAobiA9IDA7IG4gPCB4ZmVyLT5u ZnJhbWVzOyBuKyspIHsKKwkJbXR4X3VubG9jaygmc2MtPnNjX2lmXzBfbXR4KTsKIAotCQkJTkdf QlRfTUJVRlFfREVRVUVVRSgmc2MtPnNjX3Njb3EsIG0pOworCQkvKgorCQkgKiBJbnRlcmZhY2Ug IzEKKwkJICovCiAKLQkJCWlmIChtKSB7Ci0JCQkJbGVuID0gbWluKHhmZXItPm1heF9mcmFtZV9z aXplLCBtLT5tX3BrdGhkci5sZW4pOworCQltdHhfbG9jaygmc2MtPnNjX2lmXzFfbXR4KTsKIAot CQkJCXVzYjJfbV9jb3B5X2luKHhmZXItPmZyYnVmZmVycywgb2Zmc2V0LCBtLCAwLCBsZW4pOwor CQlOR19OT0RFX1JFRihub2RlKTsKKwkJdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcl9p Zl8xWzBdKTsgLyogaXNvYyBpbiAjMSAqLwogCi0JCQkJTkdfRlJFRV9NKG0pOworCQlOR19OT0RF X1JFRihub2RlKTsKKwkJdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcl9pZl8xWzFdKTsg LyogaXNvYyBpbiAjMiAqLwogCi0JCQkJeGZlci0+ZnJsZW5ndGhzW25dID0gbGVuOwotCQkJCW9m ZnNldCArPSBsZW47Ci0JCQl9IGVsc2UgewotCQkJCXhmZXItPmZybGVuZ3Roc1tuXSA9IDA7Ci0J CQl9Ci0JCX0KKwkJbXR4X3VubG9jaygmc2MtPnNjX2lmXzFfbXR4KTsKKwl9CiAKLQkJdXNiMl9z dGFydF9oYXJkd2FyZSh4ZmVyKTsKLQkJcmV0dXJuOworIAkvKiBTdGFydCBvdXRnb2luZyBjb250 cm9sIHRyYW5zZmVyICovCisJaWYgKHRhc2tfZmxhZ3MgJiBVQlRfRkxBR19UX1NUQVJUX0NUUkwp IHsKKwkJbXR4X2xvY2soJnNjLT5zY19pZl8wX210eCk7CisJCU5HX05PREVfUkVGKG5vZGUpOwor CQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBbM10pOworCQltdHhfdW5sb2Nr KCZzYy0+c2NfaWZfMF9tdHgpOworCX0KIAotCWRlZmF1bHQ6CQkJLyogRXJyb3IgKi8KLQkJaWYg KHhmZXItPmVycm9yID09IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7Ci0JCQkvKiBpZ25vcmUgKi8KLQkJ CXJldHVybjsKLQkJfQotCQlnb3RvIHRyX3RyYW5zZmVycmVkOworCS8qIFN0YXJ0IG91dGdvaW5n IGJ1bGsgdHJhbnNmZXIgKi8KKwlpZiAodGFza19mbGFncyAmIFVCVF9GTEFHX1RfU1RBUlRfQlVM SykgeworCQltdHhfbG9jaygmc2MtPnNjX2lmXzBfbXR4KTsKKwkJTkdfTk9ERV9SRUYobm9kZSk7 CisJCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMFswXSk7CisJCW10eF91bmxv Y2soJnNjLT5zY19pZl8wX210eCk7CiAJfQotfQogCisJLyogU3RhcnQgb3V0Z29pbmcgaXNvYyB0 cmFuc2ZlcnMgKi8KKwlpZiAodGFza19mbGFncyAmIFVCVF9GTEFHX1RfU1RBUlRfSVNPQykgewor ICAgICAgICAgICAgICAgIG10eF9sb2NrKCZzYy0+c2NfaWZfMV9tdHgpOworCisgICAgICAgICAg ICAgICAgTkdfTk9ERV9SRUYobm9kZSk7CisgICAgICAgICAgICAgICAgdXNiMl90cmFuc2Zlcl9z dGFydChzYy0+c2NfeGZlcl9pZl8xWzJdKTsgLyogaXNvYyBvdXQgIzEgKi8KKworICAgICAgICAg ICAgICAgIE5HX05PREVfUkVGKG5vZGUpOworICAgICAgICAgICAgICAgIHVzYjJfdHJhbnNmZXJf c3RhcnQoc2MtPnNjX3hmZXJfaWZfMVszXSk7IC8qIGlzb2Mgb3V0ICMyICovCisKKyAgICAgICAg ICAgICAgICBtdHhfdW5sb2NrKCZzYy0+c2NfaWZfMV9tdHgpOworCX0KKworCU5HX05PREVfVU5S RUYobm9kZSk7Cit9IC8qIHVidF90YXNrICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgogICoqICAgICAgICAgICAgICAgICAgICAgICAgTmV0Z3JhcGggc3Bl Y2lmaWMKQEAgLTEzMTksMjA2ICsxNTMwLDE0OCBAQAogICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAK IC8qCi0gKiBOZXRncmFwaCBub2RlIGNvbnN0cnVjdG9yLgotICogRG8gbm90IGFsbG93IHRvIGNy ZWF0ZSBub2RlIG9mIHRoaXMgdHlwZToKKyAqIE5ldGdyYXBoIG5vZGUgY29uc3RydWN0b3IuIERv IG5vdCBhbGxvdyB0byBjcmVhdGUgbm9kZSBvZiB0aGlzIHR5cGUuCisgKiBOZXRncmFwaCBjb250 ZXh0LgogICovCiAKIHN0YXRpYyBpbnQKIG5nX3VidF9jb25zdHJ1Y3Rvcihub2RlX3Agbm9kZSkK IHsKIAlyZXR1cm4gKEVJTlZBTCk7Ci19Cit9IC8qIG5nX3VidF9jb25zdHJ1Y3RvciAqLwogCiAv KgotICogTmV0Z3JhcGggbm9kZSBkZXN0cnVjdG9yLgotICogRGVzdHJveSBub2RlIG9ubHkgd2hl biBkZXZpY2UgaGFzIGJlZW4gZGV0YWNoZWQ6CisgKiBOZXRncmFwaCBub2RlIGRlc3RydWN0b3Iu IERlc3Ryb3kgbm9kZSBvbmx5IHdoZW4gZGV2aWNlIGhhcyBiZWVuIGRldGFjaGVkLgorICogTmV0 Z3JhcGggY29udGV4dC4KICAqLwogCiBzdGF0aWMgaW50CiBuZ191YnRfc2h1dGRvd24obm9kZV9w IG5vZGUpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7 CisJc3RydWN0IHVidF9zb2Z0Ywkqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CiAKIAkvKiBM ZXQgb2xkIG5vZGUgZ28gKi8KIAlOR19OT0RFX1NFVF9QUklWQVRFKG5vZGUsIE5VTEwpOwogCU5H X05PREVfVU5SRUYobm9kZSk7CiAKLQlpZiAoc2MgPT0gTlVMTCkgeworCWlmIChzYyA9PSBOVUxM KQogCQlnb3RvIGRvbmU7Ci0JfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKLQorCQogCS8qIENy ZWF0ZSBOZXRncmFwaCBub2RlICovCiAJaWYgKG5nX21ha2Vfbm9kZV9jb21tb24oJnR5cGVzdHJ1 Y3QsICZzYy0+c2Nfbm9kZSkgIT0gMCkgewotCQlwcmludGYoIiVzOiBDb3VsZCBub3QgY3JlYXRl IE5ldGdyYXBoIG5vZGVcbiIsCi0JCSAgICBzYy0+c2NfbmFtZSk7CisJCXByaW50ZigiJXM6IENv dWxkIG5vdCBjcmVhdGUgTmV0Z3JhcGggbm9kZVxuIiwgc2MtPnNjX25hbWUpOwogCQlzYy0+c2Nf bm9kZSA9IE5VTEw7CiAJCWdvdG8gZG9uZTsKIAl9CisKIAkvKiBOYW1lIG5vZGUgKi8KIAlpZiAo bmdfbmFtZV9ub2RlKHNjLT5zY19ub2RlLCBzYy0+c2NfbmFtZSkgIT0gMCkgewotCQlwcmludGYo IiVzOiBDb3VsZCBub3QgbmFtZSBOZXRncmFwaCBub2RlXG4iLAotCQkgICAgc2MtPnNjX25hbWUp OworCQlwcmludGYoIiVzOiBDb3VsZCBub3QgbmFtZSBOZXRncmFwaCBub2RlXG4iLCBzYy0+c2Nf bmFtZSk7CiAJCU5HX05PREVfVU5SRUYoc2MtPnNjX25vZGUpOwogCQlzYy0+c2Nfbm9kZSA9IE5V TEw7CiAJCWdvdG8gZG9uZTsKIAl9CisKIAlOR19OT0RFX1NFVF9QUklWQVRFKHNjLT5zY19ub2Rl LCBzYyk7CiAJTkdfTk9ERV9GT1JDRV9XUklURVIoc2MtPnNjX25vZGUpOwogCisJVUJUX01CVUZR X0xPQ0soc2MpOworCXNjLT5zY190YXNrX2ZsYWdzID0gMDsKKwlVQlRfTUJVRlFfVU5MT0NLKHNj KTsKIGRvbmU6Ci0JaWYgKHNjKSB7Ci0JCW10eF91bmxvY2soJnNjLT5zY19tdHgpOwotCX0KIAly ZXR1cm4gKDApOwotfQorfSAvKiBuZ191YnRfc2h1dGRvd24gKi8KIAogLyoKLSAqIENyZWF0ZSBu ZXcgaG9vay4KLSAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZS4KKyAqIENyZWF0ZSBuZXcgaG9vay4g VGhlcmUgY2FuIG9ubHkgYmUgb25lLgorICogTmV0Z3JhcGggY29udGV4dC4KICAqLwogCiBzdGF0 aWMgaW50CiBuZ191YnRfbmV3aG9vayhub2RlX3Agbm9kZSwgaG9va19wIGhvb2ssIGNoYXIgY29u c3QgKm5hbWUpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9k ZSk7Ci0JaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYyA9IE5HX05PREVfUFJJ VkFURShub2RlKTsKIAotCWlmIChzdHJjbXAobmFtZSwgTkdfVUJUX0hPT0spICE9IDApIHsKKwlp ZiAoc3RyY21wKG5hbWUsIE5HX1VCVF9IT09LKSAhPSAwKQogCQlyZXR1cm4gKEVJTlZBTCk7Ci0J fQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKIAotCWlmIChzYy0+c2NfaG9vayAhPSBOVUxMKSB7 Ci0JCWVycm9yID0gRUlTQ09OTjsKLQl9IGVsc2UgewotCQlzYy0+c2NfaG9vayA9IGhvb2s7Ci0J fQorCWlmIChzYy0+c2NfaG9vayAhPSBOVUxMKQorCQlyZXR1cm4gKEVJU0NPTk4pOwogCi0JbXR4 X3VubG9jaygmc2MtPnNjX210eCk7CisJc2MtPnNjX2hvb2sgPSBob29rOwogCi0JcmV0dXJuIChl cnJvcik7Ci19CisJcmV0dXJuICgwKTsKK30gLyogbmdfdWJ0X25ld2hvb2sgKi8KIAogLyoKLSAq IENvbm5lY3QgaG9vay4KLSAqIFN0YXJ0IGluY29taW5nIFVTQiB0cmFuc2ZlcnMKKyAqIENvbm5l Y3QgaG9vay4gU3RhcnQgaW5jb21pbmcgVVNCIHRyYW5zZmVycy4KKyAqIE5ldGdyYXBoIGNvbnRl eHQuCiAgKi8KIAogc3RhdGljIGludAogbmdfdWJ0X2Nvbm5lY3QoaG9va19wIGhvb2spCiB7Ci0J c3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19OT0RFKGhvb2sp KTsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYyA9IE5HX05PREVfUFJJVkFURShOR19IT09LX05PREUo aG9vaykpOwogCiAJTkdfSE9PS19GT1JDRV9RVUVVRShOR19IT09LX1BFRVIoaG9vaykpOwogCi0J bXR4X2xvY2soJnNjLT5zY19tdHgpOworCVVCVF9NQlVGUV9MT0NLKHNjKTsKKwl1YnRfdGFza19z Y2hlZHVsZShzYywgVUJUX0ZMQUdfVF9TVEFSVF9BTEwpOworCVVCVF9NQlVGUV9VTkxPQ0soc2Mp OwogCi0Jc2MtPnNjX2ZsYWdzIHw9IChVQlRfRkxBR19SRUFEX1NUQUxMIHwKLQkgICAgVUJUX0ZM QUdfV1JJVEVfU1RBTEwgfAotCSAgICBVQlRfRkxBR19JTlRSX1NUQUxMKTsKLQotCS8qIHN0YXJ0 IGludHIgdHJhbnNmZXIgKi8KLQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBb Ml0pOwotCi0JLyogc3RhcnQgYnVsay1pbiB0cmFuc2ZlciAqLwotCXVzYjJfdHJhbnNmZXJfc3Rh cnQoc2MtPnNjX3hmZXJfaWZfMFsxXSk7Ci0KLQkvKiBzdGFydCBidWxrLW91dCB0cmFuc2ZlciAq LwotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMFswXSk7Ci0KLQkvKiBzdGFy dCBjb250cm9sLW91dCB0cmFuc2ZlciAqLwotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hm ZXJfaWZfMFszXSk7Ci0jaWYgMAotCVhYWCBjYW4gZW5hYmxlIHRoaXMgWFhYCi0KLQkvKiBzdGFy dCBpc29jLWluIHRyYW5zZmVyICovCi0JICAgICB1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194 ZmVyX2lmXzFbMF0pOwotCi0JdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcl9pZl8xWzFd KTsKLQotCS8qIHN0YXJ0IGlzb2Mtb3V0IHRyYW5zZmVyICovCi0JdXNiMl90cmFuc2Zlcl9zdGFy dChzYy0+c2NfeGZlcl9pZl8xWzJdKTsKLQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVy X2lmXzFbM10pOwotI2VuZGlmCi0KLQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKLQogCXJldHVy biAoMCk7Ci19Cit9IC8qIG5nX3VidF9jb25uZWN0ICovCiAKIC8qCi0gKiBEaXNjb25uZWN0IGhv b2sKKyAqIERpc2Nvbm5lY3QgaG9vay4KKyAqIE5ldGdyYXBoIGNvbnRleHQuCiAgKi8KIAogc3Rh dGljIGludAogbmdfdWJ0X2Rpc2Nvbm5lY3QoaG9va19wIGhvb2spCiB7Ci0Jc3RydWN0IHVidF9z b2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19OT0RFKGhvb2spKTsKLQlpbnQgZXJy b3IgPSAwOworCXN0cnVjdCB1YnRfc29mdGMJKnNjID0gTkdfTk9ERV9QUklWQVRFKE5HX0hPT0tf Tk9ERShob29rKSk7CiAKLQlpZiAoc2MgIT0gTlVMTCkgeworCWlmIChzYyA9PSBOVUxMKQorCQly ZXR1cm4gKDApOwogCi0JCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwlpZiAoaG9vayAhPSBzYy0+ c2NfaG9vaykKKwkJcmV0dXJuIChFSU5WQUwpOwogCi0JCWlmIChob29rICE9IHNjLT5zY19ob29r KSB7Ci0JCQllcnJvciA9IEVJTlZBTDsKLQkJfSBlbHNlIHsKKwlzYy0+c2NfaG9vayA9IE5VTEw7 CiAKLQkJCS8qIHN0b3AgaW50ciB0cmFuc2ZlciAqLwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNj LT5zY194ZmVyX2lmXzBbMl0pOwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lm XzBbNl0pOworCVVCVF9NQlVGUV9MT0NLKHNjKTsKIAotCQkJLyogc3RvcCBidWxrLWluIHRyYW5z ZmVyICovCi0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFsxXSk7Ci0JCQl1 c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFs1XSk7CisJLyogRHJhaW4gcXVldWVz ICovCisJTkdfQlRfTUJVRlFfRFJBSU4oJnNjLT5zY19jbWRxKTsKKwlOR19CVF9NQlVGUV9EUkFJ Tigmc2MtPnNjX2FjbHEpOworCU5HX0JUX01CVUZRX0RSQUlOKCZzYy0+c2Nfc2NvcSk7CiAKLQkJ CS8qIHN0b3AgYnVsay1vdXQgdHJhbnNmZXIgKi8KLQkJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+ c2NfeGZlcl9pZl8wWzBdKTsKLQkJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2NfeGZlcl9pZl8w WzRdKTsKKwkvKiBLaWNrIG9mZiB0YXNrIHRvIHN0b3AgYWxsIFVTQiB4ZmVycyAqLworCXVidF90 YXNrX3NjaGVkdWxlKHNjLCBVQlRfRkxBR19UX1NUT1BfQUxMKTsKIAotCQkJLyogc3RvcCBjb250 cm9sIHRyYW5zZmVyICovCi0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFsz XSk7CisJVUJUX01CVUZRX1VOTE9DSyhzYyk7CiAKLQkJCS8qIHN0b3AgaXNvYy1pbiB0cmFuc2Zl ciAqLwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzFbMF0pOwotCQkJdXNi Ml90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzFbMV0pOwotCi0JCQkvKiBzdG9wIGlzb2Mt b3V0IHRyYW5zZmVyICovCi0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMVsy XSk7Ci0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMVszXSk7Ci0KLQkJCS8q IGNsZWFudXAgcXVldWVzICovCi0JCQlOR19CVF9NQlVGUV9EUkFJTigmc2MtPnNjX2NtZHEpOwot CQkJTkdfQlRfTUJVRlFfRFJBSU4oJnNjLT5zY19hY2xxKTsKLQkJCU5HX0JUX01CVUZRX0RSQUlO KCZzYy0+c2Nfc2NvcSk7Ci0JCQlOR19CVF9NQlVGUV9EUkFJTigmc2MtPnNjX3NjaXEpOwotCi0J CQlzYy0+c2NfaG9vayA9IE5VTEw7Ci0JCX0KLQotCQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsK LQl9Ci0JcmV0dXJuIChlcnJvcik7Ci19Ci0KKwlyZXR1cm4gKDApOworfSAvKiBuZ191YnRfZGlz Y29ubmVjdCAqLworCQogLyoKLSAqIFByb2Nlc3MgY29udHJvbCBtZXNzYWdlCisgKiBQcm9jZXNz IGNvbnRyb2wgbWVzc2FnZS4KKyAqIE5ldGdyYXBoIGNvbnRleHQuCiAgKi8KIAogc3RhdGljIGlu dAogbmdfdWJ0X3Jjdm1zZyhub2RlX3Agbm9kZSwgaXRlbV9wIGl0ZW0sIGhvb2tfcCBsYXN0aG9v aykKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKLQlz dHJ1Y3QgbmdfbWVzZyAqbXNnID0gTlVMTCwgKnJzcCA9IE5VTEw7Ci0Jc3RydWN0IG5nX2J0X21i dWZxICpxID0gTlVMTDsKLQlpbnQgZXJyb3IgPSAwLCBxdWV1ZSwgcWxlbjsKKwlzdHJ1Y3QgdWJ0 X3NvZnRjCSpzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKKwlzdHJ1Y3QgbmdfbWVzZwkJKm1z ZywgKnJzcCA9IE5VTEw7CisJc3RydWN0IG5nX2J0X21idWZxCSpxOworCWludAkJCWVycm9yID0g MCwgcXVldWUsIHFsZW47CiAKIAlpZiAoc2MgPT0gTlVMTCkgewogCQlOR19GUkVFX0lURU0oaXRl bSk7CiAJCXJldHVybiAoRUhPU1RET1dOKTsKIAl9Ci0JbXR4X2xvY2soJnNjLT5zY19tdHgpOwog CiAJTkdJX0dFVF9NU0coaXRlbSwgbXNnKTsKIApAQCAtMTUyNywyNSArMTY4MCwyOSBAQAogCQlz d2l0Y2ggKG1zZy0+aGVhZGVyLmNtZCkgewogCQljYXNlIE5HTV9URVhUX1NUQVRVUzoKIAkJCU5H X01LUkVTUE9OU0UocnNwLCBtc2csIE5HX1RFWFRSRVNQT05TRSwgTV9OT1dBSVQpOwotCQkJaWYg KHJzcCA9PSBOVUxMKQorCQkJaWYgKHJzcCA9PSBOVUxMKSB7CiAJCQkJZXJyb3IgPSBFTk9NRU07 Ci0JCQllbHNlCi0JCQkJc25wcmludGYocnNwLT5kYXRhLCBOR19URVhUUkVTUE9OU0UsCi0JCQkJ ICAgICJIb29rOiAlc1xuIiBcCi0JCQkJICAgICJGbGFnczogJSN4XG4iIFwKLQkJCQkgICAgIkRl YnVnOiAlZFxuIiBcCi0JCQkJICAgICJDTUQgcXVldWU6IFtoYXZlOiVkLG1heDolZF1cbiIgXAot CQkJCSAgICAiQUNMIHF1ZXVlOiBbaGF2ZTolZCxtYXg6JWRdXG4iIFwKLQkJCQkgICAgIlNDTyBx dWV1ZTogW2hhdmU6JWQsbWF4OiVkXSIsCi0JCQkJICAgIChzYy0+c2NfaG9vayAhPSBOVUxMKSA/ IE5HX1VCVF9IT09LIDogIiIsCi0JCQkJICAgIHNjLT5zY19mbGFncywKLQkJCQkgICAgc2MtPnNj X2RlYnVnLAotCQkJCSAgICBOR19CVF9NQlVGUV9MRU4oJnNjLT5zY19jbWRxKSwKLQkJCQkgICAg c2MtPnNjX2NtZHEubWF4bGVuLAotCQkJCSAgICBOR19CVF9NQlVGUV9MRU4oJnNjLT5zY19hY2xx KSwKLQkJCQkgICAgc2MtPnNjX2FjbHEubWF4bGVuLAotCQkJCSAgICBOR19CVF9NQlVGUV9MRU4o JnNjLT5zY19zY29xKSwKLQkJCQkgICAgc2MtPnNjX3Njb3EubWF4bGVuKTsKKwkJCQlicmVhazsK KwkJCX0KKworCQkJc25wcmludGYocnNwLT5kYXRhLCBOR19URVhUUkVTUE9OU0UsCisJCQkJIkhv b2s6ICVzXG4iIFwKKwkJCQkiRmxhZ3M6ICUjeFxuIiBcCisJCQkJIlRhc2sgZmxhZ3M6ICUjeFxu IiBcCisJCQkJIkRlYnVnOiAlZFxuIiBcCisJCQkJIkNNRCBxdWV1ZTogW2hhdmU6JWQsbWF4OiVk XVxuIiBcCisJCQkJIkFDTCBxdWV1ZTogW2hhdmU6JWQsbWF4OiVkXVxuIiBcCisJCQkJIlNDTyBx dWV1ZTogW2hhdmU6JWQsbWF4OiVkXSIsCisJCQkJKHNjLT5zY19ob29rICE9IE5VTEwpID8gTkdf VUJUX0hPT0s6IiIsCisJCQkJc2MtPnNjX2ZsYWdzLAorCQkJCXNjLT5zY190YXNrX2ZsYWdzLAor CQkJCXNjLT5zY19kZWJ1ZywKKwkJCQlzYy0+c2NfY21kcS5sZW4sCisJCQkJc2MtPnNjX2NtZHEu bWF4bGVuLAorCQkJCXNjLT5zY19hY2xxLmxlbiwKKwkJCQlzYy0+c2NfYWNscS5tYXhsZW4sCisJ CQkJc2MtPnNjX3Njb3EubGVuLAorCQkJCXNjLT5zY19zY29xLm1heGxlbik7CiAJCQlicmVhazsK IAogCQlkZWZhdWx0OgpAQCAtMTU1Nyw1OSArMTcxNCw1NCBAQAogCWNhc2UgTkdNX1VCVF9DT09L SUU6CiAJCXN3aXRjaCAobXNnLT5oZWFkZXIuY21kKSB7CiAJCWNhc2UgTkdNX1VCVF9OT0RFX1NF VF9ERUJVRzoKLQkJCWlmIChtc2ctPmhlYWRlci5hcmdsZW4gIT0gc2l6ZW9mKG5nX3VidF9ub2Rl X2RlYnVnX2VwKSkKKwkJCWlmIChtc2ctPmhlYWRlci5hcmdsZW4gIT0gc2l6ZW9mKG5nX3VidF9u b2RlX2RlYnVnX2VwKSl7CiAJCQkJZXJyb3IgPSBFTVNHU0laRTsKLQkJCWVsc2UKLQkJCQlzYy0+ c2NfZGVidWcgPQotCQkJCSAgICAqKChuZ191YnRfbm9kZV9kZWJ1Z19lcCAqKSAobXNnLT5kYXRh KSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNjLT5zY19kZWJ1ZyA9ICooKG5nX3VidF9ub2Rl X2RlYnVnX2VwICopIChtc2ctPmRhdGEpKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTkdNX1VCVF9O T0RFX0dFVF9ERUJVRzoKIAkJCU5HX01LUkVTUE9OU0UocnNwLCBtc2csIHNpemVvZihuZ191YnRf bm9kZV9kZWJ1Z19lcCksCiAJCQkgICAgTV9OT1dBSVQpOwotCQkJaWYgKHJzcCA9PSBOVUxMKQor CQkJaWYgKHJzcCA9PSBOVUxMKSB7CiAJCQkJZXJyb3IgPSBFTk9NRU07Ci0JCQllbHNlCi0JCQkJ KigobmdfdWJ0X25vZGVfZGVidWdfZXAgKikgKHJzcC0+ZGF0YSkpID0KLQkJCQkgICAgc2MtPnNj X2RlYnVnOworCQkJCWJyZWFrOworCQkJfQorCisJCQkqKChuZ191YnRfbm9kZV9kZWJ1Z19lcCAq KSAocnNwLT5kYXRhKSkgPSBzYy0+c2NfZGVidWc7CiAJCQlicmVhazsKIAogCQljYXNlIE5HTV9V QlRfTk9ERV9TRVRfUUxFTjoKLQkJCWlmIChtc2ctPmhlYWRlci5hcmdsZW4gIT0gc2l6ZW9mKG5n X3VidF9ub2RlX3FsZW5fZXApKQorCQkJaWYgKG1zZy0+aGVhZGVyLmFyZ2xlbiAhPSBzaXplb2Yo bmdfdWJ0X25vZGVfcWxlbl9lcCkpIHsKIAkJCQllcnJvciA9IEVNU0dTSVpFOwotCQkJZWxzZSB7 Ci0JCQkJcXVldWUgPSAoKG5nX3VidF9ub2RlX3FsZW5fZXAgKikKLQkJCQkgICAgKG1zZy0+ZGF0 YSkpLT5xdWV1ZTsKLQkJCQlxbGVuID0gKChuZ191YnRfbm9kZV9xbGVuX2VwICopCi0JCQkJICAg IChtc2ctPmRhdGEpKS0+cWxlbjsKKwkJCQlicmVhazsKKwkJCX0KIAotCQkJCWlmIChxbGVuIDw9 IDApIHsKLQkJCQkJZXJyb3IgPSBFSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzd2l0 Y2ggKHF1ZXVlKSB7Ci0JCQkJY2FzZSBOR01fVUJUX05PREVfUVVFVUVfQ01EOgotCQkJCQlxID0g JnNjLT5zY19jbWRxOwotCQkJCQlicmVhazsKKwkJCXF1ZXVlID0gKChuZ191YnRfbm9kZV9xbGVu X2VwICopIChtc2ctPmRhdGEpKS0+cXVldWU7CisJCQlxbGVuID0gKChuZ191YnRfbm9kZV9xbGVu X2VwICopIChtc2ctPmRhdGEpKS0+cWxlbjsKIAotCQkJCWNhc2UgTkdNX1VCVF9OT0RFX1FVRVVF X0FDTDoKLQkJCQkJcSA9ICZzYy0+c2NfYWNscTsKLQkJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKHF1 ZXVlKSB7CisJCQljYXNlIE5HTV9VQlRfTk9ERV9RVUVVRV9DTUQ6CisJCQkJcSA9ICZzYy0+c2Nf Y21kcTsKKwkJCQlicmVhazsKIAotCQkJCWNhc2UgTkdNX1VCVF9OT0RFX1FVRVVFX1NDTzoKLQkJ CQkJcSA9ICZzYy0+c2Nfc2NvcTsKLQkJCQkJYnJlYWs7CisJCQljYXNlIE5HTV9VQlRfTk9ERV9R VUVVRV9BQ0w6CisJCQkJcSA9ICZzYy0+c2NfYWNscTsKKwkJCQlicmVhazsKIAotCQkJCWRlZmF1 bHQ6Ci0JCQkJCXEgPSBOVUxMOwotCQkJCQllcnJvciA9IEVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0J CQkJfQorCQkJY2FzZSBOR01fVUJUX05PREVfUVVFVUVfU0NPOgorCQkJCXEgPSAmc2MtPnNjX3Nj b3E7CisJCQkJYnJlYWs7CiAKLQkJCQlpZiAocSAhPSBOVUxMKSB7Ci0JCQkJCXEtPm1heGxlbiA9 IHFsZW47Ci0JCQkJfQorCQkJZGVmYXVsdDoKKwkJCQllcnJvciA9IEVJTlZBTDsKKwkJCQlnb3Rv IGRvbmU7CisJCQkJLyogTk9UIFJFQUNIRUQgKi8KIAkJCX0KKworCQkJcS0+bWF4bGVuID0gcWxl bjsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTkdNX1VCVF9OT0RFX0dFVF9RTEVOOgpAQCAtMTYxNyw3 ICsxNzY5LDkgQEAKIAkJCQllcnJvciA9IEVNU0dTSVpFOwogCQkJCWJyZWFrOwogCQkJfQorCiAJ CQlxdWV1ZSA9ICgobmdfdWJ0X25vZGVfcWxlbl9lcCAqKSAobXNnLT5kYXRhKSktPnF1ZXVlOwor CiAJCQlzd2l0Y2ggKHF1ZXVlKSB7CiAJCQljYXNlIE5HTV9VQlRfTk9ERV9RVUVVRV9DTUQ6CiAJ CQkJcSA9ICZzYy0+c2NfY21kcTsKQEAgLTE2MzIsMzkgKzE3ODYsMzYgQEAKIAkJCQlicmVhazsK IAogCQkJZGVmYXVsdDoKLQkJCQlxID0gTlVMTDsKIAkJCQllcnJvciA9IEVJTlZBTDsKKwkJCQln b3RvIGRvbmU7CisJCQkJLyogTk9UIFJFQUNIRUQgKi8KKwkJCX0KKworCQkJTkdfTUtSRVNQT05T RShyc3AsIG1zZywgc2l6ZW9mKG5nX3VidF9ub2RlX3FsZW5fZXApLAorCQkJCU1fTk9XQUlUKTsK KwkJCWlmIChyc3AgPT0gTlVMTCkgeworCQkJCWVycm9yID0gRU5PTUVNOwogCQkJCWJyZWFrOwog CQkJfQogCi0JCQlpZiAocSAhPSBOVUxMKSB7Ci0JCQkJTkdfTUtSRVNQT05TRShyc3AsIG1zZywK LQkJCQkgICAgc2l6ZW9mKG5nX3VidF9ub2RlX3FsZW5fZXApLCBNX05PV0FJVCk7Ci0JCQkJaWYg KHJzcCA9PSBOVUxMKSB7Ci0JCQkJCWVycm9yID0gRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9 Ci0JCQkJKChuZ191YnRfbm9kZV9xbGVuX2VwICopIChyc3AtPmRhdGEpKS0+cXVldWUgPQotCQkJ CSAgICBxdWV1ZTsKLQkJCQkoKG5nX3VidF9ub2RlX3FsZW5fZXAgKikgKHJzcC0+ZGF0YSkpLT5x bGVuID0KLQkJCQkgICAgcS0+bWF4bGVuOwotCQkJfQorCQkJKChuZ191YnRfbm9kZV9xbGVuX2Vw ICopIChyc3AtPmRhdGEpKS0+cXVldWUgPSBxdWV1ZTsKKwkJCSgobmdfdWJ0X25vZGVfcWxlbl9l cCAqKSAocnNwLT5kYXRhKSktPnFsZW4gPSBxLT5tYXhsZW47CiAJCQlicmVhazsKIAogCQljYXNl IE5HTV9VQlRfTk9ERV9HRVRfU1RBVDoKIAkJCU5HX01LUkVTUE9OU0UocnNwLCBtc2csIHNpemVv ZihuZ191YnRfbm9kZV9zdGF0X2VwKSwKIAkJCSAgICBNX05PV0FJVCk7Ci0JCQlpZiAocnNwID09 IE5VTEwpCisJCQlpZiAocnNwID09IE5VTEwpIHsKIAkJCQllcnJvciA9IEVOT01FTTsKLQkJCWVs c2UgewotCQkJCWJjb3B5KCZzYy0+c2Nfc3RhdCwgcnNwLT5kYXRhLAotCQkJCSAgICBzaXplb2Yo bmdfdWJ0X25vZGVfc3RhdF9lcCkpOworCQkJCWJyZWFrOwogCQkJfQorCisJCQliY29weSgmc2Mt PnNjX3N0YXQsIHJzcC0+ZGF0YSwKKwkJCQlzaXplb2YobmdfdWJ0X25vZGVfc3RhdF9lcCkpOwog CQkJYnJlYWs7CiAKIAkJY2FzZSBOR01fVUJUX05PREVfUkVTRVRfU1RBVDoKLQotCQkJTkdfVUJU X1NUQVRfUkVTRVQoc2MtPnNjX3N0YXQpOworCQkJVUJUX1NUQVRfUkVTRVQoc2MpOwogCQkJYnJl YWs7CiAKIAkJZGVmYXVsdDoKQEAgLTE2NzcsOTAgKzE4MjgsMTcyIEBACiAJCWVycm9yID0gRUlO VkFMOwogCQlicmVhazsKIAl9Ci0KK2RvbmU6CiAJTkdfUkVTUE9ORF9NU0coZXJyb3IsIG5vZGUs IGl0ZW0sIHJzcCk7CiAJTkdfRlJFRV9NU0cobXNnKTsKIAotCW10eF91bmxvY2soJnNjLT5zY19t dHgpOwotCiAJcmV0dXJuIChlcnJvcik7Ci19Cit9IC8qIG5nX3VidF9yY3Ztc2cgKi8KIAogLyoK LSAqIFByb2Nlc3MgZGF0YQorICogUHJvY2VzcyBkYXRhLgorICogTmV0Z3JhcGggY29udGV4dC4K ICAqLwogCiBzdGF0aWMgaW50CiBuZ191YnRfcmN2ZGF0YShob29rX3AgaG9vaywgaXRlbV9wIGl0 ZW0pCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19O T0RFKGhvb2spKTsKLQlzdHJ1Y3QgbWJ1ZiAqbTsKLQlzdHJ1Y3QgbmdfYnRfbWJ1ZnEgKnE7Ci0J c3RydWN0IHVzYjJfeGZlciAqeGZlcjsKLQlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCB1YnRfc29m dGMJKnNjID0gTkdfTk9ERV9QUklWQVRFKE5HX0hPT0tfTk9ERShob29rKSk7CisJc3RydWN0IG1i dWYJCSptOworCXN0cnVjdCBuZ19idF9tYnVmcQkqcTsKKwl1aW50MzJfdAkJYWN0aW9uOworCWlu dAkJCWVycm9yID0gMDsKIAogCWlmIChzYyA9PSBOVUxMKSB7CiAJCWVycm9yID0gRUhPU1RET1dO OwogCQlnb3RvIGRvbmU7CiAJfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKIAogCWlmIChob29r ICE9IHNjLT5zY19ob29rKSB7CiAJCWVycm9yID0gRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQot CS8qIGRlYXRjaCBtYnVmIGFuZCBnZXQgSENJIGZyYW1lIHR5cGUgKi8KKworCS8qIERlYXRjaCBt YnVmIGFuZCBnZXQgSENJIGZyYW1lIHR5cGUgKi8KIAlOR0lfR0VUX00oaXRlbSwgbSk7CiAKLQkv KiBwcm9jZXNzIEhDSSBmcmFtZSAqLworCS8qCisJICogTWluaW1hbCBzaXplIG9mIHRoZSBIQ0kg ZnJhbWUgaXMgNCBieXRlczogMSBieXRlIGZyYW1lIHR5cGUsCisJICogMiBieXRlcyBjb25uZWN0 aW9uIGhhbmRsZSBhbmQgYXQgbGVhc3QgMSBieXRlIG9mIGxlbmd0aC4KKwkgKiBQYW5pYyBvbiBk YXRhIGZyYW1lIHRoYXQgaGFzIHNpemUgc21hbGxlciB0aGFuIDQgYnl0ZXMgKGl0CisJICogc2hv dWxkIG5vdCBoYXBwZW4pCisJICovCisKKwlpZiAobS0+bV9wa3RoZHIubGVuIDwgNCkKKwkJcGFu aWMoIkhDSSBmcmFtZSBzaXplIGlzIHRvbyBzbWFsbCEgcGt0bGVuPSVkXG4iLAorCQkJbS0+bV9w a3RoZHIubGVuKTsKKworCS8qIFByb2Nlc3MgSENJIGZyYW1lICovCiAJc3dpdGNoICgqbXRvZCht LCB1aW50OF90ICopKSB7CS8qIFhYWCBjYWxsIG1fcHVsbHVwID8gKi8KIAljYXNlIE5HX0hDSV9D TURfUEtUOgotCQl4ZmVyID0gc2MtPnNjX3hmZXJfaWZfMFszXTsKKwkJaWYgKG0tPm1fcGt0aGRy LmxlbiAtIDEgPiBVQlRfQ1RSTF9CVUZGRVJfU0laRSkKKwkJCXBhbmljKCJIQ0kgY29tbWFuZCBm cmFtZSBzaXplIGlzIHRvbyBiaWchICIgXAorCQkJCSJidWZmZXIgc2l6ZT0lemQsIHBhY2tldCBs ZW49JWRcbiIsCisJCQkJVUJUX0NUUkxfQlVGRkVSX1NJWkUsIG0tPm1fcGt0aGRyLmxlbik7CisK IAkJcSA9ICZzYy0+c2NfY21kcTsKKwkJYWN0aW9uID0gVUJUX0ZMQUdfVF9TVEFSVF9DVFJMOwog CQlicmVhazsKIAogCWNhc2UgTkdfSENJX0FDTF9EQVRBX1BLVDoKLQkJeGZlciA9IHNjLT5zY194 ZmVyX2lmXzBbMF07CisJCWlmIChtLT5tX3BrdGhkci5sZW4gLSAxID4gVUJUX0JVTEtfV1JJVEVf QlVGRkVSX1NJWkUpCisJCQlwYW5pYygiQUNMIGRhdGEgZnJhbWUgc2l6ZSBpcyB0b28gYmlnISAi IFwKKwkJCQkiYnVmZmVyIHNpemU9JWQsIHBhY2tldCBsZW49JWRcbiIsCisJCQkJVUJUX0JVTEtf V1JJVEVfQlVGRkVSX1NJWkUsIG0tPm1fcGt0aGRyLmxlbik7CisKIAkJcSA9ICZzYy0+c2NfYWNs cTsKKwkJYWN0aW9uID0gVUJUX0ZMQUdfVF9TVEFSVF9CVUxLOwogCQlicmVhazsKIAogCWNhc2Ug TkdfSENJX1NDT19EQVRBX1BLVDoKLQkJeGZlciA9IE5VTEw7CisjaWYgMAkJLyogWFhYIEZJWE1F IC0gbm90IHlldCAqLwogCQlxID0gJnNjLT5zY19zY29xOworCQlhY3Rpb24gPSBVQlRfRkxBR19U X1NUQVJUX0lTT0M7CiAJCWJyZWFrOworI2Vsc2UKKwkJTkdfRlJFRV9NKG0pOworCQlnb3RvIGRv bmU7CisjZW5kaWYKIAogCWRlZmF1bHQ6Ci0JCU5HX1VCVF9FUlIoc2MsICJEcm9wcGluZyB1bnN1 cHBvcnRlZCBIQ0kgZnJhbWUsICIKLQkJICAgICJ0eXBlPTB4JTAyeCwgcGt0bGVuPSVkXG4iLAot CQkgICAgKm10b2QobSwgdWludDhfdCAqKSwKLQkJICAgIG0tPm1fcGt0aGRyLmxlbik7CisJCVVC VF9FUlIoc2MsICJEcm9wcGluZyB1bnN1cHBvcnRlZCBIQ0kgZnJhbWUsIHR5cGU9MHglMDJ4LCAi IFwKKwkJCSJwa3RsZW49JWRcbiIsICptdG9kKG0sIHVpbnQ4X3QgKiksIG0tPm1fcGt0aGRyLmxl bik7CiAKIAkJTkdfRlJFRV9NKG0pOwogCQllcnJvciA9IEVJTlZBTDsKIAkJZ290byBkb25lOwor CQkvKiBOT1QgUkVBQ0hFRCAqLwogCX0KIAotCS8qIGxvb3NlIGZyYW1lIHR5cGUsIGlmIHJlcXVp cmVkICovCi0JaWYgKCEoc2MtPnNjX2ZsYWdzICYgVUJUX05FRURfRlJBTUVfVFlQRSkpIHsKLQkJ bV9hZGoobSwgc2l6ZW9mKHVpbnQ4X3QpKTsKLQl9CisJVUJUX01CVUZRX0xPQ0soc2MpOwogCWlm IChOR19CVF9NQlVGUV9GVUxMKHEpKSB7Ci0JCU5HX1VCVF9FUlIoc2MsICJEcm9wcGluZyBIQ0kg ZnJhbWUgMHglMDJ4LCBsZW49JWQuICIKLQkJICAgICJRdWV1ZSBmdWxsXG4iLCAqbXRvZChtLCB1 aW50OF90ICopLAotCQkgICAgbS0+bV9wa3RoZHIubGVuKTsKKwkJTkdfQlRfTUJVRlFfRFJPUChx KTsKKwkJVUJUX01CVUZRX1VOTE9DSyhzYyk7CisJCQorCQlVQlRfRVJSKHNjLCAiRHJvcHBpbmcg SENJIGZyYW1lIDB4JTAyeCwgbGVuPSVkLiBRdWV1ZSBmdWxsXG4iLAorCQkJKm10b2QobSwgdWlu dDhfdCAqKSwgbS0+bV9wa3RoZHIubGVuKTsKKwogCQlOR19GUkVFX00obSk7CiAJfSBlbHNlIHsK KwkJLyogTG9vc2UgSENJIHBhY2tldCB0eXBlLCBlbnF1ZXVlIG1idWYgYW5kIGtpY2sgb2ZmIHRh c2sgKi8KKwkJbV9hZGoobSwgc2l6ZW9mKHVpbnQ4X3QpKTsKIAkJTkdfQlRfTUJVRlFfRU5RVUVV RShxLCBtKTsKLQl9CisJCXVidF90YXNrX3NjaGVkdWxlKHNjLCBhY3Rpb24pOwogCi0JaWYgKHhm ZXIpIHsKLQkJdXNiMl90cmFuc2Zlcl9zdGFydCh4ZmVyKTsKKwkJVUJUX01CVUZRX1VOTE9DSyhz Yyk7CiAJfQogZG9uZToKIAlOR19GUkVFX0lURU0oaXRlbSk7CiAKLQlpZiAoc2MpIHsKLQkJbXR4 X3VubG9jaygmc2MtPnNjX210eCk7CisJcmV0dXJuIChlcnJvcik7Cit9IC8qIG5nX3VidF9yY3Zk YXRhICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBMb2FkL1VubG9hZCB0aGUgZHJpdmVy IG1vZHVsZQorICovCisKK3N0YXRpYyBpbnQKK3VidF9tb2RldmVudChtb2R1bGVfdCBtb2QsIGlu dCBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyb3I7CisKKwlzd2l0Y2ggKGV2ZW50KSB7 CisJY2FzZSBNT0RfTE9BRDoKKwkJZXJyb3IgPSBuZ19uZXd0eXBlKCZ0eXBlc3RydWN0KTsKKwkJ aWYgKGVycm9yICE9IDApCisJCQlwcmludGYoIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgTmV0Z3Jh cGggbm9kZSB0eXBlLCAiIFwKKwkJCQkiZXJyb3I9JWRcbiIsIE5HX1VCVF9OT0RFX1RZUEUsIGVy cm9yKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PRF9VTkxPQUQ6CisJCWVycm9yID0gbmdfcm10eXBl KCZ0eXBlc3RydWN0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnJvciA9IEVPUE5PVFNV UFA7CisJCWJyZWFrOwogCX0KKwogCXJldHVybiAoZXJyb3IpOwotfQorfSAvKiB1YnRfbW9kZXZl bnQgKi8KKworc3RhdGljIGRldmNsYXNzX3QJdWJ0X2RldmNsYXNzOworCitzdGF0aWMgZGV2aWNl X21ldGhvZF90CXVidF9tZXRob2RzW10gPQoreworCURFVk1FVEhPRChkZXZpY2VfcHJvYmUsCXVi dF9wcm9iZSksCisJREVWTUVUSE9EKGRldmljZV9hdHRhY2gsIHVidF9hdHRhY2gpLAorCURFVk1F VEhPRChkZXZpY2VfZGV0YWNoLCB1YnRfZGV0YWNoKSwKKwl7IDAsIDAgfQorfTsKKworc3RhdGlj IGRyaXZlcl90CQl1YnRfZHJpdmVyID0KK3sKKwkubmFtZSA9CSAgICJ1YnQiLAorCS5tZXRob2Rz ID0gdWJ0X21ldGhvZHMsCisJLnNpemUgPQkgICBzaXplb2Yoc3RydWN0IHVidF9zb2Z0YyksCit9 OworCitEUklWRVJfTU9EVUxFKG5nX3VidCwgdXNodWIsIHVidF9kcml2ZXIsIHVidF9kZXZjbGFz cywgdWJ0X21vZGV2ZW50LCAwKTsKK01PRFVMRV9WRVJTSU9OKG5nX3VidCwgTkdfQkxVRVRPT1RI X1ZFUlNJT04pOworTU9EVUxFX0RFUEVORChuZ191YnQsIG5ldGdyYXBoLCBOR19BQklfVkVSU0lP TiwgTkdfQUJJX1ZFUlNJT04sIE5HX0FCSV9WRVJTSU9OKTsKK01PRFVMRV9ERVBFTkQobmdfdWJ0 LCBuZ19oY2ksIE5HX0JMVUVUT09USF9WRVJTSU9OLCBOR19CTFVFVE9PVEhfVkVSU0lPTiwgTkdf QkxVRVRPT1RIX1ZFUlNJT04pOworTU9EVUxFX0RFUEVORChuZ191YnQsIHVzYjJfYmx1ZXRvb3Ro LCAxLCAxLCAxKTsKK01PRFVMRV9ERVBFTkQobmdfdWJ0LCB1c2IyX2NvcmUsIDEsIDEsIDEpOwor CkluZGV4OiBuZ191YnQyX3Zhci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5nX3VidDJfdmFyLmgJKHJldmlz aW9uIDE4NjgwMCkKKysrIG5nX3VidDJfdmFyLmgJKHdvcmtpbmcgY29weSkKQEAgLTMsNyArMyw3 IEBACiAgKi8KIAogLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBNYWtzaW0gWWV2bWVu a2luIDxtX2V2bWVua2luQHlhaG9vLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA5IE1h a3NpbSBZZXZtZW5raW4gPG1fZXZtZW5raW5AeWFob28uY29tPgogICogQWxsIHJpZ2h0cyByZXNl cnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5 IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTMyLDk1ICszMiw5NCBAQAogICovCiAKICNpZm5k ZWYgX05HX1VCVF9WQVJfSF8KLSNkZWZpbmUJX05HX1VCVF9WQVJfSF8KKyNkZWZpbmUJX05HX1VC VF9WQVJfSF8JMQogCi0vKiBwdWxsdXAgd3JhcHBlciAqLwotI2RlZmluZQlOR19VQlRfTV9QVUxM VVAobSwgcykgXAotCWRvIHsgXAotCQlpZiAoKG0pLT5tX2xlbiA8IChzKSkgXAotCQkJKG0pID0g bV9wdWxsdXAoKG0pLCAocykpOyBcCi0JCWlmICgobSkgPT0gTlVMTCkgeyBcCi0JCQlOR19VQlRf QUxFUlQoIiVzOiAlcyAtIG1fcHVsbHVwKCVkKSBmYWlsZWRcbiIsIFwKLQkJCQlfX2Z1bmNfXywg c2MtPnNjX25hbWUsIChzKSk7IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQogLyogRGVidWcgcHJp bnRmJ3MgKi8KLSNkZWZpbmUJTkdfVUJUX0RFQlVHKGxldmVsLCBzYywgZm10LCAuLi4pIGRvIHsg XAotICAgIGlmICgoc2MpLT5zY19kZWJ1ZyA+PSAobGV2ZWwpKSB7IFwKLSAgICAgICAgcHJpbnRm KCIlczolczolZDogIiBmbXQsIChzYyktPnNjX25hbWUsIFwKLQkgICAgICAgX19GVU5DVElPTl9f LCBfX0xJTkVfXywjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICB9IFwKKyNkZWZpbmUJVUJUX0RFQlVH KGxldmVsLCBzYywgZm10LCAuLi4pCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAoKHNjKS0+c2Nf ZGVidWcgPj0gKGxldmVsKSkJCQkJXAorCQlwcmludGYoIiVzOiVzOiVkOiAiIGZtdCwgKHNjKS0+ c2NfbmFtZSwJCVwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIyMgX19WQV9BUkdTX18pOwlc CiB9IHdoaWxlICgwKQogCi0jZGVmaW5lCU5HX1VCVF9BTEVSVCguLi4pIE5HX1VCVF9ERUJVRyhO R19VQlRfQUxFUlRfTEVWRUwsIF9fVkFfQVJHU19fKQotI2RlZmluZQlOR19VQlRfRVJSKC4uLikg ICBOR19VQlRfREVCVUcoTkdfVUJUX0VSUl9MRVZFTCwgX19WQV9BUkdTX18pCi0jZGVmaW5lCU5H X1VCVF9XQVJOKC4uLikgIE5HX1VCVF9ERUJVRyhOR19VQlRfV0FSTl9MRVZFTCwgX19WQV9BUkdT X18pCi0jZGVmaW5lCU5HX1VCVF9JTkZPKC4uLikgIE5HX1VCVF9ERUJVRyhOR19VQlRfSU5GT19M RVZFTCwgX19WQV9BUkdTX18pCisjZGVmaW5lCVVCVF9BTEVSVCguLi4pCQlVQlRfREVCVUcoTkdf VUJUX0FMRVJUX0xFVkVMLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUJVUJUX0VSUiguLi4pCQlVQlRf REVCVUcoTkdfVUJUX0VSUl9MRVZFTCwgX19WQV9BUkdTX18pCisjZGVmaW5lCVVCVF9XQVJOKC4u LikJCVVCVF9ERUJVRyhOR19VQlRfV0FSTl9MRVZFTCwgX19WQV9BUkdTX18pCisjZGVmaW5lCVVC VF9JTkZPKC4uLikJCVVCVF9ERUJVRyhOR19VQlRfSU5GT19MRVZFTCwgX19WQV9BUkdTX18pCiAK KyNkZWZpbmUgVUJUX01CVUZRX0xPQ0soc2MpCW10eF9sb2NrKCYoc2MpLT5zY19tYnVmcV9tdHgp CisjZGVmaW5lIFVCVF9NQlVGUV9VTkxPQ0soc2MpCW10eF91bmxvY2soJihzYyktPnNjX21idWZx X210eCkKKwogLyogQmx1ZXRvb3RoIFVTQiBjb250cm9sIHJlcXVlc3QgdHlwZSAqLwogI2RlZmlu ZQlVQlRfSENJX1JFUVVFU1QJCTB4MjAKICNkZWZpbmUJVUJUX0RFRkFVTFRfUUxFTgkxMgogCiAv KiBCbHVldG9vdGggVVNCIGRlZmluZXMgKi8KLSNkZWZpbmUJVUJUX0lGXzBfTl9UUkFOU0ZFUiAg NwkJLyogdW5pdHMgKi8KLSNkZWZpbmUJVUJUX0lGXzFfTl9UUkFOU0ZFUiAgNAkJLyogdW5pdHMg Ki8KLSNkZWZpbmUJVUJUX0lTT0NfTkZSQU1FUyAgICAyNQkJLyogdW5pdHMgKi8KKyNkZWZpbmUJ VUJUX0lGXzBfTl9UUkFOU0ZFUgk3CS8qIHVuaXRzICovCisjZGVmaW5lCVVCVF9JRl8xX05fVFJB TlNGRVIJNAkvKiB1bml0cyAqLworI2RlZmluZQlVQlRfSVNPQ19ORlJBTUVTCTI1CS8qIHVuaXRz ICovCiAKIC8qIFVTQiBkZXZpY2Ugc29mdGMgc3RydWN0dXJlICovCiBzdHJ1Y3QgdWJ0X3NvZnRj IHsKKwl1aW50OF90CQkJc2NfbmFtZVsxNl07CisKIAkvKiBTdGF0ZSAqLwotCW5nX3VidF9ub2Rl X2RlYnVnX2VwIHNjX2RlYnVnOwkvKiBkZWJ1ZyBsZXZlbCAqLwotCXVpbnQzMl90IHNjX2ZsYWdz OwkJLyogZGV2aWNlIGZsYWdzICovCi0jZGVmaW5lCVVCVF9ORUVEX0ZSQU1FX1RZUEUJKDEgPDwg MCkvKiBkZXZpY2UgcmVxdWlyZWQgZnJhbWUgdHlwZSAqLwotI2RlZmluZQlVQlRfSEFWRV9GUkFN RV9UWVBFIFVCVF9ORUVEX0ZSQU1FX1RZUEUKLSNkZWZpbmUJVUJUX0ZMQUdfUkVBRF9TVEFMTCAg ICAgKDEgPDwgMSkvKiByZWFkIHRyYW5zZmVyIGhhcyBzdGFsbGVkICovCi0jZGVmaW5lCVVCVF9G TEFHX1dSSVRFX1NUQUxMICAgICgxIDw8IDIpLyogd3JpdGUgdHJhbnNmZXIgaGFzIHN0YWxsZWQg Ki8KLSNkZWZpbmUJVUJUX0ZMQUdfSU5UUl9TVEFMTCAgICAgKDEgPDwgMykvKiBpbnRlcnJ1cHQg dHJhbnNmZXIgaGFzIHN0YWxsZWQgKi8KKwluZ191YnRfbm9kZV9kZWJ1Z19lcAlzY19kZWJ1ZzsJ LyogZGVidWcgbGV2ZWwgKi8KIAotCW5nX3VidF9ub2RlX3N0YXRfZXAgc2Nfc3RhdDsJLyogc3Rh dGlzdGljICovCi0jZGVmaW5lCU5HX1VCVF9TVEFUX1BDS1RTX1NFTlQocykJKHMpLnBja3RzX3Nl bnQgKysKLSNkZWZpbmUJTkdfVUJUX1NUQVRfQllURVNfU0VOVChzLCBuKQkocykuYnl0ZXNfc2Vu dCArPSAobikKLSNkZWZpbmUJTkdfVUJUX1NUQVRfUENLVFNfUkVDVihzKQkocykucGNrdHNfcmVj diArKwotI2RlZmluZQlOR19VQlRfU1RBVF9CWVRFU19SRUNWKHMsIG4pCShzKS5ieXRlc19yZWN2 ICs9IChuKQotI2RlZmluZQlOR19VQlRfU1RBVF9PRVJST1IocykJCShzKS5vZXJyb3JzICsrCi0j ZGVmaW5lCU5HX1VCVF9TVEFUX0lFUlJPUihzKQkJKHMpLmllcnJvcnMgKysKLSNkZWZpbmUJTkdf VUJUX1NUQVRfUkVTRVQocykJCWJ6ZXJvKCYocyksIHNpemVvZigocykpKQorCXVpbnQzMl90CQlz Y19mbGFnczsJLyogZGV2aWNlIGZsYWdzICovCisjZGVmaW5lCVVCVF9GTEFHX1JFQURfU1RBTEwJ KDEgPDwgMCkJLyogcmVhZCB0cmFuc2ZlciBoYXMgc3RhbGxlZCAqLworI2RlZmluZQlVQlRfRkxB R19XUklURV9TVEFMTAkoMSA8PCAxKQkvKiB3cml0ZSB0cmFuc2ZlciBoYXMgc3RhbGxlZCAqLwor I2RlZmluZQlVQlRfRkxBR19JTlRSX1NUQUxMCSgxIDw8IDIpCS8qIGludGVyIHRyYW5zZmVyIGhh cyBzdGFsbGVkICovCiAKLQl1aW50OF90CXNjX25hbWVbMTZdOworCW5nX3VidF9ub2RlX3N0YXRf ZXAJc2Nfc3RhdDsJLyogc3RhdGlzdGljICovCisjZGVmaW5lCVVCVF9TVEFUX1BDS1RTX1NFTlQo c2MpCQkoc2MpLT5zY19zdGF0LnBja3RzX3NlbnQgKysKKyNkZWZpbmUJVUJUX1NUQVRfQllURVNf U0VOVChzYywgbikJKHNjKS0+c2Nfc3RhdC5ieXRlc19zZW50ICs9IChuKQorI2RlZmluZQlVQlRf U1RBVF9QQ0tUU19SRUNWKHNjKQkJKHNjKS0+c2Nfc3RhdC5wY2t0c19yZWN2ICsrCisjZGVmaW5l CVVCVF9TVEFUX0JZVEVTX1JFQ1Yoc2MsIG4pCShzYyktPnNjX3N0YXQuYnl0ZXNfcmVjdiArPSAo bikKKyNkZWZpbmUJVUJUX1NUQVRfT0VSUk9SKHNjKQkJKHNjKS0+c2Nfc3RhdC5vZXJyb3JzICsr CisjZGVmaW5lCVVCVF9TVEFUX0lFUlJPUihzYykJCShzYyktPnNjX3N0YXQuaWVycm9ycyArKwor I2RlZmluZQlVQlRfU1RBVF9SRVNFVChzYykJYnplcm8oJihzYyktPnNjX3N0YXQsIHNpemVvZigo c2MpLT5zY19zdGF0KSkKIAotCXN0cnVjdCBtdHggc2NfbXR4OwotCiAJLyogVVNCIGRldmljZSBz cGVjaWZpYyAqLwotCXN0cnVjdCB1c2IyX3hmZXIgKnNjX3hmZXJfaWZfMFtVQlRfSUZfMF9OX1RS QU5TRkVSXTsKLQlzdHJ1Y3QgdXNiMl94ZmVyICpzY194ZmVyX2lmXzFbVUJUX0lGXzFfTl9UUkFO U0ZFUl07CisJc3RydWN0IG10eAkJc2NfaWZfMF9tdHg7CS8qIGlmICMwIGxvY2sgKi8KKwlzdHJ1 Y3QgdXNiMl94ZmVyCSpzY194ZmVyX2lmXzBbVUJUX0lGXzBfTl9UUkFOU0ZFUl07CiAKLQkvKiBJ bnRlcnJ1cHQgcGlwZSAoSENJIGV2ZW50cykgKi8KLQlzdHJ1Y3QgbWJ1ZiAqc2NfaW50cl9idWZm ZXI7CS8qIGludGVycnVwdCBidWZmZXIgKi8KKwlzdHJ1Y3QgbXR4CQlzY19pZl8xX210eDsJLyog aWYgIzEgbG9jayAqLworCXN0cnVjdCB1c2IyX3hmZXIJKnNjX3hmZXJfaWZfMVtVQlRfSUZfMV9O X1RSQU5TRkVSXTsKIAotCS8qIENvbnRyb2wgcGlwZSAoSENJIGNvbW1hbmRzKSAqLwotCXN0cnVj dCBuZ19idF9tYnVmcSBzY19jbWRxOwkvKiBIQ0kgY29tbWFuZCBxdWV1ZSAqLwotI2RlZmluZQlV QlRfQ1RSTF9CVUZGRVJfU0laRSAoc2l6ZW9mKG5nX2hjaV9jbWRfcGt0X3QpICsgTkdfSENJX0NN RF9QS1RfU0laRSkKKwlzdHJ1Y3QgbXR4CQlzY19tYnVmcV9tdHg7CS8qIGxvY2sgZm9yIGFsbCBx dWV1ZXMgKi8KIAotCS8qIEJ1bGsgaW4gcGlwZSAoQUNMIGRhdGEpICovCi0Jc3RydWN0IG1idWYg KnNjX2J1bGtfaW5fYnVmZmVyOwkvKiBidWxrLWluIGJ1ZmZlciAqLworCS8qIEhDSSBjb21tYW5k cyAqLworCXN0cnVjdCBuZ19idF9tYnVmcQlzY19jbWRxOwkvKiBIQ0kgY29tbWFuZCBxdWV1ZSAq LworI2RlZmluZQlVQlRfQ1RSTF9CVUZGRVJfU0laRQkoc2l6ZW9mKG5nX2hjaV9jbWRfcGt0X3Qp ICsgTkdfSENJX0NNRF9QS1RfU0laRSkKKyNkZWZpbmUJVUJUX0lOVFJfQlVGRkVSX1NJWkUJKE1D TEJZVEVTLTEpCS8qIHJlc2VydmUgMSBieXRlIGZvciBJRC10YWcgKi8KIAotCS8qIEJ1bGsgb3V0 IHBpcGUgKEFDTCBkYXRhKSAqLwotCXN0cnVjdCBuZ19idF9tYnVmcSBzY19hY2xxOwkvKiBBQ0wg ZGF0YSBxdWV1ZSAqLwotI2RlZmluZQlVQlRfQlVMS19SRUFEX0JVRkZFUl9TSVpFIChNQ0xCWVRF Uy0xKQkvKiByZXNlcnZlIG9uZSBieXRlIGZvciBJRC10YWcgKi8KKwkvKiBBQ0wgZGF0YSAqLwor CXN0cnVjdCBuZ19idF9tYnVmcQlzY19hY2xxOwkvKiBBQ0wgZGF0YSBxdWV1ZSAqLworI2RlZmlu ZQlVQlRfQlVMS19SRUFEX0JVRkZFUl9TSVpFIChNQ0xCWVRFUy0xKQkvKiByZXNlcnZlIDEgYnl0 ZSBmb3IgSUQtdGFnICovCiAjZGVmaW5lCVVCVF9CVUxLX1dSSVRFX0JVRkZFUl9TSVpFIChNQ0xC WVRFUykKIAotCS8qIElzb2MuIG91dCBwaXBlIChBQ0wgZGF0YSkgKi8KLQlzdHJ1Y3QgbmdfYnRf bWJ1ZnEgc2Nfc2NvcTsJLyogU0NPIGRhdGEgcXVldWUgKi8KKwkvKiBTQ08gZGF0YSAqLworCXN0 cnVjdCBuZ19idF9tYnVmcQlzY19zY29xOwkvKiBTQ08gZGF0YSBxdWV1ZSAqLworCXN0cnVjdCBt YnVmCQkqc2NfaXNvY19pbl9idWZmZXI7IC8qIFNDTyByZWFzc2VtYmx5IGJ1ZmZlciAqLwogCi0J LyogSXNvYy4gaW4gcGlwZSAoQUNMIGRhdGEpICovCi0Jc3RydWN0IG5nX2J0X21idWZxIHNjX3Nj aXE7CS8qIFNDTyBkYXRhIHF1ZXVlICovCi0KIAkvKiBOZXRncmFwaCBzcGVjaWZpYyAqLwotCW5v ZGVfcAlzY19ub2RlOwkJLyogcG9pbnRlciBiYWNrIHRvIG5vZGUgKi8KLQlob29rX3AJc2NfaG9v azsJCS8qIHVwc3RyZWFtIGhvb2sgKi8KKwlub2RlX3AJCQlzY19ub2RlOwkvKiBwb2ludGVyIGJh Y2sgdG8gbm9kZSAqLworCWhvb2tfcAkJCXNjX2hvb2s7CS8qIHVwc3RyZWFtIGhvb2sgKi8KKwor CS8qIEdsdWUgKi8KKwl1aW50MzJfdAkJc2NfdGFza19mbGFnczsJLyogdGFzayBmbGFncyAqLwor I2RlZmluZSBVQlRfRkxBR19UX1BFTkRJTkcJKDEgPDwgMCkJLyogdGFzayBwZW5kaW5nICovCisj ZGVmaW5lIFVCVF9GTEFHX1RfU1RPUF9BTEwJKDEgPDwgMSkJLyogc3RvcCBhbGwgeGZlcnMgKi8K KyNkZWZpbmUgVUJUX0ZMQUdfVF9TVEFSVF9BTEwJKDEgPDwgMikJLyogc3RhcnQgYWxsIHJlYWQg eGZlcnMgKi8KKyNkZWZpbmUgVUJUX0ZMQUdfVF9TVEFSVF9DVFJMCSgxIDw8IDMpCS8qIHN0YXJ0 IGNvbnRyb2wgeGZlciAod3JpdGUpICovCisjZGVmaW5lIFVCVF9GTEFHX1RfU1RBUlRfQlVMSwko MSA8PCA0KQkvKiBzdGFydCBidWxrIHhmZXIgKHdyaXRlKSAqLworI2RlZmluZSBVQlRfRkxBR19U X1NUQVJUX0lTT0MJKDEgPDwgNSkJLyogc3RhcnQgaXNvYyB4ZmVyICh3cml0ZSkgKi8KKworCXN0 cnVjdCB0YXNrCQlzY190YXNrOwogfTsKIHR5cGVkZWYgc3RydWN0IHVidF9zb2Z0YyB1YnRfc29m dGNfdDsKIHR5cGVkZWYgc3RydWN0IHVidF9zb2Z0YyAqdWJ0X3NvZnRjX3A7CiAKLSNlbmRpZgkJ CQkJLyogbmRlZiBfTkdfVUJUX1ZBUl9IXyAqLworI2VuZGlmIC8qIG5kZWYgX05HX1VCVF9WQVJf SF8gKi8KKwo= ------=_Part_379362_12485152.1231981552982-- From owner-freebsd-bluetooth@FreeBSD.ORG Thu Jan 15 09:51: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 CDBF11065677 for ; Thu, 15 Jan 2009 09:51:51 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe01.swip.net [212.247.154.1]) by mx1.freebsd.org (Postfix) with ESMTP id 662D98FC1D for ; Thu, 15 Jan 2009 09:51:51 +0000 (UTC) (envelope-from hselasky@c2i.net) X-Cloudmark-Score: 0.000000 [] X-Cloudmark-Analysis: v=1.0 c=1 a=nklthdr5v5AUSfVrlghuJA==:17 a=wUzucHXjHoBfGvG_V-8A:9 a=g5Ie3j6nO3gFleqzldbO8-bbd0QA:4 a=LY0hPdMaydYA:10 Received: from [62.113.132.62] (account mc467741@c2i.net [62.113.132.62] verified) by mailfe01.swip.net (CommuniGate Pro SMTP 5.2.6) with ESMTPA id 129542983; Thu, 15 Jan 2009 09:51:48 +0100 From: Hans Petter Selasky To: "Maksim Yevmenkin" Date: Thu, 15 Jan 2009 09:54:10 +0100 User-Agent: KMail/1.9.7 References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200901150954.11454.hselasky@c2i.net> Cc: "freebsd-bluetooth@freebsd.org" , Alfred Perlstein Subject: Re: USB2: ng_ubt2 patch 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: Thu, 15 Jan 2009 09:51:52 -0000 On Thursday 15 January 2009, Maksim Yevmenkin wrote: > dear bluetooth users, > > please find attached patch for ng_ubt2 (well it is almost a complete > rewrite). > > this is an early preview and likely to have bugs. i briefly kicked the > tires to make sure it compiles and did some very quick testing, i.e. > run few hci commands, sdp transfers etc. > > this is my first attempt to write something under usb2, so any > review/comments/suggestions/etc. are greatly appreciated. > > thanks, > max Hi, This looks very interesting. 1) Maybe you just want to merge together all the USB config structures into one? 2) There are some isochronous details for non-Full speed USB. UBT_ISOC_NFRAMES must be a factor of 8 if it should work. How much bluetooth functionality have you tested? BTW: I think your patch is pretty Ok. Is what you attached the final version of your patch? --HPS From owner-freebsd-bluetooth@FreeBSD.ORG Thu Jan 15 17:55:55 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 270DA1065674; Thu, 15 Jan 2009 17:55:55 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: from rv-out-0506.google.com (rv-out-0506.google.com [209.85.198.230]) by mx1.freebsd.org (Postfix) with ESMTP id D720F8FC17; Thu, 15 Jan 2009 17:55:54 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: by rv-out-0506.google.com with SMTP id b25so1221305rvf.43 for ; Thu, 15 Jan 2009 09:55:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:cc:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=uA8wyDQ2+PJIEd05cylWHNYE2q8HxzGYjl/I+N6qazw=; b=eMQ0hyrLDQzjDmkmPb6s7/GfyGkgRVbuy2vWAtcFOJo/UM9O2A0r3XA90cbm1pKCLJ Kzhmm2LzgBvPrNUna+aw51FwYxdZcSd7iGyp2Ix71hmUBPft7ttDN1hk0fD8sJmSHhir lxoS1uFEa7Tm4DxpX7MSQ6PFzzfJjW1sUlREA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:cc:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=DwC43MU6escyWVCFJmxlko2VBglCmfIvQ5i5Mmyj+HeP8mSFiYQ8C4zXZzQDfDBPZ5 0xbcp30amhNfxMvvgrenDgATRWGzNN1s4PgXP7Dd4h3MN9vRXkOo9nxrw2fS79XPk7jh LHBCOs2JhElvFRtawl1YR/KZrIXQSPBMyHZ8E= Received: by 10.140.141.16 with SMTP id o16mr736254rvd.138.1232042154629; Thu, 15 Jan 2009 09:55:54 -0800 (PST) Received: by 10.141.210.11 with HTTP; Thu, 15 Jan 2009 09:55:54 -0800 (PST) Message-ID: Date: Thu, 15 Jan 2009 09:55:54 -0800 From: "Maksim Yevmenkin" To: "Hans Petter Selasky" In-Reply-To: <200901150954.11454.hselasky@c2i.net> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <200901150954.11454.hselasky@c2i.net> Cc: "freebsd-bluetooth@freebsd.org" , Alfred Perlstein Subject: Re: USB2: ng_ubt2 patch 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: Thu, 15 Jan 2009 17:55:55 -0000 On Thu, Jan 15, 2009 at 12:54 AM, Hans Petter Selasky wrote: > On Thursday 15 January 2009, Maksim Yevmenkin wrote: >> dear bluetooth users, >> >> please find attached patch for ng_ubt2 (well it is almost a complete >> rewrite). >> >> this is an early preview and likely to have bugs. i briefly kicked the >> tires to make sure it compiles and did some very quick testing, i.e. >> run few hci commands, sdp transfers etc. >> >> this is my first attempt to write something under usb2, so any >> review/comments/suggestions/etc. are greatly appreciated. > > This looks very interesting. thanks for taking time and looking at this. > 1) Maybe you just want to merge together all the USB config structures into > one? i guess, i could. since isoc transfers are going over different (from control, interrupt and bulk transfers) interface, i kept original code that had two separate usb2_config structures (i.e. one per each interface). for the same reason, i added separate lock for interface 1 (where isoc transfers are). i figured, due to the nature of isoc transfers, this lock will be grabbed a lot more often. it seemed like a good idea to use different lock so there would be less contention with interface 0 lock. but then again, may be i just full of it :) and it really does not matter. could you please tell me what is the reason for merging usb2_config structures? is it better for usb2? > 2) There are some isochronous details for non-Full speed USB. UBT_ISOC_NFRAMES > must be a factor of 8 if it should work. ok. the bluetooth spec says device should be a high speed device, however, i have a bluetooth usb dongle (made by 3com) that is not a high speed device. so, if i just bump UBT_ISOC_NFRAMES to 32, this should work for both full- and high-speed devices, right? another question is how to submit isoc. writes. recall that ubt driver uses multiple isoc transfers in both directions. older (usb1) code kept track of isoc write transfers and knew which were not active. so when ubt needed to write isoc frame, it simply picked inactive isoc transfer. so, should i simply start all isoc write transfers and let usb2 code to figure it out or what? also, i'm a bit confused about api. what is the difference between usb2_transfer_start() and usb2_start_hardware() and when one should use former or later? > How much bluetooth functionality have you tested? like i said, i kicked the tires :) hci commands/events appear to work. acl/l2cap appears to work as well. i have not tried isoc (read my questions above). of course, i will need to run torture tests etc. > BTW: I think your patch is pretty Ok. Is what you attached the final version > of your patch? probably not. i'm sure there will be some tweaks to it. hopefully nothing too big. i'm just not sure how should i proceed at this point, i.e. do i 1) start committing this to -head and let you pick it up from there or 2) let you commit this into p4 (or whatever) and then let you merge it into -head thanks, max From owner-freebsd-bluetooth@FreeBSD.ORG Thu Jan 15 21:22:59 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 720B9106566B; Thu, 15 Jan 2009 21:22:59 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe03.swip.net [212.247.154.65]) by mx1.freebsd.org (Postfix) with ESMTP id A84458FC1A; Thu, 15 Jan 2009 21:22:58 +0000 (UTC) (envelope-from hselasky@c2i.net) X-Cloudmark-Score: 0.000000 [] X-Cloudmark-Analysis: v=1.0 c=1 a=Im5sUIf0P5du4uI3pzIA:9 a=Gp-RG0t7FPEp1h8Vp9QA:7 a=-pZmxOk5qkuEwPyzpqV1PLYpqLUA:4 a=9aOQ2cSd83gA:10 a=LY0hPdMaydYA:10 Received: from [193.217.167.134] (account mc467741@c2i.net HELO [10.0.0.186]) by mailfe03.swip.net (CommuniGate Pro SMTP 5.2.6) with ESMTPA id 1185205512; Thu, 15 Jan 2009 22:22:56 +0100 From: Hans Petter Selasky To: "Maksim Yevmenkin" Date: Thu, 15 Jan 2009 22:25:18 +0100 User-Agent: KMail/1.9.7 References: <200901150954.11454.hselasky@c2i.net> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200901152225.19150.hselasky@c2i.net> Cc: "freebsd-bluetooth@freebsd.org" , Alfred Perlstein Subject: Re: USB2: ng_ubt2 patch 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: Thu, 15 Jan 2009 21:22:59 -0000 On Thursday 15 January 2009, Maksim Yevmenkin wrote: > On Thu, Jan 15, 2009 at 12:54 AM, Hans Petter Selasky wrote: > > On Thursday 15 January 2009, Maksim Yevmenkin wrote: > >> dear bluetooth users, > >> > >> please find attached patch for ng_ubt2 (well it is almost a complete > >> rewrite). > >> > >> this is an early preview and likely to have bugs. i briefly kicked the > >> tires to make sure it compiles and did some very quick testing, i.e. > >> run few hci commands, sdp transfers etc. > >> > >> this is my first attempt to write something under usb2, so any > >> review/comments/suggestions/etc. are greatly appreciated. > > > > This looks very interesting. > > thanks for taking time and looking at this. > > > 1) Maybe you just want to merge together all the USB config structures > > into one? > > i guess, i could. since isoc transfers are going over different (from > control, interrupt and bulk transfers) interface, i kept original code > that had two separate usb2_config structures (i.e. one per each > interface). for the same reason, i added separate lock for interface 1 > (where isoc transfers are). i figured, due to the nature of isoc > transfers, this lock will be grabbed a lot more often. it seemed like > a good idea to use different lock so there would be less contention > with interface 0 lock. but then again, may be i just full of it :) and > it really does not matter. > > could you please tell me what is the reason for merging usb2_config > structures? is it better for usb2? It will save some memory allocations. > > > 2) There are some isochronous details for non-Full speed USB. > > UBT_ISOC_NFRAMES must be a factor of 8 if it should work. > > ok. the bluetooth spec says device should be a high speed device, > however, i have a bluetooth usb dongle (made by 3com) that is not a > high speed device. so, if i just bump UBT_ISOC_NFRAMES to 32, this > should work for both full- and high-speed devices, right? Yes, just note that High-Speed USB is 8000 fps while Full-Speed USB is 1000 fps. > > another question is how to submit isoc. writes. recall that ubt driver > uses multiple isoc transfers in both directions. older (usb1) code > kept track of isoc write transfers and knew which were not active. so > when ubt needed to write isoc frame, it simply picked inactive isoc > transfer. so, should i simply start all isoc write transfers and let > usb2 code to figure it out or what? also, i'm a bit confused about > api. what is the difference between usb2_transfer_start() and > usb2_start_hardware() and when one should use former or later? Two ISOC transfers are enough for double buffering. > > > How much bluetooth functionality have you tested? > > like i said, i kicked the tires :) hci commands/events appear to work. > acl/l2cap appears to work as well. i have not tried isoc (read my > questions above). of course, i will need to run torture tests etc. Great! > > > BTW: I think your patch is pretty Ok. Is what you attached the final > > version of your patch? > > probably not. i'm sure there will be some tweaks to it. hopefully > nothing too big. i'm just not sure how should i proceed at this point, > i.e. do i > > 1) start committing this to -head and let you pick it up from there > > or > > 2) let you commit this into p4 (or whatever) and then let you merge it > into -head Just re-send me the latest patch you've got and I'll get it in P4 and my private SVN first. --HPS From owner-freebsd-bluetooth@FreeBSD.ORG Fri Jan 16 01:08:05 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 C339A1065673; Fri, 16 Jan 2009 01:08:05 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: from rv-out-0506.google.com (rv-out-0506.google.com [209.85.198.226]) by mx1.freebsd.org (Postfix) with ESMTP id 7FE728FC0C; Fri, 16 Jan 2009 01:08:05 +0000 (UTC) (envelope-from maksim.yevmenkin@gmail.com) Received: by rv-out-0506.google.com with SMTP id b25so1391043rvf.43 for ; Thu, 15 Jan 2009 17:08:05 -0800 (PST) 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 :content-transfer-encoding; bh=ZOYCXI9Ei+OkJhDeQRxIEffW6MIhzmO7EsbmpuaEkuI=; b=H5KQo/hVIRFa7prqnntCahnfjBIuyHyRiU1Ni/rXcse0gFLsYZO78f+qhyYq8LHbr9 4SMeLc9PcBV7ipEoETgF23RB2rfKOYGQVVGYG7LYNi8fBNGILXg+spsua35C52ibQVI+ gFxDbTSd6MBWTQLNEeEhC522HxPpmxKE4Bp40= 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:content-transfer-encoding; b=n3Nf89xOGVA9scpLPZHwQGzEVanXchaljrGoryBBGRJCJa0a0gykjK3GCUkGZM02i2 HiZ7LpNJw6CjA+JcqYcom8uUfmRQ8hG0gweqTS/Kiqc0pp1eU0zZsOJjsOFdOWWDAOah kkuWbXb4RDQImCCiz2rCJ6AdWITNR057W5U+Y= MIME-Version: 1.0 Received: by 10.140.147.5 with SMTP id u5mr903645rvd.292.1232068085261; Thu, 15 Jan 2009 17:08:05 -0800 (PST) In-Reply-To: <200901152225.19150.hselasky@c2i.net> References: <200901150954.11454.hselasky@c2i.net> <200901152225.19150.hselasky@c2i.net> Date: Thu, 15 Jan 2009 17:08:05 -0800 Message-ID: From: Maksim Yevmenkin To: Hans Petter Selasky Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: "freebsd-bluetooth@freebsd.org" , Alfred Perlstein Subject: Re: USB2: ng_ubt2 patch 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: Fri, 16 Jan 2009 01:08:06 -0000 On Thu, Jan 15, 2009 at 1:25 PM, Hans Petter Selasky wrote: > On Thursday 15 January 2009, Maksim Yevmenkin wrote: >> On Thu, Jan 15, 2009 at 12:54 AM, Hans Petter Selasky > wrote: >> > On Thursday 15 January 2009, Maksim Yevmenkin wrote: [...] >> thanks for taking time and looking at this. >> >> > 1) Maybe you just want to merge together all the USB config structures >> > into one? >> >> i guess, i could. since isoc transfers are going over different (from >> control, interrupt and bulk transfers) interface, i kept original code >> that had two separate usb2_config structures (i.e. one per each >> interface). for the same reason, i added separate lock for interface 1 >> (where isoc transfers are). i figured, due to the nature of isoc >> transfers, this lock will be grabbed a lot more often. it seemed like >> a good idea to use different lock so there would be less contention >> with interface 0 lock. but then again, may be i just full of it :) and >> it really does not matter. >> >> could you please tell me what is the reason for merging usb2_config >> structures? is it better for usb2? > > It will save some memory allocations. i will see what i can do. [...] >> another question is how to submit isoc. writes. recall that ubt driver >> uses multiple isoc transfers in both directions. older (usb1) code >> kept track of isoc write transfers and knew which were not active. so >> when ubt needed to write isoc frame, it simply picked inactive isoc >> transfer. so, should i simply start all isoc write transfers and let >> usb2 code to figure it out or what? also, i'm a bit confused about >> api. what is the difference between usb2_transfer_start() and >> usb2_start_hardware() and when one should use former or later? > > Two ISOC transfers are enough for double buffering. actually, could you please answer the question: is there an api that would tell me if a given transfer is in progress? i kinda hate to poke into usb2 guts and look at flags_int structure inside usb2_xfer. [...] >> > BTW: I think your patch is pretty Ok. Is what you attached the final >> > version of your patch? >> >> probably not. i'm sure there will be some tweaks to it. hopefully >> nothing too big. i'm just not sure how should i proceed at this point, >> i.e. do i >> >> 1) start committing this to -head and let you pick it up from there >> >> or >> >> 2) let you commit this into p4 (or whatever) and then let you merge it >> into -head > > Just re-send me the latest patch you've got and I'll get it in P4 and my > private SVN first. all right, i will do that. but first i need to iron out a couple of wrinkles :) thanks max From owner-freebsd-bluetooth@FreeBSD.ORG Fri Jan 16 10:10:03 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 D8393106564A for ; Fri, 16 Jan 2009 10:10:03 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe15.swip.net [212.247.155.193]) by mx1.freebsd.org (Postfix) with ESMTP id 4011E8FC18 for ; Fri, 16 Jan 2009 10:10:03 +0000 (UTC) (envelope-from hselasky@c2i.net) X-Cloudmark-Score: 0.000000 [] X-Cloudmark-Analysis: v=1.0 c=1 a=XJqCniYmc70gd2r8hHQA:9 a=gndem-BnFWX76iYu4lkA:7 a=8vZ3wT4StehCd5gmzf95T9yWH00A:4 a=9aOQ2cSd83gA:10 a=LY0hPdMaydYA:10 Received: from [193.217.167.134] (account mc467741@c2i.net HELO [10.0.0.249]) by mailfe15.swip.net (CommuniGate Pro SMTP 5.2.6) with ESMTPA id 435249090; Fri, 16 Jan 2009 10:10:00 +0100 From: Hans Petter Selasky To: Maksim Yevmenkin Date: Fri, 16 Jan 2009 10:12:23 +0100 User-Agent: KMail/1.9.7 References: <200901152225.19150.hselasky@c2i.net> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200901161012.24544.hselasky@c2i.net> Cc: "freebsd-bluetooth@freebsd.org" , Alfred Perlstein Subject: Re: USB2: ng_ubt2 patch 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: Fri, 16 Jan 2009 10:10:04 -0000 On Friday 16 January 2009, Maksim Yevmenkin wrote: > On Thu, Jan 15, 2009 at 1:25 PM, Hans Petter Selasky wrote: > > On Thursday 15 January 2009, Maksim Yevmenkin wrote: > >> On Thu, Jan 15, 2009 at 12:54 AM, Hans Petter Selasky > > > > wrote: > >> > On Thursday 15 January 2009, Maksim Yevmenkin wrote: > > [...] > > >> thanks for taking time and looking at this. > >> > >> > 1) Maybe you just want to merge together all the USB config structures > >> > into one? > >> > >> i guess, i could. since isoc transfers are going over different (from > >> control, interrupt and bulk transfers) interface, i kept original code > >> that had two separate usb2_config structures (i.e. one per each > >> interface). for the same reason, i added separate lock for interface 1 > >> (where isoc transfers are). i figured, due to the nature of isoc > >> transfers, this lock will be grabbed a lot more often. it seemed like > >> a good idea to use different lock so there would be less contention > >> with interface 0 lock. but then again, may be i just full of it :) and > >> it really does not matter. > >> > >> could you please tell me what is the reason for merging usb2_config > >> structures? is it better for usb2? > > > > It will save some memory allocations. > > i will see what i can do. > > [...] > > >> another question is how to submit isoc. writes. recall that ubt driver > >> uses multiple isoc transfers in both directions. older (usb1) code > >> kept track of isoc write transfers and knew which were not active. so > >> when ubt needed to write isoc frame, it simply picked inactive isoc > >> transfer. so, should i simply start all isoc write transfers and let > >> usb2 code to figure it out or what? also, i'm a bit confused about > >> api. what is the difference between If isochronous is being used, then I recommend you have two transfers running at any time in both directions. If there is nothing to send you send zero length frames. Else you end up with glitches in the isochronous stream when you change from one transfer to the other! Both isochronous transfers should be queued all the time! > >> usb2_transfer_start() and > >> usb2_start_hardware() and when one should use former or later? usb2_transfer_start() kicks the callback. usb2_start_hardware() kicks the hardware. I don't recomment calling usb2_start_hardware() outside the callback, but if you check with "usb2_transfer_pending()" then it is possible. > > > > Two ISOC transfers are enough for double buffering. > > actually, could you please answer the question: is there an api that > would tell me if a given transfer is in progress? i kinda hate to poke > into usb2 guts and look at flags_int structure inside usb2_xfer. Yes, see "usb2_transfer_pending()". --HPS