From mboxrd@z Thu Jan 1 00:00:00 1970 From: j.glisse@gmail.com Subject: [PATCH 10/13] ttm: Provide DMA aware TTM page pool code. V5 Date: Wed, 9 Nov 2011 15:22:27 -0500 Message-ID: <1320870150-23151-11-git-send-email-j.glisse@gmail.com> References: <1320870150-23151-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-qy0-f177.google.com (mail-qy0-f177.google.com [209.85.216.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 5D27EA0ACA for ; Wed, 9 Nov 2011 12:18:49 -0800 (PST) Received: by mail-qy0-f177.google.com with SMTP id 10so2066826qyk.15 for ; Wed, 09 Nov 2011 12:18:49 -0800 (PST) In-Reply-To: <1320870150-23151-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 ZWJhc2Ugb24gdG9wIG9mIHR0bV90dCAmIHR0bV9iYWNrZW5kIG1lcmdlXQpbdjU6IHJlYmFzZSBv biB0b3Agb2YgdHRtIG1lbW9yeSBhY2NvdW50aW5nIG92ZXJoYXVsXQpSZXZpZXdlZC1ieTogSmVy b21lIEdsaXNzZSA8amdsaXNzZUByZWRoYXQuY29tPgpTaWduZWQtb2ZmLWJ5OiBLb25yYWQgUnpl c3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJt L3R0bS9NYWtlZmlsZSAgICAgICAgICAgICB8ICAgIDQgKwogZHJpdmVycy9ncHUvZHJtL3R0bS90 dG1fbWVtb3J5LmMgICAgICAgICB8ICAgIDIgKwogZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFn ZV9hbGxvY19kbWEuYyB8IDEyMzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBpbmNs dWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oICAgICAgICAgIHwgICAgMiArCiBpbmNsdWRlL2Ry bS90dG0vdHRtX3BhZ2VfYWxsb2MuaCAgICAgICAgIHwgICAzNiArCiA1IGZpbGVzIGNoYW5nZWQs IDEyNzkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jX2RtYS5jCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90dG0vTWFrZWZpbGUK aW5kZXggZjNjZjZmMC4uYjJiMzNkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS9N YWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL01ha2VmaWxlCkBAIC03LDQgKzcsOCBA QCB0dG0teSA6PSB0dG1fYWdwX2JhY2tlbmQubyB0dG1fbWVtb3J5Lm8gdHRtX3R0Lm8gdHRtX2Jv Lm8gXAogCXR0bV9vYmplY3QubyB0dG1fbG9jay5vIHR0bV9leGVjYnVmX3V0aWwubyB0dG1fcGFn ZV9hbGxvYy5vIFwKIAl0dG1fYm9fbWFuYWdlci5vCiAKK2lmZXEgKCQoQ09ORklHX1NXSU9UTEIp LHkpCit0dG0teSArPSB0dG1fcGFnZV9hbGxvY19kbWEubworZW5kaWYKKwogb2JqLSQoQ09ORklH X0RSTV9UVE0pICs9IHR0bS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9t ZW1vcnkuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCmluZGV4IDk4ZjY4OTku LjNiMTJmMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCisr KyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCkBAIC0yNTgsNiArMjU4LDcgQEAg aW50IHR0bV9tZW1fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iKQogCWds b2ItPnN3YXBfbGltaXQgPSBnbG9iLT5tYXhfbWVtIC0gKGdsb2ItPm1lbSA+PiAzKTsKIAlnbG9i LT5zd2FwX2RtYTMyX2xpbWl0ID0gKCgxVUxMIDw8IDMyKSA+PiAxKSAtICgoKDFVTEwgPDwgMzIp ID4+IDMpKTsKIAl0dG1fcGFnZV9hbGxvY19pbml0KGdsb2IsIGdsb2ItPm1heF9tZW0vKDIqUEFH RV9TSVpFKSk7CisJdHRtX2RtYV9wYWdlX2FsbG9jX2luaXQoZ2xvYiwgZ2xvYi0+bWF4X21lbS8o MipQQUdFX1NJWkUpKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodHRtX21lbV9nbG9i YWxfaW5pdCk7CkBAIC0yNjYsNiArMjY3LDcgQEAgdm9pZCB0dG1fbWVtX2dsb2JhbF9yZWxlYXNl KHN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqZ2xvYikKIHsKIAkvKiBsZXQgdGhlIHBhZ2UgYWxsb2Nh dG9yIGZpcnN0IHN0b3AgdGhlIHNocmluayB3b3JrLiAqLwogCXR0bV9wYWdlX2FsbG9jX2Zpbmko KTsKKwl0dG1fZG1hX3BhZ2VfYWxsb2NfZmluaSgpOwogCiAJZmx1c2hfd29ya3F1ZXVlKGdsb2It PnN3YXBfcXVldWUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGdsb2ItPnN3YXBfcXVldWUpOwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFnZV9hbGxvY19kbWEuYyBiL2RyaXZl cnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2NfZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uMDg1MDgzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS90dG0vdHRtX3BhZ2VfYWxsb2NfZG1hLmMKQEAgLTAsMCArMSwxMjM1IEBACisvKgorICogQ29w eXJpZ2h0IDIwMTEgKGMpIE9yYWNsZSBDb3JwLgorCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwK KyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICog bmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1Mg SU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxr b25yYWQud2lsa0BvcmFjbGUuY29tPgorICovCisKKy8qCisgKiBBIHNpbXBsZSBETUEgcG9vbCBs b3NlbHkgYmFzZWQgb24gZG1hcG9vbC5jLiBJdCBoYXMgY2VydGFpbiBhZHZhbnRhZ2VzCisgKiBv dmVyIHRoZSBETUEgcG9vbHM6CisgKiAtIFBvb2wgY29sbGVjdHMgcmVzZW50bHkgZnJlZWQgcGFn ZXMgZm9yIHJldXNlIChhbmQgaG9va3MgdXAgdG8KKyAqICAgdGhlIHNocmlua2VyKS4KKyAqIC0g VHJhY2tzIGN1cnJlbnRseSBpbiB1c2UgcGFnZXMKKyAqIC0gVHJhY2tzIHdoZXRoZXIgdGhlIHBh Z2UgaXMgVUMsIFdCIG9yIGNhY2hlZCAoYW5kIHJldmVydHMgdG8gV0IKKyAqICAgd2hlbiBmcmVl ZCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGlu dXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+IC8qIGZvciBzZXFfcHJpbnRm ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+ CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+ CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNs dWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRl IDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSAidHRtL3R0bV9ib19kcml2ZXIuaCIKKyNpbmNs dWRlICJ0dG0vdHRtX3BhZ2VfYWxsb2MuaCIKKyNpZmRlZiBUVE1fSEFTX0FHUAorI2luY2x1ZGUg PGFzbS9hZ3AuaD4KKyNlbmRpZgorCisjZGVmaW5lIE5VTV9QQUdFU19UT19BTExPQwkJKFBBR0Vf U0laRS9zaXplb2Yoc3RydWN0IHBhZ2UgKikpCisjZGVmaW5lIFNNQUxMX0FMTE9DQVRJT04JCTE2 CisjZGVmaW5lIEZSRUVfQUxMX1BBR0VTCQkJKH4wVSkKKy8qIHRpbWVzIGFyZSBpbiBtc2VjcyAq LworI2RlZmluZSBJU19VTkRFRklORUQJCQkoMCkKKyNkZWZpbmUgSVNfV0MJCQkJKDE8PDEpCisj ZGVmaW5lIElTX1VDCQkJCSgxPDwyKQorI2RlZmluZSBJU19DQUNIRUQJCQkoMTw8MykKKyNkZWZp bmUgSVNfRE1BMzIJCQkoMTw8NCkKKworZW51bSBwb29sX3R5cGUgeworCVBPT0xfSVNfVU5ERUZJ TkVELAorCVBPT0xfSVNfV0MgPSBJU19XQywKKwlQT09MX0lTX1VDID0gSVNfVUMsCisJUE9PTF9J U19DQUNIRUQgPSBJU19DQUNIRUQsCisJUE9PTF9JU19XQ19ETUEzMiA9IElTX1dDIHwgSVNfRE1B MzIsCisJUE9PTF9JU19VQ19ETUEzMiA9IElTX1VDIHwgSVNfRE1BMzIsCisJUE9PTF9JU19DQUNI RURfRE1BMzIgPSBJU19DQUNIRUQgfCBJU19ETUEzMiwKK307CisvKgorICogVGhlIHBvb2wgc3Ry dWN0dXJlLiBUaGVyZSBhcmUgdXN1YWxseSBzaXggcG9vbHM6CisgKiAgLSBnZW5lcmljIChub3Qg cmVzdHJpY3RlZCB0byBETUEzMik6CisgKiAgICAgIC0gd3JpdGUgY29tYmluZWQsIHVuY2FjaGVk LCBjYWNoZWQuCisgKiAgLSBkbWEzMiAodXAgdG8gMl4zMiAtIHNvIHVwIDRHQik6CisgKiAgICAg IC0gd3JpdGUgY29tYmluZWQsIHVuY2FjaGVkLCBjYWNoZWQuCisgKiBmb3IgZWFjaCAnc3RydWN0 IGRldmljZScuIFRoZSAnY2FjaGVkJyBpcyBmb3IgcGFnZXMgdGhhdCBhcmUgYWN0aXZlbHkgdXNl ZC4KKyAqIFRoZSBvdGhlciBvbmVzIGNhbiBiZSBzaHJ1bmsgYnkgdGhlIHNocmlua2VyIEFQSSBp ZiBuZWNjZXNzYXJ5LgorICogQHBvb2xzOiBUaGUgJ3N0cnVjdCBkZXZpY2UtPmRtYV9wb29scycg bGluay4KKyAqIEB0eXBlOiBUeXBlIG9mIHRoZSBwb29sCisgKiBAbG9jazogUHJvdGVjdHMgdGhl IGludXNlX2xpc3QgYW5kIGZyZWVfbGlzdCBmcm9tIGNvbmN1cnJuZXQgYWNjZXNzLiBNdXN0IGJl CisgKiB1c2VkIHdpdGggaXJxc2F2ZS9pcnFyZXN0b3JlIHZhcmlhbnRzIGJlY2F1c2UgcG9vbCBh bGxvY2F0b3IgbWF5YmUgY2FsbGVkCisgKiBmcm9tIGRlbGF5ZWQgd29yay4KKyAqIEBpbnVzZV9s aXN0OiBQb29sIG9mIHBhZ2VzIHRoYXQgYXJlIGluIHVzZS4gVGhlIG9yZGVyIGlzIHZlcnkgaW1w b3J0YW50IGFuZAorICogICBpdCBpcyBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgVFRNIHBhZ2VzIHRo YXQgYXJlIHB1dCBiYWNrIGFyZSBpbi4KKyAqIEBmcmVlX2xpc3Q6IFBvb2wgb2YgcGFnZXMgdGhh dCBhcmUgZnJlZSB0byBiZSB1c2VkLiBObyBvcmRlciByZXF1aXJlbWVudHMuCisgKiBAZGV2OiBU aGUgZGV2aWNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIHBvb2xzLgorICogQHNpemU6 IFNpemUgdXNlZCBkdXJpbmcgRE1BIGFsbG9jYXRpb24uCisgKiBAbnBhZ2VzX2ZyZWU6IENvdW50 IG9mIGF2YWlsYWJsZSBwYWdlcyBmb3IgcmUtdXNlLgorICogQG5wYWdlc19pbl91c2U6IENvdW50 IG9mIHBhZ2VzIHRoYXQgYXJlIGluIHVzZS4KKyAqIEBuZnJlZXM6IFN0YXRzIHdoZW4gcG9vbCBp cyBzaHJpbmtpbmcuCisgKiBAbnJlZmlsbHM6IFN0YXRzIHdoZW4gdGhlIHBvb2wgaXMgZ3Jvd24u CisgKiBAZ2ZwX2ZsYWdzOiBGbGFncyB0byBwYXNzIGZvciBhbGxvY19wYWdlLgorICogQGZpbGxf bG9jazogQWxsb3dzIG9ubHkgb25lIHBvb2wgZmlsbCBvcGVyYXRpb24gYXQgdGltZS4KKyAqIEBu YW1lOiBOYW1lIG9mIHRoZSBwb29sLgorICogQGRldl9uYW1lOiBOYW1lIGRlcmlldmVkIGZyb20g ZGV2IC0gc2ltaWxhciB0byBob3cgZGV2X2luZm8gd29ya3MuCisgKiAgIFVzZWQgZHVyaW5nIHNo dXRkb3duIGFzIHRoZSBkZXZfaW5mbyBkdXJpbmcgcmVsZWFzZSBpcyB1bmF2YWlsYWJsZS4KKyAq Lworc3RydWN0IGRtYV9wb29sIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvb2xzOyAvKiBUaGUgJ3N0 cnVjdCBkZXZpY2UtPmRtYV9wb29scyBsaW5rICovCisJZW51bSBwb29sX3R5cGUgdHlwZTsKKwlz cGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBpbnVzZV9saXN0OworCXN0cnVjdCBs aXN0X2hlYWQgZnJlZV9saXN0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBzaXpl OworCXVuc2lnbmVkIG5wYWdlc19mcmVlOworCXVuc2lnbmVkIG5wYWdlc19pbl91c2U7CisJdW5z aWduZWQgbG9uZyBuZnJlZXM7IC8qIFN0YXRzIHdoZW4gc2hydW5rLiAqLworCXVuc2lnbmVkIGxv bmcgbnJlZmlsbHM7IC8qIFN0YXRzIHdoZW4gZ3Jvd24uICovCisJZ2ZwX3QgZ2ZwX2ZsYWdzOwor CWJvb2wgZmlsbF9sb2NrOworCWNoYXIgbmFtZVsxM107IC8qICJjYWNoZWQgZG1hMzIiICovCisJ Y2hhciBkZXZfbmFtZVs2NF07IC8qIENvbnN0cnVjdGVkIGZyb20gZGV2ICovCit9OworCisvKgor ICogVGhlIGFjY291bnRpbmcgcGFnZSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBhbGxvY2F0ZWQgcGFn ZSBhbG9uZyB3aXRoCisgKiB0aGUgRE1BIGFkZHJlc3MuCisgKiBAcGFnZV9saXN0OiBUaGUgbGlu ayB0byB0aGUgJ3BhZ2VfbGlzdCcgaW4gJ3N0cnVjdCBkbWFfcG9vbCcuCisgKiBAdmFkZHI6IFRo ZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHBhZ2UKKyAqIEBkbWE6IFRoZSBidXMgYWRkcmVzcyBv ZiB0aGUgcGFnZS4gSWYgdGhlIHBhZ2UgaXMgbm90IGFsbG9jYXRlZAorICogICB2aWEgdGhlIERN QSBBUEksIGl0IHdpbGwgYmUgLTEuCisgKi8KK3N0cnVjdCBkbWFfcGFnZSB7CisJc3RydWN0IGxp c3RfaGVhZCBwYWdlX2xpc3Q7CisJdm9pZCAqdmFkZHI7CisJc3RydWN0IHBhZ2UgKnA7CisJZG1h X2FkZHJfdCBkbWE7Cit9OworCisvKgorICogTGltaXRzIGZvciB0aGUgcG9vbC4gVGhleSBhcmUg aGFuZGxlZCB3aXRob3V0IGxvY2tzIGJlY2F1c2Ugb25seSBwbGFjZSB3aGVyZQorICogdGhleSBt YXkgY2hhbmdlIGlzIGluIHN5c2ZzIHN0b3JlLiBUaGV5IHdvbid0IGhhdmUgaW1tZWRpYXRlIGVm ZmVjdCBhbnl3YXkKKyAqIHNvIGZvcmNpbmcgc2VyaWFsaXphdGlvbiB0byBhY2Nlc3MgdGhlbSBp cyBwb2ludGxlc3MuCisgKi8KKworc3RydWN0IHR0bV9wb29sX29wdHMgeworCXVuc2lnbmVkCWFs bG9jX3NpemU7CisJdW5zaWduZWQJbWF4X3NpemU7CisJdW5zaWduZWQJc21hbGw7Cit9OworCisv KgorICogQ29udGFpbnMgdGhlIGxpc3Qgb2YgYWxsIG9mIHRoZSAnc3RydWN0IGRldmljZScgYW5k IHRoZWlyIGNvcnJlc3BvbmRpbmcKKyAqIERNQSBwb29scy4gR3VhcmRlZCBieSBfbXV0ZXgtPmxv Y2suCisgKiBAcG9vbHM6IFRoZSBsaW5rIHRvICdzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlci0+cG9v bHMnCisgKiBAZGV2OiBUaGUgJ3N0cnVjdCBkZXZpY2UnIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ3Bv b2wnCisgKiBAcG9vbDogVGhlICdzdHJ1Y3QgZG1hX3Bvb2wnIGFzc29jaWF0ZWQgd2l0aCB0aGUg J2RldicKKyAqLworc3RydWN0IGRldmljZV9wb29scyB7CisJc3RydWN0IGxpc3RfaGVhZCBwb29s czsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRtYV9wb29sICpwb29sOworfTsKKwor LyoKKyAqIHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyIC0gSG9sZHMgbWVtb3J5IHBvb2xzIGZvciBm YXN0IGFsbG9jYXRpb24KKyAqCisgKiBAbG9jazogTG9jayB1c2VkIHdoZW4gYWRkaW5nL3JlbW92 aW5nIGZyb20gcG9vbHMKKyAqIEBwb29sczogTGlzdCBvZiAnc3RydWN0IGRldmljZScgYW5kICdz dHJ1Y3QgZG1hX3Bvb2wnIHR1cGxlcy4KKyAqIEBvcHRpb25zOiBMaW1pdHMgZm9yIHRoZSBwb29s LgorICogQG5wb29sczogVG90YWwgYW1vdW50IG9mIHBvb2xzIGluIGV4aXN0ZW5jZS4KKyAqIEBz aHJpbmtlcjogVGhlIHN0cnVjdHVyZSB1c2VkIGJ5IFt1bnxdcmVnaXN0ZXJfc2hyaW5rZXIKKyAq Lworc3RydWN0IHR0bV9wb29sX21hbmFnZXIgeworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1 Y3QgbGlzdF9oZWFkCXBvb2xzOworCXN0cnVjdCB0dG1fcG9vbF9vcHRzCW9wdGlvbnM7CisJdW5z aWduZWQJCW5wb29sczsKKwlzdHJ1Y3Qgc2hyaW5rZXIJCW1tX3NocmluazsKKwlzdHJ1Y3Qga29i amVjdAkJa29iajsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqX21hbmFn ZXI7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlIHR0bV9wYWdlX3Bvb2xfbWF4ID0geworCS5u YW1lID0gInBvb2xfbWF4X3NpemUiLAorCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IKK307Citz dGF0aWMgc3RydWN0IGF0dHJpYnV0ZSB0dG1fcGFnZV9wb29sX3NtYWxsID0geworCS5uYW1lID0g InBvb2xfc21hbGxfYWxsb2NhdGlvbiIsCisJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUgorfTsK K3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlIHR0bV9wYWdlX3Bvb2xfYWxsb2Nfc2l6ZSA9IHsKKwku bmFtZSA9ICJwb29sX2FsbG9jYXRpb25fc2l6ZSIsCisJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VT UgorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnR0bV9wb29sX2F0dHJzW10gPSB7CisJ JnR0bV9wYWdlX3Bvb2xfbWF4LAorCSZ0dG1fcGFnZV9wb29sX3NtYWxsLAorCSZ0dG1fcGFnZV9w b29sX2FsbG9jX3NpemUsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgdHRtX3Bvb2xfa29ial9y ZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCB0dG1fcG9vbF9tYW5hZ2Vy ICptID0KKwkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyLCBrb2Jq KTsKKwlrZnJlZShtKTsKK30KKworc3RhdGljIHNzaXplX3QgdHRtX3Bvb2xfc3RvcmUoc3RydWN0 IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBj aGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyICpt ID0KKwkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyLCBrb2JqKTsK KwlpbnQgY2hhcnM7CisJdW5zaWduZWQgdmFsOworCWNoYXJzID0gc3NjYW5mKGJ1ZmZlciwgIiV1 IiwgJnZhbCk7CisJaWYgKGNoYXJzID09IDApCisJCXJldHVybiBzaXplOworCisJLyogQ29udmVy dCBrYiB0byBudW1iZXIgb2YgcGFnZXMgKi8KKwl2YWwgPSB2YWwgLyAoUEFHRV9TSVpFID4+IDEw KTsKKworCWlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX21heCkKKwkJbS0+b3B0aW9ucy5tYXhf c2l6ZSA9IHZhbDsKKwllbHNlIGlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX3NtYWxsKQorCQlt LT5vcHRpb25zLnNtYWxsID0gdmFsOworCWVsc2UgaWYgKGF0dHIgPT0gJnR0bV9wYWdlX3Bvb2xf YWxsb2Nfc2l6ZSkgeworCQlpZiAodmFsID4gTlVNX1BBR0VTX1RPX0FMTE9DKjgpIHsKKwkJCXBy aW50ayhLRVJOX0VSUiBUVE1fUEZYCisJCQkgICAgICAgIlNldHRpbmcgYWxsb2NhdGlvbiBzaXpl IHRvICVsdSAiCisJCQkgICAgICAgImlzIG5vdCBhbGxvd2VkLiBSZWNvbW1lbmRlZCBzaXplIGlz ICIKKwkJCSAgICAgICAiJWx1XG4iLAorCQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFH RV9TSVpFID4+IDcpLAorCQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9TSVpFID4+ IDEwKSk7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfSBlbHNlIGlmICh2YWwgPiBOVU1fUEFHRVNfVE9f QUxMT0MpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgVFRNX1BGWAorCQkJICAgICAgICJTZXR0 aW5nIGFsbG9jYXRpb24gc2l6ZSB0byAiCisJCQkgICAgICAgImxhcmdlciB0aGFuICVsdSBpcyBu b3QgcmVjb21tZW5kZWQuXG4iLAorCQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9T SVpFID4+IDEwKSk7CisJCX0KKwkJbS0+b3B0aW9ucy5hbGxvY19zaXplID0gdmFsOworCX0KKwor CXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCB0dG1fcG9vbF9zaG93KHN0cnVjdCBr b2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWZm ZXIpCit7CisJc3RydWN0IHR0bV9wb29sX21hbmFnZXIgKm0gPQorCQljb250YWluZXJfb2Yoa29i aiwgc3RydWN0IHR0bV9wb29sX21hbmFnZXIsIGtvYmopOworCXVuc2lnbmVkIHZhbCA9IDA7CisK KwlpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9vbF9tYXgpCisJCXZhbCA9IG0tPm9wdGlvbnMubWF4 X3NpemU7CisJZWxzZSBpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9vbF9zbWFsbCkKKwkJdmFsID0g bS0+b3B0aW9ucy5zbWFsbDsKKwllbHNlIGlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX2FsbG9j X3NpemUpCisJCXZhbCA9IG0tPm9wdGlvbnMuYWxsb2Nfc2l6ZTsKKworCXZhbCA9IHZhbCAqIChQ QUdFX1NJWkUgPj4gMTApOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAi JXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHR0bV9wb29s X3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9ICZ0dG1fcG9vbF9zaG93LAorCS5zdG9yZSA9ICZ0dG1f cG9vbF9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHR0bV9wb29sX2tvYmpf dHlwZSA9IHsKKwkucmVsZWFzZSA9ICZ0dG1fcG9vbF9rb2JqX3JlbGVhc2UsCisJLnN5c2ZzX29w cyA9ICZ0dG1fcG9vbF9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSB0dG1fcG9vbF9hdHRy cywKK307CisKKyNpZm5kZWYgQ09ORklHX1g4Ngorc3RhdGljIGludCBzZXRfcGFnZXNfYXJyYXlf d2Ioc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGFkZHJpbmFycmF5KQoreworI2lmZGVmIFRUTV9I QVNfQUdQCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRkcmluYXJyYXk7IGkrKykKKwkJ dW5tYXBfcGFnZV9mcm9tX2FncChwYWdlc1tpXSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBzZXRfcGFnZXNfYXJyYXlfd2Moc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGFk ZHJpbmFycmF5KQoreworI2lmZGVmIFRUTV9IQVNfQUdQCisJaW50IGk7CisKKwlmb3IgKGkgPSAw OyBpIDwgYWRkcmluYXJyYXk7IGkrKykKKwkJbWFwX3BhZ2VfaW50b19hZ3AocGFnZXNbaV0pOwor I2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3BhZ2VzX2FycmF5X3VjKHN0 cnVjdCBwYWdlICoqcGFnZXMsIGludCBhZGRyaW5hcnJheSkKK3sKKyNpZmRlZiBUVE1fSEFTX0FH UAorCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkZHJpbmFycmF5OyBpKyspCisJCW1hcF9w YWdlX2ludG9fYWdwKHBhZ2VzW2ldKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorI2VuZGlmIC8q IGZvciAhQ09ORklHX1g4NiAqLworCitzdGF0aWMgaW50IHR0bV9zZXRfcGFnZXNfY2FjaGluZyhz dHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsCisJCQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVk IGNwYWdlcykKK3sKKwlpbnQgciA9IDA7CisJLyogU2V0IHBhZ2UgY2FjaGluZyAqLworCWlmIChw b29sLT50eXBlICYgSVNfVUMpIHsKKwkJciA9IHNldF9wYWdlc19hcnJheV91YyhwYWdlcywgY3Bh Z2VzKTsKKwkJaWYgKHIpCisJCQlwcl9lcnIoVFRNX1BGWAorCQkJICAgICAgICIlczogRmFpbGVk IHRvIHNldCAlZCBwYWdlcyB0byB1YyFcbiIsCisJCQkgICAgICAgcG9vbC0+ZGV2X25hbWUsIGNw YWdlcyk7CisJfQorCWlmIChwb29sLT50eXBlICYgSVNfV0MpIHsKKwkJciA9IHNldF9wYWdlc19h cnJheV93YyhwYWdlcywgY3BhZ2VzKTsKKwkJaWYgKHIpCisJCQlwcl9lcnIoVFRNX1BGWAorCQkJ ICAgICAgICIlczogRmFpbGVkIHRvIHNldCAlZCBwYWdlcyB0byB3YyFcbiIsCisJCQkgICAgICAg cG9vbC0+ZGV2X25hbWUsIGNwYWdlcyk7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdm9p ZCBfX3R0bV9kbWFfZnJlZV9wYWdlKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwgc3RydWN0IGRtYV9w YWdlICpkX3BhZ2UpCit7CisJZG1hX2FkZHJfdCBkbWEgPSBkX3BhZ2UtPmRtYTsKKwlkbWFfZnJl ZV9jb2hlcmVudChwb29sLT5kZXYsIHBvb2wtPnNpemUsIGRfcGFnZS0+dmFkZHIsIGRtYSk7CisK KwlrZnJlZShkX3BhZ2UpOworCWRfcGFnZSA9IE5VTEw7Cit9CitzdGF0aWMgc3RydWN0IGRtYV9w YWdlICpfX3R0bV9kbWFfYWxsb2NfcGFnZShzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wpCit7CisJc3Ry dWN0IGRtYV9wYWdlICpkX3BhZ2U7CisKKwlkX3BhZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qg ZG1hX3BhZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRfcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisK KwlkX3BhZ2UtPnZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHBvb2wtPmRldiwgcG9vbC0+c2l6 ZSwKKwkJCQkJICAgJmRfcGFnZS0+ZG1hLAorCQkJCQkgICBwb29sLT5nZnBfZmxhZ3MpOworCWlm IChkX3BhZ2UtPnZhZGRyKQorCQlkX3BhZ2UtPnAgPSB2aXJ0X3RvX3BhZ2UoZF9wYWdlLT52YWRk cik7CisJZWxzZSB7CisJCWtmcmVlKGRfcGFnZSk7CisJCWRfcGFnZSA9IE5VTEw7CisJfQorCXJl dHVybiBkX3BhZ2U7Cit9CitzdGF0aWMgZW51bSBwb29sX3R5cGUgdHRtX3RvX3R5cGUoaW50IGZs YWdzLCBlbnVtIHR0bV9jYWNoaW5nX3N0YXRlIGNzdGF0ZSkKK3sKKwllbnVtIHBvb2xfdHlwZSB0 eXBlID0gSVNfVU5ERUZJTkVEOworCisJaWYgKGZsYWdzICYgVFRNX1BBR0VfRkxBR19ETUEzMikK KwkJdHlwZSB8PSBJU19ETUEzMjsKKwlpZiAoY3N0YXRlID09IHR0X2NhY2hlZCkKKwkJdHlwZSB8 PSBJU19DQUNIRUQ7CisJZWxzZSBpZiAoY3N0YXRlID09IHR0X3VuY2FjaGVkKQorCQl0eXBlIHw9 IElTX1VDOworCWVsc2UKKwkJdHlwZSB8PSBJU19XQzsKKworCXJldHVybiB0eXBlOworfQorCitz dGF0aWMgdm9pZCB0dG1fcG9vbF91cGRhdGVfZnJlZV9sb2NrZWQoc3RydWN0IGRtYV9wb29sICpw b29sLAorCQkJCQl1bnNpZ25lZCBmcmVlZF9wYWdlcykKK3sKKwlwb29sLT5ucGFnZXNfZnJlZSAt PSBmcmVlZF9wYWdlczsKKwlwb29sLT5uZnJlZXMgKz0gZnJlZWRfcGFnZXM7CisKK30KKworLyog c2V0IG1lbW9yeSBiYWNrIHRvIHdiIGFuZCBmcmVlIHRoZSBwYWdlcy4gKi8KK3N0YXRpYyB2b2lk IHR0bV9kbWFfcGFnZXNfcHV0KHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwgc3RydWN0IGxpc3RfaGVh ZCAqZF9wYWdlcywKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlc1tdLCB1bnNpZ25lZCBucGFn ZXMpCit7CisJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2UsICp0bXA7CisKKwlpZiAobnBhZ2VzICYm IHNldF9wYWdlc19hcnJheV93YihwYWdlcywgbnBhZ2VzKSkKKwkJcHJfZXJyKFRUTV9QRlggIiVz OiBGYWlsZWQgdG8gc2V0ICVkIHBhZ2VzIHRvIHdiIVxuIiwKKwkJCXBvb2wtPmRldl9uYW1lLCBu cGFnZXMpOworCisJaWYgKG5wYWdlcyA+IDEpIHsKKwkJcHJfZGVidWcoIiVzOiAoJXM6JWQpIEZy ZWVpbmcgJWQgcGFnZXMgYXQgb25jZSAobG9ja2xlc3MpLlxuIiwKKwkJCXBvb2wtPmRldl9uYW1l LCBwb29sLT5uYW1lLCBjdXJyZW50LT5waWQsIG5wYWdlcyk7CisJfQorCisJbGlzdF9mb3JfZWFj aF9lbnRyeV9zYWZlKGRfcGFnZSwgdG1wLCBkX3BhZ2VzLCBwYWdlX2xpc3QpIHsKKwkJbGlzdF9k ZWwoJmRfcGFnZS0+cGFnZV9saXN0KTsKKwkJX190dG1fZG1hX2ZyZWVfcGFnZShwb29sLCBkX3Bh Z2UpOworCX0KK30KKworLyoKKyAqIEZyZWUgcGFnZXMgZnJvbSBwb29sLgorICoKKyAqIFRvIHBy ZXZlbnQgaG9nZ2luZyB0aGUgdHRtX3N3YXAgcHJvY2VzcyB3ZSBvbmx5IGZyZWUgTlVNX1BBR0VT X1RPX0FMTE9DCisgKiBudW1iZXIgb2YgcGFnZXMgaW4gb25lIGdvLgorICoKKyAqIEBwb29sOiB0 byBmcmVlIHRoZSBwYWdlcyBmcm9tCisgKiBAbnJfZnJlZTogSWYgc2V0IHRvIHRydWUgd2lsbCBm cmVlIGFsbCBwYWdlcyBpbiBwb29sCisgKiovCitzdGF0aWMgdW5zaWduZWQgdHRtX2RtYV9wYWdl X3Bvb2xfZnJlZShzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIG5yX2ZyZWUpCit7CisJ dW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IGRtYV9wYWdlICpkbWFfcCwgKnRtcDsK KwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzX3RvX2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCBkX3BhZ2Vz OworCXVuc2lnbmVkIGZyZWVkX3BhZ2VzID0gMCwKKwkJIG5wYWdlc190b19mcmVlID0gbnJfZnJl ZTsKKworCWlmIChOVU1fUEFHRVNfVE9fQUxMT0MgPCBucl9mcmVlKQorCQlucGFnZXNfdG9fZnJl ZSA9IE5VTV9QQUdFU19UT19BTExPQzsKKyNpZiAwCisJaWYgKG5yX2ZyZWUgPiAxKSB7CisJCXBy X2RlYnVnKCIlczogKCVzOiVkKSBBdHRlbXB0aW5nIHRvIGZyZWUgJWQgKCVkKSBwYWdlc1xuIiwK KwkJCXBvb2wtPmRldl9uYW1lLCBwb29sLT5uYW1lLCBjdXJyZW50LT5waWQsCisJCQlucGFnZXNf dG9fZnJlZSwgbnJfZnJlZSk7CisJfQorI2VuZGlmCisJcGFnZXNfdG9fZnJlZSA9IGttYWxsb2Mo bnBhZ2VzX3RvX2ZyZWUgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCisJCQlHRlBfS0VSTkVMKTsK KworCWlmICghcGFnZXNfdG9fZnJlZSkgeworCQlwcl9lcnIoVFRNX1BGWAorCQkgICAgICAgIiVz OiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwb29sIGZyZWUgb3BlcmF0aW9uLlxuIiwK KwkJCXBvb2wtPmRldl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCUlOSVRfTElTVF9IRUFEKCZk X3BhZ2VzKTsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGlycV9m bGFncyk7CisKKwkvKiBXZSBwaWNraW5nIHRoZSBvbGRlc3Qgb25lcyBvZmYgdGhlIGxpc3QgKi8K KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShkbWFfcCwgdG1wLCAmcG9vbC0+ZnJl ZV9saXN0LAorCQkJCQkgcGFnZV9saXN0KSB7CisJCWlmIChmcmVlZF9wYWdlcyA+PSBucGFnZXNf dG9fZnJlZSkKKwkJCWJyZWFrOworCisJCS8qIE1vdmUgdGhlIGRtYV9wYWdlIGZyb20gb25lIGxp c3QgdG8gYW5vdGhlci4gKi8KKwkJbGlzdF9tb3ZlKCZkbWFfcC0+cGFnZV9saXN0LCAmZF9wYWdl cyk7CisKKwkJcGFnZXNfdG9fZnJlZVtmcmVlZF9wYWdlcysrXSA9IGRtYV9wLT5wOworCQkvKiBX ZSBjYW4gb25seSByZW1vdmUgTlVNX1BBR0VTX1RPX0FMTE9DIGF0IGEgdGltZS4gKi8KKwkJaWYg KGZyZWVkX3BhZ2VzID49IE5VTV9QQUdFU19UT19BTExPQykgeworCisJCQl0dG1fcG9vbF91cGRh dGVfZnJlZV9sb2NrZWQocG9vbCwgZnJlZWRfcGFnZXMpOworCQkJLyoqCisJCQkgKiBCZWNhdXNl IGNoYW5naW5nIHBhZ2UgY2FjaGluZyBpcyBjb3N0bHkKKwkJCSAqIHdlIHVubG9jayB0aGUgcG9v bCB0byBwcmV2ZW50IHN0YWxsaW5nLgorCQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJCQl0dG1fZG1hX3BhZ2VzX3B1dChwb29sLCAm ZF9wYWdlcywgcGFnZXNfdG9fZnJlZSwKKwkJCQkJICBmcmVlZF9wYWdlcyk7CisKKwkJCUlOSVRf TElTVF9IRUFEKCZkX3BhZ2VzKTsKKworCQkJaWYgKGxpa2VseShucl9mcmVlICE9IEZSRUVfQUxM X1BBR0VTKSkKKwkJCQlucl9mcmVlIC09IGZyZWVkX3BhZ2VzOworCisJCQlpZiAoTlVNX1BBR0VT X1RPX0FMTE9DID49IG5yX2ZyZWUpCisJCQkJbnBhZ2VzX3RvX2ZyZWUgPSBucl9mcmVlOworCQkJ ZWxzZQorCQkJCW5wYWdlc190b19mcmVlID0gTlVNX1BBR0VTX1RPX0FMTE9DOworCisJCQlmcmVl ZF9wYWdlcyA9IDA7CisKKwkJCS8qIGZyZWUgYWxsIHNvIHJlc3RhcnQgdGhlIHByb2Nlc3Npbmcg Ki8KKwkJCWlmIChucl9mcmVlKQorCQkJCWdvdG8gcmVzdGFydDsKKworCQkJLyogTm90IGFsbG93 ZWQgdG8gZmFsbCB0aHJvdWdoIG9yIGJyZWFrIGJlY2F1c2UKKwkJCSAqIGZvbGxvd2luZyBjb250 ZXh0IGlzIGluc2lkZSBzcGlubG9jayB3aGlsZSB3ZSBhcmUKKwkJCSAqIG91dHNpZGUgaGVyZS4K KwkJCSAqLworCQkJZ290byBvdXQ7CisKKwkJfQorCX0KKworCS8qIHJlbW92ZSByYW5nZSBvZiBw YWdlcyBmcm9tIHRoZSBwb29sICovCisJaWYgKGZyZWVkX3BhZ2VzKSB7CisJCXR0bV9wb29sX3Vw ZGF0ZV9mcmVlX2xvY2tlZChwb29sLCBmcmVlZF9wYWdlcyk7CisJCW5yX2ZyZWUgLT0gZnJlZWRf cGFnZXM7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgaXJxX2Zs YWdzKTsKKworCWlmIChmcmVlZF9wYWdlcykKKwkJdHRtX2RtYV9wYWdlc19wdXQocG9vbCwgJmRf cGFnZXMsIHBhZ2VzX3RvX2ZyZWUsIGZyZWVkX3BhZ2VzKTsKK291dDoKKwlrZnJlZShwYWdlc190 b19mcmVlKTsKKwlyZXR1cm4gbnJfZnJlZTsKK30KKworc3RhdGljIHZvaWQgdHRtX2RtYV9mcmVl X3Bvb2woc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIHBvb2xfdHlwZSB0eXBlKQoreworCXN0cnVj dCBkZXZpY2VfcG9vbHMgKnA7CisJc3RydWN0IGRtYV9wb29sICpwb29sOworCisJaWYgKCFkZXYp CisJCXJldHVybjsKKworCW11dGV4X2xvY2soJl9tYW5hZ2VyLT5sb2NrKTsKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5X3JldmVyc2UocCwgJl9tYW5hZ2VyLT5wb29scywgcG9vbHMpIHsKKwkJaWYgKHAt PmRldiAhPSBkZXYpCisJCQljb250aW51ZTsKKwkJcG9vbCA9IHAtPnBvb2w7CisJCWlmIChwb29s LT50eXBlICE9IHR5cGUpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmcC0+cG9vbHMpOwor CQlrZnJlZShwKTsKKwkJX21hbmFnZXItPm5wb29scy0tOworCQlicmVhazsKKwl9CisJbGlzdF9m b3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvb2wsICZkZXYtPmRtYV9wb29scywgcG9vbHMpIHsKKwkJ aWYgKHBvb2wtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQkvKiBUYWtlcyBhIHNwaW5s b2NrLi4gKi8KKwkJdHRtX2RtYV9wYWdlX3Bvb2xfZnJlZShwb29sLCBGUkVFX0FMTF9QQUdFUyk7 CisJCVdBUk5fT04oKChwb29sLT5ucGFnZXNfaW5fdXNlICsgcG9vbC0+bnBhZ2VzX2ZyZWUpICE9 IDApKTsKKwkJLyogVGhpcyBjb2RlIHBhdGggaXMgY2FsbGVkIGFmdGVyIF9hbGxfIHJlZmVyZW5j ZXMgdG8gdGhlCisJCSAqIHN0cnVjdCBkZXZpY2UgaGFzIGJlZW4gZHJvcHBlZCAtIHNvIG5vYm9k eSBzaG91bGQgYmUKKwkJICogdG91Y2hpbmcgaXQuIEluIGNhc2Ugc29tZWJvZHkgaXMgdHJ5aW5n IHRvIF9hZGRfIHdlIGFyZQorCQkgKiBndWFyZGVkIGJ5IHRoZSBtdXRleC4gKi8KKwkJbGlzdF9k ZWwoJnBvb2wtPnBvb2xzKTsKKwkJa2ZyZWUocG9vbCk7CisJCWJyZWFrOworCX0KKwltdXRleF91 bmxvY2soJl9tYW5hZ2VyLT5sb2NrKTsKK30KKworLyoKKyAqIE9uIGZyZWUtaW5nIG9mIHRoZSAn c3RydWN0IGRldmljZScgdGhpcyBkZWNvbnN0cnVjdG9yIGlzIHJ1bi4KKyAqIEFsYmVpdCB0aGUg cG9vbCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBmcmVlZCBlYXJsaWVyLgorICovCitzdGF0aWMg dm9pZCB0dG1fZG1hX3Bvb2xfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykK K3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSAqKHN0cnVjdCBkbWFfcG9vbCAqKilyZXM7CisK KwlpZiAocG9vbCkKKwkJdHRtX2RtYV9mcmVlX3Bvb2woZGV2LCBwb29sLT50eXBlKTsKK30KKwor c3RhdGljIGludCB0dG1fZG1hX3Bvb2xfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpy ZXMsIHZvaWQgKm1hdGNoX2RhdGEpCit7CisJcmV0dXJuICooc3RydWN0IGRtYV9wb29sICoqKXJl cyA9PSBtYXRjaF9kYXRhOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9wb29sICp0dG1fZG1hX3Bv b2xfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGdmcF90IGZsYWdzLAorCQkJCQkgIGVudW0gcG9v bF90eXBlIHR5cGUpCit7CisJY2hhciAqbltdID0geyJ3YyIsICJ1YyIsICJjYWNoZWQiLCAiIGRt YTMyIiwgInVua25vd24iLH07CisJZW51bSBwb29sX3R5cGUgdFtdID0ge0lTX1dDLCBJU19VQywg SVNfQ0FDSEVELCBJU19ETUEzMiwgSVNfVU5ERUZJTkVEfTsKKwlzdHJ1Y3QgZGV2aWNlX3Bvb2xz ICpzZWNfcG9vbCA9IE5VTEw7CisJc3RydWN0IGRtYV9wb29sICpwb29sID0gTlVMTCwgKipwdHI7 CisJdW5zaWduZWQgaTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwljaGFyICpwOworCisJaWYgKCFk ZXYpCisJCXJldHVybiBOVUxMOworCisJcHRyID0gZGV2cmVzX2FsbG9jKHR0bV9kbWFfcG9vbF9y ZWxlYXNlLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4g TlVMTDsKKworCXJldCA9IC1FTk9NRU07CisKKwlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZihz dHJ1Y3QgZG1hX3Bvb2wpLCBHRlBfS0VSTkVMLAorCQkJICAgIGRldl90b19ub2RlKGRldikpOwor CWlmICghcG9vbCkKKwkJZ290byBlcnJfbWVtOworCisJc2VjX3Bvb2wgPSBrbWFsbG9jX25vZGUo c2l6ZW9mKHN0cnVjdCBkZXZpY2VfcG9vbHMpLCBHRlBfS0VSTkVMLAorCQkJCWRldl90b19ub2Rl KGRldikpOworCWlmICghc2VjX3Bvb2wpCisJCWdvdG8gZXJyX21lbTsKKworCUlOSVRfTElTVF9I RUFEKCZzZWNfcG9vbC0+cG9vbHMpOworCXNlY19wb29sLT5kZXYgPSBkZXY7CisJc2VjX3Bvb2wt PnBvb2wgPSAgcG9vbDsKKworCUlOSVRfTElTVF9IRUFEKCZwb29sLT5mcmVlX2xpc3QpOworCUlO SVRfTElTVF9IRUFEKCZwb29sLT5pbnVzZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcG9vbC0+ cG9vbHMpOworCXNwaW5fbG9ja19pbml0KCZwb29sLT5sb2NrKTsKKwlwb29sLT5kZXYgPSBkZXY7 CisJcG9vbC0+bnBhZ2VzX2ZyZWUgPSBwb29sLT5ucGFnZXNfaW5fdXNlID0gMDsKKwlwb29sLT5u ZnJlZXMgPSAwOworCXBvb2wtPmdmcF9mbGFncyA9IGZsYWdzOworCXBvb2wtPnNpemUgPSBQQUdF X1NJWkU7CisJcG9vbC0+dHlwZSA9IHR5cGU7CisJcG9vbC0+bnJlZmlsbHMgPSAwOworCXBvb2wt PmZpbGxfbG9jayA9IGZhbHNlOworCXAgPSBwb29sLT5uYW1lOworCWZvciAoaSA9IDA7IGkgPCA1 OyBpKyspIHsKKwkJaWYgKHR5cGUgJiB0W2ldKSB7CisJCQlwICs9IHNucHJpbnRmKHAsIHNpemVv Zihwb29sLT5uYW1lKSAtIChwIC0gcG9vbC0+bmFtZSksCisJCQkJICAgICAgIiVzIiwgbltpXSk7 CisJCX0KKwl9CisJKnAgPSAwOworCS8qIFdlIGNvcHkgdGhlIG5hbWUgZm9yIHByXyBjYWxscyBi L2Mgd2hlbiBkbWFfcG9vbF9kZXN0cm95IGlzIGNhbGxlZAorCSAqIC0gdGhlIGtvYmotPm5hbWUg aGFzIGFscmVhZHkgYmVlbiBkZWFsbG9jYXRlZC4qLworCXNucHJpbnRmKHBvb2wtPmRldl9uYW1l LCBzaXplb2YocG9vbC0+ZGV2X25hbWUpLCAiJXMgJXMiLAorCQkgZGV2X2RyaXZlcl9zdHJpbmco ZGV2KSwgZGV2X25hbWUoZGV2KSk7CisJbXV0ZXhfbG9jaygmX21hbmFnZXItPmxvY2spOworCS8q IFlvdSBjYW4gZ2V0IHRoZSBkbWFfcG9vbCBmcm9tIGVpdGhlciB0aGUgZ2xvYmFsOiAqLworCWxp c3RfYWRkKCZzZWNfcG9vbC0+cG9vbHMsICZfbWFuYWdlci0+cG9vbHMpOworCV9tYW5hZ2VyLT5u cG9vbHMrKzsKKwkvKiBvciBmcm9tICdzdHJ1Y3QgZGV2aWNlJzogKi8KKwlsaXN0X2FkZCgmcG9v bC0+cG9vbHMsICZkZXYtPmRtYV9wb29scyk7CisJbXV0ZXhfdW5sb2NrKCZfbWFuYWdlci0+bG9j ayk7CisKKwkqcHRyID0gcG9vbDsKKwlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKworCXJldHVybiBw b29sOworZXJyX21lbToKKwlkZXZyZXNfZnJlZShwdHIpOworCWtmcmVlKHNlY19wb29sKTsKKwlr ZnJlZShwb29sKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgc3RydWN0IGRt YV9wb29sICp0dG1fZG1hX2ZpbmRfcG9vbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgZW51 bSBwb29sX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsICp0bXAsICpmb3Vu ZCA9IE5VTEw7CisKKwlpZiAodHlwZSA9PSBJU19VTkRFRklORUQpCisJCXJldHVybiBmb3VuZDsK KworCS8qIE5COiBXZSBpdGVyYXRlIG9uIHRoZSAnc3RydWN0IGRldicgd2hpY2ggaGFzIG5vIHNw aW5sb2NrLCBidXQKKwkgKiBpdCBkb2VzIGhhdmUgYSBrcmVmIHdoaWNoIHdlIGhhdmUgdGFrZW4u IFRoZSBrcmVmIGlzIHRha2VuIGR1cmluZworCSAqIGdyYXBoaWMgZHJpdmVyIGxvYWRpbmcgLSBp biB0aGUgZHJtX3BjaV9pbml0IGl0IGNhbGxzIGVpdGhlcgorCSAqIHBjaV9kZXZfZ2V0IG9yIHBj aV9yZWdpc3Rlcl9kcml2ZXIgd2hpY2ggYm90aCBlbmQgdXAgdGFraW5nIGEga3JlZgorCSAqIG9u ICdzdHJ1Y3QgZGV2aWNlJy4KKwkgKgorCSAqIE9uIHRlYXJkb3duLCB0aGUgZ3JhcGhpYyBkcml2 ZXJzIGVuZCB1cCBxdWllc2NpbmcgdGhlIFRUTSAocHV0X3BhZ2VzKQorCSAqIGFuZCBjYWxscyB0 aGUgZGV2X3JlcyBkZWNvbnN0cnVjdG9yczogdHRtX2RtYV9wb29sX3JlbGVhc2UuIFRoZSBuaWNl CisJICogdGhpbmcgaXMgYXQgdGhhdCBwb2ludCBvZiB0aW1lIHRoZXJlIGFyZSBubyBwYWdlcyBh c3NvY2lhdGVkIHdpdGggdGhlCisJICogZHJpdmVyIHNvIHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qg YmUgY2FsbGVkLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb29sLCB0bXAsICZk ZXYtPmRtYV9wb29scywgcG9vbHMpIHsKKwkJaWYgKHBvb2wtPnR5cGUgIT0gdHlwZSkKKwkJCWNv bnRpbnVlOworCQlmb3VuZCA9IHBvb2w7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9 CisKKy8qCisgKiBGcmVlIHBhZ2VzIHRoZSBwYWdlcyB0aGF0IGZhaWxlZCB0byBjaGFuZ2UgdGhl IGNhY2hpbmcgc3RhdGUuIElmIHRoZXJlCisgKiBhcmUgcGFnZXMgdGhhdCBoYXZlIGNoYW5nZWQg dGhlaXIgY2FjaGluZyBzdGF0ZSBhbHJlYWR5IHB1dCB0aGVtIHRvIHRoZQorICogcG9vbC4KKyAq Lworc3RhdGljIHZvaWQgdHRtX2RtYV9oYW5kbGVfY2FjaGluZ19zdGF0ZV9mYWlsdXJlKHN0cnVj dCBkbWFfcG9vbCAqcG9vbCwKKwkJCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpkX3BhZ2VzLAorCQkJ CQkJIHN0cnVjdCBwYWdlICoqZmFpbGVkX3BhZ2VzLAorCQkJCQkJIHVuc2lnbmVkIGNwYWdlcykK K3sKKwlzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFnZSwgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcDsKKwl1 bnNpZ25lZCBpID0gMDsKKworCXAgPSBmYWlsZWRfcGFnZXNbMF07CisJaWYgKCFwKQorCQlyZXR1 cm47CisJLyogRmluZCB0aGUgZmFpbGVkIHBhZ2UuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9z YWZlKGRfcGFnZSwgdG1wLCBkX3BhZ2VzLCBwYWdlX2xpc3QpIHsKKwkJaWYgKGRfcGFnZS0+cCAh PSBwKQorCQkJY29udGludWU7CisJCS8qIC4uIGFuZCB0aGVuIHByb2dyZXNzIG92ZXIgdGhlIGZ1 bGwgbGlzdC4gKi8KKwkJbGlzdF9kZWwoJmRfcGFnZS0+cGFnZV9saXN0KTsKKwkJX190dG1fZG1h X2ZyZWVfcGFnZShwb29sLCBkX3BhZ2UpOworCQlpZiAoKytpIDwgY3BhZ2VzKQorCQkJcCA9IGZh aWxlZF9wYWdlc1tpXTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCit9CisKKy8qCisgKiBBbGxv Y2F0ZSAnY291bnQnIHBhZ2VzLCBhbmQgcHV0ICduZWVkJyBudW1iZXIgb2YgdGhlbSBvbiB0aGUK KyAqICdwYWdlcycgYW5kIGFzIHdlbGwgb24gdGhlICdkbWFfYWRkcmVzcycgc3RhcnRpbmcgYXQg J2RtYV9vZmZzZXQnIG9mZnNldC4KKyAqIFRoZSBmdWxsIGxpc3Qgb2YgcGFnZXMgc2hvdWxkIGFs c28gYmUgb24gJ2RfcGFnZXMnLgorICogV2UgcmV0dXJuIHplcm8gZm9yIHN1Y2Nlc3MsIGFuZCBu ZWdhdGl2ZSBudW1iZXJzIGFzIGVycm9ycy4KKyAqLworc3RhdGljIGludCB0dG1fZG1hX3Bvb2xf YWxsb2NfbmV3X3BhZ2VzKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwKKwkJCQkJc3RydWN0IGxpc3Rf aGVhZCAqZF9wYWdlcywKKwkJCQkJdW5zaWduZWQgY291bnQpCit7CisJc3RydWN0IHBhZ2UgKipj YWNoaW5nX2FycmF5OworCXN0cnVjdCBkbWFfcGFnZSAqZG1hX3A7CisJc3RydWN0IHBhZ2UgKnA7 CisJaW50IHIgPSAwOworCXVuc2lnbmVkIGksIGNwYWdlczsKKwl1bnNpZ25lZCBtYXhfY3BhZ2Vz ID0gbWluKGNvdW50LAorCQkJKHVuc2lnbmVkKShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBwYWdl ICopKSk7CisKKwkvKiBhbGxvY2F0ZSBhcnJheSBmb3IgcGFnZSBjYWNoaW5nIGNoYW5nZSAqLwor CWNhY2hpbmdfYXJyYXkgPSBrbWFsbG9jKG1heF9jcGFnZXMqc2l6ZW9mKHN0cnVjdCBwYWdlICop LCBHRlBfS0VSTkVMKTsKKworCWlmICghY2FjaGluZ19hcnJheSkgeworCQlwcl9lcnIoVFRNX1BG WAorCQkgICAgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgdGFibGUgZm9yIG5ldyBwYWdlcy4i LAorCQkJcG9vbC0+ZGV2X25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY291 bnQgPiAxKSB7CisJCXByX2RlYnVnKCIlczogKCVzOiVkKSBHZXR0aW5nICVkIHBhZ2VzXG4iLAor CQkJcG9vbC0+ZGV2X25hbWUsIHBvb2wtPm5hbWUsIGN1cnJlbnQtPnBpZCwKKwkJCWNvdW50KTsK Kwl9CisKKwlmb3IgKGkgPSAwLCBjcGFnZXMgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQlkbWFf cCA9IF9fdHRtX2RtYV9hbGxvY19wYWdlKHBvb2wpOworCQlpZiAoIWRtYV9wKSB7CisJCQlwcl9l cnIoVFRNX1BGWCAiJXM6IFVuYWJsZSB0byBnZXQgcGFnZSAldS5cbiIsCisJCQkJcG9vbC0+ZGV2 X25hbWUsIGkpOworCisJCQkvKiBzdG9yZSBhbHJlYWR5IGFsbG9jYXRlZCBwYWdlcyBpbiB0aGUg cG9vbCBhZnRlcgorCQkJICogc2V0dGluZyB0aGUgY2FjaGluZyBzdGF0ZSAqLworCQkJaWYgKGNw YWdlcykgeworCQkJCXIgPSB0dG1fc2V0X3BhZ2VzX2NhY2hpbmcocG9vbCwgY2FjaGluZ19hcnJh eSwKKwkJCQkJCQkgIGNwYWdlcyk7CisJCQkJaWYgKHIpCisJCQkJCXR0bV9kbWFfaGFuZGxlX2Nh Y2hpbmdfc3RhdGVfZmFpbHVyZSgKKwkJCQkJCXBvb2wsIGRfcGFnZXMsIGNhY2hpbmdfYXJyYXks CisJCQkJCQljcGFnZXMpOworCQkJfQorCQkJciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJ fQorCQlwID0gZG1hX3AtPnA7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwkJLyogZ2ZwIGZsYWdz IG9mIGhpZ2htZW0gcGFnZSBzaG91bGQgbmV2ZXIgYmUgZG1hMzIgc28gd2UKKwkJICogd2Ugc2hv dWxkIGJlIGZpbmUgaW4gc3VjaCBjYXNlCisJCSAqLworCQlpZiAoIVBhZ2VIaWdoTWVtKHApKQor I2VuZGlmCisJCXsKKwkJCWNhY2hpbmdfYXJyYXlbY3BhZ2VzKytdID0gcDsKKwkJCWlmIChjcGFn ZXMgPT0gbWF4X2NwYWdlcykgeworCQkJCS8qIE5vdGU6IENhbm5vdCBob2xkIHRoZSBzcGlubG9j ayAqLworCQkJCXIgPSB0dG1fc2V0X3BhZ2VzX2NhY2hpbmcocG9vbCwgY2FjaGluZ19hcnJheSwK KwkJCQkJCSBjcGFnZXMpOworCQkJCWlmIChyKSB7CisJCQkJCXR0bV9kbWFfaGFuZGxlX2NhY2hp bmdfc3RhdGVfZmFpbHVyZSgKKwkJCQkJCXBvb2wsIGRfcGFnZXMsIGNhY2hpbmdfYXJyYXksCisJ CQkJCQljcGFnZXMpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY3BhZ2VzID0gMDsKKwkJ CX0KKwkJfQorCQlsaXN0X2FkZCgmZG1hX3AtPnBhZ2VfbGlzdCwgZF9wYWdlcyk7CisJfQorCisJ aWYgKGNwYWdlcykgeworCQlyID0gdHRtX3NldF9wYWdlc19jYWNoaW5nKHBvb2wsIGNhY2hpbmdf YXJyYXksIGNwYWdlcyk7CisJCWlmIChyKQorCQkJdHRtX2RtYV9oYW5kbGVfY2FjaGluZ19zdGF0 ZV9mYWlsdXJlKHBvb2wsIGRfcGFnZXMsCisJCQkJCWNhY2hpbmdfYXJyYXksIGNwYWdlcyk7CisJ fQorb3V0OgorCWtmcmVlKGNhY2hpbmdfYXJyYXkpOworCXJldHVybiByOworfQorCitzdGF0aWMg aW50IHR0bV9kbWFfY2hlY2tfYWxsb2NfbGlzdChzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7CisJc3Ry dWN0IGRtYV9wYWdlICpkX3BhZ2U7CisJdW5zaWduZWQgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5KGRfcGFnZSwgJnR0bS0+YWxsb2NfbGlzdCwgcGFnZV9saXN0KSB7CisJCWlmIChkX3Bh Z2UtPnAgIT0gdHRtLT5wYWdlc1tpKytdKSB7CisJCQlwcl9lcnIoVFRNX1BGWCAiZG1hIHBhZ2Ug bGlzdCAmIGFycmF5IG1pc21hdGNoICVkIiwgaSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQor CX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEByZXR1cm4gY291bnQgb2YgcGFnZXMgc3RpbGwg cmVxdWlyZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdC4KKyovCitzdGF0aWMgaW50IHR0bV9kbWFf cGFnZV9wb29sX2ZpbGxfbG9ja2VkKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwKKwkJCQkJIHVuc2ln bmVkIGNvdW50LAorCQkJCQkgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQoreworCWludCByID0g Y291bnQ7CisKKwlpZiAocG9vbC0+ZmlsbF9sb2NrKQorCQlyZXR1cm4gcjsKKworCXBvb2wtPmZp bGxfbG9jayA9IHRydWU7CisJaWYgKGNvdW50IDwgX21hbmFnZXItPm9wdGlvbnMuc21hbGwgJiYK KwkgICAgY291bnQgPiBwb29sLT5ucGFnZXNfZnJlZSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkIGRf cGFnZXM7CisJCXVuc2lnbmVkIGFsbG9jX3NpemUgPSAgX21hbmFnZXItPm9wdGlvbnMuYWxsb2Nf c2l6ZTsKKworCQlJTklUX0xJU1RfSEVBRCgmZF9wYWdlcyk7CisKKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7CisKKwkJLyogUmV0dXJucyBob3cgbWFu eSBtb3JlIGFyZSBuZWNjZXNzYXJ5IHRvIGZ1bGZpbGwgdGhlCisJCSAqIHJlcXVlc3QuICovCisJ CXIgPSB0dG1fZG1hX3Bvb2xfYWxsb2NfbmV3X3BhZ2VzKHBvb2wsICZkX3BhZ2VzLCBhbGxvY19z aXplKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7CisJ CWlmICghcikgeworCQkJLyogQWRkIHRoZSBmcmVzaCB0byB0aGUgZW5kLi4gKi8KKwkJCWxpc3Rf c3BsaWNlKCZkX3BhZ2VzLCAmcG9vbC0+ZnJlZV9saXN0KTsKKwkJCSsrcG9vbC0+bnJlZmlsbHM7 CisJCQlwb29sLT5ucGFnZXNfZnJlZSArPSBhbGxvY19zaXplOworCQl9IGVsc2UgeworCQkJc3Ry dWN0IGRtYV9wYWdlICpkX3BhZ2U7CisJCQl1bnNpZ25lZCBjcGFnZXMgPSAwOworCisJCQlwcl9l cnIoVFRNX1BGWCAiJXM6IEZhaWxlZCB0byBmaWxsICVzIHBvb2wgKHI6JWQpIVxuIiwKKwkJCQlw b29sLT5kZXZfbmFtZSwgcG9vbC0+bmFtZSwgcik7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnko ZF9wYWdlLCAmZF9wYWdlcywgcGFnZV9saXN0KSB7CisJCQkJY3BhZ2VzKys7CisJCQl9CisJCQls aXN0X3NwbGljZV90YWlsKCZkX3BhZ2VzLCAmcG9vbC0+ZnJlZV9saXN0KTsKKwkJCXBvb2wtPm5w YWdlc19mcmVlICs9IGNwYWdlczsKKwkJfQorCX0KKwlwb29sLT5maWxsX2xvY2sgPSBmYWxzZTsK KwlyZXR1cm4gcjsKKworfQorCisvKgorICogQHJldHVybiBjb3VudCBvZiBwYWdlcyBzdGlsbCBy ZXF1aXJlZCB0byBmdWxmaWxsIHRoZSByZXF1ZXN0LgorICogVGhlIHBvcHVsYXRlIGxpc3QgaXMg YWN0dWFsbHkgYSBzdGFjayAobm90IHRoYXQgaXMgbWF0dGVycyBhcyBUVE0KKyAqIGFsbG9jYXRl cyBvbmUgcGFnZSBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQgdHRtX2RtYV9wb29sX2dldF9w YWdlcyhzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wsCisJCQkJICBzdHJ1Y3QgdHRtX3R0ICp0dG0pCit7 CisJc3RydWN0IGRtYV9wYWdlICpkX3BhZ2UsICp0bXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxh Z3M7CisJdW5zaWduZWQgaSwgY291bnQgPSB0dG0tPm51bV9wYWdlczsKKwlpbnQgcjsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCXIgPSB0dG1fZG1hX3Bh Z2VfcG9vbF9maWxsX2xvY2tlZChwb29sLCBjb3VudCwgJmlycV9mbGFncyk7CisJaWYgKHIgPCAw KSB7CisJCXByX2RlYnVnKCIlczogKCVzOiVkKSBBc2tlZCBmb3IgJWQsIGdvdCAlZCAlcy5cbiIs CisJCQlwb29sLT5kZXZfbmFtZSwgcG9vbC0+bmFtZSwgY3VycmVudC0+cGlkLCBjb3VudCwgciwK KwkJCShyIDwgMCkgPyAiZXJyOiIgOiAicGFnZXMiKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgh cG9vbC0+bnBhZ2VzX2ZyZWUpCisJCWdvdG8gb3V0OworCWlmIChjb3VudCA+IDEpIHsKKwkJcHJf ZGVidWcoIiVzOiAoJXM6JWQpIExvb2tpbmcgaW4gZnJlZSBsaXN0IGZvciAlZCBwYWdlcy4gIlwK KwkJCSAiKGhhdmUgJWQgcGFnZXMgZnJlZSlcbiIsCisJCQkgcG9vbC0+ZGV2X25hbWUsIHBvb2wt Pm5hbWUsIGN1cnJlbnQtPnBpZCwgY291bnQsCisJCQkgcG9vbC0+bnBhZ2VzX2ZyZWUpOworCX0K KwlpID0gMDsKKwkvKiBXZSBhcmUgaG9sZGluZyB0aGUgc3BpbmxvY2suLiAqLworCS8qIE5vdGU6 IFRoZSAgdGhlICdwYWdlcycgKGFuZCBpbnVzZV9saXN0KSBpcyBleHBlY3RlZCB0byBiZSBhIHN0 YWNrLAorCSAqIHNvIHdlIHB1dCB0aGUgZW50cmllcyBpbiB0aGUgcmlnaHQgb3JkZXIgKGFuZCBv biB0aGUgaW51c2UgbGlzdAorCSAqIGluIHRoZSByZXZlcnNlIG9yZGVyIHRvIGNvbXBlbnN0YXRl IGZvciBmcmVlaW5nIC0gd2hpY2ggaW52ZXJ0cyB0aGUKKwkgKiAncGFnZXMnIG9yZGVyKS4KKwkg Ki8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZF9wYWdlLCB0bXAsICZwb29sLT5mcmVlX2xp c3QsIHBhZ2VfbGlzdCkgeworCQl0dG0tPnBhZ2VzW2ldID0gZF9wYWdlLT5wOworCQl0dG0tPmRt YV9hZGRyZXNzW2ldID0gZF9wYWdlLT5kbWE7CisJCWkrKzsKKwkJbGlzdF9tb3ZlX3RhaWwoJmRf cGFnZS0+cGFnZV9saXN0LCAmdHRtLT5hbGxvY19saXN0KTsKKwkJaWYgKGkgPT0gY291bnQpCisJ CQlicmVhazsKKwl9CisJY291bnQgLT0gaTsKKwlwb29sLT5ucGFnZXNfaW5fdXNlICs9IGk7CisJ cG9vbC0+bnBhZ2VzX2ZyZWUgLT0gaTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZw b29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCWlmIChjb3VudCkKKwkJcHJfZGVidWcoIiVzOiAoJXM6 JWQpIE5lZWQgJWQgbW9yZS5cbiIsCisJCQlwb29sLT5kZXZfbmFtZSwgcG9vbC0+bmFtZSwgY3Vy cmVudC0+cGlkLCBjb3VudCk7CisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogT24gc3VjY2Vz cyBwYWdlcyBsaXN0IHdpbGwgaG9sZCBjb3VudCBudW1iZXIgb2YgY29ycmVjdGx5CisgKiBjYWNo ZWQgcGFnZXMuIE9uIGZhaWx1cmUgd2lsbCBob2xkIHRoZSBuZWdhdGl2ZSByZXR1cm4gdmFsdWUg KC1FTk9NRU0sIGV0YykuCisgKi8KK2ludCB0dG1fZG1hX3BvcHVsYXRlKHN0cnVjdCB0dG1fdHQg KnR0bSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVt X2dsb2IgPSB0dG0tPmdsb2ItPm1lbV9nbG9iOworCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKKwln ZnBfdCBnZnBfZmxhZ3M7CisJZW51bSBwb29sX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpOworCWlu dCByOworCisJciA9IHR0bV9tZW1fZ2xvYmFsX2FsbG9jX3BhZ2VzKG1lbV9nbG9iLCB0dG0tPm51 bV9wYWdlcywgZmFsc2UpOworCWlmIChyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR5cGUgPSB0 dG1fdG9fdHlwZSh0dG0tPnBhZ2VfZmxhZ3MsIHR0bS0+Y2FjaGluZ19zdGF0ZSk7CisKKwlpZiAo dHRtLT5wYWdlX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19ETUEzMikKKwkJZ2ZwX2ZsYWdzID0gR0ZQ X1VTRVIgfCBHRlBfRE1BMzI7CisJZWxzZQorCQlnZnBfZmxhZ3MgPSBHRlBfSElHSFVTRVI7CisK KwlpZiAodHRtLT5wYWdlX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19aRVJPX0FMTE9DKQorCQlnZnBf ZmxhZ3MgfD0gX19HRlBfWkVSTzsKKworCXBvb2wgPSB0dG1fZG1hX2ZpbmRfcG9vbChkZXYsIHR5 cGUpOworCWlmICghcG9vbCkgeworCQlwb29sID0gdHRtX2RtYV9wb29sX2luaXQoZGV2LCBnZnBf ZmxhZ3MsIHR5cGUpOworCQlpZiAoSVNfRVJSX09SX05VTEwocG9vbCkpIHsKKwkJCXR0bV9tZW1f Z2xvYmFsX2ZyZWUobWVtX2dsb2IsIHR0bS0+bnVtX3BhZ2VzICogUEFHRV9TSVpFKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJfQorCisJLyogPz8gd2UgbWlnaHQgd2FudCB0byBjaGVjayBz ZWUgaWYgcGFnZXMgYXJlIGFscmVhZHkKKwkgKiBhbGxvY2VkLCBmb3IgdGhlIG1vbWVudCBqdXN0 IHRydXN0IHRoZSBjYWxsZXIKKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmdHRtLT5hbGxvY19saXN0 KTsKKwkvKiBUYWtlIHBhZ2VzIG91dCBvZiBhIHBvb2wgKGlmIGFwcGxpY2FibGUpICovCisJciA9 IHR0bV9kbWFfcG9vbF9nZXRfcGFnZXMocG9vbCwgdHRtKTsKKwkvKiBjbGVhciB0aGUgcGFnZXMg Y29taW5nIGZyb20gdGhlIHBvb2wgaWYgcmVxdWVzdGVkICovCisJaWYgKHR0bS0+cGFnZV9mbGFn cyAmIFRUTV9QQUdFX0ZMQUdfWkVST19BTExPQykgeworCQlmb3IgKGkgPSAwOyBpIDwgKHR0bS0+ bnVtX3BhZ2VzIC0gcik7IGkrKykgeworCQkJY2xlYXJfcGFnZShwYWdlX2FkZHJlc3ModHRtLT5w YWdlc1tpXSkpOworCQl9CisJfQorCS8qIElmIHBvb2wgZGlkbid0IGhhdmUgZW5vdWdoIHBhZ2Vz IGFsbG9jYXRlIG5ldyBvbmUuICovCisJaWYgKHIgPiAwKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQg ZF9wYWdlczsKKwkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJCXVuc2lnbmVkIHBhZ2VzX25l ZWQgPSByOworCisJCUlOSVRfTElTVF9IRUFEKCZkX3BhZ2VzKTsKKwkJaSA9IHR0bS0+bnVtX3Bh Z2VzIC0gcGFnZXNfbmVlZDsKKworCQkvKiBOb3RlLCB3ZSBhcmUgcnVubmluZyB3aXRob3V0IGxv Y2tpbmcgaGVyZS4uCisJCSAqIGFuZCB3ZSBoYXZlIHRvIG1hbnVhbGx5IGFkZCB0aGUgc3RhY2sg dG8gdGhlIGludXNlIHBvb2wuICovCisJCXIgPSB0dG1fZG1hX3Bvb2xfYWxsb2NfbmV3X3BhZ2Vz KHBvb2wsICZkX3BhZ2VzLCBwYWdlc19uZWVkKTsKKworCQlpZiAociA9PSAwKSB7CisJCQlzdHJ1 Y3QgZG1hX3BhZ2UgKmRfcGFnZTsKKworCQkJLyogU2luY2UgdGhlIHBhZ2VzIGFyZSBkaXJlY3Rs eSBnb2luZyB0byB0aGUgaW51c2VfbGlzdAorCQkJICogd2hpY2ggaXMgc3RhY2sgYmFzZWQsIGxl dHMgdHJlYXQgaXQgYXMgYSBzdGFjay4KKwkJCSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShk X3BhZ2UsICZkX3BhZ2VzLCBwYWdlX2xpc3QpIHsKKwkJCQl0dG0tPnBhZ2VzW2ldID0gZF9wYWdl LT5wOworCQkJCXR0bS0+ZG1hX2FkZHJlc3NbaV0gPSBkX3BhZ2UtPmRtYTsKKwkJCQlpKys7CisJ CQl9CisJCQlsaXN0X3NwbGljZV90YWlsKCZkX3BhZ2VzLCAmdHRtLT5hbGxvY19saXN0KTsKKwor CQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7CisJCQlwb29sLT5u cGFnZXNfaW5fdXNlICs9IHBhZ2VzX25lZWQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZw b29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGRtYV9wYWdlICpk X3BhZ2U7CisJCQl1bnNpZ25lZCBjcGFnZXMgPSAwOworCisJCQkvKiBJZiB0aGVyZSBpcyBhbnkg cGFnZXMgaW4gdGhlIGxpc3QgcHV0IHRoZW0gYmFjayB0bworCQkJICogdGhlIHBvb2wuICovCisJ CQlwcl9lcnIoVFRNX1BGWAorCQkJICAgICAgICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGV4dHJh IHBhZ2VzICIKKwkJCSAgICAgICAiZm9yIGxhcmdlIHJlcXVlc3QuIiwKKwkJCQlwb29sLT5kZXZf bmFtZSk7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZF9wYWdlLCAmZF9wYWdlcywgcGFnZV9s aXN0KSB7CisJCQkJY3BhZ2VzKys7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+ bG9jaywgaXJxX2ZsYWdzKTsKKwkJCXBvb2wtPm5wYWdlc19mcmVlICs9IGNwYWdlczsKKwkJCS8q IFdlIGRvbid0IGNhcmUgYWJvdXQgb3JkZXJpbmcgb24gdGhlIGZyZWVfbGlzdC4gKi8KKwkJCWxp c3Rfc3BsaWNlKCZkX3BhZ2VzLCAmcG9vbC0+ZnJlZV9saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7CisJCQl0dG1fbWVtX2dsb2JhbF9mcmVl KG1lbV9nbG9iLCB0dG0tPm51bV9wYWdlcyAqIFBBR0VfU0laRSk7CisJCQlyZXR1cm4gLUVOT01F TTsKKwkJfQorCX0KKwl0dG1fbWVtX2dsb2JhbF9hY2NvdW50X3BhZ2VzKG1lbV9nbG9iLCB0dG0t PnBhZ2VzLCB0dG0tPm51bV9wYWdlcyk7CisKKwlpZiAodW5saWtlbHkodHRtLT5wYWdlX2ZsYWdz ICYgVFRNX1BBR0VfRkxBR19TV0FQUEVEKSkgeworCQlyID0gdHRtX3R0X3N3YXBpbih0dG0pOwor CQlpZiAodW5saWtlbHkociE9IDApKSB7CisJCQl0dG1fZG1hX3VucG9wdWxhdGUodHRtLCBkZXYp OworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisKKwl0dG0tPnN0YXRlID0gdHRfdW5ib3VuZDsKKwly ZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHR0bV9kbWFfcG9wdWxhdGUpOworCisvKiBH ZXQgZ29vZCBlc3RpbWF0aW9uIGhvdyBtYW55IHBhZ2VzIGFyZSBmcmVlIGluIHBvb2xzICovCitz dGF0aWMgaW50IHR0bV9kbWFfcG9vbF9nZXRfbnVtX3VudXNlZF9wYWdlcyh2b2lkKQoreworCXN0 cnVjdCBkZXZpY2VfcG9vbHMgKnA7CisJdW5zaWduZWQgdG90YWwgPSAwOworCisJbXV0ZXhfbG9j aygmX21hbmFnZXItPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJl9tYW5hZ2VyLT5w b29scywgcG9vbHMpIHsKKwkJaWYgKHApCisJCQl0b3RhbCArPSBwLT5wb29sLT5ucGFnZXNfZnJl ZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZfbWFuYWdlci0+bG9jayk7CisJcmV0dXJuIHRvdGFsOwor fQorCisvKiBQdXQgYWxsIHBhZ2VzIGluIHBhZ2VzIGxpc3QgdG8gY29ycmVjdCBwb29sIHRvIHdh aXQgZm9yIHJldXNlICovCit2b2lkIHR0bV9kbWFfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0 dG0sIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKmdsb2Ig PSB0dG0tPmdsb2ItPm1lbV9nbG9iOworCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKKwllbnVtIHBv b2xfdHlwZSB0eXBlOworCWJvb2wgaXNfY2FjaGVkID0gZmFsc2U7CisJdW5zaWduZWQgY291bnQg PSAwLCBpOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJdHRtX21lbV9nbG9iYWxfZnJl ZV9wYWdlcyhnbG9iLCB0dG0tPnBhZ2VzLCB0dG0tPm51bV9wYWdlcyk7CisKKwl0eXBlID0gdHRt X3RvX3R5cGUodHRtLT5wYWdlX2ZsYWdzLCB0dG0tPmNhY2hpbmdfc3RhdGUpOworCXBvb2wgPSB0 dG1fZG1hX2ZpbmRfcG9vbChkZXYsIHR5cGUpOworCWlmICghcG9vbCkgeworCQlXQVJOX09OKCFw b29sKTsKKwkJcmV0dXJuOworCX0KKwlpc19jYWNoZWQgPSAodHRtX2RtYV9maW5kX3Bvb2wocG9v bC0+ZGV2LAorCQkgICAgIHR0bV90b190eXBlKHR0bS0+cGFnZV9mbGFncywgdHRfY2FjaGVkKSkg PT0gcG9vbCk7CisKKwlpZiAodHRtLT5udW1fcGFnZXMgPiAxKSB7CisJCWRldl9kYmcocG9vbC0+ ZGV2LCAiKCVzOiVkKSBBdHRlbXB0aW5nIHRvICVzICVsZCBwYWdlcy5cbiIsCisJCQlwb29sLT5u YW1lLCBjdXJyZW50LT5waWQsCisJCQkoaXNfY2FjaGVkKSA/ICAiZGVzdHJveSIgOiAicmVjeWNs ZSIsIHR0bS0+bnVtX3BhZ2VzKTsKKwl9CisKKwkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4s IHNob3VsZCB3ZSBwYW5pYyBoZXJlID8qLworCWlmICh0dG1fZG1hX2NoZWNrX2FsbG9jX2xpc3Qo dHRtKSkgeworCQlwcl9lcnIoVFRNX1BGWCAiQ291bGQgbm90IGZyZWUgdGhlIG90aGVyIHR0bSB0 dCBwYWdlcyAlbGQhXG4iLAorCQkgICAgIHR0bS0+bnVtX3BhZ2VzKTsKKwkJcmV0dXJuOworCX0K KworCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCWNvdW50ID0g MDsKKwlwb29sLT5ucGFnZXNfaW5fdXNlIC09IHR0bS0+bnVtX3BhZ2VzOworCWlmIChpc19jYWNo ZWQpIHsKKwkJcG9vbC0+bmZyZWVzICs9IHR0bS0+bnVtX3BhZ2VzOworCX0gZWxzZSB7CisJCXBv b2wtPm5wYWdlc19mcmVlICs9IHR0bS0+bnVtX3BhZ2VzOworCQlsaXN0X3NwbGljZSgmdHRtLT5h bGxvY19saXN0LCAmcG9vbC0+ZnJlZV9saXN0KTsKKwkJaWYgKHBvb2wtPm5wYWdlc19mcmVlID4g X21hbmFnZXItPm9wdGlvbnMubWF4X3NpemUpIHsKKwkJCWNvdW50ID0gcG9vbC0+bnBhZ2VzX2Zy ZWUgLSBfbWFuYWdlci0+b3B0aW9ucy5tYXhfc2l6ZTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKGlzX2NhY2hlZCkgewor CQl0dG1fZG1hX3BhZ2VzX3B1dChwb29sLCAmdHRtLT5hbGxvY19saXN0LAorCQkJCSAgdHRtLT5w YWdlcywgdHRtLT5udW1fcGFnZXMpOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZ0dG0tPmFsbG9j X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKSB7CisJCXR0bS0+ cGFnZXNbaV0gPSBOVUxMOworCQl0dG0tPmRtYV9hZGRyZXNzW2ldID0gMDsKKwl9CisKKwkvKiBz aHJpbmsgcG9vbCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoY291bnQpCisJCXR0bV9kbWFfcGFnZV9w b29sX2ZyZWUocG9vbCwgY291bnQpOworCXR0bS0+c3RhdGUgPSB0dF91bnBvcHVsYXRlZDsKK30K K0VYUE9SVF9TWU1CT0xfR1BMKHR0bV9kbWFfdW5wb3B1bGF0ZSk7CisKKy8qKgorICogQ2FsbGJh Y2sgZm9yIG1tIHRvIHJlcXVlc3QgcG9vbCB0byByZWR1Y2UgbnVtYmVyIG9mIHBhZ2UgaGVsZC4K KyAqLworc3RhdGljIGludCB0dG1fZG1hX3Bvb2xfbW1fc2hyaW5rKHN0cnVjdCBzaHJpbmtlciAq c2hyaW5rLAorCQkJCSAgc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwlzdGF0aWMgYXRv bWljX3Qgc3RhcnRfcG9vbCA9IEFUT01JQ19JTklUKDApOworCXVuc2lnbmVkIGlkeCA9IDA7CisJ dW5zaWduZWQgcG9vbF9vZmZzZXQgPSBhdG9taWNfYWRkX3JldHVybigxLCAmc3RhcnRfcG9vbCk7 CisJdW5zaWduZWQgc2hyaW5rX3BhZ2VzID0gc2MtPm5yX3RvX3NjYW47CisJc3RydWN0IGRldmlj ZV9wb29scyAqcDsKKworCWlmIChsaXN0X2VtcHR5KCZfbWFuYWdlci0+cG9vbHMpKQorCQlyZXR1 cm4gMDsKKworCW11dGV4X2xvY2soJl9tYW5hZ2VyLT5sb2NrKTsKKwlwb29sX29mZnNldCA9IHBv b2xfb2Zmc2V0ICUgX21hbmFnZXItPm5wb29sczsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZf bWFuYWdlci0+cG9vbHMsIHBvb2xzKSB7CisJCXVuc2lnbmVkIG5yX2ZyZWU7CisKKwkJaWYgKCFw ICYmICFwLT5kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHNocmlua19wYWdlcyA9PSAwKQorCQkJ YnJlYWs7CisJCS8qIERvIGl0IGluIHJvdW5kLXJvYmluIGZhc2hpb24uICovCisJCWlmICgrK2lk eCA8IHBvb2xfb2Zmc2V0KQorCQkJY29udGludWU7CisJCW5yX2ZyZWUgPSBzaHJpbmtfcGFnZXM7 CisJCXNocmlua19wYWdlcyA9IHR0bV9kbWFfcGFnZV9wb29sX2ZyZWUocC0+cG9vbCwgbnJfZnJl ZSk7CisJCXByX2RlYnVnKCIlczogKCVzOiVkKSBBc2tlZCB0byBzaHJpbmsgJWQsIGhhdmUgJWQg bW9yZSB0byBnb1xuIiwKKwkJCXAtPnBvb2wtPmRldl9uYW1lLCBwLT5wb29sLT5uYW1lLCBjdXJy ZW50LT5waWQsIG5yX2ZyZWUsCisJCQlzaHJpbmtfcGFnZXMpOworCX0KKwltdXRleF91bmxvY2so Jl9tYW5hZ2VyLT5sb2NrKTsKKwkvKiByZXR1cm4gZXN0aW1hdGVkIG51bWJlciBvZiB1bnVzZWQg cGFnZXMgaW4gcG9vbCAqLworCXJldHVybiB0dG1fZG1hX3Bvb2xfZ2V0X251bV91bnVzZWRfcGFn ZXMoKTsKK30KKworc3RhdGljIHZvaWQgdHRtX2RtYV9wb29sX21tX3Nocmlua19pbml0KHN0cnVj dCB0dG1fcG9vbF9tYW5hZ2VyICptYW5hZ2VyKQoreworCW1hbmFnZXItPm1tX3Nocmluay5zaHJp bmsgPSAmdHRtX2RtYV9wb29sX21tX3NocmluazsKKwltYW5hZ2VyLT5tbV9zaHJpbmsuc2Vla3Mg PSAxOworCXJlZ2lzdGVyX3Nocmlua2VyKCZtYW5hZ2VyLT5tbV9zaHJpbmspOworfQorCitzdGF0 aWMgdm9pZCB0dG1fZG1hX3Bvb2xfbW1fc2hyaW5rX2Zpbmkoc3RydWN0IHR0bV9wb29sX21hbmFn ZXIgKm1hbmFnZXIpCit7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmbWFuYWdlci0+bW1fc2hyaW5r KTsKK30KKworaW50IHR0bV9kbWFfcGFnZV9hbGxvY19pbml0KHN0cnVjdCB0dG1fbWVtX2dsb2Jh bCAqZ2xvYiwgdW5zaWduZWQgbWF4X3BhZ2VzKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJ V0FSTl9PTihfbWFuYWdlcik7CisKKwlwcmludGsoS0VSTl9JTkZPIFRUTV9QRlggIkluaXRpYWxp emluZyBETUEgcG9vbCBhbGxvY2F0b3IuXG4iKTsKKworCV9tYW5hZ2VyID0ga3phbGxvYyhzaXpl b2YoKl9tYW5hZ2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFfbWFuYWdlcikKKwkJZ290byBlcnJf bWFuYWdlcjsKKworCW11dGV4X2luaXQoJl9tYW5hZ2VyLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVB RCgmX21hbmFnZXItPnBvb2xzKTsKKworCV9tYW5hZ2VyLT5vcHRpb25zLm1heF9zaXplID0gbWF4 X3BhZ2VzOworCV9tYW5hZ2VyLT5vcHRpb25zLnNtYWxsID0gU01BTExfQUxMT0NBVElPTjsKKwlf bWFuYWdlci0+b3B0aW9ucy5hbGxvY19zaXplID0gTlVNX1BBR0VTX1RPX0FMTE9DOworCisJLyog VGhpcyB0YWtlcyBjYXJlIG9mIGF1dG8tZnJlZWluZyB0aGUgX21hbmFnZXIgKi8KKwlyZXQgPSBr b2JqZWN0X2luaXRfYW5kX2FkZCgmX21hbmFnZXItPmtvYmosICZ0dG1fcG9vbF9rb2JqX3R5cGUs CisJCQkJICAgJmdsb2ItPmtvYmosICJkbWFfcG9vbCIpOworCWlmICh1bmxpa2VseShyZXQgIT0g MCkpIHsKKwkJa29iamVjdF9wdXQoJl9tYW5hZ2VyLT5rb2JqKTsKKwkJZ290byBlcnI7CisJfQor CXR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfaW5pdChfbWFuYWdlcik7CisJcmV0dXJuIDA7CitlcnJf bWFuYWdlcjoKKwlrZnJlZShfbWFuYWdlcik7CisJX21hbmFnZXIgPSBOVUxMOworZXJyOgorCXJl dHVybiByZXQ7Cit9CisKK3ZvaWQgdHRtX2RtYV9wYWdlX2FsbG9jX2Zpbmkodm9pZCkKK3sKKwlz dHJ1Y3QgZGV2aWNlX3Bvb2xzICpwLCAqdDsKKworCXByaW50ayhLRVJOX0lORk8gVFRNX1BGWCAi RmluYWxpemluZyBETUEgcG9vbCBhbGxvY2F0b3IuXG4iKTsKKwl0dG1fZG1hX3Bvb2xfbW1fc2hy aW5rX2ZpbmkoX21hbmFnZXIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2Uo cCwgdCwgJl9tYW5hZ2VyLT5wb29scywgcG9vbHMpIHsKKwkJZGV2X2RiZyhwLT5kZXYsICIoJXM6 JWQpIEZyZWVpbmcuXG4iLCBwLT5wb29sLT5uYW1lLAorCQkJY3VycmVudC0+cGlkKTsKKwkJV0FS Tl9PTihkZXZyZXNfZGVzdHJveShwLT5kZXYsIHR0bV9kbWFfcG9vbF9yZWxlYXNlLAorCQkJdHRt X2RtYV9wb29sX21hdGNoLCBwLT5wb29sKSk7CisJCXR0bV9kbWFfZnJlZV9wb29sKHAtPmRldiwg cC0+cG9vbC0+dHlwZSk7CisJfQorCWtvYmplY3RfcHV0KCZfbWFuYWdlci0+a29iaik7CisJX21h bmFnZXIgPSBOVUxMOworfQorCitpbnQgdHRtX2RtYV9wYWdlX2FsbG9jX2RlYnVnZnMoc3RydWN0 IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2VfcG9vbHMgKnA7CisJ c3RydWN0IGRtYV9wb29sICpwb29sID0gTlVMTDsKKwljaGFyICpoW10gPSB7InBvb2wiLCAicmVm aWxscyIsICJwYWdlcyBmcmVlZCIsICJpbnVzZSIsICJhdmFpbGFibGUiLAorCQkgICAgICJuYW1l IiwgInZpcnQiLCAiYnVzYWRkciJ9OworCisJaWYgKCFfbWFuYWdlcikgeworCQlzZXFfcHJpbnRm KG0sICJObyBwb29sIGFsbG9jYXRvciBydW5uaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKwlz ZXFfcHJpbnRmKG0sICIlMTNzICUxMnMgJTEzcyAlOHMgJThzICU4c1xuIiwKKwkJICAgaFswXSwg aFsxXSwgaFsyXSwgaFszXSwgaFs0XSwgaFs1XSk7CisJbXV0ZXhfbG9jaygmX21hbmFnZXItPmxv Y2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJl9tYW5hZ2VyLT5wb29scywgcG9vbHMpIHsK KwkJc3RydWN0IGRldmljZSAqZGV2ID0gcC0+ZGV2OworCQlpZiAoIWRldikKKwkJCWNvbnRpbnVl OworCQlwb29sID0gcC0+cG9vbDsKKwkJc2VxX3ByaW50ZihtLCAiJTEzcyAlMTJsZCAlMTNsZCAl OGQgJThkICU4c1xuIiwKKwkJCQlwb29sLT5uYW1lLCBwb29sLT5ucmVmaWxscywKKwkJCQlwb29s LT5uZnJlZXMsIHBvb2wtPm5wYWdlc19pbl91c2UsCisJCQkJcG9vbC0+bnBhZ2VzX2ZyZWUsCisJ CQkJcG9vbC0+ZGV2X25hbWUpOworCX0KKwltdXRleF91bmxvY2soJl9tYW5hZ2VyLT5sb2NrKTsK KwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHR0bV9kbWFfcGFnZV9hbGxvY19kZWJ1 Z2ZzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmggYi9pbmNs dWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCmluZGV4IGFlMDZlNDIuLmJlZWY5YWIgMTAwNjQ0 Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9kcm0v dHRtL3R0bV9ib19kcml2ZXIuaApAQCAtMTA0LDYgKzEwNCw3IEBAIGVudW0gdHRtX2NhY2hpbmdf c3RhdGUgewogICogQGNhY2hpbmdfc3RhdGU6IFRoZSBjdXJyZW50IGNhY2hpbmcgc3RhdGUgb2Yg dGhlIHBhZ2VzLgogICogQHN0YXRlOiBUaGUgY3VycmVudCBiaW5kaW5nIHN0YXRlIG9mIHRoZSBw YWdlcy4KICAqIEBkbWFfYWRkcmVzczogVGhlIERNQSAoYnVzKSBhZGRyZXNzZXMgb2YgdGhlIHBh Z2VzIChpZiBUVE1fUEFHRV9GTEFHX0RNQTMyKQorICogQGFsbG9jX2xpc3Q6IHVzZWQgYnkgc29t ZSBwYWdlIGFsbG9jYXRpb24gYmFja2VuZAogICoKICAqIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgaG9s ZGluZyB0aGUgcGFnZXMsIGNhY2hpbmctIGFuZCBhcGVydHVyZSBiaW5kaW5nCiAgKiBzdGF0dXMg Zm9yIGEgYnVmZmVyIG9iamVjdCB0aGF0IGlzbid0IGJhY2tlZCBieSBmaXhlZCAoVlJBTSAvIEFH UCkKQEAgLTEyNyw2ICsxMjgsNyBAQCBzdHJ1Y3QgdHRtX3R0IHsKIAkJdHRfdW5wb3B1bGF0ZWQs CiAJfSBzdGF0ZTsKIAlkbWFfYWRkcl90ICpkbWFfYWRkcmVzczsKKwlzdHJ1Y3QgbGlzdF9oZWFk IGFsbG9jX2xpc3Q7CiB9OwogCiAjZGVmaW5lIFRUTV9NRU1UWVBFX0ZMQUdfRklYRUQgICAgICAg ICAoMSA8PCAwKQkvKiBGaXhlZCAob24tY2FyZCkgUENJIG1lbW9yeSAqLwpkaWZmIC0tZ2l0IGEv aW5jbHVkZS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jLmggYi9pbmNsdWRlL2RybS90dG0vdHRtX3Bh Z2VfYWxsb2MuaAppbmRleCAxOGEyZDZiLi5mMTI3NjM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Ry bS90dG0vdHRtX3BhZ2VfYWxsb2MuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX3BhZ2VfYWxs b2MuaApAQCAtODgsNCArODgsNDAgQEAgZXh0ZXJuIHZvaWQgdHRtX3BhZ2VfYWxsb2NfdHRtX3R0 X3VucG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtKTsKICAqIE91dHB1dCB0aGUgc3RhdGUgb2Yg cG9vbHMgdG8gZGVidWdmcyBmaWxlCiAgKi8KIGV4dGVybiBpbnQgdHRtX3BhZ2VfYWxsb2NfZGVi dWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworCisKKyNpZmRlZiBDT05GSUdf U1dJT1RMQgorLyoqCisgKiBJbml0aWFsaXplIHBvb2wgYWxsb2NhdG9yLgorICovCitpbnQgdHRt X2RtYV9wYWdlX2FsbG9jX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLCB1bnNpZ25l ZCBtYXhfcGFnZXMpOworCisvKioKKyAqIEZyZWUgcG9vbCBhbGxvY2F0b3IuCisgKi8KK3ZvaWQg dHRtX2RtYV9wYWdlX2FsbG9jX2Zpbmkodm9pZCk7CisKKy8qKgorICogT3V0cHV0IHRoZSBzdGF0 ZSBvZiBwb29scyB0byBkZWJ1Z2ZzIGZpbGUKKyAqLworZXh0ZXJuIGludCB0dG1fZG1hX3BhZ2Vf YWxsb2NfZGVidWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworCitpbnQgdHRt X2RtYV9wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0dG0sIHN0cnVjdCBkZXZpY2UgKmRldik7Citl eHRlcm4gdm9pZCB0dG1fZG1hX3VucG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1Y3Qg ZGV2aWNlICpkZXYpOworCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgdHRtX2RtYV9wYWdlX2Fs bG9jX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLAorCQkJCQkgIHVuc2lnbmVkIG1h eF9wYWdlcykKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHR0 bV9kbWFfcGFnZV9hbGxvY19maW5pKHZvaWQpIHsgcmV0dXJuOyB9CisKK3N0YXRpYyBpbmxpbmUg aW50IHR0bV9kbWFfcGFnZV9hbGxvY19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAq ZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAjZW5kaWYKLS0gCjEuNy43LjEKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBt YWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==