From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-wg0-f47.google.com ([74.125.82.47]:46445 "EHLO mail-wg0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932130AbaFCIdM (ORCPT ); Tue, 3 Jun 2014 04:33:12 -0400 Received: by mail-wg0-f47.google.com with SMTP id x12so6257832wgg.6 for ; Tue, 03 Jun 2014 01:33:10 -0700 (PDT) Message-ID: <538D8804.2010900@gmail.com> Date: Tue, 03 Jun 2014 10:32:04 +0200 From: =?UTF-8?B?R2HDq3RhbiBDYXJsaWVy?= MIME-Version: 1.0 To: linux-media@vger.kernel.org CC: javier Martin , Fabio Estevam Subject: [CODA] Info about internal buffers in CodaDX6 Content-Type: multipart/mixed; boundary="------------080108070202040904060104" Sender: linux-media-owner@vger.kernel.org List-ID: This is a multi-part message in MIME format. --------------080108070202040904060104 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Dear, I am back to add support of h.264 decoding using Coda DX6 on i.MX27 (after long months of inactivity). I base my work on driver from linux 2.6.22 (libvpu) and last coda.c from linux-next/master. When I send DEC_SEQ_INIT command, it fails but I don't know why. 1) Which internal buffers do Coda DX6 really have/used for decoding PARABUF, WORKBUF, PSBUF, ...) ? 2) What is their role ? 3) I see in some code that there is a command CODA_RET_DEC_SEQ_ERR_REASON (0x1E0), which has the same opcode has RET_DEC_SEQ_NEXT_FRAME_NUM, but when I run this command after DEC_SEQ_INIT, it returns 1 that does not seems to be correct error (regarding RetCode enum in vpu_lib.h in libvpu) Code is based on 3.6.0 kernel revision with some backport from more recent version of coda.c Thanks a lot for your help. Best regards, Gaƫtan Carlier. --------------080108070202040904060104 Content-Type: text/x-patch; name="coda.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="coda.patch" LS0tIC9kZXYvbnVsbAkyMDE0LTA2LTAzIDA5OjQ5OjE4LjI0MzIwNjYzMCArMDIwMAorKysg Y29kYS5oCTIwMTQtMDYtMDMgMTA6MTE6NTMuNTM2NDEzNzczICswMjAwCkBAIC0wLDAgKzEs Mjg1IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9jb2RhL2NvZGFf cmVncy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFZpc3RhIFNpbGljb24gU0wKKyAq ICAgIEphdmllciBNYXJ0aW4gPGphdmllci5tYXJ0aW5AdmlzdGEtc2lsaWNvbi5jb20+Cisg KiAgICBYYXZpZXIgRHVyZXQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX1JFR1NfQ09EQV9IXworI2RlZmluZSBfUkVHU19D T0RBX0hfCisKKy8qIEhXIHJlZ2lzdGVycyAqLworI2RlZmluZSBDT0RBX1JFR19CSVRfQ09E RV9SVU4JCQkweDAwMAorI2RlZmluZQkJQ09EQV9SRUdfUlVOX0VOQUJMRQkJKDEgPDwgMCkK KyNkZWZpbmUgQ09EQV9SRUdfQklUX0NPREVfRE9XTgkJCTB4MDA0CisjZGVmaW5lCQlDT0RB X0RPV05fQUREUkVTU19TRVQoeCkJKCgoeCkgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZQkJ Q09EQV9ET1dOX0RBVEFfU0VUKHgpCQkoKHgpICYgMHhmZmZmKQorI2RlZmluZSBDT0RBX1JF R19CSVRfSE9TVF9JTl9SRVEJCTB4MDA4CisjZGVmaW5lIENPREFfUkVHX0JJVF9JTlRfQ0xF QVIJCQkweDAwYworI2RlZmluZQkJQ09EQV9SRUdfQklUX0lOVF9DTEVBUl9TRVQJMHgxCisj ZGVmaW5lIENPREFfUkVHX0JJVF9JTlRfU1RBVFVTCQkweDAxMAorI2RlZmluZSBDT0RBX1JF R19CSVRfQ09ERV9SRVNFVAkJMHgwMTQKKyNkZWZpbmUJCUNPREFfUkVHX1JFU0VUX0VOQUJM RQkJKDEgPDwgMCkKKyNkZWZpbmUgQ09EQV9SRUdfQklUX0NVUl9QQwkJCTB4MDE4CisKKy8q IFN0YXRpYyBTVyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ09EQV9SRUdfQklUX0NPREVfQlVG X0FERFIJCTB4MTAwCisjZGVmaW5lIENPREFfUkVHX0JJVF9XT1JLX0JVRl9BRERSCQkweDEw NAorI2RlZmluZSBDT0RBX1JFR19CSVRfUEFSQV9CVUZfQUREUgkJMHgxMDgKKyNkZWZpbmUg Q09EQV9SRUdfQklUX1NUUkVBTV9DVFJMCQkweDEwYworI2RlZmluZQkJQ09EQTdfU1RSRUFN X0JVRl9QSUNfUkVTRVQJKDEgPDwgNCkKKyNkZWZpbmUJCUNPREFEWDZfU1RSRUFNX0JVRl9Q SUNfUkVTRVQJKDEgPDwgMykKKyNkZWZpbmUJCUNPREE3X1NUUkVBTV9CVUZfUElDX0ZMVVNI CSgxIDw8IDMpCisjZGVmaW5lCQlDT0RBRFg2X1NUUkVBTV9CVUZfUElDX0ZMVVNICSgxIDw8 IDIpCisjZGVmaW5lCQlDT0RBN19TVFJFQU1fQlVGX0RZTkFMTE9DX0VOCSgxIDw8IDUpCisj ZGVmaW5lCQlDT0RBRFg2X1NUUkVBTV9CVUZfRFlOQUxMT0NfRU4JKDEgPDwgNCkKKyNkZWZp bmUgCUNPREFfU1RSRUFNX0NIS0RJU19PRkZTRVQJKDEgPDwgMSkKKyNkZWZpbmUJCUNPREFf U1RSRUFNX0VORElBTl9TRUxFQ1QJKDEgPDwgMCkKKyNkZWZpbmUgQ09EQV9SRUdfQklUX0ZS QU1FX01FTV9DVFJMCQkweDExMAorI2RlZmluZQkJQ09EQV9JTUFHRV9FTkRJQU5fU0VMRUNU CSgxIDw8IDApCisjZGVmaW5lIENPREFfUkVHX0JJVF9SRF9QVFIoeCkJCQkoMHgxMjAgKyA4 ICogKHgpKQorI2RlZmluZSBDT0RBX1JFR19CSVRfV1JfUFRSKHgpCQkJKDB4MTI0ICsgOCAq ICh4KSkKKyNkZWZpbmUgQ09EQURYNl9SRUdfQklUX1NFQVJDSF9SQU1fQkFTRV9BRERSCTB4 MTQwCisjZGVmaW5lIENPREE3X1JFR19CSVRfQVhJX1NSQU1fVVNFCQkweDE0MAorI2RlZmlu ZQkJQ09EQTdfVVNFX0JJVF9FTkFCTEUJCSgxIDw8IDApCisjZGVmaW5lCQlDT0RBN19VU0Vf SE9TVF9CSVRfRU5BQkxFCSgxIDw8IDcpCisjZGVmaW5lCQlDT0RBN19VU0VfTUVfRU5BQkxF CQkoMSA8PCA0KQorI2RlZmluZQkJQ09EQTdfVVNFX0hPU1RfTUVfRU5BQkxFCSgxIDw8IDEx KQorI2RlZmluZSBDT0RBX1JFR19CSVRfQlVTWQkJCTB4MTYwCisjZGVmaW5lCQlDT0RBX1JF R19CSVRfQlVTWV9GTEFHCQkxCisjZGVmaW5lIENPREFfUkVHX0JJVF9SVU5fQ09NTUFORAkJ MHgxNjQKKyNkZWZpbmUJCUNPREFfQ09NTUFORF9TRVFfSU5JVAkJMQorI2RlZmluZQkJQ09E QV9DT01NQU5EX1NFUV9FTkQJCTIKKyNkZWZpbmUJCUNPREFfQ09NTUFORF9QSUNfUlVOCQkz CisjZGVmaW5lCQlDT0RBX0NPTU1BTkRfU0VUX0ZSQU1FX0JVRgk0CisjZGVmaW5lCQlDT0RB X0NPTU1BTkRfRU5DT0RFX0hFQURFUgk1CisjZGVmaW5lCQlDT0RBX0NPTU1BTkRfRU5DX1BB UkFfU0VUCTYKKyNkZWZpbmUJCUNPREFfQ09NTUFORF9ERUNfUEFSQV9TRVQJNworI2RlZmlu ZQkJQ09EQV9DT01NQU5EX0RFQ19CVUZfRkxVU0gJOAorI2RlZmluZQkJQ09EQV9DT01NQU5E X1JDX0NIQU5HRV9QQVJBTUVURVIgOQorI2RlZmluZQkJQ09EQV9DT01NQU5EX0ZJUk1XQVJF X0dFVAkweGYKKyNkZWZpbmUgQ09EQV9SRUdfQklUX1JVTl9JTkRFWAkJCTB4MTY4CisjZGVm aW5lCQlDT0RBX0lOREVYX1NFVCh4KQkJKCh4KSAmIDB4MykKKyNkZWZpbmUgQ09EQV9SRUdf QklUX1JVTl9DT0RfU1RECQkweDE2YworI2RlZmluZQkJQ09EQURYNl9NT0RFX0RFQ09ERV9N UDQJCTAKKyNkZWZpbmUJCUNPREFEWDZfTU9ERV9FTkNPREVfTVA0CQkxCisjZGVmaW5lCQlD T0RBRFg2X01PREVfREVDT0RFX0gyNjQJMgorI2RlZmluZQkJQ09EQURYNl9NT0RFX0VOQ09E RV9IMjY0CTMKKyNkZWZpbmUJCUNPREE3X01PREVfREVDT0RFX0gyNjQJCTAKKyNkZWZpbmUJ CUNPREE3X01PREVfREVDT0RFX1ZDMQkJMQorI2RlZmluZQkJQ09EQTdfTU9ERV9ERUNPREVf TVAyCQkyCisjZGVmaW5lCQlDT0RBN19NT0RFX0RFQ09ERV9NUDQJCTMKKyNkZWZpbmUJCUNP REE3X01PREVfREVDT0RFX0RWMwkJMworI2RlZmluZQkJQ09EQTdfTU9ERV9ERUNPREVfUlYJ CTQKKyNkZWZpbmUJCUNPREE3X01PREVfREVDT0RFX01KUEcJCTUKKyNkZWZpbmUJCUNPREE3 X01PREVfRU5DT0RFX0gyNjQJCTgKKyNkZWZpbmUJCUNPREE3X01PREVfRU5DT0RFX01QNAkJ MTEKKyNkZWZpbmUJCUNPREE3X01PREVfRU5DT0RFX01KUEcJCTEzCisjZGVmaW5lIAlDT0RB X01PREVfSU5WQUxJRAkJMHhmZmZmCisjZGVmaW5lIENPREFfUkVHX0JJVF9JTlRfRU5BQkxF CQkweDE3MAorI2RlZmluZQkJQ09EQV9JTlRfSU5URVJSVVBUX0VOQUJMRQkoMSA8PCAzKQor CisvKgorICogQ29tbWFuZHMnIG1haWxib3g6CisgKiByZWdpc3RlcnMgd2l0aCBvZmZzZXRz IGluIHRoZSByYW5nZSAweDE4MC0weDFkMAorICogaGF2ZSBkaWZmZXJlbnQgbWVhbmluZyBk ZXBlbmRpbmcgb24gdGhlIGNvbW1hbmQgYmVpbmcKKyAqIGlzc3VlZC4KKyAqLworCisvKiBF bmNvZGVyIFNlcXVlbmNlIEluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIENPREFfQ01EX0VO Q19TRVFfQkJfU1RBUlQJCQkJMHgxODAKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1NFUV9CQl9T SVpFCQkJCTB4MTg0CisjZGVmaW5lIENPREFfQ01EX0VOQ19TRVFfT1BUSU9OCQkJCTB4MTg4 CisjZGVmaW5lCQlDT0RBN19PUFRJT05fR0FNTUFfT0ZGU0VUCQkJOAorI2RlZmluZQkJQ09E QURYNl9PUFRJT05fR0FNTUFfT0ZGU0VUCQkJNworI2RlZmluZQkJQ09EQV9PUFRJT05fTElN SVRRUF9PRkZTRVQJCQk2CisjZGVmaW5lCQlDT0RBX09QVElPTl9SQ0lOVFJBUVBfT0ZGU0VU CQkJNQorI2RlZmluZQkJQ09EQV9PUFRJT05fRk1PX09GRlNFVAkJCQk0CisjZGVmaW5lCQlD T0RBX09QVElPTl9TTElDRVJFUE9SVF9PRkZTRVQJCQkxCisjZGVmaW5lIENPREFfQ01EX0VO Q19TRVFfQ09EX1NURAkJCQkweDE4YworI2RlZmluZQkJQ09EQV9TVERfTVBFRzQJCQkJCTAK KyNkZWZpbmUJCUNPREFfU1REX0gyNjMJCQkJCTEKKyNkZWZpbmUJCUNPREFfU1REX0gyNjQJ CQkJCTIKKyNkZWZpbmUJCUNPREFfU1REX01KUEcJCQkJCTMKKyNkZWZpbmUgQ09EQV9DTURf RU5DX1NFUV9TUkNfU0laRQkJCQkweDE5MAorI2RlZmluZQkJQ09EQTdfUElDV0lEVEhfT0ZG U0VUCQkJCTE2CisjZGVmaW5lCQlDT0RBN19QSUNXSURUSF9NQVNLCQkJCTB4ZmZmZgorI2Rl ZmluZQkJQ09EQURYNl9QSUNXSURUSF9PRkZTRVQJCQkJMTAKKyNkZWZpbmUJCUNPREFEWDZf UElDV0lEVEhfTUFTSwkJCQkweDNmZgorI2RlZmluZQkJQ09EQV9QSUNIRUlHSFRfT0ZGU0VU CQkJCTAKKyNkZWZpbmUJCUNPREFEWDZfUElDSEVJR0hUX01BU0sJCQkJMHgzZmYKKyNkZWZp bmUJCUNPREE3X1BJQ0hFSUdIVF9NQVNLCQkJCTB4ZmZmZgorI2RlZmluZSBDT0RBX0NNRF9F TkNfU0VRX1NSQ19GX1JBVEUJCQkJMHgxOTQKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1NFUV9N UDRfUEFSQQkJCQkweDE5OAorI2RlZmluZQkJQ09EQV9NUDRQQVJBTV9WRVJJRF9PRkZTRVQJ CQk2CisjZGVmaW5lCQlDT0RBX01QNFBBUkFNX1ZFUklEX01BU0sJCQkweDAxCisjZGVmaW5l CQlDT0RBX01QNFBBUkFNX0lOVFJBRENWTENUSFJfT0ZGU0VUCQkyCisjZGVmaW5lCQlDT0RB X01QNFBBUkFNX0lOVFJBRENWTENUSFJfTUFTSwkJMHgwNworI2RlZmluZQkJQ09EQV9NUDRQ QVJBTV9SRVZFUlNJQkxFVkxDRU5BQkxFX09GRlNFVAkxCisjZGVmaW5lCQlDT0RBX01QNFBB UkFNX1JFVkVSU0lCTEVWTENFTkFCTEVfTUFTSwkJMHgwMQorI2RlZmluZQkJQ09EQV9NUDRQ QVJBTV9EQVRBUEFSVElUSU9ORU5BQkxFX09GRlNFVAkwCisjZGVmaW5lCQlDT0RBX01QNFBB UkFNX0RBVEFQQVJUSVRJT05FTkFCTEVfTUFTSwkJMHgwMQorI2RlZmluZSBDT0RBX0NNRF9F TkNfU0VRXzI2M19QQVJBCQkJCTB4MTljCisjZGVmaW5lCQlDT0RBXzI2M1BBUkFNX0FOTkVY SkVOQUJMRV9PRkZTRVQJCTIKKyNkZWZpbmUJCUNPREFfMjYzUEFSQU1fQU5ORVhKRU5BQkxF X01BU0sJCTB4MDEKKyNkZWZpbmUJCUNPREFfMjYzUEFSQU1fQU5ORVhLRU5BQkxFX09GRlNF VAkJMQorI2RlZmluZQkJQ09EQV8yNjNQQVJBTV9BTk5FWEtFTkFCTEVfTUFTSwkJMHgwMQor I2RlZmluZQkJQ09EQV8yNjNQQVJBTV9BTk5FWFRFTkFCTEVfT0ZGU0VUCQkwCisjZGVmaW5l CQlDT0RBXzI2M1BBUkFNX0FOTkVYVEVOQUJMRV9NQVNLCQkweDAxCisjZGVmaW5lIENPREFf Q01EX0VOQ19TRVFfMjY0X1BBUkEJCQkJMHgxYTAKKyNkZWZpbmUJCUNPREFfMjY0UEFSQU1f REVCTEtGSUxURVJPRkZTRVRCRVRBX09GRlNFVAkxMgorI2RlZmluZQkJQ09EQV8yNjRQQVJB TV9ERUJMS0ZJTFRFUk9GRlNFVEJFVEFfTUFTSwkweDBmCisjZGVmaW5lCQlDT0RBXzI2NFBB UkFNX0RFQkxLRklMVEVST0ZGU0VUQUxQSEFfT0ZGU0VUCTgKKyNkZWZpbmUJCUNPREFfMjY0 UEFSQU1fREVCTEtGSUxURVJPRkZTRVRBTFBIQV9NQVNLCTB4MGYKKyNkZWZpbmUJCUNPREFf MjY0UEFSQU1fRElTQUJMRURFQkxLX09GRlNFVAkJNgorI2RlZmluZQkJQ09EQV8yNjRQQVJB TV9ESVNBQkxFREVCTEtfTUFTSwkJMHgwMQorI2RlZmluZQkJQ09EQV8yNjRQQVJBTV9DT05T VFJBSU5FRElOVFJBUFJFREZMQUdfT0ZGU0VUCTUKKyNkZWZpbmUJCUNPREFfMjY0UEFSQU1f Q09OU1RSQUlORURJTlRSQVBSRURGTEFHX01BU0sJMHgwMQorI2RlZmluZQkJQ09EQV8yNjRQ QVJBTV9DSFJPTUFRUE9GRlNFVF9PRkZTRVQJCTAKKyNkZWZpbmUJCUNPREFfMjY0UEFSQU1f Q0hST01BUVBPRkZTRVRfTUFTSwkJMHgxZgorI2RlZmluZSBDT0RBX0NNRF9FTkNfU0VRX1NM SUNFX01PREUJCQkJMHgxYTQKKyNkZWZpbmUJCUNPREFfU0xJQ0lOR19TSVpFX09GRlNFVAkJ CTIKKyNkZWZpbmUJCUNPREFfU0xJQ0lOR19TSVpFX01BU0sJCQkJMHgzZmZmZmZmZgorI2Rl ZmluZQkJQ09EQV9TTElDSU5HX1VOSVRfT0ZGU0VUCQkJMQorI2RlZmluZQkJQ09EQV9TTElD SU5HX1VOSVRfTUFTSwkJCQkweDAxCisjZGVmaW5lCQlDT0RBX1NMSUNJTkdfTU9ERV9PRkZT RVQJCQkwCisjZGVmaW5lCQlDT0RBX1NMSUNJTkdfTU9ERV9NQVNLCQkJCTB4MDEKKyNkZWZp bmUgQ09EQV9DTURfRU5DX1NFUV9HT1BfU0laRQkJCQkweDFhOAorI2RlZmluZQkJQ09EQV9H T1BfU0laRV9PRkZTRVQJCQkJMAorI2RlZmluZQkJQ09EQV9HT1BfU0laRV9NQVNLCQkJCTB4 M2YKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1NFUV9SQ19QQVJBCQkJCTB4MWFjCisjZGVmaW5l CQlDT0RBX1JBVEVDT05UUk9MX0FVVE9TS0lQX09GRlNFVAkJMzEKKyNkZWZpbmUJCUNPREFf UkFURUNPTlRST0xfQVVUT1NLSVBfTUFTSwkJCTB4MDEKKyNkZWZpbmUJCUNPREFfUkFURUNP TlRST0xfSU5JVElBTERFTEFZX09GRlNFVAkJMTYKKyNkZWZpbmUJCUNPREFfUkFURUNPTlRS T0xfSU5JVElBTERFTEFZX01BU0sJCTB4N2YKKyNkZWZpbmUJCUNPREFfUkFURUNPTlRST0xf QklUUkFURV9PRkZTRVQJCTEKKyNkZWZpbmUJCUNPREFfUkFURUNPTlRST0xfQklUUkFURV9N QVNLCQkJMHg3ZgorI2RlZmluZQkJQ09EQV9SQVRFQ09OVFJPTF9FTkFCTEVfT0ZGU0VUCQkJ MAorI2RlZmluZQkJQ09EQV9SQVRFQ09OVFJPTF9FTkFCTEVfTUFTSwkJCTB4MDEKKyNkZWZp bmUgQ09EQV9DTURfRU5DX1NFUV9SQ19CVUZfU0laRQkJCQkweDFiMAorI2RlZmluZSBDT0RB X0NNRF9FTkNfU0VRX0lOVFJBX1JFRlJFU0gJCQkJMHgxYjQKKyNkZWZpbmUgQ09EQURYNl9D TURfRU5DX1NFUV9GTU8JCQkJCTB4MWI4CisjZGVmaW5lCQlDT0RBX0ZNT1BBUkFNX1RZUEVf T0ZGU0VUCQkJNAorI2RlZmluZQkJQ09EQV9GTU9QQVJBTV9UWVBFX01BU0sJCQkJMQorI2Rl ZmluZQkJQ09EQV9GTU9QQVJBTV9TTElDRU5VTV9PRkZTRVQJCQkwCisjZGVmaW5lCQlDT0RB X0ZNT1BBUkFNX1NMSUNFTlVNX01BU0sJCQkweDBmCisjZGVmaW5lIENPREE3X0NNRF9FTkNf U0VRX1NFQVJDSF9CQVNFCQkJCTB4MWI4CisjZGVmaW5lIENPREE3X0NNRF9FTkNfU0VRX1NF QVJDSF9TSVpFCQkJCTB4MWJjCisjZGVmaW5lIENPREFfQ01EX0VOQ19TRVFfUkNfUVBfTUFY CQkJCTB4MWM4CisjZGVmaW5lCQlDT0RBX1FQTUFYX09GRlNFVAkJCQkwCisjZGVmaW5lCQlD T0RBX1FQTUFYX01BU0sJCQkJCTB4M2YKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1NFUV9SQ19H QU1NQQkJCQkweDFjYworI2RlZmluZQkJQ09EQV9HQU1NQV9PRkZTRVQJCQkJMAorI2RlZmlu ZQkJQ09EQV9HQU1NQV9NQVNLCQkJCQkweGZmZmYKKyNkZWZpbmUgQ09EQV9SRVRfRU5DX1NF UV9TVUNDRVNTCQkJCTB4MWMwCisKKy8qIEVuY29kZXIgUGljdHVyZSBSdW4gKi8KKyNkZWZp bmUgQ09EQV9DTURfRU5DX1BJQ19TUkNfQUREUl9ZCTB4MTgwCisjZGVmaW5lIENPREFfQ01E X0VOQ19QSUNfU1JDX0FERFJfQ0IJMHgxODQKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1BJQ19T UkNfQUREUl9DUgkweDE4OAorI2RlZmluZSBDT0RBX0NNRF9FTkNfUElDX1FTCQkweDE4Ywor I2RlZmluZSBDT0RBX0NNRF9FTkNfUElDX1JPVF9NT0RFCTB4MTkwCisjZGVmaW5lCQlDT0RB X1JPVF9NSVJfRU5BQkxFCQkJCSgxIDw8IDQpCisjZGVmaW5lCQlDT0RBX1JPVF8wCQkJCQko MHgwIDw8IDApCisjZGVmaW5lCQlDT0RBX1JPVF85MAkJCQkJKDB4MSA8PCAwKQorI2RlZmlu ZQkJQ09EQV9ST1RfMTgwCQkJCQkoMHgyIDw8IDApCisjZGVmaW5lCQlDT0RBX1JPVF8yNzAJ CQkJCSgweDMgPDwgMCkKKyNkZWZpbmUJCUNPREFfTUlSX05PTkUJCQkJCSgweDAgPDwgMikK KyNkZWZpbmUJCUNPREFfTUlSX1ZFUgkJCQkJKDB4MSA8PCAyKQorI2RlZmluZQkJQ09EQV9N SVJfSE9SCQkJCQkoMHgyIDw8IDIpCisjZGVmaW5lCQlDT0RBX01JUl9WRVJfSE9SCQkJCSgw eDMgPDwgMikKKyNkZWZpbmUgQ09EQV9DTURfRU5DX1BJQ19PUFRJT04JMHgxOTQKKyNkZWZp bmUgQ09EQV9DTURfRU5DX1BJQ19CQl9TVEFSVAkweDE5OAorI2RlZmluZSBDT0RBX0NNRF9F TkNfUElDX0JCX1NJWkUJMHgxOWMKKyNkZWZpbmUgQ09EQV9SRVRfRU5DX1BJQ19UWVBFCQkw eDFjNAorI2RlZmluZSBDT0RBX1JFVF9FTkNfUElDX1NMSUNFX05VTQkweDFjYworI2RlZmlu ZSBDT0RBX1JFVF9FTkNfUElDX0ZMQUcJCTB4MWQwCisKKy8qIERlY29kZXIgU2VxdWVuY2Ug SW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQ09EQV9DTURfREVDX1NFUV9CQl9TVEFSVAkJ CQkweDE4MAorI2RlZmluZSBDT0RBX0NNRF9ERUNfU0VRX0JCX1NJWkUJCQkJMHgxODQKKyNk ZWZpbmUgQ09EQV9DTURfREVDX1NFUV9PUFRJT04JCQkJCTB4MTg4CisjZGVmaW5lCQlDT0RB RFg2X0RFQ19PUFRJT05fUVBSRVBPUlQJCQkxCisjZGVmaW5lCQlDT0RBN19ERUNfT1BUSU9O X01QNERFQkxPQ0sJCQkxCisjZGVmaW5lIENPREFfQ01EX0RFQ19TRVFfU1JDX1NJWkUJCQkJ MHgxOGMKKyNkZWZpbmUJCUNPREE3X1BJQ1dJRFRIX09GRlNFVAkJCQkxNgorI2RlZmluZQkJ Q09EQTdfUElDV0lEVEhfTUFTSwkJCQkweGZmZmYKKyNkZWZpbmUJCUNPREFEWDZfUElDV0lE VEhfT0ZGU0VUCQkJCTEwCisjZGVmaW5lCQlDT0RBRFg2X1BJQ1dJRFRIX01BU0sJCQkJMHgz ZmYKKyNkZWZpbmUJCUNPREFfUElDSEVJR0hUX09GRlNFVAkJCQkwCisjZGVmaW5lCQlDT0RB RFg2X1BJQ0hFSUdIVF9NQVNLCQkJCTB4M2ZmCisjZGVmaW5lCQlDT0RBN19QSUNIRUlHSFRf TUFTSwkJCQkweGZmZmYKKyNkZWZpbmUgQ09EQV9DTURfREVDX1NFUV9TVEFSVF9CWVRFCQkJ CTB4MTkwCisjZGVmaW5lIENPREFfQ01EX0RFQ19TRVFfUFNfQkJfU1RBUlQJCQkJMHgxOTQK KyNkZWZpbmUgQ09EQV9DTURfREVDX1NFUV9QU19CQl9TSVpFCQkJCTB4MTk4CisjZGVmaW5l IENPREFfQ01EX0RFQ19TRVFfSU5JVF9FU0NBUEUJCQkJMHgxMTQKKyNkZWZpbmUgQ09EQV9S RVRfREVDX1NFUV9TVUNDRVNTCQkJCTB4MWMwCisjZGVmaW5lIAlSRVRfREVDX1NFUV9TUkNf Rk1UCQkJCTB4MWM0CisjZGVmaW5lIAlSRVRfREVDX1NFUV9TUkNfU0laRQkJCQkweDFjNAor I2RlZmluZSAJUkVUX0RFQ19TRVFfU1JDX0ZfUkFURQkJCQkweDFjOAorI2RlZmluZSAJUkVU X0RFQ19TRVFfRlJBTUVfTkVFRAkJCQkweDFjYworI2RlZmluZSAJUkVUX0RFQ19TRVFfRlJB TUVfREVMQVkJCQkJMHgxZDAKKyNkZWZpbmUgCVJFVF9ERUNfU0VRX0lORk8JCQkJMHgxZDQK KyNkZWZpbmUgCVJFVF9ERUNfU0VRX0NST1BfTEVGVF9SSUdIVAkJCTB4MWQ4CisjZGVmaW5l IAlSRVRfREVDX1NFUV9DUk9QX1RPUF9CT1RUT00JCQkweDFkYworI2RlZmluZSAJUkVUX0RF Q19TRVFfTkVYVF9GUkFNRV9OVU0JCQkweDFlMAorI2RlZmluZSBDT0RBX1JFVF9ERUNfU0VR X0VSUl9SRUFTT04JCTB4MWUwCisKKworLyogU2V0IEZyYW1lIEJ1ZmZlciAqLworI2RlZmlu ZSBDT0RBX0NNRF9TRVRfRlJBTUVfQlVGX05VTQkJMHgxODAKKyNkZWZpbmUgQ09EQV9DTURf U0VUX0ZSQU1FX0JVRl9TVFJJREUJCTB4MTg0CisjZGVmaW5lIENPREE3X0NNRF9TRVRfRlJB TUVfQVhJX0JJVF9BRERSCTB4MTkwCisjZGVmaW5lIENPREE3X0NNRF9TRVRfRlJBTUVfQVhJ X0lQQUNEQ19BRERSCTB4MTk0CisjZGVmaW5lIENPREE3X0NNRF9TRVRfRlJBTUVfQVhJX0RC S1lfQUREUgkweDE5OAorI2RlZmluZSBDT0RBN19DTURfU0VUX0ZSQU1FX0FYSV9EQktDX0FE RFIJMHgxOWMKKyNkZWZpbmUgQ09EQTdfQ01EX1NFVF9GUkFNRV9BWElfT1ZMX0FERFIJMHgx YTAKKyNkZWZpbmUgQ09EQTdfQ01EX1NFVF9GUkFNRV9TT1VSQ0VfQlVGX1NUUklERQkweDFh OAorCisvKiBFbmNvZGVyIEhlYWRlciAqLworI2RlZmluZSBDT0RBX0NNRF9FTkNfSEVBREVS X0NPREUJMHgxODAKKyNkZWZpbmUJCUNPREFfR0FNTUFfT0ZGU0VUCTAKKyNkZWZpbmUJCUNP REFfSEVBREVSX0gyNjRfU1BTCTAKKyNkZWZpbmUJCUNPREFfSEVBREVSX0gyNjRfUFBTCTEK KyNkZWZpbmUJCUNPREFfSEVBREVSX01QNFZfVk9MCTAKKyNkZWZpbmUJCUNPREFfSEVBREVS X01QNFZfVk9TCTEKKyNkZWZpbmUJCUNPREFfSEVBREVSX01QNFZfVklTCTIKKyNkZWZpbmUg Q09EQV9DTURfRU5DX0hFQURFUl9CQl9TVEFSVAkweDE4NAorI2RlZmluZSBDT0RBX0NNRF9F TkNfSEVBREVSX0JCX1NJWkUJMHgxODgKKworLyogR2V0IFZlcnNpb24gKi8KKyNkZWZpbmUg Q09EQV9DTURfRklSTVdBUkVfVkVSTlVNCQkweDFjMAorI2RlZmluZQkJQ09EQV9GSVJNV0FS RV9QUk9EVUNUKHgpCSgoKHgpID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUJCUNPREFfRklS TVdBUkVfTUFKT1IoeCkJCSgoKHgpID4+IDEyKSAmIDB4MGYpCisjZGVmaW5lCQlDT0RBX0ZJ Uk1XQVJFX01JTk9SKHgpCQkoKCh4KSA+PiA4KSAmIDB4MGYpCisjZGVmaW5lCQlDT0RBX0ZJ Uk1XQVJFX1JFTEVBU0UoeCkJKCh4KSAmIDB4ZmYpCisjZGVmaW5lCQlDT0RBX0ZJUk1XQVJF X1ZFUk5VTShwcm9kdWN0LCBtYWpvciwgbWlub3IsIHJlbGVhc2UpCVwKKwkJCSgocHJvZHVj dCkgPDwgMTYgfCAoKG1ham9yKSA8PCAxMikgfAkJXAorCQkJKChtaW5vcikgPDwgOCkgfCAo cmVsZWFzZSkpCisKK3R5cGVkZWYgZW51bSB7CisJUkVUQ09ERV9TVUNDRVNTID0gMCwKKwlS RVRDT0RFX0ZBSUxVUkUgPSAtMSwKKwlSRVRDT0RFX0lOVkFMSURfSEFORExFID0gLTIsCisJ UkVUQ09ERV9JTlZBTElEX1BBUkFNID0gLTMsCisJUkVUQ09ERV9JTlZBTElEX0NPTU1BTkQg PSAtNCwKKwlSRVRDT0RFX1JPVEFUT1JfT1VUUFVUX05PVF9TRVQgPSAtNSwKKwlSRVRDT0RF X1JPVEFUT1JfU1RSSURFX05PVF9TRVQgPSAtMTEsCisJUkVUQ09ERV9GUkFNRV9OT1RfQ09N UExFVEUgPSAtNiwKKwlSRVRDT0RFX0lOVkFMSURfRlJBTUVfQlVGRkVSID0gLTcsCisJUkVU Q09ERV9JTlNVRkZJQ0lFTlRfRlJBTUVfQlVGRkVSUyA9IC04LAorCVJFVENPREVfSU5WQUxJ RF9TVFJJREUgPSAtOSwKKwlSRVRDT0RFX1dST05HX0NBTExfU0VRVUVOQ0UgPSAtMTAsCisJ UkVUQ09ERV9DQUxMRURfQkVGT1JFID0gLTEyLAorCVJFVENPREVfTk9UX0lOSVRJQUxJWkVE ID0gLTEzLAorCVJFVENPREVfREVCTE9DS0lOR19PVVRQVVRfTk9UX1NFVCA9IC0xNCwKKwlS RVRDT0RFX05PVF9TVVBQT1JURUQgPSAtMTUKK30gUmV0Q29kZTsKKworI2VuZGlmCi0tLSAv ZGV2L251bGwJMjAxNC0wNi0wMyAwOTo0OToxOC4yNDMyMDY2MzAgKzAyMDAKKysrIGNvZGEu YwkyMDE0LTA2LTAzIDEwOjExOjI1LjE1ODQxMjQwMCArMDIwMApAQCAtMCwwICsxLDI0MjMg QEAKKy8qCisgKiBDb2RhIG11bHRpLXN0YW5kYXJkIGNvZGVjIElQCisgKgorICogQ29weXJp Z2h0IChDKSAyMDEyIFZpc3RhIFNpbGljb24gUy5MLgorICogICAgSmF2aWVyIE1hcnRpbiwg PGphdmllci5tYXJ0aW5AdmlzdGEtc2lsaWNvbi5jb20+CisgKiAgICBYYXZpZXIgRHVyZXQK KyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us IG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNp bmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1 ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cisj aW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpZmRlZiBV U0VfS0ZJRk8KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2VuZGlmCisjaW5jbHVkZSA8 bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisK KyNpbmNsdWRlIDxtYWNoL2lyYW0uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+ CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwy LWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZW0ybWVtLmg+CisjaW5jbHVkZSA8 bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1h LWNvbnRpZy5oPgorCisjaW5jbHVkZSAiY29kYS5oIgorCisjZGVmaW5lIENPREFfTkFNRQkJ ImNvZGEiCisKKyNkZWZpbmUgQ09EQURYNl9NQVhfSU5TVEFOQ0VTCTQKKworI2RlZmluZSBD T0RBX0ZNT19CVUZfU0laRQkzMgorI2RlZmluZSBDT0RBRFg2X1dPUktfQlVGX1NJWkUJKDI4 OCAqIDEwMjQgKyBDT0RBX0ZNT19CVUZfU0laRSAqIDggKiAxMDI0KQorI2RlZmluZSBDT0RB N19XT1JLX0JVRl9TSVpFCSg1MTIgKiAxMDI0ICsgQ09EQV9GTU9fQlVGX1NJWkUgKiA4ICog MTAyNCkKKyNkZWZpbmUgQ09EQV9QQVJBX0JVRl9TSVpFCSgxMCAqIDEwMjQpCisjZGVmaW5l IENPREFfSVNSQU1fU0laRQkoMjA0OCAqIDIpCisjZGVmaW5lIENPREE3X0lSQU1fU0laRQkJ MHgxNDAwMCAvKiA4MTkyMCBieXRlcyAqLworCisjZGVmaW5lIENPREE3X1BTX0JVRl9TSVpF CTB4MjgwMDAKKworI2RlZmluZSBDT0RBX01BWF9GUkFNRUJVRkZFUlMJMgorCisjZGVmaW5l IE1BWF9XCQk4MTkyCisjZGVmaW5lIE1BWF9ICQk4MTkyCisjZGVmaW5lIENPREFfTUFYX0ZS QU1FX1NJWkUJMHgxMDAwMDAKKyNkZWZpbmUgRk1PX1NMSUNFX1NBVkVfQlVGX1NJWkUgICAg ICAgICAoMzIpCisjZGVmaW5lIENPREFfREVGQVVMVF9HQU1NQQkJNDA5NgorCisjZGVmaW5l IE1JTl9XIDE3NgorI2RlZmluZSBNSU5fSCAxNDQKKworI2RlZmluZSBTX0FMSUdOCQkxIC8q IG11bHRpcGxlIG9mIDIgKi8KKyNkZWZpbmUgV19BTElHTgkJMSAvKiBtdWx0aXBsZSBvZiAy ICovCisjZGVmaW5lIEhfQUxJR04JCTEgLyogbXVsdGlwbGUgb2YgMiAqLworCisjZGVmaW5l IGZoX3RvX2N0eChfX2ZoKQljb250YWluZXJfb2YoX19maCwgc3RydWN0IGNvZGFfY3R4LCBm aCkKKworc3RhdGljIGludCBjb2RhX2RlYnVnOworbW9kdWxlX3BhcmFtKGNvZGFfZGVidWcs IGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvZGFfZGVidWcsICJEZWJ1ZyBsZXZl bCAoMC0xKSIpOworCitlbnVtIHsKKwlWNEwyX00yTV9TUkMgPSAwLAorCVY0TDJfTTJNX0RT VCA9IDEsCit9OworCitlbnVtIGNvZGFfaW5zdF90eXBlIHsKKwlDT0RBX0lOU1RfRU5DT0RF UiwKKwlDT0RBX0lOU1RfREVDT0RFUiwKK307CisKK2VudW0gY29kYV9wcm9kdWN0IHsKKwlD T0RBX0RYNiA9IDB4ZjAwMSwKKwlDT0RBXzc1NDEgPSAweGYwMTIsCit9OworCitzdHJ1Y3Qg Y29kYV9mbXQgeworCWNoYXIgKm5hbWU7CisJdTMyIGZvdXJjYzsKK307CisKK3N0cnVjdCBj b2RhX2NvZGVjIHsKKwl1MzIgbW9kZTsKKwl1MzIgc3JjX2ZvdXJjYzsKKwl1MzIgZHN0X2Zv dXJjYzsKKwl1MzIgbWF4X3c7CisJdTMyIG1heF9oOworfTsKKworc3RydWN0IGNvZGFfZGV2 dHlwZSB7CisJY2hhcgkJCSpmaXJtd2FyZTsKKwllbnVtIGNvZGFfcHJvZHVjdAlwcm9kdWN0 OworCXN0cnVjdCBjb2RhX2NvZGVjCSpjb2RlY3M7CisJdW5zaWduZWQgaW50CQludW1fY29k ZWNzOworCXNpemVfdAkJCXdvcmtidWZfc2l6ZTsKK307CisKKy8qIFBlci1xdWV1ZSwgZHJp dmVyLXNwZWNpZmljIHByaXZhdGUgZGF0YSAqLworc3RydWN0IGNvZGFfcV9kYXRhIHsKKwl1 bnNpZ25lZCBpbnQJCXdpZHRoOworCXVuc2lnbmVkIGludAkJaGVpZ2h0OworCXVuc2lnbmVk IGludAkJc2l6ZWltYWdlOworCXVuc2lnbmVkIGludAkJZm91cmNjOworfTsKKworc3RydWN0 IGNvZGFfYXV4X2J1ZiB7CisJdm9pZAkJCSp2YWRkcjsKKwlkbWFfYWRkcl90CQlwYWRkcjsK Kwl1MzIJCQlzaXplOworfTsKKworc3RydWN0IGNvZGFfZGV2IHsKKwlzdHJ1Y3QgdjRsMl9k ZXZpY2UJdjRsMl9kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZQl2ZmQ7CisJc3RydWN0IHBs YXRmb3JtX2RldmljZQkqcGxhdF9kZXY7CisJY29uc3Qgc3RydWN0IGNvZGFfZGV2dHlwZSAq ZGV2dHlwZTsKKworCXZvaWQgX19pb21lbQkJKnJlZ3NfYmFzZTsKKwlzdHJ1Y3QgY2xrCQkq Y2xrX3BlcjsKKwlzdHJ1Y3QgY2xrCQkqY2xrX2FoYjsKKworCXN0cnVjdCBjb2RhX2F1eF9i dWYJY29kZWJ1ZjsKKwlzdHJ1Y3QgY29kYV9hdXhfYnVmCXdvcmtidWY7CisJbG9uZyB1bnNp Z25lZCBpbnQJaXJhbV9wYWRkcjsKKworCXNwaW5sb2NrX3QJCWlycWxvY2s7CisJc3RydWN0 IG11dGV4CQlkZXZfbXV0ZXg7CisJc3RydWN0IG11dGV4CQljb2RhX211dGV4OworCXN0cnVj dCB2NGwyX20ybV9kZXYJKm0ybV9kZXY7CisJc3RydWN0IHZiMl9hbGxvY19jdHgJKmFsbG9j X2N0eDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWluc3RhbmNlczsKKwl1bnNpZ25lZCBsb25nCQlp bnN0YW5jZV9tYXNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsJdGltZW91dDsKK307CisKK3N0 cnVjdCBjb2RhX3BhcmFtcyB7CisJdTgJCQlyb3RfbW9kZTsKKwl1OAkJCWgyNjRfaW50cmFf cXA7CisJdTgJCQloMjY0X2ludGVyX3FwOworCXU4CQkJbXBlZzRfaW50cmFfcXA7CisJdTgJ CQltcGVnNF9pbnRlcl9xcDsKKwl1OAkJCWdvcF9zaXplOworCWludAkJCWNvZGVjX21vZGU7 CisJZW51bSB2NGwyX21wZWdfdmlkZW9fbXVsdGlfc2xpY2VfbW9kZSBzbGljZV9tb2RlOwor CXUzMgkJCWZyYW1lcmF0ZTsKKwl1MTYJCQliaXRyYXRlOworCXUzMgkJCXNsaWNlX21heF9i aXRzOworCXUzMgkJCXNsaWNlX21heF9tYjsKK307CisKK3N0cnVjdCBjb2RhX2N0eCB7CisJ c3RydWN0IGNvZGFfZGV2CQkJKmRldjsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZmZXJfbXV0ZXg7 CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKwlpbnQJCQkJYWJvcnRpbmc7CisJaW50CQkJ CXN0cmVhbW9uX291dDsKKwlpbnQJCQkJc3RyZWFtb25fY2FwOworCXUzMgkJCQlpc2VxdWVu Y2U7CisJc3RydWN0IGNvZGFfcV9kYXRhCQlxX2RhdGFbMl07CisJZW51bSBjb2RhX2luc3Rf dHlwZQkJaW5zdF90eXBlOworCXN0cnVjdCBjb2RhX2NvZGVjCQkqY29kZWM7CisJZW51bSB2 NGwyX2NvbG9yc3BhY2UJCWNvbG9yc3BhY2U7CisJc3RydWN0IGNvZGFfcGFyYW1zCQlwYXJh bXM7CisJc3RydWN0IHY0bDJfbTJtX2N0eAkJKm0ybV9jdHg7CisJc3RydWN0IHY0bDJfY3Ry bF9oYW5kbGVyCWN0cmxzOworCXN0cnVjdCB2NGwyX2ZoCQkJZmg7CisJaW50CQkJCWdvcGNv dW50ZXI7CisJY2hhcgkJCQl2cHVfaGVhZGVyWzNdWzY0XTsKKwlpbnQJCQkJdnB1X2hlYWRl cl9zaXplWzNdOworI2lmZGVmIFVTRV9LRklGTworCXN0cnVjdCBrZmlmbwkJCWJpdHN0cmVh bV9maWZvOworI2VuZGlmCisJc3RydWN0IG11dGV4CQkJYml0c3RyZWFtX211dGV4OworCXN0 cnVjdCBjb2RhX2F1eF9idWYJCWJpdHN0cmVhbTsKKwlzdHJ1Y3QgY29kYV9hdXhfYnVmCQlw YXJhYnVmOworCXN0cnVjdCBjb2RhX2F1eF9idWYJCXBzYnVmOworCXN0cnVjdCBjb2RhX2F1 eF9idWYJCXNsaWNlYnVmOworCXN0cnVjdCBjb2RhX2F1eF9idWYJCWludGVybmFsX2ZyYW1l c1tDT0RBX01BWF9GUkFNRUJVRkZFUlNdOworCXN0cnVjdCBjb2RhX2F1eF9idWYJCXdvcmti dWY7CisJaW50CQkJCW51bV9pbnRlcm5hbF9mcmFtZXM7CisJaW50CQkJCWlkeDsKKwlpbnQJ CQkJcmVnX2lkeDsKK307CisKK3N0YXRpYyBjb25zdCB1OCBjb2RhX2ZpbGxlcl9uYWxbMTRd ID0geyAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBjLCAweGZmLAorCQkJMHhmZiwgMHhm ZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHg4MCB9Oworc3RhdGljIGNvbnN0 IHU4IGNvZGFfZmlsbGVyX3NpemVbOF0gPSB7IDAsIDcsIDE0LCAxMywgMTIsIDExLCAxMCwg OSB9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY29kYV93cml0ZShzdHJ1Y3QgY29kYV9kZXYg KmRldiwgdTMyIGRhdGEsIHUzMiByZWcpCit7CisJdjRsMl9kYmcoMSwgY29kYV9kZWJ1Zywg JmRldi0+djRsMl9kZXYsCisJCSAiJXM6IGRhdGE9MHgleCwgcmVnPTB4JXhcbiIsIF9fZnVu Y19fLCBkYXRhLCByZWcpOworCXdyaXRlbChkYXRhLCBkZXYtPnJlZ3NfYmFzZSArIHJlZyk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvZGFfcmVhZChzdHJ1Y3QgY29k YV9kZXYgKmRldiwgdTMyIHJlZykKK3sKKwl1MzIgZGF0YTsKKwlkYXRhID0gcmVhZGwoZGV2 LT5yZWdzX2Jhc2UgKyByZWcpOworCXY0bDJfZGJnKDEsIGNvZGFfZGVidWcsICZkZXYtPnY0 bDJfZGV2LAorCQkgIiVzOiBkYXRhPTB4JXgsIHJlZz0weCV4XG4iLCBfX2Z1bmNfXywgZGF0 YSwgcmVnKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBs b25nIGNvZGFfaXNidXN5KHN0cnVjdCBjb2RhX2RldiAqZGV2KQoreworCXJldHVybiBjb2Rh X3JlYWQoZGV2LCBDT0RBX1JFR19CSVRfQlVTWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50 IGNvZGFfaXNfaW5pdGlhbGl6ZWQoc3RydWN0IGNvZGFfZGV2ICpkZXYpCit7CisJcmV0dXJu IChjb2RhX3JlYWQoZGV2LCBDT0RBX1JFR19CSVRfQ1VSX1BDKSAhPSAwKTsKK30KKworc3Rh dGljIGludCBjb2RhX3dhaXRfdGltZW91dChzdHJ1Y3QgY29kYV9kZXYgKmRldikKK3sKKwl1 bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAw KTsKKworCXdoaWxlIChjb2RhX2lzYnVzeShkZXYpKSB7CisJCWlmICh0aW1lX2FmdGVyKGpp ZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBjb2RhX2NvbW1hbmRfYXN5bmMoc3RydWN0IGNvZGFfY3R4 ICpjdHgsIGludCBjbWQpCit7CisJc3RydWN0IGNvZGFfZGV2ICpkZXYgPSBjdHgtPmRldjsK Kwljb2RhX3dyaXRlKGRldiwgQ09EQV9SRUdfQklUX0JVU1lfRkxBRywgQ09EQV9SRUdfQklU X0JVU1kpOworCisJY29kYV93cml0ZShkZXYsIGN0eC0+aWR4LCBDT0RBX1JFR19CSVRfUlVO X0lOREVYKTsKKwljb2RhX3dyaXRlKGRldiwgY3R4LT5wYXJhbXMuY29kZWNfbW9kZSwgQ09E QV9SRUdfQklUX1JVTl9DT0RfU1REKTsKKwljb2RhX3dyaXRlKGRldiwgY21kLCBDT0RBX1JF R19CSVRfUlVOX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW50IGNvZGFfY29tbWFuZF9zeW5j KHN0cnVjdCBjb2RhX2N0eCAqY3R4LCBpbnQgY21kKQoreworCXN0cnVjdCBjb2RhX2RldiAq ZGV2ID0gY3R4LT5kZXY7CisKKwljb2RhX2NvbW1hbmRfYXN5bmMoY3R4LCBjbWQpOworCXJl dHVybiBjb2RhX3dhaXRfdGltZW91dChkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGNvZGFf cV9kYXRhICpnZXRfcV9kYXRhKHN0cnVjdCBjb2RhX2N0eCAqY3R4LAorCQkJCQkgZW51bSB2 NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBWNEwyX0JV Rl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJcmV0dXJuICYoY3R4LT5xX2RhdGFbVjRMMl9NMk1f U1JDXSk7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCXJldHVybiAm KGN0eC0+cV9kYXRhW1Y0TDJfTTJNX0RTVF0pOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0K KwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEFycmF5IG9mIGFsbCBmb3JtYXRzIHN1cHBv cnRlZCBieSBhbnkgdmVyc2lvbiBvZiBDb2RhOgorICovCitzdGF0aWMgc3RydWN0IGNvZGFf Zm10IGNvZGFfZm9ybWF0c1tdID0geworCXsKKwkJLm5hbWUgPSAiWVVWIDQ6MjowIFBsYW5h ciwgWUNiQ3IiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1lVVjQyMCwKKwl9LAorCXsK KwkJLm5hbWUgPSAiWVVWIDQ6MjowIFBsYW5hciwgWUNyQ2IiLAorCQkuZm91cmNjID0gVjRM Ml9QSVhfRk1UX1lWVTQyMCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSDI2NCBFbmNvZGVkIFN0 cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2NCwKKwl9LAorCXsKKwkJLm5h bWUgPSAiTVBFRzQgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1U X01QRUc0LAorCX0sCit9OworCisjZGVmaW5lIENPREFfQ09ERUMobW9kZSwgc3JjX2ZvdXJj YywgZHN0X2ZvdXJjYywgbWF4X3csIG1heF9oKSBcCisJeyBtb2RlLCBzcmNfZm91cmNjLCBk c3RfZm91cmNjLCBtYXhfdywgbWF4X2ggfQorCisvKgorICogQXJyYXlzIG9mIGNvZGVjcyBz dXBwb3J0ZWQgYnkgZWFjaCBnaXZlbiB2ZXJzaW9uIG9mIENvZGE6CisgKiAgaS5NWDI3IC0+ IGNvZGFkeDYKKyAqICBpLk1YNXggLT4gY29kYTcKKyAqICBpLk1YNiAgLT4gY29kYTk2MAor ICogVXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjAgYXMgcGxhY2Vob2xkZXIgZm9yIGFsbCBzdXBw b3J0ZWQgWVVWIDQ6MjowIHZhcmlhbnRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29kYV9jb2Rl YyBjb2RhZHg2X2NvZGVjc1tdID0geworCUNPREFfQ09ERUMoQ09EQURYNl9NT0RFX0VOQ09E RV9IMjY0LCBWNEwyX1BJWF9GTVRfWVVWNDIwLCBWNEwyX1BJWF9GTVRfSDI2NCwgIDcyMCwg NTc2KSwKKwlDT0RBX0NPREVDKENPREFEWDZfTU9ERV9FTkNPREVfTVA0LCAgVjRMMl9QSVhf Rk1UX1lVVjQyMCwgVjRMMl9QSVhfRk1UX01QRUc0LCA3MjAsIDU3NiksCisJQ09EQV9DT0RF QyhDT0RBRFg2X01PREVfREVDT0RFX0gyNjQsIFY0TDJfUElYX0ZNVF9IMjY0LCBWNEwyX1BJ WF9GTVRfWVVWNDIwLCAgNzIwLCA1NzYpLAorfTsKKworc3RhdGljIHN0cnVjdCBjb2RhX2Nv ZGVjIGNvZGE3X2NvZGVjc1tdID0geworCUNPREFfQ09ERUMoQ09EQTdfTU9ERV9FTkNPREVf SDI2NCwgVjRMMl9QSVhfRk1UX1lVVjQyMCwgVjRMMl9QSVhfRk1UX0gyNjQsICAgMTI4MCwg NzIwKSwKKwlDT0RBX0NPREVDKENPREE3X01PREVfRU5DT0RFX01QNCwgIFY0TDJfUElYX0ZN VF9ZVVY0MjAsIFY0TDJfUElYX0ZNVF9NUEVHNCwgIDEyODAsIDcyMCksCit9OworCitzdGF0 aWMgYm9vbCBjb2RhX2Zvcm1hdF9pc195dXYodTMyIGZvdXJjYykKK3sKKwlzd2l0Y2ggKGZv dXJjYykgeworCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKwljYXNlIFY0TDJfUElYX0ZN VF9ZVlU0MjA6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsK Kwl9Cit9CisKKy8qCisgKiBOb3JtYWxpemUgYWxsIHN1cHBvcnRlZCBZVVYgNDoyOjAgZm9y bWF0cyB0byB0aGUgdmFsdWUgdXNlZCBpbiB0aGUgY29kZWMKKyAqIHRhYmxlcy4KKyAqLwor c3RhdGljIHUzMiBjb2RhX2Zvcm1hdF9ub3JtYWxpemVfeXV2KHUzMiBmb3VyY2MpCit7CisJ cmV0dXJuIGNvZGFfZm9ybWF0X2lzX3l1dihmb3VyY2MpID8gVjRMMl9QSVhfRk1UX1lVVjQy MCA6IGZvdXJjYzsKK30KKworc3RhdGljIHN0cnVjdCBjb2RhX2NvZGVjICpjb2RhX2ZpbmRf Y29kZWMoc3RydWN0IGNvZGFfZGV2ICpkZXYsIGludCBzcmNfZm91cmNjLAorCQkJCQkgIGlu dCBkc3RfZm91cmNjKQoreworCXN0cnVjdCBjb2RhX2NvZGVjICpjb2RlY3MgPSBkZXYtPmRl dnR5cGUtPmNvZGVjczsKKwlpbnQgbnVtX2NvZGVjcyA9IGRldi0+ZGV2dHlwZS0+bnVtX2Nv ZGVjczsKKwlpbnQgazsKKworCXNyY19mb3VyY2MgPSBjb2RhX2Zvcm1hdF9ub3JtYWxpemVf eXV2KHNyY19mb3VyY2MpOworCWRzdF9mb3VyY2MgPSBjb2RhX2Zvcm1hdF9ub3JtYWxpemVf eXV2KGRzdF9mb3VyY2MpOworCWlmIChzcmNfZm91cmNjID09IGRzdF9mb3VyY2MpCisJCXJl dHVybiBOVUxMOworCisJZm9yIChrID0gMDsgayA8IG51bV9jb2RlY3M7IGsrKykgeworCQlp ZiAoY29kZWNzW2tdLnNyY19mb3VyY2MgPT0gc3JjX2ZvdXJjYyAmJgorCQkgICAgY29kZWNz W2tdLmRzdF9mb3VyY2MgPT0gZHN0X2ZvdXJjYykKKwkJCWJyZWFrOworCX0KKworCWlmIChr ID09IG51bV9jb2RlY3MpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZjb2RlY3Nba107 Cit9CisKKy8qCisgKiBWNEwyIGlvY3RsKCkgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGlu dCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkg ICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RybGNweShjYXAtPmRyaXZl ciwgQ09EQV9OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+Y2Fy ZCwgQ09EQV9OQU1FLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJc3RybGNweShjYXAtPmJ1c19p bmZvLCAicGxhdGZvcm06IiBDT0RBX05BTUUsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisJ LyoKKwkgKiBUaGlzIGlzIG9ubHkgYSBtZW0tdG8tbWVtIHZpZGVvIGRldmljZS4gVGhlIGNh cHR1cmUgYW5kIG91dHB1dAorCSAqIGRldmljZSBjYXBhYmlsaXR5IGZsYWdzIGFyZSBsZWZ0 IG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkgKiBhbmQgYXJlIHNjaGVkdWxl ZCBmb3IgcmVtb3ZhbC4KKwkgKi8KKwljYXAtPmRldmljZV9jYXBzID0gVjRMMl9DQVBfVklE RU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8CisJCQkgICBWNEwyX0NBUF9W SURFT19NMk0gfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBj YXAtPmRldmljZV9jYXBzIHwgVjRMMl9DQVBfREVWSUNFX0NBUFM7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBlbnVtX2ZtdCh2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRk ZXNjICpmLAorCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGNvZGFf Y3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IGNvZGFfY29kZWMgKmNvZGVj cyA9IGN0eC0+ZGV2LT5kZXZ0eXBlLT5jb2RlY3M7CisJc3RydWN0IGNvZGFfZm10ICpmb3Jt YXRzID0gY29kYV9mb3JtYXRzOworCXN0cnVjdCBjb2RhX2ZtdCAqZm10OworCWludCBudW1f Y29kZWNzID0gY3R4LT5kZXYtPmRldnR5cGUtPm51bV9jb2RlY3M7CisJaW50IG51bV9mb3Jt YXRzID0gQVJSQVlfU0laRShjb2RhX2Zvcm1hdHMpOworCWludCBpLCBrLCBudW0gPSAwOwor CisJZm9yIChpID0gMDsgaSA8IG51bV9mb3JtYXRzOyBpKyspIHsKKwkJLyogQm90aCB1bmNv bXByZXNzZWQgZm9ybWF0cyBhcmUgYWx3YXlzIHN1cHBvcnRlZCAqLworCQlpZiAoY29kYV9m b3JtYXRfaXNfeXV2KGZvcm1hdHNbaV0uZm91cmNjKSkgeworCQkJaWYgKG51bSA9PSBmLT5p bmRleCkKKwkJCQlicmVhazsKKwkJCSsrbnVtOworCQkJY29udGludWU7CisJCX0KKwkJLyog Q29tcHJlc3NlZCBmb3JtYXRzIG1heSBiZSBzdXBwb3J0ZWQsIGNoZWNrIHRoZSBjb2RlYyBs aXN0ICovCisJCWZvciAoayA9IDA7IGsgPCBudW1fY29kZWNzOyBrKyspIHsKKwkJCWlmICh0 eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAmJgorCQkJICAgIGZvcm1hdHNb aV0uZm91cmNjID09IGNvZGVjc1trXS5kc3RfZm91cmNjKQorCQkJCWJyZWFrOworCQkJaWYg KHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgJiYKKwkJCSAgICBmb3JtYXRz W2ldLmZvdXJjYyA9PSBjb2RlY3Nba10uc3JjX2ZvdXJjYykKKwkJCQlicmVhazsKKwkJfQor CQlpZiAoayA8IG51bV9jb2RlY3MpIHsKKwkJCWlmIChudW0gPT0gZi0+aW5kZXgpCisJCQkJ YnJlYWs7CisJCQkrK251bTsKKwkJfQorCX0KKworCWlmIChpIDwgbnVtX2Zvcm1hdHMpIHsK KwkJZm10ID0gJmZvcm1hdHNbaV07CisJCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZtdC0+ bmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCWYtPnBpeGVsZm9ybWF0ID0gZm10 LT5mb3VyY2M7CisJCXJldHVybiAwOworCX0KKworCS8qIEZvcm1hdCBub3QgZm91bmQgKi8K KwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlk X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgdjRs Ml9mbXRkZXNjICpmKQoreworCXJldHVybiBlbnVtX2ZtdChwcml2LCBmLCBWNEwyX0JVRl9U WVBFX1ZJREVPX0NBUFRVUkUpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92 aWRfb3V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgIHN0cnVjdCB2 NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIGVudW1fZm10KHByaXYsIGYsIFY0TDJfQlVG X1RZUEVfVklERU9fT1VUUFVUKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mbXQoc3Ry dWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sK KwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cTsKKwlzdHJ1Y3QgY29kYV9xX2RhdGEgKnFfZGF0YTsK KwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCXZxID0gdjRs Ml9tMm1fZ2V0X3ZxKGN0eC0+bTJtX2N0eCwgZi0+dHlwZSk7CisJaWYgKCF2cSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlxX2RhdGEgPSBnZXRfcV9kYXRhKGN0eCwgZi0+dHlwZSk7CisK KwlmLT5mbXQucGl4LmZpZWxkCT0gVjRMMl9GSUVMRF9OT05FOworCWYtPmZtdC5waXgucGl4 ZWxmb3JtYXQJPSBxX2RhdGEtPmZvdXJjYzsKKwlmLT5mbXQucGl4LndpZHRoCT0gcV9kYXRh LT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodAk9IHFfZGF0YS0+aGVpZ2h0OworCWlmIChj b2RhX2Zvcm1hdF9pc195dXYoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCkpCisJCWYtPmZtdC5w aXguYnl0ZXNwZXJsaW5lID0gcm91bmRfdXAoZi0+Zm10LnBpeC53aWR0aCwgMik7CisJZWxz ZSAvKiBlbmNvZGVkIGZvcm1hdHMgaC4yNjQvbXBlZzQgKi8KKwkJZi0+Zm10LnBpeC5ieXRl c3BlcmxpbmUgPSAwOworCisJZi0+Zm10LnBpeC5zaXplaW1hZ2UJPSBxX2RhdGEtPnNpemVp bWFnZTsKKwlmLT5mbXQucGl4LmNvbG9yc3BhY2UJPSBjdHgtPmNvbG9yc3BhY2U7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgY29kYV9j b2RlYyAqY29kZWMsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwl1bnNpZ25lZCBpbnQg bWF4X3csIG1heF9oOworCWVudW0gdjRsMl9maWVsZCBmaWVsZDsKKworCWZpZWxkID0gZi0+ Zm10LnBpeC5maWVsZDsKKwlpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCisJCWZpZWxk ID0gVjRMMl9GSUVMRF9OT05FOworCWVsc2UgaWYgKFY0TDJfRklFTERfTk9ORSAhPSBmaWVs ZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBWNEwyIHNwZWNpZmljYXRpb24gc3VnZ2Vz dHMgdGhlIGRyaXZlciBjb3JyZWN0cyB0aGUgZm9ybWF0IHN0cnVjdAorCSAqIGlmIGFueSBv ZiB0aGUgZGltZW5zaW9ucyBpcyB1bnN1cHBvcnRlZCAqLworCWYtPmZtdC5waXguZmllbGQg PSBmaWVsZDsKKworCWlmIChjb2RlYykgeworCQltYXhfdyA9IGNvZGVjLT5tYXhfdzsKKwkJ bWF4X2ggPSBjb2RlYy0+bWF4X2g7CisJfSBlbHNlIHsKKwkJbWF4X3cgPSBNQVhfVzsKKwkJ bWF4X2ggPSBNQVhfSDsKKwl9CisJdjRsX2JvdW5kX2FsaWduX2ltYWdlKCZmLT5mbXQucGl4 LndpZHRoLCBNSU5fVywgbWF4X3csCisJCQkgICAgICBXX0FMSUdOLCAmZi0+Zm10LnBpeC5o ZWlnaHQsCisJCQkgICAgICBNSU5fSCwgbWF4X2gsIEhfQUxJR04sIFNfQUxJR04pOworCisJ aWYgKGNvZGFfZm9ybWF0X2lzX3l1dihmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSkgeworCQkv KiBGcmFtZSBzdHJpZGUgbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCisJCWYtPmZtdC5waXgu Ynl0ZXNwZXJsaW5lID0gcm91bmRfdXAoZi0+Zm10LnBpeC53aWR0aCwgOCk7CisJCWYtPmZt dC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgKgorCQkJCQlmLT5m bXQucGl4LmhlaWdodCAqIDMgLyAyOworCX0gZWxzZSB7IC8qZW5jb2RlZCBmb3JtYXRzIGgu MjY0L21wZWc0ICovCisJCWYtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKKwkJZi0+Zm10 LnBpeC5zaXplaW1hZ2UgPSBDT0RBX01BWF9GUkFNRV9TSVpFOworCX0KKworCWYtPmZtdC5w aXgucHJpdiA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5 X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgc3Ry dWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBjb2RhX2N0eCAqY3R4ID0gZmhfdG9f Y3R4KHByaXYpOworCXN0cnVjdCBjb2RhX2NvZGVjICpjb2RlYyA9IE5VTEw7CisKKwkvKiBE ZXRlcm1pbmUgY29kZWMgYnkgdGhlIGVuY29kZWQgZm9ybWF0ICovCisJY29kZWMgPSBjb2Rh X2ZpbmRfY29kZWMoY3R4LT5kZXYsIFY0TDJfUElYX0ZNVF9ZVVY0MjAsCisJCQkJZi0+Zm10 LnBpeC5waXhlbGZvcm1hdCk7CisJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gY3R4LT5jb2xv cnNwYWNlOworCisJcmV0dXJuIHZpZGlvY190cnlfZm10KGNvZGVjLCBmKTsKK30KKworc3Rh dGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfb3V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lk ICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBjb2Rh X2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCBjb2RhX2NvZGVjICpjb2Rl YzsKKworCS8qIERldGVybWluZSBjb2RlYyBieSBlbmNvZGVkIGZvcm1hdCwgcmV0dXJucyBO VUxMIGlmIHJhdyBvciBpbnZhbGlkICovCisJY29kZWMgPSBjb2RhX2ZpbmRfY29kZWMoY3R4 LT5kZXYsIGYtPmZtdC5waXgucGl4ZWxmb3JtYXQsCisJCQkJVjRMMl9QSVhfRk1UX1lVVjQy MCk7CisKKwlpZiAoIWYtPmZtdC5waXguY29sb3JzcGFjZSkKKwkJZi0+Zm10LnBpeC5jb2xv cnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1JFQzcwOTsKKworCXJldHVybiB2aWRpb2NfdHJ5 X2ZtdChjb2RlYywgZik7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10KHN0cnVjdCBj b2RhX2N0eCAqY3R4LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGNvZGFf cV9kYXRhICpxX2RhdGE7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnE7CisKKwl2cSA9IHY0bDJf bTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOworCWlmICghdnEpCisJCXJldHVy biAtRUlOVkFMOworCisJcV9kYXRhID0gZ2V0X3FfZGF0YShjdHgsIGYtPnR5cGUpOworCWlm ICghcV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2YjJfaXNfYnVzeSh2cSkp IHsKKwkJdjRsMl9lcnIoJmN0eC0+ZGV2LT52NGwyX2RldiwgIiVzIHF1ZXVlIGJ1c3lcbiIs IF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlxX2RhdGEtPmZvdXJjYyA9 IGYtPmZtdC5waXgucGl4ZWxmb3JtYXQ7CisJcV9kYXRhLT53aWR0aCA9IGYtPmZtdC5waXgu d2lkdGg7CisJcV9kYXRhLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKwlxX2RhdGEt PnNpemVpbWFnZSA9IGYtPmZtdC5waXguc2l6ZWltYWdlOworCisJLyp2NGwyX2RiZygxLCBj b2RhX2RlYnVnLCAmY3R4LT5kZXYtPnY0bDJfZGV2LCovCisJdjRsMl9lcnIoJmN0eC0+ZGV2 LT52NGwyX2RldiwKKwkJIlNldHRpbmcgZm9ybWF0IGZvciB0eXBlICVkLCB3eGg6ICVkeCVk LCBmbXQ6ICUwOHhcbiIsCisJCWYtPnR5cGUsIHFfZGF0YS0+d2lkdGgsIHFfZGF0YS0+aGVp Z2h0LCBxX2RhdGEtPmZvdXJjYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2 aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJ CQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSBm aF90b19jdHgocHJpdik7CisJaW50IHJldDsKKworCXJldCA9IHZpZGlvY190cnlfZm10X3Zp ZF9jYXAoZmlsZSwgcHJpdiwgZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJl dHVybiB2aWRpb2Nfc19mbXQoY3R4LCBmKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19m bXRfdmlkX291dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3Qg djRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSBmaF90b19jdHgo cHJpdik7CisJaW50IHJldDsKKworCXJldCA9IHZpZGlvY190cnlfZm10X3ZpZF9vdXQoZmls ZSwgcHJpdiwgZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHZpZGlv Y19zX2ZtdChjdHgsIGYpOworCWlmIChyZXQpCisJCWN0eC0+Y29sb3JzcGFjZSA9IGYtPmZt dC5waXguY29sb3JzcGFjZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlk aW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVj dCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXFidWZzKQoreworCXN0cnVjdCBjb2RhX2N0eCAq Y3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJcmV0dXJuIHY0bDJfbTJtX3JlcWJ1ZnMoZmls ZSwgY3R4LT5tMm1fY3R4LCByZXFidWZzKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVl cnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRs Ml9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IGZoX3RvX2N0eChw cml2KTsKKworCXJldHVybiB2NGwyX20ybV9xdWVyeWJ1ZihmaWxlLCBjdHgtPm0ybV9jdHgs IGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUs IHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBjb2Rh X2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJcmV0dXJuIHY0bDJfbTJtX3FidWYo ZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19kcWJ1 ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpi dWYpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwly ZXR1cm4gdjRsMl9tMm1fZHFidWYoZmlsZSwgY3R4LT5tMm1fY3R4LCBidWYpOworfQorCitz dGF0aWMgaW50IHZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJp diwKKwkJCSAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBjb2RhX2N0 eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJcmV0dXJuIHY0bDJfbTJtX3N0cmVhbW9u KGZpbGUsIGN0eC0+bTJtX2N0eCwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0 cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBlbnVtIHY0 bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IGZoX3RvX2N0 eChwcml2KTsKKworCXJldHVybiB2NGwyX20ybV9zdHJlYW1vZmYoZmlsZSwgY3R4LT5tMm1f Y3R4LCB0eXBlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBj b2RhX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCT0gdmlkaW9jX3F1ZXJ5Y2Fw LAorCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gdmlkaW9jX2VudW1fZm10X3ZpZF9j YXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwCT0gdmlkaW9jX2dfZm10LAorCS52aWRpb2Nf dHJ5X2ZtdF92aWRfY2FwCT0gdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3Nf Zm10X3ZpZF9jYXAJPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKKworCS52aWRpb2NfZW51bV9m bXRfdmlkX291dCA9IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0LAorCS52aWRpb2NfZ19mbXRf dmlkX291dAk9IHZpZGlvY19nX2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX291dAk9IHZp ZGlvY190cnlfZm10X3ZpZF9vdXQsCisJLnZpZGlvY19zX2ZtdF92aWRfb3V0CT0gdmlkaW9j X3NfZm10X3ZpZF9vdXQsCisKKwkudmlkaW9jX3JlcWJ1ZnMJCT0gdmlkaW9jX3JlcWJ1ZnMs CisJLnZpZGlvY19xdWVyeWJ1Zgk9IHZpZGlvY19xdWVyeWJ1ZiwKKworCS52aWRpb2NfcWJ1 ZgkJPSB2aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmCQk9IHZpZGlvY19kcWJ1ZiwKKwor CS52aWRpb2Nfc3RyZWFtb24JPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1v ZmYJPSB2aWRpb2Nfc3RyZWFtb2ZmLAorfTsKKworI2lmZGVmIFVTRV9LRklGTworc3RhdGlj IGlubGluZSBpbnQgY29kYV9nZXRfYml0c3RyZWFtX3BheWxvYWQoc3RydWN0IGNvZGFfY3R4 ICpjdHgpCit7CisJcmV0dXJuIGtmaWZvX2xlbigmY3R4LT5iaXRzdHJlYW1fZmlmbyk7Cit9 CisjZWxzZQorI2RlZmluZSBjb2RhX2dldF9iaXRzdHJlYW1fcGF5bG9hZCh4KSAoLTEpCisj ZW5kaWYKKworLyoKKyAqIE1lbS10by1tZW0gb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIHZv aWQgY29kYV9kZXZpY2VfcnVuKHZvaWQgKm0ybV9wcml2KQoreworCXN0cnVjdCBjb2RhX2N0 eCAqY3R4ID0gbTJtX3ByaXY7CisJc3RydWN0IGNvZGFfcV9kYXRhICpxX2RhdGFfc3JjLCAq cV9kYXRhX2RzdDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX2J1ZiwgKmRzdF9idWY7CisJ c3RydWN0IGNvZGFfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlpbnQgZm9yY2VfaXBpY3R1cmU7 CisJaW50IHF1YW50X3BhcmFtID0gMDsKKwl1MzIgcGljdHVyZV95LCBwaWN0dXJlX2NiLCBw aWN0dXJlX2NyOworCXUzMiBwaWNfc3RyZWFtX2J1ZmZlcl9hZGRyLCBwaWNfc3RyZWFtX2J1 ZmZlcl9zaXplOworCXUzMiBkc3RfZm91cmNjOworCisJbXV0ZXhfbG9jaygmZGV2LT5jb2Rh X211dGV4KTsKKworCXNyY19idWYgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1f Y3R4KTsKKwlkc3RfYnVmID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+bTJtX2N0eCk7 CisJcV9kYXRhX3NyYyA9IGdldF9xX2RhdGEoY3R4LCBWNEwyX0JVRl9UWVBFX1ZJREVPX09V VFBVVCk7CisJcV9kYXRhX2RzdCA9IGdldF9xX2RhdGEoY3R4LCBWNEwyX0JVRl9UWVBFX1ZJ REVPX0NBUFRVUkUpOworCWRzdF9mb3VyY2MgPSBxX2RhdGFfZHN0LT5mb3VyY2M7CisKKwlz cmNfYnVmLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IGN0eC0+aXNlcXVlbmNlOworCWRzdF9idWYt PnY0bDJfYnVmLnNlcXVlbmNlID0gY3R4LT5pc2VxdWVuY2U7CisJY3R4LT5pc2VxdWVuY2Ur KzsKKworCS8qCisJICogV29ya2Fyb3VuZCBjb2RhIGZpcm13YXJlIEJVRyB0aGF0IG9ubHkg bWFya3MgdGhlIGZpcnN0CisJICogZnJhbWUgYXMgSURSLiBUaGlzIGlzIGEgcHJvYmxlbSBm b3Igc29tZSBkZWNvZGVycyB0aGF0IGNhbid0CisJICogcmVjb3ZlciB3aGVuIGEgZnJhbWUg aXMgbG9zdC4KKwkgKi8KKwlpZiAoc3JjX2J1Zi0+djRsMl9idWYuc2VxdWVuY2UgJSBjdHgt PnBhcmFtcy5nb3Bfc2l6ZSkgeworCQlzcmNfYnVmLT52NGwyX2J1Zi5mbGFncyB8PSBWNEwy X0JVRl9GTEFHX1BGUkFNRTsKKwkJc3JjX2J1Zi0+djRsMl9idWYuZmxhZ3MgJj0gflY0TDJf QlVGX0ZMQUdfS0VZRlJBTUU7CisJfSBlbHNlIHsKKwkJc3JjX2J1Zi0+djRsMl9idWYuZmxh Z3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKKwkJc3JjX2J1Zi0+djRsMl9idWYuZmxh Z3MgJj0gflY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCX0KKworCS8qCisJICogQ29weSBoZWFk ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGZyYW1lIGZvciBILjI2NCBvbmx5 LgorCSAqIEluIE1QRUc0IHRoZXkgYXJlIGFscmVhZHkgY29waWVkIGJ5IHRoZSBjb2RhLgor CSAqLworCWlmIChzcmNfYnVmLT52NGwyX2J1Zi5zZXF1ZW5jZSA9PSAwKSB7CisJCXBpY19z dHJlYW1fYnVmZmVyX2FkZHIgPQorCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfZG1hX2FkZHIo ZHN0X2J1ZiwgMCkgKworCQkJY3R4LT52cHVfaGVhZGVyX3NpemVbMF0gKworCQkJY3R4LT52 cHVfaGVhZGVyX3NpemVbMV0gKworCQkJY3R4LT52cHVfaGVhZGVyX3NpemVbMl07CisJCXBp Y19zdHJlYW1fYnVmZmVyX3NpemUgPSBDT0RBX01BWF9GUkFNRV9TSVpFIC0KKwkJCWN0eC0+ dnB1X2hlYWRlcl9zaXplWzBdIC0KKwkJCWN0eC0+dnB1X2hlYWRlcl9zaXplWzFdIC0KKwkJ CWN0eC0+dnB1X2hlYWRlcl9zaXplWzJdOworCQltZW1jcHkodmIyX3BsYW5lX3ZhZGRyKGRz dF9idWYsIDApLAorCQkgICAgICAgJmN0eC0+dnB1X2hlYWRlclswXVswXSwgY3R4LT52cHVf aGVhZGVyX3NpemVbMF0pOworCQltZW1jcHkodmIyX3BsYW5lX3ZhZGRyKGRzdF9idWYsIDAp ICsgY3R4LT52cHVfaGVhZGVyX3NpemVbMF0sCisJCSAgICAgICAmY3R4LT52cHVfaGVhZGVy WzFdWzBdLCBjdHgtPnZwdV9oZWFkZXJfc2l6ZVsxXSk7CisJCW1lbWNweSh2YjJfcGxhbmVf dmFkZHIoZHN0X2J1ZiwgMCkgKyBjdHgtPnZwdV9oZWFkZXJfc2l6ZVswXSArCisJCQljdHgt PnZwdV9oZWFkZXJfc2l6ZVsxXSwgJmN0eC0+dnB1X2hlYWRlclsyXVswXSwKKwkJCWN0eC0+ dnB1X2hlYWRlcl9zaXplWzJdKTsKKwl9IGVsc2UgeworCQlwaWNfc3RyZWFtX2J1ZmZlcl9h ZGRyID0KKwkJCXZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGRzdF9idWYsIDApOwor CQlwaWNfc3RyZWFtX2J1ZmZlcl9zaXplID0gQ09EQV9NQVhfRlJBTUVfU0laRTsKKwl9CisK KwlpZiAoc3JjX2J1Zi0+djRsMl9idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0tFWUZSQU1F KSB7CisJCWZvcmNlX2lwaWN0dXJlID0gMTsKKwkJc3dpdGNoIChkc3RfZm91cmNjKSB7CisJ CWNhc2UgVjRMMl9QSVhfRk1UX0gyNjQ6CisJCQlxdWFudF9wYXJhbSA9IGN0eC0+cGFyYW1z LmgyNjRfaW50cmFfcXA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfTVBFRzQ6 CisJCQlxdWFudF9wYXJhbSA9IGN0eC0+cGFyYW1zLm1wZWc0X2ludHJhX3FwOworCQkJYnJl YWs7CisJCWRlZmF1bHQ6CisJCQl2NGwyX3dhcm4oJmN0eC0+ZGV2LT52NGwyX2RldiwKKwkJ CQkiY2Fubm90IHNldCBpbnRyYSBxcCwgZm10IG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJYnJl YWs7CisJCX0KKwl9IGVsc2UgeworCQlmb3JjZV9pcGljdHVyZSA9IDA7CisJCXN3aXRjaCAo ZHN0X2ZvdXJjYykgeworCQljYXNlIFY0TDJfUElYX0ZNVF9IMjY0OgorCQkJcXVhbnRfcGFy YW0gPSBjdHgtPnBhcmFtcy5oMjY0X2ludGVyX3FwOworCQkJYnJlYWs7CisJCWNhc2UgVjRM Ml9QSVhfRk1UX01QRUc0OgorCQkJcXVhbnRfcGFyYW0gPSBjdHgtPnBhcmFtcy5tcGVnNF9p bnRlcl9xcDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdjRsMl93YXJuKCZjdHgtPmRl di0+djRsMl9kZXYsCisJCQkJImNhbm5vdCBzZXQgaW50ZXIgcXAsIGZtdCBub3Qgc3VwcG9y dGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc3VibWl0ICovCisJY29kYV93 cml0ZShkZXYsIENPREFfUk9UX01JUl9FTkFCTEUgfCBjdHgtPnBhcmFtcy5yb3RfbW9kZSwg Q09EQV9DTURfRU5DX1BJQ19ST1RfTU9ERSk7CisJY29kYV93cml0ZShkZXYsIHF1YW50X3Bh cmFtLCBDT0RBX0NNRF9FTkNfUElDX1FTKTsKKworCisJcGljdHVyZV95ID0gdmIyX2RtYV9j b250aWdfcGxhbmVfZG1hX2FkZHIoc3JjX2J1ZiwgMCk7CisJc3dpdGNoIChxX2RhdGFfc3Jj LT5mb3VyY2MpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjA6CisJCS8qIFN3aXRjaCBD YiBhbmQgQ3IgZm9yIFlWVTQyMCBmb3JtYXQgKi8KKwkJcGljdHVyZV9jciA9IHBpY3R1cmVf eSArIHFfZGF0YV9zcmMtPndpZHRoICogcV9kYXRhX3NyYy0+aGVpZ2h0OworCQlwaWN0dXJl X2NiID0gcGljdHVyZV9jciArIHFfZGF0YV9zcmMtPndpZHRoIC8gMiAqCisJCQkJcV9kYXRh X3NyYy0+aGVpZ2h0IC8gMjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIw OgorCWRlZmF1bHQ6CisJCXBpY3R1cmVfY2IgPSBwaWN0dXJlX3kgKyBxX2RhdGFfc3JjLT53 aWR0aCAqIHFfZGF0YV9zcmMtPmhlaWdodDsKKwkJcGljdHVyZV9jciA9IHBpY3R1cmVfY2Ig KyBxX2RhdGFfc3JjLT53aWR0aCAvIDIgKgorCQkJCXFfZGF0YV9zcmMtPmhlaWdodCAvIDI7 CisJCWJyZWFrOworCX0KKworCWNvZGFfd3JpdGUoZGV2LCBwaWN0dXJlX3ksIENPREFfQ01E X0VOQ19QSUNfU1JDX0FERFJfWSk7CisJY29kYV93cml0ZShkZXYsIHBpY3R1cmVfY2IsIENP REFfQ01EX0VOQ19QSUNfU1JDX0FERFJfQ0IpOworCWNvZGFfd3JpdGUoZGV2LCBwaWN0dXJl X2NyLCBDT0RBX0NNRF9FTkNfUElDX1NSQ19BRERSX0NSKTsKKwljb2RhX3dyaXRlKGRldiwg Zm9yY2VfaXBpY3R1cmUgPDwgMSAmIDB4MiwKKwkJICAgQ09EQV9DTURfRU5DX1BJQ19PUFRJ T04pOworCisJY29kYV93cml0ZShkZXYsIHBpY19zdHJlYW1fYnVmZmVyX2FkZHIsIENPREFf Q01EX0VOQ19QSUNfQkJfU1RBUlQpOworCWNvZGFfd3JpdGUoZGV2LCBwaWNfc3RyZWFtX2J1 ZmZlcl9zaXplIC8gMTAyNCwKKwkJICAgQ09EQV9DTURfRU5DX1BJQ19CQl9TSVpFKTsKKwor CWlmIChkZXYtPmRldnR5cGUtPnByb2R1Y3QgPT0gQ09EQV83NTQxKSB7CisJCWNvZGFfd3Jp dGUoZGV2LCBDT0RBN19VU0VfQklUX0VOQUJMRSB8IENPREE3X1VTRV9IT1NUX0JJVF9FTkFC TEUgfAorCQkJCUNPREE3X1VTRV9NRV9FTkFCTEUgfCBDT0RBN19VU0VfSE9TVF9NRV9FTkFC TEUsCisJCQkJQ09EQTdfUkVHX0JJVF9BWElfU1JBTV9VU0UpOworCX0KKworCS8qIDEgc2Vj b25kIHRpbWVvdXQgaW4gY2FzZSBDT0RBIGxvY2tzIHVwICovCisJc2NoZWR1bGVfZGVsYXll ZF93b3JrKCZkZXYtPnRpbWVvdXQsIEhaKTsKKworCWNvZGFfY29tbWFuZF9hc3luYyhjdHgs IENPREFfQ09NTUFORF9QSUNfUlVOKTsKK30KKworc3RhdGljIGludCBjb2RhX2pvYl9yZWFk eSh2b2lkICptMm1fcHJpdikKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IG0ybV9wcml2 OworCisJLyoKKwkgKiBGb3IgYm90aCAnUCcgYW5kICdrZXknIGZyYW1lIGNhc2VzIDEgcGlj dHVyZQorCSAqIGFuZCAxIGZyYW1lIGFyZSBuZWVkZWQuCisJICovCisJaWYgKCF2NGwyX20y bV9udW1fc3JjX2J1ZnNfcmVhZHkoY3R4LT5tMm1fY3R4KSB8fAorCQkhdjRsMl9tMm1fbnVt X2RzdF9idWZzX3JlYWR5KGN0eC0+bTJtX2N0eCkpIHsKKwkJdjRsMl9kYmcoMSwgY29kYV9k ZWJ1ZywgJmN0eC0+ZGV2LT52NGwyX2RldiwKKwkJCSAibm90IHJlYWR5OiBub3QgZW5vdWdo IHZpZGVvIGJ1ZmZlcnMuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGN0eC0+YWJv cnRpbmcpIHsKKwkJdjRsMl9kYmcoMSwgY29kYV9kZWJ1ZywgJmN0eC0+ZGV2LT52NGwyX2Rl diwKKwkJCSAibm90IHJlYWR5OiBhYm9ydGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKwor CXY0bDJfZGJnKDEsIGNvZGFfZGVidWcsICZjdHgtPmRldi0+djRsMl9kZXYsCisJCQkiam9i IHJlYWR5XG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY29kYV9qb2JfYWJv cnQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IHByaXY7CisKKwlj dHgtPmFib3J0aW5nID0gMTsKKworCXY0bDJfZGJnKDEsIGNvZGFfZGVidWcsICZjdHgtPmRl di0+djRsMl9kZXYsCisJCSAiQWJvcnRpbmcgdGFza1xuIik7Cit9CisKK3N0YXRpYyB2b2lk IGNvZGFfbG9jayh2b2lkICptMm1fcHJpdikKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9 IG0ybV9wcml2OworCXN0cnVjdCBjb2RhX2RldiAqcGNkZXYgPSBjdHgtPmRldjsKKwltdXRl eF9sb2NrKCZwY2Rldi0+ZGV2X211dGV4KTsKK30KKworc3RhdGljIHZvaWQgY29kYV91bmxv Y2sodm9pZCAqbTJtX3ByaXYpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSBtMm1fcHJp djsKKwlzdHJ1Y3QgY29kYV9kZXYgKnBjZGV2ID0gY3R4LT5kZXY7CisJbXV0ZXhfdW5sb2Nr KCZwY2Rldi0+ZGV2X211dGV4KTsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX20ybV9vcHMg Y29kYV9tMm1fb3BzID0geworCS5kZXZpY2VfcnVuCT0gY29kYV9kZXZpY2VfcnVuLAorCS5q b2JfcmVhZHkJPSBjb2RhX2pvYl9yZWFkeSwKKwkuam9iX2Fib3J0CT0gY29kYV9qb2JfYWJv cnQsCisJLmxvY2sJCT0gY29kYV9sb2NrLAorCS51bmxvY2sJCT0gY29kYV91bmxvY2ssCit9 OworCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9wYXJhbXMoc3RydWN0IGNvZGFfY3R4ICpj dHgpCit7CisJaW50IG1heF93OworCWludCBtYXhfaDsKKworCWN0eC0+Y29kZWMgPSAmY3R4 LT5kZXYtPmRldnR5cGUtPmNvZGVjc1swXTsKKwltYXhfdyA9IGN0eC0+Y29kZWMtPm1heF93 OworCW1heF9oID0gY3R4LT5jb2RlYy0+bWF4X2g7CisKKwljdHgtPnBhcmFtcy5jb2RlY19t b2RlID0gQ09EQV9NT0RFX0lOVkFMSUQ7CisJY3R4LT5jb2xvcnNwYWNlID0gVjRMMl9DT0xP UlNQQUNFX1JFQzcwOTsKKwljdHgtPnBhcmFtcy5mcmFtZXJhdGUgPSAzMDsKKwljdHgtPmFi b3J0aW5nID0gMDsKKworCS8qIERlZmF1bHQgZm9ybWF0cyBmb3Igb3V0cHV0IGFuZCBpbnB1 dCBxdWV1ZXMgKi8KKwljdHgtPnFfZGF0YVtWNEwyX00yTV9TUkNdLmZvdXJjYyA9IGN0eC0+ Y29kZWMtPnNyY19mb3VyY2M7CisJY3R4LT5xX2RhdGFbVjRMMl9NMk1fRFNUXS5mb3VyY2Mg PSBjdHgtPmNvZGVjLT5kc3RfZm91cmNjOworCWN0eC0+cV9kYXRhW1Y0TDJfTTJNX1NSQ10u d2lkdGggPSBtYXhfdzsKKwljdHgtPnFfZGF0YVtWNEwyX00yTV9TUkNdLmhlaWdodCA9IG1h eF9oOworCWN0eC0+cV9kYXRhW1Y0TDJfTTJNX1NSQ10uc2l6ZWltYWdlID0gKG1heF93ICog bWF4X2ggKiAzKSAvIDI7CisJY3R4LT5xX2RhdGFbVjRMMl9NMk1fRFNUXS53aWR0aCA9IG1h eF93OworCWN0eC0+cV9kYXRhW1Y0TDJfTTJNX0RTVF0uaGVpZ2h0ID0gbWF4X2g7CisJY3R4 LT5xX2RhdGFbVjRMMl9NMk1fRFNUXS5zaXplaW1hZ2UgPSBDT0RBX01BWF9GUkFNRV9TSVpF OworfQorCisvKgorICogUXVldWUgb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IGNvZGFf cXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsCisJCQkJY29uc3Qgc3RydWN0IHY0 bDJfZm9ybWF0ICpmbXQsCisJCQkJdW5zaWduZWQgaW50ICpuYnVmZmVycywgdW5zaWduZWQg aW50ICpucGxhbmVzLAorCQkJCXVuc2lnbmVkIGludCBzaXplc1tdLCB2b2lkICphbGxvY19j dHhzW10pCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHZx KTsKKwlzdHJ1Y3QgY29kYV9xX2RhdGEgKnFfZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsK KworCXFfZGF0YSA9IGdldF9xX2RhdGEoY3R4LCB2cS0+dHlwZSk7CisJc2l6ZSA9IHFfZGF0 YS0+c2l6ZWltYWdlOworCisJKm5wbGFuZXMgPSAxOworCXNpemVzWzBdID0gc2l6ZTsKKwor CWFsbG9jX2N0eHNbMF0gPSBjdHgtPmRldi0+YWxsb2NfY3R4OworCisJdjRsMl9kYmcoMSwg Y29kYV9kZWJ1ZywgJmN0eC0+ZGV2LT52NGwyX2RldiwKKwkJICJnZXQgJWQgYnVmZmVyKHMp IG9mIHNpemUgJWQgZWFjaC5cbiIsICpuYnVmZmVycywgc2l6ZSk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBjb2RhX2J1Zl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2 YikKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZi Ml9xdWV1ZSk7CisJc3RydWN0IGNvZGFfcV9kYXRhICpxX2RhdGE7CisKKwlxX2RhdGEgPSBn ZXRfcV9kYXRhKGN0eCwgdmItPnZiMl9xdWV1ZS0+dHlwZSk7CisKKwlpZiAodmIyX3BsYW5l X3NpemUodmIsIDApIDwgcV9kYXRhLT5zaXplaW1hZ2UpIHsKKwkJdjRsMl93YXJuKCZjdHgt PmRldi0+djRsMl9kZXYsCisJCQkgICIlcyBkYXRhIHdpbGwgbm90IGZpdCBpbnRvIHBsYW5l ICglbHUgPCAlbHUpXG4iLAorCQkJICBfX2Z1bmNfXywgdmIyX3BsYW5lX3NpemUodmIsIDAp LAorCQkJICAobG9uZylxX2RhdGEtPnNpemVpbWFnZSk7CisJCXJldHVybiAtRUlOVkFMOwor CX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb2RhX2J1Zl9xdWV1ZShzdHJ1 Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSB2YjJfZ2V0 X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXY0bDJfbTJtX2J1Zl9xdWV1ZShjdHgtPm0y bV9jdHgsIHZiKTsKK30KKworc3RhdGljIHZvaWQgY29kYV93YWl0X3ByZXBhcmUoc3RydWN0 IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2 X3ByaXYocSk7CisJY29kYV91bmxvY2soY3R4KTsKK30KKworc3RhdGljIHZvaWQgY29kYV93 YWl0X2ZpbmlzaChzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXN0cnVjdCBjb2RhX2N0eCAq Y3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKwljb2RhX2xvY2soY3R4KTsKK30KKworc3Rh dGljIHZvaWQgY29kYV9mcmVlX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgY29kYV9jdHggKmN0eCkK K3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT0RBX01BWF9GUkFNRUJVRkZFUlM7 IGkrKykgeworCQlpZiAoY3R4LT5pbnRlcm5hbF9mcmFtZXNbaV0udmFkZHIpIHsKKwkJCWRt YV9mcmVlX2NvaGVyZW50KCZjdHgtPmRldi0+cGxhdF9kZXYtPmRldiwKKwkJCQljdHgtPmlu dGVybmFsX2ZyYW1lc1tpXS5zaXplLAorCQkJCWN0eC0+aW50ZXJuYWxfZnJhbWVzW2ldLnZh ZGRyLAorCQkJCWN0eC0+aW50ZXJuYWxfZnJhbWVzW2ldLnBhZGRyKTsKKwkJCWN0eC0+aW50 ZXJuYWxfZnJhbWVzW2ldLnZhZGRyID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZv aWQgY29kYV9wYXJhYnVmX3dyaXRlKHN0cnVjdCBjb2RhX2N0eCAqY3R4LCBpbnQgaW5kZXgs IHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY29kYV9kZXYgKmRldiA9IGN0eC0+ZGV2OworCXUz MiAqcCA9IGN0eC0+cGFyYWJ1Zi52YWRkcjsKKworCWlmIChkZXYtPmRldnR5cGUtPnByb2R1 Y3QgPT0gQ09EQV9EWDYpCisJCXBbaW5kZXhdID0gdmFsdWU7CisJZWxzZQorCQlwW2luZGV4 IF4gMV0gPSB2YWx1ZTsKK30KKworc3RhdGljIGludCBjb2RhX2FsbG9jX2F1eF9idWYoc3Ry dWN0IGNvZGFfZGV2ICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29kYV9hdXhfYnVmICpidWYs IHNpemVfdCBzaXplKQoreworCWJ1Zi0+dmFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRl di0+cGxhdF9kZXYtPmRldiwgc2l6ZSwgJmJ1Zi0+cGFkZHIsCisJCQkJCUdGUF9LRVJORUwp OworCWlmICghYnVmLT52YWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWYtPnNpemUg PSBzaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvZGFfYWxs b2NfY29udGV4dF9idWYoc3RydWN0IGNvZGFfY3R4ICpjdHgsCisJCQkJCSBzdHJ1Y3QgY29k YV9hdXhfYnVmICpidWYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBjb2RhX2FsbG9jX2F1 eF9idWYoY3R4LT5kZXYsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfZnJl ZV9hdXhfYnVmKHN0cnVjdCBjb2RhX2RldiAqZGV2LAorCQkJICAgICAgc3RydWN0IGNvZGFf YXV4X2J1ZiAqYnVmKQoreworCWlmIChidWYtPnZhZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVy ZW50KCZkZXYtPnBsYXRfZGV2LT5kZXYsIGJ1Zi0+c2l6ZSwKKwkJCQkgIGJ1Zi0+dmFkZHIs IGJ1Zi0+cGFkZHIpOworCQlidWYtPnZhZGRyID0gTlVMTDsKKwkJYnVmLT5zaXplID0gMDsK Kwl9Cit9CisKK3N0YXRpYyBpbnQgY29kYV9hbGxvY19mcmFtZWJ1ZmZlcnMoc3RydWN0IGNv ZGFfY3R4ICpjdHgsIHN0cnVjdCBjb2RhX3FfZGF0YSAqcV9kYXRhLCB1MzIgZm91cmNjKQor eworCXN0cnVjdCBjb2RhX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpbnQgaGVpZ2h0ID0g cV9kYXRhLT5oZWlnaHQ7CisJZG1hX2FkZHJfdCBwYWRkcjsKKwlpbnQgeXNpemU7CisJaW50 IGk7CisKKwl5c2l6ZSA9IHJvdW5kX3VwKHFfZGF0YS0+d2lkdGgsIDgpICogaGVpZ2h0Owor CisJLyogQWxsb2NhdGUgZnJhbWUgYnVmZmVycyAqLworCWN0eC0+bnVtX2ludGVybmFsX2Zy YW1lcyA9IENPREFfTUFYX0ZSQU1FQlVGRkVSUzsKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5u dW1faW50ZXJuYWxfZnJhbWVzOyBpKyspIHsKKwkJY3R4LT5pbnRlcm5hbF9mcmFtZXNbaV0u c2l6ZSA9IHFfZGF0YS0+c2l6ZWltYWdlOworCQlpZiAoZm91cmNjID09IFY0TDJfUElYX0ZN VF9IMjY0ICYmIGRldi0+ZGV2dHlwZS0+cHJvZHVjdCAhPSBDT0RBX0RYNikKKwkJCWN0eC0+ aW50ZXJuYWxfZnJhbWVzW2ldLnNpemUgKz0geXNpemUvNDsKKwkJY3R4LT5pbnRlcm5hbF9m cmFtZXNbaV0udmFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoCisJCQkJJmRldi0+cGxhdF9k ZXYtPmRldiwgY3R4LT5pbnRlcm5hbF9mcmFtZXNbaV0uc2l6ZSwKKwkJCQkmY3R4LT5pbnRl cm5hbF9mcmFtZXNbaV0ucGFkZHIsIEdGUF9LRVJORUwpOworCQlpZiAoIWN0eC0+aW50ZXJu YWxfZnJhbWVzW2ldLnZhZGRyKSB7CisJCQljb2RhX2ZyZWVfZnJhbWVidWZmZXJzKGN0eCk7 CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCS8qIFJlZ2lzdGVyIGZyYW1lIGJ1 ZmZlcnMgaW4gdGhlIHBhcmFtZXRlciBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3R4 LT5udW1faW50ZXJuYWxfZnJhbWVzOyBpKyspIHsKKwkJcGFkZHIgPSBjdHgtPmludGVybmFs X2ZyYW1lc1tpXS5wYWRkcjsKKwkJY29kYV9wYXJhYnVmX3dyaXRlKGN0eCwgaSAqIDMgKyAw LCBwYWRkcik7IC8qIFkgKi8KKwkJY29kYV9wYXJhYnVmX3dyaXRlKGN0eCwgaSAqIDMgKyAx LCBwYWRkciArIHlzaXplKTsgLyogQ2IgKi8KKwkJY29kYV9wYXJhYnVmX3dyaXRlKGN0eCwg aSAqIDMgKyAyLCBwYWRkciArIHlzaXplICsgeXNpemUvNCk7IC8qIENyICovCisKKwkJaWYg KGRldi0+ZGV2dHlwZS0+cHJvZHVjdCAhPSBDT0RBX0RYNiAmJiBmb3VyY2MgPT0gVjRMMl9Q SVhfRk1UX0gyNjQpCisJCQljb2RhX3BhcmFidWZfd3JpdGUoY3R4LCA5NiArIGksIGN0eC0+ aW50ZXJuYWxfZnJhbWVzW2ldLnBhZGRyICsgeXNpemUgKyB5c2l6ZS80ICsgeXNpemUvNCk7 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9oMjY0X3BhZGRpbmco aW50IHNpemUsIGNoYXIgKnApCit7CisJaW50IG5hbF9zaXplOworCWludCBkaWZmOworCisJ ZGlmZiA9IHNpemUgLSAoc2l6ZSAmIH4weDcpOworCWlmIChkaWZmID09IDApCisJCXJldHVy biAwOworCisJbmFsX3NpemUgPSBjb2RhX2ZpbGxlcl9zaXplW2RpZmZdOworCW1lbWNweShw LCBjb2RhX2ZpbGxlcl9uYWwsIG5hbF9zaXplKTsKKworCS8qIEFkZCByYnNwIHN0b3AgYml0 IGFuZCB0cmFpbGluZyBhdCB0aGUgZW5kICovCisJKihwICsgbmFsX3NpemUgLSAxKSA9IDB4 ODA7CisKKwlyZXR1cm4gbmFsX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfZnJlZV9j b250ZXh0X2J1ZmZlcnMoc3RydWN0IGNvZGFfY3R4ICpjdHgpCit7CisJc3RydWN0IGNvZGFf ZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCWlmIChkZXYtPmRldnR5cGUtPnByb2R1Y3QgPT0g Q09EQV9EWDYpIHsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWNvZGFfZnJlZV9hdXhfYnVm KGRldiwgJmN0eC0+c2xpY2VidWYpOworCQljb2RhX2ZyZWVfYXV4X2J1ZihkZXYsICZjdHgt PndvcmtidWYpOworCQlpZiAoZGV2LT5kZXZ0eXBlLT5wcm9kdWN0ID09IENPREFfNzU0MSkK KwkJCWNvZGFfZnJlZV9hdXhfYnVmKGRldiwgJmN0eC0+cHNidWYpOworCX0KK30KKworc3Rh dGljIGludCBjb2RhX2FsbG9jX2NvbnRleHRfYnVmZmVycyhzdHJ1Y3QgY29kYV9jdHggKmN0 eCwKKwkJCQkgICAgICBzdHJ1Y3QgY29kYV9xX2RhdGEgKnFfZGF0YSkKK3sKKwlzdHJ1Y3Qg Y29kYV9kZXYgKmRldiA9IGN0eC0+ZGV2OworCXNpemVfdCBzaXplOworCWludCByZXQ7CisK Kwlzd2l0Y2ggKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCkgeworCWNhc2UgQ09EQV83NTQxOgor CQlzaXplID0gQ09EQTdfV09SS19CVUZfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ cmV0dXJuIDA7CisJfQorCisJaWYgKGN0eC0+cHNidWYudmFkZHIpIHsKKwkJdjRsMl9lcnIo JmRldi0+djRsMl9kZXYsICJwc21lbWJ1ZiBzdGlsbCBhbGxvY2F0ZWRcbiIpOworCQlyZXR1 cm4gLUVCVVNZOworCX0KKwlpZiAoY3R4LT5zbGljZWJ1Zi52YWRkcikgeworCQl2NGwyX2Vy cigmZGV2LT52NGwyX2RldiwgInNsaWNlYnVmIHN0aWxsIGFsbG9jYXRlZFxuIik7CisJCXJl dHVybiAtRUJVU1k7CisJfQorCWlmIChjdHgtPndvcmtidWYudmFkZHIpIHsKKwkJdjRsMl9l cnIoJmRldi0+djRsMl9kZXYsICJjb250ZXh0IGJ1ZmZlciBzdGlsbCBhbGxvY2F0ZWRcbiIp OworCQlyZXQgPSAtRUJVU1k7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChxX2Rh dGEtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSDI2NCkgeworCQkvKiB3b3JzdCBjYXNlIHNs aWNlIHNpemUgKi8KKwkJc2l6ZSA9IChESVZfUk9VTkRfVVAocV9kYXRhLT53aWR0aCwgMTYp ICoKKwkJCURJVl9ST1VORF9VUChxX2RhdGEtPmhlaWdodCwgMTYpKSAqIDMyMDAgLyA4ICsg NTEyOworCQlyZXQgPSBjb2RhX2FsbG9jX2NvbnRleHRfYnVmKGN0eCwgJmN0eC0+c2xpY2Vi dWYsIHNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJdjRsMl9lcnIoJmRldi0+djRsMl9k ZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZSBzbGljZSBidWZmZXIiLAorCQkJCSBj dHgtPnNsaWNlYnVmLnNpemUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChk ZXYtPmRldnR5cGUtPnByb2R1Y3QgPT0gQ09EQV83NTQxKSB7CisJCXJldCA9IGNvZGFfYWxs b2NfY29udGV4dF9idWYoY3R4LCAmY3R4LT5wc2J1ZiwgQ09EQTdfUFNfQlVGX1NJWkUpOwor CQlpZiAocmV0IDwgMCkgeworCQkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJmYWlsZWQg dG8gYWxsb2NhdGUgcHNtZW0gYnVmZmVyIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwor CXJldCA9IGNvZGFfYWxsb2NfY29udGV4dF9idWYoY3R4LCAmY3R4LT53b3JrYnVmLCBzaXpl KTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgImZhaWxl ZCB0byBhbGxvY2F0ZSAlZCBieXRlIGNvbnRleHQgYnVmZmVyIiwKKwkJCSBjdHgtPndvcmti dWYuc2l6ZSk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJY29k YV9mcmVlX2NvbnRleHRfYnVmZmVycyhjdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBpbnQgY29kYV9lbmNvZGVfaGVhZGVyKHN0cnVjdCBjb2RhX2N0eCAqY3R4LCBzdHJ1Y3Qg dmIyX2J1ZmZlciAqYnVmLAorCQkJICAgICAgaW50IGhlYWRlcl9jb2RlLCB1OCAqaGVhZGVy LCBpbnQgKnNpemUpCit7CisJc3RydWN0IGNvZGFfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlp bnQgcmV0OworCisJY29kYV93cml0ZShkZXYsIHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9h ZGRyKGJ1ZiwgMCksCisJCSAgIENPREFfQ01EX0VOQ19IRUFERVJfQkJfU1RBUlQpOworCWNv ZGFfd3JpdGUoZGV2LCB2YjJfcGxhbmVfc2l6ZShidWYsIDApLCBDT0RBX0NNRF9FTkNfSEVB REVSX0JCX1NJWkUpOworCWNvZGFfd3JpdGUoZGV2LCBoZWFkZXJfY29kZSwgQ09EQV9DTURf RU5DX0hFQURFUl9DT0RFKTsKKwlyZXQgPSBjb2RhX2NvbW1hbmRfc3luYyhjdHgsIENPREFf Q09NTUFORF9FTkNPREVfSEVBREVSKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2Vycigm ZGV2LT52NGwyX2RldiwgIkNPREFfQ09NTUFORF9FTkNPREVfSEVBREVSIHRpbWVvdXRcbiIp OworCQlyZXR1cm4gcmV0OworCX0KKwkqc2l6ZSA9IGNvZGFfcmVhZChkZXYsIENPREFfUkVH X0JJVF9XUl9QVFIoY3R4LT5pZHgpKSAtCisJCWNvZGFfcmVhZChkZXYsIENPREFfQ01EX0VO Q19IRUFERVJfQkJfU1RBUlQpOworCW1lbWNweShoZWFkZXIsIHZiMl9wbGFuZV92YWRkcihi dWYsIDApLCAqc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RhX3N0 YXJ0X3N0cmVhbWluZ19lbmNvZGVyKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGlu dCBjb3VudCkKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IHZiMl9nZXRfZHJ2X3ByaXYo cSk7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZjdHgtPmRldi0+djRsMl9k ZXY7CisJdTMyIGJpdHN0cmVhbV9idWYsIGJpdHN0cmVhbV9zaXplOworCXN0cnVjdCBjb2Rh X2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IGNvZGFfcV9kYXRhICpxX2RhdGFfc3Jj LCAqcV9kYXRhX2RzdDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqYnVmOworCXUzMiBkc3RfZm91 cmNjOworCXUzMiB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKwlxX2RhdGFfc3JjID0gZ2V0X3Ff ZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKTsKKwlxX2RhdGFfZHN0ID0g Z2V0X3FfZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSk7CisJYnVmID0g djRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+bTJtX2N0eCk7CisJYml0c3RyZWFtX2J1ZiA9 IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGJ1ZiwgMCk7CisJYml0c3RyZWFtX3Np emUgPSBxX2RhdGFfZHN0LT5zaXplaW1hZ2U7CisJZHN0X2ZvdXJjYyA9IHFfZGF0YV9kc3Qt PmZvdXJjYzsKKwkvKiBDb3VsZCBzZXQgcm90YXRpb24gaGVyZSBpZiBuZWVkZWQgKi8KKwlz d2l0Y2ggKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCkgeworCWNhc2UgQ09EQV9EWDY6CisJCXZh bHVlID0gKHFfZGF0YV9zcmMtPndpZHRoICYgQ09EQURYNl9QSUNXSURUSF9NQVNLKSA8PCBD T0RBRFg2X1BJQ1dJRFRIX09GRlNFVDsKKwkJdmFsdWUgfD0gKHFfZGF0YV9zcmMtPmhlaWdo dCAmIENPREFEWDZfUElDSEVJR0hUX01BU0spIDw8IENPREFfUElDSEVJR0hUX09GRlNFVDsK KwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsdWUgPSAocV9kYXRhX3NyYy0+d2lkdGggJiBD T0RBN19QSUNXSURUSF9NQVNLKSA8PCBDT0RBN19QSUNXSURUSF9PRkZTRVQ7CisJCXZhbHVl IHw9IChxX2RhdGFfc3JjLT5oZWlnaHQgJiBDT0RBN19QSUNIRUlHSFRfTUFTSykgPDwgQ09E QV9QSUNIRUlHSFRfT0ZGU0VUOworCX0KKwljb2RhX3dyaXRlKGRldiwgdmFsdWUsIENPREFf Q01EX0VOQ19TRVFfU1JDX1NJWkUpOworCWNvZGFfd3JpdGUoZGV2LCBjdHgtPnBhcmFtcy5m cmFtZXJhdGUsCisJCSAgIENPREFfQ01EX0VOQ19TRVFfU1JDX0ZfUkFURSk7CisKKwlzd2l0 Y2ggKGRzdF9mb3VyY2MpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9NUEVHNDoKKwkJY29kYV93 cml0ZShkZXYsIENPREFfU1REX01QRUc0LCBDT0RBX0NNRF9FTkNfU0VRX0NPRF9TVEQpOwor CQljb2RhX3dyaXRlKGRldiwgMCwgQ09EQV9DTURfRU5DX1NFUV9NUDRfUEFSQSk7CisJCWJy ZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX0gyNjQ6CisJCWNvZGFfd3JpdGUoZGV2LCBDT0RB X1NURF9IMjY0LCBDT0RBX0NNRF9FTkNfU0VRX0NPRF9TVEQpOworCQljb2RhX3dyaXRlKGRl diwgMCwgQ09EQV9DTURfRU5DX1NFUV8yNjRfUEFSQSk7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCXY0bDJfZXJyKHY0bDJfZGV2LAorCQkJICJkc3QgZm9ybWF0ICgweCUwOHgpIGludmFs aWQuXG4iLCBkc3RfZm91cmNjKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJ fQorCisJc3dpdGNoIChjdHgtPnBhcmFtcy5zbGljZV9tb2RlKSB7CisJY2FzZSBWNEwyX01Q RUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEU6CisJCXZhbHVlID0gMDsKKwkJYnJl YWs7CisJY2FzZSBWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9NQjoKKwkJ dmFsdWUgID0gKGN0eC0+cGFyYW1zLnNsaWNlX21heF9tYiAmIENPREFfU0xJQ0lOR19TSVpF X01BU0spIDw8IENPREFfU0xJQ0lOR19TSVpFX09GRlNFVDsKKwkJdmFsdWUgfD0gKDEgJiBD T0RBX1NMSUNJTkdfVU5JVF9NQVNLKSA8PCBDT0RBX1NMSUNJTkdfVU5JVF9PRkZTRVQ7CisJ CXZhbHVlIHw9ICAxICYgQ09EQV9TTElDSU5HX01PREVfTUFTSzsKKwkJYnJlYWs7CisJY2Fz ZSBWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUzoKKwkJdmFsdWUg ID0gKGN0eC0+cGFyYW1zLnNsaWNlX21heF9iaXRzICYgQ09EQV9TTElDSU5HX1NJWkVfTUFT SykgPDwgQ09EQV9TTElDSU5HX1NJWkVfT0ZGU0VUOworCQl2YWx1ZSB8PSAoMCAmIENPREFf U0xJQ0lOR19VTklUX01BU0spIDw8IENPREFfU0xJQ0lOR19VTklUX09GRlNFVDsKKwkJdmFs dWUgfD0gIDEgJiBDT0RBX1NMSUNJTkdfTU9ERV9NQVNLOworCQlicmVhazsKKwl9CisJY29k YV93cml0ZShkZXYsIHZhbHVlLCBDT0RBX0NNRF9FTkNfU0VRX1NMSUNFX01PREUpOworCXZh bHVlID0gY3R4LT5wYXJhbXMuZ29wX3NpemUgJiBDT0RBX0dPUF9TSVpFX01BU0s7CisJY29k YV93cml0ZShkZXYsIHZhbHVlLCBDT0RBX0NNRF9FTkNfU0VRX0dPUF9TSVpFKTsKKworCWlm IChjdHgtPnBhcmFtcy5iaXRyYXRlKSB7CisJCS8qIFJhdGUgY29udHJvbCBlbmFibGVkICov CisJCXZhbHVlID0gKGN0eC0+cGFyYW1zLmJpdHJhdGUgJiBDT0RBX1JBVEVDT05UUk9MX0JJ VFJBVEVfTUFTSykgPDwgQ09EQV9SQVRFQ09OVFJPTF9CSVRSQVRFX09GRlNFVDsKKwkJdmFs dWUgfD0gIDEgJiBDT0RBX1JBVEVDT05UUk9MX0VOQUJMRV9NQVNLOworCX0gZWxzZSB7CisJ CXZhbHVlID0gMDsKKwl9CisJY29kYV93cml0ZShkZXYsIHZhbHVlLCBDT0RBX0NNRF9FTkNf U0VRX1JDX1BBUkEpOworCisJY29kYV93cml0ZShkZXYsIDAsIENPREFfQ01EX0VOQ19TRVFf UkNfQlVGX1NJWkUpOworCWNvZGFfd3JpdGUoZGV2LCAwLCBDT0RBX0NNRF9FTkNfU0VRX0lO VFJBX1JFRlJFU0gpOworCisJY29kYV93cml0ZShkZXYsIGJpdHN0cmVhbV9idWYsIENPREFf Q01EX0VOQ19TRVFfQkJfU1RBUlQpOworCWNvZGFfd3JpdGUoZGV2LCBiaXRzdHJlYW1fc2l6 ZSAvIDEwMjQsIENPREFfQ01EX0VOQ19TRVFfQkJfU0laRSk7CisKKwkvKiBzZXQgZGVmYXVs dCBnYW1tYSAqLworCXZhbHVlID0gKENPREFfREVGQVVMVF9HQU1NQSAmIENPREFfR0FNTUFf TUFTSykgPDwgQ09EQV9HQU1NQV9PRkZTRVQ7CisJY29kYV93cml0ZShkZXYsIHZhbHVlLCBD T0RBX0NNRF9FTkNfU0VRX1JDX0dBTU1BKTsKKworCWlmIChDT0RBX0RFRkFVTFRfR0FNTUEg PiAwKSB7CisJCWlmIChkZXYtPmRldnR5cGUtPnByb2R1Y3QgPT0gQ09EQV9EWDYpCisJCQl2 YWx1ZSAgPSAxIDw8IENPREFEWDZfT1BUSU9OX0dBTU1BX09GRlNFVDsKKwkJZWxzZQorCQkJ dmFsdWUgID0gMSA8PCBDT0RBN19PUFRJT05fR0FNTUFfT0ZGU0VUOworCX0gZWxzZSB7CisJ CXZhbHVlID0gMDsKKwl9CisJY29kYV93cml0ZShkZXYsIHZhbHVlLCBDT0RBX0NNRF9FTkNf U0VRX09QVElPTik7CisKKwlpZiAoZHN0X2ZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSDI2NCkg eworCQl2YWx1ZSAgPSAoRk1PX1NMSUNFX1NBVkVfQlVGX1NJWkUgPDwgNyk7CisJCXZhbHVl IHw9ICgwICYgQ09EQV9GTU9QQVJBTV9UWVBFX01BU0spIDw8IENPREFfRk1PUEFSQU1fVFlQ RV9PRkZTRVQ7CisJCXZhbHVlIHw9ICAwICYgQ09EQV9GTU9QQVJBTV9TTElDRU5VTV9NQVNL OworCQlpZiAoZGV2LT5kZXZ0eXBlLT5wcm9kdWN0ID09IENPREFfRFg2KSB7CisJCQljb2Rh X3dyaXRlKGRldiwgdmFsdWUsIENPREFEWDZfQ01EX0VOQ19TRVFfRk1PKTsKKwkJfSBlbHNl IHsKKwkJCWNvZGFfd3JpdGUoZGV2LCBkZXYtPmlyYW1fcGFkZHIsIENPREE3X0NNRF9FTkNf U0VRX1NFQVJDSF9CQVNFKTsKKwkJCWNvZGFfd3JpdGUoZGV2LCA0OCAqIDEwMjQsIENPREE3 X0NNRF9FTkNfU0VRX1NFQVJDSF9TSVpFKTsKKwkJfQorCX0KKworCXJldCA9IGNvZGFfY29t bWFuZF9zeW5jKGN0eCwgQ09EQV9DT01NQU5EX1NFUV9JTklUKTsKKwlpZiAocmV0IDwgMCkg eworCQl2NGwyX2Vycih2NGwyX2RldiwgIkNPREFfQ09NTUFORF9TRVFfSU5JVCB0aW1lb3V0 XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNvZGFfcmVhZChkZXYsIENPREFfUkVU X0VOQ19TRVFfU1VDQ0VTUykgPT0gMCkgeworCQl2NGwyX2Vycih2NGwyX2RldiwgIkNPREFf Q09NTUFORF9TRVFfSU5JVCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3Rv IG91dDsKKwl9CisKKwlyZXQgPSBjb2RhX2FsbG9jX2ZyYW1lYnVmZmVycyhjdHgsIHFfZGF0 YV9zcmMsIGRzdF9mb3VyY2MpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKHY0bDJf ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVyc1xuIik7CisJCWdvdG8gb3V0 OworCX0KKworCWNvZGFfd3JpdGUoZGV2LCBjdHgtPm51bV9pbnRlcm5hbF9mcmFtZXMsIENP REFfQ01EX1NFVF9GUkFNRV9CVUZfTlVNKTsKKwljb2RhX3dyaXRlKGRldiwgcm91bmRfdXAo cV9kYXRhX3NyYy0+d2lkdGgsIDgpLCBDT0RBX0NNRF9TRVRfRlJBTUVfQlVGX1NUUklERSk7 CisJaWYgKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCAhPSBDT0RBX0RYNikgeworCQljb2RhX3dy aXRlKGRldiwgcm91bmRfdXAocV9kYXRhX3NyYy0+d2lkdGgsIDgpLCBDT0RBN19DTURfU0VU X0ZSQU1FX1NPVVJDRV9CVUZfU1RSSURFKTsKKwkJY29kYV93cml0ZShkZXYsIGRldi0+aXJh bV9wYWRkciArIDQ4ICogMTAyNCwgQ09EQTdfQ01EX1NFVF9GUkFNRV9BWElfREJLWV9BRERS KTsKKwkJY29kYV93cml0ZShkZXYsIGRldi0+aXJhbV9wYWRkciArIDUzICogMTAyNCwgQ09E QTdfQ01EX1NFVF9GUkFNRV9BWElfREJLQ19BRERSKTsKKwkJY29kYV93cml0ZShkZXYsIGRl di0+aXJhbV9wYWRkciArIDU4ICogMTAyNCwgQ09EQTdfQ01EX1NFVF9GUkFNRV9BWElfQklU X0FERFIpOworCQljb2RhX3dyaXRlKGRldiwgZGV2LT5pcmFtX3BhZGRyICsgNjggKiAxMDI0 LCBDT0RBN19DTURfU0VUX0ZSQU1FX0FYSV9JUEFDRENfQUREUik7CisJCWNvZGFfd3JpdGUo ZGV2LCAweDAsIENPREE3X0NNRF9TRVRfRlJBTUVfQVhJX09WTF9BRERSKTsKKwl9CisJcmV0 ID0gY29kYV9jb21tYW5kX3N5bmMoY3R4LCBDT0RBX0NPTU1BTkRfU0VUX0ZSQU1FX0JVRik7 CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIodjRsMl9kZXYsICJDT0RBX0NPTU1BTkRf U0VUX0ZSQU1FX0JVRiB0aW1lb3V0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2F2 ZSBzdHJlYW0gaGVhZGVycyAqLworCWJ1ZiA9IHY0bDJfbTJtX25leHRfZHN0X2J1ZihjdHgt Pm0ybV9jdHgpOworCXN3aXRjaCAoZHN0X2ZvdXJjYykgeworCWNhc2UgVjRMMl9QSVhfRk1U X0gyNjQ6CisJCS8qCisJCSAqIEdldCBTUFMgaW4gdGhlIGZpcnN0IGZyYW1lIGFuZCBjb3B5 IGl0IHRvIGFuCisJCSAqIGludGVybWVkaWF0ZSBidWZmZXIuCisJCSAqLworCQlyZXQgPSBj b2RhX2VuY29kZV9oZWFkZXIoY3R4LCBidWYsIENPREFfSEVBREVSX0gyNjRfU1BTLAorCQkJ CQkgJmN0eC0+dnB1X2hlYWRlclswXVswXSwKKwkJCQkJICZjdHgtPnZwdV9oZWFkZXJfc2l6 ZVswXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogR2V0 IFBQUyBpbiB0aGUgZmlyc3QgZnJhbWUgYW5kIGNvcHkgaXQgdG8gYW4KKwkJICogaW50ZXJt ZWRpYXRlIGJ1ZmZlci4KKwkJICovCisJCXJldCA9IGNvZGFfZW5jb2RlX2hlYWRlcihjdHgs IGJ1ZiwgQ09EQV9IRUFERVJfSDI2NF9QUFMsCisJCQkJCSAmY3R4LT52cHVfaGVhZGVyWzFd WzBdLAorCQkJCQkgJmN0eC0+dnB1X2hlYWRlcl9zaXplWzFdKTsKKwkJaWYgKHJldCA8IDAp CisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBMZW5ndGggb2YgSC4yNjQgaGVhZGVycyBp cyB2YXJpYWJsZSBhbmQgdGh1cyBpdCBtaWdodCBub3QgYmUKKwkJICogYWxpZ25lZCBmb3Ig dGhlIGNvZGEgdG8gYXBwZW5kIHRoZSBlbmNvZGVkIGZyYW1lLiBJbiB0aGF0IGlzCisJCSAq IHRoZSBjYXNlIGEgZmlsbGVyIE5BTCBtdXN0IGJlIGFkZGVkIHRvIGhlYWRlciAyLgorCQkg Ki8KKwkJY3R4LT52cHVfaGVhZGVyX3NpemVbMl0gPSBjb2RhX2gyNjRfcGFkZGluZygKKwkJ CQkJKGN0eC0+dnB1X2hlYWRlcl9zaXplWzBdICsKKwkJCQkJIGN0eC0+dnB1X2hlYWRlcl9z aXplWzFdKSwKKwkJCQkJIGN0eC0+dnB1X2hlYWRlclsyXSk7CisJCWJyZWFrOworCWNhc2Ug VjRMMl9QSVhfRk1UX01QRUc0OgorCQkvKgorCQkgKiBHZXQgVk9TIGluIHRoZSBmaXJzdCBm cmFtZSBhbmQgY29weSBpdCB0byBhbgorCQkgKiBpbnRlcm1lZGlhdGUgYnVmZmVyCisJCSAq LworCQlyZXQgPSBjb2RhX2VuY29kZV9oZWFkZXIoY3R4LCBidWYsIENPREFfSEVBREVSX01Q NFZfVk9TLAorCQkJCQkgJmN0eC0+dnB1X2hlYWRlclswXVswXSwKKwkJCQkJICZjdHgtPnZw dV9oZWFkZXJfc2l6ZVswXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJ cmV0ID0gY29kYV9lbmNvZGVfaGVhZGVyKGN0eCwgYnVmLCBDT0RBX0hFQURFUl9NUDRWX1ZJ UywKKwkJCQkJICZjdHgtPnZwdV9oZWFkZXJbMV1bMF0sCisJCQkJCSAmY3R4LT52cHVfaGVh ZGVyX3NpemVbMV0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9 IGNvZGFfZW5jb2RlX2hlYWRlcihjdHgsIGJ1ZiwgQ09EQV9IRUFERVJfTVA0Vl9WT0wsCisJ CQkJCSAmY3R4LT52cHVfaGVhZGVyWzJdWzBdLAorCQkJCQkgJmN0eC0+dnB1X2hlYWRlcl9z aXplWzJdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJLyogTm8gbW9yZSBmb3JtYXRzIG5lZWQgdG8gc2F2ZSBoZWFkZXJzIGF0IHRo ZSBtb21lbnQgKi8KKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIGludCBjb2RhX3N0YXJ0X3N0cmVhbWluZ19kZWNvZGVyKHN0cnVjdCB2YjJfcXVl dWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9 IHZiMl9nZXRfZHJ2X3ByaXYocSk7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9 ICZjdHgtPmRldi0+djRsMl9kZXY7CisJdTMyIGJpdHN0cmVhbV9idWYsIGJpdHN0cmVhbV9z aXplOworCXN0cnVjdCBjb2RhX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IGNvZGFf cV9kYXRhICpxX2RhdGFfc3JjLCAqcV9kYXRhX2RzdDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAq YnVmOworCXUzMiBkc3RfZm91cmNjOworCXUzMiB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKwlx X2RhdGFfc3JjID0gZ2V0X3FfZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVU KTsKKwlxX2RhdGFfZHN0ID0gZ2V0X3FfZGF0YShjdHgsIFY0TDJfQlVGX1RZUEVfVklERU9f Q0FQVFVSRSk7CisJYnVmID0gdjRsMl9tMm1fbmV4dF9kc3RfYnVmKGN0eC0+bTJtX2N0eCk7 CisJYml0c3RyZWFtX2J1ZiA9IHZiMl9kbWFfY29udGlnX3BsYW5lX2RtYV9hZGRyKGJ1Ziwg MCk7CisJYml0c3RyZWFtX3NpemUgPSBxX2RhdGFfZHN0LT5zaXplaW1hZ2U7CisJZHN0X2Zv dXJjYyA9IHFfZGF0YV9kc3QtPmZvdXJjYzsKKwkvKiBGaXJzdCBwdXQgRGVjb2RlciBpbiBl c2NhcGUgaW5pdCBtb2RlICovCisJY29kYV93cml0ZShkZXYsIDEsIENPREFfQ01EX0RFQ19T RVFfSU5JVF9FU0NBUEUpOworCS8qIFNldCBlbmNvZGVkIGJ1ZmZlciBhZGRyZXNzL3NpemUg Ki8KKwljb2RhX3dyaXRlKGRldiwgYml0c3RyZWFtX2J1ZiwgQ09EQV9DTURfREVDX1NFUV9C Ql9TVEFSVCk7CisJY29kYV93cml0ZShkZXYsIGJpdHN0cmVhbV9zaXplIC8gMTAyNCwgQ09E QV9DTURfREVDX1NFUV9CQl9TSVpFKTsKKwkvKiBDb2RhIHdpbGwgYmUgdXNlZCB3aXRoIGxp dmUgc3RyZWFtLCBzZXQgc3RhcnQgYnl0ZSB0byBDT0RBX0NNRF9ERUNfU0VRX0JCX1NUQVJU IHZhbHVlICovCisJLy9jb2RhX3dyaXRlKGRldiwgYml0c3RyZWFtX2J1ZiwgQ09EQV9DTURf REVDX1NFUV9TVEFSVF9CWVRFKTsKK3ByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisK KwkvKiBOb3JtYWxseSBhdCB0aGlzIHN0YWdlIFdyUHRyIGFuZCBSZFB0ciBtdXN0IG5vdCBi ZSBlcXVhbCAqLworCS8vaWYgKERlY0JpdHN0cmVhbUJ1ZkVtcHR5KHBEZWNJbmZvKSkgcmV0 dXJuIFJFVENPREVfV1JPTkdfQ0FMTF9TRVFVRU5DRTsKKworCS8qIERpc2FibGUgb3B0aW9u cyAoQ09EQURYNl9ERUNfT1BUSU9OX1FQUkVQT1JUKSAqLworCWNvZGFfd3JpdGUoZGV2LCAw LCBDT0RBX0NNRF9ERUNfU0VRX09QVElPTik7CisKKwljb2RhX3dyaXRlKGRldiwgMC8qYml0 c3RyZWFtX2J1ZiovLCBDT0RBX0NNRF9ERUNfU0VRX1BTX0JCX1NUQVJUKTsKKwljb2RhX3dy aXRlKGRldiwgMC8qYml0c3RyZWFtX3NpemUgLyAxMDI0Ki8sIENPREFfQ01EX0RFQ19TRVFf UFNfQkJfU0laRSk7CisKKwkvKiBDb3VsZCBzZXQgcm90YXRpb24gaGVyZSBpZiBuZWVkZWQg Ki8KKwlzd2l0Y2ggKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCkgeworCWNhc2UgQ09EQV9EWDY6 CisJCXZhbHVlID0gKHFfZGF0YV9zcmMtPndpZHRoICYgQ09EQURYNl9QSUNXSURUSF9NQVNL KSA8PCBDT0RBRFg2X1BJQ1dJRFRIX09GRlNFVDsKKwkJdmFsdWUgfD0gKHFfZGF0YV9zcmMt PmhlaWdodCAmIENPREFEWDZfUElDSEVJR0hUX01BU0spIDw8IENPREFfUElDSEVJR0hUX09G RlNFVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogT25seSBDb2RhIERYNiBpcyBoYW5k bGVkICovCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwljb2RhX3dyaXRl KGRldiwgdmFsdWUsIENPREFfQ01EX0RFQ19TRVFfU1JDX1NJWkUpOworCisJcmV0ID0gY29k YV9jb21tYW5kX3N5bmMoY3R4LCBDT0RBX0NPTU1BTkRfU0VRX0lOSVQpOworCWlmIChyZXQg PCAwKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ09EQV9DT01NQU5EX1NFUV9JTklUIHRp bWVvdXRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY29kYV9yZWFkKGRldiwgQ09E QV9SRVRfREVDX1NFUV9TVUNDRVNTKSA9PSAwKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LCAi Q09EQV9DT01NQU5EX1NFUV9JTklUIGZhaWxlZCAlZFxuIiwgY29kYV9yZWFkKGRldiwgQ09E QV9SRVRfREVDX1NFUV9FUlJfUkVBU09OKSk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8g b3V0OworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9z dGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IGNvdW50 KQoreworCXN0cnVjdCBjb2RhX2N0eCAqY3R4ID0gdmIyX2dldF9kcnZfcHJpdihxKTsKKwlz dHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gJmN0eC0+ZGV2LT52NGwyX2RldjsKKwl1 MzIgYml0c3RyZWFtX2J1ZiwgYml0c3RyZWFtX3NpemU7CisJc3RydWN0IGNvZGFfZGV2ICpk ZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgY29kYV9xX2RhdGEgKnFfZGF0YV9zcmMsICpxX2Rh dGFfZHN0OworCXN0cnVjdCB2YjJfYnVmZmVyICpidWY7CisJdTMyIGRzdF9mb3VyY2M7CisJ dTMyIHZhbHVlOworCWludCByZXQgPSAwOworCisJcV9kYXRhX3NyYyA9IGdldF9xX2RhdGEo Y3R4LCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCk7CisJaWYgKHEtPnR5cGUgPT0gVjRM Ml9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJaWYgKHFfZGF0YV9zcmMtPmZvdXJjYyA9 PSBWNEwyX1BJWF9GTVRfSDI2NCkgeworI2lmIDAKKwkJCWlmIChjb2RhX2dldF9iaXRzdHJl YW1fcGF5bG9hZChjdHgpIDwgNTEyKQorCQkJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisJ CX0gZWxzZSB7CisJCQlpZiAoY291bnQgPCAxKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9 CisKKwkJY3R4LT5zdHJlYW1vbl9vdXQgPSAxOworCisJCWlmIChjb2RhX2Zvcm1hdF9pc195 dXYocV9kYXRhX3NyYy0+Zm91cmNjKSkKKwkJCWN0eC0+aW5zdF90eXBlID0gQ09EQV9JTlNU X0VOQ09ERVI7CisJCWVsc2UKKwkJCWN0eC0+aW5zdF90eXBlID0gQ09EQV9JTlNUX0RFQ09E RVI7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50IDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOwor CisJCWN0eC0+c3RyZWFtb25fY2FwID0gMTsKKwl9CisKKwkvKiBEb24ndCBzdGFydCB0aGUg Y29kYSB1bmxlc3MgYm90aCBxdWV1ZXMgYXJlIG9uICovCisJaWYgKCEoY3R4LT5zdHJlYW1v bl9vdXQgJiBjdHgtPnN0cmVhbW9uX2NhcCkpCisJCXJldHVybiAwOworCisJY3R4LT5nb3Bj b3VudGVyID0gY3R4LT5wYXJhbXMuZ29wX3NpemUgLSAxOworCWJ1ZiA9IHY0bDJfbTJtX25l eHRfZHN0X2J1ZihjdHgtPm0ybV9jdHgpOworCWJpdHN0cmVhbV9idWYgPSB2YjJfZG1hX2Nv bnRpZ19wbGFuZV9kbWFfYWRkcihidWYsIDApOworCXFfZGF0YV9kc3QgPSBnZXRfcV9kYXRh KGN0eCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKTsKKwliaXRzdHJlYW1fc2l6ZSA9 IHFfZGF0YV9kc3QtPnNpemVpbWFnZTsKKwlkc3RfZm91cmNjID0gcV9kYXRhX2RzdC0+Zm91 cmNjOworCisJY3R4LT5jb2RlYyA9IGNvZGFfZmluZF9jb2RlYyhjdHgtPmRldiwgcV9kYXRh X3NyYy0+Zm91cmNjLAorCQkJCSAgICAgcV9kYXRhX2RzdC0+Zm91cmNjKTsKKwlpZiAoIWN0 eC0+Y29kZWMpIHsKKwkJdjRsMl9lcnIodjRsMl9kZXYsICJjb3VsZG4ndCB0ZWxsIGluc3Rh bmNlIHR5cGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFNhdmUgZW5jb2Rl ciBtb2RlIGludG8gcGFyYW0uIFdpbGwgYmUgdXNlZCBieSBjb2RhX2NvbW1hbmRfc3luYygp ICovCisJY3R4LT5wYXJhbXMuY29kZWNfbW9kZSA9IGN0eC0+Y29kZWMtPm1vZGU7CisKK3Y0 bDJfZXJyKHY0bDJfZGV2LCAiQ29kZWMgbW9kZSAlZC5cbiIsIGN0eC0+cGFyYW1zLmNvZGVj X21vZGUpOworCisJaWYgKCFjb2RhX2lzX2luaXRpYWxpemVkKGRldikpIHsKKwkJdjRsMl9l cnIodjRsMl9kZXYsICJjb2RhIGlzIG5vdCBpbml0aWFsaXplZC5cbiIpOworCQlyZXR1cm4g LUVGQVVMVDsKKwl9CisKKwltdXRleF9sb2NrKCZkZXYtPmNvZGFfbXV0ZXgpOworCisJY29k YV93cml0ZShkZXYsIGN0eC0+cGFyYWJ1Zi5wYWRkciwgQ09EQV9SRUdfQklUX1BBUkFfQlVG X0FERFIpOworCWNvZGFfd3JpdGUoZGV2LCBiaXRzdHJlYW1fYnVmLCBDT0RBX1JFR19CSVRf UkRfUFRSKGN0eC0+aWR4KSk7CisJY29kYV93cml0ZShkZXYsIGJpdHN0cmVhbV9idWYsIENP REFfUkVHX0JJVF9XUl9QVFIoY3R4LT5pZHgpKTsKKwlzd2l0Y2ggKGRldi0+ZGV2dHlwZS0+ cHJvZHVjdCkgeworCWNhc2UgQ09EQV9EWDY6CisJCWNvZGFfd3JpdGUoZGV2LCBDT0RBRFg2 X1NUUkVBTV9CVUZfRFlOQUxMT0NfRU4gfAorCQkJQ09EQURYNl9TVFJFQU1fQlVGX1BJQ19S RVNFVCwgQ09EQV9SRUdfQklUX1NUUkVBTV9DVFJMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoK KwkJY29kYV93cml0ZShkZXYsIENPREE3X1NUUkVBTV9CVUZfRFlOQUxMT0NfRU4gfAorCQkJ Q09EQTdfU1RSRUFNX0JVRl9QSUNfUkVTRVQsIENPREFfUkVHX0JJVF9TVFJFQU1fQ1RSTCk7 CisJfQorCisJLyogTm93IGRvIHNwZWNpZmljIGVuY29kZXIvZGVjb2RlciBzdHVmZiAqLwor CXN3aXRjaCAoY3R4LT5pbnN0X3R5cGUpIHsKKwljYXNlIENPREFfSU5TVF9FTkNPREVSOgor CQlpZiAoZGV2LT5kZXZ0eXBlLT5wcm9kdWN0ID09IENPREFfRFg2KSB7CisJCQkvKiBDb25m aWd1cmUgdGhlIGNvZGEgKi8KKwkJCWNvZGFfd3JpdGUoZGV2LCBkZXYtPmlyYW1fcGFkZHIs IENPREFEWDZfUkVHX0JJVF9TRUFSQ0hfUkFNX0JBU0VfQUREUik7CisJCX0KKworCQlyZXQg PSBjb2RhX3N0YXJ0X3N0cmVhbWluZ19lbmNvZGVyKHEsIGNvdW50KTsKKwkJaWYgKHJldCA8 IDApCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBDT0RBX0lOU1RfREVDT0RFUjoK KwkJcmV0ID0gY29kYV9zdGFydF9zdHJlYW1pbmdfZGVjb2RlcihxLCBjb3VudCk7CisJCWlm IChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KK291dDoKKwltdXRleF91 bmxvY2soJmRldi0+Y29kYV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBjb2RhX3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0 IGNvZGFfY3R4ICpjdHggPSB2YjJfZ2V0X2Rydl9wcml2KHEpOworCXN0cnVjdCBjb2RhX2Rl diAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAocS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJ REVPX09VVFBVVCkgeworCQl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmY3R4LT5kZXYtPnY0 bDJfZGV2LAorCQkJICIlczogb3V0cHV0XG4iLCBfX2Z1bmNfXyk7CisJCWN0eC0+c3RyZWFt b25fb3V0ID0gMDsKKwl9IGVsc2UgeworCQl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmY3R4 LT5kZXYtPnY0bDJfZGV2LAorCQkJICIlczogY2FwdHVyZVxuIiwgX19mdW5jX18pOworCQlj dHgtPnN0cmVhbW9uX2NhcCA9IDA7CisJfQorCisJLyogRG9uJ3Qgc3RvcCB0aGUgY29kYSB1 bmxlc3MgYm90aCBxdWV1ZXMgYXJlIG9mZiAqLworCWlmIChjdHgtPnN0cmVhbW9uX291dCB8 fCBjdHgtPnN0cmVhbW9uX2NhcCkKKwkJcmV0dXJuIDA7CisKKwljYW5jZWxfZGVsYXllZF93 b3JrKCZkZXYtPnRpbWVvdXQpOworCisJbXV0ZXhfbG9jaygmZGV2LT5jb2RhX211dGV4KTsK Kwl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmZGV2LT52NGwyX2RldiwKKwkJICIlczogc2Vu dCBjb21tYW5kICdTRVFfRU5EJyB0byBjb2RhXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGNvZGFf Y29tbWFuZF9zeW5jKGN0eCwgQ09EQV9DT01NQU5EX1NFUV9FTkQpKSB7CisJCXY0bDJfZXJy KCZkZXYtPnY0bDJfZGV2LAorCQkJICJDT0RBX0NPTU1BTkRfU0VRX0VORCBmYWlsZWRcbiIp OworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmNvZGFf bXV0ZXgpOworCisJY29kYV9mcmVlX2ZyYW1lYnVmZmVycyhjdHgpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmIyX29wcyBjb2RhX3FvcHMgPSB7CisJLnF1ZXVlX3Nl dHVwCQk9IGNvZGFfcXVldWVfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlCQk9IGNvZGFfYnVmX3By ZXBhcmUsCisJLmJ1Zl9xdWV1ZQkJPSBjb2RhX2J1Zl9xdWV1ZSwKKwkud2FpdF9wcmVwYXJl CQk9IGNvZGFfd2FpdF9wcmVwYXJlLAorCS53YWl0X2ZpbmlzaAkJPSBjb2RhX3dhaXRfZmlu aXNoLAorCS5zdGFydF9zdHJlYW1pbmcJPSBjb2RhX3N0YXJ0X3N0cmVhbWluZywKKwkuc3Rv cF9zdHJlYW1pbmcJCT0gY29kYV9zdG9wX3N0cmVhbWluZywKK307CisKK3N0YXRpYyBpbnQg Y29kYV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgY29kYV9j dHggKmN0eCA9CisJCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IGNvZGFf Y3R4LCBjdHJscyk7CisKKwl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmY3R4LT5kZXYtPnY0 bDJfZGV2LAorCQkgInNfY3RybDogaWQgPSAlZCwgdmFsID0gJWRcbiIsIGN0cmwtPmlkLCBj dHJsLT52YWwpOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfSEZM SVA6CisJCWlmIChjdHJsLT52YWwpCisJCQljdHgtPnBhcmFtcy5yb3RfbW9kZSB8PSBDT0RB X01JUl9IT1I7CisJCWVsc2UKKwkJCWN0eC0+cGFyYW1zLnJvdF9tb2RlICY9IH5DT0RBX01J Ul9IT1I7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWlmIChjdHJsLT52 YWwpCisJCQljdHgtPnBhcmFtcy5yb3RfbW9kZSB8PSBDT0RBX01JUl9WRVI7CisJCWVsc2UK KwkJCWN0eC0+cGFyYW1zLnJvdF9tb2RlICY9IH5DT0RBX01JUl9WRVI7CisJCWJyZWFrOwor CWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgorCQljdHgtPnBhcmFtcy5iaXRy YXRlID0gY3RybC0+dmFsIC8gMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVH X1ZJREVPX0dPUF9TSVpFOgorCQljdHgtPnBhcmFtcy5nb3Bfc2l6ZSA9IGN0cmwtPnZhbDsK KwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDoK KwkJY3R4LT5wYXJhbXMuaDI2NF9pbnRyYV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJ Y2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUF9GUkFNRV9RUDoKKwkJY3R4LT5wYXJh bXMuaDI2NF9pbnRlcl9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJ RF9NUEVHX1ZJREVPX01QRUc0X0lfRlJBTUVfUVA6CisJCWN0eC0+cGFyYW1zLm1wZWc0X2lu dHJhX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklE RU9fTVBFRzRfUF9GUkFNRV9RUDoKKwkJY3R4LT5wYXJhbXMubXBlZzRfaW50ZXJfcXAgPSBj dHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9T TElDRV9NT0RFOgorCQljdHgtPnBhcmFtcy5zbGljZV9tb2RlID0gY3RybC0+dmFsOworCQli cmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX01COgor CQljdHgtPnBhcmFtcy5zbGljZV9tYXhfbWIgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNh c2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVM6CisJCWN0eC0+ cGFyYW1zLnNsaWNlX21heF9iaXRzID0gY3RybC0+dmFsICogODsKKwkJYnJlYWs7CisJY2Fz ZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCQlicmVhazsKKwlkZWZhdWx0 OgorCQl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmY3R4LT5kZXYtPnY0bDJfZGV2LAorCQkJ IkludmFsaWQgY29udHJvbCwgaWQ9JWQsIHZhbD0lZFxuIiwKKwkJCWN0cmwtPmlkLCBjdHJs LT52YWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIHN0cnVjdCB2NGwyX2N0cmxfb3BzIGNvZGFfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9 IGNvZGFfc19jdHJsLAorfTsKKworc3RhdGljIGludCBjb2RhX2N0cmxzX3NldHVwKHN0cnVj dCBjb2RhX2N0eCAqY3R4KQoreworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJmN0eC0+Y3Ry bHMsIDkpOworCisJdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybHMsICZjb2RhX2N0cmxf b3BzLAorCQlWNEwyX0NJRF9IRkxJUCwgMCwgMSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19z dGQoJmN0eC0+Y3RybHMsICZjb2RhX2N0cmxfb3BzLAorCQlWNEwyX0NJRF9WRkxJUCwgMCwg MSwgMSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybHMsICZjb2RhX2N0cmxf b3BzLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUsIDAsIDMyNzY3MDAwLCAxLCAw KTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJscywgJmNvZGFfY3RybF9vcHMsCisJ CVY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUsIDEsIDYwLCAxLCAxNik7CisJdjRsMl9j dHJsX25ld19zdGQoJmN0eC0+Y3RybHMsICZjb2RhX2N0cmxfb3BzLAorCQlWNEwyX0NJRF9N UEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUCwgMSwgNTEsIDEsIDI1KTsKKwl2NGwyX2N0cmxf bmV3X3N0ZCgmY3R4LT5jdHJscywgJmNvZGFfY3RybF9vcHMsCisJCVY0TDJfQ0lEX01QRUdf VklERU9fSDI2NF9QX0ZSQU1FX1FQLCAxLCA1MSwgMSwgMjUpOworCXY0bDJfY3RybF9uZXdf c3RkKCZjdHgtPmN0cmxzLCAmY29kYV9jdHJsX29wcywKKwkJVjRMMl9DSURfTVBFR19WSURF T19NUEVHNF9JX0ZSQU1FX1FQLCAxLCAzMSwgMSwgMik7CisJdjRsMl9jdHJsX25ld19zdGQo JmN0eC0+Y3RybHMsICZjb2RhX2N0cmxfb3BzLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX01Q RUc0X1BfRlJBTUVfUVAsIDEsIDMxLCAxLCAyKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51 KCZjdHgtPmN0cmxzLCAmY29kYV9jdHJsX29wcywKKwkJVjRMMl9DSURfTVBFR19WSURFT19N VUxUSV9TTElDRV9NT0RFLAorCQlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01B WF9CWVRFUywgMHgwLAorCQlWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5H TEUpOworCXY0bDJfY3RybF9uZXdfc3RkKCZjdHgtPmN0cmxzLCAmY29kYV9jdHJsX29wcywK KwkJVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUIsIDEsIDB4M2ZmZmZm ZmYsIDEsIDEpOworCXY0bDJfY3RybF9uZXdfc3RkKCZjdHgtPmN0cmxzLCAmY29kYV9jdHJs X29wcywKKwkJVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVMsIDEs IDB4M2ZmZmZmZmYsIDEsIDUwMCk7CisJdjRsMl9jdHJsX25ld19zdGRfbWVudSgmY3R4LT5j dHJscywgJmNvZGFfY3RybF9vcHMsCisJCVY0TDJfQ0lEX01QRUdfVklERU9fSEVBREVSX01P REUsCisJCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJB TUUsCisJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSksCisJ CVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUUpOwor CisJaWYgKGN0eC0+Y3RybHMuZXJyb3IpIHsKKwkJdjRsMl9lcnIoJmN0eC0+ZGV2LT52NGwy X2RldiwgImNvbnRyb2wgaW5pdGlhbGl6YXRpb24gZXJyb3IgKCVkKSIsCisJCQljdHgtPmN0 cmxzLmVycm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHY0bDJfY3Ry bF9oYW5kbGVyX3NldHVwKCZjdHgtPmN0cmxzKTsKK30KKworc3RhdGljIGludCBjb2RhX3F1 ZXVlX2luaXQodm9pZCAqcHJpdiwgc3RydWN0IHZiMl9xdWV1ZSAqc3JjX3ZxLAorCQkgICAg ICBzdHJ1Y3QgdmIyX3F1ZXVlICpkc3RfdnEpCit7CisJc3RydWN0IGNvZGFfY3R4ICpjdHgg PSBwcml2OworCWludCByZXQ7CisKKwlzcmNfdnEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJ REVPX09VVFBVVDsKKwlzcmNfdnEtPmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBU UjsKKwlzcmNfdnEtPmRydl9wcml2ID0gY3R4OworCXNyY192cS0+YnVmX3N0cnVjdF9zaXpl ID0gc2l6ZW9mKHN0cnVjdCB2NGwyX20ybV9idWZmZXIpOworCXNyY192cS0+b3BzID0gJmNv ZGFfcW9wczsKKwlzcmNfdnEtPm1lbV9vcHMgPSAmdmIyX2RtYV9jb250aWdfbWVtb3BzOwor CisJcmV0ID0gdmIyX3F1ZXVlX2luaXQoc3JjX3ZxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJZHN0X3ZxLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwor CWRzdF92cS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCWRzdF92cS0+ ZHJ2X3ByaXYgPSBjdHg7CisJZHN0X3ZxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3Ry dWN0IHY0bDJfbTJtX2J1ZmZlcik7CisJZHN0X3ZxLT5vcHMgPSAmY29kYV9xb3BzOworCWRz dF92cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisKKwlyZXR1cm4gdmIy X3F1ZXVlX2luaXQoZHN0X3ZxKTsKK30KKworc3RhdGljIGludCBjb2RhX25leHRfZnJlZV9p bnN0YW5jZShzdHJ1Y3QgY29kYV9kZXYgKmRldikKK3sKKwlpbnQgaWR4ID0gZmZ6KGRldi0+ aW5zdGFuY2VfbWFzayk7CisKKwlpZiAoKGlkeCA8IDApIHx8CisJICAgIChkZXYtPmRldnR5 cGUtPnByb2R1Y3QgPT0gQ09EQV9EWDYgJiYgaWR4ID4gQ09EQURYNl9NQVhfSU5TVEFOQ0VT KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQg Y29kYV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjb2RhX2RldiAqZGV2 ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IE5VTEw7 CisJaW50IHJldCA9IDA7CisJaW50IGlkeDsKKworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mICpj dHgsIEdGUF9LRVJORUwpOworCWlmICghY3R4KSB7CisJCXJldHVybiAtRU5PTUVNOworCX0K KworCWlkeCA9IGNvZGFfbmV4dF9mcmVlX2luc3RhbmNlKGRldik7CisJaWYgKGlkeCA8IDAp IHsKKwkJcmV0ID0gaWR4OworCQlnb3RvIGVycl9jb2RhX21heDsKKwl9CisJc2V0X2JpdChp ZHgsICZkZXYtPmluc3RhbmNlX21hc2spOworCisJdjRsMl9maF9pbml0KCZjdHgtPmZoLCB2 aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAmY3R4LT5maDsK Kwl2NGwyX2ZoX2FkZCgmY3R4LT5maCk7CisJY3R4LT5kZXYgPSBkZXY7CisJY3R4LT5pZHgg PSBpZHg7CisJc3dpdGNoIChkZXYtPmRldnR5cGUtPnByb2R1Y3QpIHsKKwljYXNlIENPREFf NzU0MToKKwkJY3R4LT5yZWdfaWR4ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3R4 LT5yZWdfaWR4ID0gaWR4OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkZXYt PmNsa19wZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nsa19wZXI7CisKKwlyZXQgPSBj bGtfcHJlcGFyZV9lbmFibGUoZGV2LT5jbGtfYWhiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVy cl9jbGtfYWhiOworCisJc2V0X2RlZmF1bHRfcGFyYW1zKGN0eCk7CisJY3R4LT5tMm1fY3R4 ID0gdjRsMl9tMm1fY3R4X2luaXQoZGV2LT5tMm1fZGV2LCBjdHgsCisJCQkJCSAmY29kYV9x dWV1ZV9pbml0KTsKKwlpZiAoSVNfRVJSKGN0eC0+bTJtX2N0eCkpIHsKKwkJcmV0ID0gUFRS X0VSUihjdHgtPm0ybV9jdHgpOworCisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiJXMg cmV0dXJuIGVycm9yICglZClcbiIsCisJCQkgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJy X2N0eF9pbml0OworCX0KKwlyZXQgPSBjb2RhX2N0cmxzX3NldHVwKGN0eCk7CisJaWYgKHJl dCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgImZhaWxlZCB0byBzZXR1cCBjb2Rh IGNvbnRyb2xzXG4iKTsKKwkJZ290byBlcnJfY3RybHNfc2V0dXA7CisJfQorCisJY3R4LT5m aC5jdHJsX2hhbmRsZXIgPSAmY3R4LT5jdHJsczsKKworCXJldCA9IGNvZGFfYWxsb2NfY29u dGV4dF9idWYoY3R4LCAmY3R4LT5wYXJhYnVmLCBDT0RBX1BBUkFfQlVGX1NJWkUpOworCWlm IChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiZmFpbGVkIHRvIGFs bG9jYXRlIHBhcmFidWYiKTsKKwkJZ290byBlcnJfZG1hX2FsbG9jOworCX0KKworCWN0eC0+ Yml0c3RyZWFtLnNpemUgPSBDT0RBX01BWF9GUkFNRV9TSVpFOworCWN0eC0+Yml0c3RyZWFt LnZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZSgmZGV2LT5wbGF0X2Rldi0+ZGV2LAor CQkJY3R4LT5iaXRzdHJlYW0uc2l6ZSwgJmN0eC0+Yml0c3RyZWFtLnBhZGRyLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWN0eC0+Yml0c3RyZWFtLnZhZGRyKSB7CisJCXY0bDJfZXJyKCZkZXYt PnY0bDJfZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJpdHN0cmVhbSByaW5nYnVmZmVyIik7 CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RtYV93cml0ZWNvbWJpbmU7CisJfQor I2lmZGVmIFVTRV9LRklGTworCWtmaWZvX2luaXQoJmN0eC0+Yml0c3RyZWFtX2ZpZm8sCisJ CWN0eC0+Yml0c3RyZWFtLnZhZGRyLCBjdHgtPmJpdHN0cmVhbS5zaXplKTsKKyNlbmRpZgor CW11dGV4X2luaXQoJmN0eC0+Yml0c3RyZWFtX211dGV4KTsKKwltdXRleF9pbml0KCZjdHgt PmJ1ZmZlcl9tdXRleCk7CisKKwljb2RhX2xvY2soY3R4KTsKKwlsaXN0X2FkZCgmY3R4LT5s aXN0LCAmZGV2LT5pbnN0YW5jZXMpOworCWNvZGFfdW5sb2NrKGN0eCk7CisKKwl2NGwyX2Ri ZygxLCBjb2RhX2RlYnVnLCAmZGV2LT52NGwyX2RldiwgIkNyZWF0ZWQgaW5zdGFuY2UgJWQg KCVwKVxuIiwKKwkJIGN0eC0+aWR4LCBjdHgpOworCisJcmV0dXJuIDA7CisKK2Vycl9kbWFf d3JpdGVjb21iaW5lOgorCWNvZGFfZnJlZV9jb250ZXh0X2J1ZmZlcnMoY3R4KTsKKwlpZiAo Y3R4LT5kZXYtPmRldnR5cGUtPnByb2R1Y3QgPT0gQ09EQV9EWDYpCisJCWNvZGFfZnJlZV9h dXhfYnVmKGRldiwgJmN0eC0+d29ya2J1Zik7CisJY29kYV9mcmVlX2F1eF9idWYoZGV2LCAm Y3R4LT5wYXJhYnVmKTsKK2Vycl9kbWFfYWxsb2M6CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJl ZSgmY3R4LT5jdHJscyk7CitlcnJfY3RybHNfc2V0dXA6CisJdjRsMl9tMm1fY3R4X3JlbGVh c2UoY3R4LT5tMm1fY3R4KTsKK2Vycl9jdHhfaW5pdDoKKwljbGtfZGlzYWJsZV91bnByZXBh cmUoZGV2LT5jbGtfYWhiKTsKK2Vycl9jbGtfYWhiOgorCWNsa19kaXNhYmxlX3VucHJlcGFy ZShkZXYtPmNsa19wZXIpOworZXJyX2Nsa19wZXI6CisvKmVycjoqLworCXY0bDJfZmhfZGVs KCZjdHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOworCWNsZWFyX2JpdChjdHgt PmlkeCwgJmRldi0+aW5zdGFuY2VfbWFzayk7CitlcnJfY29kYV9tYXg6CisJa2ZyZWUoY3R4 KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvZGFfcmVsZWFzZShzdHJ1Y3Qg ZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY29kYV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEo ZmlsZSk7CisJc3RydWN0IGNvZGFfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0 ZV9kYXRhKTsKKworCXY0bDJfZGJnKDEsIGNvZGFfZGVidWcsICZkZXYtPnY0bDJfZGV2LCAi UmVsZWFzaW5nIGluc3RhbmNlICVwXG4iLAorCQkgY3R4KTsKKworCWNvZGFfbG9jayhjdHgp OworCWxpc3RfZGVsKCZjdHgtPmxpc3QpOworCWNvZGFfdW5sb2NrKGN0eCk7CisKKwlkbWFf ZnJlZV9jb2hlcmVudCgmZGV2LT5wbGF0X2Rldi0+ZGV2LCBDT0RBX1BBUkFfQlVGX1NJWkUs CisJCWN0eC0+cGFyYWJ1Zi52YWRkciwgY3R4LT5wYXJhYnVmLnBhZGRyKTsKKwl2NGwyX20y bV9jdHhfcmVsZWFzZShjdHgtPm0ybV9jdHgpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUo JmN0eC0+Y3RybHMpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZXYtPmNsa19wZXIpOwor CWNsa19kaXNhYmxlX3VucHJlcGFyZShkZXYtPmNsa19haGIpOworCXY0bDJfZmhfZGVsKCZj dHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOworCWNsZWFyX2JpdChjdHgtPmlk eCwgJmRldi0+aW5zdGFuY2VfbWFzayk7CisJa2ZyZWUoY3R4KTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvZGFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwK KwkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBjb2Rh X2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJaW50IHJldDsK KworCWNvZGFfbG9jayhjdHgpOworCXJldCA9IHY0bDJfbTJtX3BvbGwoZmlsZSwgY3R4LT5t Mm1fY3R4LCB3YWl0KTsKKwljb2RhX3VubG9jayhjdHgpOworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyBpbnQgY29kYV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eCA9IGZoX3RvX2N0eChm aWxlLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIHY0bDJfbTJtX21tYXAoZmlsZSwgY3R4 LT5tMm1fY3R4LCB2bWEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9v cGVyYXRpb25zIGNvZGFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9w ZW4JCT0gY29kYV9vcGVuLAorCS5yZWxlYXNlCT0gY29kYV9yZWxlYXNlLAorCS5wb2xsCQk9 IGNvZGFfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwJPSB2aWRlb19pb2N0bDIsCisJLm1tYXAJ CT0gY29kYV9tbWFwLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGNvZGFfaXJxX2hhbmRs ZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX2J1 ZiwgKmRzdF9idWY7CisJc3RydWN0IGNvZGFfZGV2ICpkZXYgPSBkYXRhOworCXUzMiB3cl9w dHIsIHN0YXJ0X3B0cjsKKwlzdHJ1Y3QgY29kYV9jdHggKmN0eDsKKworCWNhbmNlbF9kZWxh eWVkX3dvcmsoJmRldi0+dGltZW91dCk7CisKKwkvKiByZWFkIHN0YXR1cyByZWdpc3RlciB0 byBhdHRlbmQgdGhlIElSUSAqLworCWNvZGFfcmVhZChkZXYsIENPREFfUkVHX0JJVF9JTlRf U1RBVFVTKTsKKwljb2RhX3dyaXRlKGRldiwgQ09EQV9SRUdfQklUX0lOVF9DTEVBUl9TRVQs CisJCSAgICAgIENPREFfUkVHX0JJVF9JTlRfQ0xFQVIpOworCisJY3R4ID0gdjRsMl9tMm1f Z2V0X2N1cnJfcHJpdihkZXYtPm0ybV9kZXYpOworCWlmIChjdHggPT0gTlVMTCkgeworCQl2 NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkluc3RhbmNlIHJlbGVhc2VkIGJlZm9yZSB0aGUg ZW5kIG9mIHRyYW5zYWN0aW9uXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmNvZGFfbXV0 ZXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGN0eC0+YWJvcnRpbmcp IHsKKwkJdjRsMl9kYmcoMSwgY29kYV9kZWJ1ZywgJmN0eC0+ZGV2LT52NGwyX2RldiwKKwkJ CSAidGFzayBoYXMgYmVlbiBhYm9ydGVkXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmNv ZGFfbXV0ZXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGNvZGFfaXNi dXN5KGN0eC0+ZGV2KSkgeworCQl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmY3R4LT5kZXYt PnY0bDJfZGV2LAorCQkJICJjb2RhIGlzIHN0aWxsIGJ1c3khISEhXG4iKTsKKwkJcmV0dXJu IElSUV9OT05FOworCX0KKworCXNyY19idWYgPSB2NGwyX20ybV9zcmNfYnVmX3JlbW92ZShj dHgtPm0ybV9jdHgpOworCWRzdF9idWYgPSB2NGwyX20ybV9kc3RfYnVmX3JlbW92ZShjdHgt Pm0ybV9jdHgpOworCisJc3dpdGNoIChjdHgtPmluc3RfdHlwZSkgeworCWNhc2UgQ09EQV9J TlNUX0RFQ09ERVI6CisJCWJyZWFrOworCWNhc2UgQ09EQV9JTlNUX0VOQ09ERVI6CisJCS8q IEdldCByZXN1bHRzIGZyb20gdGhlIGNvZGEgKi8KKwkJc3RhcnRfcHRyID0gY29kYV9yZWFk KGRldiwgQ09EQV9DTURfRU5DX1BJQ19CQl9TVEFSVCk7CisJCXdyX3B0ciA9IGNvZGFfcmVh ZChkZXYsIENPREFfUkVHX0JJVF9XUl9QVFIoY3R4LT5pZHgpKTsKKwkJLyogQ2FsY3VsYXRl IGJ5dGVzdXNlZCBmaWVsZCAqLworCQlpZiAoZHN0X2J1Zi0+djRsMl9idWYuc2VxdWVuY2Ug PT0gMCkgeworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKGRzdF9idWYsIDAsIHdyX3B0ciAt IHN0YXJ0X3B0ciArCisJCQkJCWN0eC0+dnB1X2hlYWRlcl9zaXplWzBdICsKKwkJCQkJY3R4 LT52cHVfaGVhZGVyX3NpemVbMV0gKworCQkJCQljdHgtPnZwdV9oZWFkZXJfc2l6ZVsyXSk7 CisJCX0gZWxzZSB7CisJCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoZHN0X2J1ZiwgMCwgd3Jf cHRyIC0gc3RhcnRfcHRyKTsKKwkJfQorCisJCXY0bDJfZGJnKDEsIGNvZGFfZGVidWcsICZj dHgtPmRldi0+djRsMl9kZXYsICJmcmFtZSBzaXplID0gJXVcbiIsCisJCQkJd3JfcHRyIC0g c3RhcnRfcHRyKTsKKworCQljb2RhX3JlYWQoZGV2LCBDT0RBX1JFVF9FTkNfUElDX1NMSUNF X05VTSk7CisJCWNvZGFfcmVhZChkZXYsIENPREFfUkVUX0VOQ19QSUNfRkxBRyk7CisKKwkJ aWYgKGNvZGFfcmVhZChkZXYsIENPREFfUkVUX0VOQ19QSUNfVFlQRSkgPT0gMCkgeworCQkJ ZHN0X2J1Zi0+djRsMl9idWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKKwkJ CWRzdF9idWYtPnY0bDJfYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1BGUkFNRTsKKwkJ fSBlbHNlIHsKKwkJCWRzdF9idWYtPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdf UEZSQU1FOworCQkJZHN0X2J1Zi0+djRsMl9idWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdf S0VZRlJBTUU7CisJCX0KKworCQl2NGwyX20ybV9idWZfZG9uZShzcmNfYnVmLCBWQjJfQlVG X1NUQVRFX0RPTkUpOworCQl2NGwyX20ybV9idWZfZG9uZShkc3RfYnVmLCBWQjJfQlVGX1NU QVRFX0RPTkUpOworCisJCWN0eC0+Z29wY291bnRlci0tOworCQlpZiAoY3R4LT5nb3Bjb3Vu dGVyIDwgMCkKKwkJCWN0eC0+Z29wY291bnRlciA9IGN0eC0+cGFyYW1zLmdvcF9zaXplIC0g MTsKKworCQl2NGwyX2RiZygxLCBjb2RhX2RlYnVnLCAmZGV2LT52NGwyX2RldiwKKwkJCQki am9iIGZpbmlzaGVkOiBlbmNvZGluZyBmcmFtZSAoJWQpICglcylcbiIsCisJCQkJZHN0X2J1 Zi0+djRsMl9idWYuc2VxdWVuY2UsCisJCQkJKGRzdF9idWYtPnY0bDJfYnVmLmZsYWdzICYg VjRMMl9CVUZfRkxBR19LRVlGUkFNRSkgPworCQkJCSJLRVlGUkFNRSIgOiAiUEZSQU1FIik7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmRl di0+Y29kYV9tdXRleCk7CisKKwl2NGwyX20ybV9qb2JfZmluaXNoKGN0eC0+ZGV2LT5tMm1f ZGV2LCBjdHgtPm0ybV9jdHgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0 aWMgdm9pZCBjb2RhX3RpbWVvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0 cnVjdCBjb2RhX2N0eCAqY3R4OworCXN0cnVjdCBjb2RhX2RldiAqZGV2ID0gY29udGFpbmVy X29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwKKwkJCQkJICAgIHN0cnVjdCBjb2RhX2Rldiwg dGltZW91dCk7CisKKwlkZXZfZXJyKCZkZXYtPnBsYXRfZGV2LT5kZXYsICJDT0RBIFBJQ19S VU4gdGltZW91dCwgc3RvcHBpbmcgYWxsIHN0cmVhbXNcbiIpOworCisJbXV0ZXhfbG9jaygm ZGV2LT5kZXZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmZGV2LT5pbnN0 YW5jZXMsIGxpc3QpIHsKKwkJdjRsMl9tMm1fc3RyZWFtb2ZmKE5VTEwsIGN0eC0+bTJtX2N0 eCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpOworCQl2NGwyX20ybV9zdHJlYW1vZmYo TlVMTCwgY3R4LT5tMm1fY3R4LCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpOworCX0K KwltdXRleF91bmxvY2soJmRldi0+ZGV2X211dGV4KTsKKworCW11dGV4X3VubG9jaygmZGV2 LT5jb2RhX211dGV4KTsKKwljdHggPSB2NGwyX20ybV9nZXRfY3Vycl9wcml2KGRldi0+bTJt X2Rldik7CisJdjRsMl9tMm1fam9iX2ZpbmlzaChjdHgtPmRldi0+bTJtX2RldiwgY3R4LT5t Mm1fY3R4KTsKK30KKworc3RhdGljIHUzMiBjb2RhX3N1cHBvcnRlZF9maXJtd2FyZXNbXSA9 IHsKKwlDT0RBX0ZJUk1XQVJFX1ZFUk5VTShDT0RBX0RYNiwgMiwgMiwgNSksCisJQ09EQV9G SVJNV0FSRV9WRVJOVU0oQ09EQV83NTQxLCAxMywgNCwgMjkpLAorfTsKKworc3RhdGljIGJv b2wgY29kYV9maXJtd2FyZV9zdXBwb3J0ZWQodTMyIHZlcm51bSkKK3sKKwlpbnQgaTsKKwor CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGFfc3VwcG9ydGVkX2Zpcm13YXJlcyk7 IGkrKykKKwkJaWYgKHZlcm51bSA9PSBjb2RhX3N1cHBvcnRlZF9maXJtd2FyZXNbaV0pCisJ CQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBjaGFyICpjb2Rh X3Byb2R1Y3RfbmFtZShpbnQgcHJvZHVjdCkKK3sKKwlzdGF0aWMgY2hhciBidWZbOV07CisK Kwlzd2l0Y2ggKHByb2R1Y3QpIHsKKwljYXNlIENPREFfRFg2OgorCQlyZXR1cm4gIkNvZGFE eDYiOworCWNhc2UgQ09EQV83NTQxOgorCQlyZXR1cm4gIkNPREE3NTQxIjsKKwlkZWZhdWx0 OgorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiKDB4JTA0eCkiLCBwcm9kdWN0KTsK KwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29kYV9od19pbml0KHN0cnVj dCBjb2RhX2RldiAqZGV2KQoreworCXUxNiBwcm9kdWN0LCBtYWpvciwgbWlub3IsIHJlbGVh c2U7CisJdTMyIGRhdGE7CisJdTE2ICpwOworCWludCBpOworCisJY2xrX3ByZXBhcmVfZW5h YmxlKGRldi0+Y2xrX3Blcik7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGRldi0+Y2xrX2FoYik7 CisKKwkvKgorCSAqIENvcHkgdGhlIGZpcnN0IENPREFfSVNSQU1fU0laRSBpbiB0aGUgaW50 ZXJuYWwgU1JBTS4KKwkgKiBUaGUgMTYtYml0IGNoYXJzIGluIHRoZSBjb2RlIGJ1ZmZlciBh cmUgaW4gbWVtb3J5IGFjY2VzcworCSAqIG9yZGVyLCByZS1zb3J0IHRoZW0gdG8gQ09EQSBv cmRlciBmb3IgcmVnaXN0ZXIgZG93bmxvYWQuCisJICogRGF0YSBpbiB0aGlzIFNSQU0gc3Vy dml2ZXMgYSByZWJvb3QuCisJICovCisJcCA9ICh1MTYgKilkZXYtPmNvZGVidWYudmFkZHI7 CisJaWYgKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCA9PSBDT0RBX0RYNikgeworCQlmb3IgKGkg PSAwOyBpIDwgKENPREFfSVNSQU1fU0laRSAvIDIpOyBpKyspICB7CisJCQlkYXRhID0gQ09E QV9ET1dOX0FERFJFU1NfU0VUKGkpIHwKKwkJCQlDT0RBX0RPV05fREFUQV9TRVQocFtpIF4g MV0pOworCQkJY29kYV93cml0ZShkZXYsIGRhdGEsIENPREFfUkVHX0JJVF9DT0RFX0RPV04p OworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IChDT0RBX0lTUkFNX1NJWkUg LyAyKTsgaSsrKSB7CisJCQlkYXRhID0gQ09EQV9ET1dOX0FERFJFU1NfU0VUKGkpIHwKKwkJ CQlDT0RBX0RPV05fREFUQV9TRVQocFtyb3VuZF9kb3duKGksIDQpICsKKwkJCQkJCQkzIC0g KGkgJSA0KV0pOworCQkJY29kYV93cml0ZShkZXYsIGRhdGEsIENPREFfUkVHX0JJVF9DT0RF X0RPV04pOworCQl9CisJfQorCisJLyogQ2xlYXIgcmVnaXN0ZXJzICovCisJZm9yIChpID0g MDsgaSA8IDY0OyBpKyspCisJCWNvZGFfd3JpdGUoZGV2LCAwLCBDT0RBX1JFR19CSVRfQ09E RV9CVUZfQUREUiArIGkgKiA0KTsKKworCS8qIFRlbGwgdGhlIEJJVCB3aGVyZSB0byBmaW5k IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgKi8KKwljb2RhX3dyaXRlKGRldiwgZGV2LT53b3JrYnVm LnBhZGRyLAorCQkgICAgICBDT0RBX1JFR19CSVRfV09SS19CVUZfQUREUik7CisJY29kYV93 cml0ZShkZXYsIGRldi0+Y29kZWJ1Zi5wYWRkciwKKwkJICAgICAgQ09EQV9SRUdfQklUX0NP REVfQlVGX0FERFIpOworCWNvZGFfd3JpdGUoZGV2LCAwLCBDT0RBX1JFR19CSVRfQ09ERV9S VU4pOworCisJLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCisJc3dpdGNoIChkZXYtPmRldnR5 cGUtPnByb2R1Y3QpIHsKKwljYXNlIENPREFfRFg2OgorCQljb2RhX3dyaXRlKGRldiwgQ09E QURYNl9TVFJFQU1fQlVGX1BJQ19GTFVTSCwgQ09EQV9SRUdfQklUX1NUUkVBTV9DVFJMKTsK KwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29kYV93cml0ZShkZXYsIENPREE3X1NUUkVBTV9C VUZfUElDX0ZMVVNILCBDT0RBX1JFR19CSVRfU1RSRUFNX0NUUkwpOworCX0KKwljb2RhX3dy aXRlKGRldiwgMCwgQ09EQV9SRUdfQklUX0ZSQU1FX01FTV9DVFJMKTsKKworCWlmIChkZXYt PmRldnR5cGUtPnByb2R1Y3QgIT0gQ09EQV9EWDYpCisJCWNvZGFfd3JpdGUoZGV2LCAwLCBD T0RBN19SRUdfQklUX0FYSV9TUkFNX1VTRSk7CisKKwljb2RhX3dyaXRlKGRldiwgQ09EQV9J TlRfSU5URVJSVVBUX0VOQUJMRSwKKwkJICAgICAgQ09EQV9SRUdfQklUX0lOVF9FTkFCTEUp OworCisJLyogUmVzZXQgVlBVIGFuZCBzdGFydCBwcm9jZXNzb3IgKi8KKwlkYXRhID0gY29k YV9yZWFkKGRldiwgQ09EQV9SRUdfQklUX0NPREVfUkVTRVQpOworCWRhdGEgfD0gQ09EQV9S RUdfUkVTRVRfRU5BQkxFOworCWNvZGFfd3JpdGUoZGV2LCBkYXRhLCBDT0RBX1JFR19CSVRf Q09ERV9SRVNFVCk7CisJdWRlbGF5KDEwKTsKKwlkYXRhICY9IH5DT0RBX1JFR19SRVNFVF9F TkFCTEU7CisJY29kYV93cml0ZShkZXYsIGRhdGEsIENPREFfUkVHX0JJVF9DT0RFX1JFU0VU KTsKKwljb2RhX3dyaXRlKGRldiwgQ09EQV9SRUdfUlVOX0VOQUJMRSwgQ09EQV9SRUdfQklU X0NPREVfUlVOKTsKKworCS8qIExvYWQgZmlybXdhcmUgKi8KKwljb2RhX3dyaXRlKGRldiwg MCwgQ09EQV9DTURfRklSTVdBUkVfVkVSTlVNKTsKKwljb2RhX3dyaXRlKGRldiwgQ09EQV9S RUdfQklUX0JVU1lfRkxBRywgQ09EQV9SRUdfQklUX0JVU1kpOworCWNvZGFfd3JpdGUoZGV2 LCAwLCBDT0RBX1JFR19CSVRfUlVOX0lOREVYKTsKKwljb2RhX3dyaXRlKGRldiwgMCwgQ09E QV9SRUdfQklUX1JVTl9DT0RfU1REKTsKKwljb2RhX3dyaXRlKGRldiwgQ09EQV9DT01NQU5E X0ZJUk1XQVJFX0dFVCwgQ09EQV9SRUdfQklUX1JVTl9DT01NQU5EKTsKKwlpZiAoY29kYV93 YWl0X3RpbWVvdXQoZGV2KSkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGV2LT5jbGtf cGVyKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRldi0+Y2xrX2FoYik7CisJCXY0bDJf ZXJyKCZkZXYtPnY0bDJfZGV2LCAiZmlybXdhcmUgZ2V0IGNvbW1hbmQgZXJyb3JcbiIpOwor CQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDaGVjayB3ZSBhcmUgY29tcGF0aWJsZSB3aXRo IHRoZSBsb2FkZWQgZmlybXdhcmUgKi8KKwlkYXRhID0gY29kYV9yZWFkKGRldiwgQ09EQV9D TURfRklSTVdBUkVfVkVSTlVNKTsKKwlwcm9kdWN0ID0gQ09EQV9GSVJNV0FSRV9QUk9EVUNU KGRhdGEpOworCW1ham9yID0gQ09EQV9GSVJNV0FSRV9NQUpPUihkYXRhKTsKKwltaW5vciA9 IENPREFfRklSTVdBUkVfTUlOT1IoZGF0YSk7CisJcmVsZWFzZSA9IENPREFfRklSTVdBUkVf UkVMRUFTRShkYXRhKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZXYtPmNsa19wZXIp OworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZXYtPmNsa19haGIpOworCisJaWYgKHByb2R1 Y3QgIT0gZGV2LT5kZXZ0eXBlLT5wcm9kdWN0KSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJf ZGV2LCAiV3JvbmcgZmlybXdhcmUuIEh3OiAlcywgRnc6ICVzLCIKKwkJCSAiIFZlcnNpb246 ICV1LiV1LiV1XG4iLAorCQkJIGNvZGFfcHJvZHVjdF9uYW1lKGRldi0+ZGV2dHlwZS0+cHJv ZHVjdCksCisJCQkgY29kYV9wcm9kdWN0X25hbWUocHJvZHVjdCksIG1ham9yLCBtaW5vciwg cmVsZWFzZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXY0bDJfaW5mbygmZGV2LT52 NGwyX2RldiwgIkluaXRpYWxpemVkICVzLlxuIiwKKwkJICBjb2RhX3Byb2R1Y3RfbmFtZShw cm9kdWN0KSk7CisKKwlpZiAoY29kYV9maXJtd2FyZV9zdXBwb3J0ZWQoZGF0YSkpIHsKKwkJ djRsMl9pbmZvKCZkZXYtPnY0bDJfZGV2LCAiRmlybXdhcmUgdmVyc2lvbjogJXUuJXUuJXVc biIsCisJCQkgIG1ham9yLCBtaW5vciwgcmVsZWFzZSk7CisJfSBlbHNlIHsKKwkJdjRsMl93 YXJuKCZkZXYtPnY0bDJfZGV2LCAiVW5zdXBwb3J0ZWQgZmlybXdhcmUgdmVyc2lvbjogIgor CQkJICAiJXUuJXUuJXVcbiIsIG1ham9yLCBtaW5vciwgcmVsZWFzZSk7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfZndfY2FsbGJhY2soY29uc3Qgc3RydWN0 IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgY29kYV9kZXYgKmRl diA9IGNvbnRleHQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRldi0+cGxh dF9kZXY7CisJaW50IHJldDsKKworCWlmICghZncpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRs Ml9kZXYsICJmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisK KwkvKiBhbGxvY2F0ZSBhdXhpbGlhcnkgcGVyLWRldmljZSBjb2RlIGJ1ZmZlciBmb3IgdGhl IEJJVCBwcm9jZXNzb3IgKi8KKwlkZXYtPmNvZGVidWYuc2l6ZSA9IGZ3LT5zaXplOworCWRl di0+Y29kZWJ1Zi52YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBmdy0+ c2l6ZSwKKwkJCQkJCSAgICAmZGV2LT5jb2RlYnVmLnBhZGRyLAorCQkJCQkJICAgIEdGUF9L RVJORUwpOworCWlmICghZGV2LT5jb2RlYnVmLnZhZGRyKSB7CisJCWRldl9lcnIoJnBkZXYt PmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBjb2RlIGJ1ZmZlclxuIik7CisJCXJldHVybjsK Kwl9CisKKwkvKiBDb3B5IHRoZSB3aG9sZSBmaXJtd2FyZSBpbWFnZSB0byB0aGUgY29kZSBi dWZmZXIgKi8KKwltZW1jcHkoZGV2LT5jb2RlYnVmLnZhZGRyLCBmdy0+ZGF0YSwgZnctPnNp emUpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0ID0gY29kYV9od19pbml0KGRl dik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkhXIGluaXRp YWxpemF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPnZmZC5mb3Bz CT0gJmNvZGFfZm9wcywKKwlkZXYtPnZmZC5pb2N0bF9vcHMJPSAmY29kYV9pb2N0bF9vcHM7 CisJZGV2LT52ZmQucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAorCWRl di0+dmZkLmxvY2sJPSAmZGV2LT5kZXZfbXV0ZXg7CisJZGV2LT52ZmQudjRsMl9kZXYJPSAm ZGV2LT52NGwyX2RldjsKKwlkZXYtPnZmZC52ZmxfZGlyCT0gVkZMX0RJUl9NMk07CisJc25w cmludGYoZGV2LT52ZmQubmFtZSwgc2l6ZW9mKGRldi0+dmZkLm5hbWUpLCAiJXMiLCBDT0RB X05BTUUpOworCXZpZGVvX3NldF9kcnZkYXRhKCZkZXYtPnZmZCwgZGV2KTsKKworCWRldi0+ YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoJnBkZXYtPmRldik7CisJaWYg KElTX0VSUihkZXYtPmFsbG9jX2N0eCkpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYs ICJGYWlsZWQgdG8gYWxsb2MgdmIyIGNvbnRleHRcbiIpOworCQlyZXR1cm47CisJfQorCisJ ZGV2LT5tMm1fZGV2ID0gdjRsMl9tMm1faW5pdCgmY29kYV9tMm1fb3BzKTsKKwlpZiAoSVNf RVJSKGRldi0+bTJtX2RldikpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJGYWls ZWQgdG8gaW5pdCBtZW0ybWVtIGRldmljZVxuIik7CisJCWdvdG8gcmVsX2N0eDsKKwl9CisK KwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmRldi0+dmZkLCBWRkxfVFlQRV9HUkFC QkVSLCAwKTsKKwlpZiAocmV0KSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiRmFp bGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7CisJCWdvdG8gcmVsX20ybTsKKwl9 CisJdjRsMl9pbmZvKCZkZXYtPnY0bDJfZGV2LCAiY29kZWMgcmVnaXN0ZXJlZCBhcyAvZGV2 L3ZpZGVvJWRcbiIsCisJCSAgZGV2LT52ZmQubnVtKTsKKworCXJldHVybjsKKworcmVsX20y bToKKwl2NGwyX20ybV9yZWxlYXNlKGRldi0+bTJtX2Rldik7CityZWxfY3R4OgorCXZiMl9k bWFfY29udGlnX2NsZWFudXBfY3R4KGRldi0+YWxsb2NfY3R4KTsKK30KKworc3RhdGljIGlu dCBjb2RhX2Zpcm13YXJlX3JlcXVlc3Qoc3RydWN0IGNvZGFfZGV2ICpkZXYpCit7CisJY2hh ciAqZncgPSBkZXYtPmRldnR5cGUtPmZpcm13YXJlOworCisJZGV2X2RiZygmZGV2LT5wbGF0 X2Rldi0+ZGV2LCAicmVxdWVzdGluZyBmaXJtd2FyZSAnJXMnIGZvciAlc1xuIiwgZncsCisJ CWNvZGFfcHJvZHVjdF9uYW1lKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCkpOworCisJcmV0dXJu IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCB0cnVlLAorCQlmdywgJmRl di0+cGxhdF9kZXYtPmRldiwgR0ZQX0tFUk5FTCwgZGV2LCBjb2RhX2Z3X2NhbGxiYWNrKTsK K30KKworZW51bSBjb2RhX3BsYXRmb3JtIHsKKwlDT0RBX0lNWDI3LAorCUNPREFfSU1YNTMs Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvZGFfZGV2dHlwZSBjb2RhX2RldmRhdGFb XSA9IHsKKwlbQ09EQV9JTVgyN10gPSB7CisJCS5maXJtd2FyZSAgID0gInY0bC1jb2RhZHg2 LWlteDI3LmJpbiIsCisJCS5wcm9kdWN0ICAgID0gQ09EQV9EWDYsCisJCS5jb2RlY3MgICAg ID0gY29kYWR4Nl9jb2RlY3MsCisJCS5udW1fY29kZWNzID0gQVJSQVlfU0laRShjb2RhZHg2 X2NvZGVjcyksCisJfSwKKwlbQ09EQV9JTVg1M10gPSB7CisJCS5maXJtd2FyZSAgID0gInY0 bC1jb2RhNzU0MS1pbXg1My5iaW4iLAorCQkucHJvZHVjdCAgICA9IENPREFfNzU0MSwKKwkJ LmNvZGVjcyAgICAgPSBjb2RhN19jb2RlY3MsCisJCS5udW1fY29kZWNzID0gQVJSQVlfU0la RShjb2RhN19jb2RlY3MpLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2Rl dmljZV9pZCBjb2RhX3BsYXRmb3JtX2lkc1tdID0geworCXsgLm5hbWUgPSAiY29kYS1pbXgy NyIsIC5kcml2ZXJfZGF0YSA9IENPREFfSU1YMjcgfSwKKwl7IC5uYW1lID0gImNvZGEtaW14 NTMiLCAuZHJpdmVyX2RhdGEgPSBDT0RBX0lNWDUzIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9 Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgY29kYV9wbGF0Zm9ybV9pZHMp OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBjb2RhX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI3LXZwdSIs IC5kYXRhID0gJmNvZGFfcGxhdGZvcm1faWRzW0NPREFfSU1YMjddIH0sCisJeyAuY29tcGF0 aWJsZSA9ICJmc2wsaW14NTMtdnB1IiwgLmRhdGEgPSAmY29kYV9kZXZkYXRhW0NPREFfSU1Y NTNdIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShv ZiwgY29kYV9kdF9pZHMpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgY29kYV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIoY29kYV9kdF9p ZHMpLCAmcGRldi0+ZGV2KTsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpw ZGV2X2lkOworCXN0cnVjdCBjb2RhX2RldiAqZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVz OworCWludCByZXQsIGlycTsKKworCWRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBz aXplb2YgKmRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiTm90IGVub3VnaCBtZW1vcnkgZm9yICVzXG4iLAorCQkJQ09EQV9OQU1FKTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+aXJxbG9j ayk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+aW5zdGFuY2VzKTsKKwlJTklUX0RFTEFZRURf V09SSygmZGV2LT50aW1lb3V0LCBjb2RhX3RpbWVvdXQpOworCisJZGV2LT5wbGF0X2RldiA9 IHBkZXY7CisJZGV2LT5jbGtfcGVyID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwZXIi KTsKKwlpZiAoSVNfRVJSKGRldi0+Y2xrX3BlcikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiQ291bGQgbm90IGdldCBwZXIgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkZXYt PmNsa19wZXIpOworCX0KKworCWRldi0+Y2xrX2FoYiA9IGRldm1fY2xrX2dldCgmcGRldi0+ ZGV2LCAiYWhiIik7CisJaWYgKElTX0VSUihkZXYtPmNsa19haGIpKSB7CisJCWRldl9lcnIo JnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgYWhiIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBU Ul9FUlIoZGV2LT5jbGtfYWhiKTsKKwl9CisKKwkvKiBHZXQgIG1lbW9yeSBmb3IgcGh5c2lj YWwgcmVnaXN0ZXJzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291cmNlXG4iKTsKKwkJ cmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZw ZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQlyZXNvdXJjZV9zaXplKHJlcyksIENPREFfTkFN RSkgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVz dCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWRldi0+cmVn c19iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAg ICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWRldi0+cmVnc19iYXNlKSB7CisJCWRl dl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwIGFkZHJlc3MgcmVnaW9uXG4i KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogSVJRICovCisJaXJxID0gcGxhdGZv cm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRU5P RU5UOworCX0KKworCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgY29k YV9pcnFfaGFuZGxlciwKKwkJMCwgQ09EQV9OQU1FLCBkZXYpIDwgMCkgeworCQlkZXZfZXJy KCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnFcbiIpOworCQlyZXR1cm4gLUVO T0VOVDsKKwl9CisKKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCAm ZGV2LT52NGwyX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2lu aXQoJmRldi0+ZGV2X211dGV4KTsKKwltdXRleF9pbml0KCZkZXYtPmNvZGFfbXV0ZXgpOwor CisJcGRldl9pZCA9IG9mX2lkID8gb2ZfaWQtPmRhdGEgOiBwbGF0Zm9ybV9nZXRfZGV2aWNl X2lkKHBkZXYpOworCisJaWYgKG9mX2lkKSB7CisJCWRldi0+ZGV2dHlwZSA9IG9mX2lkLT5k YXRhOworCX0gZWxzZSBpZiAocGRldl9pZCkgeworCQlkZXYtPmRldnR5cGUgPSAmY29kYV9k ZXZkYXRhW3BkZXZfaWQtPmRyaXZlcl9kYXRhXTsKKwl9IGVsc2UgeworCQl2NGwyX2Rldmlj ZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJLyogYWxsb2NhdGUgYXV4aWxpYXJ5IHBlci1kZXZpY2UgYnVmZmVycyBmb3IgdGhlIEJJ VCBwcm9jZXNzb3IgKi8KKwlzd2l0Y2ggKGRldi0+ZGV2dHlwZS0+cHJvZHVjdCkgeworCWNh c2UgQ09EQV9EWDY6CisJCWRldi0+d29ya2J1Zi5zaXplID0gQ09EQURYNl9XT1JLX0JVRl9T SVpFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXYtPndvcmtidWYuc2l6ZSA9IENPREE3 X1dPUktfQlVGX1NJWkU7CisJfQorCWRldi0+d29ya2J1Zi52YWRkciA9IGRtYV9hbGxvY19j b2hlcmVudCgmcGRldi0+ZGV2LCBkZXYtPndvcmtidWYuc2l6ZSwKKwkJCQkJCSAgICAmZGV2 LT53b3JrYnVmLnBhZGRyLAorCQkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghZGV2LT53 b3JrYnVmLnZhZGRyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxv Y2F0ZSB3b3JrIGJ1ZmZlclxuIik7CisJCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ djRsMl9kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZGV2LT5kZXZ0eXBl LT5wcm9kdWN0ID09IENPREFfRFg2KSB7CisJCWRldi0+aXJhbV9wYWRkciA9IDB4ZmZmZjRj MDA7CisJfSBlbHNlIHsKKwkJdm9pZCBfX2lvbWVtICppcmFtX3ZhZGRyOworCisJCWlyYW1f dmFkZHIgPSBpcmFtX2FsbG9jKENPREE3X0lSQU1fU0laRSwKKwkJCQkJJmRldi0+aXJhbV9w YWRkcik7CisJCWlmICghaXJhbV92YWRkcikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAi dW5hYmxlIHRvIGFsbG9jIGlyYW1cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9 CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIGNvZGFf ZmlybXdhcmVfcmVxdWVzdChkZXYpOworfQorCitzdGF0aWMgaW50IGNvZGFfcmVtb3ZlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvZGFfZGV2ICpkZXYg PSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2 aWNlKCZkZXYtPnZmZCk7CisJaWYgKGRldi0+bTJtX2RldikKKwkJdjRsMl9tMm1fcmVsZWFz ZShkZXYtPm0ybV9kZXYpOworCWlmIChkZXYtPmFsbG9jX2N0eCkKKwkJdmIyX2RtYV9jb250 aWdfY2xlYW51cF9jdHgoZGV2LT5hbGxvY19jdHgpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0 ZXIoJmRldi0+djRsMl9kZXYpOworCWlmIChkZXYtPmlyYW1fcGFkZHIpCisJCWlyYW1fZnJl ZShkZXYtPmlyYW1fcGFkZHIsIENPREE3X0lSQU1fU0laRSk7CisJaWYgKGRldi0+Y29kZWJ1 Zi52YWRkcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgZGV2LT5jb2RlYnVm LnNpemUsCisJCQkJICAmZGV2LT5jb2RlYnVmLnZhZGRyLCBkZXYtPmNvZGVidWYucGFkZHIp OworCWlmIChkZXYtPndvcmtidWYudmFkZHIpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2 LT5kZXYsIGRldi0+d29ya2J1Zi5zaXplLCAmZGV2LT53b3JrYnVmLnZhZGRyLAorCQkJICBk ZXYtPndvcmtidWYucGFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciBjb2RhX2RyaXZlciA9IHsKKwkucHJvYmUJPSBjb2RhX3Byb2JlLAor CS5yZW1vdmUJPSBjb2RhX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9IENPREFf TkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9m X21hdGNoX3B0cihjb2RhX2R0X2lkcyksCisJfSwKKwkuaWRfdGFibGUgPSBjb2RhX3BsYXRm b3JtX2lkcywKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoY29kYV9kcml2ZXIpOwor CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKYXZpZXIgTWFydGlu IDxqYXZpZXIubWFydGluQHZpc3RhLXNpbGljb24uY29tPiIpOworTU9EVUxFX0RFU0NSSVBU SU9OKCJDb2RhIG11bHRpLXN0YW5kYXJkIGNvZGVjIFY0TDIgZHJpdmVyIik7Cg== --------------080108070202040904060104--