Return-Path: MIME-Version: 1.0 Date: Mon, 11 Jan 2010 15:08:04 -0200 Message-ID: Subject: [RFC] HFP support into oFono and BlueZ From: "Gustavo F. Padovan" To: linux-bluetooth , ofono@ofono.org, zhenhua.zhang@intel.com Content-Type: multipart/mixed; boundary=000e0cd6ad149b5158047ce6941f Sender: linux-bluetooth-owner@vger.kernel.org List-ID: --000e0cd6ad149b5158047ce6941f Content-Type: text/plain; charset=UTF-8 Hi, These patches implement the new API for the Audio Gateway in BlueZ. It follows the last version of the HandsfreeGateway and HandsfreeAgent Intefaces API. The first two patches is for BlueZ and the other for oFono. You can test it with using enable-modem and test-voicecall scripts into the test dir of oFono. Feel free to test it and send me your comments. We have some bugs yet. The audio part is not working yet. We are going to work on pulseaudio this week to get this done soon. Regards, -- Gustavo F. Padovan ProFUSION embedded systems - http://profusion.mobi --000e0cd6ad149b5158047ce6941f Content-Type: application/octet-stream; name="0001-clean-up-audio-gateway.c.patch" Content-Disposition: attachment; filename="0001-clean-up-audio-gateway.c.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g4bi8xrk0 RnJvbSA2MWRjZGNkMmI1MWNjNjBhN2U0MjRkYmI0NmYwNzNiZjY2NjA5MWJiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHdXN0YXZvIEYuIFBhZG92YW4gPHBhZG92YW5AcHJvZnVzaW9u Lm1vYmk+CkRhdGU6IEZyaSwgNiBOb3YgMjAwOSAxODowODo1OCAtMDIwMApTdWJqZWN0OiBbUEFU Q0ggMS8yXSBjbGVhbiB1cCBhdWRpby9nYXRld2F5LmMKCnJlbW92ZSBhbGwgY29kZSByZWxhdGVk IHRvIHRoZSBBVCBlbmdpbmUKLS0tCiBhdWRpby9nYXRld2F5LmMgfCAgNzYwICstLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZXMgY2hh bmdlZCwgMSBpbnNlcnRpb25zKCspLCA3NTkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXVk aW8vZ2F0ZXdheS5jIGIvYXVkaW8vZ2F0ZXdheS5jCmluZGV4IGExYzFlYTIuLjNkYzA5ZmYgMTAw NjQ0Ci0tLSBhL2F1ZGlvL2dhdGV3YXkuYworKysgYi9hdWRpby9nYXRld2F5LmMKQEAgLTUzLDUy ICs1Myw2IEBACiAjaW5jbHVkZSAiZGJ1cy1jb21tb24uaCIKIAogI2RlZmluZSBSRkNPTU1fQlVG X1NJWkUgMjU2Ci0vKiBub3QtbW9yZS10aGVuLTE2IGRlZmluZWQgYnkgR1NNICsgMSBmb3IgTlVM TCArIHBhZGRpbmcgKi8KLSNkZWZpbmUgQUdfSU5ESUNBVE9SX0RFU0NSX1NJWkUgMjAKLSNkZWZp bmUgQUdfQ0FMTEVSX05VTV9TSVpFIDY0CS8qIHNpemUgb2YgbnVtYmVyICsgdHlwZSAqLwotCi0v KiBjb21tYW5kcyAqLwotI2RlZmluZSBBR19GRUFUVVJFUyAiQVQrQlJTRj0yNlxyIiAgICAgLyog PSAweDdGID0gQWxsIGZlYXR1cmVzIHN1cHBvcnRlZCAqLwotI2RlZmluZSBBR19JTkRJQ0FUT1JT X1NVUFAgIkFUK0NJTkQ9P1xyIgotI2RlZmluZSBBR19JTkRJQ0FUT1JTX1ZBTCAiQVQrQ0lORD9c ciIKLSNkZWZpbmUgQUdfSU5ESUNBVE9SU19FTkFCTEUgIkFUK0NNRVI9MywwLDAsMVxyIgotI2Rl ZmluZSBBR19IT0xEX01QVFlfU1VQUCAiQVQrQ0hMRD0/XHIiCi0jZGVmaW5lIEFHX0NBTExFUl9J REVOVF9FTkFCTEUgIkFUK0NMSVA9MVxyIgotI2RlZmluZSBBR19DQVJSSUVSX0ZPUk1BVCAiQVQr Q09QUz0zLDBcciIKLSNkZWZpbmUgQUdfRVhURU5ERURfUkVTVUxUX0NPREUgIkFUK0NNRUU9MVxy IgotCi0jZGVmaW5lIEFHX0ZFQVRVUkVfM1dBWSAweDEKLSNkZWZpbmUgQUdfRkVBVFVSRV9FWFRF TkRFRF9SRVNfQ09ERSAweDEwMAotLyogSG9sZCBhbmQgbXVsdGlwYXJ5IEFHIGZlYXR1cmVzLgot ICogQ29tbWVudHMgYmVsb3cgYXJlIGNvcGllZCBmcm9tIGhhbmRzLWZyZWUgc3BlYyBmb3IgcmVm ZXJlbmNlICovCi0vKiBSZWxlYXNlcyBhbGwgaGVsZCBjYWxscyBvciBzZXRzIFVzZXIgRGV0ZXJt aW5lZCBVc2VyIEJ1c3kgKFVEVUIpCi0gKiBmb3IgYSB3YWl0aW5nIGNhbGwgKi8KLSNkZWZpbmUg QUdfQ0hMRF8wIDB4MDEKLS8qIFJlbGVhc2VzIGFsbCBhY3RpdmUgY2FsbHMgKGlmIGFueSBleGlz dCkgYW5kIGFjY2VwdHMgdGhlIG90aGVyCi0gKiAoaGVsZCBvciB3YWl0aW5nKSBjYWxsICovCi0j ZGVmaW5lIEFHX0NITERfMSAweDAyCi0vKiBSZWxlYXNlcyBzcGVjaWZpZWQgYWN0aXZlIGNhbGwg b25seSA8eD4gKi8KLSNkZWZpbmUgQUdfQ0hMRF8xeCAweDA0Ci0vKiBQbGFjZXMgYWxsIGFjdGl2 ZSBjYWxscyAoaWYgYW55IGV4aXN0KSBvbiBob2xkIGFuZCBhY2NlcHRzIHRoZSBvdGhlcgotICog KGhlbGQgb3Igd2FpdGluZykgY2FsbCAqLwotI2RlZmluZSBBR19DSExEXzIgMHgwOAotLyogUmVx dWVzdCBwcml2YXRlIGNvbnN1bHRhdGlvbiBtb2RlIHdpdGggc3BlY2lmaWVkIGNhbGwgPHg+IChQ bGFjZSBhbGwKLSAqIGNhbGxzIG9uIGhvbGQgRVhDRVBUIHRoZSBjYWxsIDx4PikgKi8KLSNkZWZp bmUgQUdfQ0hMRF8yeCAweDEwCi0vKiBBZGRzIGEgaGVsZCBjYWxsIHRvIHRoZSBjb252ZXJzYXRp b24gKi8KLSNkZWZpbmUgQUdfQ0hMRF8zIDB4MjAKLS8qIENvbm5lY3RzIHRoZSB0d28gY2FsbHMg YW5kIGRpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscwotICogKEV4cGxp Y2l0IENhbGwgVHJhbnNmZXIpLiBTdXBwb3J0IGZvciB0aGlzIHZhbHVlIGFuZCBpdHMgYXNzb2Np YXRlZAotICogZnVuY3Rpb25hbGl0eSBpcyBvcHRpb25hbCBmb3IgdGhlIEhGLiAqLwotI2RlZmlu ZSBBR19DSExEXzQgMHg0MAotCi0jZGVmaW5lIE9LX1JFU1BPTlNFICJcclxuT0tcclxuIgotI2Rl ZmluZSBFUlJPUl9SRVNQT05TRSAiXHJcbkVSUk9SXHJcbiIKLQotc3RydWN0IGluZGljYXRvciB7 Ci0JZ2NoYXIgZGVzY3JbQUdfSU5ESUNBVE9SX0RFU0NSX1NJWkVdOwotCWdpbnQgdmFsdWU7Ci19 OwogCiBzdHJ1Y3QgZ2F0ZXdheSB7CiAJZ2F0ZXdheV9zdGF0ZV90IHN0YXRlOwpAQCAtMTA4LDM4 NyArNjIsMTAgQEAgc3RydWN0IGdhdGV3YXkgewogCWdhdGV3YXlfc3RyZWFtX2NiX3Qgc2NvX3N0 YXJ0X2NiOwogCXZvaWQgKnNjb19zdGFydF9jYl9kYXRhOwogCURCdXNNZXNzYWdlICpjb25uZWN0 X21lc3NhZ2U7Ci0JZ3VpbnQgYWdfZmVhdHVyZXM7Ci0JZ3VpbnQgaG9sZF9tdWx0aXBhcnR5X2Zl YXR1cmVzOwotCUdTTGlzdCAqaW5kaWVzOwotCWdib29sZWFuIGlzX2RpYWxpbmc7Ci0JZ2Jvb2xl YW4gY2FsbF9hY3RpdmU7Ci0KLQlpbnQgc3BfZ2FpbjsKLQlpbnQgbWljX2dhaW47CiB9OwogCi1z dGF0aWMgZ2Jvb2xlYW4gcmZjb21tX2FnX2RhdGFfY2IoR0lPQ2hhbm5lbCAqY2hhbiwgR0lPQ29u ZGl0aW9uIGNvbmQsCi0JCQkJCXN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSk7Ci0KIGludCBn YXRld2F5X2Nsb3NlKHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyB2b2lk IHJmY29tbV9zdGFydF93YXRjaChzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0 IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5OwotCi0JZ3ctPnJmY29tbV93YXRjaF9pZCA9IGdf aW9fYWRkX3dhdGNoKGd3LT5yZmNvbW0sCi0JCQlHX0lPX0lOIHwgR19JT19FUlIgfCBHX0lPX0hV UCB8IEdfSU9fTlZBTCwKLQkJCShHSU9GdW5jKSByZmNvbW1fYWdfZGF0YV9jYiwgZGV2KTsKLX0K LQotc3RhdGljIHZvaWQgcmZjb21tX3N0b3Bfd2F0Y2goc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 KQotewotCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+Z2F0ZXdheTsKLQotCWdfc291cmNlX3Jl bW92ZShndy0+cmZjb21tX3dhdGNoX2lkKTsKLX0KLQotc3RhdGljIGdib29sZWFuIGlvX2NoYW5u ZWxfd3JpdGVfYWxsKEdJT0NoYW5uZWwgKmlvLCBnY2hhciAqZGF0YSwKLQkJCQkJZ3NpemUgY291 bnQpCi17Ci0JZ3NpemUgd3JpdHRlbiA9IDA7Ci0JR0lPU3RhdHVzIHN0YXR1czsKLQotCXdoaWxl IChjb3VudCA+IDApIHsKLQkJc3RhdHVzID0gZ19pb19jaGFubmVsX3dyaXRlX2NoYXJzKGlvLCBk YXRhLCBjb3VudCwgJndyaXR0ZW4sCi0JCQkJCQlOVUxMKTsKLQkJaWYgKHN0YXR1cyAhPSBHX0lP X1NUQVRVU19OT1JNQUwpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJZGF0YSArPSB3cml0dGVuOwot CQljb3VudCAtPSB3cml0dGVuOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyogaXQncyB3b3J0 aCB0byBtZW50aW9uIHRoYXQgZGF0YSBhbmQgcmVzcG9uc2UgY291bGQgYmUgdGhlIHNhbWUgcG9p bnRlcnMgKi8KLXN0YXRpYyBnYm9vbGVhbiByZmNvbW1fc2VuZF9hbmRfcmVhZChzdHJ1Y3QgZ2F0 ZXdheSAqZ3csIGdjaGFyICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZ2NoYXIgKnJlc3BvbnNlLCBnc2l6ZSBjb3VudCkKLXsKLQlHSU9DaGFubmVsICpyZmNvbW0g PSBndy0+cmZjb21tOwotCWdzaXplIHJlYWQgPSAwOwotCWdib29sZWFuIGdvdF9vayA9IEZBTFNF OwotCWdib29sZWFuIGdvdF9lcnJvciA9IEZBTFNFOwotCWdjaGFyICpyZXNwX2J1ZiA9IHJlc3Bv bnNlOwotCWdzaXplIHRvcmVhZCA9IFJGQ09NTV9CVUZfU0laRSAtIDE7Ci0JR0lPU3RhdHVzIHN0 YXR1czsKLQotCWlmICghaW9fY2hhbm5lbF93cml0ZV9hbGwocmZjb21tLCBkYXRhLCBjb3VudCkp Ci0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlICghKGdvdF9vayB8fCBnb3RfZXJyb3IpKSB7Ci0J CXN0YXR1cyA9IGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzKHJmY29tbSwgcmVzcF9idWYsIHRvcmVh ZCwKLQkJCQkJCSZyZWFkLCBOVUxMKTsKLQkJaWYgKHN0YXR1cyA9PSBHX0lPX1NUQVRVU19OT1JN QUwpCi0JCQlyZXNwX2J1ZltyZWFkXSA9ICdcMCc7Ci0JCWVsc2UgewotCQkJZGVidWcoInJmY29t bV9zZW5kX2FuZF9yZWFkKCk6ICVtIik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJZ290X29r ID0gTlVMTCAhPSBzdHJzdHIocmVzcF9idWYsIE9LX1JFU1BPTlNFKTsKLQkJZ290X2Vycm9yID0g TlVMTCAhPSBzdHJzdHIocmVzcF9idWYsIEVSUk9SX1JFU1BPTlNFKTsKLQkJcmVzcF9idWYgKz0g cmVhZDsKLQkJdG9yZWFkIC09IHJlYWQ7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0vKiBnZXQg PGRlc2NyPiBmcm9tIHRoZSBuYW1lczogKDxkZXNjcj4sICg8dmFsdWVzPikpLCAoPGRlc2NyPiwg KDx2YWx1ZXM+KSkKLSAqIC4uLiAqLwotc3RhdGljIEdTTGlzdCAqcGFyc2VfaW5kaWNhdG9yX25h bWVzKGdjaGFyICpuYW1lcywgR1NMaXN0ICppbmRpZXMpCi17Ci0JZ2NoYXIgKmN1cnJlbnQgPSBu YW1lcyAtIDE7Ci0JR1NMaXN0ICpyZXN1bHQgPSBpbmRpZXM7Ci0JZ2NoYXIgKm5leHQ7Ci0Jc3Ry dWN0IGluZGljYXRvciAqaW5kOwotCi0Jd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewotCQljdXJy ZW50ICs9IDI7Ci0JCW5leHQgPSBzdHJzdHIoY3VycmVudCwgIiwoIik7Ci0JCWluZCA9IGdfc2xp Y2VfbmV3KHN0cnVjdCBpbmRpY2F0b3IpOwotCQlzdHJuY3B5KGluZC0+ZGVzY3IsIGN1cnJlbnQs IDIwKTsKLQkJaW5kLT5kZXNjclsoaW50cHRyX3QpIG5leHQgLSAoaW50cHRyX3QpIGN1cnJlbnRd ID0gJ1wwJzsKLQkJcmVzdWx0ID0gZ19zbGlzdF9hcHBlbmQocmVzdWx0LCAoZ3BvaW50ZXIpIGlu ZCk7Ci0JCWN1cnJlbnQgPSBzdHJzdHIobmV4dCArIDEsICIsKCIpOwotCX0KLQlyZXR1cm4gcmVz dWx0OwotfQotCi0vKiBnZXQgdmFsdWVzIGZyb20gPHZhbDA+LDx2YWwxPiwuLi4gKi8KLXN0YXRp YyBHU0xpc3QgKnBhcnNlX2luZGljYXRvcl92YWx1ZXMoZ2NoYXIgKnZhbHVlcywgR1NMaXN0ICpp bmRpZXMpCi17Ci0JZ2ludCB2YWw7Ci0JZ2NoYXIgKmN1cnJlbnQgPSB2YWx1ZXMgLSAxOwotCUdT TGlzdCAqcnVubmVyID0gaW5kaWVzOwotCXN0cnVjdCBpbmRpY2F0b3IgKmluZDsKLQotCXdoaWxl IChjdXJyZW50ICE9IE5VTEwpIHsKLQkJY3VycmVudCArPSAxOwotCQlzc2NhbmYoY3VycmVudCwg IiVkIiwgJnZhbCk7Ci0JCWN1cnJlbnQgPSBzdHJjaHIoY3VycmVudCwgJywnKTsKLQkJaW5kID0g Z19zbGlzdF9udGhfZGF0YShydW5uZXIsIDApOwotCQlpbmQtPnZhbHVlID0gdmFsOwotCQlydW5u ZXIgPSBnX3NsaXN0X25leHQocnVubmVyKTsKLQl9Ci0JcmV0dXJuIGluZGllczsKLX0KLQotLyog Z2V0IHZhbHVlcyBmcm9tIDx2YWwwPiw8dmFsMT4sLi4uICovCi1zdGF0aWMgZ3VpbnQgZ2V0X2hv bGRfbXB0eV9mZWF0dXJlcyhnY2hhciAqZmVhdHVyZXMpCi17Ci0JZ3VpbnQgcmVzdWx0ID0gMDsK LQotCWlmIChzdHJzdHIoZmVhdHVyZXMsICIwIikpCi0JCXJlc3VsdCB8PSBBR19DSExEXzA7Ci0K LQlpZiAoc3Ryc3RyKGZlYXR1cmVzLCAiMSIpKQotCQlyZXN1bHQgfD0gQUdfQ0hMRF8xOwotCi0J aWYgKHN0cnN0cihmZWF0dXJlcywgIjF4IikpCi0JCXJlc3VsdCB8PSBBR19DSExEXzF4OwotCi0J aWYgKHN0cnN0cihmZWF0dXJlcywgIjIiKSkKLQkJcmVzdWx0IHw9IEFHX0NITERfMjsKLQotCWlm IChzdHJzdHIoZmVhdHVyZXMsICIyeCIpKQotCQlyZXN1bHQgfD0gQUdfQ0hMRF8yeDsKLQotCWlm IChzdHJzdHIoZmVhdHVyZXMsICIzIikpCi0JCXJlc3VsdCB8PSBBR19DSExEXzM7Ci0KLQlpZiAo c3Ryc3RyKGZlYXR1cmVzLCAiNCIpKQotCQlyZXN1bHQgfD0gQUdfQ0hMRF80OwotCi0JcmV0dXJu IHJlc3VsdDsKLX0KLQotc3RhdGljIGdib29sZWFuIGVzdGFibGlzaF9zZXJ2aWNlX2xldmVsX2Nv bm4oc3RydWN0IGdhdGV3YXkgKmd3KQotewotCWdjaGFyIGJ1ZltSRkNPTU1fQlVGX1NJWkVdOwot CWdib29sZWFuIHJlczsKLQotCWRlYnVnKCJhdCB0aGUgYmVnaW4gb2YgZXN0YWJsaXNoX3NlcnZp Y2VfbGV2ZWxfY29ubigpIik7Ci0JcmVzID0gcmZjb21tX3NlbmRfYW5kX3JlYWQoZ3csIEFHX0ZF QVRVUkVTLCBidWYsCi0JCQkJc2l6ZW9mKEFHX0ZFQVRVUkVTKSAtIDEpOwotCWlmICghcmVzIHx8 IHNzY2FuZihidWYsICJcclxuK0JSU0Y6JWQiLCAmZ3ctPmFnX2ZlYXR1cmVzKSAhPSAxKQotCQly ZXR1cm4gRkFMU0U7Ci0KLQlkZWJ1ZygiZmVhdHVyZXMgYXJlIDB4JVgiLCBndy0+YWdfZmVhdHVy ZXMpOwotCXJlcyA9IHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBBR19JTkRJQ0FUT1JTX1NVUFAs IGJ1ZiwKLQkJCQlzaXplb2YoQUdfSU5ESUNBVE9SU19TVVBQKSAtIDEpOwotCWlmICghcmVzIHx8 ICFzdHJzdHIoYnVmLCAiK0NJTkQ6IikpCi0JCXJldHVybiBGQUxTRTsKLQotCWd3LT5pbmRpZXMg PSBwYXJzZV9pbmRpY2F0b3JfbmFtZXMoc3RyY2hyKGJ1ZiwgJygnKSwgTlVMTCk7Ci0KLQlyZXMg PSByZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfSU5ESUNBVE9SU19WQUwsIGJ1ZiwKLQkJc2l6 ZW9mKEFHX0lORElDQVRPUlNfVkFMKSAtIDEpOwotCWlmICghcmVzIHx8ICFzdHJzdHIoYnVmLCAi K0NJTkQ6IikpCi0JCXJldHVybiBGQUxTRTsKLQotCWd3LT5pbmRpZXMgPSBwYXJzZV9pbmRpY2F0 b3JfdmFsdWVzKHN0cmNocihidWYsICc6JykgKyAxLCBndy0+aW5kaWVzKTsKLQotCXJlcyA9IHJm Y29tbV9zZW5kX2FuZF9yZWFkKGd3LCBBR19JTkRJQ0FUT1JTX0VOQUJMRSwgYnVmLAotCQkJCXNp emVvZihBR19JTkRJQ0FUT1JTX0VOQUJMRSkgLSAxKTsKLQlpZiAoIXJlcyB8fCAhc3Ryc3RyKGJ1 ZiwgIk9LIikpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmICgoZ3ctPmFnX2ZlYXR1cmVzICYgQUdf RkVBVFVSRV8zV0FZKSAhPSAwKSB7Ci0JCXJlcyA9IHJmY29tbV9zZW5kX2FuZF9yZWFkKGd3LCBB R19IT0xEX01QVFlfU1VQUCwgYnVmLAotCQkJCXNpemVvZihBR19IT0xEX01QVFlfU1VQUCkgLSAx KTsKLQkJaWYgKCFyZXMgfHwgIXN0cnN0cihidWYsICIrQ0hMRDoiKSkgewotCQkJZ19zbGljZV9m cmVlMShSRkNPTU1fQlVGX1NJWkUsIGJ1Zik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJZ3ct PmhvbGRfbXVsdGlwYXJ0eV9mZWF0dXJlcyA9IGdldF9ob2xkX21wdHlfZmVhdHVyZXMoCi0JCQkJ CQkJc3RyY2hyKGJ1ZiwgJygnKSk7Ci0KLQl9IGVsc2UKLQkJZ3ctPmhvbGRfbXVsdGlwYXJ0eV9m ZWF0dXJlcyA9IDA7Ci0KLQlkZWJ1ZygiU2VydmljZSBsYXllciBjb25uZWN0aW9uIHN1Y2Nlc3Nm dWxseSBlc3RhYmxpc2hlZCEiKTsKLQlyZmNvbW1fc2VuZF9hbmRfcmVhZChndywgQUdfQ0FMTEVS X0lERU5UX0VOQUJMRSwgYnVmLAotCQkJc2l6ZW9mKEFHX0NBTExFUl9JREVOVF9FTkFCTEUpIC0g MSk7Ci0JcmZjb21tX3NlbmRfYW5kX3JlYWQoZ3csIEFHX0NBUlJJRVJfRk9STUFULCBidWYsCi0J CQlzaXplb2YoQUdfQ0FSUklFUl9GT1JNQVQpIC0gMSk7Ci0JaWYgKChndy0+YWdfZmVhdHVyZXMg JiBBR19GRUFUVVJFX0VYVEVOREVEX1JFU19DT0RFKSAhPSAwKQotCQlyZmNvbW1fc2VuZF9hbmRf cmVhZChndywgQUdfRVhURU5ERURfUkVTVUxUX0NPREUsIGJ1ZiwKLQkJCXNpemVvZihBR19FWFRF TkRFRF9SRVNVTFRfQ09ERSkgLSAxKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgdm9p ZCBwcm9jZXNzX2luZF9jaGFuZ2Uoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2LCBndWludCBpbmRl eCwKLQkJCQkJCQlnaW50IHZhbHVlKQotewotCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+Z2F0 ZXdheTsKLQlzdHJ1Y3QgaW5kaWNhdG9yICppbmQgPSBnX3NsaXN0X250aF9kYXRhKGd3LT5pbmRp ZXMsIGluZGV4IC0gMSk7Ci0JZ2NoYXIgKm5hbWUgPSBpbmQtPmRlc2NyOwotCi0JaW5kLT52YWx1 ZSA9IHZhbHVlOwotCi0JZGVidWcoImF0IHRoZSBiZWdpbiBvZiBwcm9jZXNzX2luZF9jaGFuZ2Us IG5hbWUgaXMgJXMiLCBuYW1lKTsKLQlpZiAoIXN0cmNtcChuYW1lLCAiXCJjYWxsXCIiKSkgewot CQlpZiAodmFsdWUgPiAwKSB7Ci0JCQlnX2RidXNfZW1pdF9zaWduYWwoZGV2LT5jb25uLCBkZXYt PnBhdGgsCi0JCQkJCUFVRElPX0dBVEVXQVlfSU5URVJGQUNFLAotCQkJCQkiQ2FsbFN0YXJ0ZWQi LCBEQlVTX1RZUEVfSU5WQUxJRCk7Ci0JCQlndy0+aXNfZGlhbGluZyA9IEZBTFNFOwotCQkJZ3ct PmNhbGxfYWN0aXZlID0gVFJVRTsKLQkJfSBlbHNlIHsKLQkJCWdfZGJ1c19lbWl0X3NpZ25hbChk ZXYtPmNvbm4sIGRldi0+cGF0aCwKLQkJCQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsCi0JCQkJ CSJDYWxsRW5kZWQiLCBEQlVTX1RZUEVfSU5WQUxJRCk7Ci0JCQlndy0+Y2FsbF9hY3RpdmUgPSBG QUxTRTsKLQkJfQotCi0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJcImNhbGxzZXR1cFwiIikp IHsKLQkJaWYgKHZhbHVlID09IDAgJiYgZ3ctPmlzX2RpYWxpbmcpIHsKLQkJCWdfZGJ1c19lbWl0 X3NpZ25hbChkZXYtPmNvbm4sIGRldi0+cGF0aCwKLQkJCQkJQVVESU9fR0FURVdBWV9JTlRFUkZB Q0UsCi0JCQkJCSJDYWxsVGVybWluYXRlZCIsCi0JCQkJCURCVVNfVFlQRV9JTlZBTElEKTsKLQkJ CWd3LT5pc19kaWFsaW5nID0gRkFMU0U7Ci0JCX0gZWxzZSBpZiAoIWd3LT5pc19kaWFsaW5nICYm IHZhbHVlID4gMCkKLQkJCWd3LT5pc19kaWFsaW5nID0gVFJVRTsKLQotCX0gZWxzZSBpZiAoIXN0 cmNtcChuYW1lLCAiXCJjYWxsaGVsZFwiIikpIHsKLQkJLyogRklYTUU6IFRoZSBmb2xsb3dpbmcg Y29kZSBpcyBiYXNlZCBvbiBhc3N1bXB0aW9ucyBvbmx5LgotCQkgKiBIYXMgdG8gYmUgdGVzdGVk IGZvciBpbnRlcm9wZXJhYmlsaXR5Ci0JCSAqIEkgYXNzdW1lIHRoYXQgY2FsbGhlbGQ9MiB3b3Vs ZCBiZSBzZW50IHdoZW4gZGlhbCBmcm9tIEhGCi0JCSAqIGZhaWxlZCBpbiBjYXNlIG9mIDMtd2F5 IGNhbGwKLQkJICogVW5mb3J0dW5hdGVseSB0aGlzIHBhdGggaXMgbm90IGNvdmVyZWQgYnkgdGhl IEhGIHNwZWMgc28KLQkJICogdGhlIGNvZGUgaGFzIHRvIGJlIHRlc3RlZCBmb3IgaW50ZXJvcAot CQkqLwotCQkvKiAnMicgbWVhbnM6IGFsbCBjYWxscyBoZWxkLCBubyBhY3RpdmUgY2FsbHMgKi8K LQkJaWYgKHZhbHVlID09IDIpIHsKLQkJCWlmIChndy0+aXNfZGlhbGluZykgewotCQkJCWdfZGJ1 c19lbWl0X3NpZ25hbChkZXYtPmNvbm4sIGRldi0+cGF0aCwKLQkJCQkJQVVESU9fR0FURVdBWV9J TlRFUkZBQ0UsCi0JCQkJCSJDYWxsVGVybWluYXRlZCIsCi0JCQkJCURCVVNfVFlQRV9JTlZBTElE KTsKLQkJCQlndy0+aXNfZGlhbGluZyA9IEZBTFNFOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmICgh c3RyY21wKG5hbWUsICJcInNlcnZpY2VcIiIpKQotCQllbWl0X3Byb3BlcnR5X2NoYW5nZWQoZGV2 LT5jb25uLCBkZXYtPnBhdGgsCi0JCQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsICJSZWdpc3Ry YXRpb25TdGF0dXMiLAotCQkJCURCVVNfVFlQRV9VSU5UMTYsICZ2YWx1ZSk7Ci0JZWxzZSBpZiAo IXN0cmNtcChuYW1lLCAiXCJzaWduYWxcIiIpKQotCQllbWl0X3Byb3BlcnR5X2NoYW5nZWQoZGV2 LT5jb25uLCBkZXYtPnBhdGgsCi0JCQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsICJTaWduYWxT dHJlbmd0aCIsCi0JCQkJREJVU19UWVBFX1VJTlQxNiwgJnZhbHVlKTsKLQllbHNlIGlmICghc3Ry Y21wKG5hbWUsICJcInJvYW1cIiIpKQotCQllbWl0X3Byb3BlcnR5X2NoYW5nZWQoZGV2LT5jb25u LCBkZXYtPnBhdGgsCi0JCQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsICJSb2FtaW5nU3RhdHVz IiwKLQkJCQlEQlVTX1RZUEVfVUlOVDE2LCAmdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjbXAobmFt ZSwgIlwiYmF0dGNoZ1wiIikpCi0JCWVtaXRfcHJvcGVydHlfY2hhbmdlZChkZXYtPmNvbm4sIGRl di0+cGF0aCwKLQkJCQlBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwgIkJhdHRlcnlDaGFyZ2UiLAot CQkJCURCVVNfVFlQRV9VSU5UMTYsICZ2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3Nf cmluZyhzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UsIEdJT0NoYW5uZWwgKmNoYW4sCi0JCQln Y2hhciAqYnVmKQotewotCWdjaGFyIG51bWJlcltBR19DQUxMRVJfTlVNX1NJWkVdOwotCWdjaGFy ICpjbGk7Ci0JZ2NoYXIgKnNlcDsKLQlnc2l6ZSByZWFkOwotCUdJT1N0YXR1cyBzdGF0dXM7Ci0K LQlyZmNvbW1fc3RvcF93YXRjaChkZXZpY2UpOwotCXN0YXR1cyA9IGdfaW9fY2hhbm5lbF9yZWFk X2NoYXJzKGNoYW4sIGJ1ZiwgUkZDT01NX0JVRl9TSVpFIC0gMSwgJnJlYWQsIE5VTEwpOwotCWlm IChzdGF0dXMgIT0gR19JT19TVEFUVVNfTk9STUFMKQotCQlyZXR1cm47Ci0KLQlkZWJ1ZygiYXQg dGhlIGJlZ2luIG9mIHByb2Nlc3NfcmluZyIpOwotCWlmIChzdHJsZW4oYnVmKSA+IEFHX0NBTExF Ul9OVU1fU0laRSArIDEwKQotCQllcnJvcigicHJvY2Vzc19yaW5nKCk6IGJ1ZiBpcyB0b28gbG9u ZyAnJXMnIiwgYnVmKTsKLQllbHNlIGlmICgoY2xpID0gc3Ryc3RyKGJ1ZiwgIlxyXG4rQ0xJUCIp KSkgewotCQlpZiAoc3NjYW5mKGNsaSwgIlxyXG4rQ0xJUDogXCIlcyIsIG51bWJlcikgPT0gMSkg ewotCQkJc2VwID0gc3RyY2hyKG51bWJlciwgJyInKTsKLQkJCXNlcFswXSA9ICdcMCc7Ci0KLQkJ CS8qIEZJWE1FOnNpZ25hbCB3aWxsIGJlIGVtaXR0ZWQgb24gZWFjaCBSSU5HK0NMSVAuCi0JCQkg KiBUaGF0J3MgYmFkICovCi0JCQljbGkgPSBudW1iZXI7Ci0JCQlnX2RidXNfZW1pdF9zaWduYWwo ZGV2aWNlLT5jb25uLCBkZXZpY2UtPnBhdGgsCi0JCQkJCUFVRElPX0dBVEVXQVlfSU5URVJGQUNF LCAiUmluZyIsCi0JCQkJCURCVVNfVFlQRV9TVFJJTkcsICZjbGksCi0JCQkJCURCVVNfVFlQRV9J TlZBTElEKTsKLQkJCWRldmljZS0+Z2F0ZXdheS0+aXNfZGlhbGluZyA9IFRSVUU7Ci0JCX0gZWxz ZQotCQkJZXJyb3IoInByb2Nlc3NfcmluZygpOiAnJXMnIGluIHBsYWNlIG9mICtDTElQIGFmdGVy IFJJTkciLCBidWYpOwotCi0JfQotCi0JcmZjb21tX3N0YXJ0X3dhdGNoKGRldmljZSk7Ci19Ci0K LXN0YXRpYyBnYm9vbGVhbiByZmNvbW1fYWdfZGF0YV9jYihHSU9DaGFubmVsICpjaGFuLCBHSU9D b25kaXRpb24gY29uZCwKLQkJCQkJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlKQotewotCWdj aGFyIGJ1ZltSRkNPTU1fQlVGX1NJWkVdOwotCXN0cnVjdCBnYXRld2F5ICpndzsKLQlnc2l6ZSBy ZWFkOwotCS8qIHNvbWUgc3BhY2UgZm9yIHZhbHVlICovCi0JZ2NoYXIgaW5kaWNhdG9yW0FHX0lO RElDQVRPUl9ERVNDUl9TSVpFICsgNF07Ci0JZ2ludCB2YWx1ZTsKLQlndWludCBpbmRleDsKLQln Y2hhciAqc2VwOwotCi0JZGVidWcoImF0IHRoZSBiZWdpbiBvZiByZmNvbW1fYWdfZGF0YV9jYigp Iik7Ci0JaWYgKGNvbmQgJiBHX0lPX05WQUwpCi0JCXJldHVybiBGQUxTRTsKLQotCWd3ID0gZGV2 aWNlLT5nYXRld2F5OwotCi0JaWYgKGNvbmQgJiAoR19JT19FUlIgfCBHX0lPX0hVUCkpIHsKLQkJ ZGVidWcoImNvbm5lY3Rpb24gd2l0aCByZW1vdGUgQlQgaXMgY2xvc2VkIik7Ci0JCWdhdGV3YXlf Y2xvc2UoZGV2aWNlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChnX2lvX2NoYW5uZWxf cmVhZF9jaGFycyhjaGFuLCBidWYsIHNpemVvZihidWYpIC0gMSwgJnJlYWQsIE5VTEwpCi0JCQkh PSBHX0lPX1NUQVRVU19OT1JNQUwpCi0JCXJldHVybiBUUlVFOwotCWJ1ZltyZWFkXSA9ICdcMCc7 Ci0KLQlpZiAoc3RybGVuKGJ1ZikgPiBBR19JTkRJQ0FUT1JfREVTQ1JfU0laRSArIDE0KQotCQll cnJvcigicmZjb21tX2FnX2RhdGFfY2IoKTogYnVmIGlzIHRvbyBsb25nICclcyciLCBidWYpOwot CWVsc2UgaWYgKHNzY2FuZihidWYsICJcclxuK0NJRVY6JXNcclxuIiwgaW5kaWNhdG9yKSA9PSAx KSB7Ci0JCXNlcCA9IHN0cmNocihpbmRpY2F0b3IsICcsJyk7Ci0JCXNlcFswXSA9ICdcMCc7Ci0J CXNlcCArPSAxOwotCQlpbmRleCA9IGF0b2koaW5kaWNhdG9yKTsKLQkJdmFsdWUgPSBhdG9pKHNl cCk7Ci0JCXByb2Nlc3NfaW5kX2NoYW5nZShkZXZpY2UsIGluZGV4LCB2YWx1ZSk7Ci0JfSBlbHNl IGlmIChzdHJzdHIoYnVmLCAiUklORyIpKQotCQlwcm9jZXNzX3JpbmcoZGV2aWNlLCBjaGFuLCBi dWYpOwotCWVsc2UgaWYgKHNzY2FuZihidWYsICJcclxuK0JWUkE6JWRcclxuIiwgJnZhbHVlKSA9 PSAxKSB7Ci0JCWlmICh2YWx1ZSA9PSAwKQotCQkJZ19kYnVzX2VtaXRfc2lnbmFsKGRldmljZS0+ Y29ubiwgZGV2aWNlLT5wYXRoLAotCQkJCQlBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwKLQkJCQkJ IlZvaWNlUmVjb2duaXRpb25BY3RpdmUiLAotCQkJCQlEQlVTX1RZUEVfSU5WQUxJRCk7Ci0JCWVs c2UKLQkJCWdfZGJ1c19lbWl0X3NpZ25hbChkZXZpY2UtPmNvbm4sIGRldmljZS0+cGF0aCwKLQkJ CQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsCi0JCQkJCSJWb2ljZVJlY29nbml0aW9uSW5hY3Rp dmUiLAotCQkJCQlEQlVTX1RZUEVfSU5WQUxJRCk7Ci0JfSBlbHNlIGlmIChzc2NhbmYoYnVmLCAi XHJcbitWR1M6JWRcclxuIiwgJnZhbHVlKSA9PSAxKSB7Ci0JCWd3LT5zcF9nYWluID0gdmFsdWU7 Ci0JCWVtaXRfcHJvcGVydHlfY2hhbmdlZChkZXZpY2UtPmNvbm4sIGRldmljZS0+cGF0aCwKLQkJ CQlBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwgIlNwZWFrZXJHYWluIiwKLQkJCQlEQlVTX1RZUEVf VUlOVDE2LCAmdmFsdWUpOwotCX0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIlxyXG4rVkdNOiVkXHJc biIsICZ2YWx1ZSkgPT0gMSkgewotCQlndy0+bWljX2dhaW4gPSB2YWx1ZTsKLQkJZW1pdF9wcm9w ZXJ0eV9jaGFuZ2VkKGRldmljZS0+Y29ubiwgZGV2aWNlLT5wYXRoLAotCQkJCUFVRElPX0dBVEVX QVlfSU5URVJGQUNFLCAiTWljcm9waG9uZUdhaW4iLAotCQkJCURCVVNfVFlQRV9VSU5UMTYsICZ2 YWx1ZSk7Ci0JfSBlbHNlCi0JCWVycm9yKCJyZmNvbW1fYWdfZGF0YV9jYigpOiByZWFkIHdyb25n IGRhdGEgJyVzJyIsIGJ1Zik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQogc3RhdGljIGdib29sZWFu IHNjb19pb19jYihHSU9DaGFubmVsICpjaGFuLCBHSU9Db25kaXRpb24gY29uZCwKIAkJCXN0cnVj dCBhdWRpb19kZXZpY2UgKmRldikKIHsKQEAgLTU0MSw3ICsxMTgsNiBAQCBzdGF0aWMgdm9pZCBy ZmNvbW1fY29ubmVjdF9jYihHSU9DaGFubmVsICpjaGFuLCBHRXJyb3IgKmVyciwKIHsKIAlzdHJ1 Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSB1c2VyX2RhdGE7CiAJc3RydWN0IGdhdGV3YXkgKmd3ID0g ZGV2LT5nYXRld2F5OwotCURCdXNNZXNzYWdlICpjb25uX21lcyA9IGd3LT5jb25uZWN0X21lc3Nh Z2U7CiAJZ2NoYXIgZ3dfYWRkclsxOF07CiAJR0lPRmxhZ3MgZmxhZ3M7CiAKQEAgLTU2MywyOSAr MTM5LDYgQEAgc3RhdGljIHZvaWQgcmZjb21tX2Nvbm5lY3RfY2IoR0lPQ2hhbm5lbCAqY2hhbiwg R0Vycm9yICplcnIsCiAJaWYgKCFndy0+cmZjb21tKQogCQlndy0+cmZjb21tID0gZ19pb19jaGFu bmVsX3JlZihjaGFuKTsKIAotCWlmIChlc3RhYmxpc2hfc2VydmljZV9sZXZlbF9jb25uKGRldi0+ Z2F0ZXdheSkpIHsKLQkJZ2Jvb2xlYW4gdmFsdWUgPSBUUlVFOwotCi0JCWRlYnVnKCIlczogQ29u bmVjdGVkIHRvICVzIiwgZGV2LT5wYXRoLCBnd19hZGRyKTsKLQkJcmZjb21tX3N0YXJ0X3dhdGNo KGRldik7Ci0JCWlmIChjb25uX21lcykgewotCQkJREJ1c01lc3NhZ2UgKnJlcGx5ID0KLQkJCQlk YnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4oY29ubl9tZXMpOwotCQkJZGJ1c19jb25uZWN0 aW9uX3NlbmQoZGV2LT5jb25uLCByZXBseSwgTlVMTCk7Ci0JCQlkYnVzX21lc3NhZ2VfdW5yZWYo cmVwbHkpOwotCQkJZGJ1c19tZXNzYWdlX3VucmVmKGNvbm5fbWVzKTsKLQkJCWd3LT5jb25uZWN0 X21lc3NhZ2UgPSBOVUxMOwotCQl9Ci0KLQkJZ3ctPnN0YXRlID0gR0FURVdBWV9TVEFURV9DT05O RUNURUQ7Ci0JCWVtaXRfcHJvcGVydHlfY2hhbmdlZChkZXYtPmNvbm4sIGRldi0+cGF0aCwKLQkJ CQlBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwKLQkJCQkiQ29ubmVjdGVkIiwgREJVU19UWVBFX0JP T0xFQU4sCSZ2YWx1ZSk7Ci0JCXJldHVybjsKLQl9IGVsc2UKLQkJZXJyb3IoIiVzOiBGYWlsZWQg dG8gZXN0YWJsaXNoIHNlcnZpY2UgbGF5ZXIgY29ubmVjdGlvbiB0byAlcyIsCi0JCQlkZXYtPnBh dGgsIGd3X2FkZHIpOwotCiAJaWYgKE5VTEwgIT0gZ3ctPnNjb19zdGFydF9jYikKIAkJZ3ctPnNj b19zdGFydF9jYihOVUxMLCBndy0+c2NvX3N0YXJ0X2NiX2RhdGEpOwogCkBAIC03MzIsMzIxICsy ODUsMjAgQEAgc3RhdGljIERCdXNNZXNzYWdlICphZ19kaXNjb25uZWN0KERCdXNDb25uZWN0aW9u ICpjb25uLCBEQnVzTWVzc2FnZSAqbXNnLAogCXJldHVybiByZXBseTsKIH0KIAotc3RhdGljIERC dXNNZXNzYWdlICpwcm9jZXNzX2FnX3JlcG9uc2UoREJ1c01lc3NhZ2UgKm1zZywgZ2NoYXIgKnJl c3BvbnNlKQotewotCURCdXNNZXNzYWdlICpyZXBseTsKLQotCi0JZGVidWcoImluIHByb2Nlc3Nf YWdfcmVwb25zZSwgcmVzcG9uc2UgaXMgJXMiLCByZXNwb25zZSk7Ci0JaWYgKHN0cnN0cihyZXNw b25zZSwgT0tfUkVTUE9OU0UpKQotCQlyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3Jl dHVybihtc2cpOwotCWVsc2UgewotCQkvKiBGSVhNRTogc29tZSBjb2RlIHNob3VsZCBiZSBoZXJl IHRvIHByb2Nlc3NlcyBlcnJvcnMKLQkJICogIGluIGJldHRlciBmYXNpb24gKi8KLQkJZGVidWco IkFHIHJlc3BvbmRlZCB3aXRoICclcycgdG8gJXMgbWV0aG9kIGNhbGwiLCByZXNwb25zZSwKLQkJ CQlkYnVzX21lc3NhZ2VfZ2V0X21lbWJlcihtc2cpKTsKLQkJcmVwbHkgPSBkYnVzX21lc3NhZ2Vf bmV3X2Vycm9yKG1zZywgRVJST1JfSU5URVJGQUNFCi0JCQkJCSIuT3BlcmF0aW9uRmFpbGVkIiwK LQkJCQkJIk9wZXJhdGlvbiBmYWlsZWQuU2VlIGxvZyBmb3IgZGV0YWlscyIpOwotCX0KLQlyZXR1 cm4gcmVwbHk7Ci19Ci0KLXN0YXRpYyBEQnVzTWVzc2FnZSAqcHJvY2Vzc19zaW1wbGUoREJ1c01l c3NhZ2UgKm1zZywgc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2LAotCQkJCQlnY2hhciAqZGF0YSkK LXsKLQlzdHJ1Y3QgZ2F0ZXdheSAqZ3cgPSBkZXYtPmdhdGV3YXk7Ci0JZ2NoYXIgYnVmW1JGQ09N TV9CVUZfU0laRV07Ci0KLQlyZmNvbW1fc3RvcF93YXRjaChkZXYpOwotCXJmY29tbV9zZW5kX2Fu ZF9yZWFkKGd3LCBkYXRhLCBidWYsIHN0cmxlbihkYXRhKSk7Ci0JcmZjb21tX3N0YXJ0X3dhdGNo KGRldik7Ci0JcmV0dXJuIHByb2Nlc3NfYWdfcmVwb25zZShtc2csIGJ1Zik7Ci19Ci0KLSNkZWZp bmUgQUdfQU5TV0VSICJBVEFcciIKLQotc3RhdGljIERCdXNNZXNzYWdlICphZ19hbnN3ZXIoREJ1 c0Nvbm5lY3Rpb24gKmNvbm4sIERCdXNNZXNzYWdlICptc2csCi0JCQkJdm9pZCAqZGF0YSkKLXsK LQlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBnYXRld2F5ICpndyA9 IGRldi0+Z2F0ZXdheTsKLQotCWlmICghZ3ctPnJmY29tbSkKLQkJcmV0dXJuIGdfZGJ1c19jcmVh dGVfZXJyb3IobXNnLCBFUlJPUl9JTlRFUkZBQ0UKLQkJCQkJIi5Ob3RDb25uZWN0ZWQiLAotCQkJ CQkiTm90IENvbm5lY3RlZCIpOwotCi0JaWYgKGd3LT5jYWxsX2FjdGl2ZSkKLQkJcmV0dXJuIGdf ZGJ1c19jcmVhdGVfZXJyb3IobXNnLCBFUlJPUl9JTlRFUkZBQ0UKLQkJCQkJIi5DYWxsQWxyZWFk eUFuc3dlcmVkIiwKLQkJCQkJIkNhbGwgQWxyZWFkeUFuc3dlcmVkIik7Ci0KLQlyZXR1cm4gcHJv Y2Vzc19zaW1wbGUobXNnLCBkZXYsIEFHX0FOU1dFUik7Ci19Ci0KLSNkZWZpbmUgQUdfSEFOR1VQ ICJBVCtDSFVQXHIiCi0KLXN0YXRpYyBEQnVzTWVzc2FnZSAqYWdfdGVybWluYXRlX2NhbGwoREJ1 c0Nvbm5lY3Rpb24gKmNvbm4sIERCdXNNZXNzYWdlICptc2csCi0JCQkJdm9pZCAqZGF0YSkKLXsK LQlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBnYXRld2F5ICpndyA9 IGRldi0+Z2F0ZXdheTsKLQotCWlmICghZ3ctPnJmY29tbSkKLQkJcmV0dXJuIGdfZGJ1c19jcmVh dGVfZXJyb3IobXNnLCBFUlJPUl9JTlRFUkZBQ0UKLQkJCQkJIi5Ob3RDb25uZWN0ZWQiLAotCQkJ CQkiTm90IENvbm5lY3RlZCIpOwotCi0JcmV0dXJuIHByb2Nlc3Nfc2ltcGxlKG1zZywgZGV2LCBB R19IQU5HVVApOwotfQotCi0vKiBhY2NvcmRpbmcgdG8gR1NNIHNwZWMgKi8KLSNkZWZpbmUgQUxM T1dFRF9OVU1CRVJfU1lNQk9MUyAiMTIzNDU2Nzg5MCojQUJDRCIKLSNkZWZpbmUgQUdfUExBQ0Vf Q0FMTCAiQVREJXM7XHIiCi0vKiBkaWFsaW5nIGZyb20gbWVtb3J5IGlzIG5vdCBzdXBwb3J0ZWQg YXMgaGVhZHNldCBzcGVjIGRvZXNuJ3QgZGVmaW5lIGEgd2F5Ci0gKiB0byByZXRyZWl2ZSBwaG9u ZSBtZW1vcnkgZW50cmllcy4KLSAqLwotc3RhdGljIERCdXNNZXNzYWdlICphZ19jYWxsKERCdXND b25uZWN0aW9uICpjb25uLCBEQnVzTWVzc2FnZSAqbXNnLAotCQkJCXZvaWQgKmRhdGEpCi17Ci0J c3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlID0gZGF0YTsKLQlzdHJ1Y3QgZ2F0ZXdheSAqZ3cg PSBkZXZpY2UtPmdhdGV3YXk7Ci0JZ2NoYXIgYnVmW1JGQ09NTV9CVUZfU0laRV07Ci0JZ2NoYXIg Km51bWJlcjsKLQlnaW50IGF0ZF9sZW47Ci0JREJ1c01lc3NhZ2UgKnJlc3VsdDsKLQotCWRlYnVn KCJhdCB0aGUgYmVnaW4gb2YgYWdfY2FsbCgpIik7Ci0JaWYgKCFndy0+cmZjb21tKQotCQlyZXR1 cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVSUk9SX0lOVEVSRkFDRQotCQkJCQkiLk5vdENv bm5lY3RlZCIsCi0JCQkJCSJOb3QgQ29ubmVjdGVkIik7Ci0KLQlkYnVzX21lc3NhZ2VfZ2V0X2Fy Z3MobXNnLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbnVtYmVyLAotCQkJCURCVVNfVFlQRV9J TlZBTElEKTsKLQlpZiAoc3RybGVuKG51bWJlcikgIT0gc3Ryc3BuKG51bWJlciwgQUxMT1dFRF9O VU1CRVJfU1lNQk9MUykpCi0JCXJldHVybiBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yKG1zZywKLQkJ CUVSUk9SX0lOVEVSRkFDRSAiLkJhZE51bWJlciIsCi0JCQkiTnVtYmVyIGNvbnRhaW5zIGNoYXJh Y3RlcnMgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIik7Ci0KLQlhdGRfbGVuID0gc3ByaW50ZihidWYs IEFHX1BMQUNFX0NBTEwsIG51bWJlcik7Ci0JcmZjb21tX3N0b3Bfd2F0Y2goZGV2aWNlKTsKLQly ZmNvbW1fc2VuZF9hbmRfcmVhZChndywgYnVmLCBidWYsIGF0ZF9sZW4pOwotCXJmY29tbV9zdGFy dF93YXRjaChkZXZpY2UpOwotCi0JcmVzdWx0ID0gcHJvY2Vzc19hZ19yZXBvbnNlKG1zZywgYnVm KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0jZGVmaW5lIEFHX0dFVF9DQVJSSUVSICJBVCtDT1BT P1xyIgotCi1zdGF0aWMgREJ1c01lc3NhZ2UgKmFnX2dldF9vcGVyYXRvcihEQnVzQ29ubmVjdGlv biAqY29ubiwgREJ1c01lc3NhZ2UgKm1zZywKLQkJCQkJdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qg YXVkaW9fZGV2aWNlICpkZXYgPSAoc3RydWN0IGF1ZGlvX2RldmljZSAqKSBkYXRhOwotCXN0cnVj dCBnYXRld2F5ICpndyA9IGRldi0+Z2F0ZXdheTsKLQlnY2hhciBidWZbUkZDT01NX0JVRl9TSVpF XTsKLQlHSU9DaGFubmVsICpyZmNvbW0gPSBndy0+cmZjb21tOwotCWdzaXplIHJlYWQ7Ci0JZ2No YXIgKnJlc3VsdCwgKnNlcDsKLQlEQnVzTWVzc2FnZSAqcmVwbHk7Ci0JR0lPU3RhdHVzIHN0YXR1 czsKLQotCWlmICghZ3ctPnJmY29tbSkKLQkJcmV0dXJuIGdfZGJ1c19jcmVhdGVfZXJyb3IobXNn LCBFUlJPUl9JTlRFUkZBQ0UKLQkJCQkJIi5Ob3RDb25uZWN0ZWQiLAotCQkJCQkiTm90IENvbm5l Y3RlZCIpOwotCi0JcmZjb21tX3N0b3Bfd2F0Y2goZGV2KTsKLQlpb19jaGFubmVsX3dyaXRlX2Fs bChyZmNvbW0sIEFHX0dFVF9DQVJSSUVSLCBzdHJsZW4oQUdfR0VUX0NBUlJJRVIpKTsKLQotCXN0 YXR1cyA9IGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzKHJmY29tbSwgYnVmLCBSRkNPTU1fQlVGX1NJ WkUgLSAxLAotCQkJCQkJJnJlYWQsIE5VTEwpOwotCXJmY29tbV9zdGFydF93YXRjaChkZXYpOwot CWlmIChHX0lPX1NUQVRVU19OT1JNQUwgPT0gc3RhdHVzKSB7Ci0JCWJ1ZltyZWFkXSA9ICdcMCc7 Ci0JCWlmIChzdHJzdHIoYnVmLCAiK0NPUFMiKSkgewotCQkJaWYgKCFzdHJyY2hyKGJ1ZiwgJywn KSkKLQkJCQlyZXN1bHQgPSAiMCI7Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBzdHJjaHIoYnVm LCAnXCInKSArIDE7Ci0JCQkJc2VwID0gc3RyY2hyKHJlc3VsdCwgJ1wiJyk7Ci0JCQkJc2VwWzBd ID0gJ1wwJzsKLQkJCX0KLQotCQkJcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1 cm4obXNnKTsKLQkJCWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyhyZXBseSwgREJVU19UWVBFX1NU UklORywKLQkJCQkJCSZyZXN1bHQsIERCVVNfVFlQRV9JTlZBTElEKTsKLQkJfSBlbHNlIHsKLQkJ CWluZm8oImFnX2dldF9vcGVyYXRvcigpOiAnK0NPUFMnIGV4cGVjdGVkIGJ1dCIKLQkJCQkiICcl cycgcmVjZWl2ZWQiLCBidWYpOwotCQkJcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X2Vycm9yKG1z ZywgRVJST1JfSU5URVJGQUNFCi0JCQkJCQkiLkZhaWxlZCIsCi0JCQkJCQkiVW5leHBlY3RlZCBy ZXNwb25zZSBmcm9tIEFHIik7Ci0JCX0KLQl9IGVsc2UgewotCQllcnJvcigiYWdfZ2V0X29wZXJh dG9yKCk6ICVtIik7Ci0JCXJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19lcnJvcihtc2csIEVSUk9S X0lOVEVSRkFDRQotCQkJCQkiLkNvbm5lY3Rpb25GYWlsZWQiLAotCQkJCQkiRmFpbGVkIHRvIHJl Y2VpdmUgcmVzcG9uc2UgZnJvbSBBRyIpOwotCX0KLQotCXJldHVybiByZXBseTsKLX0KLQotI2Rl ZmluZSBBR19TRU5EX0RUTUYgIkFUK1ZUUz0lY1xyIgotc3RhdGljIERCdXNNZXNzYWdlICphZ19z ZW5kX2R0bWYoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sIERCdXNNZXNzYWdlICptc2csCi0JCQkJdm9p ZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UgPSBkYXRhOwotCXN0cnVj dCBnYXRld2F5ICpndyA9IGRldmljZS0+Z2F0ZXdheTsKLQlnY2hhciBidWZbUkZDT01NX0JVRl9T SVpFXTsKLQlnY2hhciAqbnVtYmVyOwotCWdpbnQgY29tX2xlbjsKLQlnYm9vbGVhbiBnb3Rfb2sg PSBUUlVFOwotCWdpbnQgbnVtX2xlbjsKLQlnaW50IGkgPSAwOwotCi0JaWYgKCFndy0+cmZjb21t KQotCQlyZXR1cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVSUk9SX0lOVEVSRkFDRQotCQkJ CQkiLk5vdENvbm5lY3RlZCIsCi0JCQkJCSJOb3QgQ29ubmVjdGVkIik7Ci0KLQlkYnVzX21lc3Nh Z2VfZ2V0X2FyZ3MobXNnLCBOVUxMLCBEQlVTX1RZUEVfU1RSSU5HLCAmbnVtYmVyLAotCQkJCURC VVNfVFlQRV9JTlZBTElEKTsKLQlpZiAoc3RybGVuKG51bWJlcikgIT0gc3Ryc3BuKG51bWJlciwg QUxMT1dFRF9OVU1CRVJfU1lNQk9MUykpCi0JCXJldHVybiBkYnVzX21lc3NhZ2VfbmV3X2Vycm9y KG1zZywKLQkJCUVSUk9SX0lOVEVSRkFDRSAiLkJhZE51bWJlciIsCi0JCQkiTnVtYmVyIGNvbnRh aW5zIGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIik7Ci0KLQludW1fbGVuID0gc3Ry bGVuKG51bWJlcik7Ci0JcmZjb21tX3N0b3Bfd2F0Y2goZGV2aWNlKTsKLQl3aGlsZSAoaSA8IG51 bV9sZW4gJiYgZ290X29rKSB7Ci0JCWNvbV9sZW4gPSBzcHJpbnRmKGJ1ZiwgQUdfU0VORF9EVE1G LCBudW1iZXJbaV0pOwotCQlyZmNvbW1fc2VuZF9hbmRfcmVhZChndywgYnVmLCBidWYsIGNvbV9s ZW4pOwotCQlnb3Rfb2sgPSBOVUxMICE9IHN0cnN0cihidWYsIE9LX1JFU1BPTlNFKTsKLQkJaSAr PSAxOwotCX0KLQlyZmNvbW1fc3RhcnRfd2F0Y2goZGV2aWNlKTsKLQlyZXR1cm4gcHJvY2Vzc19h Z19yZXBvbnNlKG1zZywgYnVmKTsKLX0KLQotI2RlZmluZSBBR19HRVRfU1VCU0NSSUJFUl9OVU1T ICJBVCtDTlVNXHIiCi0jZGVmaW5lIENOVU1fTEVOIDUgICAgICAgICAgICAgLyogbGVuZ3RoIG9m ICIrQ05VTSIgc3RyaW5nICovCi0jZGVmaW5lIE1BWF9OVU1CRVJfQ05UIDE2Ci1zdGF0aWMgREJ1 c01lc3NhZ2UgKmFnX2dldF9zdWJzY3JpYmVyX251bShEQnVzQ29ubmVjdGlvbiAqY29ubiwKLQkJ CQkJREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9fZGV2aWNl ICpkZXZpY2UgPSBkYXRhOwotCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldmljZS0+Z2F0ZXdheTsK LQlnY2hhciBidWZbUkZDT01NX0JVRl9TSVpFXTsKLQlnY2hhciAqbnVtYmVyLCAqZW5kOwotCURC dXNNZXNzYWdlICpyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybihtc2cpOwot Ci0JaWYgKCFndy0+cmZjb21tKQotCQlyZXR1cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVS Uk9SX0lOVEVSRkFDRQotCQkJCQkiLk5vdENvbm5lY3RlZCIsCi0JCQkJCSJOb3QgQ29ubmVjdGVk Iik7Ci0KLQlyZmNvbW1fc3RvcF93YXRjaChkZXZpY2UpOwotCXJmY29tbV9zZW5kX2FuZF9yZWFk KGd3LCBBR19HRVRfU1VCU0NSSUJFUl9OVU1TLCBidWYsCi0JCQlzdHJsZW4oQUdfR0VUX1NVQlND UklCRVJfTlVNUykpOwotCXJmY29tbV9zdGFydF93YXRjaChkZXZpY2UpOwotCi0JaWYgKHN0cmxl bihidWYpID4gQUdfQ0FMTEVSX05VTV9TSVpFICsgMjEpCi0JCWVycm9yKCJhZ19nZXRfc3Vic2Ny aWJlcl9udW0oKTogYnVmIGlzIHRvbyBsb25nICclcyciLCBidWYpOwotCWVsc2UgaWYgKHN0cnN0 cihidWYsICIrQ05VTSIpKSB7Ci0JCW51bWJlciA9IHN0cmNocihidWYsICcsJyk7Ci0JCW51bWJl cisrOwotCQllbmQgPSBzdHJjaHIobnVtYmVyLCAnLCcpOwotCQlpZiAoZW5kKSB7Ci0JCQkqZW5k ID0gJ1wwJzsKLQkJCWRidXNfbWVzc2FnZV9hcHBlbmRfYXJncyhyZXBseSwgREJVU19UWVBFX1NU UklORywKLQkJCQkJCSZudW1iZXIsIERCVVNfVFlQRV9JTlZBTElEKTsKLQkJfQotCX0gZWxzZQot CQllcnJvcigiYWdfZ2V0X3N1YnNjcmliZXJfbnVtKCk6IHJlYWQgd3JvbmcgZGF0YSAnJXMnIiwg YnVmKTsKLQotCXJldHVybiByZXBseTsKLX0KLQogc3RhdGljIERCdXNNZXNzYWdlICphZ19nZXRf cHJvcGVydGllcyhEQnVzQ29ubmVjdGlvbiAqY29ubiwgREJ1c01lc3NhZ2UgKm1zZywKIAkJCQkJ dm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UgPSBkYXRhOwotCXN0 cnVjdCBnYXRld2F5ICpndyA9IGRldmljZS0+Z2F0ZXdheTsKLQlEQnVzTWVzc2FnZSAqcmVwbHk7 Ci0JREJ1c01lc3NhZ2VJdGVyIGl0ZXI7Ci0JREJ1c01lc3NhZ2VJdGVyIGRpY3Q7Ci0JZ2Jvb2xl YW4gdmFsdWU7Ci0JZ3VpbnQgaW5kZXggPSAwOwotCXN0cnVjdCBpbmRpY2F0b3IgKmluZDsKLQot CXJlcGx5ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKG1zZyk7Ci0JaWYgKCFyZXBs eSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkYnVzX21lc3NhZ2VfaXRlcl9pbml0X2FwcGVuZChyZXBs eSwgJml0ZXIpOwotCi0JZGJ1c19tZXNzYWdlX2l0ZXJfb3Blbl9jb250YWluZXIoJml0ZXIsIERC VVNfVFlQRV9BUlJBWSwKLQkJCURCVVNfRElDVF9FTlRSWV9CRUdJTl9DSEFSX0FTX1NUUklORwot CQkJREJVU19UWVBFX1NUUklOR19BU19TVFJJTkcgREJVU19UWVBFX1ZBUklBTlRfQVNfU1RSSU5H Ci0JCQlEQlVTX0RJQ1RfRU5UUllfRU5EX0NIQVJfQVNfU1RSSU5HLCAmZGljdCk7Ci0KLQkvKiBD b25uZWN0ZWQgKi8KLQl2YWx1ZSA9IGdhdGV3YXlfaXNfY29ubmVjdGVkKGRldmljZSk7Ci0JZGlj dF9hcHBlbmRfZW50cnkoJmRpY3QsICJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTiwgJnZh bHVlKTsKLQotCWlmICghdmFsdWUpCi0JCWdvdG8gZG9uZTsKLQotCXdoaWxlICgoaW5kID0gZ19z bGlzdF9udGhfZGF0YShndy0+aW5kaWVzLCBpbmRleCkpKSB7Ci0JCWlmKCFzdHJjbXAoaW5kLT5k ZXNjciwgIlwic2VydmljZVwiIikpCi0JCQlkaWN0X2FwcGVuZF9lbnRyeSgmZGljdCwgIlJlZ2lz dHJhdGlvblN0YXR1cyIsCi0JCQkJCURCVVNfVFlQRV9VSU5UMTYsICZpbmQtPnZhbHVlKTsKLQkJ ZWxzZSBpZiAoIXN0cmNtcChpbmQtPmRlc2NyLCAiXCJzaWduYWxcIiIpKQotCQkJZGljdF9hcHBl bmRfZW50cnkoJmRpY3QsICJTaWduYWxTdHJlbmd0aCIsCi0JCQkJCURCVVNfVFlQRV9VSU5UMTYs ICZpbmQtPnZhbHVlKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChpbmQtPmRlc2NyLCAiXCJyb2FtXCIi KSkKLQkJCWRpY3RfYXBwZW5kX2VudHJ5KCZkaWN0LCAiUm9hbWluZ1N0YXR1cyIsCi0JCQkJCURC VVNfVFlQRV9VSU5UMTYsICZpbmQtPnZhbHVlKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChpbmQtPmRl c2NyLCAiXCJiYXR0Y2hnXCIiKSkKLQkJCWRpY3RfYXBwZW5kX2VudHJ5KCZkaWN0LCAiQmF0dGVy eUNoYXJnZSIsCi0JCQkJCURCVVNfVFlQRV9VSU5UMTYsICZpbmQtPnZhbHVlKTsKLQkJaW5kZXgr KzsKLQl9Ci0KLQkvKiBTcGVha2VyR2FpbiAqLwotCWRpY3RfYXBwZW5kX2VudHJ5KCZkaWN0LCAi U3BlYWtlckdhaW4iLCBEQlVTX1RZUEVfVUlOVDE2LAotCQkJCSZkZXZpY2UtPmdhdGV3YXktPnNw X2dhaW4pOwotCi0JLyogTWljcm9waG9uZUdhaW4gKi8KLQlkaWN0X2FwcGVuZF9lbnRyeSgmZGlj dCwgIk1pY3JvcGhvbmVHYWluIiwgREJVU19UWVBFX1VJTlQxNiwKLQkJCQkmZGV2aWNlLT5nYXRl d2F5LT5taWNfZ2Fpbik7Ci1kb25lOgotCWRidXNfbWVzc2FnZV9pdGVyX2Nsb3NlX2NvbnRhaW5l cigmaXRlciwgJmRpY3QpOwotCXJldHVybiByZXBseTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3Rh dGljIEdEQnVzTWV0aG9kVGFibGUgZ2F0ZXdheV9tZXRob2RzW10gPSB7CiAJeyAiQ29ubmVjdCIs ICIiLCAiIiwgYWdfY29ubmVjdCwgR19EQlVTX01FVEhPRF9GTEFHX0FTWU5DIH0sCiAJeyAiRGlz Y29ubmVjdCIsICIiLCAiIiwgYWdfZGlzY29ubmVjdCB9LAotCXsgIkFuc3dlckNhbGwiLCAiIiwg IiIsIGFnX2Fuc3dlciB9LAotCXsgIlRlcm1pbmF0ZUNhbGwiLCAiIiwgIiIsIGFnX3Rlcm1pbmF0 ZV9jYWxsIH0sCi0JeyAiQ2FsbCIsICJzIiwgIiIsIGFnX2NhbGwgfSwKLQl7ICJHZXRPcGVyYXRv ck5hbWUiLCAiIiwgInMiLCBhZ19nZXRfb3BlcmF0b3IgfSwKLQl7ICJTZW5kRFRNRiIsICJzIiwg IiIsIGFnX3NlbmRfZHRtZiB9LAotCXsgIkdldFN1YnNjcmliZXJOdW1iZXIiLCAiIiwgInMiLCBh Z19nZXRfc3Vic2NyaWJlcl9udW0gfSwKIAl7ICJHZXRQcm9wZXJ0aWVzIiwgIiIsICJhe3N2fSIs IGFnX2dldF9wcm9wZXJ0aWVzIH0sCiAJeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KIH07CiAK IHN0YXRpYyBHREJ1c1NpZ25hbFRhYmxlIGdhdGV3YXlfc2lnbmFsc1tdID0gewotCXsgIlJpbmci LCAicyIgfSwKLQl7ICJDYWxsVGVybWluYXRlZCIsICIiIH0sCi0JeyAiQ2FsbFN0YXJ0ZWQiLCAi IiB9LAotCXsgIkNhbGxFbmRlZCIsICIiIH0sCiAJeyAiUHJvcGVydHlDaGFuZ2VkIiwgInN2IiB9 LAogCXsgTlVMTCwgTlVMTCB9CiB9OwpAQCAtMTA2Myw5ICszMTUsNiBAQCBzdHJ1Y3QgZ2F0ZXdh eSAqZ2F0ZXdheV9pbml0KHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldikKIAogCWRlYnVnKCJpbiBn YXRld2F5X2luaXQsIGRldiBpcyAlcCIsIGRldik7CiAJZ3cgPSBnX25ldzAoc3RydWN0IGdhdGV3 YXksIDEpOwotCWd3LT5pbmRpZXMgPSBOVUxMOwotCWd3LT5pc19kaWFsaW5nID0gRkFMU0U7Ci0J Z3ctPmNhbGxfYWN0aXZlID0gRkFMU0U7CiAJZ3ctPnN0YXRlID0gR0FURVdBWV9TVEFURV9ESVND T05ORUNURUQ7CiAJcmV0dXJuIGd3OwogCkBAIC0xMTA3LDExICszNTYsNiBAQCB2b2lkIGdhdGV3 YXlfc3RhcnRfc2VydmljZShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UpCiAJcmZjb21tX2Nv bm5lY3RfY2IoZGV2aWNlLT5nYXRld2F5LT5yZmNvbW0sIE5VTEwsIGRldmljZSk7CiB9CiAKLXN0 YXRpYyB2b2lkIGluZGljYXRvcl9zbGljZV9mcmVlKGdwb2ludGVyIG1lbSkKLXsKLQlnX3NsaWNl X2ZyZWUoc3RydWN0IGluZGljYXRvciwgbWVtKTsKLX0KLQogaW50IGdhdGV3YXlfY2xvc2Uoc3Ry dWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldmlj ZS0+Z2F0ZXdheTsKQEAgLTExMTksOCArMzYzLDYgQEAgaW50IGdhdGV3YXlfY2xvc2Uoc3RydWN0 IGF1ZGlvX2RldmljZSAqZGV2aWNlKQogCUdJT0NoYW5uZWwgKnNjbyA9IGd3LT5zY287CiAJZ2Jv b2xlYW4gdmFsdWUgPSBGQUxTRTsKIAotCWdfc2xpc3RfZm9yZWFjaChndy0+aW5kaWVzLCAoR0Z1 bmMpIGluZGljYXRvcl9zbGljZV9mcmVlLCBOVUxMKTsKLQlnX3NsaXN0X2ZyZWUoZ3ctPmluZGll cyk7CiAJaWYgKHJmY29tbSkgewogCQlnX2lvX2NoYW5uZWxfc2h1dGRvd24ocmZjb21tLCBUUlVF LCBOVUxMKTsKIAkJZ19pb19jaGFubmVsX3VucmVmKHJmY29tbSk7Ci0tIAoxLjYuNC40Cgo= --000e0cd6ad149b5158047ce6941f Content-Type: application/octet-stream; name="0002-Implement-HandsfreeGateway-Interface.patch" Content-Disposition: attachment; filename="0002-Implement-HandsfreeGateway-Interface.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g4bi8zuw1 RnJvbSBlYWQ4MWVhY2JiNmZjZmZmNmIyNzlmMThmNzU0NmNmMjVjYTY5YzExIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHdXN0YXZvIEYuIFBhZG92YW4gPHBhZG92YW5AcHJvZnVzaW9u Lm1vYmk+CkRhdGU6IEZyaSwgOCBKYW4gMjAxMCAxNzozODoyMSAtMDIwMApTdWJqZWN0OiBbUEFU Q0ggMi8yXSBJbXBsZW1lbnQgSGFuZHNmcmVlR2F0ZXdheSBJbnRlcmZhY2UKCkNyZWF0ZSBhIGlu dGVyZmFjZSB3aGVyZSBhIEhhbmRzZnJlZSBhZ2VudCBjYW4gcmVnaXN0ZXIgYW5kIHVzZSBCbHVl WiB0bwpoYW5kbGUgdGhlIHJmY29tbSBhbmQgc2NvIGxpbmtzLgoKTWFueSB0aGFua3MgdG8gWmhl bmh1YSBaaGFuZyA8emhlbmh1YS56aGFuZ0BpbnRlbC5jb20+IGZvciBoaXMKcHJvdG90eXBlIG9u IHRoaXMgY29kZS4KLS0tCiBhdWRpby9nYXRld2F5LmMgfCAgNTkyICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0KIGF1ZGlvL2dhdGV3YXkuaCB8 ICAgMTIgKy0KIGF1ZGlvL21hbmFnZXIuYyB8ICAgMjAgKy0tCiBhdWRpby91bml4LmMgICAgfCAg ICA4ICsKIDQgZmlsZXMgY2hhbmdlZCwgNTIyIGluc2VydGlvbnMoKyksIDExMCBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9hdWRpby9nYXRld2F5LmMgYi9hdWRpby9nYXRld2F5LmMKaW5kZXgg M2RjMDlmZi4uOGNiNjZhZCAxMDA2NDQKLS0tIGEvYXVkaW8vZ2F0ZXdheS5jCisrKyBiL2F1ZGlv L2dhdGV3YXkuYwpAQCAtNSw2ICs1LDggQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCAg Tm9raWEgQ29ycG9yYXRpb24KICAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhv bHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgogICogIENvcHlyaWdodCAoQykgMjAwOC0yMDA5 ICBMZW9uaWQgTW92c2hvdmljaCA8ZXZlbnQucmlnYUBnbWFpbC5vcmc+CisgKiAgQ29weXJpZ2h0 IChDKSAyMDA5LTIwMDkgIFpoZW5odWEgWmhhbmcgPHpoZW5odWEuemhhbmdAaW50ZWwuY29tPgor ICogIENvcHlyaWdodCAoQykgMjAxMCAgR3VzdGF2byBGLiBQYWRvdmFuIDxwYWRvdmFuQHByb2Z1 c2lvbi5tb2JpPgogICoKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTMyLDEyICszNCwxNSBAQAog I2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8u aD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1 ZGUgPGdsaWIuaD4KICNpbmNsdWRlIDxkYnVzL2RidXMuaD4KICNpbmNsdWRlIDxnZGJ1cy5oPgog CiAjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPGJsdWV0b290aC9y ZmNvbW0uaD4KICNpbmNsdWRlIDxibHVldG9vdGgvaGNpLmg+CiAjaW5jbHVkZSA8Ymx1ZXRvb3Ro L2hjaV9saWIuaD4KICNpbmNsdWRlIDxibHVldG9vdGgvc2NvLmg+CkBAIC01MiwxOSArNTcsMTA2 IEBACiAjaW5jbHVkZSAiYnRpby5oIgogI2luY2x1ZGUgImRidXMtY29tbW9uLmgiCiAKLSNkZWZp bmUgUkZDT01NX0JVRl9TSVpFIDI1NgorI2RlZmluZSBNQVhfT1BFTl9UUklFUyA1CisjZGVmaW5l IE9QRU5fV0FJVCAzMDAKKworc3RydWN0IGFnZW50IHsKKwljaGFyICpuYW1lOwkvKiBCdXMgaWQg Ki8KKwljaGFyICpwYXRoOwkvKiBELUJ1cyBwYXRoICovCisJZ3VpbnQgd2F0Y2g7CS8qIERpc2Nv bm5lY3Qgd2F0Y2ggKi8KK307CiAKIHN0cnVjdCBnYXRld2F5IHsKIAlnYXRld2F5X3N0YXRlX3Qg c3RhdGU7Ci0JR0lPQ2hhbm5lbCAqcmZjb21tOwotCWd1aW50IHJmY29tbV93YXRjaF9pZDsKKwlp bnQgY2hhbm5lbDsKKwljaGFyICp0dHk7CQkvKiBndy0+dHR5IGNyZWF0ZWQgZnJvbSByZmNvbW0g Ki8KKwlHSU9DaGFubmVsICpyZmNvbW07CS8qIHJlbW90ZSBBRyByZXF1ZXN0ZWQgcmZjb21tIGNv bm5lY3Rpb24gKi8KKwlpbnQgcmZjb21tX2lkOwkJLyogcHJlc2VudCBOIGluIC9kZXYvcmZjb21t TiAqLworCWludCByZmNvbW1fZmQ7CiAJR0lPQ2hhbm5lbCAqc2NvOwogCWdhdGV3YXlfc3RyZWFt X2NiX3Qgc2NvX3N0YXJ0X2NiOwogCXZvaWQgKnNjb19zdGFydF9jYl9kYXRhOwotCURCdXNNZXNz YWdlICpjb25uZWN0X21lc3NhZ2U7CisJc3RydWN0IGFnZW50ICphZ2VudDsKKwlEQnVzTWVzc2Fn ZSAqbXNnOwogfTsKIAotaW50IGdhdGV3YXlfY2xvc2Uoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 aWNlKTsKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZGV2aWNlICphY3RpdmU7CS8qIHNpbmdsZSBhY3Rp dmUgZGV2aWNlIHdpdGggb0Zvbm8gKi8KK3N0YXRpYyBEQnVzQ29ubmVjdGlvbiAqY29ubmVjdGlv bjsKKworc3RhdGljIGdib29sZWFuIGdhdGV3YXlfY2xvc2UoZ3BvaW50ZXIgZGF0YSk7CitzdGF0 aWMgaW50IGdhdGV3YXlfcmVsZWFzZV90dHkoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlKTsK Kworc3RhdGljIGNvbnN0IGNoYXIgKmNvbm5lY3RlZDJzdHIoaW50IGkpCit7CisJc3dpdGNoIChp KSB7CisJCWNhc2UgR0FURVdBWV9TVEFURV9ESVNDT05ORUNURUQ6CisJCQlyZXR1cm4gImRpc2Nv bm5lY3RlZCI7CisJCWNhc2UgR0FURVdBWV9TVEFURV9DT05ORUNUSU5HOgorCQkJcmV0dXJuICJj b25uZWN0aW5nIjsKKwkJY2FzZSBHQVRFV0FZX1NUQVRFX0NPTk5FQ1RFRDoKKwkJCXJldHVybiAi Y29ubmVjdGVkIjsKKwkJY2FzZSBHQVRFV0FZX1NUQVRFX1BMQVlJTkc6CisJCQlyZXR1cm4gInBs YXlpbmciOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICIiOworCX0KK30KKworc3RhdGljIHZvaWQg YWdlbnRfZnJlZShzdHJ1Y3QgYWdlbnQgKmFnZW50KQoreworCWlmICghYWdlbnQpCisJCXJldHVy bjsKKworCWdfZnJlZShhZ2VudC0+bmFtZSk7CisJZ19mcmVlKGFnZW50LT5wYXRoKTsKKwlnX2Zy ZWUoYWdlbnQpOworfQorCitzdGF0aWMgdm9pZCBhZ2VudF9kaXNjb25uZWN0KHN0cnVjdCBhZ2Vu dCAqYWdlbnQpCit7CisJREJ1c01lc3NhZ2UgKm1zZzsKKworCW1zZyA9IGRidXNfbWVzc2FnZV9u ZXdfbWV0aG9kX2NhbGwoYWdlbnQtPm5hbWUsIGFnZW50LT5wYXRoLAorCQkJIm9yZy5ibHVlei5I YW5kc2ZyZWVBZ2VudCIsICJSZWxlYXNlIik7CisKKwlkYnVzX21lc3NhZ2Vfc2V0X25vX3JlcGx5 KG1zZywgVFJVRSk7CisJZ19kYnVzX3NlbmRfbWVzc2FnZShjb25uZWN0aW9uLCBtc2cpOworCisJ Z19kYnVzX3JlbW92ZV93YXRjaChjb25uZWN0aW9uLCBhZ2VudC0+d2F0Y2gpOworfQorCitzdGF0 aWMgZ2Jvb2xlYW4gYWdlbnRfc2VuZGZkKHN0cnVjdCBhZ2VudCAqYWdlbnQsIGludCBmZCwKKwkJ REJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gbm90aWZ5LCB2b2lkICpkYXRhKQoreworCURC dXNNZXNzYWdlICptc2c7CisJREJ1c1BlbmRpbmdDYWxsICpjYWxsOworCisJbXNnID0gZGJ1c19t ZXNzYWdlX25ld19tZXRob2RfY2FsbChhZ2VudC0+bmFtZSwgYWdlbnQtPnBhdGgsCisJCQkib3Jn LmJsdWV6LkhhbmRzZnJlZUFnZW50IiwgIk5ld0Nvbm5lY3Rpb24iKTsKKworCWRidXNfbWVzc2Fn ZV9hcHBlbmRfYXJncyhtc2csIERCVVNfVFlQRV9VTklYX0ZELCAmZmQsCisJCQkJCURCVVNfVFlQ RV9JTlZBTElEKTsKKworCWlmIChkYnVzX2Nvbm5lY3Rpb25fc2VuZF93aXRoX3JlcGx5KGNvbm5l Y3Rpb24sIG1zZywgJmNhbGwsIC0xKSA9PSBGQUxTRSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGJ1 c19wZW5kaW5nX2NhbGxfc2V0X25vdGlmeShjYWxsLCBub3RpZnksIGRhdGEsIE5VTEwpOworCWRi dXNfcGVuZGluZ19jYWxsX3VucmVmKGNhbGwpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRp YyB2b2lkIGNoYW5nZV9zdGF0ZShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsIGludCBuZXdfc3Rh dGUpCit7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5OworCWNvbnN0IGNoYXIg KnZhbCA9IGNvbm5lY3RlZDJzdHIobmV3X3N0YXRlKTsKKworCWd3LT5zdGF0ZSA9IG5ld19zdGF0 ZTsKKworCWVtaXRfcHJvcGVydHlfY2hhbmdlZChjb25uZWN0aW9uLGRldi0+cGF0aCwKKwkJCUFV RElPX0dBVEVXQVlfSU5URVJGQUNFLCAiQ29ubmVjdGVkIiwKKwkJCURCVVNfVFlQRV9TVFJJTkcs ICZ2YWwpOworfQogCiBzdGF0aWMgZ2Jvb2xlYW4gc2NvX2lvX2NiKEdJT0NoYW5uZWwgKmNoYW4s IEdJT0NvbmRpdGlvbiBjb25kLAogCQkJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2KQpAQCAtNzks NiArMTcxLDcgQEAgc3RhdGljIGdib29sZWFuIHNjb19pb19jYihHSU9DaGFubmVsICpjaGFuLCBH SU9Db25kaXRpb24gY29uZCwKIAkJZ19pb19jaGFubmVsX3NodXRkb3duKGd3LT5zY28sIFRSVUUs IE5VTEwpOwogCQlnX2lvX2NoYW5uZWxfdW5yZWYoZ3ctPnNjbyk7CiAJCWd3LT5zY28gPSBOVUxM OworCQljaGFuZ2Vfc3RhdGUoZGV2LCBHQVRFV0FZX1NUQVRFX0NPTk5FQ1RFRCk7CiAJCXJldHVy biBGQUxTRTsKIAl9CiAKQEAgLTkyLDYzICsxODUsMjA1IEBAIHN0YXRpYyB2b2lkIHNjb19jb25u ZWN0X2NiKEdJT0NoYW5uZWwgKmNoYW4sIEdFcnJvciAqZXJyLCBncG9pbnRlciB1c2VyX2RhdGEp CiAKIAlkZWJ1ZygiYXQgdGhlIGJlZ2luIG9mIHNjb19jb25uZWN0X2NiKCkgaW4gZ2F0ZXdheS5j Iik7CiAKKwlndy0+c2NvID0gY2hhbjsKKwlnX2lvX2NoYW5uZWxfcmVmKGNoYW4pOworCiAJaWYg KGVycikgewogCQllcnJvcigic2NvX2Nvbm5lY3RfY2IoKTogJXMiLCBlcnItPm1lc3NhZ2UpOwot CQkvKiBub3Qgc3VyZSwgYnV0IGZyb20gb3RoZXIgcG9pbnQgb2YgdmlldywKLQkJICogd2hhdCBp cyB0aGUgcmVhc29uIHRvIGhhdmUgaGVhZHNldCB3aGljaAotCQkgKiBjYW5ub3QgcGxheSBhdWRp bz8gKi8KLQkJaWYgKGd3LT5zY29fc3RhcnRfY2IpCi0JCQlndy0+c2NvX3N0YXJ0X2NiKE5VTEws IGd3LT5zY29fc3RhcnRfY2JfZGF0YSk7CiAJCWdhdGV3YXlfY2xvc2UoZGV2KTsKIAkJcmV0dXJu OwogCX0KIAotCWd3LT5zY28gPSBnX2lvX2NoYW5uZWxfcmVmKGNoYW4pOwogCWlmIChndy0+c2Nv X3N0YXJ0X2NiKQogCQlndy0+c2NvX3N0YXJ0X2NiKGRldiwgZ3ctPnNjb19zdGFydF9jYl9kYXRh KTsKIAotCS8qIHdoeSBpcyB0aGlzIGhlcmU/ICovCiAJZmNudGwoZ19pb19jaGFubmVsX3VuaXhf Z2V0X2ZkKGNoYW4pLCBGX1NFVEZMLCAwKTsKIAlnX2lvX2FkZF93YXRjaChndy0+c2NvLCBHX0lP X0VSUiB8IEdfSU9fSFVQIHwgR19JT19OVkFMLAogCQkJCShHSU9GdW5jKSBzY29faW9fY2IsIGRl dik7CiB9CiAKK3N0YXRpYyB2b2lkIG9wZW5fbm90aWZ5KGludCBmZCwgaW50IGVyciwgc3RydWN0 IGF1ZGlvX2RldmljZSAqZGV2KQoreworCURCdXNNZXNzYWdlICpyZXBseSA9IE5VTEw7CisJc3Ry dWN0IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5OworCWNvbnN0IGNoYXIgKnJlc3VsdCA9ICJv ayI7CisKKwlpZiAoZXJyKSB7CisJCS8qIE1heCB0cmllcyBleGNlZWRlZCAqLworCQlnYXRld2F5 X2Nsb3NlKGRldik7CisKKwkJaWYgKGd3LT5tc2cpCisJCQlyZXBseSA9IGdfZGJ1c19jcmVhdGVf ZXJyb3IoZ3ctPm1zZywKKwkJCQkJCUVSUk9SX0lOVEVSRkFDRSAiLkZhaWxlZCIsCisJCQkJCQlz dHJlcnJvcihlcnIpKTsKKwl9IGVsc2UgeworCQlpZiAoZ3ctPm1zZykKKwkJCXJlcGx5ID0gZ19k YnVzX2NyZWF0ZV9yZXBseShndy0+bXNnLAorCQkJCQkJREJVU19UWVBFX1NUUklORywgJnJlc3Vs dCwKKwkJCQkJCURCVVNfVFlQRV9JTlZBTElEKTsKKworCQllbWl0X3Byb3BlcnR5X2NoYW5nZWQo ZGV2LT5jb25uLCBkZXYtPnBhdGgsCisJCQkJCUFVRElPX0dBVEVXQVlfSU5URVJGQUNFLAorCQkJ CQkiRGV2aWNlIiwgREJVU19UWVBFX1NUUklORywKKwkJCQkJJmd3LT50dHkpOworCisJCWNoYW5n ZV9zdGF0ZShkZXYsIEdBVEVXQVlfU1RBVEVfQ09OTkVDVEVEKTsKKwkJYWN0aXZlID0gZGV2Owor CX0KKworCS8qIFJlcGx5IHRvIHRoZSByZXF1ZXN0b3IgKi8KKwlpZiAoZ3ctPm1zZyAmJiByZXBs eSkKKwkJZ19kYnVzX3NlbmRfbWVzc2FnZShkZXYtPmNvbm4sIHJlcGx5KTsKK30KKworc3RhdGlj IHZvaWQgbmV3Y29ubmVjdGlvbl9yZXBseShEQnVzUGVuZGluZ0NhbGwgKmNhbGwsIHZvaWQgKmRh dGEpCit7CisJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGF0YTsKKwlEQnVzTWVzc2FnZSAqcmVwbHkg PSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseShjYWxsKTsKKwlEQnVzRXJyb3IgZGVycjsK KworCWlmICghZ3ctPnJmY29tbSkgeworCQlkZWJ1ZygiUkZDT01NIGRpc2Nvbm5lY3RlZCBmcm9t IHNlcnZlciBiZWZvcmUgYWdlbnQgcmVwbHkiKTsKKwkJcmV0dXJuOworCX0KKworCWRidXNfZXJy b3JfaW5pdCgmZGVycik7CisJaWYgKCFkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmRlcnIs IHJlcGx5KSkgeworCQlpbmZvKCJBZ2VudCByZXBseTogZmlsZSBkZXNjcmlwdG9yIHBhc3NlZCBz dWNjZXNzZnVseSIpOworCQlyZXR1cm47CisJfQorCisJZGVidWcoIkFnZW50IHJlcGx5OiAlcyIs IGRlcnIubWVzc2FnZSk7CisKKwlkYnVzX2Vycm9yX2ZyZWUoJmRlcnIpOworCWdfaWRsZV9hZGQo Z2F0ZXdheV9jbG9zZSwgZ3cpOworfQorCitzdGF0aWMgZ2Jvb2xlYW4gb3Blbl9jb250aW51ZShn cG9pbnRlciB1c2VyX2RhdGEpCit7CisJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2ID0gdXNlcl9k YXRhOworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+Z2F0ZXdheTsKKwlpbnQgZmQ7CisJc3Rh dGljIGludCBudHJpZXMgPSBNQVhfT1BFTl9UUklFUzsKKwlEQnVzTWVzc2FnZSAqcmVwbHk7CisK KwlmZCA9IG9wZW4oZ3ctPnR0eSwgT19SRFdSIHwgT19OT0NUVFkgfCBPX05PTkJMT0NLKTsKKwlp ZiAoZmQgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJZXJyb3IoIkNvdWxkIG5vdCBvcGVu ICVzOiAlcyAoJWQpIiwKKwkJCQlndy0+dHR5LCBzdHJlcnJvcihlcnIpLCBlcnIpOworCQlpZiAo IS0tbnRyaWVzKSB7CisJCQkvKiBSZXBvcnRpbmcgZXJyb3IgKi8KKwkJCW9wZW5fbm90aWZ5KGZk LCBlcnIsIGRldik7CisJCQludHJpZXMgPSBNQVhfT1BFTl9UUklFUzsKKwkJCXJldHVybiBGQUxT RTsKKwkJfQorCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogQ29ubmVjdGlvbiBzdWNjZWVkZWQgKi8K KwlvcGVuX25vdGlmeShmZCwgMCwgZGV2KTsKKwlndy0+cmZjb21tX2ZkID0gZmQ7CisKKwlpZiAo IWFnZW50X3NlbmRmZChndy0+YWdlbnQsIGZkLCBuZXdjb25uZWN0aW9uX3JlcGx5LCBndykpCisJ CXJlcGx5ID0gZ19kYnVzX2NyZWF0ZV9lcnJvcihndy0+bXNnLCBFUlJPUl9JTlRFUkZBQ0UgIi5G YWlsZWQiLAorCQkJCSJDYW4gbm90IHBhc3MgZmlsZSBkZXNjcmlwdG9yIik7CisJZWxzZQorCQly ZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVybihndy0+bXNnKTsKKworCXJldHVy biBGQUxTRTsKK30KKworc3RhdGljIGludCBwb3J0X29wZW4oc3RydWN0IGF1ZGlvX2RldmljZSAq ZGV2KQoreworCWludCBmZDsKKworCWZkID0gb3BlbihkZXYtPmdhdGV3YXktPnR0eSwgT19SRFdS IHwgT19OT0NUVFkgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPCAwKSB7CisJCWdfdGltZW91dF9h ZGQoT1BFTl9XQUlULCBvcGVuX2NvbnRpbnVlLCBkZXYpOworCQlyZXR1cm4gLUVJTlBST0dSRVNT OworCX0KKworCXJldHVybiBmZDsKK30KKwogc3RhdGljIHZvaWQgcmZjb21tX2Nvbm5lY3RfY2Io R0lPQ2hhbm5lbCAqY2hhbiwgR0Vycm9yICplcnIsCiAJCQkJZ3BvaW50ZXIgdXNlcl9kYXRhKQog ewogCXN0cnVjdCBhdWRpb19kZXZpY2UgKmRldiA9IHVzZXJfZGF0YTsKIAlzdHJ1Y3QgZ2F0ZXdh eSAqZ3cgPSBkZXYtPmdhdGV3YXk7Ci0JZ2NoYXIgZ3dfYWRkclsxOF07Ci0JR0lPRmxhZ3MgZmxh Z3M7CisJc3RydWN0IHJmY29tbV9kZXZfcmVxIHJlcTsKKwlEQnVzTWVzc2FnZSAqcmVwbHk7CisJ aW50IHNrLCBmZCwgaWQ7CisJY29uc3QgY2hhciAqZXJyX21zZzsKKwljaGFyIHNyY1sxOF0sIGRz dFsxOF07CiAKIAlpZiAoZXJyKSB7CiAJCWVycm9yKCJjb25uZWN0KCk6ICVzIiwgZXJyLT5tZXNz YWdlKTsKIAkJaWYgKGd3LT5zY29fc3RhcnRfY2IpCiAJCQlndy0+c2NvX3N0YXJ0X2NiKE5VTEws IGd3LT5zY29fc3RhcnRfY2JfZGF0YSk7Ci0JCXJldHVybjsKKwkJZ290byBmYWlsOwogCX0KIAot CWJhMnN0cigmZGV2LT5kc3QsIGd3X2FkZHIpOwotCS8qIEJsb2NraW5nIG1vZGUgc2hvdWxkIGJl IGRlZmF1bHQsIGJ1dCBqdXN0IGluIGNhc2U6ICovCi0JZmxhZ3MgPSBnX2lvX2NoYW5uZWxfZ2V0 X2ZsYWdzKGNoYW4pOwotCWZsYWdzICY9IH5HX0lPX0ZMQUdfTk9OQkxPQ0s7Ci0JZmxhZ3MgJj0g R19JT19GTEFHX01BU0s7Ci0JZ19pb19jaGFubmVsX3NldF9mbGFncyhjaGFuLCBmbGFncywgTlVM TCk7Ci0JZ19pb19jaGFubmVsX3NldF9lbmNvZGluZyhjaGFuLCBOVUxMLCBOVUxMKTsKLQlnX2lv X2NoYW5uZWxfc2V0X2J1ZmZlcmVkKGNoYW4sIEZBTFNFKTsKLQlpZiAoIWd3LT5yZmNvbW0pCi0J CWd3LT5yZmNvbW0gPSBnX2lvX2NoYW5uZWxfcmVmKGNoYW4pOworCWJhMnN0cigmZGV2LT5zcmMs IHNyYyk7CisJYmEyc3RyKCZkZXYtPmRzdCwgZHN0KTsKKworCS8qIG1ha2UgL2Rldi9yZmNvbW0g c2VyaWFsIHBvcnQgZnJvbSBjaGFuICovCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsK KwlyZXEuZGV2X2lkID0gLTE7CisJcmVxLmZsYWdzID0gKDEgPDwgUkZDT01NX1JFVVNFX0RMQyk7 CisJYmFjcHkoJnJlcS5zcmMsICZkZXYtPnNyYyk7CisJYmFjcHkoJnJlcS5kc3QsICZkZXYtPmRz dCk7CisJcmVxLmNoYW5uZWwgPSBndy0+Y2hhbm5lbDsKKworCXNrID0gZ19pb19jaGFubmVsX3Vu aXhfZ2V0X2ZkKGNoYW4pOworCWlkID0gaW9jdGwoc2ssIFJGQ09NTUNSRUFURURFViwgJnJlcSk7 CisJaWYgKGlkIDwgMCkgeworCQllcnJfbXNnID0gc3RyZXJyb3IoZXJybm8pOworCQllcnJvcigi aW9jdGwoUkZDT01NQ1JFQVRFREVWKSBmYWlsZWQ6ICVzICglZCkiLAorCQkJCXN0cmVycm9yKGVy cm5vKSwgZXJybm8pOworCQlnX2lvX2NoYW5uZWxfc2h1dGRvd24oY2hhbiwgVFJVRSwgTlVMTCk7 CisJCWdfaW9fY2hhbm5lbF91bnJlZihjaGFuKTsKKwkJY2hhbiA9IE5VTEw7CisJCWdvdG8gZmFp bDsKKwl9CiAKLQlpZiAoTlVMTCAhPSBndy0+c2NvX3N0YXJ0X2NiKQotCQlndy0+c2NvX3N0YXJ0 X2NiKE5VTEwsIGd3LT5zY29fc3RhcnRfY2JfZGF0YSk7CisJZ3ctPnJmY29tbV9pZCA9IGlkOwor CWd3LT50dHkgPSBnX3N0cmR1cF9wcmludGYoIi9kZXYvcmZjb21tJWQiLCBpZCk7CiAKLQlnYXRl d2F5X2Nsb3NlKGRldik7CisJZ19pb19jaGFubmVsX3NodXRkb3duKGNoYW4sIFRSVUUsIE5VTEwp OworCisJLyogQWRkcmVzc2luZyBjb25uZWN0IHBvcnQgKi8KKwlmZCA9IHBvcnRfb3BlbihkZXYp OworCWlmIChmZCA8IDApCisJCS8qIE9wZW4gaW4gcHJvZ3Jlc3M6IFdhaXQgdGhlIGNhbGxiYWNr ICovCisJCXJldHVybjsKKworCW9wZW5fbm90aWZ5KGZkLCAwLCBkZXYpOworCWd3LT5yZmNvbW1f ZmQgPSBmZDsKKworCWlmICghYWdlbnRfc2VuZGZkKGd3LT5hZ2VudCwgZmQsIG5ld2Nvbm5lY3Rp b25fcmVwbHksIGd3KSkgeworCQlyZXBseSA9IGdfZGJ1c19jcmVhdGVfZXJyb3IoZ3ctPm1zZywg RVJST1JfSU5URVJGQUNFICIuRmFpbGVkIiwKKwkJCQkiQ2FuIG5vdCBwYXNzIGZpbGUgZGVzY3Jp cHRvciIpOworCX0gZWxzZQorCQlyZXBseSA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3JldHVy bihndy0+bXNnKTsKKworCXJldHVybjsKKworZmFpbDoKKwlpZiAoZ3ctPm1zZykgeworCQllcnJv cl9jb21tb25fcmVwbHkoZGV2LT5jb25uLCBndy0+bXNnLCBFUlJPUl9JTlRFUkZBQ0UKKwkJCQki LkZhaWxlZCIsICIuQ29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZCIpOworCQlkYnVzX21lc3NhZ2Vf dW5yZWYoZ3ctPm1zZyk7CisJCWd3LT5tc2cgPSBOVUxMOworCX0KKwljaGFuZ2Vfc3RhdGUoZGV2 LCBHQVRFV0FZX1NUQVRFX0RJU0NPTk5FQ1RFRCk7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9p ZCBnZXRfcmVjb3JkX2NiKHNkcF9saXN0X3QgKnJlY3MsIGludCBwZXJyLCBncG9pbnRlciB1c2Vy X2RhdGEpCiB7CiAJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2ID0gdXNlcl9kYXRhOwotCURCdXNN ZXNzYWdlICptc2cgPSBkZXYtPmdhdGV3YXktPmNvbm5lY3RfbWVzc2FnZTsKKwlzdHJ1Y3QgZ2F0 ZXdheSAqZ3cgPSBkZXYtPmdhdGV3YXk7CiAJaW50IGNoID0gLTE7CiAJc2RwX2xpc3RfdCAqcHJv dG9zLCAqY2xhc3NlczsKIAl1dWlkX3QgdXVpZDsKQEAgLTE4Miw4ICs0MTcsNiBAQCBzdGF0aWMg dm9pZCBnZXRfcmVjb3JkX2NiKHNkcF9saXN0X3QgKnJlY3MsIGludCBwZXJyLCBncG9pbnRlciB1 c2VyX2RhdGEpCiAKIAlpZiAoIXNkcF91dWlkMTI4X3RvX3V1aWQoJnV1aWQpIHx8IHV1aWQudHlw ZSAhPSBTRFBfVVVJRDE2IHx8CiAJCQl1dWlkLnZhbHVlLnV1aWQxNiAhPSBIQU5EU0ZSRUVfQUdX X1NWQ0xBU1NfSUQpIHsKLQkJc2RwX2xpc3RfZm9yZWFjaChwcm90b3MsIChzZHBfbGlzdF9mdW5j X3QpIHNkcF9saXN0X2ZyZWUsCi0JCQkJCQkJCQlOVUxMKTsKIAkJc2RwX2xpc3RfZnJlZShwcm90 b3MsIE5VTEwpOwogCQllcnJvcigiSW52YWxpZCBzZXJ2aWNlIHJlY29yZCBvciBub3QgSEZQIik7 CiAJCWdvdG8gZmFpbDsKQEAgLTE5Nyw2ICs0MzAsOCBAQCBzdGF0aWMgdm9pZCBnZXRfcmVjb3Jk X2NiKHNkcF9saXN0X3QgKnJlY3MsIGludCBwZXJyLCBncG9pbnRlciB1c2VyX2RhdGEpCiAJCWdv dG8gZmFpbDsKIAl9CiAKKwlndy0+Y2hhbm5lbCA9IGNoOworCiAJaW8gPSBidF9pb19jb25uZWN0 KEJUX0lPX1JGQ09NTSwgcmZjb21tX2Nvbm5lY3RfY2IsIGRldiwgTlVMTCwgJmVyciwKIAkJCQlC VF9JT19PUFRfU09VUkNFX0JEQUREUiwgJmRldi0+c3JjLAogCQkJCUJUX0lPX09QVF9ERVNUX0JE QUREUiwgJmRldi0+ZHN0LApAQCAtMjA0LDI1ICs0MzksMjYgQEAgc3RhdGljIHZvaWQgZ2V0X3Jl Y29yZF9jYihzZHBfbGlzdF90ICpyZWNzLCBpbnQgcGVyciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQog CQkJCUJUX0lPX09QVF9JTlZBTElEKTsKIAlpZiAoIWlvKSB7CiAJCWVycm9yKCJVbmFibGUgdG8g Y29ubmVjdDogJXMiLCBlcnItPm1lc3NhZ2UpOwotCQlpZiAobXNnKSB7Ci0JCQllcnJvcl9jb21t b25fcmVwbHkoZGV2LT5jb25uLCBtc2csIEVSUk9SX0lOVEVSRkFDRQotCQkJCQkJIi5Db25uZWN0 aW9uQXR0ZW1wdEZhaWxlZCIsCi0JCQkJCQllcnItPm1lc3NhZ2UpOwotCQkJbXNnID0gTlVMTDsK LQkJfQotCQlnX2Vycm9yX2ZyZWUoZXJyKTsKKwkJaWYgKGVycikKKwkJCWdfZXJyb3JfZnJlZShl cnIpOwogCQlnYXRld2F5X2Nsb3NlKGRldik7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAlnX2lvX2No YW5uZWxfdW5yZWYoaW8pOworCisJY2hhbmdlX3N0YXRlKGRldiwgR0FURVdBWV9TVEFURV9DT05O RUNUSU5HKTsKIAlyZXR1cm47CiAKIGZhaWw6Ci0JaWYgKG1zZykKLQkJZXJyb3JfY29tbW9uX3Jl cGx5KGRldi0+Y29ubiwgbXNnLCBFUlJPUl9JTlRFUkZBQ0UKLQkJCQkJIi5Ob3RTdXBwb3J0ZWQi LCAiTm90IHN1cHBvcnRlZCIpOworCWlmIChndy0+bXNnKSB7CisJCWVycm9yX2NvbW1vbl9yZXBs eShkZXYtPmNvbm4sIGd3LT5tc2csIEVSUk9SX0lOVEVSRkFDRQorCQkJCSIuTm90U3VwcG9ydGVk IiwgIk5vdCBzdXBwb3J0ZWQiKTsKKwkJZGJ1c19tZXNzYWdlX3VucmVmKGd3LT5tc2cpOworCQln dy0+bXNnID0gTlVMTDsKKwl9CiAKLQlkZXYtPmdhdGV3YXktPmNvbm5lY3RfbWVzc2FnZSA9IE5V TEw7CisJY2hhbmdlX3N0YXRlKGRldiwgR0FURVdBWV9TVEFURV9ESVNDT05ORUNURUQpOwogCiAJ c2NvX2NiID0gZGV2LT5nYXRld2F5LT5zY29fc3RhcnRfY2I7CiAJaWYgKHNjb19jYikKQEAgLTI0 NSwyMiArNDgxLDkzIEBAIHN0YXRpYyBEQnVzTWVzc2FnZSAqYWdfY29ubmVjdChEQnVzQ29ubmVj dGlvbiAqY29ubiwgREJ1c01lc3NhZ2UgKm1zZywKIAlzdHJ1Y3QgZ2F0ZXdheSAqZ3cgPSBhdV9k ZXYtPmdhdGV3YXk7CiAKIAlkZWJ1ZygiYXQgdGhlIGJlZ2luIG9mIGFnX2Nvbm5lY3QoKSIpOwot CWlmIChndy0+cmZjb21tKQorCisJaWYgKGd3LT50dHkpCiAJCXJldHVybiBnX2RidXNfY3JlYXRl X2Vycm9yKG1zZywgRVJST1JfSU5URVJGQUNFCiAJCQkJCSIuQWxyZWFkeUNvbm5lY3RlZCIsCiAJ CQkJCSJBbHJlYWR5IENvbm5lY3RlZCIpOwogCi0JZ3ctPmNvbm5lY3RfbWVzc2FnZSA9IGRidXNf bWVzc2FnZV9yZWYobXNnKTsKKwlpZiAoIWd3LT5hZ2VudCkKKwkJcmV0dXJuIGdfZGJ1c19jcmVh dGVfZXJyb3IobXNnLCBFUlJPUl9JTlRFUkZBQ0UKKwkJCQkiLkZhaWxlZCIsICJBZ2VudCBub3Qg YXNzaW5lZCIpOworCisJZ3ctPm1zZyA9IGRidXNfbWVzc2FnZV9yZWYobXNnKTsKIAlpZiAoZ2V0 X3JlY29yZHMoYXVfZGV2KSA8IDApIHsKLQkJZGJ1c19tZXNzYWdlX3VucmVmKGd3LT5jb25uZWN0 X21lc3NhZ2UpOworCQlkYnVzX21lc3NhZ2VfdW5yZWYoZ3ctPm1zZyk7CiAJCXJldHVybiBnX2Ri dXNfY3JlYXRlX2Vycm9yKG1zZywgRVJST1JfSU5URVJGQUNFCiAJCQkJCSIuQ29ubmVjdEF0dGVt cHRGYWlsZWQiLAogCQkJCQkiQ29ubmVjdCBBdHRlbXB0IEZhaWxlZCIpOwogCX0KIAlkZWJ1Zygi YXQgdGhlIGVuZCBvZiBhZ19jb25uZWN0KCkiKTsKKwogCXJldHVybiBOVUxMOwogfQogCitzdGF0 aWMgaW50IGdhdGV3YXlfcmVsZWFzZV90dHkoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2aWNlKQor eworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldmljZS0+Z2F0ZXdheTsKKwlzdHJ1Y3QgcmZjb21t X2Rldl9yZXEgcmVxOworCWludCByZmNvbW1fY3RsOworCWludCBlcnIgPSAwOworCisJcmZjb21t X2N0bCA9IHNvY2tldChBRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX1JGQ09NTSk7CisJ aWYgKHJmY29tbV9jdGwgPCAwKQorCQlyZXR1cm4gLWVycm5vOworCisJaWYgKGd3LT5yZmNvbW1f ZmQpIHsKKwkJY2xvc2UoZ3ctPnJmY29tbV9mZCk7CisJCWd3LT5yZmNvbW1fZmQgPSAtMTsKKwl9 CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCXJlcS5kZXZfaWQgPSBndy0+cmZj b21tX2lkOworCisJcmVxLmZsYWdzID0gKDEgPDwgUkZDT01NX0hBTkdVUF9OT1cpOworCisJaWYg KGlvY3RsKHJmY29tbV9jdGwsIFJGQ09NTVJFTEVBU0VERVYsICZyZXEpIDwgMCkgeworCQllcnIg PSBlcnJubzsKKwkJZXJyb3IoIkNhbid0IHJlbGVhc2UgZGV2aWNlICVzOiAlcyAoJWQpIiwKKwkJ CQlndy0+dHR5LCBzdHJlcnJvcihlcnIpLCBlcnIpOworCX0KKwljbG9zZShyZmNvbW1fY3RsKTsK Kwlndy0+cmZjb21tX2lkID0gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBn YXRld2F5X2Nsb3NlKGdwb2ludGVyIGRhdGEpCit7CisJc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 aWNlID0gZGF0YTsKKwlzdHJ1Y3QgZ2F0ZXdheSAqZ3cgPSBkZXZpY2UtPmdhdGV3YXk7CisJZ2Jv b2xlYW4gdmFsdWUgPSBGQUxTRTsKKworCWlmIChndy0+dHR5KSB7CisJCWdhdGV3YXlfcmVsZWFz ZV90dHkoZGV2aWNlKTsKKwkJZ19mcmVlKGd3LT50dHkpOworCQlndy0+dHR5ID0gTlVMTDsKKwl9 CisKKwlpZiAoZ3ctPnJmY29tbSkgeworCQlnX2lvX2NoYW5uZWxfc2h1dGRvd24oZ3ctPnJmY29t bSwgVFJVRSwgTlVMTCk7CisJCWdfaW9fY2hhbm5lbF91bnJlZihndy0+cmZjb21tKTsKKwkJZ3ct PnJmY29tbSA9IE5VTEw7CisJfQorCisJaWYgKGd3LT5zY28pIHsKKwkJZ19pb19jaGFubmVsX3No dXRkb3duKGd3LT5zY28sIFRSVUUsIE5VTEwpOworCQlnX2lvX2NoYW5uZWxfdW5yZWYoZ3ctPnNj byk7CisJCWd3LT5zY28gPSBOVUxMOworCQlndy0+c2NvX3N0YXJ0X2NiID0gTlVMTDsKKwkJZ3ct PnNjb19zdGFydF9jYl9kYXRhID0gTlVMTDsKKwl9CisKKwlndy0+c3RhdGUgPSBHQVRFV0FZX1NU QVRFX0RJU0NPTk5FQ1RFRDsKKworCWVtaXRfcHJvcGVydHlfY2hhbmdlZChkZXZpY2UtPmNvbm4s IGRldmljZS0+cGF0aCwKKwkJCQlBVURJT19HQVRFV0FZX0lOVEVSRkFDRSwKKwkJCQkiQ29ubmVj dGVkIiwgREJVU19UWVBFX0JPT0xFQU4sICZ2YWx1ZSk7CisJcmV0dXJuIEZBTFNFOworfQorCiBz dGF0aWMgREJ1c01lc3NhZ2UgKmFnX2Rpc2Nvbm5lY3QoREJ1c0Nvbm5lY3Rpb24gKmNvbm4sIERC dXNNZXNzYWdlICptc2csCiAJCQkJCXZvaWQgKmRhdGEpCiB7CkBAIC0yNjksMTEgKzU3NiwxNCBA QCBzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX2Rpc2Nvbm5lY3QoREJ1c0Nvbm5lY3Rpb24gKmNvbm4s IERCdXNNZXNzYWdlICptc2csCiAJREJ1c01lc3NhZ2UgKnJlcGx5ID0gTlVMTDsKIAljaGFyIGd3 X2FkZHJbMThdOwogCisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gTlVMTDsKKwogCXJlcGx5 ID0gZGJ1c19tZXNzYWdlX25ld19tZXRob2RfcmV0dXJuKG1zZyk7CiAJaWYgKCFyZXBseSkKIAkJ cmV0dXJuIE5VTEw7CiAKLQlpZiAoIWd3LT5yZmNvbW0pCisJaWYgKCFndy0+dHR5ICYmICFndy0+ cmZjb21tKQogCQlyZXR1cm4gZ19kYnVzX2NyZWF0ZV9lcnJvcihtc2csIEVSUk9SX0lOVEVSRkFD RQogCQkJCQkJIi5Ob3RDb25uZWN0ZWQiLAogCQkJCQkJIkRldmljZSBub3QgQ29ubmVjdGVkIik7 CkBAIC0yODUsMTYgKzU5NSwxMTcgQEAgc3RhdGljIERCdXNNZXNzYWdlICphZ19kaXNjb25uZWN0 KERCdXNDb25uZWN0aW9uICpjb25uLCBEQnVzTWVzc2FnZSAqbXNnLAogCXJldHVybiByZXBseTsK IH0KIAorc3RhdGljIHZvaWQgYWdlbnRfZXhpdGVkKERCdXNDb25uZWN0aW9uICpjb25uLCB2b2lk ICpkYXRhKQoreworCXN0cnVjdCBnYXRld2F5ICpnYXRld2F5ID0gZGF0YTsKKwlzdHJ1Y3QgYWdl bnQgKmFnZW50ID0gZ2F0ZXdheS0+YWdlbnQ7CisKKwlkZWJ1ZygiQWdlbnQgJXMgZXhpdGVkIiwg YWdlbnQtPm5hbWUpOworCisJYWdlbnRfZnJlZShhZ2VudCk7CisJZ2F0ZXdheS0+YWdlbnQgPSBO VUxMOworfQorCiBzdGF0aWMgREJ1c01lc3NhZ2UgKmFnX2dldF9wcm9wZXJ0aWVzKERCdXNDb25u ZWN0aW9uICpjb25uLCBEQnVzTWVzc2FnZSAqbXNnLAogCQkJCQl2b2lkICpkYXRhKQogewotCXJl dHVybiBOVUxMOworCXN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSA9IGRhdGE7CisJc3RydWN0 IGdhdGV3YXkgKmd3ID0gZGV2aWNlLT5nYXRld2F5OworCURCdXNNZXNzYWdlICpyZXBseTsKKwlE QnVzTWVzc2FnZUl0ZXIgaXRlcjsKKwlEQnVzTWVzc2FnZUl0ZXIgZGljdDsKKwljb25zdCBjaGFy ICp2YWx1ZTsKKworCisJcmVwbHkgPSBkYnVzX21lc3NhZ2VfbmV3X21ldGhvZF9yZXR1cm4obXNn KTsKKwlpZiAoIXJlcGx5KQorCQlyZXR1cm4gTlVMTDsKKworCWRidXNfbWVzc2FnZV9pdGVyX2lu aXRfYXBwZW5kKHJlcGx5LCAmaXRlcik7CisKKwlkYnVzX21lc3NhZ2VfaXRlcl9vcGVuX2NvbnRh aW5lcigmaXRlciwgREJVU19UWVBFX0FSUkFZLAorCQkJREJVU19ESUNUX0VOVFJZX0JFR0lOX0NI QVJfQVNfU1RSSU5HCisJCQlEQlVTX1RZUEVfU1RSSU5HX0FTX1NUUklORyBEQlVTX1RZUEVfVkFS SUFOVF9BU19TVFJJTkcKKwkJCURCVVNfRElDVF9FTlRSWV9FTkRfQ0hBUl9BU19TVFJJTkcsICZk aWN0KTsKKworCXZhbHVlID0gY29ubmVjdGVkMnN0cihndy0+c3RhdGUpOworCWRpY3RfYXBwZW5k X2VudHJ5KCZkaWN0LCAiQ29ubmVjdGVkIiwKKwkJCURCVVNfVFlQRV9TVFJJTkcsICZ2YWx1ZSk7 CisKKwlkYnVzX21lc3NhZ2VfaXRlcl9jbG9zZV9jb250YWluZXIoJml0ZXIsICZkaWN0KTsKKwor CXJldHVybiByZXBseTsKK30KKworc3RhdGljIERCdXNNZXNzYWdlICpyZWdpc3Rlcl9hZ2VudChE QnVzQ29ubmVjdGlvbiAqY29ubiwKKwkJCQkJREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkK K3sKKwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UgPSBkYXRhOworCXN0cnVjdCBnYXRld2F5 ICpndyA9IGRldmljZS0+Z2F0ZXdheTsKKwlzdHJ1Y3QgYWdlbnQgKmFnZW50OworCWNvbnN0IGNo YXIgKnBhdGgsICpuYW1lOworCisKKwlpZiAoZ3ctPmFnZW50KQorCQlyZXR1cm4gZ19kYnVzX2Ny ZWF0ZV9lcnJvcihtc2csCisJCQkJRVJST1JfSU5URVJGQUNFICIuQWxyZWFkeUV4aXN0cyIsCisJ CQkJIkFnZW50IGFscmVhZHkgZXhpc3RzIik7CisKKwlpZiAoIWRidXNfbWVzc2FnZV9nZXRfYXJn cyhtc2csIE5VTEwsIERCVVNfVFlQRV9PQkpFQ1RfUEFUSCwgJnBhdGgsCisJCQlEQlVTX1RZUEVf SU5WQUxJRCkpCisJCXJldHVybiBnX2RidXNfY3JlYXRlX2Vycm9yKG1zZywgRVJST1JfSU5URVJG QUNFCisJCQkJIi5JbnZhbGlkQXJndW1lbnRzIiwgIkludmFsaWQgYXJndW1lbnQiKTsKKworCW5h bWUgPSBkYnVzX21lc3NhZ2VfZ2V0X3NlbmRlcihtc2cpOworCWFnZW50ID0gZ19uZXcwKHN0cnVj dCBhZ2VudCwgMSk7CisJaWYgKCFhZ2VudCkKKwkJcmV0dXJuIGdfZGJ1c19jcmVhdGVfZXJyb3Io bXNnLAorCQkJCUVSUk9SX0lOVEVSRkFDRSAiLkZhaWxlZCIsCisJCQkJIkZhaWxlZCB0byBjcmVh dGUgYSBuZXcgYWdlbnQiKTsKKworCWFnZW50LT5uYW1lID0gc3RyZHVwKG5hbWUpOworCWFnZW50 LT5wYXRoID0gc3RyZHVwKHBhdGgpOworCisJYWdlbnQtPndhdGNoID0gZ19kYnVzX2FkZF9kaXNj b25uZWN0X3dhdGNoKGNvbm4sIG5hbWUsCisJCQlhZ2VudF9leGl0ZWQsIGd3LCBOVUxMKTsKKwor CWd3LT5hZ2VudCA9IGFnZW50OworCisJcmV0dXJuIGRidXNfbWVzc2FnZV9uZXdfbWV0aG9kX3Jl dHVybihtc2cpOworfQorCitzdGF0aWMgREJ1c01lc3NhZ2UgKnVucmVnaXN0ZXJfYWdlbnQoREJ1 c0Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkKK3sK KwlzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UgPSBkYXRhOworCXN0cnVjdCBnYXRld2F5ICpn dyA9IGRldmljZS0+Z2F0ZXdheTsKKwlzdHJ1Y3QgYWdlbnQgKmFnZW50OworCisJaWYgKCFndy0+ YWdlbnQpCisJCWdvdG8gZG9uZTsKKworCWFnZW50ID0gZ3ctPmFnZW50OworCWlmIChzdHJjbXAo YWdlbnQtPm5hbWUsIGRidXNfbWVzc2FnZV9nZXRfc2VuZGVyKG1zZykpICE9IDApCisJCXJldHVy biBnX2RidXNfY3JlYXRlX2Vycm9yKG1zZywKKwkJCQlFUlJPUl9JTlRFUkZBQ0UgIi5GYWlsZWQi LCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKworCWFnZW50X2Rpc2Nvbm5lY3QoZ3ctPmFnZW50KTsK KworCWdfZGJ1c19yZW1vdmVfd2F0Y2goY29ubiwgYWdlbnQtPndhdGNoKTsKKworCWFnZW50X2Zy ZWUoYWdlbnQpOworCWd3LT5hZ2VudCA9IE5VTEw7CisKK2RvbmU6CisJcmV0dXJuIGRidXNfbWVz c2FnZV9uZXdfbWV0aG9kX3JldHVybihtc2cpOwogfQogCiBzdGF0aWMgR0RCdXNNZXRob2RUYWJs ZSBnYXRld2F5X21ldGhvZHNbXSA9IHsKIAl7ICJDb25uZWN0IiwgIiIsICIiLCBhZ19jb25uZWN0 LCBHX0RCVVNfTUVUSE9EX0ZMQUdfQVNZTkMgfSwKLQl7ICJEaXNjb25uZWN0IiwgIiIsICIiLCBh Z19kaXNjb25uZWN0IH0sCisJeyAiRGlzY29ubmVjdCIsICIiLCAiIiwgYWdfZGlzY29ubmVjdCwg R19EQlVTX01FVEhPRF9GTEFHX0FTWU5DIH0sCiAJeyAiR2V0UHJvcGVydGllcyIsICIiLCAiYXtz dn0iLCBhZ19nZXRfcHJvcGVydGllcyB9LAorCXsgIlJlZ2lzdGVyQWdlbnQiLCAibyIsICIiLCBy ZWdpc3Rlcl9hZ2VudCB9LAorCXsgIlVucmVnaXN0ZXJBZ2VudCIsICJvIiwgIiIsIHVucmVnaXN0 ZXJfYWdlbnQgfSwKIAl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMzA3LDE3 ICs3MTgsMjMgQEAgc3RydWN0IGdhdGV3YXkgKmdhdGV3YXlfaW5pdChzdHJ1Y3QgYXVkaW9fZGV2 aWNlICpkZXYpCiB7CiAJc3RydWN0IGdhdGV3YXkgKmd3OwogCisJZ3cgPSBnX25ldzAoc3RydWN0 IGdhdGV3YXksIDEpOworCisJY29ubmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9yZWYoZGV2LT5j b25uKTsKKwogCWlmICghZ19kYnVzX3JlZ2lzdGVyX2ludGVyZmFjZShkZXYtPmNvbm4sIGRldi0+ cGF0aCwKIAkJCQkJQVVESU9fR0FURVdBWV9JTlRFUkZBQ0UsCiAJCQkJCWdhdGV3YXlfbWV0aG9k cywgZ2F0ZXdheV9zaWduYWxzLAogCQkJCQlOVUxMLCBkZXYsIE5VTEwpKQogCQlyZXR1cm4gTlVM TDsKIAotCWRlYnVnKCJpbiBnYXRld2F5X2luaXQsIGRldiBpcyAlcCIsIGRldik7Ci0JZ3cgPSBn X25ldzAoc3RydWN0IGdhdGV3YXksIDEpOwotCWd3LT5zdGF0ZSA9IEdBVEVXQVlfU1RBVEVfRElT Q09OTkVDVEVEOwogCXJldHVybiBndzsKK30KIAordm9pZCBnYXRld2F5X2V4aXQoKQoreworCWRi dXNfY29ubmVjdGlvbl91bnJlZihjb25uZWN0aW9uKTsKKwljb25uZWN0aW9uID0gTlVMTDsKIH0K IAogZ2Jvb2xlYW4gZ2F0ZXdheV9pc19jb25uZWN0ZWQoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 KQpAQCAtMzI2LDE3ICs3NDMsNiBAQCBnYm9vbGVhbiBnYXRld2F5X2lzX2Nvbm5lY3RlZChzdHJ1 Y3QgYXVkaW9fZGV2aWNlICpkZXYpCiAJCQlkZXYtPmdhdGV3YXktPnN0YXRlID09IEdBVEVXQVlf U1RBVEVfQ09OTkVDVEVEKTsKIH0KIAotaW50IGdhdGV3YXlfY29ubmVjdF9yZmNvbW0oc3RydWN0 IGF1ZGlvX2RldmljZSAqZGV2LCBHSU9DaGFubmVsICppbykKLXsKLQlpZiAoIWlvKQotCQlyZXR1 cm4gLUVJTlZBTDsKLQotCWdfaW9fY2hhbm5lbF9yZWYoaW8pOwotCWRldi0+Z2F0ZXdheS0+cmZj b21tID0gaW87Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50IGdhdGV3YXlfY29ubmVjdF9zY28oc3Ry dWN0IGF1ZGlvX2RldmljZSAqZGV2LCBHSU9DaGFubmVsICppbykKIHsKIAlzdHJ1Y3QgZ2F0ZXdh eSAqZ3cgPSBkZXYtPmdhdGV3YXk7CkBAIC0zNDcsNDIgKzc1MywzOSBAQCBpbnQgZ2F0ZXdheV9j b25uZWN0X3NjbyhzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsIEdJT0NoYW5uZWwgKmlvKQogCWd3 LT5zY28gPSBnX2lvX2NoYW5uZWxfcmVmKGlvKTsKIAogCWdfaW9fYWRkX3dhdGNoKGd3LT5zY28s IEdfSU9fRVJSIHwgR19JT19IVVAgfCBHX0lPX05WQUwsCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChHSU9GdW5jKSBzY29faW9fY2IsIGRldik7CisJCQkJIChHSU9GdW5jKSBzY29f aW9fY2IsIGRldik7CisKKwljaGFuZ2Vfc3RhdGUoZGV2LCBHQVRFV0FZX1NUQVRFX1BMQVlJTkcp OworCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZ2F0ZXdheV9zdGFydF9zZXJ2aWNlKHN0cnVjdCBh dWRpb19kZXZpY2UgKmRldmljZSkKK2ludCBnYXRld2F5X2Nvbm5lY3RfcmZjb21tKHN0cnVjdCBh dWRpb19kZXZpY2UgKmRldiwKKwkJR0lPQ2hhbm5lbCAqY2hhbiwgaW50IGNoKQogewotCXJmY29t bV9jb25uZWN0X2NiKGRldmljZS0+Z2F0ZXdheS0+cmZjb21tLCBOVUxMLCBkZXZpY2UpOworCWlm ICghY2hhbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnX2lvX2NoYW5uZWxfcmVmKGNoYW4pOwor CWRldi0+Z2F0ZXdheS0+cmZjb21tID0gY2hhbjsKKwlkZXYtPmdhdGV3YXktPmNoYW5uZWwgPSBj aDsKKworCXJldHVybiAwOwogfQogCi1pbnQgZ2F0ZXdheV9jbG9zZShzdHJ1Y3QgYXVkaW9fZGV2 aWNlICpkZXZpY2UpCit2b2lkIGdhdGV3YXlfc3RhcnRfc2VydmljZShzdHJ1Y3QgYXVkaW9fZGV2 aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2aWNlLT5nYXRld2F5OwotCUdJ T0NoYW5uZWwgKnJmY29tbSA9IGd3LT5yZmNvbW07Ci0JR0lPQ2hhbm5lbCAqc2NvID0gZ3ctPnNj bzsKLQlnYm9vbGVhbiB2YWx1ZSA9IEZBTFNFOworCXN0cnVjdCBnYXRld2F5ICpndyA9IGRldi0+ Z2F0ZXdheTsKKwlHRXJyb3IgKmVyciA9IE5VTEw7CiAKLQlpZiAocmZjb21tKSB7Ci0JCWdfaW9f Y2hhbm5lbF9zaHV0ZG93bihyZmNvbW0sIFRSVUUsIE5VTEwpOwotCQlnX2lvX2NoYW5uZWxfdW5y ZWYocmZjb21tKTsKLQkJZ3ctPnJmY29tbSA9IE5VTEw7Ci0JfQorCWlmIChndy0+cmZjb21tID09 IE5VTEwpCisJCXJldHVybjsKIAotCWlmIChzY28pIHsKLQkJZ19pb19jaGFubmVsX3NodXRkb3du KHNjbywgVFJVRSwgTlVMTCk7Ci0JCWdfaW9fY2hhbm5lbF91bnJlZihzY28pOwotCQlndy0+c2Nv ID0gTlVMTDsKLQkJZ3ctPnNjb19zdGFydF9jYiA9IE5VTEw7Ci0JCWd3LT5zY29fc3RhcnRfY2Jf ZGF0YSA9IE5VTEw7CisJaWYgKCFidF9pb19hY2NlcHQoZ3ctPnJmY29tbSwgcmZjb21tX2Nvbm5l Y3RfY2IsIGRldiwgTlVMTCwKKwkJCQkJCQkmZXJyKSkgeworCQllcnJvcigiYnRfaW9fYWNjZXB0 OiAlcyIsIGVyci0+bWVzc2FnZSk7CisJCWdfZXJyb3JfZnJlZShlcnIpOwogCX0KLQotCWd3LT5z dGF0ZSA9IEdBVEVXQVlfU1RBVEVfRElTQ09OTkVDVEVEOwotCi0JZW1pdF9wcm9wZXJ0eV9jaGFu Z2VkKGRldmljZS0+Y29ubiwgZGV2aWNlLT5wYXRoLAotCQkJCUFVRElPX0dBVEVXQVlfSU5URVJG QUNFLAotCQkJCSJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTiwgJnZhbHVlKTsKLQlyZXR1 cm4gMDsKIH0KIAogLyogVGhlc2UgYXJlIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgZnJvbSB1bml4 LmMgZm9yIGF1ZGlvIHN5c3RlbQpAQCAtMzk0LDEzICs3OTcsMTcgQEAgZ2Jvb2xlYW4gZ2F0ZXdh eV9yZXF1ZXN0X3N0cmVhbShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsCiAJR0Vycm9yICplcnIg PSBOVUxMOwogCUdJT0NoYW5uZWwgKmlvOwogCi0JaWYgKCFndy0+cmZjb21tKSB7CisJaWYgKCFn dy0+dHR5ICYmICFndy0+cmZjb21tKSB7CiAJCWd3LT5zY29fc3RhcnRfY2IgPSBjYjsKIAkJZ3ct PnNjb19zdGFydF9jYl9kYXRhID0gdXNlcl9kYXRhOwogCQlnZXRfcmVjb3JkcyhkZXYpOwogCX0g ZWxzZSBpZiAoIWd3LT5zY28pIHsKKwkJY2hhciBzb3VyY2VbMTI4XSwgZGVzdGluYXRpb25bMTI4 XTsKKwogCQlndy0+c2NvX3N0YXJ0X2NiID0gY2I7CiAJCWd3LT5zY29fc3RhcnRfY2JfZGF0YSA9 IHVzZXJfZGF0YTsKKwkJYmEyc3RyKCZkZXYtPnNyYywgc291cmNlKTsKKwkJYmEyc3RyKCZkZXYt PmRzdCwgZGVzdGluYXRpb24pOwogCQlpbyA9IGJ0X2lvX2Nvbm5lY3QoQlRfSU9fU0NPLCBzY29f Y29ubmVjdF9jYiwgZGV2LCBOVUxMLCAmZXJyLAogCQkJCUJUX0lPX09QVF9TT1VSQ0VfQkRBRERS LCAmZGV2LT5zcmMsCiAJCQkJQlRfSU9fT1BUX0RFU1RfQkRBRERSLCAmZGV2LT5kc3QsCkBAIC00 MTgsMTIgKzgyNSwxMiBAQCBnYm9vbGVhbiBnYXRld2F5X3JlcXVlc3Rfc3RyZWFtKHN0cnVjdCBh dWRpb19kZXZpY2UgKmRldiwKIAlyZXR1cm4gVFJVRTsKIH0KIAotaW50IGdhdGV3YXlfY29uZmln X3N0cmVhbShzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXYsIGdhdGV3YXlfc3RyZWFtX2NiX3Qgc2Nv X2NiLAotCQkJCXZvaWQgKnVzZXJfZGF0YSkKK2ludCBnYXRld2F5X2NvbmZpZ19zdHJlYW0oc3Ry dWN0IGF1ZGlvX2RldmljZSAqZGV2LAorCQkJCWdhdGV3YXlfc3RyZWFtX2NiX3Qgc2NvX2NiLCB2 b2lkICp1c2VyX2RhdGEpCiB7CiAJc3RydWN0IGdhdGV3YXkgKmd3ID0gZGV2LT5nYXRld2F5Owog Ci0JaWYgKCFndy0+cmZjb21tKSB7CisJaWYgKCFndy0+cmZjb21tICYmICFndy0+dHR5KSB7CiAJ CWd3LT5zY29fc3RhcnRfY2IgPSBzY29fY2I7CiAJCWd3LT5zY29fc3RhcnRfY2JfZGF0YSA9IHVz ZXJfZGF0YTsKIAkJcmV0dXJuIGdldF9yZWNvcmRzKGRldik7CkBAIC00NjQsNCArODcxLDMgQEAg dm9pZCBnYXRld2F5X3N1c3BlbmRfc3RyZWFtKHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldikKIAln dy0+c2NvX3N0YXJ0X2NiID0gTlVMTDsKIAlndy0+c2NvX3N0YXJ0X2NiX2RhdGEgPSBOVUxMOwog fQotCmRpZmYgLS1naXQgYS9hdWRpby9nYXRld2F5LmggYi9hdWRpby9nYXRld2F5LmgKaW5kZXgg M2IwNDU3Zi4uZWFmNjgwMSAxMDA2NDQKLS0tIGEvYXVkaW8vZ2F0ZXdheS5oCisrKyBiL2F1ZGlv L2dhdGV3YXkuaApAQCAtNCw2ICs0LDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIw MTAgIE5va2lhIENvcnBvcmF0aW9uCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNl bCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkt MjAwOSAgWmhlbmh1YSBaaGFuZyA8emhlbmh1YS56aGFuZ0BpbnRlbC5jb20+CiAgKgogICoKICAq ICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yIG1vZGlmeQpAQCAtMjIsMjAgKzIzLDI1IEBACiAgKgogICovCiAKLSNkZWZpbmUgQVVE SU9fR0FURVdBWV9JTlRFUkZBQ0UgIm9yZy5ibHVlei5IZWFkc2V0R2F0ZXdheSIKKyNkZWZpbmUg QVVESU9fR0FURVdBWV9JTlRFUkZBQ0UgIm9yZy5ibHVlei5IYW5kc2ZyZWVHYXRld2F5IgogCiAj ZGVmaW5lIERFRkFVTFRfSFNQX0hTX0NIQU5ORUwgNgogI2RlZmluZSBERUZBVUxUX0hGUF9IU19D SEFOTkVMIDcKIAogdHlwZWRlZiBlbnVtIHsKIAlHQVRFV0FZX1NUQVRFX0RJU0NPTk5FQ1RFRCwK LQlHQVRFV0FZX1NUQVRFX0NPTk5FQ1RFRAorCUdBVEVXQVlfU1RBVEVfQ09OTkVDVEVELAorCUdB VEVXQVlfU1RBVEVfQ09OTkVDVElORywKKwlHQVRFV0FZX1NUQVRFX1BMQVlJTkcsCiB9IGdhdGV3 YXlfc3RhdGVfdDsKIAogdHlwZWRlZiB2b2lkICgqZ2F0ZXdheV9zdHJlYW1fY2JfdCkgKHN0cnVj dCBhdWRpb19kZXZpY2UgKmRldiwgdm9pZCAqdXNlcl9kYXRhKTsKKwogc3RydWN0IGdhdGV3YXkg KmdhdGV3YXlfaW5pdChzdHJ1Y3QgYXVkaW9fZGV2aWNlICpkZXZpY2UpOwordm9pZCBnYXRld2F5 X2V4aXQoKTsKIGdib29sZWFuIGdhdGV3YXlfaXNfY29ubmVjdGVkKHN0cnVjdCBhdWRpb19kZXZp Y2UgKmRldik7Ci1pbnQgZ2F0ZXdheV9jb25uZWN0X3JmY29tbShzdHJ1Y3QgYXVkaW9fZGV2aWNl ICpkZXYsIEdJT0NoYW5uZWwgKmNoYW4pOworaW50IGdhdGV3YXlfY29ubmVjdF9yZmNvbW0oc3Ry dWN0IGF1ZGlvX2RldmljZSAqZGV2LAorCQkJR0lPQ2hhbm5lbCAqY2hhbiwgaW50IGNoKTsKIGlu dCBnYXRld2F5X2Nvbm5lY3Rfc2NvKHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldiwgR0lPQ2hhbm5l bCAqY2hhbik7CiB2b2lkIGdhdGV3YXlfc3RhcnRfc2VydmljZShzdHJ1Y3QgYXVkaW9fZGV2aWNl ICpkZXZpY2UpOwogZ2Jvb2xlYW4gZ2F0ZXdheV9yZXF1ZXN0X3N0cmVhbShzdHJ1Y3QgYXVkaW9f ZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9hdWRpby9tYW5hZ2VyLmMgYi9hdWRpby9tYW5hZ2Vy LmMKaW5kZXggNDEzYzFmMy4uZTc2ODAxNCAxMDA2NDQKLS0tIGEvYXVkaW8vbWFuYWdlci5jCisr KyBiL2F1ZGlvL21hbmFnZXIuYwpAQCAtMTk4LDcgKzE5OCw3IEBAIHN0YXRpYyB2b2lkIGhhbmRs ZV91dWlkKGNvbnN0IGNoYXIgKnV1aWRzdHIsIHN0cnVjdCBhdWRpb19kZXZpY2UgKmRldmljZSkK IAkJYnJlYWs7CiAJY2FzZSBIQU5EU0ZSRUVfQUdXX1NWQ0xBU1NfSUQ6CiAJCWRlYnVnKCJGb3Vu ZCBIYW5kc2ZyZWUgQUcgcmVjb3JkIik7Ci0JCWlmIChkZXZpY2UtPmdhdGV3YXkgPT0gTlVMTCkK KwkJaWYgKGVuYWJsZWQuZ2F0ZXdheSAmJiAoZGV2aWNlLT5nYXRld2F5ID09IE5VTEwpKQogCQkJ ZGV2aWNlLT5nYXRld2F5ID0gZ2F0ZXdheV9pbml0KGRldmljZSk7CiAJCWJyZWFrOwogCWNhc2Ug QVVESU9fU0lOS19TVkNMQVNTX0lEOgpAQCAtNTg2LDcgKzU4Niw3IEBAIHN0YXRpYyB2b2lkIGhm X2lvX2NiKEdJT0NoYW5uZWwgKmNoYW4sIGdwb2ludGVyIGRhdGEpCiAJCWdvdG8gZHJvcDsKIAl9 CiAKLQlpZiAoZ2F0ZXdheV9jb25uZWN0X3JmY29tbShkZXZpY2UsIGNoYW4pIDwgMCkgeworCWlm IChnYXRld2F5X2Nvbm5lY3RfcmZjb21tKGRldmljZSwgY2hhbiwgY2gpIDwgMCkgewogCQllcnJv cigiQWxsb2NhdGluZyBuZXcgR0lPQ2hhbm5lbCBmYWlsZWQhIik7CiAJCWdvdG8gZHJvcDsKIAl9 CkBAIC05MDUsMjIgKzkwNSwxMiBAQCBzdGF0aWMgdm9pZCBoZWFkc2V0X3NlcnZlcl9yZW1vdmUo c3RydWN0IGJ0ZF9hZGFwdGVyICphZGFwdGVyKQogc3RhdGljIGludCBnYXRld2F5X3NlcnZlcl9w cm9iZShzdHJ1Y3QgYnRkX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGF1ZGlvX2FkYXB0 ZXIgKmFkcDsKLQljb25zdCBnY2hhciAqcGF0aCA9IGFkYXB0ZXJfZ2V0X3BhdGgoYWRhcHRlcik7 Ci0JaW50IHJldDsKLQotCURCRygicGF0aCAlcyIsIHBhdGgpOwogCiAJYWRwID0gYXVkaW9fYWRh cHRlcl9nZXQoYWRhcHRlcik7CiAJaWYgKCFhZHApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0 ID0gZ2F0ZXdheV9zZXJ2ZXJfaW5pdChhZHApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWF1ZGlvX2Fk YXB0ZXJfcmVmKGFkcCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJu IGdhdGV3YXlfc2VydmVyX2luaXQoYWRwKTsKIH0KIAogc3RhdGljIHZvaWQgZ2F0ZXdheV9zZXJ2 ZXJfcmVtb3ZlKHN0cnVjdCBidGRfYWRhcHRlciAqYWRhcHRlcikKQEAgLTExNjYsOCArMTE1Niwx MCBAQCB2b2lkIGF1ZGlvX21hbmFnZXJfZXhpdCh2b2lkKQogCQl0ZWxlcGhvbnlfZXhpdCgpOwog CX0KIAotCWlmIChlbmFibGVkLmdhdGV3YXkpCisJaWYgKGVuYWJsZWQuZ2F0ZXdheSkgewogCQli dGRfdW5yZWdpc3Rlcl9hZGFwdGVyX2RyaXZlcigmZ2F0ZXdheV9zZXJ2ZXJfZHJpdmVyKTsKKwkJ Z2F0ZXdheV9leGl0KCk7CisJfQogCiAJaWYgKGVuYWJsZWQuc291cmNlIHx8IGVuYWJsZWQuc2lu aykKIAkJYnRkX3VucmVnaXN0ZXJfYWRhcHRlcl9kcml2ZXIoJmEyZHBfc2VydmVyX2RyaXZlcik7 CmRpZmYgLS1naXQgYS9hdWRpby91bml4LmMgYi9hdWRpby91bml4LmMKaW5kZXggNWNmNGY5NC4u YmQxYTQxNSAxMDA2NDQKLS0tIGEvYXVkaW8vdW5peC5jCisrKyBiL2F1ZGlvL3VuaXguYwpAQCAt Mzk1LDYgKzM5NSw5IEBAIHN0YXRpYyB2b2lkIGdhdGV3YXlfcmVzdW1lX2NvbXBsZXRlKHN0cnVj dCBhdWRpb19kZXZpY2UgKmRldiwgdm9pZCAqdXNlcl9kYXRhKQogCXN0cnVjdCBidF9zdGFydF9z dHJlYW1fcnNwICpyc3AgPSAodm9pZCAqKSBidWY7CiAJc3RydWN0IGJ0X25ld19zdHJlYW1faW5k ICppbmQgPSAodm9pZCAqKSBidWY7CiAKKwlpZiAoIWRldikKKwkJZ290byBmYWlsZWQ7CisKIAlt ZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CiAJcnNwLT5oLnR5cGUgPSBCVF9SRVNQT05TRTsK IAlyc3AtPmgubmFtZSA9IEJUX1NUQVJUX1NUUkVBTTsKQEAgLTQxNiw2ICs0MTksMTEgQEAgc3Rh dGljIHZvaWQgZ2F0ZXdheV9yZXN1bWVfY29tcGxldGUoc3RydWN0IGF1ZGlvX2RldmljZSAqZGV2 LCB2b2lkICp1c2VyX2RhdGEpCiAJfQogCiAJY2xpZW50LT5yZXFfaWQgPSAwOworCXJldHVybjsK KworZmFpbGVkOgorCWVycm9yKCJnYXRld2F5X3Jlc3VtZV9jb21wbGV0ZTogcmVzdW1lIGZhaWxl ZCIpOworCXVuaXhfaXBjX2Vycm9yKGNsaWVudCwgQlRfU1RBUlRfU1RSRUFNLCBFSU8pOwogfQog CiBzdGF0aWMgdm9pZCBoZWFkc2V0X3N1c3BlbmRfY29tcGxldGUoc3RydWN0IGF1ZGlvX2Rldmlj ZSAqZGV2LCB2b2lkICp1c2VyX2RhdGEpCi0tIAoxLjYuNC40Cgo= --000e0cd6ad149b5158047ce6941f Content-Type: application/octet-stream; name="0001-Add-HFP-support-in-oFono.patch" Content-Disposition: attachment; filename="0001-Add-HFP-support-in-oFono.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g4bi90d42 RnJvbSBmZGMxNmEzMTU0NzQzOGQ4YjkxZjU1MjExODVmOGVmNWY1Y2Y0M2ZjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHdXN0YXZvIEYuIFBhZG92YW4gPHBhZG92YW5AcHJvZnVzaW9u Lm1vYmk+CkRhdGU6IEZyaSwgOCBKYW4gMjAxMCAxNzoyNTo0MyAtMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEFkZCBIRlAgc3VwcG9ydCBpbiBvRm9ubwoKSXQgdXNlcyBCbHVlWiB0aHJvdWdoIHRvIGdl dCBIRlAgd29ya2luZyBmb2xsb3dpbmcgdGhlCm9yZy5ibHVlei5IYW5kc2ZyZWVHYXRld2F5IGFu ZCBvcmcuYmx1ZXouSGFuZHNmcmVlQWdlbnQgZnJvbSB0aGUgQmx1ZVoKRC1CdXMgQVBJLgoKWW91 IG5lZWQgdGhlIEhGUCBwYXRjaCBpbnRvIEJsdWVaIHRvby4KCk1hbnkgdGhhbmtzIHRvIFpoZW5o dWEgWmhhbmcgPHpoZW5odWEuemhhbmdAaW50ZWwuY29tPiBmb3IgaXRzIHByb3RvdHlwZQpvbiB0 aGlzIGNvZGUuCi0tLQogZ2F0Y2hhdC9nYXR0dHkuYyAgICB8ICAgMjMgKysrKwogZ2F0Y2hhdC9n YXR0dHkuaCAgICB8ICAgIDEgKwogaW5jbHVkZS9tb2RlbS5oICAgICB8ICAgIDIgKwogcGx1Z2lu cy9oZnAuYyAgICAgICB8ICAzMTYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKy0tCiBwbHVnaW5zL21vZGVtY29uZi5jIHwgICAgMyArLQogc3JjL21vZGVt LmMgICAgICAgICB8ICAgMTUgKysrCiA2IGZpbGVzIGNoYW5nZWQsIDM0OCBpbnNlcnRpb25zKCsp LCAxMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9nYXRjaGF0L2dhdHR0eS5jIGIvZ2F0Y2hh dC9nYXR0dHkuYwppbmRleCA3ZDY2NWUxLi5iMjU2NzViIDEwMDY0NAotLS0gYS9nYXRjaGF0L2dh dHR0eS5jCisrKyBiL2dhdGNoYXQvZ2F0dHR5LmMKQEAgLTI2MCwzICsyNjAsMjYgQEAgR0lPQ2hh bm5lbCAqZ19hdF90dHlfb3Blbihjb25zdCBjaGFyICp0dHksIEdIYXNoVGFibGUgKm9wdGlvbnMp CiAKIAlyZXR1cm4gY2hhbm5lbDsKIH0KKworR0lPQ2hhbm5lbCAqZ19hdF9nZXRfY2hhbm5lbF9m cm9tX2ZkKGludCBmZCkKK3sKKwlHSU9DaGFubmVsICpjaGFubmVsOworCXN0cnVjdCB0ZXJtaW9z IHRpOworCisJLyogU3dpdGNoIFRUWSB0byByYXcgbW9kZSAqLworCW1lbXNldCgmdGksIDAsIHNp emVvZih0aSkpOworCWNmbWFrZXJhdygmdGkpOworCXRjZmx1c2goZmQsIFRDSU9GTFVTSCk7CisJ dGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmdGkpOworCisJY2hhbm5lbCA9IGdfaW9fY2hhbm5lbF91 bml4X25ldyhmZCk7CisKKwlpZiAoY2hhbm5lbCA9PSBOVUxMKSB7CisJCWNsb3NlKGZkKTsKKwkJ cmV0dXJuIE5VTEw7CisJfQorCisJZ19pb19jaGFubmVsX3NldF9jbG9zZV9vbl91bnJlZihjaGFu bmVsLCBUUlVFKTsKKworCXJldHVybiBjaGFubmVsOworfQpkaWZmIC0tZ2l0IGEvZ2F0Y2hhdC9n YXR0dHkuaCBiL2dhdGNoYXQvZ2F0dHR5LmgKaW5kZXggYzhlMGM4Zi4uNWZmZjA1ZCAxMDA2NDQK LS0tIGEvZ2F0Y2hhdC9nYXR0dHkuaAorKysgYi9nYXRjaGF0L2dhdHR0eS5oCkBAIC00Myw2ICs0 Myw3IEBAIGV4dGVybiAiQyIgewogICovCiBHSU9DaGFubmVsICpnX2F0X3R0eV9vcGVuKGNvbnN0 IGNoYXIgKnR0eSwgR0hhc2hUYWJsZSAqb3B0aW9ucyk7CiAKK0dJT0NoYW5uZWwgKmdfYXRfZ2V0 X2NoYW5uZWxfZnJvbV9mZChpbnQgZmQpOwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYK ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kZW0uaCBiL2luY2x1ZGUvbW9kZW0uaAppbmRleCBmNzE4 YjljLi5hMzc1YjEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZGVtLmgKKysrIGIvaW5jbHVkZS9t b2RlbS5oCkBAIC00Nyw2ICs0Nyw4IEBAIHN0cnVjdCBvZm9ub19tb2RlbSAqb2Zvbm9fbW9kZW1f Y3JlYXRlKGNvbnN0IGNoYXIgKnR5cGUpOwogaW50IG9mb25vX21vZGVtX3JlZ2lzdGVyKHN0cnVj dCBvZm9ub19tb2RlbSAqbW9kZW0pOwogdm9pZCBvZm9ub19tb2RlbV9yZW1vdmUoc3RydWN0IG9m b25vX21vZGVtICptb2RlbSk7CiAKK3N0cnVjdCBvZm9ub19tb2RlbSAqb2Zvbm9fbW9kZW1fZ2V0 X2J5X3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CisKIHZvaWQgb2Zvbm9fbW9kZW1fc2V0X3Bvd2Vy ZWQoc3RydWN0IG9mb25vX21vZGVtICptb2RlbSwgb2Zvbm9fYm9vbF90IHBvd2VyZWQpOwogb2Zv bm9fYm9vbF90IG9mb25vX21vZGVtX2dldF9wb3dlcmVkKHN0cnVjdCBvZm9ub19tb2RlbSAqbW9k ZW0pOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL2hmcC5jIGIvcGx1Z2lucy9oZnAuYwppbmRleCBi NTZhYmRiLi5kZmE4NGZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL2hmcC5jCisrKyBiL3BsdWdpbnMv aGZwLmMKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDxnbGliLmg+CiAjaW5jbHVkZSA8Z2F0 Y2hhdC5oPgogI2luY2x1ZGUgPGdhdHR0eS5oPgorI2luY2x1ZGUgPGdkYnVzLmg+CisjaW5jbHVk ZSA8b2Zvbm8uaD4KIAogI2RlZmluZSBPRk9OT19BUElfU1VCSkVDVF9UT19DSEFOR0UKICNpbmNs dWRlIDxvZm9uby9wbHVnaW4uaD4KQEAgLTUyLDExICs1NCwyOCBAQAogCiAjaW5jbHVkZSA8ZHJp dmVycy9oZnBtb2RlbS9oZnBtb2RlbS5oPgogCisjaW5jbHVkZSA8b2Zvbm8vZGJ1cy5oPgorCisj ZGVmaW5lIEJMVUVaX1NFUlZJQ0UgIm9yZy5ibHVleiIKKyNkZWZpbmUgQkxVRVpfUEFUSCAiLyIK KyNkZWZpbmUgQkxVRVpfTUFOQUdFUl9JTlRFUkZBQ0UgIm9yZy5ibHVlei5NYW5hZ2VyIgorI2Rl ZmluZSBCTFVFWl9BREFQVEVSX0lOVEVSRkFDRSAib3JnLmJsdWV6LkFkYXB0ZXIiCisjZGVmaW5l IEJMVUVaX0RFVklDRV9JTlRFUkZBQ0UgIm9yZy5ibHVlei5EZXZpY2UiCisjZGVmaW5lIEJMVUVa X0dBVEVXQVlfSU5URVJGQUNFICJvcmcuYmx1ZXouSGFuZHNmcmVlR2F0ZXdheSIKKworI2RlZmlu ZSBIRlBfQUdFTlRfSU5URVJGQUNFICJvcmcuYmx1ZXouSGFuZHNmcmVlQWdlbnQiCisKIHN0YXRp YyBjb25zdCBjaGFyICpicnNmX3ByZWZpeFtdID0geyAiK0JSU0Y6IiwgTlVMTCB9Owogc3RhdGlj IGNvbnN0IGNoYXIgKmNpbmRfcHJlZml4W10gPSB7ICIrQ0lORDoiLCBOVUxMIH07CiBzdGF0aWMg Y29uc3QgY2hhciAqY21lcl9wcmVmaXhbXSA9IHsgIitDTUVSOiIsIE5VTEwgfTsKIHN0YXRpYyBj b25zdCBjaGFyICpjaGxkX3ByZWZpeFtdID0geyAiK0NITEQ6IiwgTlVMTCB9OwogCitzdGF0aWMg REJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CitzdGF0aWMgY2hhciAqb2Zvbm9faGFuZHNmcmVl X3BhdGg7CisKKworc3RhdGljIGludCB0aW1lb3V0OworCiBzdGF0aWMgaW50IGhmcF9kaXNhYmxl KHN0cnVjdCBvZm9ub19tb2RlbSAqbW9kZW0pOwogCiBzdGF0aWMgdm9pZCBoZnBfZGVidWcoY29u c3QgY2hhciAqc3RyLCB2b2lkICp1c2VyX2RhdGEpCkBAIC0xMzUsNiArMTU0LDYwIEBAIHN0YXRp YyB2b2lkIGNtZXJfY2IoZ2Jvb2xlYW4gb2ssIEdBdFJlc3VsdCAqcmVzdWx0LCBncG9pbnRlciB1 c2VyX2RhdGEpCiAJCXNldmljZV9sZXZlbF9jb25uX2VzdGFibGlzaGVkKG1vZGVtKTsKIH0KIAor c3RhdGljIGludCBzZW5kX21ldGhvZF9jYWxsKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIg KnBhdGgsCisJCQkJY29uc3QgY2hhciAqaW50ZXJmYWNlLCBjb25zdCBjaGFyICptZXRob2QsCisJ CQkJREJ1c1BlbmRpbmdDYWxsTm90aWZ5RnVuY3Rpb24gY2IsCisJCQkJdm9pZCAqdXNlcl9kYXRh LCBpbnQgdHlwZSwgLi4uKQoreworCURCdXNNZXNzYWdlICptc2c7CisJREJ1c1BlbmRpbmdDYWxs ICpjYWxsOworCXZhX2xpc3QgYXJnczsKKworCW1zZyA9IGRidXNfbWVzc2FnZV9uZXdfbWV0aG9k X2NhbGwoZGVzdCwgcGF0aCwgaW50ZXJmYWNlLCBtZXRob2QpOworCWlmICghbXNnKSB7CisJCW9m b25vX2Vycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbmV3IEQtQnVzICVzIG1lc3NhZ2UiLCBtZXRo b2QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2YV9zdGFydChhcmdzLCB0eXBlKTsKKwor CWlmICghZGJ1c19tZXNzYWdlX2FwcGVuZF9hcmdzX3ZhbGlzdChtc2csIHR5cGUsIGFyZ3MpKSB7 CisJCWRidXNfbWVzc2FnZV91bnJlZihtc2cpOworCQl2YV9lbmQoYXJncyk7CisJCXJldHVybiAt RUlPOworCX0KKworCXZhX2VuZChhcmdzKTsKKworCWlmICghY2IpIHsKKwkJZ19kYnVzX3NlbmRf bWVzc2FnZShjb25uZWN0aW9uLCBtc2cpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRidXNf Y29ubmVjdGlvbl9zZW5kX3dpdGhfcmVwbHkoY29ubmVjdGlvbiwgbXNnLCAmY2FsbCwgLTEpKSB7 CisJCW9mb25vX2Vycm9yKCJTZW5kaW5nICVzIGZhaWxlZCIsIG1ldGhvZCk7CisJCWRidXNfbWVz c2FnZV91bnJlZihtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkYnVzX3BlbmRpbmdfY2Fs bF9zZXRfbm90aWZ5KGNhbGwsIGNiLCB1c2VyX2RhdGEsIE5VTEwpOworCWRidXNfcGVuZGluZ19j YWxsX3VucmVmKGNhbGwpOworCWRidXNfbWVzc2FnZV91bnJlZihtc2cpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBnYm9vbGVhbiBoZnBfZW5hYmxlX3RpbWVvdXQoZ3BvaW50ZXIgdXNlcikK K3sKKwlzdHJ1Y3Qgb2Zvbm9fbW9kZW0gKm1vZGVtID0gdXNlcjsKKworCWlmIChvZm9ub19tb2Rl bV9nZXRfcG93ZXJlZChtb2RlbSkpCisJCXJldHVybiBGQUxTRTsKKworCWhmcF9kaXNhYmxlKG1v ZGVtKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKIHN0YXRpYyB2b2lkIGNpbmRfc3RhdHVzX2NiKGdi b29sZWFuIG9rLCBHQXRSZXN1bHQgKnJlc3VsdCwKIAkJCQlncG9pbnRlciB1c2VyX2RhdGEpCiB7 CkBAIC0yNjAsOCArMzMzLDcgQEAgZXJyb3I6CiB9CiAKIC8qIGVpdGhlciBvRm9ubyBvciBQaG9u ZSBjb3VsZCByZXF1ZXN0IFNMQyBjb25uZWN0aW9uICovCi1zdGF0aWMgaW50IHNlcnZpY2VfbGV2 ZWxfY29ubmVjdGlvbihzdHJ1Y3Qgb2Zvbm9fbW9kZW0gKm1vZGVtLAotCQkJCWNvbnN0IGNoYXIg KnR0eSkKK3N0YXRpYyBpbnQgc2VydmljZV9sZXZlbF9jb25uZWN0aW9uKHN0cnVjdCBvZm9ub19t b2RlbSAqbW9kZW0sIGludCBmZCkKIHsKIAlzdHJ1Y3QgaGZwX2RhdGEgKmRhdGEgPSBvZm9ub19t b2RlbV9nZXRfZGF0YShtb2RlbSk7CiAJR0lPQ2hhbm5lbCAqaW87CkBAIC0yNjksNyArMzQxLDcg QEAgc3RhdGljIGludCBzZXJ2aWNlX2xldmVsX2Nvbm5lY3Rpb24oc3RydWN0IG9mb25vX21vZGVt ICptb2RlbSwKIAlHQXRDaGF0ICpjaGF0OwogCWNoYXIgYnVmWzY0XTsKIAotCWlvID0gZ19hdF90 dHlfb3Blbih0dHksIE5VTEwpOworCWlvID0gZ19hdF9nZXRfY2hhbm5lbF9mcm9tX2ZkKGZkKTsK IAlpZiAoIWlvKSB7CiAJCW9mb25vX2Vycm9yKCJTZXJ2aWNlIGxldmVsIGNvbm5lY3Rpb24gZmFp bGVkOiAlcyAoJWQpIiwKIAkJCXN0cmVycm9yKGVycm5vKSwgZXJybm8pOwpAQCAtMjk2LDkgKzM2 OCwxNzMgQEAgc3RhdGljIGludCBzZXJ2aWNlX2xldmVsX2Nvbm5lY3Rpb24oc3RydWN0IG9mb25v X21vZGVtICptb2RlbSwKIAlyZXR1cm4gLUVJTlBST0dSRVNTOwogfQogCitzdGF0aWMgREJ1c01l c3NhZ2UgKmhmcF9hZ2VudF9uZXdfY29ubmVjdGlvbihEQnVzQ29ubmVjdGlvbiAqY29ubiwgREJ1 c01lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZmQ7CisJY29uc3QgY2hhciAqcGF0 aDsKKwlzdHJ1Y3Qgb2Zvbm9fbW9kZW0gKm1vZGVtID0gTlVMTDsKKworCXBhdGggPSBkYnVzX21l c3NhZ2VfZ2V0X3BhdGgobXNnKTsKKwltb2RlbSA9IG9mb25vX21vZGVtX2dldF9ieV9wYXRoKHBh dGgpOworCisJaWYgKCFtb2RlbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRidXNfbWVzc2Fn ZV9nZXRfYXJncyhtc2csIE5VTEwsIERCVVNfVFlQRV9VTklYX0ZELCAmZmQsCisJCQkJREJVU19U WVBFX0lOVkFMSUQpKQorCQlyZXR1cm4gX19vZm9ub19lcnJvcl9pbnZhbGlkX2FyZ3MobXNnKTsK KworCXNlcnZpY2VfbGV2ZWxfY29ubmVjdGlvbihtb2RlbSwgZmQpOworCisJcmV0dXJuIE5VTEw7 Cit9CisKK3N0YXRpYyBEQnVzTWVzc2FnZSAqaGZwX2FnZW50X3JlbGVhc2UoREJ1c0Nvbm5lY3Rp b24gKmNvbm4sIERCdXNNZXNzYWdlICptc2csIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIE5VTEw7 Cit9CisKK3N0YXRpYyBHREJ1c01ldGhvZFRhYmxlIGFnZW50X21ldGhvZHNbXSA9IHsKKyAgICAg ICAgeyAiTmV3Q29ubmVjdGlvbiIsICJoIiwgIiIsIGhmcF9hZ2VudF9uZXdfY29ubmVjdGlvbiwK KwkJR19EQlVTX01FVEhPRF9GTEFHX0FTWU5DIH0sCisJeyAiUmVsZWFzZSIsICIiLCAiIiwgaGZw X2FnZW50X3JlbGVhc2UgfSwKKwl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0KK307CisKK3N0YXRp YyB2b2lkIGFnZW50X3JlZ2lzdGVyZWRfY2IoREJ1c1BlbmRpbmdDYWxsICpjYWxsLCBncG9pbnRl ciB1c2VyX2RhdGEpCit7CisJREJ1c01lc3NhZ2UgKnJlcGx5OworCisJcmVwbHkgPSBkYnVzX3Bl bmRpbmdfY2FsbF9zdGVhbF9yZXBseShjYWxsKTsKKwlkYnVzX21lc3NhZ2VfdW5yZWYocmVwbHkp OworfQorCitzdGF0aWMgdm9pZCBhZ2VudF91bnJlZ2lzdGVyZWRfY2IoREJ1c1BlbmRpbmdDYWxs ICpjYWxsLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJREJ1c01lc3NhZ2UgKnJlcGx5OworCisJ cmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBseShjYWxsKTsKKwlkYnVzX21lc3Nh Z2VfdW5yZWYocmVwbHkpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2RldmljZV9jYihEQnVzUGVu ZGluZ0NhbGwgKmNhbGwsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlEQnVzRXJyb3IgZXJyOwor CURCdXNNZXNzYWdlICpyZXBseTsKKwlzdHJ1Y3Qgb2Zvbm9fbW9kZW0gKm1vZGVtID0gdXNlcl9k YXRhOworCWNvbnN0IGNoYXIgKmRldmljZSwgKm9ial9wYXRoOworCWludCByZXQ7CisKKwlyZXBs eSA9IGRidXNfcGVuZGluZ19jYWxsX3N0ZWFsX3JlcGx5KGNhbGwpOworCisJZGJ1c19lcnJvcl9p bml0KCZlcnIpOworCisJaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhyZXBseSwgJmVyciwgREJV U19UWVBFX09CSkVDVF9QQVRILAorCQkJCSZkZXZpY2UsIERCVVNfVFlQRV9JTlZBTElEKSA9PSBG QUxTRSkgeworCQlpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikgPT0gVFJVRSkgeworCQkJb2Zv bm9fZXJyb3IoImFoYSEgJXMiLCBlcnIubWVzc2FnZSk7CisJCQlkYnVzX2Vycm9yX2ZyZWUoJmVy cik7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCW9mb25vX2RlYnVnKCJVc2luZyBkZXZpY2Ug JXMiLCBkZXZpY2UpOworCW9mb25vX2hhbmRzZnJlZV9wYXRoID0gZ19zdHJkdXAoZGV2aWNlKTsK KworCW9ial9wYXRoID0gb2Zvbm9fbW9kZW1fZ2V0X3BhdGgobW9kZW0pOworCisJcmV0ID0gc2Vu ZF9tZXRob2RfY2FsbChCTFVFWl9TRVJWSUNFLCBkZXZpY2UsCisJCQkJQkxVRVpfR0FURVdBWV9J TlRFUkZBQ0UsICJSZWdpc3RlckFnZW50IiwKKwkJCQlhZ2VudF9yZWdpc3RlcmVkX2NiLCBOVUxM LCBEQlVTX1RZUEVfT0JKRUNUX1BBVEgsCisJCQkJJm9ial9wYXRoLCBEQlVTX1RZUEVfSU5WQUxJ RCk7CisKKwlpZiAocmV0IDwgMCkKKwkJb2Zvbm9fZXJyb3IoImFnZW50X3JlZ2lzdGVyIGZhaWxl ZCglZCkiLCByZXQpOworCitkb25lOgorCWRidXNfbWVzc2FnZV91bnJlZihyZXBseSk7OworfQor CitzdGF0aWMgdm9pZCBnZXRfYWRhcHRlcl9jYihEQnVzUGVuZGluZ0NhbGwgKmNhbGwsIGdwb2lu dGVyIHVzZXJfZGF0YSkKK3sKKwlEQnVzRXJyb3IgZXJyOworCURCdXNNZXNzYWdlICpyZXBseTsK KwlzdHJ1Y3Qgb2Zvbm9fbW9kZW0gKm1vZGVtID0gdXNlcl9kYXRhOworCWNvbnN0IGNoYXIgKmFk YXB0ZXIgPSBOVUxMOworCWNvbnN0IGNoYXIgKmFkZHJlc3M7CisJaW50IHJldDsKKworCXJlcGx5 ID0gZGJ1c19wZW5kaW5nX2NhbGxfc3RlYWxfcmVwbHkoY2FsbCk7CisKKwlkYnVzX2Vycm9yX2lu aXQoJmVycik7CisJaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhyZXBseSwgJmVyciwKKwkJCQlE QlVTX1RZUEVfT0JKRUNUX1BBVEgsCisJCQkJJmFkYXB0ZXIsIERCVVNfVFlQRV9JTlZBTElEKSA9 PSBGQUxTRSkgeworCQlpZiAoYWRhcHRlciA9PSBOVUxMKSB7CisJCQlvZm9ub19lcnJvcigiYmx1 ZXRvb3RoIGFkYXB0ZXIgaXMgbm90IGVuYWJsZWQiKTsKKwkJCWRidXNfZXJyb3JfZnJlZSgmZXJy KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSA9 PSBUUlVFKSB7CisJCQlvZm9ub19lcnJvcigiJXMgJXMiLCBhZGFwdGVyLCBlcnIubWVzc2FnZSk7 CisJCQlkYnVzX2Vycm9yX2ZyZWUoJmVycik7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCWFk ZHJlc3MgPSBvZm9ub19tb2RlbV9nZXRfc3RyaW5nKG1vZGVtLCAiQWRkcmVzcyIpOworCisJREJH KCJhZGRyZXNzICVzIiwgYWRkcmVzcyk7CisKKwlpZiAoYWRkcmVzcyA9PSBOVUxMKQorCQlyZXR1 cm47CisKKwlyZXQgPSBzZW5kX21ldGhvZF9jYWxsKEJMVUVaX1NFUlZJQ0UsIGFkYXB0ZXIsCisJ CQkJQkxVRVpfQURBUFRFUl9JTlRFUkZBQ0UsICJGaW5kRGV2aWNlIiwKKwkJCQlmaW5kX2Rldmlj ZV9jYiwgbW9kZW0sCisJCQkJREJVU19UWVBFX1NUUklORywgJmFkZHJlc3MsCisJCQkJREJVU19U WVBFX0lOVkFMSUQpOworCisJaWYgKHJldCA8IDApCisJCW9mb25vX2Vycm9yKCJmaW5kX2Rldmlj ZSBmYWlsZWQoJWQpIiwgcmV0KTsKKworZG9uZToKKwlkYnVzX21lc3NhZ2VfdW5yZWYocmVwbHkp OworCit9CisKK3N0YXRpYyBpbnQgaGZwX3JlZ2lzdGVyX29mb25vX2hhbmRzZnJlZShzdHJ1Y3Qg b2Zvbm9fbW9kZW0gKm1vZGVtKQoreworCW9mb25vX2RlYnVnKCJSZWdpc3RlciBvRm9ubyBBZ2Vu dCB0byBibHVldG9vdGggZGFlbW9uIik7CisKKwlyZXR1cm4gc2VuZF9tZXRob2RfY2FsbChCTFVF Wl9TRVJWSUNFLCBCTFVFWl9QQVRILAorCQkJCUJMVUVaX01BTkFHRVJfSU5URVJGQUNFLCAiRGVm YXVsdEFkYXB0ZXIiLAorCQkJCWdldF9hZGFwdGVyX2NiLCBtb2RlbSwKKwkJCQlEQlVTX1RZUEVf SU5WQUxJRCk7Cit9CisKK3N0YXRpYyBpbnQgaGZwX3VucmVnaXN0ZXJfb2Zvbm9faGFuZHNmcmVl KHN0cnVjdCBvZm9ub19tb2RlbSAqbW9kZW0pCit7CisJY29uc3QgY2hhciAqb2JqX3BhdGggPSBv Zm9ub19tb2RlbV9nZXRfcGF0aChtb2RlbSk7CisKKwlvZm9ub19kZWJ1ZygiVW5yZWdpc3RlciBv Rm9ubyBBZ2VudCB0byBibHVldG9vdGggZGFlbW9uIik7CisKKwlpZiAoIW9mb25vX2hhbmRzZnJl ZV9wYXRoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzZW5kX21ldGhvZF9jYWxsKEJM VUVaX1NFUlZJQ0UsIG9mb25vX2hhbmRzZnJlZV9wYXRoLAorCQkJCUJMVUVaX0dBVEVXQVlfSU5U RVJGQUNFLCAiVW5yZWdpc3RlckFnZW50IiwKKwkJCQlhZ2VudF91bnJlZ2lzdGVyZWRfY2IsIE5V TEwsCisJCQkJREJVU19UWVBFX09CSkVDVF9QQVRILAorCQkJCSZvYmpfcGF0aCwgREJVU19UWVBF X0lOVkFMSUQpOworfQorCiBzdGF0aWMgaW50IGhmcF9wcm9iZShzdHJ1Y3Qgb2Zvbm9fbW9kZW0g Km1vZGVtKQogewogCXN0cnVjdCBoZnBfZGF0YSAqZGF0YTsKKwljb25zdCBjaGFyICpvYmpfcGF0 aDsKKwlEQnVzQ29ubmVjdGlvbiAqY29ubiA9IG9mb25vX2RidXNfZ2V0X2Nvbm5lY3Rpb24oKTsK IAogCWRhdGEgPSBnX3RyeV9uZXcwKHN0cnVjdCBoZnBfZGF0YSwgMSk7CiAJaWYgKCFkYXRhKQpA QCAtMzEyLDYgKzU0OCwxNSBAQCBzdGF0aWMgaW50IGhmcF9wcm9iZShzdHJ1Y3Qgb2Zvbm9fbW9k ZW0gKm1vZGVtKQogCiAJb2Zvbm9fbW9kZW1fc2V0X2RhdGEobW9kZW0sIGRhdGEpOwogCisJY29u bmVjdGlvbiA9IGRidXNfY29ubmVjdGlvbl9yZWYoY29ubik7CisKKwlvYmpfcGF0aCA9IG9mb25v X21vZGVtX2dldF9wYXRoKG1vZGVtKTsKKwlnX2RidXNfcmVnaXN0ZXJfaW50ZXJmYWNlKGNvbm4s IG9ial9wYXRoLCBIRlBfQUdFTlRfSU5URVJGQUNFLAorCQkJYWdlbnRfbWV0aG9kcywgTlVMTCwg TlVMTCwgZGF0YSwgTlVMTCk7CisKKwlpZiAoaGZwX3JlZ2lzdGVyX29mb25vX2hhbmRzZnJlZSht b2RlbSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIy LDI0ICs1NjcsNzQgQEAgc3RhdGljIHZvaWQgaGZwX3JlbW92ZShzdHJ1Y3Qgb2Zvbm9fbW9kZW0g Km1vZGVtKQogCWlmIChkYXRhKQogCQlnX2ZyZWUoZGF0YSk7CiAKKwloZnBfdW5yZWdpc3Rlcl9v Zm9ub19oYW5kc2ZyZWUobW9kZW0pOworCisJaWYgKG9mb25vX2hhbmRzZnJlZV9wYXRoKQorCQln X2ZyZWUob2Zvbm9faGFuZHNmcmVlX3BhdGgpOworCisJZGJ1c19jb25uZWN0aW9uX3VucmVmKGNv bm5lY3Rpb24pOworCiAJb2Zvbm9fbW9kZW1fc2V0X2RhdGEobW9kZW0sIE5VTEwpOwogfQogCitz dGF0aWMgdm9pZCBwb3J0X2Nvbm5lY3RfY2IoREJ1c1BlbmRpbmdDYWxsICpjYWxsLCBncG9pbnRl ciB1c2VyX2RhdGEpCit7CisJREJ1c0Vycm9yIGVycjsKKwlEQnVzTWVzc2FnZSAqcmVwbHk7CisJ Y29uc3QgY2hhciAqbXNnOworCisJcmVwbHkgPSBkYnVzX3BlbmRpbmdfY2FsbF9zdGVhbF9yZXBs eShjYWxsKTsKKworCWRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKworCWlmIChkYnVzX21lc3NhZ2Vf Z2V0X2FyZ3MocmVwbHksICZlcnIsIERCVVNfVFlQRV9TVFJJTkcsCisJCQkJJm1zZywgREJVU19U WVBFX0lOVkFMSUQpID09IEZBTFNFKSB7CisJCWlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSA9 PSBUUlVFKSB7CisJCQlvZm9ub19lcnJvcigiJXMiLCBlcnIubWVzc2FnZSk7CisJCQlkYnVzX2Vy cm9yX2ZyZWUoJmVycik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoc3RyY21wKG1z ZywgIm9rIikpCisJCW9mb25vX2Vycm9yKCJDb25uZWN0IGZhaWxlZDogJXMiLCBtc2cpOworZG9u ZToKKwlkYnVzX21lc3NhZ2VfdW5yZWYocmVwbHkpOworfQorCitzdGF0aWMgaW50IGhmcF9jb25u ZWN0X29mb25vX2hhbmRzZnJlZSgpCit7CisJb2Zvbm9fZGVidWcoIkNvbm5lY3QgdG8gYmx1ZXRv b3RoIGRhZW1vbiIpOworCisJaWYgKCFvZm9ub19oYW5kc2ZyZWVfcGF0aCB8fCAhY29ubmVjdGlv bikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc2VuZF9tZXRob2RfY2FsbChCTFVFWl9T RVJWSUNFLCBvZm9ub19oYW5kc2ZyZWVfcGF0aCwKKwkJCQlCTFVFWl9HQVRFV0FZX0lOVEVSRkFD RSwgIkNvbm5lY3QiLAorCQkJCXBvcnRfY29ubmVjdF9jYiwgTlVMTCwgREJVU19UWVBFX0lOVkFM SUQpOworfQorCiAvKiBwb3dlciB1cCBoYXJkd2FyZSAqLwogc3RhdGljIGludCBoZnBfZW5hYmxl KHN0cnVjdCBvZm9ub19tb2RlbSAqbW9kZW0pCiB7Ci0JY29uc3QgY2hhciAqdHR5OwotCWludCBy ZXQ7Ci0KIAlEQkcoIiVwIiwgbW9kZW0pOwogCi0JdHR5ID0gb2Zvbm9fbW9kZW1fZ2V0X3N0cmlu Zyhtb2RlbSwgIkRldmljZSIpOwotCWlmICh0dHkgPT0gTlVMTCkKKwl0aW1lb3V0ID0gZ190aW1l b3V0X2FkZF9zZWNvbmRzKDEwLCBoZnBfZW5hYmxlX3RpbWVvdXQsIG1vZGVtKTsKKworCWlmICho ZnBfY29ubmVjdF9vZm9ub19oYW5kc2ZyZWUoKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0J cmV0ID0gc2VydmljZV9sZXZlbF9jb25uZWN0aW9uKG1vZGVtLCB0dHkpOworCXJldHVybiAtRUlO UFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgaGZwX2Rpc2Nvbm5lY3Rfb2Zvbm9faGFuZHNmcmVl KCkKK3sKKwlpZiAoIW9mb25vX2hhbmRzZnJlZV9wYXRoIHx8ICFjb25uZWN0aW9uKQorCQlyZXR1 cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIHNlbmRfbWV0aG9kX2NhbGwoQkxV RVpfU0VSVklDRSwgb2Zvbm9faGFuZHNmcmVlX3BhdGgsCisJCQkJQkxVRVpfR0FURVdBWV9JTlRF UkZBQ0UsICJEaXNjb25uZWN0IiwKKwkJCQlOVUxMLCBOVUxMLCBEQlVTX1RZUEVfSU5WQUxJRCk7 CiB9CiAKIHN0YXRpYyBpbnQgaGZwX2Rpc2FibGUoc3RydWN0IG9mb25vX21vZGVtICptb2RlbSkK QEAgLTM1OSw2ICs2NTQsNyBAQCBzdGF0aWMgaW50IGhmcF9kaXNhYmxlKHN0cnVjdCBvZm9ub19t b2RlbSAqbW9kZW0pCiAKIAlvZm9ub19tb2RlbV9zZXRfcG93ZXJlZChtb2RlbSwgRkFMU0UpOwog CisJaGZwX2Rpc2Nvbm5lY3Rfb2Zvbm9faGFuZHNmcmVlKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlm ZiAtLWdpdCBhL3BsdWdpbnMvbW9kZW1jb25mLmMgYi9wbHVnaW5zL21vZGVtY29uZi5jCmluZGV4 IDg4MmZhNWEuLjhmZGVmZjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvbW9kZW1jb25mLmMKKysrIGIv cGx1Z2lucy9tb2RlbWNvbmYuYwpAQCAtMTI0LDEyICsxMjQsMTEgQEAgc3RhdGljIHN0cnVjdCBv Zm9ub19tb2RlbSAqY3JlYXRlX21vZGVtKEdLZXlGaWxlICprZXlmaWxlLCBjb25zdCBjaGFyICpn cm91cCkKIAogCW1vZGVtID0gb2Zvbm9fbW9kZW1fY3JlYXRlKGRyaXZlcik7CiAKLQlpZiAoIWdf c3RyY21wMChkcml2ZXIsICJwaG9uZXNpbSIpKQorCWlmICghZ19zdHJjbXAwKGRyaXZlciwgInBo b25lc2ltIikgfHwgIWdfc3RyY21wMChkcml2ZXIsICJoZnAiKSkKIAkJc2V0X2FkZHJlc3MobW9k ZW0sIGtleWZpbGUsIGdyb3VwKTsKIAogCWlmICghZ19zdHJjbXAwKGRyaXZlciwgImF0Z2VuIikg fHwgIWdfc3RyY21wMChkcml2ZXIsICJnMSIpIHx8CiAJCQkJCQkhZ19zdHJjbXAwKGRyaXZlciwg ImNhbHlwc28iKSB8fAotCQkJCQkJIWdfc3RyY21wMChkcml2ZXIsICJoZnAiKSB8fAogCQkJCQkJ IWdfc3RyY21wMChkcml2ZXIsICJwYWxtcHJlIikpCiAJCXNldF9kZXZpY2UobW9kZW0sIGtleWZp bGUsIGdyb3VwKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21vZGVtLmMgYi9zcmMvbW9kZW0uYwppbmRl eCA1NTdmZTZlLi5mZjQxM2RmIDEwMDY0NAotLS0gYS9zcmMvbW9kZW0uYworKysgYi9zcmMvbW9k ZW0uYwpAQCAtMTA2Nyw2ICsxMDY3LDIxIEBAIHN0cnVjdCBvZm9ub19tb2RlbSAqb2Zvbm9fbW9k ZW1fY3JlYXRlKGNvbnN0IGNoYXIgKnR5cGUpCiAJcmV0dXJuIG1vZGVtOwogfQogCitzdHJ1Y3Qg b2Zvbm9fbW9kZW0gKm9mb25vX21vZGVtX2dldF9ieV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7 CisJR1NMaXN0ICpsOworCXN0cnVjdCBvZm9ub19tb2RlbSAqbW9kZW07CisKKwlmb3IgKGwgPSBn X21vZGVtX2xpc3Q7IGw7IGwgPSBsLT5uZXh0KSB7CisJCW1vZGVtID0gbC0+ZGF0YTsKKworCQlp ZiAoIWdfc3RyY21wMChtb2RlbS0+cGF0aCwgcGF0aCkpCisJCQlyZXR1cm4gbW9kZW07CisJfQor CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGVtaXRfbW9kZW1zKCkKIHsKIAlEQnVz Q29ubmVjdGlvbiAqY29ubiA9IG9mb25vX2RidXNfZ2V0X2Nvbm5lY3Rpb24oKTsKLS0gCjEuNi40 LjQKCg== --000e0cd6ad149b5158047ce6941f--