From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: [PATCH v2 net-next 1/7] xen-netback: separate guest side rx code into separate module Date: Tue, 4 Oct 2016 10:29:12 +0100 Message-ID: <1475573358-32414-2-git-send-email-paul.durrant__4150.04156898267$1475574719$gmane$org@citrix.com> References: <1475573358-32414-1-git-send-email-paul.durrant@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1brMLT-0006DR-JU for xen-devel@lists.xenproject.org; Tue, 04 Oct 2016 09:49:07 +0000 In-Reply-To: <1475573358-32414-1-git-send-email-paul.durrant@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: netdev@vger.kernel.org, xen-devel@lists.xenproject.org Cc: Paul Durrant , Wei Liu List-Id: xen-devel@lists.xenproject.org VGhlIG5ldGJhY2sgc291cmNlIG1vZHVsZSBoYXMgYmVjb21lIHZlcnkgbGFyZ2UgYW5kIHNvbWV3 aGF0IGNvbmZ1c2luZy4KVGhpcyBwYXRjaCBzaW1wbHkgbW92ZXMgYWxsIGNvZGUgcmVsYXRlZCB0 byB0aGUgYmFja2VuZCB0byBmcm9udGVuZCAoaS5lCmd1ZXN0IHNpZGUgcngpIGRhdGEtcGF0aCBp bnRvIGEgc2VwYXJhdGUgcnggc291cmNlIG1vZHVsZS4KClRoaXMgcGF0Y2ggY29udGFpbnMgbm8g ZnVuY3Rpb25hbCBjaGFuZ2UsIGl0IGlzIGNvZGUgbW92ZW1lbnQgYW5kCm1pbmltYWwgY2hhbmdl cyB0byBhdm9pZCBwYXRjaCBzdHlsZS1jaGVjayBpc3N1ZXMuCgpTaWduZWQtb2ZmLWJ5OiBQYXVs IER1cnJhbnQgPHBhdWwuZHVycmFudEBjaXRyaXguY29tPgotLS0KQ2M6IFdlaSBMaXUgPHdlaS5s aXUyQGNpdHJpeC5jb20+Ci0tLQogZHJpdmVycy9uZXQveGVuLW5ldGJhY2svTWFrZWZpbGUgIHwg ICAyICstCiBkcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMgfCA3NTQgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL25ldC94ZW4tbmV0YmFjay9yeC5j ICAgICAgfCA3ODkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmls ZXMgY2hhbmdlZCwgNzkwIGluc2VydGlvbnMoKyksIDc1NSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL25ldC94ZW4tbmV0YmFjay9yeC5jCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9uZXQveGVuLW5ldGJhY2svTWFrZWZpbGUgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9N YWtlZmlsZQppbmRleCAxMWUwMmJlLi5kNDk3OThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94 ZW4tbmV0YmFjay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9NYWtlZmls ZQpAQCAtMSwzICsxLDMgQEAKIG9iai0kKENPTkZJR19YRU5fTkVUREVWX0JBQ0tFTkQpIDo9IHhl bi1uZXRiYWNrLm8KIAoteGVuLW5ldGJhY2steSA6PSBuZXRiYWNrLm8geGVuYnVzLm8gaW50ZXJm YWNlLm8gaGFzaC5vCit4ZW4tbmV0YmFjay15IDo9IG5ldGJhY2subyB4ZW5idXMubyBpbnRlcmZh Y2UubyBoYXNoLm8gcngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0 YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IDNkMGM5ODku LjQ3YjQ4MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYwor KysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTEwNiwxMyArMTA2LDYg QEAgc3RhdGljIHZvaWQgcHVzaF90eF9yZXNwb25zZXMoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVl dWUpOwogCiBzdGF0aWMgaW5saW5lIGludCB0eF93b3JrX3RvZG8oc3RydWN0IHhlbnZpZl9xdWV1 ZSAqcXVldWUpOwogCi1zdGF0aWMgc3RydWN0IHhlbl9uZXRpZl9yeF9yZXNwb25zZSAqbWFrZV9y eF9yZXNwb25zZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKLQkJCQkJICAgICB1MTYgICAg ICBpZCwKLQkJCQkJICAgICBzOCAgICAgICBzdCwKLQkJCQkJICAgICB1MTYgICAgICBvZmZzZXQs Ci0JCQkJCSAgICAgdTE2ICAgICAgc2l6ZSwKLQkJCQkJICAgICB1MTYgICAgICBmbGFncyk7Ci0K IHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpZHhfdG9fcGZuKHN0cnVjdCB4ZW52aWZfcXVl dWUgKnF1ZXVlLAogCQkJCSAgICAgICB1MTYgaWR4KQogewpAQCAtMTU1LDU3MSArMTQ4LDExIEBA IHN0YXRpYyBpbmxpbmUgcGVuZGluZ19yaW5nX2lkeF90IHBlbmRpbmdfaW5kZXgodW5zaWduZWQg aSkKIAlyZXR1cm4gaSAmIChNQVhfUEVORElOR19SRVFTLTEpOwogfQogCi1zdGF0aWMgYm9vbCB4 ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUp Ci17Ci0JUklOR19JRFggcHJvZCwgY29uczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBu ZWVkZWQ7Ci0KLQlza2IgPSBza2JfcGVlaygmcXVldWUtPnJ4X3F1ZXVlKTsKLQlpZiAoIXNrYikK LQkJcmV0dXJuIGZhbHNlOwotCi0JbmVlZGVkID0gRElWX1JPVU5EX1VQKHNrYi0+bGVuLCBYRU5f UEFHRV9TSVpFKTsKLQlpZiAoc2tiX2lzX2dzbyhza2IpKQotCQluZWVkZWQrKzsKLQlpZiAoc2ti LT5zd19oYXNoKQotCQluZWVkZWQrKzsKLQotCWRvIHsKLQkJcHJvZCA9IHF1ZXVlLT5yeC5zcmlu Zy0+cmVxX3Byb2Q7Ci0JCWNvbnMgPSBxdWV1ZS0+cngucmVxX2NvbnM7Ci0KLQkJaWYgKHByb2Qg LSBjb25zID49IG5lZWRlZCkKLQkJCXJldHVybiB0cnVlOwotCi0JCXF1ZXVlLT5yeC5zcmluZy0+ cmVxX2V2ZW50ID0gcHJvZCArIDE7Ci0KLQkJLyogTWFrZSBzdXJlIGV2ZW50IGlzIHZpc2libGUg YmVmb3JlIHdlIGNoZWNrIHByb2QKLQkJICogYWdhaW4uCi0JCSAqLwotCQltYigpOwotCX0gd2hp bGUgKHF1ZXVlLT5yeC5zcmluZy0+cmVxX3Byb2QgIT0gcHJvZCk7Ci0KLQlyZXR1cm4gZmFsc2U7 Ci19Ci0KLXZvaWQgeGVudmlmX3J4X3F1ZXVlX3RhaWwoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVl dWUsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNw aW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cnhfcXVldWUubG9jaywgZmxhZ3MpOwotCi0JX19za2Jf cXVldWVfdGFpbCgmcXVldWUtPnJ4X3F1ZXVlLCBza2IpOwotCi0JcXVldWUtPnJ4X3F1ZXVlX2xl biArPSBza2ItPmxlbjsKLQlpZiAocXVldWUtPnJ4X3F1ZXVlX2xlbiA+IHF1ZXVlLT5yeF9xdWV1 ZV9tYXgpCi0JCW5ldGlmX3R4X3N0b3BfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShxdWV1ZS0+ dmlmLT5kZXYsIHF1ZXVlLT5pZCkpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUt PnJ4X3F1ZXVlLmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBza19idWZmICp4ZW52 aWZfcnhfZGVxdWV1ZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3Qgc2tf YnVmZiAqc2tiOwotCi0Jc3Bpbl9sb2NrX2lycSgmcXVldWUtPnJ4X3F1ZXVlLmxvY2spOwotCi0J c2tiID0gX19za2JfZGVxdWV1ZSgmcXVldWUtPnJ4X3F1ZXVlKTsKLQlpZiAoc2tiKQotCQlxdWV1 ZS0+cnhfcXVldWVfbGVuIC09IHNrYi0+bGVuOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZxdWV1ZS0+ cnhfcXVldWUubG9jayk7Ci0KLQlyZXR1cm4gc2tiOwotfQotCi1zdGF0aWMgdm9pZCB4ZW52aWZf cnhfcXVldWVfbWF5YmVfd2FrZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKLXsKLQlzcGlu X2xvY2tfaXJxKCZxdWV1ZS0+cnhfcXVldWUubG9jayk7Ci0KLQlpZiAocXVldWUtPnJ4X3F1ZXVl X2xlbiA8IHF1ZXVlLT5yeF9xdWV1ZV9tYXgpCi0JCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2 X2dldF90eF9xdWV1ZShxdWV1ZS0+dmlmLT5kZXYsIHF1ZXVlLT5pZCkpOwotCi0Jc3Bpbl91bmxv Y2tfaXJxKCZxdWV1ZS0+cnhfcXVldWUubG9jayk7Ci19Ci0KLQotc3RhdGljIHZvaWQgeGVudmlm X3J4X3F1ZXVlX3B1cmdlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCBz a19idWZmICpza2I7Ci0Jd2hpbGUgKChza2IgPSB4ZW52aWZfcnhfZGVxdWV1ZShxdWV1ZSkpICE9 IE5VTEwpCi0JCWtmcmVlX3NrYihza2IpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW52aWZfcnhfcXVl dWVfZHJvcF9leHBpcmVkKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCBz a19idWZmICpza2I7Ci0KLQlmb3IoOzspIHsKLQkJc2tiID0gc2tiX3BlZWsoJnF1ZXVlLT5yeF9x dWV1ZSk7Ci0JCWlmICghc2tiKQotCQkJYnJlYWs7Ci0JCWlmICh0aW1lX2JlZm9yZShqaWZmaWVz LCBYRU5WSUZfUlhfQ0Ioc2tiKS0+ZXhwaXJlcykpCi0JCQlicmVhazsKLQkJeGVudmlmX3J4X2Rl cXVldWUocXVldWUpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQl9Ci19Ci0KLXN0cnVjdCBuZXRyeF9w ZW5kaW5nX29wZXJhdGlvbnMgewotCXVuc2lnbmVkIGNvcHlfcHJvZCwgY29weV9jb25zOwotCXVu c2lnbmVkIG1ldGFfcHJvZCwgbWV0YV9jb25zOwotCXN0cnVjdCBnbnR0YWJfY29weSAqY29weTsK LQlzdHJ1Y3QgeGVudmlmX3J4X21ldGEgKm1ldGE7Ci0JaW50IGNvcHlfb2ZmOwotCWdyYW50X3Jl Zl90IGNvcHlfZ3JlZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgeGVudmlmX3J4X21ldGEgKmdldF9u ZXh0X3J4X2J1ZmZlcihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKLQkJCQkJCSBzdHJ1Y3Qg bmV0cnhfcGVuZGluZ19vcGVyYXRpb25zICpucG8pCi17Ci0Jc3RydWN0IHhlbnZpZl9yeF9tZXRh ICptZXRhOwotCXN0cnVjdCB4ZW5fbmV0aWZfcnhfcmVxdWVzdCByZXE7Ci0KLQlSSU5HX0NPUFlf UkVRVUVTVCgmcXVldWUtPnJ4LCBxdWV1ZS0+cngucmVxX2NvbnMrKywgJnJlcSk7Ci0KLQltZXRh ID0gbnBvLT5tZXRhICsgbnBvLT5tZXRhX3Byb2QrKzsKLQltZXRhLT5nc29fdHlwZSA9IFhFTl9O RVRJRl9HU09fVFlQRV9OT05FOwotCW1ldGEtPmdzb19zaXplID0gMDsKLQltZXRhLT5zaXplID0g MDsKLQltZXRhLT5pZCA9IHJlcS5pZDsKLQotCW5wby0+Y29weV9vZmYgPSAwOwotCW5wby0+Y29w eV9ncmVmID0gcmVxLmdyZWY7Ci0KLQlyZXR1cm4gbWV0YTsKLX0KLQotc3RydWN0IGdvcF9mcmFn X2NvcHkgewotCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlOwotCXN0cnVjdCBuZXRyeF9wZW5k aW5nX29wZXJhdGlvbnMgKm5wbzsKLQlzdHJ1Y3QgeGVudmlmX3J4X21ldGEgKm1ldGE7Ci0JaW50 IGhlYWQ7Ci0JaW50IGdzb190eXBlOwotCWludCBwcm90b2NvbDsKLQlpbnQgaGFzaF9wcmVzZW50 OwotCi0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci19OwotCi1zdGF0aWMgdm9pZCB4ZW52aWZfc2V0dXBf Y29weV9nb3AodW5zaWduZWQgbG9uZyBnZm4sCi0JCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAot CQkJCSAgdW5zaWduZWQgaW50ICpsZW4sCi0JCQkJICBzdHJ1Y3QgZ29wX2ZyYWdfY29weSAqaW5m bykKLXsKLQlzdHJ1Y3QgZ250dGFiX2NvcHkgKmNvcHlfZ29wOwotCXN0cnVjdCB4ZW5fcGFnZV9m b3JlaWduICpmb3JlaWduOwotCS8qIENvbnZlbmllbnQgYWxpYXNlcyAqLwotCXN0cnVjdCB4ZW52 aWZfcXVldWUgKnF1ZXVlID0gaW5mby0+cXVldWU7Ci0Jc3RydWN0IG5ldHJ4X3BlbmRpbmdfb3Bl cmF0aW9ucyAqbnBvID0gaW5mby0+bnBvOwotCXN0cnVjdCBwYWdlICpwYWdlID0gaW5mby0+cGFn ZTsKLQotCUJVR19PTihucG8tPmNvcHlfb2ZmID4gTUFYX0JVRkZFUl9PRkZTRVQpOwotCi0JaWYg KG5wby0+Y29weV9vZmYgPT0gTUFYX0JVRkZFUl9PRkZTRVQpCi0JCWluZm8tPm1ldGEgPSBnZXRf bmV4dF9yeF9idWZmZXIocXVldWUsIG5wbyk7Ci0KLQlpZiAobnBvLT5jb3B5X29mZiArICpsZW4g PiBNQVhfQlVGRkVSX09GRlNFVCkKLQkJKmxlbiA9IE1BWF9CVUZGRVJfT0ZGU0VUIC0gbnBvLT5j b3B5X29mZjsKLQotCWNvcHlfZ29wID0gbnBvLT5jb3B5ICsgbnBvLT5jb3B5X3Byb2QrKzsKLQlj b3B5X2dvcC0+ZmxhZ3MgPSBHTlRDT1BZX2Rlc3RfZ3JlZjsKLQljb3B5X2dvcC0+bGVuID0gKmxl bjsKLQotCWZvcmVpZ24gPSB4ZW5fcGFnZV9mb3JlaWduKHBhZ2UpOwotCWlmIChmb3JlaWduKSB7 Ci0JCWNvcHlfZ29wLT5zb3VyY2UuZG9taWQgPSBmb3JlaWduLT5kb21pZDsKLQkJY29weV9nb3At PnNvdXJjZS51LnJlZiA9IGZvcmVpZ24tPmdyZWY7Ci0JCWNvcHlfZ29wLT5mbGFncyB8PSBHTlRD T1BZX3NvdXJjZV9ncmVmOwotCX0gZWxzZSB7Ci0JCWNvcHlfZ29wLT5zb3VyY2UuZG9taWQgPSBE T01JRF9TRUxGOwotCQljb3B5X2dvcC0+c291cmNlLnUuZ21mbiA9IGdmbjsKLQl9Ci0JY29weV9n b3AtPnNvdXJjZS5vZmZzZXQgPSBvZmZzZXQ7Ci0KLQljb3B5X2dvcC0+ZGVzdC5kb21pZCA9IHF1 ZXVlLT52aWYtPmRvbWlkOwotCWNvcHlfZ29wLT5kZXN0Lm9mZnNldCA9IG5wby0+Y29weV9vZmY7 Ci0JY29weV9nb3AtPmRlc3QudS5yZWYgPSBucG8tPmNvcHlfZ3JlZjsKLQotCW5wby0+Y29weV9v ZmYgKz0gKmxlbjsKLQlpbmZvLT5tZXRhLT5zaXplICs9ICpsZW47Ci0KLQlpZiAoIWluZm8tPmhl YWQpCi0JCXJldHVybjsKLQotCS8qIExlYXZlIGEgZ2FwIGZvciB0aGUgR1NPIGRlc2NyaXB0b3Iu ICovCi0JaWYgKCgxIDw8IGluZm8tPmdzb190eXBlKSAmIHF1ZXVlLT52aWYtPmdzb19tYXNrKQot CQlxdWV1ZS0+cngucmVxX2NvbnMrKzsKLQotCS8qIExlYXZlIGEgZ2FwIGZvciB0aGUgaGFzaCBl eHRyYSBzZWdtZW50LiAqLwotCWlmIChpbmZvLT5oYXNoX3ByZXNlbnQpCi0JCXF1ZXVlLT5yeC5y ZXFfY29ucysrOwotCi0JaW5mby0+aGVhZCA9IDA7IC8qIFRoZXJlIG11c3QgYmUgc29tZXRoaW5n IGluIHRoaXMgYnVmZmVyIG5vdyAqLwotfQotCi1zdGF0aWMgdm9pZCB4ZW52aWZfZ29wX2ZyYWdf Y29weV9ncmFudCh1bnNpZ25lZCBsb25nIGdmbiwKLQkJCQkgICAgICAgdW5zaWduZWQgb2Zmc2V0 LAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLAotCQkJCSAgICAgICB2b2lkICpkYXRhKQot ewotCXVuc2lnbmVkIGludCBieXRlczsKLQotCXdoaWxlIChsZW4pIHsKLQkJYnl0ZXMgPSBsZW47 Ci0JCXhlbnZpZl9zZXR1cF9jb3B5X2dvcChnZm4sIG9mZnNldCwgJmJ5dGVzLCBkYXRhKTsKLQkJ b2Zmc2V0ICs9IGJ5dGVzOwotCQlsZW4gLT0gYnl0ZXM7Ci0JfQotfQotCi0vKgotICogU2V0IHVw IHRoZSBncmFudCBvcGVyYXRpb25zIGZvciB0aGlzIGZyYWdtZW50LiBJZiBpdCdzIGEgZmxpcHBp bmcKLSAqIGludGVyZmFjZSwgd2UgYWxzbyBzZXQgdXAgdGhlIHVubWFwIHJlcXVlc3QgZnJvbSBo ZXJlLgotICovCi1zdGF0aWMgdm9pZCB4ZW52aWZfZ29wX2ZyYWdfY29weShzdHJ1Y3QgeGVudmlm X3F1ZXVlICpxdWV1ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgc3RydWN0IG5ldHJ4X3Bl bmRpbmdfb3BlcmF0aW9ucyAqbnBvLAotCQkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQg bG9uZyBzaXplLAotCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50ICpoZWFkKQotewotCXN0 cnVjdCBnb3BfZnJhZ19jb3B5IGluZm8gPSB7Ci0JCS5xdWV1ZSA9IHF1ZXVlLAotCQkubnBvID0g bnBvLAotCQkuaGVhZCA9ICpoZWFkLAotCQkuZ3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVf Tk9ORSwKLQkJLyogeGVudmlmX3NldF9za2JfaGFzaCgpIHdpbGwgaGF2ZSBlaXRoZXIgc2V0IGEg cy93Ci0JCSAqIGhhc2ggb3IgY2xlYXJlZCB0aGUgaGFzaCBkZXBlbmRpbmcgb24KLQkJICogd2hl dGhlciB0aGUgdGhlIGZyb250ZW5kIHdhbnRzIGEgaGFzaCBmb3IgdGhpcyBza2IuCi0JCSAqLwot CQkuaGFzaF9wcmVzZW50ID0gc2tiLT5zd19oYXNoLAotCX07Ci0JdW5zaWduZWQgbG9uZyBieXRl czsKLQotCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKLQkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3Nv X3R5cGUgJiBTS0JfR1NPX1RDUFY0KQotCQkJaW5mby5nc29fdHlwZSA9IFhFTl9ORVRJRl9HU09f VFlQRV9UQ1BWNDsKLQkJZWxzZSBpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9H U09fVENQVjYpCi0JCQlpbmZvLmdzb190eXBlID0gWEVOX05FVElGX0dTT19UWVBFX1RDUFY2Owot CX0KLQotCS8qIERhdGEgbXVzdCBub3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAqLwotCUJVR19P TihzaXplICsgb2Zmc2V0ID4gUEFHRV9TSVpFPDxjb21wb3VuZF9vcmRlcihwYWdlKSk7Ci0KLQlp bmZvLm1ldGEgPSBucG8tPm1ldGEgKyBucG8tPm1ldGFfcHJvZCAtIDE7Ci0KLQkvKiBTa2lwIHVu dXNlZCBmcmFtZXMgZnJvbSBzdGFydCBvZiBwYWdlICovCi0JcGFnZSArPSBvZmZzZXQgPj4gUEFH RV9TSElGVDsKLQlvZmZzZXQgJj0gflBBR0VfTUFTSzsKLQotCXdoaWxlIChzaXplID4gMCkgewot CQlCVUdfT04ob2Zmc2V0ID49IFBBR0VfU0laRSk7Ci0KLQkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBv ZmZzZXQ7Ci0JCWlmIChieXRlcyA+IHNpemUpCi0JCQlieXRlcyA9IHNpemU7Ci0KLQkJaW5mby5w YWdlID0gcGFnZTsKLQkJZ250dGFiX2ZvcmVhY2hfZ3JhbnRfaW5fcmFuZ2UocGFnZSwgb2Zmc2V0 LCBieXRlcywKLQkJCQkJICAgICAgeGVudmlmX2dvcF9mcmFnX2NvcHlfZ3JhbnQsCi0JCQkJCSAg ICAgICZpbmZvKTsKLQkJc2l6ZSAtPSBieXRlczsKLQkJb2Zmc2V0ID0gMDsKLQotCQkvKiBOZXh0 IHBhZ2UgKi8KLQkJaWYgKHNpemUpIHsKLQkJCUJVR19PTighUGFnZUNvbXBvdW5kKHBhZ2UpKTsK LQkJCXBhZ2UrKzsKLQkJfQotCX0KLQotCSpoZWFkID0gaW5mby5oZWFkOwotfQotCi0vKgotICog UHJlcGFyZSBhbiBTS0IgdG8gYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIGZyb250ZW5kLgotICoKLSAq IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgZ3JhbnQgb3BlcmF0 aW9ucywgbWV0YQotICogc3RydWN0dXJlcywgZXRjLgotICoKLSAqIEl0IHJldHVybnMgdGhlIG51 bWJlciBvZiBtZXRhIHN0cnVjdHVyZXMgY29uc3VtZWQuIFRoZSBudW1iZXIgb2YKLSAqIHJpbmcg c2xvdHMgdXNlZCBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBtZXRhIHNsb3RzIHVz ZWQKLSAqIHBsdXMgdGhlIG51bWJlciBvZiBHU08gZGVzY3JpcHRvcnMgdXNlZC4gQ3VycmVudGx5 LCB3ZSB1c2UgZWl0aGVyCi0gKiB6ZXJvIEdTTyBkZXNjcmlwdG9ycyAoZm9yIG5vbi1HU08gcGFj a2V0cykgb3Igb25lIGRlc2NyaXB0b3IgKGZvcgotICogZnJvbnRlbmQtc2lkZSBMUk8pLgotICov Ci1zdGF0aWMgaW50IHhlbnZpZl9nb3Bfc2tiKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIHN0 cnVjdCBuZXRyeF9wZW5kaW5nX29wZXJhdGlvbnMgKm5wbywKLQkJCSAgc3RydWN0IHhlbnZpZl9x dWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoc2tiLT5k ZXYpOwotCWludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0JaW50IGk7 Ci0Jc3RydWN0IHhlbl9uZXRpZl9yeF9yZXF1ZXN0IHJlcTsKLQlzdHJ1Y3QgeGVudmlmX3J4X21l dGEgKm1ldGE7Ci0JdW5zaWduZWQgY2hhciAqZGF0YTsKLQlpbnQgaGVhZCA9IDE7Ci0JaW50IG9s ZF9tZXRhX3Byb2Q7Ci0JaW50IGdzb190eXBlOwotCi0Jb2xkX21ldGFfcHJvZCA9IG5wby0+bWV0 YV9wcm9kOwotCi0JZ3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfTk9ORTsKLQlpZiAoc2ti X2lzX2dzbyhza2IpKSB7Ci0JCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dT T19UQ1BWNCkKLQkJCWdzb190eXBlID0gWEVOX05FVElGX0dTT19UWVBFX1RDUFY0OwotCQllbHNl IGlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNikKLQkJCWdzb190 eXBlID0gWEVOX05FVElGX0dTT19UWVBFX1RDUFY2OwotCX0KLQotCS8qIFNldCB1cCBhIEdTTyBw cmVmaXggZGVzY3JpcHRvciwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCgxIDw8IGdzb190eXBlKSAm IHZpZi0+Z3NvX3ByZWZpeF9tYXNrKSB7Ci0JCVJJTkdfQ09QWV9SRVFVRVNUKCZxdWV1ZS0+cngs IHF1ZXVlLT5yeC5yZXFfY29ucysrLCAmcmVxKTsKLQkJbWV0YSA9IG5wby0+bWV0YSArIG5wby0+ bWV0YV9wcm9kKys7Ci0JCW1ldGEtPmdzb190eXBlID0gZ3NvX3R5cGU7Ci0JCW1ldGEtPmdzb19z aXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQkJbWV0YS0+c2l6ZSA9IDA7Ci0JCW1l dGEtPmlkID0gcmVxLmlkOwotCX0KLQotCVJJTkdfQ09QWV9SRVFVRVNUKCZxdWV1ZS0+cngsIHF1 ZXVlLT5yeC5yZXFfY29ucysrLCAmcmVxKTsKLQltZXRhID0gbnBvLT5tZXRhICsgbnBvLT5tZXRh X3Byb2QrKzsKLQotCWlmICgoMSA8PCBnc29fdHlwZSkgJiB2aWYtPmdzb19tYXNrKSB7Ci0JCW1l dGEtPmdzb190eXBlID0gZ3NvX3R5cGU7Ci0JCW1ldGEtPmdzb19zaXplID0gc2tiX3NoaW5mbyhz a2IpLT5nc29fc2l6ZTsKLQl9IGVsc2UgewotCQltZXRhLT5nc29fdHlwZSA9IFhFTl9ORVRJRl9H U09fVFlQRV9OT05FOwotCQltZXRhLT5nc29fc2l6ZSA9IDA7Ci0JfQotCi0JbWV0YS0+c2l6ZSA9 IDA7Ci0JbWV0YS0+aWQgPSByZXEuaWQ7Ci0JbnBvLT5jb3B5X29mZiA9IDA7Ci0JbnBvLT5jb3B5 X2dyZWYgPSByZXEuZ3JlZjsKLQotCWRhdGEgPSBza2ItPmRhdGE7Ci0Jd2hpbGUgKGRhdGEgPCBz a2JfdGFpbF9wb2ludGVyKHNrYikpIHsKLQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG9mZnNldF9p bl9wYWdlKGRhdGEpOwotCQl1bnNpZ25lZCBpbnQgbGVuID0gUEFHRV9TSVpFIC0gb2Zmc2V0Owot Ci0JCWlmIChkYXRhICsgbGVuID4gc2tiX3RhaWxfcG9pbnRlcihza2IpKQotCQkJbGVuID0gc2ti X3RhaWxfcG9pbnRlcihza2IpIC0gZGF0YTsKLQotCQl4ZW52aWZfZ29wX2ZyYWdfY29weShxdWV1 ZSwgc2tiLCBucG8sCi0JCQkJICAgICB2aXJ0X3RvX3BhZ2UoZGF0YSksIGxlbiwgb2Zmc2V0LCAm aGVhZCk7Ci0JCWRhdGEgKz0gbGVuOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsg aSsrKSB7Ci0JCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHF1ZXVlLCBza2IsIG5wbywKLQkJCQkgICAg IHNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pLAotCQkJCSAgICAgc2ti X2ZyYWdfc2l6ZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSksCi0JCQkJICAgICBza2Jfc2hp bmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgJmhlYWQpOwotCX0KLQot CXJldHVybiBucG8tPm1ldGFfcHJvZCAtIG9sZF9tZXRhX3Byb2Q7Ci19Ci0KLS8qCi0gKiBUaGlz IGlzIGEgdHdpbiB0byB4ZW52aWZfZ29wX3NrYi4gIEFzc3VtZSB0aGF0IHhlbnZpZl9nb3Bfc2ti IHdhcwotICogdXNlZCB0byBzZXQgdXAgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHRvcCBvZgotICog bmV0cnhfcGVuZGluZ19vcGVyYXRpb25zLCB3aGljaCBoYXZlIHNpbmNlIGJlZW4gZG9uZS4gIENo ZWNrIHRoYXQKLSAqIHRoZXkgZGlkbid0IGdpdmUgYW55IGVycm9ycyBhbmQgYWR2YW5jZSBvdmVy IHRoZW0uCi0gKi8KLXN0YXRpYyBpbnQgeGVudmlmX2NoZWNrX2dvcChzdHJ1Y3QgeGVudmlmICp2 aWYsIGludCBucl9tZXRhX3Nsb3RzLAotCQkJICAgIHN0cnVjdCBuZXRyeF9wZW5kaW5nX29wZXJh dGlvbnMgKm5wbykKLXsKLQlzdHJ1Y3QgZ250dGFiX2NvcHkgICAgICpjb3B5X29wOwotCWludCBz dGF0dXMgPSBYRU5fTkVUSUZfUlNQX09LQVk7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwg bnJfbWV0YV9zbG90czsgaSsrKSB7Ci0JCWNvcHlfb3AgPSBucG8tPmNvcHkgKyBucG8tPmNvcHlf Y29ucysrOwotCQlpZiAoY29weV9vcC0+c3RhdHVzICE9IEdOVFNUX29rYXkpIHsKLQkJCW5ldGRl dl9kYmcodmlmLT5kZXYsCi0JCQkJICAgIkJhZCBzdGF0dXMgJWQgZnJvbSBjb3B5IHRvIERPTSVk LlxuIiwKLQkJCQkgICBjb3B5X29wLT5zdGF0dXMsIHZpZi0+ZG9taWQpOwotCQkJc3RhdHVzID0g WEVOX05FVElGX1JTUF9FUlJPUjsKLQkJfQotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0 YXRpYyB2b2lkIHhlbnZpZl9hZGRfZnJhZ19yZXNwb25zZXMoc3RydWN0IHhlbnZpZl9xdWV1ZSAq cXVldWUsIGludCBzdGF0dXMsCi0JCQkJICAgICAgc3RydWN0IHhlbnZpZl9yeF9tZXRhICptZXRh LAotCQkJCSAgICAgIGludCBucl9tZXRhX3Nsb3RzKQotewotCWludCBpOwotCXVuc2lnbmVkIGxv bmcgb2Zmc2V0OwotCi0JLyogTm8gZnJhZ21lbnRzIHVzZWQgKi8KLQlpZiAobnJfbWV0YV9zbG90 cyA8PSAxKQotCQlyZXR1cm47Ci0KLQlucl9tZXRhX3Nsb3RzLS07Ci0KLQlmb3IgKGkgPSAwOyBp IDwgbnJfbWV0YV9zbG90czsgaSsrKSB7Ci0JCWludCBmbGFnczsKLQkJaWYgKGkgPT0gbnJfbWV0 YV9zbG90cyAtIDEpCi0JCQlmbGFncyA9IDA7Ci0JCWVsc2UKLQkJCWZsYWdzID0gWEVOX05FVFJY Rl9tb3JlX2RhdGE7Ci0KLQkJb2Zmc2V0ID0gMDsKLQkJbWFrZV9yeF9yZXNwb25zZShxdWV1ZSwg bWV0YVtpXS5pZCwgc3RhdHVzLCBvZmZzZXQsCi0JCQkJIG1ldGFbaV0uc2l6ZSwgZmxhZ3MpOwot CX0KLX0KLQogdm9pZCB4ZW52aWZfa2lja190aHJlYWQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVl dWUpCiB7CiAJd2FrZV91cCgmcXVldWUtPndxKTsKIH0KIAotc3RhdGljIHZvaWQgeGVudmlmX3J4 X2FjdGlvbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgeGVudmlmICp2 aWYgPSBxdWV1ZS0+dmlmOwotCXM4IHN0YXR1czsKLQl1MTYgZmxhZ3M7Ci0Jc3RydWN0IHhlbl9u ZXRpZl9yeF9yZXNwb25zZSAqcmVzcDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4cTsKLQlzdHJ1 Y3Qgc2tfYnVmZiAqc2tiOwotCUxJU1RfSEVBRChub3RpZnkpOwotCWludCByZXQ7Ci0JdW5zaWdu ZWQgbG9uZyBvZmZzZXQ7Ci0JYm9vbCBuZWVkX3RvX25vdGlmeSA9IGZhbHNlOwotCi0Jc3RydWN0 IG5ldHJ4X3BlbmRpbmdfb3BlcmF0aW9ucyBucG8gPSB7Ci0JCS5jb3B5ICA9IHF1ZXVlLT5ncmFu dF9jb3B5X29wLAotCQkubWV0YSAgPSBxdWV1ZS0+bWV0YSwKLQl9OwotCi0Jc2tiX3F1ZXVlX2hl YWRfaW5pdCgmcnhxKTsKLQotCXdoaWxlICh4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUo cXVldWUpCi0JICAgICAgICYmIChza2IgPSB4ZW52aWZfcnhfZGVxdWV1ZShxdWV1ZSkpICE9IE5V TEwpIHsKLQkJcXVldWUtPmxhc3RfcnhfdGltZSA9IGppZmZpZXM7Ci0KLQkJWEVOVklGX1JYX0NC KHNrYiktPm1ldGFfc2xvdHNfdXNlZCA9IHhlbnZpZl9nb3Bfc2tiKHNrYiwgJm5wbywgcXVldWUp OwotCi0JCV9fc2tiX3F1ZXVlX3RhaWwoJnJ4cSwgc2tiKTsKLQl9Ci0KLQlCVUdfT04obnBvLm1l dGFfcHJvZCA+IEFSUkFZX1NJWkUocXVldWUtPm1ldGEpKTsKLQotCWlmICghbnBvLmNvcHlfcHJv ZCkKLQkJZ290byBkb25lOwotCi0JQlVHX09OKG5wby5jb3B5X3Byb2QgPiBNQVhfR1JBTlRfQ09Q WV9PUFMpOwotCWdudHRhYl9iYXRjaF9jb3B5KHF1ZXVlLT5ncmFudF9jb3B5X29wLCBucG8uY29w eV9wcm9kKTsKLQotCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcnhxKSkgIT0gTlVMTCkg ewotCQlzdHJ1Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKmV4dHJhID0gTlVMTDsKLQotCQlpZiAo KDEgPDwgcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3R5cGUpICYKLQkJICAgIHZpZi0+ Z3NvX3ByZWZpeF9tYXNrKSB7Ci0JCQlyZXNwID0gUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5y eCwKLQkJCQkJCSBxdWV1ZS0+cngucnNwX3Byb2RfcHZ0KyspOwotCi0JCQlyZXNwLT5mbGFncyA9 IFhFTl9ORVRSWEZfZ3NvX3ByZWZpeCB8IFhFTl9ORVRSWEZfbW9yZV9kYXRhOwotCi0JCQlyZXNw LT5vZmZzZXQgPSBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5nc29fc2l6ZTsKLQkJCXJlc3At PmlkID0gcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uaWQ7Ci0JCQlyZXNwLT5zdGF0dXMgPSBY RU5WSUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkOwotCi0JCQlucG8ubWV0YV9jb25zKys7 Ci0JCQlYRU5WSUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkLS07Ci0JCX0KLQotCi0JCXF1 ZXVlLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJcXVldWUtPnN0YXRzLnR4X3BhY2tl dHMrKzsKLQotCQlzdGF0dXMgPSB4ZW52aWZfY2hlY2tfZ29wKHZpZiwKLQkJCQkJICBYRU5WSUZf UlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkLAotCQkJCQkgICZucG8pOwotCi0JCWlmIChYRU5W SUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkID09IDEpCi0JCQlmbGFncyA9IDA7Ci0JCWVs c2UKLQkJCWZsYWdzID0gWEVOX05FVFJYRl9tb3JlX2RhdGE7Ci0KLQkJaWYgKHNrYi0+aXBfc3Vt bWVkID09IENIRUNLU1VNX1BBUlRJQUwpIC8qIGxvY2FsIHBhY2tldD8gKi8KLQkJCWZsYWdzIHw9 IFhFTl9ORVRSWEZfY3N1bV9ibGFuayB8IFhFTl9ORVRSWEZfZGF0YV92YWxpZGF0ZWQ7Ci0JCWVs c2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQotCQkJLyogcmVt b3RlIGJ1dCBjaGVja3N1bW1lZC4gKi8KLQkJCWZsYWdzIHw9IFhFTl9ORVRSWEZfZGF0YV92YWxp ZGF0ZWQ7Ci0KLQkJb2Zmc2V0ID0gMDsKLQkJcmVzcCA9IG1ha2VfcnhfcmVzcG9uc2UocXVldWUs IHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmlkLAotCQkJCQlzdGF0dXMsIG9mZnNldCwKLQkJ CQkJcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uc2l6ZSwKLQkJCQkJZmxhZ3MpOwotCi0JCWlm ICgoMSA8PCBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5nc29fdHlwZSkgJgotCQkgICAgdmlm LT5nc29fbWFzaykgewotCQkJZXh0cmEgPSAoc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICop Ci0JCQkJUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKLQkJCQkJCSAgcXVldWUtPnJ4LnJz cF9wcm9kX3B2dCsrKTsKLQotCQkJcmVzcC0+ZmxhZ3MgfD0gWEVOX05FVFJYRl9leHRyYV9pbmZv OwotCi0JCQlleHRyYS0+dS5nc28udHlwZSA9IHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmdz b190eXBlOwotCQkJZXh0cmEtPnUuZ3NvLnNpemUgPSBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25z XS5nc29fc2l6ZTsKLQkJCWV4dHJhLT51Lmdzby5wYWQgPSAwOwotCQkJZXh0cmEtPnUuZ3NvLmZl YXR1cmVzID0gMDsKLQotCQkJZXh0cmEtPnR5cGUgPSBYRU5fTkVUSUZfRVhUUkFfVFlQRV9HU087 Ci0JCQlleHRyYS0+ZmxhZ3MgPSAwOwotCQl9Ci0KLQkJaWYgKHNrYi0+c3dfaGFzaCkgewotCQkJ LyogU2luY2UgdGhlIHNrYiBnb3QgaGVyZSB2aWEgeGVudmlmX3NlbGVjdF9xdWV1ZSgpCi0JCQkg KiB3ZSBrbm93IHRoYXQgdGhlIGhhc2ggaGFzIGJlZW4gcmUtY2FsY3VsYXRlZAotCQkJICogYWNj b3JkaW5nIHRvIGEgY29uZmlndXJhdGlvbiBzZXQgYnkgdGhlIGZyb250ZW5kCi0JCQkgKiBhbmQg dGhlcmVmb3JlIHdlIGtub3cgdGhhdCBpdCBpcyBsZWdpdGltYXRlIHRvCi0JCQkgKiBwYXNzIGl0 IHRvIHRoZSBmcm9udGVuZC4KLQkJCSAqLwotCQkJaWYgKHJlc3AtPmZsYWdzICYgWEVOX05FVFJY Rl9leHRyYV9pbmZvKQotCQkJCWV4dHJhLT5mbGFncyB8PSBYRU5fTkVUSUZfRVhUUkFfRkxBR19N T1JFOwotCQkJZWxzZQotCQkJCXJlc3AtPmZsYWdzIHw9IFhFTl9ORVRSWEZfZXh0cmFfaW5mbzsK LQotCQkJZXh0cmEgPSAoc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICopCi0JCQkJUklOR19H RVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKLQkJCQkJCSAgcXVldWUtPnJ4LnJzcF9wcm9kX3B2dCsr KTsKLQotCQkJZXh0cmEtPnUuaGFzaC5hbGdvcml0aG0gPQotCQkJCVhFTl9ORVRJRl9DVFJMX0hB U0hfQUxHT1JJVEhNX1RPRVBMSVRaOwotCi0JCQlpZiAoc2tiLT5sNF9oYXNoKQotCQkJCWV4dHJh LT51Lmhhc2gudHlwZSA9Ci0JCQkJCXNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApID8K LQkJCQkJX1hFTl9ORVRJRl9DVFJMX0hBU0hfVFlQRV9JUFY0X1RDUCA6Ci0JCQkJCV9YRU5fTkVU SUZfQ1RSTF9IQVNIX1RZUEVfSVBWNl9UQ1A7Ci0JCQllbHNlCi0JCQkJZXh0cmEtPnUuaGFzaC50 eXBlID0KLQkJCQkJc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgPwotCQkJCQlfWEVO X05FVElGX0NUUkxfSEFTSF9UWVBFX0lQVjQgOgotCQkJCQlfWEVOX05FVElGX0NUUkxfSEFTSF9U WVBFX0lQVjY7Ci0KLQkJCSoodWludDMyX3QgKilleHRyYS0+dS5oYXNoLnZhbHVlID0KLQkJCQlz a2JfZ2V0X2hhc2hfcmF3KHNrYik7Ci0KLQkJCWV4dHJhLT50eXBlID0gWEVOX05FVElGX0VYVFJB X1RZUEVfSEFTSDsKLQkJCWV4dHJhLT5mbGFncyA9IDA7Ci0JCX0KLQotCQl4ZW52aWZfYWRkX2Zy YWdfcmVzcG9uc2VzKHF1ZXVlLCBzdGF0dXMsCi0JCQkJCSAgcXVldWUtPm1ldGEgKyBucG8ubWV0 YV9jb25zICsgMSwKLQkJCQkJICBYRU5WSUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkKTsK LQotCQlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT5yeCwgcmV0 KTsKLQotCQluZWVkX3RvX25vdGlmeSB8PSAhIXJldDsKLQotCQlucG8ubWV0YV9jb25zICs9IFhF TlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQ7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsK LQl9Ci0KLWRvbmU6Ci0JaWYgKG5lZWRfdG9fbm90aWZ5KQotCQlub3RpZnlfcmVtb3RlX3ZpYV9p cnEocXVldWUtPnJ4X2lycSk7Ci19Ci0KIHZvaWQgeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5h YmxlX2V2ZW50cyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIHsKIAlpbnQgbW9yZV90b19k bzsKQEAgLTE5NTEsMjkgKzEzODQsNiBAQCBzdGF0aWMgdm9pZCBwdXNoX3R4X3Jlc3BvbnNlcyhz dHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIAkJbm90aWZ5X3JlbW90ZV92aWFfaXJxKHF1ZXVl LT50eF9pcnEpOwogfQogCi1zdGF0aWMgc3RydWN0IHhlbl9uZXRpZl9yeF9yZXNwb25zZSAqbWFr ZV9yeF9yZXNwb25zZShzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwKLQkJCQkJICAgICB1MTYg ICAgICBpZCwKLQkJCQkJICAgICBzOCAgICAgICBzdCwKLQkJCQkJICAgICB1MTYgICAgICBvZmZz ZXQsCi0JCQkJCSAgICAgdTE2ICAgICAgc2l6ZSwKLQkJCQkJICAgICB1MTYgICAgICBmbGFncykK LXsKLQlSSU5HX0lEWCBpID0gcXVldWUtPnJ4LnJzcF9wcm9kX3B2dDsKLQlzdHJ1Y3QgeGVuX25l dGlmX3J4X3Jlc3BvbnNlICpyZXNwOwotCi0JcmVzcCA9IFJJTkdfR0VUX1JFU1BPTlNFKCZxdWV1 ZS0+cngsIGkpOwotCXJlc3AtPm9mZnNldCAgICAgPSBvZmZzZXQ7Ci0JcmVzcC0+ZmxhZ3MgICAg ICA9IGZsYWdzOwotCXJlc3AtPmlkICAgICAgICAgPSBpZDsKLQlyZXNwLT5zdGF0dXMgICAgID0g KHMxNilzaXplOwotCWlmIChzdCA8IDApCi0JCXJlc3AtPnN0YXR1cyA9IChzMTYpc3Q7Ci0KLQlx dWV1ZS0+cngucnNwX3Byb2RfcHZ0ID0gKytpOwotCi0JcmV0dXJuIHJlc3A7Ci19Ci0KIHZvaWQg eGVudmlmX2lkeF91bm1hcChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgdTE2IHBlbmRpbmdf aWR4KQogewogCWludCByZXQ7CkBAIC0yMDU1LDE3MCArMTQ2NSw2IEBAIGVycjoKIAlyZXR1cm4g ZXJyOwogfQogCi1zdGF0aWMgdm9pZCB4ZW52aWZfcXVldWVfY2Fycmllcl9vZmYoc3RydWN0IHhl bnZpZl9xdWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IHhlbnZpZiAqdmlmID0gcXVldWUtPnZpZjsK LQotCXF1ZXVlLT5zdGFsbGVkID0gdHJ1ZTsKLQotCS8qIEF0IGxlYXN0IG9uZSBxdWV1ZSBoYXMg c3RhbGxlZD8gRGlzYWJsZSB0aGUgY2Fycmllci4gKi8KLQlzcGluX2xvY2soJnZpZi0+bG9jayk7 Ci0JaWYgKHZpZi0+c3RhbGxlZF9xdWV1ZXMrKyA9PSAwKSB7Ci0JCW5ldGRldl9pbmZvKHZpZi0+ ZGV2LCAiR3Vlc3QgUnggc3RhbGxlZCIpOwotCQluZXRpZl9jYXJyaWVyX29mZih2aWYtPmRldik7 Ci0JfQotCXNwaW5fdW5sb2NrKCZ2aWYtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCB4ZW52aWZf cXVldWVfY2Fycmllcl9vbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3Qg eGVudmlmICp2aWYgPSBxdWV1ZS0+dmlmOwotCi0JcXVldWUtPmxhc3RfcnhfdGltZSA9IGppZmZp ZXM7IC8qIFJlc2V0IFJ4IHN0YWxsIGRldGVjdGlvbi4gKi8KLQlxdWV1ZS0+c3RhbGxlZCA9IGZh bHNlOwotCi0JLyogQWxsIHF1ZXVlcyBhcmUgcmVhZHk/IEVuYWJsZSB0aGUgY2Fycmllci4gKi8K LQlzcGluX2xvY2soJnZpZi0+bG9jayk7Ci0JaWYgKC0tdmlmLT5zdGFsbGVkX3F1ZXVlcyA9PSAw KSB7Ci0JCW5ldGRldl9pbmZvKHZpZi0+ZGV2LCAiR3Vlc3QgUnggcmVhZHkiKTsKLQkJbmV0aWZf Y2Fycmllcl9vbih2aWYtPmRldik7Ci0JfQotCXNwaW5fdW5sb2NrKCZ2aWYtPmxvY2spOwotfQot Ci1zdGF0aWMgYm9vbCB4ZW52aWZfcnhfcXVldWVfc3RhbGxlZChzdHJ1Y3QgeGVudmlmX3F1ZXVl ICpxdWV1ZSkKLXsKLQlSSU5HX0lEWCBwcm9kLCBjb25zOwotCi0JcHJvZCA9IHF1ZXVlLT5yeC5z cmluZy0+cmVxX3Byb2Q7Ci0JY29ucyA9IHF1ZXVlLT5yeC5yZXFfY29uczsKLQotCXJldHVybiAh cXVldWUtPnN0YWxsZWQgJiYgcHJvZCAtIGNvbnMgPCAxCi0JCSYmIHRpbWVfYWZ0ZXIoamlmZmll cywKLQkJCSAgICAgIHF1ZXVlLT5sYXN0X3J4X3RpbWUgKyBxdWV1ZS0+dmlmLT5zdGFsbF90aW1l b3V0KTsKLX0KLQotc3RhdGljIGJvb2wgeGVudmlmX3J4X3F1ZXVlX3JlYWR5KHN0cnVjdCB4ZW52 aWZfcXVldWUgKnF1ZXVlKQotewotCVJJTkdfSURYIHByb2QsIGNvbnM7Ci0KLQlwcm9kID0gcXVl dWUtPnJ4LnNyaW5nLT5yZXFfcHJvZDsKLQljb25zID0gcXVldWUtPnJ4LnJlcV9jb25zOwotCi0J cmV0dXJuIHF1ZXVlLT5zdGFsbGVkICYmIHByb2QgLSBjb25zID49IDE7Ci19Ci0KLXN0YXRpYyBi b29sIHhlbnZpZl9oYXZlX3J4X3dvcmsoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCi17Ci0J cmV0dXJuIHhlbnZpZl9yeF9yaW5nX3Nsb3RzX2F2YWlsYWJsZShxdWV1ZSkKLQkJfHwgKHF1ZXVl LT52aWYtPnN0YWxsX3RpbWVvdXQgJiYKLQkJICAgICh4ZW52aWZfcnhfcXVldWVfc3RhbGxlZChx dWV1ZSkKLQkJICAgICB8fCB4ZW52aWZfcnhfcXVldWVfcmVhZHkocXVldWUpKSkKLQkJfHwga3Ro cmVhZF9zaG91bGRfc3RvcCgpCi0JCXx8IHF1ZXVlLT52aWYtPmRpc2FibGVkOwotfQotCi1zdGF0 aWMgbG9uZyB4ZW52aWZfcnhfcXVldWVfdGltZW91dChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1 ZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWxvbmcgdGltZW91dDsKLQotCXNrYiA9IHNr Yl9wZWVrKCZxdWV1ZS0+cnhfcXVldWUpOwotCWlmICghc2tiKQotCQlyZXR1cm4gTUFYX1NDSEVE VUxFX1RJTUVPVVQ7Ci0KLQl0aW1lb3V0ID0gWEVOVklGX1JYX0NCKHNrYiktPmV4cGlyZXMgLSBq aWZmaWVzOwotCXJldHVybiB0aW1lb3V0IDwgMCA/IDAgOiB0aW1lb3V0OwotfQotCi0vKiBXYWl0 IHVudGlsIHRoZSBndWVzdCBSeCB0aHJlYWQgaGFzIHdvcmsuCi0gKgotICogVGhlIHRpbWVvdXQg bmVlZHMgdG8gYmUgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgaGVhZCBvZiB0aGUKLSAq IHF1ZXVlIChhbmQgbm90IGp1c3QgdGhlIGhlYWQgYXQgdGhlIGJlZ2lubmluZykuICBJbiBwYXJ0 aWN1bGFyLCBpZgotICogdGhlIHF1ZXVlIGlzIGluaXRpYWxseSBlbXB0eSBhbiBpbmZpbml0ZSB0 aW1lb3V0IGlzIHVzZWQgYW5kIHRoaXMKLSAqIG5lZWRzIHRvIGJlIHJlZHVjZWQgd2hlbiBhIHNr YiBpcyBxdWV1ZWQuCi0gKgotICogVGhpcyBjYW5ub3QgYmUgZG9uZSB3aXRoIHdhaXRfZXZlbnRf dGltZW91dCgpIGJlY2F1c2UgaXQgb25seQotICogY2FsY3VsYXRlcyB0aGUgdGltZW91dCBvbmNl LgotICovCi1zdGF0aWMgdm9pZCB4ZW52aWZfd2FpdF9mb3Jfcnhfd29yayhzdHJ1Y3QgeGVudmlm X3F1ZXVlICpxdWV1ZSkKLXsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQotCWlmICh4ZW52aWZfaGF2 ZV9yeF93b3JrKHF1ZXVlKSkKLQkJcmV0dXJuOwotCi0JZm9yICg7OykgewotCQlsb25nIHJldDsK LQotCQlwcmVwYXJlX3RvX3dhaXQoJnF1ZXVlLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJM RSk7Ci0JCWlmICh4ZW52aWZfaGF2ZV9yeF93b3JrKHF1ZXVlKSkKLQkJCWJyZWFrOwotCQlyZXQg PSBzY2hlZHVsZV90aW1lb3V0KHhlbnZpZl9yeF9xdWV1ZV90aW1lb3V0KHF1ZXVlKSk7Ci0JCWlm ICghcmV0KQotCQkJYnJlYWs7Ci0JfQotCWZpbmlzaF93YWl0KCZxdWV1ZS0+d3EsICZ3YWl0KTsK LX0KLQotaW50IHhlbnZpZl9rdGhyZWFkX2d1ZXN0X3J4KHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0 IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSBkYXRhOwotCXN0cnVjdCB4ZW52aWYgKnZpZiA9IHF1ZXVl LT52aWY7Ci0KLQlpZiAoIXZpZi0+c3RhbGxfdGltZW91dCkKLQkJeGVudmlmX3F1ZXVlX2NhcnJp ZXJfb24ocXVldWUpOwotCi0JZm9yICg7OykgewotCQl4ZW52aWZfd2FpdF9mb3Jfcnhfd29yayhx dWV1ZSk7Ci0KLQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKLQkJCWJyZWFrOwotCi0JCS8q IFRoaXMgZnJvbnRlbmQgaXMgZm91bmQgdG8gYmUgcm9ndWUsIGRpc2FibGUgaXQgaW4KLQkJICog a3RocmVhZCBjb250ZXh0LiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHNldCB3aGVuCi0JCSAqIG5l dGJhY2sgZmluZHMgb3V0IGZyb250ZW5kIHNlbmRzIG1hbGZvcm1lZCBwYWNrZXQsCi0JCSAqIGJ1 dCB3ZSBjYW5ub3QgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGluIHNvZnRpcnEKLQkJICogY29udGV4 dCBzbyB3ZSBkZWZlciBpdCBoZXJlLCBpZiB0aGlzIHRocmVhZCBpcwotCQkgKiBhc3NvY2lhdGVk IHdpdGggcXVldWUgMC4KLQkJICovCi0JCWlmICh1bmxpa2VseSh2aWYtPmRpc2FibGVkICYmIHF1 ZXVlLT5pZCA9PSAwKSkgewotCQkJeGVudmlmX2NhcnJpZXJfb2ZmKHZpZik7Ci0JCQlicmVhazsK LQkJfQotCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZxdWV1ZS0+cnhfcXVldWUpKQotCQkJeGVu dmlmX3J4X2FjdGlvbihxdWV1ZSk7Ci0KLQkJLyogSWYgdGhlIGd1ZXN0IGhhc24ndCBwcm92aWRl ZCBhbnkgUnggc2xvdHMgZm9yIGEKLQkJICogd2hpbGUgaXQncyBwcm9iYWJseSBub3QgcmVzcG9u c2l2ZSwgZHJvcCB0aGUKLQkJICogY2FycmllciBzbyBwYWNrZXRzIGFyZSBkcm9wcGVkIGVhcmxp ZXIuCi0JCSAqLwotCQlpZiAodmlmLT5zdGFsbF90aW1lb3V0KSB7Ci0JCQlpZiAoeGVudmlmX3J4 X3F1ZXVlX3N0YWxsZWQocXVldWUpKQotCQkJCXhlbnZpZl9xdWV1ZV9jYXJyaWVyX29mZihxdWV1 ZSk7Ci0JCQllbHNlIGlmICh4ZW52aWZfcnhfcXVldWVfcmVhZHkocXVldWUpKQotCQkJCXhlbnZp Zl9xdWV1ZV9jYXJyaWVyX29uKHF1ZXVlKTsKLQkJfQotCi0JCS8qIFF1ZXVlZCBwYWNrZXRzIG1h eSBoYXZlIGZvcmVpZ24gcGFnZXMgZnJvbSBvdGhlcgotCQkgKiBkb21haW5zLiAgVGhlc2UgY2Fu bm90IGJlIHF1ZXVlZCBpbmRlZmluaXRlbHkgYXMKLQkJICogdGhpcyB3b3VsZCBzdGFydmUgZ3Vl c3RzIG9mIGdyYW50IHJlZnMgYW5kIHRyYW5zbWl0Ci0JCSAqIHNsb3RzLgotCQkgKi8KLQkJeGVu dmlmX3J4X3F1ZXVlX2Ryb3BfZXhwaXJlZChxdWV1ZSk7Ci0KLQkJeGVudmlmX3J4X3F1ZXVlX21h eWJlX3dha2UocXVldWUpOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQotCS8qIEJpbiBhbnkg cmVtYWluaW5nIHNrYnMgKi8KLQl4ZW52aWZfcnhfcXVldWVfcHVyZ2UocXVldWUpOwotCi0JcmV0 dXJuIDA7Ci19Ci0KIHN0YXRpYyBib29sIHhlbnZpZl9kZWFsbG9jX2t0aHJlYWRfc2hvdWxkX3N0 b3Aoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7CiAJLyogRGVhbGxvYyB0aHJlYWQgbXVz dCByZW1haW4gcnVubmluZyB1bnRpbCBhbGwgaW5mbGlnaHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMv bmV0L3hlbi1uZXRiYWNrL3J4LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9yeC5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODM2YWEKLS0tIC9kZXYvbnVsbAorKysg Yi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9yeC5jCkBAIC0wLDAgKzEsNzg5IEBACisvKgorICog Q29weXJpZ2h0IChjKSAyMDE2IENpdHJpeCBTeXN0ZW1zIEluYy4KKyAqIENvcHlyaWdodCAoYykg MjAwMi0yMDA1LCBLIEEgRnJhc2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBh cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlz dHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9y YXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9s bG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBz b3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUs IHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQg dG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRv IHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhl IGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwg YmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2Yg dGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1F TlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVS UyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZ LCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLwor CisjaW5jbHVkZSAiY29tbW9uLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisKKyNp bmNsdWRlIDx4ZW4veGVuLmg+CisjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgorCitzdGF0aWMgYm9v bCB4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVl dWUpCit7CisJUklOR19JRFggcHJvZCwgY29uczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWlu dCBuZWVkZWQ7CisKKwlza2IgPSBza2JfcGVlaygmcXVldWUtPnJ4X3F1ZXVlKTsKKwlpZiAoIXNr YikKKwkJcmV0dXJuIGZhbHNlOworCisJbmVlZGVkID0gRElWX1JPVU5EX1VQKHNrYi0+bGVuLCBY RU5fUEFHRV9TSVpFKTsKKwlpZiAoc2tiX2lzX2dzbyhza2IpKQorCQluZWVkZWQrKzsKKwlpZiAo c2tiLT5zd19oYXNoKQorCQluZWVkZWQrKzsKKworCWRvIHsKKwkJcHJvZCA9IHF1ZXVlLT5yeC5z cmluZy0+cmVxX3Byb2Q7CisJCWNvbnMgPSBxdWV1ZS0+cngucmVxX2NvbnM7CisKKwkJaWYgKHBy b2QgLSBjb25zID49IG5lZWRlZCkKKwkJCXJldHVybiB0cnVlOworCisJCXF1ZXVlLT5yeC5zcmlu Zy0+cmVxX2V2ZW50ID0gcHJvZCArIDE7CisKKwkJLyogTWFrZSBzdXJlIGV2ZW50IGlzIHZpc2li bGUgYmVmb3JlIHdlIGNoZWNrIHByb2QKKwkJICogYWdhaW4uCisJCSAqLworCQltYigpOworCX0g d2hpbGUgKHF1ZXVlLT5yeC5zcmluZy0+cmVxX3Byb2QgIT0gcHJvZCk7CisKKwlyZXR1cm4gZmFs c2U7Cit9CisKK3ZvaWQgeGVudmlmX3J4X3F1ZXVlX3RhaWwoc3RydWN0IHhlbnZpZl9xdWV1ZSAq cXVldWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cnhfcXVldWUubG9jaywgZmxhZ3MpOworCisJX19z a2JfcXVldWVfdGFpbCgmcXVldWUtPnJ4X3F1ZXVlLCBza2IpOworCisJcXVldWUtPnJ4X3F1ZXVl X2xlbiArPSBza2ItPmxlbjsKKwlpZiAocXVldWUtPnJ4X3F1ZXVlX2xlbiA+IHF1ZXVlLT5yeF9x dWV1ZV9tYXgpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT52aWYtPmRldjsK KworCQluZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBxdWV1ZS0+ aWQpKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cnhfcXVldWUubG9j aywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnhlbnZpZl9yeF9kZXF1ZXVl KHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisK KwlzcGluX2xvY2tfaXJxKCZxdWV1ZS0+cnhfcXVldWUubG9jayk7CisKKwlza2IgPSBfX3NrYl9k ZXF1ZXVlKCZxdWV1ZS0+cnhfcXVldWUpOworCWlmIChza2IpCisJCXF1ZXVlLT5yeF9xdWV1ZV9s ZW4gLT0gc2tiLT5sZW47CisKKwlzcGluX3VubG9ja19pcnEoJnF1ZXVlLT5yeF9xdWV1ZS5sb2Nr KTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkIHhlbnZpZl9yeF9xdWV1ZV9tYXli ZV93YWtlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCXNwaW5fbG9ja19pcnEoJnF1 ZXVlLT5yeF9xdWV1ZS5sb2NrKTsKKworCWlmIChxdWV1ZS0+cnhfcXVldWVfbGVuIDwgcXVldWUt PnJ4X3F1ZXVlX21heCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXVldWUtPnZpZi0+ ZGV2OworCisJCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHF1 ZXVlLT5pZCkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcXVldWUtPnJ4X3F1ZXVlLmxvY2sp OworfQorCitzdGF0aWMgdm9pZCB4ZW52aWZfcnhfcXVldWVfcHVyZ2Uoc3RydWN0IHhlbnZpZl9x dWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0g eGVudmlmX3J4X2RlcXVldWUocXVldWUpKSAhPSBOVUxMKQorCQlrZnJlZV9za2Ioc2tiKTsKK30K Kworc3RhdGljIHZvaWQgeGVudmlmX3J4X3F1ZXVlX2Ryb3BfZXhwaXJlZChzdHJ1Y3QgeGVudmlm X3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZm9yICg7Oykgewor CQlza2IgPSBza2JfcGVlaygmcXVldWUtPnJ4X3F1ZXVlKTsKKwkJaWYgKCFza2IpCisJCQlicmVh azsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIFhFTlZJRl9SWF9DQihza2IpLT5leHBpcmVz KSkKKwkJCWJyZWFrOworCQl4ZW52aWZfcnhfZGVxdWV1ZShxdWV1ZSk7CisJCWtmcmVlX3NrYihz a2IpOworCX0KK30KKworc3RydWN0IG5ldHJ4X3BlbmRpbmdfb3BlcmF0aW9ucyB7CisJdW5zaWdu ZWQgaW50IGNvcHlfcHJvZCwgY29weV9jb25zOworCXVuc2lnbmVkIGludCBtZXRhX3Byb2QsIG1l dGFfY29uczsKKwlzdHJ1Y3QgZ250dGFiX2NvcHkgKmNvcHk7CisJc3RydWN0IHhlbnZpZl9yeF9t ZXRhICptZXRhOworCWludCBjb3B5X29mZjsKKwlncmFudF9yZWZfdCBjb3B5X2dyZWY7Cit9Owor CitzdGF0aWMgc3RydWN0IHhlbnZpZl9yeF9tZXRhICpnZXRfbmV4dF9yeF9idWZmZXIoCisJc3Ry dWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCisJc3RydWN0IG5ldHJ4X3BlbmRpbmdfb3BlcmF0aW9u cyAqbnBvKQoreworCXN0cnVjdCB4ZW52aWZfcnhfbWV0YSAqbWV0YTsKKwlzdHJ1Y3QgeGVuX25l dGlmX3J4X3JlcXVlc3QgcmVxOworCisJUklOR19DT1BZX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVl dWUtPnJ4LnJlcV9jb25zKyssICZyZXEpOworCisJbWV0YSA9IG5wby0+bWV0YSArIG5wby0+bWV0 YV9wcm9kKys7CisJbWV0YS0+Z3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfTk9ORTsKKwlt ZXRhLT5nc29fc2l6ZSA9IDA7CisJbWV0YS0+c2l6ZSA9IDA7CisJbWV0YS0+aWQgPSByZXEuaWQ7 CisKKwlucG8tPmNvcHlfb2ZmID0gMDsKKwlucG8tPmNvcHlfZ3JlZiA9IHJlcS5ncmVmOworCisJ cmV0dXJuIG1ldGE7Cit9CisKK3N0cnVjdCBnb3BfZnJhZ19jb3B5IHsKKwlzdHJ1Y3QgeGVudmlm X3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgbmV0cnhfcGVuZGluZ19vcGVyYXRpb25zICpucG87CisJ c3RydWN0IHhlbnZpZl9yeF9tZXRhICptZXRhOworCWludCBoZWFkOworCWludCBnc29fdHlwZTsK KwlpbnQgcHJvdG9jb2w7CisJaW50IGhhc2hfcHJlc2VudDsKKworCXN0cnVjdCBwYWdlICpwYWdl OworfTsKKworc3RhdGljIHZvaWQgeGVudmlmX3NldHVwX2NvcHlfZ29wKHVuc2lnbmVkIGxvbmcg Z2ZuLAorCQkJCSAgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGludCAqbGVu LAorCQkJCSAgc3RydWN0IGdvcF9mcmFnX2NvcHkgKmluZm8pCit7CisJc3RydWN0IGdudHRhYl9j b3B5ICpjb3B5X2dvcDsKKwlzdHJ1Y3QgeGVuX3BhZ2VfZm9yZWlnbiAqZm9yZWlnbjsKKwkvKiBD b252ZW5pZW50IGFsaWFzZXMgKi8KKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IGluZm8t PnF1ZXVlOworCXN0cnVjdCBuZXRyeF9wZW5kaW5nX29wZXJhdGlvbnMgKm5wbyA9IGluZm8tPm5w bzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGluZm8tPnBhZ2U7CisKKwlXQVJOX09OKG5wby0+Y29w eV9vZmYgPiBNQVhfQlVGRkVSX09GRlNFVCk7CisKKwlpZiAobnBvLT5jb3B5X29mZiA9PSBNQVhf QlVGRkVSX09GRlNFVCkKKwkJaW5mby0+bWV0YSA9IGdldF9uZXh0X3J4X2J1ZmZlcihxdWV1ZSwg bnBvKTsKKworCWlmIChucG8tPmNvcHlfb2ZmICsgKmxlbiA+IE1BWF9CVUZGRVJfT0ZGU0VUKQor CQkqbGVuID0gTUFYX0JVRkZFUl9PRkZTRVQgLSBucG8tPmNvcHlfb2ZmOworCisJY29weV9nb3Ag PSBucG8tPmNvcHkgKyBucG8tPmNvcHlfcHJvZCsrOworCWNvcHlfZ29wLT5mbGFncyA9IEdOVENP UFlfZGVzdF9ncmVmOworCWNvcHlfZ29wLT5sZW4gPSAqbGVuOworCisJZm9yZWlnbiA9IHhlbl9w YWdlX2ZvcmVpZ24ocGFnZSk7CisJaWYgKGZvcmVpZ24pIHsKKwkJY29weV9nb3AtPnNvdXJjZS5k b21pZCA9IGZvcmVpZ24tPmRvbWlkOworCQljb3B5X2dvcC0+c291cmNlLnUucmVmID0gZm9yZWln bi0+Z3JlZjsKKwkJY29weV9nb3AtPmZsYWdzIHw9IEdOVENPUFlfc291cmNlX2dyZWY7CisJfSBl bHNlIHsKKwkJY29weV9nb3AtPnNvdXJjZS5kb21pZCA9IERPTUlEX1NFTEY7CisJCWNvcHlfZ29w LT5zb3VyY2UudS5nbWZuID0gZ2ZuOworCX0KKwljb3B5X2dvcC0+c291cmNlLm9mZnNldCA9IG9m ZnNldDsKKworCWNvcHlfZ29wLT5kZXN0LmRvbWlkID0gcXVldWUtPnZpZi0+ZG9taWQ7CisJY29w eV9nb3AtPmRlc3Qub2Zmc2V0ID0gbnBvLT5jb3B5X29mZjsKKwljb3B5X2dvcC0+ZGVzdC51LnJl ZiA9IG5wby0+Y29weV9ncmVmOworCisJbnBvLT5jb3B5X29mZiArPSAqbGVuOworCWluZm8tPm1l dGEtPnNpemUgKz0gKmxlbjsKKworCWlmICghaW5mby0+aGVhZCkKKwkJcmV0dXJuOworCisJLyog TGVhdmUgYSBnYXAgZm9yIHRoZSBHU08gZGVzY3JpcHRvci4gKi8KKwlpZiAoKDEgPDwgaW5mby0+ Z3NvX3R5cGUpICYgcXVldWUtPnZpZi0+Z3NvX21hc2spCisJCXF1ZXVlLT5yeC5yZXFfY29ucysr OworCisJLyogTGVhdmUgYSBnYXAgZm9yIHRoZSBoYXNoIGV4dHJhIHNlZ21lbnQuICovCisJaWYg KGluZm8tPmhhc2hfcHJlc2VudCkKKwkJcXVldWUtPnJ4LnJlcV9jb25zKys7CisKKwlpbmZvLT5o ZWFkID0gMDsgLyogVGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgaW4gdGhpcyBidWZmZXIgbm93ICov Cit9CisKK3N0YXRpYyB2b2lkIHhlbnZpZl9nb3BfZnJhZ19jb3B5X2dyYW50KHVuc2lnbmVkIGxv bmcgZ2ZuLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgICB1bnNp Z25lZCBpbnQgbGVuLAorCQkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCBi eXRlczsKKworCXdoaWxlIChsZW4pIHsKKwkJYnl0ZXMgPSBsZW47CisJCXhlbnZpZl9zZXR1cF9j b3B5X2dvcChnZm4sIG9mZnNldCwgJmJ5dGVzLCBkYXRhKTsKKwkJb2Zmc2V0ICs9IGJ5dGVzOwor CQlsZW4gLT0gYnl0ZXM7CisJfQorfQorCisvKiBTZXQgdXAgdGhlIGdyYW50IG9wZXJhdGlvbnMg Zm9yIHRoaXMgZnJhZ21lbnQuIElmIGl0J3MgYSBmbGlwcGluZworICogaW50ZXJmYWNlLCB3ZSBh bHNvIHNldCB1cCB0aGUgdW5tYXAgcmVxdWVzdCBmcm9tIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lk IHhlbnZpZl9nb3BfZnJhZ19jb3B5KHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAorCQkJCSBz dHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgbmV0cnhfcGVuZGluZ19vcGVyYXRpb25z ICpucG8sCisJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJ IHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgKmhlYWQpCit7CisJc3RydWN0IGdvcF9mcmFnX2Nv cHkgaW5mbyA9IHsKKwkJLnF1ZXVlID0gcXVldWUsCisJCS5ucG8gPSBucG8sCisJCS5oZWFkID0g KmhlYWQsCisJCS5nc29fdHlwZSA9IFhFTl9ORVRJRl9HU09fVFlQRV9OT05FLAorCQkvKiB4ZW52 aWZfc2V0X3NrYl9oYXNoKCkgd2lsbCBoYXZlIGVpdGhlciBzZXQgYSBzL3cKKwkJICogaGFzaCBv ciBjbGVhcmVkIHRoZSBoYXNoIGRlcGVuZGluZyBvbgorCQkgKiB3aGV0aGVyIHRoZSB0aGUgZnJv bnRlbmQgd2FudHMgYSBoYXNoIGZvciB0aGlzIHNrYi4KKwkJICovCisJCS5oYXNoX3ByZXNlbnQg PSBza2ItPnN3X2hhc2gsCisJfTsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzOworCisJaWYgKHNrYl9p c19nc28oc2tiKSkgeworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09f VENQVjQpCisJCQlpbmZvLmdzb190eXBlID0gWEVOX05FVElGX0dTT19UWVBFX1RDUFY0OworCQll bHNlIGlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNikKKwkJCWlu Zm8uZ3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfVENQVjY7CisJfQorCisJLyogRGF0YSBt dXN0IG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuICovCisJV0FSTl9PTihzaXplICsgb2Zmc2V0 ID4gKFBBR0VfU0laRSA8PCBjb21wb3VuZF9vcmRlcihwYWdlKSkpOworCisJaW5mby5tZXRhID0g bnBvLT5tZXRhICsgbnBvLT5tZXRhX3Byb2QgLSAxOworCisJLyogU2tpcCB1bnVzZWQgZnJhbWVz IGZyb20gc3RhcnQgb2YgcGFnZSAqLworCXBhZ2UgKz0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJ b2Zmc2V0ICY9IH5QQUdFX01BU0s7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJV0FSTl9PTihv ZmZzZXQgPj0gUEFHRV9TSVpFKTsKKworCQlieXRlcyA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwkJ aWYgKGJ5dGVzID4gc2l6ZSkKKwkJCWJ5dGVzID0gc2l6ZTsKKworCQlpbmZvLnBhZ2UgPSBwYWdl OworCQlnbnR0YWJfZm9yZWFjaF9ncmFudF9pbl9yYW5nZShwYWdlLCBvZmZzZXQsIGJ5dGVzLAor CQkJCQkgICAgICB4ZW52aWZfZ29wX2ZyYWdfY29weV9ncmFudCwKKwkJCQkJICAgICAgJmluZm8p OworCQlzaXplIC09IGJ5dGVzOworCQlvZmZzZXQgPSAwOworCisJCS8qIE5leHQgcGFnZSAqLwor CQlpZiAoc2l6ZSkgeworCQkJV0FSTl9PTighUGFnZUNvbXBvdW5kKHBhZ2UpKTsKKwkJCXBhZ2Ur KzsKKwkJfQorCX0KKworCSpoZWFkID0gaW5mby5oZWFkOworfQorCisvKiBQcmVwYXJlIGFuIFNL QiB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgZnJvbnRlbmQuCisgKgorICogVGhpcyBmdW5jdGlv biBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBncmFudCBvcGVyYXRpb25zLCBtZXRhCisg KiBzdHJ1Y3R1cmVzLCBldGMuCisgKgorICogSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1ldGEg c3RydWN0dXJlcyBjb25zdW1lZC4gVGhlIG51bWJlciBvZgorICogcmluZyBzbG90cyB1c2VkIGlz IGFsd2F5cyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG1ldGEgc2xvdHMgdXNlZAorICogcGx1cyB0 aGUgbnVtYmVyIG9mIEdTTyBkZXNjcmlwdG9ycyB1c2VkLiBDdXJyZW50bHksIHdlIHVzZSBlaXRo ZXIKKyAqIHplcm8gR1NPIGRlc2NyaXB0b3JzIChmb3Igbm9uLUdTTyBwYWNrZXRzKSBvciBvbmUg ZGVzY3JpcHRvciAoZm9yCisgKiBmcm9udGVuZC1zaWRlIExSTykuCisgKi8KK3N0YXRpYyBpbnQg eGVudmlmX2dvcF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldHJ4X3Bl bmRpbmdfb3BlcmF0aW9ucyAqbnBvLAorCQkJICBzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkK K3sKKwlzdHJ1Y3QgeGVudmlmICp2aWYgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CisJaW50IG5y X2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlpbnQgaTsKKwlzdHJ1Y3QgeGVu X25ldGlmX3J4X3JlcXVlc3QgcmVxOworCXN0cnVjdCB4ZW52aWZfcnhfbWV0YSAqbWV0YTsKKwl1 bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBoZWFkID0gMTsKKwlpbnQgb2xkX21ldGFfcHJvZDsK KwlpbnQgZ3NvX3R5cGU7CisKKwlvbGRfbWV0YV9wcm9kID0gbnBvLT5tZXRhX3Byb2Q7CisKKwln c29fdHlwZSA9IFhFTl9ORVRJRl9HU09fVFlQRV9OT05FOworCWlmIChza2JfaXNfZ3NvKHNrYikp IHsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY0KQorCQkJ Z3NvX3R5cGUgPSBYRU5fTkVUSUZfR1NPX1RZUEVfVENQVjQ7CisJCWVsc2UgaWYgKHNrYl9zaGlu Zm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KQorCQkJZ3NvX3R5cGUgPSBYRU5fTkVU SUZfR1NPX1RZUEVfVENQVjY7CisJfQorCisJLyogU2V0IHVwIGEgR1NPIHByZWZpeCBkZXNjcmlw dG9yLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKDEgPDwgZ3NvX3R5cGUpICYgdmlmLT5nc29fcHJl Zml4X21hc2spIHsKKwkJUklOR19DT1BZX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVldWUtPnJ4LnJl cV9jb25zKyssICZyZXEpOworCQltZXRhID0gbnBvLT5tZXRhICsgbnBvLT5tZXRhX3Byb2QrKzsK KwkJbWV0YS0+Z3NvX3R5cGUgPSBnc29fdHlwZTsKKwkJbWV0YS0+Z3NvX3NpemUgPSBza2Jfc2hp bmZvKHNrYiktPmdzb19zaXplOworCQltZXRhLT5zaXplID0gMDsKKwkJbWV0YS0+aWQgPSByZXEu aWQ7CisJfQorCisJUklOR19DT1BZX1JFUVVFU1QoJnF1ZXVlLT5yeCwgcXVldWUtPnJ4LnJlcV9j b25zKyssICZyZXEpOworCW1ldGEgPSBucG8tPm1ldGEgKyBucG8tPm1ldGFfcHJvZCsrOworCisJ aWYgKCgxIDw8IGdzb190eXBlKSAmIHZpZi0+Z3NvX21hc2spIHsKKwkJbWV0YS0+Z3NvX3R5cGUg PSBnc29fdHlwZTsKKwkJbWV0YS0+Z3NvX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXpl OworCX0gZWxzZSB7CisJCW1ldGEtPmdzb190eXBlID0gWEVOX05FVElGX0dTT19UWVBFX05PTkU7 CisJCW1ldGEtPmdzb19zaXplID0gMDsKKwl9CisKKwltZXRhLT5zaXplID0gMDsKKwltZXRhLT5p ZCA9IHJlcS5pZDsKKwlucG8tPmNvcHlfb2ZmID0gMDsKKwlucG8tPmNvcHlfZ3JlZiA9IHJlcS5n cmVmOworCisJZGF0YSA9IHNrYi0+ZGF0YTsKKwl3aGlsZSAoZGF0YSA8IHNrYl90YWlsX3BvaW50 ZXIoc2tiKSkgeworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZGF0YSk7 CisJCXVuc2lnbmVkIGludCBsZW4gPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisKKwkJaWYgKGRhdGEg KyBsZW4gPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCisJCQlsZW4gPSBza2JfdGFpbF9wb2ludGVy KHNrYikgLSBkYXRhOworCisJCXhlbnZpZl9nb3BfZnJhZ19jb3B5KHF1ZXVlLCBza2IsIG5wbywK KwkJCQkgICAgIHZpcnRfdG9fcGFnZShkYXRhKSwgbGVuLCBvZmZzZXQsICZoZWFkKTsKKwkJZGF0 YSArPSBsZW47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJeGVu dmlmX2dvcF9mcmFnX2NvcHkocXVldWUsIHNrYiwgbnBvLAorCQkJCSAgICAgc2tiX2ZyYWdfcGFn ZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSksCisJCQkJICAgICBza2JfZnJhZ19zaXplKCZz a2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldKSwKKwkJCQkgICAgIHNrYl9zaGluZm8oc2tiKS0+ZnJh Z3NbaV0ucGFnZV9vZmZzZXQsCisJCQkJICAgICAmaGVhZCk7CisJfQorCisJcmV0dXJuIG5wby0+ bWV0YV9wcm9kIC0gb2xkX21ldGFfcHJvZDsKK30KKworLyogVGhpcyBpcyBhIHR3aW4gdG8geGVu dmlmX2dvcF9za2IuICBBc3N1bWUgdGhhdCB4ZW52aWZfZ29wX3NrYiB3YXMKKyAqIHVzZWQgdG8g c2V0IHVwIHRoZSBvcGVyYXRpb25zIG9uIHRoZSB0b3Agb2YKKyAqIG5ldHJ4X3BlbmRpbmdfb3Bl cmF0aW9ucywgd2hpY2ggaGF2ZSBzaW5jZSBiZWVuIGRvbmUuICBDaGVjayB0aGF0CisgKiB0aGV5 IGRpZG4ndCBnaXZlIGFueSBlcnJvcnMgYW5kIGFkdmFuY2Ugb3ZlciB0aGVtLgorICovCitzdGF0 aWMgaW50IHhlbnZpZl9jaGVja19nb3Aoc3RydWN0IHhlbnZpZiAqdmlmLCBpbnQgbnJfbWV0YV9z bG90cywKKwkJCSAgICBzdHJ1Y3QgbmV0cnhfcGVuZGluZ19vcGVyYXRpb25zICpucG8pCit7CisJ c3RydWN0IGdudHRhYl9jb3B5ICAgICAqY29weV9vcDsKKwlpbnQgc3RhdHVzID0gWEVOX05FVElG X1JTUF9PS0FZOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX21ldGFfc2xvdHM7IGkr KykgeworCQljb3B5X29wID0gbnBvLT5jb3B5ICsgbnBvLT5jb3B5X2NvbnMrKzsKKwkJaWYgKGNv cHlfb3AtPnN0YXR1cyAhPSBHTlRTVF9va2F5KSB7CisJCQluZXRkZXZfZGJnKHZpZi0+ZGV2LAor CQkJCSAgICJCYWQgc3RhdHVzICVkIGZyb20gY29weSB0byBET00lZC5cbiIsCisJCQkJICAgY29w eV9vcC0+c3RhdHVzLCB2aWYtPmRvbWlkKTsKKwkJCXN0YXR1cyA9IFhFTl9ORVRJRl9SU1BfRVJS T1I7CisJCX0KKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IHhlbl9u ZXRpZl9yeF9yZXNwb25zZSAqbWFrZV9yeF9yZXNwb25zZSgKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVl ICpxdWV1ZSwgdTE2IGlkLCBzOCBzdCwgdTE2IG9mZnNldCwgdTE2IHNpemUsCisJdTE2IGZsYWdz KQoreworCVJJTkdfSURYIGkgPSBxdWV1ZS0+cngucnNwX3Byb2RfcHZ0OworCXN0cnVjdCB4ZW5f bmV0aWZfcnhfcmVzcG9uc2UgKnJlc3A7CisKKwlyZXNwID0gUklOR19HRVRfUkVTUE9OU0UoJnF1 ZXVlLT5yeCwgaSk7CisJcmVzcC0+b2Zmc2V0ICAgICA9IG9mZnNldDsKKwlyZXNwLT5mbGFncyAg ICAgID0gZmxhZ3M7CisJcmVzcC0+aWQgICAgICAgICA9IGlkOworCXJlc3AtPnN0YXR1cyAgICAg PSAoczE2KXNpemU7CisJaWYgKHN0IDwgMCkKKwkJcmVzcC0+c3RhdHVzID0gKHMxNilzdDsKKwor CXF1ZXVlLT5yeC5yc3BfcHJvZF9wdnQgPSArK2k7CisKKwlyZXR1cm4gcmVzcDsKK30KKworc3Rh dGljIHZvaWQgeGVudmlmX2FkZF9mcmFnX3Jlc3BvbnNlcyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpx dWV1ZSwKKwkJCQkgICAgICBpbnQgc3RhdHVzLAorCQkJCSAgICAgIHN0cnVjdCB4ZW52aWZfcnhf bWV0YSAqbWV0YSwKKwkJCQkgICAgICBpbnQgbnJfbWV0YV9zbG90cykKK3sKKwlpbnQgaTsKKwl1 bnNpZ25lZCBsb25nIG9mZnNldDsKKworCS8qIE5vIGZyYWdtZW50cyB1c2VkICovCisJaWYgKG5y X21ldGFfc2xvdHMgPD0gMSkKKwkJcmV0dXJuOworCisJbnJfbWV0YV9zbG90cy0tOworCisJZm9y IChpID0gMDsgaSA8IG5yX21ldGFfc2xvdHM7IGkrKykgeworCQlpbnQgZmxhZ3M7CisKKwkJaWYg KGkgPT0gbnJfbWV0YV9zbG90cyAtIDEpCisJCQlmbGFncyA9IDA7CisJCWVsc2UKKwkJCWZsYWdz ID0gWEVOX05FVFJYRl9tb3JlX2RhdGE7CisKKwkJb2Zmc2V0ID0gMDsKKwkJbWFrZV9yeF9yZXNw b25zZShxdWV1ZSwgbWV0YVtpXS5pZCwgc3RhdHVzLCBvZmZzZXQsCisJCQkJIG1ldGFbaV0uc2l6 ZSwgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgeGVudmlmX3J4X2FjdGlvbihzdHJ1Y3Qg eGVudmlmX3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3QgeGVudmlmICp2aWYgPSBxdWV1ZS0+dmlm OworCXM4IHN0YXR1czsKKwl1MTYgZmxhZ3M7CisJc3RydWN0IHhlbl9uZXRpZl9yeF9yZXNwb25z ZSAqcmVzcDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4cTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2ti OworCUxJU1RfSEVBRChub3RpZnkpOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7 CisJYm9vbCBuZWVkX3RvX25vdGlmeSA9IGZhbHNlOworCisJc3RydWN0IG5ldHJ4X3BlbmRpbmdf b3BlcmF0aW9ucyBucG8gPSB7CisJCS5jb3B5ICA9IHF1ZXVlLT5ncmFudF9jb3B5X29wLAorCQku bWV0YSAgPSBxdWV1ZS0+bWV0YSwKKwl9OworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcnhxKTsK KworCXdoaWxlICh4ZW52aWZfcnhfcmluZ19zbG90c19hdmFpbGFibGUocXVldWUpICYmCisJICAg ICAgIChza2IgPSB4ZW52aWZfcnhfZGVxdWV1ZShxdWV1ZSkpICE9IE5VTEwpIHsKKwkJcXVldWUt Pmxhc3RfcnhfdGltZSA9IGppZmZpZXM7CisKKwkJWEVOVklGX1JYX0NCKHNrYiktPm1ldGFfc2xv dHNfdXNlZCA9CisJCQl4ZW52aWZfZ29wX3NrYihza2IsICZucG8sIHF1ZXVlKTsKKworCQlfX3Nr Yl9xdWV1ZV90YWlsKCZyeHEsIHNrYik7CisJfQorCisJV0FSTl9PTihucG8ubWV0YV9wcm9kID4g QVJSQVlfU0laRShxdWV1ZS0+bWV0YSkpOworCisJaWYgKCFucG8uY29weV9wcm9kKQorCQlnb3Rv IGRvbmU7CisKKwlXQVJOX09OKG5wby5jb3B5X3Byb2QgPiBNQVhfR1JBTlRfQ09QWV9PUFMpOwor CWdudHRhYl9iYXRjaF9jb3B5KHF1ZXVlLT5ncmFudF9jb3B5X29wLCBucG8uY29weV9wcm9kKTsK KworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcnhxKSkgIT0gTlVMTCkgeworCQlzdHJ1 Y3QgeGVuX25ldGlmX2V4dHJhX2luZm8gKmV4dHJhID0gTlVMTDsKKworCQlpZiAoKDEgPDwgcXVl dWUtPm1ldGFbbnBvLm1ldGFfY29uc10uZ3NvX3R5cGUpICYKKwkJICAgIHZpZi0+Z3NvX3ByZWZp eF9tYXNrKSB7CisJCQlyZXNwID0gUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKKwkJCQkJ CSBxdWV1ZS0+cngucnNwX3Byb2RfcHZ0KyspOworCisJCQlyZXNwLT5mbGFncyA9IFhFTl9ORVRS WEZfZ3NvX3ByZWZpeCB8CisJCQkJICAgICAgWEVOX05FVFJYRl9tb3JlX2RhdGE7CisKKwkJCXJl c3AtPm9mZnNldCA9IHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmdzb19zaXplOworCQkJcmVz cC0+aWQgPSBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5pZDsKKwkJCXJlc3AtPnN0YXR1cyA9 IFhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQ7CisKKwkJCW5wby5tZXRhX2NvbnMr KzsKKwkJCVhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQtLTsKKwkJfQorCisJCXF1 ZXVlLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcXVldWUtPnN0YXRzLnR4X3BhY2tl dHMrKzsKKworCQlzdGF0dXMgPSB4ZW52aWZfY2hlY2tfZ29wKHZpZiwKKwkJCQkJICBYRU5WSUZf UlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkLAorCQkJCQkgICZucG8pOworCisJCWlmIChYRU5W SUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191c2VkID09IDEpCisJCQlmbGFncyA9IDA7CisJCWVs c2UKKwkJCWZsYWdzID0gWEVOX05FVFJYRl9tb3JlX2RhdGE7CisKKwkJaWYgKHNrYi0+aXBfc3Vt bWVkID09IENIRUNLU1VNX1BBUlRJQUwpIC8qIGxvY2FsIHBhY2tldD8gKi8KKwkJCWZsYWdzIHw9 IFhFTl9ORVRSWEZfY3N1bV9ibGFuayB8CisJCQkJIFhFTl9ORVRSWEZfZGF0YV92YWxpZGF0ZWQ7 CisJCWVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCQkJ LyogcmVtb3RlIGJ1dCBjaGVja3N1bW1lZC4gKi8KKwkJCWZsYWdzIHw9IFhFTl9ORVRSWEZfZGF0 YV92YWxpZGF0ZWQ7CisKKwkJb2Zmc2V0ID0gMDsKKwkJcmVzcCA9IG1ha2VfcnhfcmVzcG9uc2Uo cXVldWUsIHF1ZXVlLT5tZXRhW25wby5tZXRhX2NvbnNdLmlkLAorCQkJCQlzdGF0dXMsIG9mZnNl dCwKKwkJCQkJcXVldWUtPm1ldGFbbnBvLm1ldGFfY29uc10uc2l6ZSwKKwkJCQkJZmxhZ3MpOwor CisJCWlmICgoMSA8PCBxdWV1ZS0+bWV0YVtucG8ubWV0YV9jb25zXS5nc29fdHlwZSkgJgorCQkg ICAgdmlmLT5nc29fbWFzaykgeworCQkJZXh0cmEgPSAoc3RydWN0IHhlbl9uZXRpZl9leHRyYV9p bmZvICopCisJCQkJUklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKKwkJCQkJCSAgcXVldWUt PnJ4LnJzcF9wcm9kX3B2dCsrKTsKKworCQkJcmVzcC0+ZmxhZ3MgfD0gWEVOX05FVFJYRl9leHRy YV9pbmZvOworCisJCQlleHRyYS0+dS5nc28udHlwZSA9IHF1ZXVlLT5tZXRhW25wby5tZXRhX2Nv bnNdLmdzb190eXBlOworCQkJZXh0cmEtPnUuZ3NvLnNpemUgPSBxdWV1ZS0+bWV0YVtucG8ubWV0 YV9jb25zXS5nc29fc2l6ZTsKKwkJCWV4dHJhLT51Lmdzby5wYWQgPSAwOworCQkJZXh0cmEtPnUu Z3NvLmZlYXR1cmVzID0gMDsKKworCQkJZXh0cmEtPnR5cGUgPSBYRU5fTkVUSUZfRVhUUkFfVFlQ RV9HU087CisJCQlleHRyYS0+ZmxhZ3MgPSAwOworCQl9CisKKwkJaWYgKHNrYi0+c3dfaGFzaCkg eworCQkJLyogU2luY2UgdGhlIHNrYiBnb3QgaGVyZSB2aWEgeGVudmlmX3NlbGVjdF9xdWV1ZSgp CisJCQkgKiB3ZSBrbm93IHRoYXQgdGhlIGhhc2ggaGFzIGJlZW4gcmUtY2FsY3VsYXRlZAorCQkJ ICogYWNjb3JkaW5nIHRvIGEgY29uZmlndXJhdGlvbiBzZXQgYnkgdGhlIGZyb250ZW5kCisJCQkg KiBhbmQgdGhlcmVmb3JlIHdlIGtub3cgdGhhdCBpdCBpcyBsZWdpdGltYXRlIHRvCisJCQkgKiBw YXNzIGl0IHRvIHRoZSBmcm9udGVuZC4KKwkJCSAqLworCQkJaWYgKHJlc3AtPmZsYWdzICYgWEVO X05FVFJYRl9leHRyYV9pbmZvKQorCQkJCWV4dHJhLT5mbGFncyB8PSBYRU5fTkVUSUZfRVhUUkFf RkxBR19NT1JFOworCQkJZWxzZQorCQkJCXJlc3AtPmZsYWdzIHw9IFhFTl9ORVRSWEZfZXh0cmFf aW5mbzsKKworCQkJZXh0cmEgPSAoc3RydWN0IHhlbl9uZXRpZl9leHRyYV9pbmZvICopCisJCQkJ UklOR19HRVRfUkVTUE9OU0UoJnF1ZXVlLT5yeCwKKwkJCQkJCSAgcXVldWUtPnJ4LnJzcF9wcm9k X3B2dCsrKTsKKworCQkJZXh0cmEtPnUuaGFzaC5hbGdvcml0aG0gPQorCQkJCVhFTl9ORVRJRl9D VFJMX0hBU0hfQUxHT1JJVEhNX1RPRVBMSVRaOworCisJCQlpZiAoc2tiLT5sNF9oYXNoKQorCQkJ CWV4dHJhLT51Lmhhc2gudHlwZSA9CisJCQkJCXNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1Bf SVApID8KKwkJCQkJX1hFTl9ORVRJRl9DVFJMX0hBU0hfVFlQRV9JUFY0X1RDUCA6CisJCQkJCV9Y RU5fTkVUSUZfQ1RSTF9IQVNIX1RZUEVfSVBWNl9UQ1A7CisJCQllbHNlCisJCQkJZXh0cmEtPnUu aGFzaC50eXBlID0KKwkJCQkJc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgPworCQkJ CQlfWEVOX05FVElGX0NUUkxfSEFTSF9UWVBFX0lQVjQgOgorCQkJCQlfWEVOX05FVElGX0NUUkxf SEFTSF9UWVBFX0lQVjY7CisKKwkJCSoodWludDMyX3QgKilleHRyYS0+dS5oYXNoLnZhbHVlID0K KwkJCQlza2JfZ2V0X2hhc2hfcmF3KHNrYik7CisKKwkJCWV4dHJhLT50eXBlID0gWEVOX05FVElG X0VYVFJBX1RZUEVfSEFTSDsKKwkJCWV4dHJhLT5mbGFncyA9IDA7CisJCX0KKworCQl4ZW52aWZf YWRkX2ZyYWdfcmVzcG9uc2VzKHF1ZXVlLCBzdGF0dXMsCisJCQkJCSAgcXVldWUtPm1ldGEgKyBu cG8ubWV0YV9jb25zICsgMSwKKwkJCQkJICBYRU5WSUZfUlhfQ0Ioc2tiKS0+bWV0YV9zbG90c191 c2VkKTsKKworCQlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT5y eCwgcmV0KTsKKworCQluZWVkX3RvX25vdGlmeSB8PSAhIXJldDsKKworCQlucG8ubWV0YV9jb25z ICs9IFhFTlZJRl9SWF9DQihza2IpLT5tZXRhX3Nsb3RzX3VzZWQ7CisJCWRldl9rZnJlZV9za2Io c2tiKTsKKwl9CisKK2RvbmU6CisJaWYgKG5lZWRfdG9fbm90aWZ5KQorCQlub3RpZnlfcmVtb3Rl X3ZpYV9pcnEocXVldWUtPnJ4X2lycSk7Cit9CisKK3N0YXRpYyBib29sIHhlbnZpZl9yeF9xdWV1 ZV9zdGFsbGVkKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCVJJTkdfSURYIHByb2Qs IGNvbnM7CisKKwlwcm9kID0gcXVldWUtPnJ4LnNyaW5nLT5yZXFfcHJvZDsKKwljb25zID0gcXVl dWUtPnJ4LnJlcV9jb25zOworCisJcmV0dXJuICFxdWV1ZS0+c3RhbGxlZCAmJgorCQlwcm9kIC0g Y29ucyA8IDEgJiYKKwkJdGltZV9hZnRlcihqaWZmaWVzLAorCQkJICAgcXVldWUtPmxhc3Rfcnhf dGltZSArIHF1ZXVlLT52aWYtPnN0YWxsX3RpbWVvdXQpOworfQorCitzdGF0aWMgYm9vbCB4ZW52 aWZfcnhfcXVldWVfcmVhZHkoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCit7CisJUklOR19J RFggcHJvZCwgY29uczsKKworCXByb2QgPSBxdWV1ZS0+cnguc3JpbmctPnJlcV9wcm9kOworCWNv bnMgPSBxdWV1ZS0+cngucmVxX2NvbnM7CisKKwlyZXR1cm4gcXVldWUtPnN0YWxsZWQgJiYgcHJv ZCAtIGNvbnMgPj0gMTsKK30KKworc3RhdGljIGJvb2wgeGVudmlmX2hhdmVfcnhfd29yayhzdHJ1 Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKK3sKKwlyZXR1cm4geGVudmlmX3J4X3Jpbmdfc2xvdHNf YXZhaWxhYmxlKHF1ZXVlKSB8fAorCQkocXVldWUtPnZpZi0+c3RhbGxfdGltZW91dCAmJgorCQkg KHhlbnZpZl9yeF9xdWV1ZV9zdGFsbGVkKHF1ZXVlKSB8fAorCQkgIHhlbnZpZl9yeF9xdWV1ZV9y ZWFkeShxdWV1ZSkpKSB8fAorCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwKKwkJcXVldWUtPnZp Zi0+ZGlzYWJsZWQ7Cit9CisKK3N0YXRpYyBsb25nIHhlbnZpZl9yeF9xdWV1ZV90aW1lb3V0KHN0 cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJbG9u ZyB0aW1lb3V0OworCisJc2tiID0gc2tiX3BlZWsoJnF1ZXVlLT5yeF9xdWV1ZSk7CisJaWYgKCFz a2IpCisJCXJldHVybiBNQVhfU0NIRURVTEVfVElNRU9VVDsKKworCXRpbWVvdXQgPSBYRU5WSUZf UlhfQ0Ioc2tiKS0+ZXhwaXJlcyAtIGppZmZpZXM7CisJcmV0dXJuIHRpbWVvdXQgPCAwID8gMCA6 IHRpbWVvdXQ7Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIGd1ZXN0IFJ4IHRocmVhZCBoYXMgd29y ay4KKyAqCisgKiBUaGUgdGltZW91dCBuZWVkcyB0byBiZSBhZGp1c3RlZCBiYXNlZCBvbiB0aGUg Y3VycmVudCBoZWFkIG9mIHRoZQorICogcXVldWUgKGFuZCBub3QganVzdCB0aGUgaGVhZCBhdCB0 aGUgYmVnaW5uaW5nKS4gIEluIHBhcnRpY3VsYXIsIGlmCisgKiB0aGUgcXVldWUgaXMgaW5pdGlh bGx5IGVtcHR5IGFuIGluZmluaXRlIHRpbWVvdXQgaXMgdXNlZCBhbmQgdGhpcworICogbmVlZHMg dG8gYmUgcmVkdWNlZCB3aGVuIGEgc2tiIGlzIHF1ZXVlZC4KKyAqCisgKiBUaGlzIGNhbm5vdCBi ZSBkb25lIHdpdGggd2FpdF9ldmVudF90aW1lb3V0KCkgYmVjYXVzZSBpdCBvbmx5CisgKiBjYWxj dWxhdGVzIHRoZSB0aW1lb3V0IG9uY2UuCisgKi8KK3N0YXRpYyB2b2lkIHhlbnZpZl93YWl0X2Zv cl9yeF93b3JrKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCURFRklORV9XQUlUKHdh aXQpOworCisJaWYgKHhlbnZpZl9oYXZlX3J4X3dvcmsocXVldWUpKQorCQlyZXR1cm47CisKKwlm b3IgKDs7KSB7CisJCWxvbmcgcmV0OworCisJCXByZXBhcmVfdG9fd2FpdCgmcXVldWUtPndxLCAm d2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHhlbnZpZl9oYXZlX3J4X3dvcmsocXVl dWUpKQorCQkJYnJlYWs7CisJCXJldCA9IHNjaGVkdWxlX3RpbWVvdXQoeGVudmlmX3J4X3F1ZXVl X3RpbWVvdXQocXVldWUpKTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwl9CisJZmluaXNoX3dh aXQoJnF1ZXVlLT53cSwgJndhaXQpOworfQorCitzdGF0aWMgdm9pZCB4ZW52aWZfcXVldWVfY2Fy cmllcl9vZmYoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IHhlbnZpZiAq dmlmID0gcXVldWUtPnZpZjsKKworCXF1ZXVlLT5zdGFsbGVkID0gdHJ1ZTsKKworCS8qIEF0IGxl YXN0IG9uZSBxdWV1ZSBoYXMgc3RhbGxlZD8gRGlzYWJsZSB0aGUgY2Fycmllci4gKi8KKwlzcGlu X2xvY2soJnZpZi0+bG9jayk7CisJaWYgKHZpZi0+c3RhbGxlZF9xdWV1ZXMrKyA9PSAwKSB7CisJ CW5ldGRldl9pbmZvKHZpZi0+ZGV2LCAiR3Vlc3QgUnggc3RhbGxlZCIpOworCQluZXRpZl9jYXJy aWVyX29mZih2aWYtPmRldik7CisJfQorCXNwaW5fdW5sb2NrKCZ2aWYtPmxvY2spOworfQorCitz dGF0aWMgdm9pZCB4ZW52aWZfcXVldWVfY2Fycmllcl9vbihzdHJ1Y3QgeGVudmlmX3F1ZXVlICpx dWV1ZSkKK3sKKwlzdHJ1Y3QgeGVudmlmICp2aWYgPSBxdWV1ZS0+dmlmOworCisJcXVldWUtPmxh c3RfcnhfdGltZSA9IGppZmZpZXM7IC8qIFJlc2V0IFJ4IHN0YWxsIGRldGVjdGlvbi4gKi8KKwlx dWV1ZS0+c3RhbGxlZCA9IGZhbHNlOworCisJLyogQWxsIHF1ZXVlcyBhcmUgcmVhZHk/IEVuYWJs ZSB0aGUgY2Fycmllci4gKi8KKwlzcGluX2xvY2soJnZpZi0+bG9jayk7CisJaWYgKC0tdmlmLT5z dGFsbGVkX3F1ZXVlcyA9PSAwKSB7CisJCW5ldGRldl9pbmZvKHZpZi0+ZGV2LCAiR3Vlc3QgUngg cmVhZHkiKTsKKwkJbmV0aWZfY2Fycmllcl9vbih2aWYtPmRldik7CisJfQorCXNwaW5fdW5sb2Nr KCZ2aWYtPmxvY2spOworfQorCitpbnQgeGVudmlmX2t0aHJlYWRfZ3Vlc3Rfcngodm9pZCAqZGF0 YSkKK3sKKwlzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSA9IGRhdGE7CisJc3RydWN0IHhlbnZp ZiAqdmlmID0gcXVldWUtPnZpZjsKKworCWlmICghdmlmLT5zdGFsbF90aW1lb3V0KQorCQl4ZW52 aWZfcXVldWVfY2Fycmllcl9vbihxdWV1ZSk7CisKKwlmb3IgKDs7KSB7CisJCXhlbnZpZl93YWl0 X2Zvcl9yeF93b3JrKHF1ZXVlKTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJ YnJlYWs7CisKKwkJLyogVGhpcyBmcm9udGVuZCBpcyBmb3VuZCB0byBiZSByb2d1ZSwgZGlzYWJs ZSBpdCBpbgorCQkgKiBrdGhyZWFkIGNvbnRleHQuIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgc2V0 IHdoZW4KKwkJICogbmV0YmFjayBmaW5kcyBvdXQgZnJvbnRlbmQgc2VuZHMgbWFsZm9ybWVkIHBh Y2tldCwKKwkJICogYnV0IHdlIGNhbm5vdCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgaW4gc29mdGly cQorCQkgKiBjb250ZXh0IHNvIHdlIGRlZmVyIGl0IGhlcmUsIGlmIHRoaXMgdGhyZWFkIGlzCisJ CSAqIGFzc29jaWF0ZWQgd2l0aCBxdWV1ZSAwLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHZpZi0+ ZGlzYWJsZWQgJiYgcXVldWUtPmlkID09IDApKSB7CisJCQl4ZW52aWZfY2Fycmllcl9vZmYodmlm KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnF1ZXVlLT5yeF9x dWV1ZSkpCisJCQl4ZW52aWZfcnhfYWN0aW9uKHF1ZXVlKTsKKworCQkvKiBJZiB0aGUgZ3Vlc3Qg aGFzbid0IHByb3ZpZGVkIGFueSBSeCBzbG90cyBmb3IgYQorCQkgKiB3aGlsZSBpdCdzIHByb2Jh Ymx5IG5vdCByZXNwb25zaXZlLCBkcm9wIHRoZQorCQkgKiBjYXJyaWVyIHNvIHBhY2tldHMgYXJl IGRyb3BwZWQgZWFybGllci4KKwkJICovCisJCWlmICh2aWYtPnN0YWxsX3RpbWVvdXQpIHsKKwkJ CWlmICh4ZW52aWZfcnhfcXVldWVfc3RhbGxlZChxdWV1ZSkpCisJCQkJeGVudmlmX3F1ZXVlX2Nh cnJpZXJfb2ZmKHF1ZXVlKTsKKwkJCWVsc2UgaWYgKHhlbnZpZl9yeF9xdWV1ZV9yZWFkeShxdWV1 ZSkpCisJCQkJeGVudmlmX3F1ZXVlX2NhcnJpZXJfb24ocXVldWUpOworCQl9CisKKwkJLyogUXVl dWVkIHBhY2tldHMgbWF5IGhhdmUgZm9yZWlnbiBwYWdlcyBmcm9tIG90aGVyCisJCSAqIGRvbWFp bnMuICBUaGVzZSBjYW5ub3QgYmUgcXVldWVkIGluZGVmaW5pdGVseSBhcworCQkgKiB0aGlzIHdv dWxkIHN0YXJ2ZSBndWVzdHMgb2YgZ3JhbnQgcmVmcyBhbmQgdHJhbnNtaXQKKwkJICogc2xvdHMu CisJCSAqLworCQl4ZW52aWZfcnhfcXVldWVfZHJvcF9leHBpcmVkKHF1ZXVlKTsKKworCQl4ZW52 aWZfcnhfcXVldWVfbWF5YmVfd2FrZShxdWV1ZSk7CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQor CisJLyogQmluIGFueSByZW1haW5pbmcgc2ticyAqLworCXhlbnZpZl9yeF9xdWV1ZV9wdXJnZShx dWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KLS0gCjIuMS40CgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2 ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==