LyogCiAqICRJZDogbXRkLmgsdiAxLjU2IDIwMDQvMDgvMDkgMTg6NDY6MDQgZG1hcmxpbiBFeHAgJAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+IGV0IGFsLgogKgogKiBSZWxlYXNlZCB1bmRlciBHUEwKICovCgojaWZuZGVmIF9fTVREX01URF9IX18KI2RlZmluZSBfX01URF9NVERfSF9fCgojaWZuZGVmIF9fS0VSTkVMX18KI2Vycm9yIFRoaXMgaXMgYSBrZXJuZWwgaGVhZGVyLiBQZXJoYXBzIGluY2x1ZGUgbXRkLXVzZXIuaCBpbnN0ZWFkPwojZW5kaWYKCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgoKI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXRtYWMuaD4KI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CgojZGVmaW5lIE1URF9DSEFSX01BSk9SIDkwCiNkZWZpbmUgTVREX0JMT0NLX01BSk9SIDMxCiNkZWZpbmUgTUFYX01URF9ERVZJQ0VTIDE2CgojZGVmaW5lIE1URF9FUkFTRV9QRU5ESU5HICAgICAgCTB4MDEKI2RlZmluZSBNVERfRVJBU0lORwkJMHgwMgojZGVmaW5lIE1URF9FUkFTRV9TVVNQRU5ECTB4MDQKI2RlZmluZSBNVERfRVJBU0VfRE9ORSAgICAgICAgICAweDA4CiNkZWZpbmUgTVREX0VSQVNFX0ZBSUxFRCAgICAgICAgMHgxMAoKLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgogICBmYWlsX2FkZHIgPSAweGZmZmZmZmZmLCB0aGUgZmFpbHVyZSB3YXMgbm90IGF0IHRoZSBkZXZpY2UgbGV2ZWwgb3Igd2FzIG5vdAogICBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBibG9jay4gKi8Kc3RydWN0IGVyYXNlX2luZm8gewoJc3RydWN0IG10ZF9pbmZvICptdGQ7Cgl1X2ludDMyX3QgYWRkcjsKCXVfaW50MzJfdCBsZW47Cgl1X2ludDMyX3QgZmFpbF9hZGRyOwoJdV9sb25nIHRpbWU7Cgl1X2xvbmcgcmV0cmllczsKCXVfaW50IGRldjsKCXVfaW50IGNlbGw7Cgl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZXJhc2VfaW5mbyAqc2VsZik7Cgl1X2xvbmcgcHJpdjsKCXVfY2hhciBzdGF0ZTsKCXN0cnVjdCBlcmFzZV9pbmZvICpuZXh0Owp9OwoKc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyB7Cgl1X2ludDMyX3Qgb2Zmc2V0OwkJCS8qIEF0IHdoaWNoIHRoaXMgcmVnaW9uIHN0YXJ0cywgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNVEQgKi8KCXVfaW50MzJfdCBlcmFzZXNpemU7CQkvKiBGb3IgdGhpcyByZWdpb24gKi8KCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLwp9OwoKc3RydWN0IG10ZF9pbmZvIHsKCXVfY2hhciB0eXBlOwoJdV9pbnQzMl90IGZsYWdzOwoJdV9pbnQzMl90IHNpemU7CSAvLyBUb3RhbCBzaXplIG9mIHRoZSBNVEQKCgkvKiAiTWFqb3IiIGVyYXNlIHNpemUgZm9yIHRoZSBkZXZpY2UuIE5h73ZlIHVzZXJzIG1heSB0YWtlIHRoaXMKCSAqIHRvIGJlIHRoZSBvbmx5IGVyYXNlIHNpemUgYXZhaWxhYmxlLCBvciBtYXkgdXNlIHRoZSBtb3JlIGRldGFpbGVkCgkgKiBpbmZvcm1hdGlvbiBiZWxvdyBpZiB0aGV5IGRlc2lyZQoJICovCgl1X2ludDMyX3QgZXJhc2VzaXplOwoKCXVfaW50MzJfdCBvb2JibG9jazsgIC8vIFNpemUgb2YgT09CIGJsb2NrcyAoZS5nLiA1MTIpCgl1X2ludDMyX3Qgb29ic2l6ZTsgICAvLyBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KQoJdV9pbnQzMl90IG9vYmF2YWlsOyAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIE9PQiBhcmVhIGF2YWlsYWJsZSBmb3IgZnMgCgl1X2ludDMyX3QgZWNjdHlwZTsKCXVfaW50MzJfdCBlY2NzaXplOwoJCgoJLy8gS2VybmVsLW9ubHkgc3R1ZmYgc3RhcnRzIGhlcmUuCgljaGFyICpuYW1lOwoJaW50IGluZGV4OwoKCS8vIG9vYmluZm8gaXMgYSBuYW5kX29vYmluZm8gc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGlvdGNsIChNRU1TRVRPT0JJTkZPKQoJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOwoKCS8qIERhdGEgZm9yIHZhcmlhYmxlIGVyYXNlIHJlZ2lvbnMuIElmIG51bWVyYXNlcmVnaW9ucyBpcyB6ZXJvLAoJICogaXQgbWVhbnMgdGhhdCB0aGUgd2hvbGUgZGV2aWNlIGhhcyBlcmFzZXNpemUgYXMgZ2l2ZW4gYWJvdmUuIAoJICovCglpbnQgbnVtZXJhc2VyZWdpb25zOwoJc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyAqZXJhc2VyZWdpb25zOyAKCgkvKiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYmUgaGVyZS4gSXQgY2FuIGdvIGF3YXkgaW4gMi41ICovCgl1X2ludDMyX3QgYmFua19zaXplOwoKCWludCAoKmVyYXNlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cik7CgoJLyogVGhpcyBzdHVmZiBmb3IgZVhlY3V0ZS1Jbi1QbGFjZSAqLwoJaW50ICgqcG9pbnQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKiptdGRidWYpOwoKCS8qIFdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBYSVAgaWYgdGhlIHVucG9pbnQgaXNuJ3QgYSBOVUxMICovCgl2b2lkICgqdW5wb2ludCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKiBhZGRyLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbik7CgoKCWludCAoKnJlYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CglpbnQgKCp3cml0ZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1Zik7CgoJaW50ICgqcmVhZF9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CglpbnQgKCp3cml0ZV9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwoKCWludCAoKnJlYWRfb29iKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoJaW50ICgqd3JpdGVfb29iKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKCgkvKiAKCSAqIE1ldGhvZHMgdG8gYWNjZXNzIHRoZSBwcm90ZWN0aW9uIHJlZ2lzdGVyIGFyZWEsIHByZXNlbnQgaW4gc29tZSAKCSAqIGZsYXNoIGRldmljZXMuIFRoZSB1c2VyIGRhdGEgaXMgb25lIHRpbWUgcHJvZ3JhbW1hYmxlIGJ1dCB0aGUKCSAqIGZhY3RvcnkgZGF0YSBpcyByZWFkIG9ubHkuIAoJICovCglpbnQgKCpyZWFkX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CgoJaW50ICgqcmVhZF9mYWN0X3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoKCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCAqLwoJaW50ICgqd3JpdGVfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCgkvKiBrdmVjLWJhc2VkIHJlYWQvd3JpdGUgbWV0aG9kcy4gV2UgbmVlZCB0aGVzZSBlc3BlY2lhbGx5IGZvciBOQU5EIGZsYXNoLAoJICAgd2l0aCBpdHMgbGltaXRlZCBudW1iZXIgb2Ygd3JpdGUgY3ljbGVzIHBlciBlcmFzZS4KCSAgIE5COiBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBfdmVjdG9yc18sIGVhY2ggb2YgCgkgICB3aGljaCBjb250YWlucyBhbiAob2ZzLCBsZW4pIHR1cGxlLgoJKi8KCWludCAoKnJlYWR2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwgc2l6ZV90ICpyZXRsZW4pOwoJaW50ICgqcmVhZHZfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwgCgkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwoJaW50ICgqd3JpdGV2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKTsKCWludCAoKndyaXRldl9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgCgkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwoKCS8qIFN5bmMgKi8KCXZvaWQgKCpzeW5jKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKCS8qIENoaXAtc3VwcG9ydGVkIGRldmljZSBsb2NraW5nICovCglpbnQgKCpsb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwoJaW50ICgqdW5sb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwoKCS8qIFBvd2VyIE1hbmFnZW1lbnQgZnVuY3Rpb25zICovCglpbnQgKCpzdXNwZW5kKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJdm9pZCAoKnJlc3VtZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCgkvKiBCYWQgYmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KCWludCAoKmJsb2NrX2lzYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwoJaW50ICgqYmxvY2tfbWFya2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKCgl2b2lkICpwcml2OwoKCXN0cnVjdCBtb2R1bGUgKm93bmVyOwoJaW50IHVzZWNvdW50Owp9OwoKCgkvKiBLZXJuZWwtc2lkZSBpb2N0bCBkZWZpbml0aW9ucyAqLwoKZXh0ZXJuIGludCBhZGRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CmV4dGVybiBpbnQgZGVsX210ZF9kZXZpY2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCmV4dGVybiBzdHJ1Y3QgbXRkX2luZm8gKmdldF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbnVtKTsKCmV4dGVybiB2b2lkIHB1dF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCgpzdHJ1Y3QgbXRkX25vdGlmaWVyIHsKCXZvaWQgKCphZGQpKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKfTsKCgpleHRlcm4gdm9pZCByZWdpc3Rlcl9tdGRfdXNlciAoc3RydWN0IG10ZF9ub3RpZmllciAqbmV3KTsKZXh0ZXJuIGludCB1bnJlZ2lzdGVyX210ZF91c2VyIChzdHJ1Y3QgbXRkX25vdGlmaWVyICpvbGQpOwoKaW50IGRlZmF1bHRfbXRkX3dyaXRldihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCgkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOwoKaW50IGRlZmF1bHRfbXRkX3JlYWR2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3Qga3ZlYyAqdmVjcywKCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwgc2l6ZV90ICpyZXRsZW4pOwoKI2RlZmluZSBNVERfRVJBU0UobXRkLCBhcmdzLi4uKSAoKihtdGQtPmVyYXNlKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9QT0lOVChtdGQsIGEsYixjLGQpICgqKG10ZC0+cG9pbnQpKShtdGQsIGEsYixjLCAodV9jaGFyICoqKShkKSkKI2RlZmluZSBNVERfVU5QT0lOVChtdGQsIGFyZykgKCoobXRkLT51bnBvaW50KSkobXRkLCAodV9jaGFyICopYXJnKQojZGVmaW5lIE1URF9SRUFEKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURShtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGUpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURWKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkdikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfV1JJVEVWKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZXYpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURFQ0MobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWRfZWNjKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURUVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfZWNjKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9SRUFET09CKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkX29vYikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfV1JJVEVPT0IobXRkLCBhcmdzLi4uKSAoKihtdGQtPndyaXRlX29vYikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfU1lOQyhtdGQpIGRvIHsgaWYgKG10ZC0+c3luYykgKCoobXRkLT5zeW5jKSkobXRkKTsgIH0gd2hpbGUgKDApIAoKCiNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKdm9pZCBtdGRfZXJhc2VfY2FsbGJhY2soc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKTsKI2Vsc2UKc3RhdGljIGlubGluZSB2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCnsKCWlmIChpbnN0ci0+Y2FsbGJhY2spCgkJaW5zdHItPmNhbGxiYWNrKGluc3RyKTsKfQojZW5kaWYKCi8qCiAqIERlYnVnZ2luZyBtYWNybyBhbmQgZGVmaW5lcwogKi8KI2RlZmluZSBNVERfREVCVUdfTEVWRUwwCSgwKQkvKiBRdWlldCAgICovCiNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMQkoMSkJLyogQXVkaWJsZSAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDIJKDIpCS8qIExvdWQgICAgKi8KI2RlZmluZSBNVERfREVCVUdfTEVWRUwzCSgzKQkvKiBOb2lzeSAgICovCgojaWZkZWYgQ09ORklHX01URF9ERUJVRwojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCQkJCVwKIAlkbyB7CQkJCQkJXAoJCWlmIChuIDw9IENPTkZJR19NVERfREVCVUdfVkVSQk9TRSkJXAoJCQlwcmludGsoS0VSTl9JTkZPIGFyZ3MpOwkJXAoJfSB3aGlsZSgwKQojZWxzZSAvKiBDT05GSUdfTVREX0RFQlVHICovCiNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgZG8geyB9IHdoaWxlKDApCgojZW5kaWYgLyogQ09ORklHX01URF9ERUJVRyAqLwoKI2VuZGlmIC8qIF9fTVREX01URF9IX18gKi8K