CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KCiNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgojaW5jbHVkZSA8bGludXgvbGVkcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiNpbmNsdWRlIDxsaW51eC9kbWkuaD4KCiNpbmNsdWRlIDxsaW51eC9pODA0Mi5oPgoKI2RlZmluZSBDTEVWT19NQUlMX0xFRF9PRkYJCTB4MDA4NAojZGVmaW5lIENMRVZPX01BSUxfTEVEX0JMSU5LXzFIWgkweDAwOEEKI2RlZmluZSBDTEVWT19NQUlMX0xFRF9CTElOS18wXzVIWgkweDAwODMKCk1PRFVMRV9BVVRIT1IoIk3hcnRvbiBO6W1ldGggPG5tMTI3QGZyZWVtYWlsLmh1PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkNsZXZvIG1haWwgTEVEIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbm9kZXRlY3Q7Cm1vZHVsZV9wYXJhbV9uYW1lZChub2RldGVjdCwgbm9kZXRlY3QsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vZGV0ZWN0LCAiU2tpcCBETUkgaGFyZHdhcmUgZGV0ZWN0aW9uIik7CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKCnN0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX2RtaV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCnsKCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogJyVzJyBmb3VuZFxuIiwgaWQtPmlkZW50KTsKCXJldHVybiAxOwp9CgovKgogKiBzdHJ1Y3QgbWFpbF9sZWRfd2hpdGVsaXN0IC0gTGlzdCBvZiBrbm93biBnb29kIG1vZGVscwogKgogKiBDb250YWlucyB0aGUga25vd24gZ29vZCBtb2RlbHMgdGhpcyBkcml2ZXIgaXMgY29tcGF0aWJsZSB3aXRoLgogKiBXaGVuIGFkZGluZyBhIG5ldyBtb2RlbCB0cnkgdG8gYmUgYXMgc3RyaWN0IGFzIHBvc3NpYmxlLiBUaGlzCiAqIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGtlZXAgdGhlIGZhbHNlIHBvc2l0aXZlcyAodGhlIG1vZGVsIGlzCiAqIGRldGVjdGVkIGFzIHdvcmtpbmcsIGJ1dCBpbiByZWFsaXR5IGl0IGlzIG5vdCkgYXMgbG93IGFzCiAqIHBvc3NpYmxlLgogKi8Kc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgbWFpbF9sZWRfd2hpdGVsaXN0W10gPSB7Cgl7CgkJLmNhbGxiYWNrID0gY2xldm9fbWFpbF9sZWRfZG1pX2NhbGxiYWNrLAoJCS5pZGVudCA9ICJDbGV2byBENDEwSiIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlZJQSIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIks4TjgwMCIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlZUODIwNEIiKQoJCX0KCX0sCgl7CgkJLmNhbGxiYWNrID0gY2xldm9fbWFpbF9sZWRfZG1pX2NhbGxiYWNrLAoJCS5pZGVudCA9ICJDbGV2byBNNXgwTiIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNMRVZPIENvLiIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk01eDBOIikKCQl9Cgl9LAoJewoJCS5jYWxsYmFjayA9IGNsZXZvX21haWxfbGVkX2RtaV9jYWxsYmFjaywKCQkuaWRlbnQgPSAiUG9zaXRpdm8gTW9iaWxlIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJDTEVWTyBDby4gIiksCgkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk01WDBWICIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvc2l0aXZvIE1vYmlsZSIpLAoJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIlZUNjE5OCIpCgkJfQoJfSwKCXsKCQkuY2FsbGJhY2sgPSBjbGV2b19tYWlsX2xlZF9kbWlfY2FsbGJhY2ssCgkJLmlkZW50ID0gIkNsZXZvIEQ0MTBWIiwKCQkubWF0Y2hlcyA9IHsKCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJDbGV2bywgQ28uIiksCgkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkQ0MDBWL0Q0NzBWIiksCgkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVSU0lPTiwgIlNTNzhCIiksCgkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiUmV2LiBBMSIpCgkJfQoJfSwKCXsgfQp9OwoKc3RhdGljIHZvaWQgY2xldm9fbWFpbF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAoJCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKewoJaWYgKHZhbHVlID09IExFRF9PRkYpCgkJaTgwNDJfY29tbWFuZChOVUxMLCBDTEVWT19NQUlMX0xFRF9PRkYpOwoJZWxzZSBpZiAodmFsdWUgPD0gTEVEX0hBTEYpCgkJaTgwNDJfY29tbWFuZChOVUxMLCBDTEVWT19NQUlMX0xFRF9CTElOS18wXzVIWik7CgllbHNlCgkJaTgwNDJfY29tbWFuZChOVUxMLCBDTEVWT19NQUlMX0xFRF9CTElOS18xSFopOwoKfQoKc3RhdGljIGludCBjbGV2b19tYWlsX2xlZF9ibGluayhzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKCQkJCXVuc2lnbmVkIGxvbmcqIGRlbGF5X29uLAoJCQkJdW5zaWduZWQgbG9uZyogZGVsYXlfb2ZmKQp7CglpbnQgc3RhdHVzID0gLUVJTlZBTDsKCglpZiAoKmRlbGF5X29uID09IDAgLyogbXMgKi8gJiYgKmRlbGF5X29mZiA9PSAwIC8qIG1zICovKSB7CgkJLyogU3BlY2lhbCBjYXNlOiB0aGUgbGVkcyBzdWJzeXN0ZW0gcmVxdWVzdGVkIHVzIHRvCgkJICogY2hvc2Ugb25lIHVzZXIgZnJpZW5kbHkgYmxpbmtpbmcgb2YgdGhlIExFRCwgYW5kCgkJICogc3RhcnQgaXQuIExldCdzIGJsaW5rIHRoZSBsZWQgc2xvd2x5ICgwLjVIeikuCgkJICovCgkJKmRlbGF5X29uID0gMTAwMDsgLyogbXMgKi8KCQkqZGVsYXlfb2ZmID0gMTAwMDsgLyogbXMgKi8KCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzBfNUhaKTsKCQlzdGF0dXMgPSAwOwoKCX0gZWxzZSBpZiAoKmRlbGF5X29uID09IDUwMCAvKiBtcyAqLyAmJiAqZGVsYXlfb2ZmID09IDUwMCAvKiBtcyAqLykgewoJCS8qIGJsaW5rIHRoZSBsZWQgd2l0aCAxSHogKi8KCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzFIWik7CgkJc3RhdHVzID0gMDsKCgl9IGVsc2UgaWYgKCpkZWxheV9vbiA9PSAxMDAwIC8qIG1zICovICYmICpkZWxheV9vZmYgPT0gMTAwMCAvKiBtcyAqLykgewoJCS8qIGJsaW5rIHRoZSBsZWQgd2l0aCAwLjVIeiAqLwoJCWk4MDQyX2NvbW1hbmQoTlVMTCwgQ0xFVk9fTUFJTF9MRURfQkxJTktfMF81SFopOwoJCXN0YXR1cyA9IDA7CgoJfSBlbHNlIHsKCQlwcmludGsoS0VSTl9ERUJVRyBLQlVJTERfTU9ETkFNRQoJCSAgICAgICAiOiBjbGV2b19tYWlsX2xlZF9ibGluayguLi4sICVsdSwgJWx1KSwiCgkJICAgICAgICIgcmV0dXJuaW5nIC1FSU5WQUwgKHVuc3VwcG9ydGVkKVxuIiwKCQkgICAgICAgKmRlbGF5X29uLCAqZGVsYXlfb2ZmKTsKCX0KCglyZXR1cm4gc3RhdHVzOwp9CgpzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBjbGV2b19tYWlsX2xlZCA9IHsKCS5uYW1lCQkJPSAiY2xldm86Om1haWwiLAoJLmJyaWdodG5lc3Nfc2V0CQk9IGNsZXZvX21haWxfbGVkX3NldCwKCS5ibGlua19zZXQJCT0gY2xldm9fbWFpbF9sZWRfYmxpbmssCn07CgpzdGF0aWMgaW50IF9faW5pdCBjbGV2b19tYWlsX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQp7CglyZXR1cm4gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGV2b19tYWlsX2xlZCk7Cn0KCnN0YXRpYyBpbnQgY2xldm9fbWFpbF9sZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZjbGV2b19tYWlsX2xlZCk7CglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QTQpzdGF0aWMgaW50IGNsZXZvX21haWxfbGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAoJCQkJICBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZjbGV2b19tYWlsX2xlZCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjbGV2b19tYWlsX2xlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQp7CglsZWRfY2xhc3NkZXZfcmVzdW1lKCZjbGV2b19tYWlsX2xlZCk7CglyZXR1cm4gMDsKfQojZWxzZQojZGVmaW5lIGNsZXZvX21haWxfbGVkX3N1c3BlbmQgICAgTlVMTAojZGVmaW5lIGNsZXZvX21haWxfbGVkX3Jlc3VtZSAgICAgTlVMTAojZW5kaWYKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNsZXZvX21haWxfbGVkX2RyaXZlciA9IHsKCS5wcm9iZQkJPSBjbGV2b19tYWlsX2xlZF9wcm9iZSwKCS5yZW1vdmUJCT0gY2xldm9fbWFpbF9sZWRfcmVtb3ZlLAoJLnN1c3BlbmQJPSBjbGV2b19tYWlsX2xlZF9zdXNwZW5kLAoJLnJlc3VtZQkJPSBjbGV2b19tYWlsX2xlZF9yZXN1bWUsCgkuZHJpdmVyCQk9IHsKCQkubmFtZQkJPSBLQlVJTERfTU9ETkFNRSwKCX0sCn07CgpzdGF0aWMgaW50IF9faW5pdCBjbGV2b19tYWlsX2xlZF9pbml0KHZvaWQpCnsKCWludCBlcnJvciA9IDA7CglpbnQgY291bnQgPSAwOwoKCS8qIENoZWNrIHdpdGggdGhlIGhlbHAgb2YgRE1JIGlmIHdlIGFyZSBydW5uaW5nIG9uIHN1cHBvcnRlZCBoYXJkd2FyZSAqLwoJaWYgKCFub2RldGVjdCkgewoJCWNvdW50ID0gZG1pX2NoZWNrX3N5c3RlbShtYWlsX2xlZF93aGl0ZWxpc3QpOwoJfSBlbHNlIHsKCQljb3VudCA9IDE7CgkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FICI6IFNraXBwaW5nIERNSSBkZXRlY3Rpb24uICIKCQkgICAgICAgIklmIHRoZSBkcml2ZXIgd29ya3Mgb24geW91ciBoYXJkd2FyZSBwbGVhc2UgIgoJCSAgICAgICAicmVwb3J0IG1vZGVsIGFuZCB0aGUgb3V0cHV0IG9mIGRtaWRlY29kZSBpbiB0cmFja2VyICIKCQkgICAgICAgImF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY2xldm8tbWFpbGxlZC9cbiIpOwoJfQoKCWlmICghY291bnQpCgkJcmV0dXJuIC1FTk9ERVY7CgoJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoS0JVSUxEX01PRE5BTUUsIC0xLCBOVUxMLCAwKTsKCWlmICghSVNfRVJSKHBkZXYpKSB7CgkJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmNsZXZvX21haWxfbGVkX2RyaXZlciwKCQkJCQkgICAgICBjbGV2b19tYWlsX2xlZF9wcm9iZSk7CgkJaWYgKGVycm9yKSB7CgkJCXByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRQoJCQkgICAgICAgIjogQ2FuJ3QgcHJvYmUgcGxhdGZvcm0gZHJpdmVyXG4iKTsKCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CgkJfQoJfSBlbHNlCgkJZXJyb3IgPSBQVFJfRVJSKHBkZXYpOwoKCXJldHVybiBlcnJvcjsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNsZXZvX21haWxfbGVkX2V4aXQodm9pZCkKewoJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2xldm9fbWFpbF9sZWRfZHJpdmVyKTsKCgljbGV2b19tYWlsX2xlZF9zZXQoTlVMTCwgTEVEX09GRik7Cn0KCm1vZHVsZV9pbml0KGNsZXZvX21haWxfbGVkX2luaXQpOwptb2R1bGVfZXhpdChjbGV2b19tYWlsX2xlZF9leGl0KTsK