From mboxrd@z Thu Jan 1 00:00:00 1970 From: j.glisse@gmail.com Subject: [PATCH 09/12] ttm: Provide DMA aware TTM page pool code. Date: Mon, 7 Nov 2011 18:40:29 -0500 Message-ID: <1320709232-29477-10-git-send-email-j.glisse@gmail.com> References: <1320709232-29477-1-git-send-email-j.glisse@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yw0-f49.google.com (mail-yw0-f49.google.com [209.85.213.49]) by gabe.freedesktop.org (Postfix) with ESMTP id 716A5A090D for ; Mon, 7 Nov 2011 15:36:49 -0800 (PST) Received: by mail-yw0-f49.google.com with SMTP id 1so6723561ywn.36 for ; Mon, 07 Nov 2011 15:36:49 -0800 (PST) In-Reply-To: <1320709232-29477-1-git-send-email-j.glisse@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: dri-devel@lists.freedesktop.org Cc: thellstrom@vmware.com List-Id: dri-devel@lists.freedesktop.org RnJvbTogS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgoKSW4g VFRNIHdvcmxkIHRoZSBwYWdlcyBmb3IgdGhlIGdyYXBoaWMgZHJpdmVycyBhcmUga2VwdCBpbiB0 aHJlZSBkaWZmZXJlbnQKcG9vbHM6IHdyaXRlIGNvbWJpbmVkLCB1bmNhY2hlZCwgYW5kIGNhY2hl ZCAod3JpdGUtYmFjaykuIFdoZW4gdGhlIHBhZ2VzCmFyZSB1c2VkIGJ5IHRoZSBncmFwaGljIGRy aXZlciB0aGUgZ3JhcGhpYyBhZGFwdGVyIHZpYSBpdHMgYnVpbHQgaW4gTU1VCihvciBBR1ApIHBy b2dyYW1zIHRoZXNlIHBhZ2VzIGluLiBUaGUgcHJvZ3JhbW1pbmcgcmVxdWlyZXMgdGhlIHZpcnR1 YWwgYWRkcmVzcwooZnJvbSB0aGUgZ3JhcGhpYyBhZGFwdGVyIHBlcnNwZWN0aXZlKSBhbmQgdGhl IHBoeXNpY2FsIGFkZHJlc3MgKGVpdGhlciBTeXN0ZW0gUkFNCm9yIHRoZSBtZW1vcnkgb24gdGhl IGNhcmQpIHdoaWNoIGlzIG9idGFpbmVkIHVzaW5nIHRoZSBwY2lfbWFwXyogY2FsbHMgKHdoaWNo IGRvZXMgdGhlCnZpcnR1YWwgdG8gcGh5c2ljYWwgLSBvciBidXMgYWRkcmVzcyB0cmFuc2xhdGlv bikuIER1cmluZyB0aGUgZ3JhcGhpYyBhcHBsaWNhdGlvbidzCiJsaWZlIiB0aG9zZSBwYWdlcyBj YW4gYmUgc2h1ZmZsZWQgYXJvdW5kLCBzd2FwcGVkIG91dCB0byBkaXNrLCBtb3ZlZCBmcm9tIHRo ZQpWUkFNIHRvIFN5c3RlbSBSQU0gb3IgdmljZS12ZXJzYS4gVGhpcyBhbGwgd29ya3Mgd2l0aCB0 aGUgZXhpc3RpbmcgVFRNIHBvb2wgY29kZQotIGV4Y2VwdCB3aGVuIHdlIHdhbnQgdG8gdXNlIHRo ZSBzb2Z0d2FyZSBJT1RMQiAoU1dJT1RMQikgY29kZSB0byAibWFwIiB0aGUgcGh5c2ljYWwKYWRk cmVzc2VzIHRvIHRoZSBncmFwaGljIGFkYXB0ZXIgTU1VLiBXZSBlbmQgdXAgcHJvZ3JhbW1pbmcg dGhlIGJvdW5jZSBidWZmZXIncwpwaHlzaWNhbCBhZGRyZXNzIGluc3RlYWQgb2YgdGhlIFRUTSBw b29sIG1lbW9yeSdzIGFuZCBnZXQgYSBub24td29ya3kgZHJpdmVyLgpUaGVyZSBhcmUgdHdvIHNv bHV0aW9uczoKMSkgdXNpbmcgdGhlIERNQSBBUEkgdG8gYWxsb2NhdGUgcGFnZXMgdGhhdCBhcmUg c2NyZWVuZWQgYnkgdGhlIERNQSBBUEksIG9yCjIpIHVzaW5nIHRoZSBwY2lfc3luY18qIGNhbGxz IHRvIGNvcHkgdGhlIHBhZ2VzIGZyb20gdGhlIGJvdW5jZS1idWZmZXIgYW5kIGJhY2suCgpUaGlz IHBhdGNoIGZpeGVzIHRoZSBpc3N1ZSBieSBhbGxvY2F0aW5nIHBhZ2VzIHVzaW5nIHRoZSBETUEg QVBJLiBUaGUgc2Vjb25kCmlzIGEgdmlhYmxlIG9wdGlvbiAtIGJ1dCBpdCBoYXMgcGVyZm9ybWFu Y2UgZHJhd2JhY2tzIGFuZCBwb3RlbnRpYWwgY29ycmVjdG5lc3MKaXNzdWVzIC0gdGhpbmsgb2Yg dGhlIHdyaXRlIGNhY2hlIHBhZ2UgYmVpbmcgYm91bmNlZCAoU1dJT1RMQi0+VFRNKSwgdGhlCldD IGlzIHNldCBvbiB0aGUgVFRNIHBhZ2UgYW5kIHRoZSBjb3B5IGZyb20gU1dJT1RMQiBub3QgbWFr aW5nIGl0IHRvIHRoZSBUVE0KcGFnZSB1bnRpbCB0aGUgcGFnZSBoYXMgYmVlbiByZWN5Y2xlZCBp biB0aGUgcG9vbCAoYW5kIHVzZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbikuCgpUaGUgYm91bmNl IGJ1ZmZlciBkb2VzIG5vdCBnZXQgYWN0aXZhdGVkIG9mdGVuIC0gb25seSBpbiBjYXNlcyB3aGVy ZSB3ZSBoYXZlCmEgMzItYml0IGNhcGFibGUgY2FyZCBhbmQgd2Ugd2FudCB0byB1c2UgYSBwYWdl IHRoYXQgaXMgYWxsb2NhdGVkIGFib3ZlIHRoZQo0R0IgbGltaXQuIFRoZSBib3VuY2UgYnVmZmVy IG9mZmVycyB0aGUgc29sdXRpb24gb2YgY29weWluZyB0aGUgY29udGVudHMKb2YgdGhhdCA0R0Ig cGFnZSB0byBhbiBsb2NhdGlvbiBiZWxvdyA0R0IgYW5kIHRoZW4gYmFjayB3aGVuIHRoZSBvcGVy YXRpb24gaGFzIGJlZW4KY29tcGxldGVkIChvciB2aWNlLXZlcnNhKS4gVGhpcyBpcyBkb25lIGJ5 IHVzaW5nIHRoZSAncGNpX3N5bmNfKicgY2FsbHMuCk5vdGU6IElmIHlvdSBsb29rIGNhcmVmdWxs eSBlbm91Z2ggaW4gdGhlIGV4aXN0aW5nIFRUTSBwYWdlIHBvb2wgY29kZSB5b3Ugd2lsbApub3Rp Y2UgdGhlIEdGUF9ETUEzMiBmbGFnIGlzIHVzZWQgIC0gd2hpY2ggc2hvdWxkIGd1YXJhbnRlZSB0 aGF0IHRoZSBwcm92aWRlZCBwYWdlCmlzIHVuZGVyIDRHQi4gSXQgY2VydGFpbmx5IGlzIHRoZSBj YXNlLCBleGNlcHQgdGhpcyBnZXRzIGlnbm9yZWQgaW4gdHdvIGNhc2VzOgogLSBJZiB1c2VyIHNw ZWNpZmllcyAnc3dpb3RsYj1mb3JjZScgd2hpY2ggYm91bmNlcyBfZXZlcnlfIHBhZ2UuCiAtIElm IHVzZXIgaXMgdXNpbmcgYSBYZW4ncyBQViBMaW51eCBndWVzdCAod2hpY2ggdXNlcyB0aGUgU1dJ T1RMQiBhbmQgdGhlCiAgIHVuZGVybGF5aW5nIFBGTidzIGFyZW4ndCBuZWNlc3NhcmlseSB1bmRl ciA0R0IpLgoKVG8gbm90IGhhdmUgdGhpcyBleHRyYSBjb3B5aW5nIGRvbmUgdGhlIG90aGVyIG9w dGlvbiBpcyB0byBhbGxvY2F0ZSB0aGUgcGFnZXMKdXNpbmcgdGhlIERNQSBBUEkgc28gdGhhdCB0 aGVyZSBpcyBub3QgbmVlZCB0byBtYXAgdGhlIHBhZ2UgYW5kIHBlcmZvcm0gdGhlCmV4cGVuc2l2 ZSAncGNpX3N5bmNfKicgY2FsbHMuCgpUaGlzIERNQSBBUEkgY2FwYWJsZSBUVE0gcG9vbCByZXF1 aXJlcyBmb3IgdGhpcyB0aGUgJ3N0cnVjdCBkZXZpY2UnIHRvCnByb3Blcmx5IGNhbGwgdGhlIERN QSBBUEkuIEl0IGFsc28gaGFzIHRvIHRyYWNrIHRoZSB2aXJ0dWFsIGFuZCBidXMgYWRkcmVzcyBv Zgp0aGUgcGFnZSBiZWluZyBoYW5kZWQgb3V0IGluIGNhc2UgaXQgZW5kcyB1cCBiZWluZyBzd2Fw cGVkIG91dCBvciBkZS1hbGxvY2F0ZWQgLQp0byBtYWtlIHN1cmUgaXQgaXMgZGUtYWxsb2NhdGVk IHVzaW5nIHRoZSBwcm9wZXIncyAnc3RydWN0IGRldmljZScuCgpJbXBsZW1lbnRhdGlvbiB3aXNl IHRoZSBjb2RlIGtlZXBzIHR3byBsaXN0czogb25lIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlCidz dHJ1Y3QgZGV2aWNlJyAodmlhIHRoZSBkZXYtPmRtYV9wb29scyBsaXN0KSBhbmQgYSBnbG9iYWwg b25lIHRvIGJlIHVzZWQgd2hlbgp0aGUgJ3N0cnVjdCBkZXZpY2UnIGlzIHVuYXZhaWxhYmxlICh0 aGluayBzaHJpbmtlciBjb2RlKS4gVGhlIGdsb2JhbCBsaXN0IGNhbgppdGVyYXRlIG92ZXIgYWxs IG9mIHRoZSAnc3RydWN0IGRldmljZScgYW5kIGl0cyBhc3NvY2lhdGVkIGRtYV9wb29sLiBUaGUg bGlzdAppbiBkZXYtPmRtYV9wb29scyBjYW4gb25seSBpdGVyYXRlIHRoZSBkZXZpY2UncyBkbWFf cG9vbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgL1tzdHJ1Y3QgZGV2aWNlX3Bvb2xdXAogICAgICAgIC8tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IGRldiAgICAgICAgICAgICAgICB8 CiAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0t LS0tLXwgZG1hX3Bvb2wgICAgICAgICAgIHwKIC8tLS0tLSstLS0tLS1cICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgXC0tLS0tLS0tLS0tLS0tLS0tLS0tLwogfHN0 cnVjdCBkZXZpY2V8ICAgICAvLS0+W3N0cnVjdCBkbWFfcG9vbCBmb3IgV0NdPC8gICAgICAgICAv W3N0cnVjdCBkZXZpY2VfcG9vbF1cCiB8IGRtYV9wb29scyAgICstLS0tKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvLXwgZGV2ICAgICAgICAgICAgICAgIHwKIHwgIC4uLiAg ICAgICAgfCAgICBcLS0tPltzdHJ1Y3QgZG1hX3Bvb2wgZm9yIHVuY2FjaGVkXTwtLy0tfCBkbWFf cG9vbCAgICAgICAgICAgfAogXC0tLS0tKy0tLS0tLS8gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8gICBcLS0tLS0tLS0tLS0tLS0tLS0tLS0vCiAgICAgICAgXC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vCltUd28gcG9vbHMgYXNz b2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgKFdDIGFuZCBVQyksIGFuZCB0aGUgcGFyYWxsZWwgbGlz dApjb250YWluaW5nIHRoZSAnc3RydWN0IGRldicgYW5kICdzdHJ1Y3QgZG1hX3Bvb2wnIGVudHJp ZXNdCgpUaGUgbWF4aW11bSBhbW91bnQgb2YgZG1hIHBvb2xzIGEgZGV2aWNlIGNhbiBoYXZlIGlz IHNpeDogd3JpdGUtY29tYmluZWQsCnVuY2FjaGVkLCBhbmQgY2FjaGVkOyB0aGVuIHRoZXJlIGFy ZSB0aGUgRE1BMzIgdmFyaWFudHMgd2hpY2ggYXJlOgp3cml0ZS1jb21iaW5lZCBkbWEzMiwgdW5j YWNoZWQgZG1hMzIsIGFuZCBjYWNoZWQgZG1hMzIuCgpDdXJyZW50bHkgdGhpcyBjb2RlIG9ubHkg Z2V0cyBhY3RpdmF0ZWQgd2hlbiBhbnkgdmFyaWFudCBvZiB0aGUgU1dJT1RMQiBJT01NVQpjb2Rl IGlzIHJ1bm5pbmcgKEludGVsIHdpdGhvdXQgVlQtZCwgQU1EIHdpdGhvdXQgR0FSVCwgSUJNIENh bGdhcnkgYW5kIFhlbiBQVgp3aXRoIFBDSSBkZXZpY2VzKS4KClRlc3RlZC1ieTogTWljaGVsIETD pG56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KW3YxOiBVc2luZyBzd2lvdGxiX25yX3RibCBpbnN0 ZWFkIG9mIHN3aW90bGJfZW5hYmxlZF0KW3YyOiBNYWpvciBvdmVyaGF1bCAtIGFkZGVkICdpbnVz ZV9saXN0JyB0byBzZXBlcmF0ZSB1c2VkIGZyb20gaW51c2UgYW5kIHJlb3JkZXIKdGhlIG9yZGVy IG9mIGxpc3RzIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuXQpbdjM6IEFkZGVkIGNvbW1lbnRz L2FuZCBzb21lIGxvZ2ljIGJhc2VkIG9uIHJldmlldywgQWRkZWQgSmVyb21lIHRhZ10KW3Y0OiBy ZWJhc2Ugb24gdG9wIG9mIHR0bV90dCAmIHR0bV9iYWNrZW5kIG1lcmdlXQpSZXZpZXdlZC1ieTog SmVyb21lIEdsaXNzZSA8amdsaXNzZUByZWRoYXQuY29tPgpTaWduZWQtb2ZmLWJ5OiBLb25yYWQg Unplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+Ci0tLQogZHJpdmVycy9ncHUv ZHJtL3R0bS9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgIDQgKwogZHJpdmVycy9ncHUvZHJtL3R0 bS90dG1fbWVtb3J5LmMgICAgICAgICB8ICAgIDIgKwogZHJpdmVycy9ncHUvZHJtL3R0bS90dG1f cGFnZV9hbGxvY19kbWEuYyB8IDEyMTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBp bmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oICAgICAgICAgIHwgICAgMiArCiBpbmNsdWRl L2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuaCAgICAgICAgIHwgICAzNiArCiA1IGZpbGVzIGNoYW5n ZWQsIDEyNTYgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jX2RtYS5jCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90dG0vTWFrZWZp bGUKaW5kZXggZjNjZjZmMC4uYjJiMzNkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0 bS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL01ha2VmaWxlCkBAIC03LDQgKzcs OCBAQCB0dG0teSA6PSB0dG1fYWdwX2JhY2tlbmQubyB0dG1fbWVtb3J5Lm8gdHRtX3R0Lm8gdHRt X2JvLm8gXAogCXR0bV9vYmplY3QubyB0dG1fbG9jay5vIHR0bV9leGVjYnVmX3V0aWwubyB0dG1f cGFnZV9hbGxvYy5vIFwKIAl0dG1fYm9fbWFuYWdlci5vCiAKK2lmZXEgKCQoQ09ORklHX1NXSU9U TEIpLHkpCit0dG0teSArPSB0dG1fcGFnZV9hbGxvY19kbWEubworZW5kaWYKKwogb2JqLSQoQ09O RklHX0RSTV9UVE0pICs9IHR0bS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0 bV9tZW1vcnkuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCmluZGV4IDNhM2E1 OGIuLjI4NjRhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5j CisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCkBAIC0zOTUsNiArMzk1LDcg QEAgaW50IHR0bV9tZW1fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iKQog CQkgICAgICAgem9uZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgem9uZS0+bWF4X21lbSA+ PiAxMCk7CiAJfQogCXR0bV9wYWdlX2FsbG9jX2luaXQoZ2xvYiwgZ2xvYi0+em9uZV9rZXJuZWwt Pm1heF9tZW0vKDIqUEFHRV9TSVpFKSk7CisJdHRtX2RtYV9wYWdlX2FsbG9jX2luaXQoZ2xvYiwg Z2xvYi0+em9uZV9rZXJuZWwtPm1heF9tZW0vKDIqUEFHRV9TSVpFKSk7CiAJcmV0dXJuIDA7CiBv dXRfbm9fem9uZToKIAl0dG1fbWVtX2dsb2JhbF9yZWxlYXNlKGdsb2IpOwpAQCAtNDA5LDYgKzQx MCw3IEBAIHZvaWQgdHRtX21lbV9nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgdHRtX21lbV9nbG9iYWwg Kmdsb2IpCiAKIAkvKiBsZXQgdGhlIHBhZ2UgYWxsb2NhdG9yIGZpcnN0IHN0b3AgdGhlIHNocmlu ayB3b3JrLiAqLwogCXR0bV9wYWdlX2FsbG9jX2ZpbmkoKTsKKwl0dG1fZG1hX3BhZ2VfYWxsb2Nf ZmluaSgpOwogCiAJZmx1c2hfd29ya3F1ZXVlKGdsb2ItPnN3YXBfcXVldWUpOwogCWRlc3Ryb3lf d29ya3F1ZXVlKGdsb2ItPnN3YXBfcXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L3R0bS90dG1fcGFnZV9hbGxvY19kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3BhZ2Vf YWxsb2NfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjNTFiYQot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2NfZG1h LmMKQEAgLTAsMCArMSwxMjEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgKGMpIE9yYWNsZSBD b3JwLgorCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwg dG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBh c3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRl YWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0 IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBw dWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBv ZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29m dHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29u ZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJl IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRo ZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lU SE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVE SU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFks CisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVO VC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJT IEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJ U0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAq IEF1dGhvcjogS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2lsa0BvcmFjbGUuY29tPgor ICovCisKKy8qCisgKiBBIHNpbXBsZSBETUEgcG9vbCBsb3NlbHkgYmFzZWQgb24gZG1hcG9vbC5j LiBJdCBoYXMgY2VydGFpbiBhZHZhbnRhZ2VzCisgKiBvdmVyIHRoZSBETUEgcG9vbHM6CisgKiAt IFBvb2wgY29sbGVjdHMgcmVzZW50bHkgZnJlZWQgcGFnZXMgZm9yIHJldXNlIChhbmQgaG9va3Mg dXAgdG8KKyAqICAgdGhlIHNocmlua2VyKS4KKyAqIC0gVHJhY2tzIGN1cnJlbnRseSBpbiB1c2Ug cGFnZXMKKyAqIC0gVHJhY2tzIHdoZXRoZXIgdGhlIHBhZ2UgaXMgVUMsIFdCIG9yIGNhY2hlZCAo YW5kIHJldmVydHMgdG8gV0IKKyAqICAgd2hlbiBmcmVlZCkuCisgKi8KKworI2luY2x1ZGUgPGxp bnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxp bnV4L3NlcV9maWxlLmg+IC8qIGZvciBzZXFfcHJpbnRmICovCisjaW5jbHVkZSA8bGludXgvc2xh Yi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1l bS5oPgorI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNp bmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5j bHVkZSAidHRtL3R0bV9ib19kcml2ZXIuaCIKKyNpbmNsdWRlICJ0dG0vdHRtX3BhZ2VfYWxsb2Mu aCIKKyNpZmRlZiBUVE1fSEFTX0FHUAorI2luY2x1ZGUgPGFzbS9hZ3AuaD4KKyNlbmRpZgorCisj ZGVmaW5lIE5VTV9QQUdFU19UT19BTExPQwkJKFBBR0VfU0laRS9zaXplb2Yoc3RydWN0IHBhZ2Ug KikpCisjZGVmaW5lIFNNQUxMX0FMTE9DQVRJT04JCTE2CisjZGVmaW5lIEZSRUVfQUxMX1BBR0VT CQkJKH4wVSkKKy8qIHRpbWVzIGFyZSBpbiBtc2VjcyAqLworI2RlZmluZSBJU19VTkRFRklORUQJ CQkoMCkKKyNkZWZpbmUgSVNfV0MJCQkJKDE8PDEpCisjZGVmaW5lIElTX1VDCQkJCSgxPDwyKQor I2RlZmluZSBJU19DQUNIRUQJCQkoMTw8MykKKyNkZWZpbmUgSVNfRE1BMzIJCQkoMTw8NCkKKwor ZW51bSBwb29sX3R5cGUgeworCVBPT0xfSVNfVU5ERUZJTkVELAorCVBPT0xfSVNfV0MgPSBJU19X QywKKwlQT09MX0lTX1VDID0gSVNfVUMsCisJUE9PTF9JU19DQUNIRUQgPSBJU19DQUNIRUQsCisJ UE9PTF9JU19XQ19ETUEzMiA9IElTX1dDIHwgSVNfRE1BMzIsCisJUE9PTF9JU19VQ19ETUEzMiA9 IElTX1VDIHwgSVNfRE1BMzIsCisJUE9PTF9JU19DQUNIRURfRE1BMzIgPSBJU19DQUNIRUQgfCBJ U19ETUEzMiwKK307CisvKgorICogVGhlIHBvb2wgc3RydWN0dXJlLiBUaGVyZSBhcmUgdXN1YWxs eSBzaXggcG9vbHM6CisgKiAgLSBnZW5lcmljIChub3QgcmVzdHJpY3RlZCB0byBETUEzMik6Cisg KiAgICAgIC0gd3JpdGUgY29tYmluZWQsIHVuY2FjaGVkLCBjYWNoZWQuCisgKiAgLSBkbWEzMiAo dXAgdG8gMl4zMiAtIHNvIHVwIDRHQik6CisgKiAgICAgIC0gd3JpdGUgY29tYmluZWQsIHVuY2Fj aGVkLCBjYWNoZWQuCisgKiBmb3IgZWFjaCAnc3RydWN0IGRldmljZScuIFRoZSAnY2FjaGVkJyBp cyBmb3IgcGFnZXMgdGhhdCBhcmUgYWN0aXZlbHkgdXNlZC4KKyAqIFRoZSBvdGhlciBvbmVzIGNh biBiZSBzaHJ1bmsgYnkgdGhlIHNocmlua2VyIEFQSSBpZiBuZWNjZXNzYXJ5LgorICogQHBvb2xz OiBUaGUgJ3N0cnVjdCBkZXZpY2UtPmRtYV9wb29scycgbGluay4KKyAqIEB0eXBlOiBUeXBlIG9m IHRoZSBwb29sCisgKiBAbG9jazogUHJvdGVjdHMgdGhlIGludXNlX2xpc3QgYW5kIGZyZWVfbGlz dCBmcm9tIGNvbmN1cnJuZXQgYWNjZXNzLiBNdXN0IGJlCisgKiB1c2VkIHdpdGggaXJxc2F2ZS9p cnFyZXN0b3JlIHZhcmlhbnRzIGJlY2F1c2UgcG9vbCBhbGxvY2F0b3IgbWF5YmUgY2FsbGVkCisg KiBmcm9tIGRlbGF5ZWQgd29yay4KKyAqIEBpbnVzZV9saXN0OiBQb29sIG9mIHBhZ2VzIHRoYXQg YXJlIGluIHVzZS4gVGhlIG9yZGVyIGlzIHZlcnkgaW1wb3J0YW50IGFuZAorICogICBpdCBpcyBp biB0aGUgb3JkZXIgdGhhdCB0aGUgVFRNIHBhZ2VzIHRoYXQgYXJlIHB1dCBiYWNrIGFyZSBpbi4K KyAqIEBmcmVlX2xpc3Q6IFBvb2wgb2YgcGFnZXMgdGhhdCBhcmUgZnJlZSB0byBiZSB1c2VkLiBO byBvcmRlciByZXF1aXJlbWVudHMuCisgKiBAZGV2OiBUaGUgZGV2aWNlIHRoYXQgaXMgYXNzb2Np YXRlZCB3aXRoIHRoZXNlIHBvb2xzLgorICogQHNpemU6IFNpemUgdXNlZCBkdXJpbmcgRE1BIGFs bG9jYXRpb24uCisgKiBAbnBhZ2VzX2ZyZWU6IENvdW50IG9mIGF2YWlsYWJsZSBwYWdlcyBmb3Ig cmUtdXNlLgorICogQG5wYWdlc19pbl91c2U6IENvdW50IG9mIHBhZ2VzIHRoYXQgYXJlIGluIHVz ZS4KKyAqIEBuZnJlZXM6IFN0YXRzIHdoZW4gcG9vbCBpcyBzaHJpbmtpbmcuCisgKiBAbnJlZmls bHM6IFN0YXRzIHdoZW4gdGhlIHBvb2wgaXMgZ3Jvd24uCisgKiBAZ2ZwX2ZsYWdzOiBGbGFncyB0 byBwYXNzIGZvciBhbGxvY19wYWdlLgorICogQGZpbGxfbG9jazogQWxsb3dzIG9ubHkgb25lIHBv b2wgZmlsbCBvcGVyYXRpb24gYXQgdGltZS4KKyAqIEBuYW1lOiBOYW1lIG9mIHRoZSBwb29sLgor ICogQGRldl9uYW1lOiBOYW1lIGRlcmlldmVkIGZyb20gZGV2IC0gc2ltaWxhciB0byBob3cgZGV2 X2luZm8gd29ya3MuCisgKiAgIFVzZWQgZHVyaW5nIHNodXRkb3duIGFzIHRoZSBkZXZfaW5mbyBk dXJpbmcgcmVsZWFzZSBpcyB1bmF2YWlsYWJsZS4KKyAqLworc3RydWN0IGRtYV9wb29sIHsKKwlz dHJ1Y3QgbGlzdF9oZWFkIHBvb2xzOyAvKiBUaGUgJ3N0cnVjdCBkZXZpY2UtPmRtYV9wb29scyBs aW5rICovCisJZW51bSBwb29sX3R5cGUgdHlwZTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0 IGxpc3RfaGVhZCBpbnVzZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9saXN0OworCXN0 cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBzaXplOworCXVuc2lnbmVkIG5wYWdlc19mcmVl OworCXVuc2lnbmVkIG5wYWdlc19pbl91c2U7CisJdW5zaWduZWQgbG9uZyBuZnJlZXM7IC8qIFN0 YXRzIHdoZW4gc2hydW5rLiAqLworCXVuc2lnbmVkIGxvbmcgbnJlZmlsbHM7IC8qIFN0YXRzIHdo ZW4gZ3Jvd24uICovCisJZ2ZwX3QgZ2ZwX2ZsYWdzOworCWJvb2wgZmlsbF9sb2NrOworCWNoYXIg bmFtZVsxM107IC8qICJjYWNoZWQgZG1hMzIiICovCisJY2hhciBkZXZfbmFtZVs2NF07IC8qIENv bnN0cnVjdGVkIGZyb20gZGV2ICovCit9OworCisvKgorICogVGhlIGFjY291bnRpbmcgcGFnZSBr ZWVwaW5nIHRyYWNrIG9mIHRoZSBhbGxvY2F0ZWQgcGFnZSBhbG9uZyB3aXRoCisgKiB0aGUgRE1B IGFkZHJlc3MuCisgKiBAcGFnZV9saXN0OiBUaGUgbGluayB0byB0aGUgJ3BhZ2VfbGlzdCcgaW4g J3N0cnVjdCBkbWFfcG9vbCcuCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhl IHBhZ2UKKyAqIEBkbWE6IFRoZSBidXMgYWRkcmVzcyBvZiB0aGUgcGFnZS4gSWYgdGhlIHBhZ2Ug aXMgbm90IGFsbG9jYXRlZAorICogICB2aWEgdGhlIERNQSBBUEksIGl0IHdpbGwgYmUgLTEuCisg Ki8KK3N0cnVjdCBkbWFfcGFnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBwYWdlX2xpc3Q7CisJdm9p ZCAqdmFkZHI7CisJc3RydWN0IHBhZ2UgKnA7CisJZG1hX2FkZHJfdCBkbWE7Cit9OworCisvKgor ICogTGltaXRzIGZvciB0aGUgcG9vbC4gVGhleSBhcmUgaGFuZGxlZCB3aXRob3V0IGxvY2tzIGJl Y2F1c2Ugb25seSBwbGFjZSB3aGVyZQorICogdGhleSBtYXkgY2hhbmdlIGlzIGluIHN5c2ZzIHN0 b3JlLiBUaGV5IHdvbid0IGhhdmUgaW1tZWRpYXRlIGVmZmVjdCBhbnl3YXkKKyAqIHNvIGZvcmNp bmcgc2VyaWFsaXphdGlvbiB0byBhY2Nlc3MgdGhlbSBpcyBwb2ludGxlc3MuCisgKi8KKworc3Ry dWN0IHR0bV9wb29sX29wdHMgeworCXVuc2lnbmVkCWFsbG9jX3NpemU7CisJdW5zaWduZWQJbWF4 X3NpemU7CisJdW5zaWduZWQJc21hbGw7Cit9OworCisvKgorICogQ29udGFpbnMgdGhlIGxpc3Qg b2YgYWxsIG9mIHRoZSAnc3RydWN0IGRldmljZScgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKKyAq IERNQSBwb29scy4gR3VhcmRlZCBieSBfbXV0ZXgtPmxvY2suCisgKiBAcG9vbHM6IFRoZSBsaW5r IHRvICdzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlci0+cG9vbHMnCisgKiBAZGV2OiBUaGUgJ3N0cnVj dCBkZXZpY2UnIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3Bvb2wnCisgKiBAcG9vbDogVGhlICdzdHJ1 Y3QgZG1hX3Bvb2wnIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ2RldicKKyAqLworc3RydWN0IGRldmlj ZV9wb29scyB7CisJc3RydWN0IGxpc3RfaGVhZCBwb29sczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7 CisJc3RydWN0IGRtYV9wb29sICpwb29sOworfTsKKworLyoKKyAqIHN0cnVjdCB0dG1fcG9vbF9t YW5hZ2VyIC0gSG9sZHMgbWVtb3J5IHBvb2xzIGZvciBmYXN0IGFsbG9jYXRpb24KKyAqCisgKiBA bG9jazogTG9jayB1c2VkIHdoZW4gYWRkaW5nL3JlbW92aW5nIGZyb20gcG9vbHMKKyAqIEBwb29s czogTGlzdCBvZiAnc3RydWN0IGRldmljZScgYW5kICdzdHJ1Y3QgZG1hX3Bvb2wnIHR1cGxlcy4K KyAqIEBvcHRpb25zOiBMaW1pdHMgZm9yIHRoZSBwb29sLgorICogQG5wb29sczogVG90YWwgYW1v dW50IG9mIHBvb2xzIGluIGV4aXN0ZW5jZS4KKyAqIEBzaHJpbmtlcjogVGhlIHN0cnVjdHVyZSB1 c2VkIGJ5IFt1bnxdcmVnaXN0ZXJfc2hyaW5rZXIKKyAqLworc3RydWN0IHR0bV9wb29sX21hbmFn ZXIgeworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBvb2xzOworCXN0 cnVjdCB0dG1fcG9vbF9vcHRzCW9wdGlvbnM7CisJdW5zaWduZWQJCW5wb29sczsKKwlzdHJ1Y3Qg c2hyaW5rZXIJCW1tX3NocmluazsKKwlzdHJ1Y3Qga29iamVjdAkJa29iajsKK307CisKK3N0YXRp YyBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqX21hbmFnZXI7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0 cmlidXRlIHR0bV9wYWdlX3Bvb2xfbWF4ID0geworCS5uYW1lID0gInBvb2xfbWF4X3NpemUiLAor CS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSB0 dG1fcGFnZV9wb29sX3NtYWxsID0geworCS5uYW1lID0gInBvb2xfc21hbGxfYWxsb2NhdGlvbiIs CisJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUgorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRl IHR0bV9wYWdlX3Bvb2xfYWxsb2Nfc2l6ZSA9IHsKKwkubmFtZSA9ICJwb29sX2FsbG9jYXRpb25f c2l6ZSIsCisJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUgorfTsKKworc3RhdGljIHN0cnVjdCBh dHRyaWJ1dGUgKnR0bV9wb29sX2F0dHJzW10gPSB7CisJJnR0bV9wYWdlX3Bvb2xfbWF4LAorCSZ0 dG1fcGFnZV9wb29sX3NtYWxsLAorCSZ0dG1fcGFnZV9wb29sX2FsbG9jX3NpemUsCisJTlVMTAor fTsKKworc3RhdGljIHZvaWQgdHRtX3Bvb2xfa29ial9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICpr b2JqKQoreworCXN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyICptID0KKwkJY29udGFpbmVyX29mKGtv YmosIHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyLCBrb2JqKTsKKwlrZnJlZShtKTsKK30KKworc3Rh dGljIHNzaXplX3QgdHRtX3Bvb2xfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBh dHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXpl KQoreworCXN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyICptID0KKwkJY29udGFpbmVyX29mKGtvYmos IHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyLCBrb2JqKTsKKwlpbnQgY2hhcnM7CisJdW5zaWduZWQg dmFsOworCWNoYXJzID0gc3NjYW5mKGJ1ZmZlciwgIiV1IiwgJnZhbCk7CisJaWYgKGNoYXJzID09 IDApCisJCXJldHVybiBzaXplOworCisJLyogQ29udmVydCBrYiB0byBudW1iZXIgb2YgcGFnZXMg Ki8KKwl2YWwgPSB2YWwgLyAoUEFHRV9TSVpFID4+IDEwKTsKKworCWlmIChhdHRyID09ICZ0dG1f cGFnZV9wb29sX21heCkKKwkJbS0+b3B0aW9ucy5tYXhfc2l6ZSA9IHZhbDsKKwllbHNlIGlmIChh dHRyID09ICZ0dG1fcGFnZV9wb29sX3NtYWxsKQorCQltLT5vcHRpb25zLnNtYWxsID0gdmFsOwor CWVsc2UgaWYgKGF0dHIgPT0gJnR0bV9wYWdlX3Bvb2xfYWxsb2Nfc2l6ZSkgeworCQlpZiAodmFs ID4gTlVNX1BBR0VTX1RPX0FMTE9DKjgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBUVE1fUEZYCisJ CQkgICAgICAgIlNldHRpbmcgYWxsb2NhdGlvbiBzaXplIHRvICVsdSAiCisJCQkgICAgICAgImlz IG5vdCBhbGxvd2VkLiBSZWNvbW1lbmRlZCBzaXplIGlzICIKKwkJCSAgICAgICAiJWx1XG4iLAor CQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9TSVpFID4+IDcpLAorCQkJICAgICAg IE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9TSVpFID4+IDEwKSk7CisJCQlyZXR1cm4gc2l6ZTsK KwkJfSBlbHNlIGlmICh2YWwgPiBOVU1fUEFHRVNfVE9fQUxMT0MpIHsKKwkJCXByaW50ayhLRVJO X1dBUk5JTkcgVFRNX1BGWAorCQkJICAgICAgICJTZXR0aW5nIGFsbG9jYXRpb24gc2l6ZSB0byAi CisJCQkgICAgICAgImxhcmdlciB0aGFuICVsdSBpcyBub3QgcmVjb21tZW5kZWQuXG4iLAorCQkJ ICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9TSVpFID4+IDEwKSk7CisJCX0KKwkJbS0+ b3B0aW9ucy5hbGxvY19zaXplID0gdmFsOworCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0 aWMgc3NpemVfdCB0dG1fcG9vbF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0 cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IHR0bV9wb29s X21hbmFnZXIgKm0gPQorCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHR0bV9wb29sX21hbmFn ZXIsIGtvYmopOworCXVuc2lnbmVkIHZhbCA9IDA7CisKKwlpZiAoYXR0ciA9PSAmdHRtX3BhZ2Vf cG9vbF9tYXgpCisJCXZhbCA9IG0tPm9wdGlvbnMubWF4X3NpemU7CisJZWxzZSBpZiAoYXR0ciA9 PSAmdHRtX3BhZ2VfcG9vbF9zbWFsbCkKKwkJdmFsID0gbS0+b3B0aW9ucy5zbWFsbDsKKwllbHNl IGlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX2FsbG9jX3NpemUpCisJCXZhbCA9IG0tPm9wdGlv bnMuYWxsb2Nfc2l6ZTsKKworCXZhbCA9IHZhbCAqIChQQUdFX1NJWkUgPj4gMTApOworCisJcmV0 dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHR0bV9wb29sX3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9 ICZ0dG1fcG9vbF9zaG93LAorCS5zdG9yZSA9ICZ0dG1fcG9vbF9zdG9yZSwKK307CisKK3N0YXRp YyBzdHJ1Y3Qga29ial90eXBlIHR0bV9wb29sX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZSA9ICZ0 dG1fcG9vbF9rb2JqX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZ0dG1fcG9vbF9zeXNmc19vcHMs CisJLmRlZmF1bHRfYXR0cnMgPSB0dG1fcG9vbF9hdHRycywKK307CisKKyNpZm5kZWYgQ09ORklH X1g4Ngorc3RhdGljIGludCBzZXRfcGFnZXNfYXJyYXlfd2Ioc3RydWN0IHBhZ2UgKipwYWdlcywg aW50IGFkZHJpbmFycmF5KQoreworI2lmZGVmIFRUTV9IQVNfQUdQCisJaW50IGk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgYWRkcmluYXJyYXk7IGkrKykKKwkJdW5tYXBfcGFnZV9mcm9tX2FncChwYWdl c1tpXSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfcGFnZXNfYXJy YXlfd2Moc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGFkZHJpbmFycmF5KQoreworI2lmZGVmIFRU TV9IQVNfQUdQCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRkcmluYXJyYXk7IGkrKykK KwkJbWFwX3BhZ2VfaW50b19hZ3AocGFnZXNbaV0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgc2V0X3BhZ2VzX2FycmF5X3VjKHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBh ZGRyaW5hcnJheSkKK3sKKyNpZmRlZiBUVE1fSEFTX0FHUAorCWludCBpOworCisJZm9yIChpID0g MDsgaSA8IGFkZHJpbmFycmF5OyBpKyspCisJCW1hcF9wYWdlX2ludG9fYWdwKHBhZ2VzW2ldKTsK KyNlbmRpZgorCXJldHVybiAwOworfQorI2VuZGlmIC8qIGZvciAhQ09ORklHX1g4NiAqLworCitz dGF0aWMgaW50IHR0bV9zZXRfcGFnZXNfY2FjaGluZyhzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsCisJ CQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGNwYWdlcykKK3sKKwlpbnQgciA9IDA7 CisJLyogU2V0IHBhZ2UgY2FjaGluZyAqLworCWlmIChwb29sLT50eXBlICYgSVNfVUMpIHsKKwkJ ciA9IHNldF9wYWdlc19hcnJheV91YyhwYWdlcywgY3BhZ2VzKTsKKwkJaWYgKHIpCisJCQlwcl9l cnIoVFRNX1BGWAorCQkJICAgICAgICIlczogRmFpbGVkIHRvIHNldCAlZCBwYWdlcyB0byB1YyFc biIsCisJCQkgICAgICAgcG9vbC0+ZGV2X25hbWUsIGNwYWdlcyk7CisJfQorCWlmIChwb29sLT50 eXBlICYgSVNfV0MpIHsKKwkJciA9IHNldF9wYWdlc19hcnJheV93YyhwYWdlcywgY3BhZ2VzKTsK KwkJaWYgKHIpCisJCQlwcl9lcnIoVFRNX1BGWAorCQkJICAgICAgICIlczogRmFpbGVkIHRvIHNl dCAlZCBwYWdlcyB0byB3YyFcbiIsCisJCQkgICAgICAgcG9vbC0+ZGV2X25hbWUsIGNwYWdlcyk7 CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBfX3R0bV9kbWFfZnJlZV9wYWdlKHN0 cnVjdCBkbWFfcG9vbCAqcG9vbCwgc3RydWN0IGRtYV9wYWdlICpkX3BhZ2UpCit7CisJZG1hX2Fk ZHJfdCBkbWEgPSBkX3BhZ2UtPmRtYTsKKwlkbWFfZnJlZV9jb2hlcmVudChwb29sLT5kZXYsIHBv b2wtPnNpemUsIGRfcGFnZS0+dmFkZHIsIGRtYSk7CisKKwlrZnJlZShkX3BhZ2UpOworCWRfcGFn ZSA9IE5VTEw7Cit9CitzdGF0aWMgc3RydWN0IGRtYV9wYWdlICpfX3R0bV9kbWFfYWxsb2NfcGFn ZShzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wpCit7CisJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2U7CisK KwlkX3BhZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX3BhZ2UpLCBHRlBfS0VSTkVMKTsK KwlpZiAoIWRfcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkX3BhZ2UtPnZhZGRyID0gZG1hX2Fs bG9jX2NvaGVyZW50KHBvb2wtPmRldiwgcG9vbC0+c2l6ZSwKKwkJCQkJICAgJmRfcGFnZS0+ZG1h LAorCQkJCQkgICBwb29sLT5nZnBfZmxhZ3MpOworCWlmIChkX3BhZ2UtPnZhZGRyKQorCQlkX3Bh Z2UtPnAgPSB2aXJ0X3RvX3BhZ2UoZF9wYWdlLT52YWRkcik7CisJZWxzZSB7CisJCWtmcmVlKGRf cGFnZSk7CisJCWRfcGFnZSA9IE5VTEw7CisJfQorCXJldHVybiBkX3BhZ2U7Cit9CitzdGF0aWMg ZW51bSBwb29sX3R5cGUgdHRtX3RvX3R5cGUoaW50IGZsYWdzLCBlbnVtIHR0bV9jYWNoaW5nX3N0 YXRlIGNzdGF0ZSkKK3sKKwllbnVtIHBvb2xfdHlwZSB0eXBlID0gSVNfVU5ERUZJTkVEOworCisJ aWYgKGZsYWdzICYgVFRNX1BBR0VfRkxBR19ETUEzMikKKwkJdHlwZSB8PSBJU19ETUEzMjsKKwlp ZiAoY3N0YXRlID09IHR0X2NhY2hlZCkKKwkJdHlwZSB8PSBJU19DQUNIRUQ7CisJZWxzZSBpZiAo Y3N0YXRlID09IHR0X3VuY2FjaGVkKQorCQl0eXBlIHw9IElTX1VDOworCWVsc2UKKwkJdHlwZSB8 PSBJU19XQzsKKworCXJldHVybiB0eXBlOworfQorCitzdGF0aWMgdm9pZCB0dG1fcG9vbF91cGRh dGVfZnJlZV9sb2NrZWQoc3RydWN0IGRtYV9wb29sICpwb29sLAorCQkJCQl1bnNpZ25lZCBmcmVl ZF9wYWdlcykKK3sKKwlwb29sLT5ucGFnZXNfZnJlZSAtPSBmcmVlZF9wYWdlczsKKwlwb29sLT5u ZnJlZXMgKz0gZnJlZWRfcGFnZXM7CisKK30KKworLyogc2V0IG1lbW9yeSBiYWNrIHRvIHdiIGFu ZCBmcmVlIHRoZSBwYWdlcy4gKi8KK3N0YXRpYyB2b2lkIHR0bV9kbWFfcGFnZXNfcHV0KHN0cnVj dCBkbWFfcG9vbCAqcG9vbCwgc3RydWN0IGxpc3RfaGVhZCAqZF9wYWdlcywKKwkJCSAgICAgIHN0 cnVjdCBwYWdlICpwYWdlc1tdLCB1bnNpZ25lZCBucGFnZXMpCit7CisJc3RydWN0IGRtYV9wYWdl ICpkX3BhZ2UsICp0bXA7CisKKwlpZiAobnBhZ2VzICYmIHNldF9wYWdlc19hcnJheV93YihwYWdl cywgbnBhZ2VzKSkKKwkJcHJfZXJyKFRUTV9QRlggIiVzOiBGYWlsZWQgdG8gc2V0ICVkIHBhZ2Vz IHRvIHdiIVxuIiwKKwkJCXBvb2wtPmRldl9uYW1lLCBucGFnZXMpOworCisJaWYgKG5wYWdlcyA+ IDEpIHsKKwkJcHJfZGVidWcoIiVzOiAoJXM6JWQpIEZyZWVpbmcgJWQgcGFnZXMgYXQgb25jZSAo bG9ja2xlc3MpLlxuIiwKKwkJCXBvb2wtPmRldl9uYW1lLCBwb29sLT5uYW1lLCBjdXJyZW50LT5w aWQsIG5wYWdlcyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRfcGFnZSwgdG1w LCBkX3BhZ2VzLCBwYWdlX2xpc3QpIHsKKwkJbGlzdF9kZWwoJmRfcGFnZS0+cGFnZV9saXN0KTsK KwkJX190dG1fZG1hX2ZyZWVfcGFnZShwb29sLCBkX3BhZ2UpOworCX0KK30KKworLyoKKyAqIEZy ZWUgcGFnZXMgZnJvbSBwb29sLgorICoKKyAqIFRvIHByZXZlbnQgaG9nZ2luZyB0aGUgdHRtX3N3 YXAgcHJvY2VzcyB3ZSBvbmx5IGZyZWUgTlVNX1BBR0VTX1RPX0FMTE9DCisgKiBudW1iZXIgb2Yg cGFnZXMgaW4gb25lIGdvLgorICoKKyAqIEBwb29sOiB0byBmcmVlIHRoZSBwYWdlcyBmcm9tCisg KiBAbnJfZnJlZTogSWYgc2V0IHRvIHRydWUgd2lsbCBmcmVlIGFsbCBwYWdlcyBpbiBwb29sCisg KiovCitzdGF0aWMgdW5zaWduZWQgdHRtX2RtYV9wYWdlX3Bvb2xfZnJlZShzdHJ1Y3QgZG1hX3Bv b2wgKnBvb2wsIHVuc2lnbmVkIG5yX2ZyZWUpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7 CisJc3RydWN0IGRtYV9wYWdlICpkbWFfcCwgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzX3Rv X2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCBkX3BhZ2VzOworCXVuc2lnbmVkIGZyZWVkX3BhZ2Vz ID0gMCwKKwkJIG5wYWdlc190b19mcmVlID0gbnJfZnJlZTsKKworCWlmIChOVU1fUEFHRVNfVE9f QUxMT0MgPCBucl9mcmVlKQorCQlucGFnZXNfdG9fZnJlZSA9IE5VTV9QQUdFU19UT19BTExPQzsK KyNpZiAwCisJaWYgKG5yX2ZyZWUgPiAxKSB7CisJCXByX2RlYnVnKCIlczogKCVzOiVkKSBBdHRl bXB0aW5nIHRvIGZyZWUgJWQgKCVkKSBwYWdlc1xuIiwKKwkJCXBvb2wtPmRldl9uYW1lLCBwb29s LT5uYW1lLCBjdXJyZW50LT5waWQsCisJCQlucGFnZXNfdG9fZnJlZSwgbnJfZnJlZSk7CisJfQor I2VuZGlmCisJcGFnZXNfdG9fZnJlZSA9IGttYWxsb2MobnBhZ2VzX3RvX2ZyZWUgKiBzaXplb2Yo c3RydWN0IHBhZ2UgKiksCisJCQlHRlBfS0VSTkVMKTsKKworCWlmICghcGFnZXNfdG9fZnJlZSkg eworCQlwcl9lcnIoVFRNX1BGWAorCQkgICAgICAgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVt b3J5IGZvciBwb29sIGZyZWUgb3BlcmF0aW9uLlxuIiwKKwkJCXBvb2wtPmRldl9uYW1lKTsKKwkJ cmV0dXJuIDA7CisJfQorCUlOSVRfTElTVF9IRUFEKCZkX3BhZ2VzKTsKK3Jlc3RhcnQ6CisJc3Bp bl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7CisKKwkvKiBXZSBwaWNraW5n IHRoZSBvbGRlc3Qgb25lcyBvZmYgdGhlIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmVfcmV2ZXJzZShkbWFfcCwgdG1wLCAmcG9vbC0+ZnJlZV9saXN0LAorCQkJCQkgcGFnZV9saXN0 KSB7CisJCWlmIChmcmVlZF9wYWdlcyA+PSBucGFnZXNfdG9fZnJlZSkKKwkJCWJyZWFrOworCisJ CS8qIE1vdmUgdGhlIGRtYV9wYWdlIGZyb20gb25lIGxpc3QgdG8gYW5vdGhlci4gKi8KKwkJbGlz dF9tb3ZlKCZkbWFfcC0+cGFnZV9saXN0LCAmZF9wYWdlcyk7CisKKwkJcGFnZXNfdG9fZnJlZVtm cmVlZF9wYWdlcysrXSA9IGRtYV9wLT5wOworCQkvKiBXZSBjYW4gb25seSByZW1vdmUgTlVNX1BB R0VTX1RPX0FMTE9DIGF0IGEgdGltZS4gKi8KKwkJaWYgKGZyZWVkX3BhZ2VzID49IE5VTV9QQUdF U19UT19BTExPQykgeworCisJCQl0dG1fcG9vbF91cGRhdGVfZnJlZV9sb2NrZWQocG9vbCwgZnJl ZWRfcGFnZXMpOworCQkJLyoqCisJCQkgKiBCZWNhdXNlIGNoYW5naW5nIHBhZ2UgY2FjaGluZyBp cyBjb3N0bHkKKwkJCSAqIHdlIHVubG9jayB0aGUgcG9vbCB0byBwcmV2ZW50IHN0YWxsaW5nLgor CQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3Mp OworCisJCQl0dG1fZG1hX3BhZ2VzX3B1dChwb29sLCAmZF9wYWdlcywgcGFnZXNfdG9fZnJlZSwK KwkJCQkJICBmcmVlZF9wYWdlcyk7CisKKwkJCUlOSVRfTElTVF9IRUFEKCZkX3BhZ2VzKTsKKwor CQkJaWYgKGxpa2VseShucl9mcmVlICE9IEZSRUVfQUxMX1BBR0VTKSkKKwkJCQlucl9mcmVlIC09 IGZyZWVkX3BhZ2VzOworCisJCQlpZiAoTlVNX1BBR0VTX1RPX0FMTE9DID49IG5yX2ZyZWUpCisJ CQkJbnBhZ2VzX3RvX2ZyZWUgPSBucl9mcmVlOworCQkJZWxzZQorCQkJCW5wYWdlc190b19mcmVl ID0gTlVNX1BBR0VTX1RPX0FMTE9DOworCisJCQlmcmVlZF9wYWdlcyA9IDA7CisKKwkJCS8qIGZy ZWUgYWxsIHNvIHJlc3RhcnQgdGhlIHByb2Nlc3NpbmcgKi8KKwkJCWlmIChucl9mcmVlKQorCQkJ CWdvdG8gcmVzdGFydDsKKworCQkJLyogTm90IGFsbG93ZWQgdG8gZmFsbCB0aHJvdWdoIG9yIGJy ZWFrIGJlY2F1c2UKKwkJCSAqIGZvbGxvd2luZyBjb250ZXh0IGlzIGluc2lkZSBzcGlubG9jayB3 aGlsZSB3ZSBhcmUKKwkJCSAqIG91dHNpZGUgaGVyZS4KKwkJCSAqLworCQkJZ290byBvdXQ7CisK KwkJfQorCX0KKworCS8qIHJlbW92ZSByYW5nZSBvZiBwYWdlcyBmcm9tIHRoZSBwb29sICovCisJ aWYgKGZyZWVkX3BhZ2VzKSB7CisJCXR0bV9wb29sX3VwZGF0ZV9mcmVlX2xvY2tlZChwb29sLCBm cmVlZF9wYWdlcyk7CisJCW5yX2ZyZWUgLT0gZnJlZWRfcGFnZXM7CisJfQorCisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgaXJxX2ZsYWdzKTsKKworCWlmIChmcmVlZF9wYWdl cykKKwkJdHRtX2RtYV9wYWdlc19wdXQocG9vbCwgJmRfcGFnZXMsIHBhZ2VzX3RvX2ZyZWUsIGZy ZWVkX3BhZ2VzKTsKK291dDoKKwlrZnJlZShwYWdlc190b19mcmVlKTsKKwlyZXR1cm4gbnJfZnJl ZTsKK30KKworc3RhdGljIHZvaWQgdHRtX2RtYV9mcmVlX3Bvb2woc3RydWN0IGRldmljZSAqZGV2 LCBlbnVtIHBvb2xfdHlwZSB0eXBlKQoreworCXN0cnVjdCBkZXZpY2VfcG9vbHMgKnA7CisJc3Ry dWN0IGRtYV9wb29sICpwb29sOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKworCW11dGV4X2xv Y2soJl9tYW5hZ2VyLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocCwgJl9t YW5hZ2VyLT5wb29scywgcG9vbHMpIHsKKwkJaWYgKHAtPmRldiAhPSBkZXYpCisJCQljb250aW51 ZTsKKwkJcG9vbCA9IHAtPnBvb2w7CisJCWlmIChwb29sLT50eXBlICE9IHR5cGUpCisJCQljb250 aW51ZTsKKworCQlsaXN0X2RlbCgmcC0+cG9vbHMpOworCQlrZnJlZShwKTsKKwkJX21hbmFnZXIt Pm5wb29scy0tOworCQlicmVhazsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBv b2wsICZkZXYtPmRtYV9wb29scywgcG9vbHMpIHsKKwkJaWYgKHBvb2wtPnR5cGUgIT0gdHlwZSkK KwkJCWNvbnRpbnVlOworCQkvKiBUYWtlcyBhIHNwaW5sb2NrLi4gKi8KKwkJdHRtX2RtYV9wYWdl X3Bvb2xfZnJlZShwb29sLCBGUkVFX0FMTF9QQUdFUyk7CisJCVdBUk5fT04oKChwb29sLT5ucGFn ZXNfaW5fdXNlICsgcG9vbC0+bnBhZ2VzX2ZyZWUpICE9IDApKTsKKwkJLyogVGhpcyBjb2RlIHBh dGggaXMgY2FsbGVkIGFmdGVyIF9hbGxfIHJlZmVyZW5jZXMgdG8gdGhlCisJCSAqIHN0cnVjdCBk ZXZpY2UgaGFzIGJlZW4gZHJvcHBlZCAtIHNvIG5vYm9keSBzaG91bGQgYmUKKwkJICogdG91Y2hp bmcgaXQuIEluIGNhc2Ugc29tZWJvZHkgaXMgdHJ5aW5nIHRvIF9hZGRfIHdlIGFyZQorCQkgKiBn dWFyZGVkIGJ5IHRoZSBtdXRleC4gKi8KKwkJbGlzdF9kZWwoJnBvb2wtPnBvb2xzKTsKKwkJa2Zy ZWUocG9vbCk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJl9tYW5hZ2VyLT5sb2NrKTsK K30KKworLyoKKyAqIE9uIGZyZWUtaW5nIG9mIHRoZSAnc3RydWN0IGRldmljZScgdGhpcyBkZWNv bnN0cnVjdG9yIGlzIHJ1bi4KKyAqIEFsYmVpdCB0aGUgcG9vbCBtaWdodCBoYXZlIGFscmVhZHkg YmVlbiBmcmVlZCBlYXJsaWVyLgorICovCitzdGF0aWMgdm9pZCB0dG1fZG1hX3Bvb2xfcmVsZWFz ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBv b2wgPSAqKHN0cnVjdCBkbWFfcG9vbCAqKilyZXM7CisKKwlpZiAocG9vbCkKKwkJdHRtX2RtYV9m cmVlX3Bvb2woZGV2LCBwb29sLT50eXBlKTsKK30KKworc3RhdGljIGludCB0dG1fZG1hX3Bvb2xf bWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKm1hdGNoX2RhdGEpCit7 CisJcmV0dXJuICooc3RydWN0IGRtYV9wb29sICoqKXJlcyA9PSBtYXRjaF9kYXRhOworfQorCitz dGF0aWMgc3RydWN0IGRtYV9wb29sICp0dG1fZG1hX3Bvb2xfaW5pdChzdHJ1Y3QgZGV2aWNlICpk ZXYsIGdmcF90IGZsYWdzLAorCQkJCQkgIGVudW0gcG9vbF90eXBlIHR5cGUpCit7CisJY2hhciAq bltdID0geyJ3YyIsICJ1YyIsICJjYWNoZWQiLCAiIGRtYTMyIiwgInVua25vd24iLH07CisJZW51 bSBwb29sX3R5cGUgdFtdID0ge0lTX1dDLCBJU19VQywgSVNfQ0FDSEVELCBJU19ETUEzMiwgSVNf VU5ERUZJTkVEfTsKKwlzdHJ1Y3QgZGV2aWNlX3Bvb2xzICpzZWNfcG9vbCA9IE5VTEw7CisJc3Ry dWN0IGRtYV9wb29sICpwb29sID0gTlVMTCwgKipwdHI7CisJdW5zaWduZWQgaTsKKwlpbnQgcmV0 ID0gLUVOT0RFVjsKKwljaGFyICpwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJ cHRyID0gZGV2cmVzX2FsbG9jKHR0bV9kbWFfcG9vbF9yZWxlYXNlLCBzaXplb2YoKnB0ciksIEdG UF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IC1FTk9NRU07 CisKKwlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZG1hX3Bvb2wpLCBHRlBfS0VS TkVMLAorCQkJICAgIGRldl90b19ub2RlKGRldikpOworCWlmICghcG9vbCkKKwkJZ290byBlcnJf bWVtOworCisJc2VjX3Bvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBkZXZpY2VfcG9v bHMpLCBHRlBfS0VSTkVMLAorCQkJCWRldl90b19ub2RlKGRldikpOworCWlmICghc2VjX3Bvb2wp CisJCWdvdG8gZXJyX21lbTsKKworCUlOSVRfTElTVF9IRUFEKCZzZWNfcG9vbC0+cG9vbHMpOwor CXNlY19wb29sLT5kZXYgPSBkZXY7CisJc2VjX3Bvb2wtPnBvb2wgPSAgcG9vbDsKKworCUlOSVRf TElTVF9IRUFEKCZwb29sLT5mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwb29sLT5pbnVz ZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcG9vbC0+cG9vbHMpOworCXNwaW5fbG9ja19pbml0 KCZwb29sLT5sb2NrKTsKKwlwb29sLT5kZXYgPSBkZXY7CisJcG9vbC0+bnBhZ2VzX2ZyZWUgPSBw b29sLT5ucGFnZXNfaW5fdXNlID0gMDsKKwlwb29sLT5uZnJlZXMgPSAwOworCXBvb2wtPmdmcF9m bGFncyA9IGZsYWdzOworCXBvb2wtPnNpemUgPSBQQUdFX1NJWkU7CisJcG9vbC0+dHlwZSA9IHR5 cGU7CisJcG9vbC0+bnJlZmlsbHMgPSAwOworCXBvb2wtPmZpbGxfbG9jayA9IGZhbHNlOworCXAg PSBwb29sLT5uYW1lOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKHR5cGUgJiB0 W2ldKSB7CisJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihwb29sLT5uYW1lKSAtIChwIC0gcG9v bC0+bmFtZSksCisJCQkJICAgICAgIiVzIiwgbltpXSk7CisJCX0KKwl9CisJKnAgPSAwOworCS8q IFdlIGNvcHkgdGhlIG5hbWUgZm9yIHByXyBjYWxscyBiL2Mgd2hlbiBkbWFfcG9vbF9kZXN0cm95 IGlzIGNhbGxlZAorCSAqIC0gdGhlIGtvYmotPm5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWFsbG9j YXRlZC4qLworCXNucHJpbnRmKHBvb2wtPmRldl9uYW1lLCBzaXplb2YocG9vbC0+ZGV2X25hbWUp LCAiJXMgJXMiLAorCQkgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSwgZGV2X25hbWUoZGV2KSk7CisJ bXV0ZXhfbG9jaygmX21hbmFnZXItPmxvY2spOworCS8qIFlvdSBjYW4gZ2V0IHRoZSBkbWFfcG9v bCBmcm9tIGVpdGhlciB0aGUgZ2xvYmFsOiAqLworCWxpc3RfYWRkKCZzZWNfcG9vbC0+cG9vbHMs ICZfbWFuYWdlci0+cG9vbHMpOworCV9tYW5hZ2VyLT5ucG9vbHMrKzsKKwkvKiBvciBmcm9tICdz dHJ1Y3QgZGV2aWNlJzogKi8KKwlsaXN0X2FkZCgmcG9vbC0+cG9vbHMsICZkZXYtPmRtYV9wb29s cyk7CisJbXV0ZXhfdW5sb2NrKCZfbWFuYWdlci0+bG9jayk7CisKKwkqcHRyID0gcG9vbDsKKwlk ZXZyZXNfYWRkKGRldiwgcHRyKTsKKworCXJldHVybiBwb29sOworZXJyX21lbToKKwlkZXZyZXNf ZnJlZShwdHIpOworCWtmcmVlKHNlY19wb29sKTsKKwlrZnJlZShwb29sKTsKKwlyZXR1cm4gRVJS X1BUUihyZXQpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9wb29sICp0dG1fZG1hX2ZpbmRfcG9v bChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgZW51bSBwb29sX3R5cGUgdHlwZSkKK3sKKwlz dHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsICp0bXAsICpmb3VuZCA9IE5VTEw7CisKKwlpZiAodHlwZSA9 PSBJU19VTkRFRklORUQpCisJCXJldHVybiBmb3VuZDsKKworCS8qIE5COiBXZSBpdGVyYXRlIG9u IHRoZSAnc3RydWN0IGRldicgd2hpY2ggaGFzIG5vIHNwaW5sb2NrLCBidXQKKwkgKiBpdCBkb2Vz IGhhdmUgYSBrcmVmIHdoaWNoIHdlIGhhdmUgdGFrZW4uIFRoZSBrcmVmIGlzIHRha2VuIGR1cmlu ZworCSAqIGdyYXBoaWMgZHJpdmVyIGxvYWRpbmcgLSBpbiB0aGUgZHJtX3BjaV9pbml0IGl0IGNh bGxzIGVpdGhlcgorCSAqIHBjaV9kZXZfZ2V0IG9yIHBjaV9yZWdpc3Rlcl9kcml2ZXIgd2hpY2gg Ym90aCBlbmQgdXAgdGFraW5nIGEga3JlZgorCSAqIG9uICdzdHJ1Y3QgZGV2aWNlJy4KKwkgKgor CSAqIE9uIHRlYXJkb3duLCB0aGUgZ3JhcGhpYyBkcml2ZXJzIGVuZCB1cCBxdWllc2NpbmcgdGhl IFRUTSAocHV0X3BhZ2VzKQorCSAqIGFuZCBjYWxscyB0aGUgZGV2X3JlcyBkZWNvbnN0cnVjdG9y czogdHRtX2RtYV9wb29sX3JlbGVhc2UuIFRoZSBuaWNlCisJICogdGhpbmcgaXMgYXQgdGhhdCBw b2ludCBvZiB0aW1lIHRoZXJlIGFyZSBubyBwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisJICog ZHJpdmVyIHNvIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkLgorCSAqLworCWxpc3Rf Zm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCB0bXAsICZkZXYtPmRtYV9wb29scywgcG9vbHMpIHsK KwkJaWYgKHBvb2wtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQlmb3VuZCA9IHBvb2w7 CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qCisgKiBGcmVlIHBhZ2VzIHRo ZSBwYWdlcyB0aGF0IGZhaWxlZCB0byBjaGFuZ2UgdGhlIGNhY2hpbmcgc3RhdGUuIElmIHRoZXJl CisgKiBhcmUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQgdGhlaXIgY2FjaGluZyBzdGF0ZSBhbHJl YWR5IHB1dCB0aGVtIHRvIHRoZQorICogcG9vbC4KKyAqLworc3RhdGljIHZvaWQgdHRtX2RtYV9o YW5kbGVfY2FjaGluZ19zdGF0ZV9mYWlsdXJlKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwKKwkJCQkJ CSBzdHJ1Y3QgbGlzdF9oZWFkICpkX3BhZ2VzLAorCQkJCQkJIHN0cnVjdCBwYWdlICoqZmFpbGVk X3BhZ2VzLAorCQkJCQkJIHVuc2lnbmVkIGNwYWdlcykKK3sKKwlzdHJ1Y3QgZG1hX3BhZ2UgKmRf cGFnZSwgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcDsKKwl1bnNpZ25lZCBpID0gMDsKKworCXAgPSBm YWlsZWRfcGFnZXNbMF07CisJaWYgKCFwKQorCQlyZXR1cm47CisJLyogRmluZCB0aGUgZmFpbGVk IHBhZ2UuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRfcGFnZSwgdG1wLCBkX3BhZ2Vz LCBwYWdlX2xpc3QpIHsKKwkJaWYgKGRfcGFnZS0+cCAhPSBwKQorCQkJY29udGludWU7CisJCS8q IC4uIGFuZCB0aGVuIHByb2dyZXNzIG92ZXIgdGhlIGZ1bGwgbGlzdC4gKi8KKwkJbGlzdF9kZWwo JmRfcGFnZS0+cGFnZV9saXN0KTsKKwkJX190dG1fZG1hX2ZyZWVfcGFnZShwb29sLCBkX3BhZ2Up OworCQlpZiAoKytpIDwgY3BhZ2VzKQorCQkJcCA9IGZhaWxlZF9wYWdlc1tpXTsKKwkJZWxzZQor CQkJYnJlYWs7CisJfQorCit9CisKKy8qCisgKiBBbGxvY2F0ZSAnY291bnQnIHBhZ2VzLCBhbmQg cHV0ICduZWVkJyBudW1iZXIgb2YgdGhlbSBvbiB0aGUKKyAqICdwYWdlcycgYW5kIGFzIHdlbGwg b24gdGhlICdkbWFfYWRkcmVzcycgc3RhcnRpbmcgYXQgJ2RtYV9vZmZzZXQnIG9mZnNldC4KKyAq IFRoZSBmdWxsIGxpc3Qgb2YgcGFnZXMgc2hvdWxkIGFsc28gYmUgb24gJ2RfcGFnZXMnLgorICog V2UgcmV0dXJuIHplcm8gZm9yIHN1Y2Nlc3MsIGFuZCBuZWdhdGl2ZSBudW1iZXJzIGFzIGVycm9y cy4KKyAqLworc3RhdGljIGludCB0dG1fZG1hX3Bvb2xfYWxsb2NfbmV3X3BhZ2VzKHN0cnVjdCBk bWFfcG9vbCAqcG9vbCwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZF9wYWdlcywKKwkJCQkJdW5z aWduZWQgY291bnQpCit7CisJc3RydWN0IHBhZ2UgKipjYWNoaW5nX2FycmF5OworCXN0cnVjdCBk bWFfcGFnZSAqZG1hX3A7CisJc3RydWN0IHBhZ2UgKnA7CisJaW50IHIgPSAwOworCXVuc2lnbmVk IGksIGNwYWdlczsKKwl1bnNpZ25lZCBtYXhfY3BhZ2VzID0gbWluKGNvdW50LAorCQkJKHVuc2ln bmVkKShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBwYWdlICopKSk7CisKKwkvKiBhbGxvY2F0ZSBh cnJheSBmb3IgcGFnZSBjYWNoaW5nIGNoYW5nZSAqLworCWNhY2hpbmdfYXJyYXkgPSBrbWFsbG9j KG1heF9jcGFnZXMqc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKworCWlmICgh Y2FjaGluZ19hcnJheSkgeworCQlwcl9lcnIoVFRNX1BGWAorCQkgICAgICAgIiVzOiBVbmFibGUg dG8gYWxsb2NhdGUgdGFibGUgZm9yIG5ldyBwYWdlcy4iLAorCQkJcG9vbC0+ZGV2X25hbWUpOwor CQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY291bnQgPiAxKSB7CisJCXByX2RlYnVnKCIl czogKCVzOiVkKSBHZXR0aW5nICVkIHBhZ2VzXG4iLAorCQkJcG9vbC0+ZGV2X25hbWUsIHBvb2wt Pm5hbWUsIGN1cnJlbnQtPnBpZCwKKwkJCWNvdW50KTsKKwl9CisKKwlmb3IgKGkgPSAwLCBjcGFn ZXMgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQlkbWFfcCA9IF9fdHRtX2RtYV9hbGxvY19wYWdl KHBvb2wpOworCQlpZiAoIWRtYV9wKSB7CisJCQlwcl9lcnIoVFRNX1BGWCAiJXM6IFVuYWJsZSB0 byBnZXQgcGFnZSAldS5cbiIsCisJCQkJcG9vbC0+ZGV2X25hbWUsIGkpOworCisJCQkvKiBzdG9y ZSBhbHJlYWR5IGFsbG9jYXRlZCBwYWdlcyBpbiB0aGUgcG9vbCBhZnRlcgorCQkJICogc2V0dGlu ZyB0aGUgY2FjaGluZyBzdGF0ZSAqLworCQkJaWYgKGNwYWdlcykgeworCQkJCXIgPSB0dG1fc2V0 X3BhZ2VzX2NhY2hpbmcocG9vbCwgY2FjaGluZ19hcnJheSwKKwkJCQkJCQkgIGNwYWdlcyk7CisJ CQkJaWYgKHIpCisJCQkJCXR0bV9kbWFfaGFuZGxlX2NhY2hpbmdfc3RhdGVfZmFpbHVyZSgKKwkJ CQkJCXBvb2wsIGRfcGFnZXMsIGNhY2hpbmdfYXJyYXksCisJCQkJCQljcGFnZXMpOworCQkJfQor CQkJciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlwID0gZG1hX3AtPnA7CisjaWZk ZWYgQ09ORklHX0hJR0hNRU0KKwkJLyogZ2ZwIGZsYWdzIG9mIGhpZ2htZW0gcGFnZSBzaG91bGQg bmV2ZXIgYmUgZG1hMzIgc28gd2UKKwkJICogd2Ugc2hvdWxkIGJlIGZpbmUgaW4gc3VjaCBjYXNl CisJCSAqLworCQlpZiAoIVBhZ2VIaWdoTWVtKHApKQorI2VuZGlmCisJCXsKKwkJCWNhY2hpbmdf YXJyYXlbY3BhZ2VzKytdID0gcDsKKwkJCWlmIChjcGFnZXMgPT0gbWF4X2NwYWdlcykgeworCQkJ CS8qIE5vdGU6IENhbm5vdCBob2xkIHRoZSBzcGlubG9jayAqLworCQkJCXIgPSB0dG1fc2V0X3Bh Z2VzX2NhY2hpbmcocG9vbCwgY2FjaGluZ19hcnJheSwKKwkJCQkJCSBjcGFnZXMpOworCQkJCWlm IChyKSB7CisJCQkJCXR0bV9kbWFfaGFuZGxlX2NhY2hpbmdfc3RhdGVfZmFpbHVyZSgKKwkJCQkJ CXBvb2wsIGRfcGFnZXMsIGNhY2hpbmdfYXJyYXksCisJCQkJCQljcGFnZXMpOworCQkJCQlnb3Rv IG91dDsKKwkJCQl9CisJCQkJY3BhZ2VzID0gMDsKKwkJCX0KKwkJfQorCQlsaXN0X2FkZCgmZG1h X3AtPnBhZ2VfbGlzdCwgZF9wYWdlcyk7CisJfQorCisJaWYgKGNwYWdlcykgeworCQlyID0gdHRt X3NldF9wYWdlc19jYWNoaW5nKHBvb2wsIGNhY2hpbmdfYXJyYXksIGNwYWdlcyk7CisJCWlmIChy KQorCQkJdHRtX2RtYV9oYW5kbGVfY2FjaGluZ19zdGF0ZV9mYWlsdXJlKHBvb2wsIGRfcGFnZXMs CisJCQkJCWNhY2hpbmdfYXJyYXksIGNwYWdlcyk7CisJfQorb3V0OgorCWtmcmVlKGNhY2hpbmdf YXJyYXkpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHR0bV9kbWFfY2hlY2tfYWxsb2Nf bGlzdChzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7CisJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2U7CisJ dW5zaWduZWQgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRfcGFnZSwgJnR0bS0+YWxs b2NfbGlzdCwgcGFnZV9saXN0KSB7CisJCWlmIChkX3BhZ2UtPnAgIT0gdHRtLT5wYWdlc1tpKytd KSB7CisJCQlwcl9lcnIoVFRNX1BGWCAiZG1hIHBhZ2UgbGlzdCAmIGFycmF5IG1pc21hdGNoICVk IiwgaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoK KyAqIEByZXR1cm4gY291bnQgb2YgcGFnZXMgc3RpbGwgcmVxdWlyZWQgdG8gZnVsZmlsbCB0aGUg cmVxdWVzdC4KKyovCitzdGF0aWMgaW50IHR0bV9kbWFfcGFnZV9wb29sX2ZpbGxfbG9ja2VkKHN0 cnVjdCBkbWFfcG9vbCAqcG9vbCwKKwkJCQkJIHVuc2lnbmVkIGNvdW50LAorCQkJCQkgdW5zaWdu ZWQgbG9uZyAqaXJxX2ZsYWdzKQoreworCWludCByID0gY291bnQ7CisKKwlpZiAocG9vbC0+Zmls bF9sb2NrKQorCQlyZXR1cm4gcjsKKworCXBvb2wtPmZpbGxfbG9jayA9IHRydWU7CisJaWYgKGNv dW50IDwgX21hbmFnZXItPm9wdGlvbnMuc21hbGwgJiYKKwkgICAgY291bnQgPiBwb29sLT5ucGFn ZXNfZnJlZSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkIGRfcGFnZXM7CisJCXVuc2lnbmVkIGFsbG9j X3NpemUgPSAgX21hbmFnZXItPm9wdGlvbnMuYWxsb2Nfc2l6ZTsKKworCQlJTklUX0xJU1RfSEVB RCgmZF9wYWdlcyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgKmly cV9mbGFncyk7CisKKwkJLyogUmV0dXJucyBob3cgbWFueSBtb3JlIGFyZSBuZWNjZXNzYXJ5IHRv IGZ1bGZpbGwgdGhlCisJCSAqIHJlcXVlc3QuICovCisJCXIgPSB0dG1fZG1hX3Bvb2xfYWxsb2Nf bmV3X3BhZ2VzKHBvb2wsICZkX3BhZ2VzLCBhbGxvY19zaXplKTsKKworCQlzcGluX2xvY2tfaXJx c2F2ZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7CisJCWlmICghcikgeworCQkJLyogQWRkIHRo ZSBmcmVzaCB0byB0aGUgZW5kLi4gKi8KKwkJCWxpc3Rfc3BsaWNlKCZkX3BhZ2VzLCAmcG9vbC0+ ZnJlZV9saXN0KTsKKwkJCSsrcG9vbC0+bnJlZmlsbHM7CisJCQlwb29sLT5ucGFnZXNfZnJlZSAr PSBhbGxvY19zaXplOworCQl9IGVsc2UgeworCQkJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2U7CisJ CQl1bnNpZ25lZCBjcGFnZXMgPSAwOworCisJCQlwcl9lcnIoVFRNX1BGWCAiJXM6IEZhaWxlZCB0 byBmaWxsICVzIHBvb2wgKHI6JWQpIVxuIiwKKwkJCQlwb29sLT5kZXZfbmFtZSwgcG9vbC0+bmFt ZSwgcik7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZF9wYWdlLCAmZF9wYWdlcywgcGFnZV9s aXN0KSB7CisJCQkJY3BhZ2VzKys7CisJCQl9CisJCQlsaXN0X3NwbGljZV90YWlsKCZkX3BhZ2Vz LCAmcG9vbC0+ZnJlZV9saXN0KTsKKwkJCXBvb2wtPm5wYWdlc19mcmVlICs9IGNwYWdlczsKKwkJ fQorCX0KKwlwb29sLT5maWxsX2xvY2sgPSBmYWxzZTsKKwlyZXR1cm4gcjsKKworfQorCisvKgor ICogQHJldHVybiBjb3VudCBvZiBwYWdlcyBzdGlsbCByZXF1aXJlZCB0byBmdWxmaWxsIHRoZSBy ZXF1ZXN0LgorICogVGhlIHBvcHVsYXRlIGxpc3QgaXMgYWN0dWFsbHkgYSBzdGFjayAobm90IHRo YXQgaXMgbWF0dGVycyBhcyBUVE0KKyAqIGFsbG9jYXRlcyBvbmUgcGFnZSBhdCBhIHRpbWUuCisg Ki8KK3N0YXRpYyBpbnQgdHRtX2RtYV9wb29sX2dldF9wYWdlcyhzdHJ1Y3QgZG1hX3Bvb2wgKnBv b2wsCisJCQkJICBzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7CisJc3RydWN0IGRtYV9wYWdlICpkX3Bh Z2UsICp0bXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgaSwgY291bnQg PSB0dG0tPm51bV9wYWdlczsKKwlpbnQgcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5s b2NrLCBpcnFfZmxhZ3MpOworCXIgPSB0dG1fZG1hX3BhZ2VfcG9vbF9maWxsX2xvY2tlZChwb29s LCBjb3VudCwgJmlycV9mbGFncyk7CisJaWYgKHIgPCAwKSB7CisJCXByX2RlYnVnKCIlczogKCVz OiVkKSBBc2tlZCBmb3IgJWQsIGdvdCAlZCAlcy5cbiIsCisJCQlwb29sLT5kZXZfbmFtZSwgcG9v bC0+bmFtZSwgY3VycmVudC0+cGlkLCBjb3VudCwgciwKKwkJCShyIDwgMCkgPyAiZXJyOiIgOiAi cGFnZXMiKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghcG9vbC0+bnBhZ2VzX2ZyZWUpCisJCWdv dG8gb3V0OworCWlmIChjb3VudCA+IDEpIHsKKwkJcHJfZGVidWcoIiVzOiAoJXM6JWQpIExvb2tp bmcgaW4gZnJlZSBsaXN0IGZvciAlZCBwYWdlcy4gIlwKKwkJCSAiKGhhdmUgJWQgcGFnZXMgZnJl ZSlcbiIsCisJCQkgcG9vbC0+ZGV2X25hbWUsIHBvb2wtPm5hbWUsIGN1cnJlbnQtPnBpZCwgY291 bnQsCisJCQkgcG9vbC0+bnBhZ2VzX2ZyZWUpOworCX0KKwlpID0gMDsKKwkvKiBXZSBhcmUgaG9s ZGluZyB0aGUgc3BpbmxvY2suLiAqLworCS8qIE5vdGU6IFRoZSAgdGhlICdwYWdlcycgKGFuZCBp bnVzZV9saXN0KSBpcyBleHBlY3RlZCB0byBiZSBhIHN0YWNrLAorCSAqIHNvIHdlIHB1dCB0aGUg ZW50cmllcyBpbiB0aGUgcmlnaHQgb3JkZXIgKGFuZCBvbiB0aGUgaW51c2UgbGlzdAorCSAqIGlu IHRoZSByZXZlcnNlIG9yZGVyIHRvIGNvbXBlbnN0YXRlIGZvciBmcmVlaW5nIC0gd2hpY2ggaW52 ZXJ0cyB0aGUKKwkgKiAncGFnZXMnIG9yZGVyKS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoZF9wYWdlLCB0bXAsICZwb29sLT5mcmVlX2xpc3QsIHBhZ2VfbGlzdCkgeworCQl0dG0t PnBhZ2VzW2ldID0gZF9wYWdlLT5wOworCQl0dG0tPmRtYV9hZGRyZXNzW2ldID0gZF9wYWdlLT5k bWE7CisJCWkrKzsKKwkJbGlzdF9tb3ZlX3RhaWwoJmRfcGFnZS0+cGFnZV9saXN0LCAmdHRtLT5h bGxvY19saXN0KTsKKwkJaWYgKGkgPT0gY291bnQpCisJCQlicmVhazsKKwl9CisJY291bnQgLT0g aTsKKwlwb29sLT5ucGFnZXNfaW5fdXNlICs9IGk7CisJcG9vbC0+bnBhZ2VzX2ZyZWUgLT0gaTsK K291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOwor CWlmIChjb3VudCkKKwkJcHJfZGVidWcoIiVzOiAoJXM6JWQpIE5lZWQgJWQgbW9yZS5cbiIsCisJ CQlwb29sLT5kZXZfbmFtZSwgcG9vbC0+bmFtZSwgY3VycmVudC0+cGlkLCBjb3VudCk7CisJcmV0 dXJuIGNvdW50OworfQorCisvKgorICogT24gc3VjY2VzcyBwYWdlcyBsaXN0IHdpbGwgaG9sZCBj b3VudCBudW1iZXIgb2YgY29ycmVjdGx5CisgKiBjYWNoZWQgcGFnZXMuIE9uIGZhaWx1cmUgd2ls bCBob2xkIHRoZSBuZWdhdGl2ZSByZXR1cm4gdmFsdWUgKC1FTk9NRU0sIGV0YykuCisgKi8KK2lu dCB0dG1fZG1hX3BvcHVsYXRlKHN0cnVjdCB0dG1fdHQgKnR0bSwgc3RydWN0IGRldmljZSAqZGV2 KQoreworCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKKwlnZnBfdCBnZnBfZmxhZ3M7CisJZW51bSBw b29sX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpOworCWludCByOworCisJdHlwZSA9IHR0bV90b190 eXBlKHR0bS0+cGFnZV9mbGFncywgdHRtLT5jYWNoaW5nX3N0YXRlKTsKKworCWlmICh0dG0tPnBh Z2VfZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX0RNQTMyKQorCQlnZnBfZmxhZ3MgPSBHRlBfVVNFUiB8 IEdGUF9ETUEzMjsKKwllbHNlCisJCWdmcF9mbGFncyA9IEdGUF9ISUdIVVNFUjsKKworCWlmICh0 dG0tPnBhZ2VfZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX1pFUk9fQUxMT0MpCisJCWdmcF9mbGFncyB8 PSBfX0dGUF9aRVJPOworCisJcG9vbCA9IHR0bV9kbWFfZmluZF9wb29sKGRldiwgdHlwZSk7CisJ aWYgKCFwb29sKSB7CisJCXBvb2wgPSB0dG1fZG1hX3Bvb2xfaW5pdChkZXYsIGdmcF9mbGFncywg dHlwZSk7CisJCWlmIChJU19FUlJfT1JfTlVMTChwb29sKSkKKwkJCXJldHVybiAtRU5PTUVNOwor CX0KKworCS8qID8/IHdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sgc2VlIGlmIHBhZ2VzIGFyZSBhbHJl YWR5CisJICogYWxsb2NlZCwgZm9yIHRoZSBtb21lbnQganVzdCB0cnVzdCB0aGUgY2FsbGVyCisJ ICovCisJSU5JVF9MSVNUX0hFQUQoJnR0bS0+YWxsb2NfbGlzdCk7CisJLyogVGFrZSBwYWdlcyBv dXQgb2YgYSBwb29sIChpZiBhcHBsaWNhYmxlKSAqLworCXIgPSB0dG1fZG1hX3Bvb2xfZ2V0X3Bh Z2VzKHBvb2wsIHR0bSk7CisJLyogY2xlYXIgdGhlIHBhZ2VzIGNvbWluZyBmcm9tIHRoZSBwb29s IGlmIHJlcXVlc3RlZCAqLworCWlmICh0dG0tPnBhZ2VfZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX1pF Uk9fQUxMT0MpIHsKKwkJZm9yIChpID0gMDsgaSA8ICh0dG0tPm51bV9wYWdlcyAtIHIpOyBpKysp IHsKKwkJCWNsZWFyX3BhZ2UocGFnZV9hZGRyZXNzKHR0bS0+cGFnZXNbaV0pKTsKKwkJfQorCX0K KwkvKiBJZiBwb29sIGRpZG4ndCBoYXZlIGVub3VnaCBwYWdlcyBhbGxvY2F0ZSBuZXcgb25lLiAq LworCWlmIChyID4gMCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkIGRfcGFnZXM7CisJCXVuc2lnbmVk IGxvbmcgaXJxX2ZsYWdzOworCQl1bnNpZ25lZCBwYWdlc19uZWVkID0gcjsKKworCQlJTklUX0xJ U1RfSEVBRCgmZF9wYWdlcyk7CisJCWkgPSB0dG0tPm51bV9wYWdlcyAtIHBhZ2VzX25lZWQ7CisK KwkJLyogTm90ZSwgd2UgYXJlIHJ1bm5pbmcgd2l0aG91dCBsb2NraW5nIGhlcmUuLgorCQkgKiBh bmQgd2UgaGF2ZSB0byBtYW51YWxseSBhZGQgdGhlIHN0YWNrIHRvIHRoZSBpbnVzZSBwb29sLiAq LworCQlyID0gdHRtX2RtYV9wb29sX2FsbG9jX25ld19wYWdlcyhwb29sLCAmZF9wYWdlcywgcGFn ZXNfbmVlZCk7CisKKwkJaWYgKHIgPT0gMCkgeworCQkJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2U7 CisKKwkJCS8qIFNpbmNlIHRoZSBwYWdlcyBhcmUgZGlyZWN0bHkgZ29pbmcgdG8gdGhlIGludXNl X2xpc3QKKwkJCSAqIHdoaWNoIGlzIHN0YWNrIGJhc2VkLCBsZXRzIHRyZWF0IGl0IGFzIGEgc3Rh Y2suCisJCQkgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZF9wYWdlLCAmZF9wYWdlcywgcGFn ZV9saXN0KSB7CisJCQkJdHRtLT5wYWdlc1tpXSA9IGRfcGFnZS0+cDsKKwkJCQl0dG0tPmRtYV9h ZGRyZXNzW2ldID0gZF9wYWdlLT5kbWE7CisJCQkJaSsrOworCQkJfQorCQkJbGlzdF9zcGxpY2Vf dGFpbCgmZF9wYWdlcywgJnR0bS0+YWxsb2NfbGlzdCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZl KCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCQkJcG9vbC0+bnBhZ2VzX2luX3VzZSArPSBwYWdl c19uZWVkOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgaXJxX2ZsYWdz KTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkbWFfcGFnZSAqZF9wYWdlOworCQkJdW5zaWduZWQg Y3BhZ2VzID0gMDsKKworCQkJLyogSWYgdGhlcmUgaXMgYW55IHBhZ2VzIGluIHRoZSBsaXN0IHB1 dCB0aGVtIGJhY2sgdG8KKwkJCSAqIHRoZSBwb29sLiAqLworCQkJcHJfZXJyKFRUTV9QRlgKKwkJ CSAgICAgICAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBleHRyYSBwYWdlcyAiCisJCQkgICAgICAg ImZvciBsYXJnZSByZXF1ZXN0LiIsCisJCQkJcG9vbC0+ZGV2X25hbWUpOworCisJCQlsaXN0X2Zv cl9lYWNoX2VudHJ5KGRfcGFnZSwgJmRfcGFnZXMsIHBhZ2VfbGlzdCkgeworCQkJCWNwYWdlcysr OworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7CisJ CQlwb29sLT5ucGFnZXNfZnJlZSArPSBjcGFnZXM7CisJCQkvKiBXZSBkb24ndCBjYXJlIGFib3V0 IG9yZGVyaW5nIG9uIHRoZSBmcmVlX2xpc3QuICovCisJCQlsaXN0X3NwbGljZSgmZF9wYWdlcywg JnBvb2wtPmZyZWVfbGlzdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2Nr LCBpcnFfZmxhZ3MpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9 CitFWFBPUlRfU1lNQk9MX0dQTCh0dG1fZG1hX3BvcHVsYXRlKTsKKworLyogR2V0IGdvb2QgZXN0 aW1hdGlvbiBob3cgbWFueSBwYWdlcyBhcmUgZnJlZSBpbiBwb29scyAqLworc3RhdGljIGludCB0 dG1fZG1hX3Bvb2xfZ2V0X251bV91bnVzZWRfcGFnZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNl X3Bvb2xzICpwOworCXVuc2lnbmVkIHRvdGFsID0gMDsKKworCW11dGV4X2xvY2soJl9tYW5hZ2Vy LT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZfbWFuYWdlci0+cG9vbHMsIHBvb2xz KSB7CisJCWlmIChwKQorCQkJdG90YWwgKz0gcC0+cG9vbC0+bnBhZ2VzX2ZyZWU7CisJfQorCW11 dGV4X3VubG9jaygmX21hbmFnZXItPmxvY2spOworCXJldHVybiB0b3RhbDsKK30KKworLyogUHV0 IGFsbCBwYWdlcyBpbiBwYWdlcyBsaXN0IHRvIGNvcnJlY3QgcG9vbCB0byB3YWl0IGZvciByZXVz ZSAqLwordm9pZCB0dG1fZG1hX3VucG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1Y3Qg ZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9wb29sICpwb29sOworCWVudW0gcG9vbF90eXBl IHR5cGU7CisJYm9vbCBpc19jYWNoZWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBjb3VudCA9IDAsIGk7 CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwl0eXBlID0gdHRtX3RvX3R5cGUodHRtLT5w YWdlX2ZsYWdzLCB0dG0tPmNhY2hpbmdfc3RhdGUpOworCXBvb2wgPSB0dG1fZG1hX2ZpbmRfcG9v bChkZXYsIHR5cGUpOworCWlmICghcG9vbCkgeworCQlXQVJOX09OKCFwb29sKTsKKwkJcmV0dXJu OworCX0KKwlpc19jYWNoZWQgPSAodHRtX2RtYV9maW5kX3Bvb2wocG9vbC0+ZGV2LAorCQkgICAg IHR0bV90b190eXBlKHR0bS0+cGFnZV9mbGFncywgdHRfY2FjaGVkKSkgPT0gcG9vbCk7CisKKwlp ZiAodHRtLT5udW1fcGFnZXMgPiAxKSB7CisJCWRldl9kYmcocG9vbC0+ZGV2LCAiKCVzOiVkKSBB dHRlbXB0aW5nIHRvICVzICVsZCBwYWdlcy5cbiIsCisJCQlwb29sLT5uYW1lLCBjdXJyZW50LT5w aWQsCisJCQkoaXNfY2FjaGVkKSA/ICAiZGVzdHJveSIgOiAicmVjeWNsZSIsIHR0bS0+bnVtX3Bh Z2VzKTsKKwl9CisKKwkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIHNob3VsZCB3ZSBwYW5p YyBoZXJlID8qLworCWlmICh0dG1fZG1hX2NoZWNrX2FsbG9jX2xpc3QodHRtKSkgeworCQlwcl9l cnIoVFRNX1BGWCAiQ291bGQgbm90IGZyZWUgdGhlIG90aGVyIHR0bSB0dCBwYWdlcyAlbGQhXG4i LAorCQkgICAgIHR0bS0+bnVtX3BhZ2VzKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19p cnFzYXZlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCWNvdW50ID0gMDsKKwlwb29sLT5ucGFn ZXNfaW5fdXNlIC09IHR0bS0+bnVtX3BhZ2VzOworCWlmIChpc19jYWNoZWQpIHsKKwkJcG9vbC0+ bmZyZWVzICs9IHR0bS0+bnVtX3BhZ2VzOworCX0gZWxzZSB7CisJCXBvb2wtPm5wYWdlc19mcmVl ICs9IHR0bS0+bnVtX3BhZ2VzOworCQlsaXN0X3NwbGljZSgmdHRtLT5hbGxvY19saXN0LCAmcG9v bC0+ZnJlZV9saXN0KTsKKwkJaWYgKHBvb2wtPm5wYWdlc19mcmVlID4gX21hbmFnZXItPm9wdGlv bnMubWF4X3NpemUpIHsKKwkJCWNvdW50ID0gcG9vbC0+bnBhZ2VzX2ZyZWUgLSBfbWFuYWdlci0+ b3B0aW9ucy5tYXhfc2l6ZTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29s LT5sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKGlzX2NhY2hlZCkgeworCQl0dG1fZG1hX3BhZ2Vz X3B1dChwb29sLCAmdHRtLT5hbGxvY19saXN0LAorCQkJCSAgdHRtLT5wYWdlcywgdHRtLT5udW1f cGFnZXMpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZ0dG0tPmFsbG9jX2xpc3QpOworCWZvciAo aSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKSB7CisJCXR0bS0+cGFnZXNbaV0gPSBOVUxM OworCQl0dG0tPmRtYV9hZGRyZXNzW2ldID0gMDsKKwl9CisKKwkvKiBzaHJpbmsgcG9vbCBpZiBu ZWNlc3NhcnkgKi8KKwlpZiAoY291bnQpCisJCXR0bV9kbWFfcGFnZV9wb29sX2ZyZWUocG9vbCwg Y291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHRtX2RtYV91bnBvcHVsYXRlKTsKKworLyoq CisgKiBDYWxsYmFjayBmb3IgbW0gdG8gcmVxdWVzdCBwb29sIHRvIHJlZHVjZSBudW1iZXIgb2Yg cGFnZSBoZWxkLgorICovCitzdGF0aWMgaW50IHR0bV9kbWFfcG9vbF9tbV9zaHJpbmsoc3RydWN0 IHNocmlua2VyICpzaHJpbmssCisJCQkJICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQorewor CXN0YXRpYyBhdG9taWNfdCBzdGFydF9wb29sID0gQVRPTUlDX0lOSVQoMCk7CisJdW5zaWduZWQg aWR4ID0gMDsKKwl1bnNpZ25lZCBwb29sX29mZnNldCA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZz dGFydF9wb29sKTsKKwl1bnNpZ25lZCBzaHJpbmtfcGFnZXMgPSBzYy0+bnJfdG9fc2NhbjsKKwlz dHJ1Y3QgZGV2aWNlX3Bvb2xzICpwOworCisJaWYgKGxpc3RfZW1wdHkoJl9tYW5hZ2VyLT5wb29s cykpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmX21hbmFnZXItPmxvY2spOworCXBvb2xf b2Zmc2V0ID0gcG9vbF9vZmZzZXQgJSBfbWFuYWdlci0+bnBvb2xzOworCWxpc3RfZm9yX2VhY2hf ZW50cnkocCwgJl9tYW5hZ2VyLT5wb29scywgcG9vbHMpIHsKKwkJdW5zaWduZWQgbnJfZnJlZTsK KworCQlpZiAoIXAgJiYgIXAtPmRldikKKwkJCWNvbnRpbnVlOworCQlpZiAoc2hyaW5rX3BhZ2Vz ID09IDApCisJCQlicmVhazsKKwkJLyogRG8gaXQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi4gKi8K KwkJaWYgKCsraWR4IDwgcG9vbF9vZmZzZXQpCisJCQljb250aW51ZTsKKwkJbnJfZnJlZSA9IHNo cmlua19wYWdlczsKKwkJc2hyaW5rX3BhZ2VzID0gdHRtX2RtYV9wYWdlX3Bvb2xfZnJlZShwLT5w b29sLCBucl9mcmVlKTsKKwkJcHJfZGVidWcoIiVzOiAoJXM6JWQpIEFza2VkIHRvIHNocmluayAl ZCwgaGF2ZSAlZCBtb3JlIHRvIGdvXG4iLAorCQkJcC0+cG9vbC0+ZGV2X25hbWUsIHAtPnBvb2wt Pm5hbWUsIGN1cnJlbnQtPnBpZCwgbnJfZnJlZSwKKwkJCXNocmlua19wYWdlcyk7CisJfQorCW11 dGV4X3VubG9jaygmX21hbmFnZXItPmxvY2spOworCS8qIHJldHVybiBlc3RpbWF0ZWQgbnVtYmVy IG9mIHVudXNlZCBwYWdlcyBpbiBwb29sICovCisJcmV0dXJuIHR0bV9kbWFfcG9vbF9nZXRfbnVt X3VudXNlZF9wYWdlcygpOworfQorCitzdGF0aWMgdm9pZCB0dG1fZG1hX3Bvb2xfbW1fc2hyaW5r X2luaXQoc3RydWN0IHR0bV9wb29sX21hbmFnZXIgKm1hbmFnZXIpCit7CisJbWFuYWdlci0+bW1f c2hyaW5rLnNocmluayA9ICZ0dG1fZG1hX3Bvb2xfbW1fc2hyaW5rOworCW1hbmFnZXItPm1tX3No cmluay5zZWVrcyA9IDE7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJm1hbmFnZXItPm1tX3Nocmluayk7 Cit9CisKK3N0YXRpYyB2b2lkIHR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfZmluaShzdHJ1Y3QgdHRt X3Bvb2xfbWFuYWdlciAqbWFuYWdlcikKK3sKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZtYW5hZ2Vy LT5tbV9zaHJpbmspOworfQorCitpbnQgdHRtX2RtYV9wYWdlX2FsbG9jX2luaXQoc3RydWN0IHR0 bV9tZW1fZ2xvYmFsICpnbG9iLCB1bnNpZ25lZCBtYXhfcGFnZXMpCit7CisJaW50IHJldCA9IC1F Tk9NRU07CisKKwlXQVJOX09OKF9tYW5hZ2VyKTsKKworCXByaW50ayhLRVJOX0lORk8gVFRNX1BG WCAiSW5pdGlhbGl6aW5nIERNQSBwb29sIGFsbG9jYXRvci5cbiIpOworCisJX21hbmFnZXIgPSBr emFsbG9jKHNpemVvZigqX21hbmFnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIV9tYW5hZ2VyKQor CQlnb3RvIGVycl9tYW5hZ2VyOworCisJbXV0ZXhfaW5pdCgmX21hbmFnZXItPmxvY2spOworCUlO SVRfTElTVF9IRUFEKCZfbWFuYWdlci0+cG9vbHMpOworCisJX21hbmFnZXItPm9wdGlvbnMubWF4 X3NpemUgPSBtYXhfcGFnZXM7CisJX21hbmFnZXItPm9wdGlvbnMuc21hbGwgPSBTTUFMTF9BTExP Q0FUSU9OOworCV9tYW5hZ2VyLT5vcHRpb25zLmFsbG9jX3NpemUgPSBOVU1fUEFHRVNfVE9fQUxM T0M7CisKKwkvKiBUaGlzIHRha2VzIGNhcmUgb2YgYXV0by1mcmVlaW5nIHRoZSBfbWFuYWdlciAq LworCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZfbWFuYWdlci0+a29iaiwgJnR0bV9wb29s X2tvYmpfdHlwZSwKKwkJCQkgICAmZ2xvYi0+a29iaiwgImRtYV9wb29sIik7CisJaWYgKHVubGlr ZWx5KHJldCAhPSAwKSkgeworCQlrb2JqZWN0X3B1dCgmX21hbmFnZXItPmtvYmopOworCQlnb3Rv IGVycjsKKwl9CisJdHRtX2RtYV9wb29sX21tX3Nocmlua19pbml0KF9tYW5hZ2VyKTsKKwlyZXR1 cm4gMDsKK2Vycl9tYW5hZ2VyOgorCWtmcmVlKF9tYW5hZ2VyKTsKKwlfbWFuYWdlciA9IE5VTEw7 CitlcnI6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB0dG1fZG1hX3BhZ2VfYWxsb2NfZmluaSh2 b2lkKQoreworCXN0cnVjdCBkZXZpY2VfcG9vbHMgKnAsICp0OworCisJcHJpbnRrKEtFUk5fSU5G TyBUVE1fUEZYICJGaW5hbGl6aW5nIERNQSBwb29sIGFsbG9jYXRvci5cbiIpOworCXR0bV9kbWFf cG9vbF9tbV9zaHJpbmtfZmluaShfbWFuYWdlcik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmVfcmV2ZXJzZShwLCB0LCAmX21hbmFnZXItPnBvb2xzLCBwb29scykgeworCQlkZXZfZGJnKHAt PmRldiwgIiglczolZCkgRnJlZWluZy5cbiIsIHAtPnBvb2wtPm5hbWUsCisJCQljdXJyZW50LT5w aWQpOworCQlXQVJOX09OKGRldnJlc19kZXN0cm95KHAtPmRldiwgdHRtX2RtYV9wb29sX3JlbGVh c2UsCisJCQl0dG1fZG1hX3Bvb2xfbWF0Y2gsIHAtPnBvb2wpKTsKKwkJdHRtX2RtYV9mcmVlX3Bv b2wocC0+ZGV2LCBwLT5wb29sLT50eXBlKTsKKwl9CisJa29iamVjdF9wdXQoJl9tYW5hZ2VyLT5r b2JqKTsKKwlfbWFuYWdlciA9IE5VTEw7Cit9CisKK2ludCB0dG1fZG1hX3BhZ2VfYWxsb2NfZGVi dWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZV9w b29scyAqcDsKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSBOVUxMOworCWNoYXIgKmhbXSA9IHsi cG9vbCIsICJyZWZpbGxzIiwgInBhZ2VzIGZyZWVkIiwgImludXNlIiwgImF2YWlsYWJsZSIsCisJ CSAgICAgIm5hbWUiLCAidmlydCIsICJidXNhZGRyIn07CisKKwlpZiAoIV9tYW5hZ2VyKSB7CisJ CXNlcV9wcmludGYobSwgIk5vIHBvb2wgYWxsb2NhdG9yIHJ1bm5pbmcuXG4iKTsKKwkJcmV0dXJu IDA7CisJfQorCXNlcV9wcmludGYobSwgIiUxM3MgJTEycyAlMTNzICU4cyAlOHMgJThzXG4iLAor CQkgICBoWzBdLCBoWzFdLCBoWzJdLCBoWzNdLCBoWzRdLCBoWzVdKTsKKwltdXRleF9sb2NrKCZf bWFuYWdlci0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmX21hbmFnZXItPnBvb2xz LCBwb29scykgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwLT5kZXY7CisJCWlmICghZGV2KQor CQkJY29udGludWU7CisJCXBvb2wgPSBwLT5wb29sOworCQlzZXFfcHJpbnRmKG0sICIlMTNzICUx MmxkICUxM2xkICU4ZCAlOGQgJThzXG4iLAorCQkJCXBvb2wtPm5hbWUsIHBvb2wtPm5yZWZpbGxz LAorCQkJCXBvb2wtPm5mcmVlcywgcG9vbC0+bnBhZ2VzX2luX3VzZSwKKwkJCQlwb29sLT5ucGFn ZXNfZnJlZSwKKwkJCQlwb29sLT5kZXZfbmFtZSk7CisJfQorCW11dGV4X3VubG9jaygmX21hbmFn ZXItPmxvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHRtX2RtYV9wYWdl X2FsbG9jX2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2 ZXIuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKaW5kZXggYWUwNmU0Mi4uYmVl ZjlhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaAorKysgYi9p bmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCkBAIC0xMDQsNiArMTA0LDcgQEAgZW51bSB0 dG1fY2FjaGluZ19zdGF0ZSB7CiAgKiBAY2FjaGluZ19zdGF0ZTogVGhlIGN1cnJlbnQgY2FjaGlu ZyBzdGF0ZSBvZiB0aGUgcGFnZXMuCiAgKiBAc3RhdGU6IFRoZSBjdXJyZW50IGJpbmRpbmcgc3Rh dGUgb2YgdGhlIHBhZ2VzLgogICogQGRtYV9hZGRyZXNzOiBUaGUgRE1BIChidXMpIGFkZHJlc3Nl cyBvZiB0aGUgcGFnZXMgKGlmIFRUTV9QQUdFX0ZMQUdfRE1BMzIpCisgKiBAYWxsb2NfbGlzdDog dXNlZCBieSBzb21lIHBhZ2UgYWxsb2NhdGlvbiBiYWNrZW5kCiAgKgogICogVGhpcyBpcyBhIHN0 cnVjdHVyZSBob2xkaW5nIHRoZSBwYWdlcywgY2FjaGluZy0gYW5kIGFwZXJ0dXJlIGJpbmRpbmcK ICAqIHN0YXR1cyBmb3IgYSBidWZmZXIgb2JqZWN0IHRoYXQgaXNuJ3QgYmFja2VkIGJ5IGZpeGVk IChWUkFNIC8gQUdQKQpAQCAtMTI3LDYgKzEyOCw3IEBAIHN0cnVjdCB0dG1fdHQgewogCQl0dF91 bnBvcHVsYXRlZCwKIAl9IHN0YXRlOwogCWRtYV9hZGRyX3QgKmRtYV9hZGRyZXNzOworCXN0cnVj dCBsaXN0X2hlYWQgYWxsb2NfbGlzdDsKIH07CiAKICNkZWZpbmUgVFRNX01FTVRZUEVfRkxBR19G SVhFRCAgICAgICAgICgxIDw8IDApCS8qIEZpeGVkIChvbi1jYXJkKSBQQ0kgbWVtb3J5ICovCmRp ZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuaCBiL2luY2x1ZGUvZHJt L3R0bS90dG1fcGFnZV9hbGxvYy5oCmluZGV4IDE4YTJkNmIuLmYxMjc2MzUgMTAwNjQ0Ci0tLSBh L2luY2x1ZGUvZHJtL3R0bS90dG1fcGFnZV9hbGxvYy5oCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90 dG1fcGFnZV9hbGxvYy5oCkBAIC04OCw0ICs4OCw0MCBAQCBleHRlcm4gdm9pZCB0dG1fcGFnZV9h bGxvY190dG1fdHRfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0dG0pOwogICogT3V0cHV0IHRo ZSBzdGF0ZSBvZiBwb29scyB0byBkZWJ1Z2ZzIGZpbGUKICAqLwogZXh0ZXJuIGludCB0dG1fcGFn ZV9hbGxvY19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSk7CisKKworI2lm ZGVmIENPTkZJR19TV0lPVExCCisvKioKKyAqIEluaXRpYWxpemUgcG9vbCBhbGxvY2F0b3IuCisg Ki8KK2ludCB0dG1fZG1hX3BhZ2VfYWxsb2NfaW5pdChzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKmds b2IsIHVuc2lnbmVkIG1heF9wYWdlcyk7CisKKy8qKgorICogRnJlZSBwb29sIGFsbG9jYXRvci4K KyAqLwordm9pZCB0dG1fZG1hX3BhZ2VfYWxsb2NfZmluaSh2b2lkKTsKKworLyoqCisgKiBPdXRw dXQgdGhlIHN0YXRlIG9mIHBvb2xzIHRvIGRlYnVnZnMgZmlsZQorICovCitleHRlcm4gaW50IHR0 bV9kbWFfcGFnZV9hbGxvY19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSk7 CisKK2ludCB0dG1fZG1hX3BvcHVsYXRlKHN0cnVjdCB0dG1fdHQgKnR0bSwgc3RydWN0IGRldmlj ZSAqZGV2KTsKK2V4dGVybiB2b2lkIHR0bV9kbWFfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0 dG0sIHN0cnVjdCBkZXZpY2UgKmRldik7CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB0dG1f ZG1hX3BhZ2VfYWxsb2NfaW5pdChzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKmdsb2IsCisJCQkJCSAg dW5zaWduZWQgbWF4X3BhZ2VzKQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgdHRtX2RtYV9wYWdlX2FsbG9jX2Zpbmkodm9pZCkgeyByZXR1cm47IH0KKworc3Rh dGljIGlubGluZSBpbnQgdHRtX2RtYV9wYWdlX2FsbG9jX2RlYnVnZnMoc3RydWN0IHNlcV9maWxl ICptLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNlbmRpZgotLSAK MS43LjcuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK