LyoKICogJElkOiBtdGQuaCx2IDEuNTYgMjAwNC8wOC8wOSAxODo0NjowNCBkbWFybGluIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4gZXQgYWwuCiAqCiAqIFJlbGVhc2VkIHVuZGVyIEdQTAogKi8KCiNpZm5kZWYgX19NVERfTVREX0hfXwojZGVmaW5lIF9fTVREX01URF9IX18KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLWFiaS5oPgoKI2RlZmluZSBNQVhfTVREX0RFVklDRVMgMTYKCiNkZWZpbmUgTVREX0VSQVNFX1BFTkRJTkcgICAgICAJMHgwMQojZGVmaW5lIE1URF9FUkFTSU5HCQkweDAyCiNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAojZGVmaW5lIE1URF9FUkFTRV9ET05FICAgICAgICAgIDB4MDgKI2RlZmluZSBNVERfRVJBU0VfRkFJTEVEICAgICAgICAweDEwCgovKiBJZiB0aGUgZXJhc2UgZmFpbHMsIGZhaWxfYWRkciBtaWdodCBpbmRpY2F0ZSBleGFjdGx5IHdoaWNoIGJsb2NrIGZhaWxlZC4gIElmCiAgIGZhaWxfYWRkciA9IDB4ZmZmZmZmZmYsIHRoZSBmYWlsdXJlIHdhcyBub3QgYXQgdGhlIGRldmljZSBsZXZlbCBvciB3YXMgbm90CiAgIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAqLwpzdHJ1Y3QgZXJhc2VfaW5mbyB7CglzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKCXVfaW50MzJfdCBhZGRyOwoJdV9pbnQzMl90IGxlbjsKCXVfaW50MzJfdCBmYWlsX2FkZHI7Cgl1X2xvbmcgdGltZTsKCXVfbG9uZyByZXRyaWVzOwoJdV9pbnQgZGV2OwoJdV9pbnQgY2VsbDsKCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBlcmFzZV9pbmZvICpzZWxmKTsKCXVfbG9uZyBwcml2OwoJdV9jaGFyIHN0YXRlOwoJc3RydWN0IGVyYXNlX2luZm8gKm5leHQ7Cn07CgpzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvIHsKCXVfaW50MzJfdCBvZmZzZXQ7CQkJLyogQXQgd2hpY2ggdGhpcyByZWdpb24gc3RhcnRzLCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLwoJdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwoJdV9pbnQzMl90IG51bWJsb2NrczsJCS8qIE51bWJlciBvZiBibG9ja3Mgb2YgZXJhc2VzaXplIGluIHRoaXMgcmVnaW9uICovCn07CgpzdHJ1Y3QgbXRkX2luZm8gewoJdV9jaGFyIHR5cGU7Cgl1X2ludDMyX3QgZmxhZ3M7Cgl1X2ludDMyX3Qgc2l6ZTsJIC8qIFRvdGFsIHNpemUgb2YgdGhlIE1URCAqLwoKCS8qICJNYWpvciIgZXJhc2Ugc2l6ZSBmb3IgdGhlIGRldmljZS4gTmHvdmUgdXNlcnMgbWF5IHRha2UgdGhpcwoJICogdG8gYmUgdGhlIG9ubHkgZXJhc2Ugc2l6ZSBhdmFpbGFibGUsIG9yIG1heSB1c2UgdGhlIG1vcmUgZGV0YWlsZWQKCSAqIGluZm9ybWF0aW9uIGJlbG93IGlmIHRoZXkgZGVzaXJlCgkgKi8KCXVfaW50MzJfdCBlcmFzZXNpemU7CgoJdV9pbnQzMl90IG9vYmJsb2NrOyAgLyogU2l6ZSBvZiBPT0IgYmxvY2tzIChlLmcuIDUxMikgKi8KCXVfaW50MzJfdCBvb2JzaXplOyAgIC8qIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpICovCgl1X2ludDMyX3Qgb29iYXZhaWw7ICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gT09CIGFyZWEgYXZhaWxhYmxlIGZvciBmcyAgKi8KCXVfaW50MzJfdCBlY2N0eXBlOwoJdV9pbnQzMl90IGVjY3NpemU7CgoKCS8qIEtlcm5lbC1vbmx5IHN0dWZmIHN0YXJ0cyBoZXJlLiAqLwoJY2hhciAqbmFtZTsKCWludCBpbmRleDsKCgkvKiBvb2JpbmZvIGlzIGEgbmFuZF9vb2JpbmZvIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHNldCBieSBpb3RjbCAoTUVNU0VUT09CSU5GTykgKi8KCXN0cnVjdCBuYW5kX29vYmluZm8gb29iaW5mbzsKCgkvKiBEYXRhIGZvciB2YXJpYWJsZSBlcmFzZSByZWdpb25zLiBJZiBudW1lcmFzZXJlZ2lvbnMgaXMgemVybywKCSAqIGl0IG1lYW5zIHRoYXQgdGhlIHdob2xlIGRldmljZSBoYXMgZXJhc2VzaXplIGFzIGdpdmVuIGFib3ZlLgoJICovCglpbnQgbnVtZXJhc2VyZWdpb25zOwoJc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyAqZXJhc2VyZWdpb25zOwoKCS8qIFRoaXMgcmVhbGx5IHNob3VsZG4ndCBiZSBoZXJlLiBJdCBjYW4gZ28gYXdheSBpbiAyLjUgKi8KCXVfaW50MzJfdCBiYW5rX3NpemU7CgoJaW50ICgqZXJhc2UpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKTsKCgkvKiBUaGlzIHN0dWZmIGZvciBlWGVjdXRlLUluLVBsYWNlICovCglpbnQgKCpwb2ludCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqKm10ZGJ1Zik7CgoJLyogV2UgcHJvYmFibHkgc2hvdWxkbid0IGFsbG93IFhJUCBpZiB0aGUgdW5wb2ludCBpc24ndCBhIE5VTEwgKi8KCXZvaWQgKCp1bnBvaW50KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqIGFkZHIsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuKTsKCgoJaW50ICgqcmVhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCWludCAoKndyaXRlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKCglpbnQgKCpyZWFkX2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKCWludCAoKndyaXRlX2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CgoJaW50ICgqcmVhZF9vb2IpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CglpbnQgKCp3cml0ZV9vb2IpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOwoKCS8qCgkgKiBNZXRob2RzIHRvIGFjY2VzcyB0aGUgcHJvdGVjdGlvbiByZWdpc3RlciBhcmVhLCBwcmVzZW50IGluIHNvbWUKCSAqIGZsYXNoIGRldmljZXMuIFRoZSB1c2VyIGRhdGEgaXMgb25lIHRpbWUgcHJvZ3JhbW1hYmxlIGJ1dCB0aGUKCSAqIGZhY3RvcnkgZGF0YSBpcyByZWFkIG9ubHkuCgkgKi8KCWludCAoKnJlYWRfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCglpbnQgKCpyZWFkX2ZhY3RfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CgoJLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCglpbnQgKCp3cml0ZV91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwojaWYgMAoJLyoga3ZlYy1iYXNlZCByZWFkL3dyaXRlIG1ldGhvZHMuIFdlIG5lZWQgdGhlc2UgZXNwZWNpYWxseSBmb3IgTkFORCBmbGFzaCwKCSAgIHdpdGggaXRzIGxpbWl0ZWQgbnVtYmVyIG9mIHdyaXRlIGN5Y2xlcyBwZXIgZXJhc2UuCgkgICBOQjogVGhlICdjb3VudCcgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgX3ZlY3RvcnNfLCBlYWNoIG9mCgkgICB3aGljaCBjb250YWlucyBhbiAob2ZzLCBsZW4pIHR1cGxlLgoJKi8KCWludCAoKnJlYWR2KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwgc2l6ZV90ICpyZXRsZW4pOwoJaW50ICgqcmVhZHZfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgZnJvbSwKCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICplY2NidWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCk7CglpbnQgKCp3cml0ZXYpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOwoJaW50ICgqd3JpdGV2X2VjYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLAoJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKI2VuZGlmCgkvKiBTeW5jICovCgl2b2lkICgqc3luYykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKI2lmIDAKCS8qIENoaXAtc3VwcG9ydGVkIGRldmljZSBsb2NraW5nICovCglpbnQgKCpsb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwoJaW50ICgqdW5sb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwoKCS8qIFBvd2VyIE1hbmFnZW1lbnQgZnVuY3Rpb25zICovCglpbnQgKCpzdXNwZW5kKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJdm9pZCAoKnJlc3VtZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKI2VuZGlmCgkvKiBCYWQgYmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KCWludCAoKmJsb2NrX2lzYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwoJaW50ICgqYmxvY2tfbWFya2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKCgl2b2lkICpwcml2OwoKCXN0cnVjdCBtb2R1bGUgKm93bmVyOwoJaW50IHVzZWNvdW50Owp9OwoKCgkvKiBLZXJuZWwtc2lkZSBpb2N0bCBkZWZpbml0aW9ucyAqLwoKZXh0ZXJuIGludCBhZGRfbXRkX2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CmV4dGVybiBpbnQgZGVsX210ZF9kZXZpY2UgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCmV4dGVybiBzdHJ1Y3QgbXRkX2luZm8gKmdldF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbnVtKTsKCmV4dGVybiB2b2lkIHB1dF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKCiNpZiAwCnN0cnVjdCBtdGRfbm90aWZpZXIgewoJdm9pZCAoKmFkZCkoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJdm9pZCAoKnJlbW92ZSkoc3RydWN0IG10ZF9pbmZvICptdGQpOwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owp9OwoKCmV4dGVybiB2b2lkIHJlZ2lzdGVyX210ZF91c2VyIChzdHJ1Y3QgbXRkX25vdGlmaWVyICpuZXcpOwpleHRlcm4gaW50IHVucmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm9sZCk7CgppbnQgZGVmYXVsdF9tdGRfd3JpdGV2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CgppbnQgZGVmYXVsdF9tdGRfcmVhZHYoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBrdmVjICp2ZWNzLAoJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CiNlbmRpZgoKI2RlZmluZSBNVERfRVJBU0UobXRkLCBhcmdzLi4uKSAoKihtdGQtPmVyYXNlKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9QT0lOVChtdGQsIGEsYixjLGQpICgqKG10ZC0+cG9pbnQpKShtdGQsIGEsYixjLCAodV9jaGFyICoqKShkKSkKI2RlZmluZSBNVERfVU5QT0lOVChtdGQsIGFyZykgKCoobXRkLT51bnBvaW50KSkobXRkLCAodV9jaGFyICopYXJnKQojZGVmaW5lIE1URF9SRUFEKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURShtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGUpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURWKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkdikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfV1JJVEVWKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZXYpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURFQ0MobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWRfZWNjKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURUVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfZWNjKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9SRUFET09CKG10ZCwgYXJncy4uLikgKCoobXRkLT5yZWFkX29vYikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfV1JJVEVPT0IobXRkLCBhcmdzLi4uKSAoKihtdGQtPndyaXRlX29vYikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfU1lOQyhtdGQpIGRvIHsgaWYgKG10ZC0+c3luYykgKCoobXRkLT5zeW5jKSkobXRkKTsgIH0gd2hpbGUgKDApCgoKI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwp2b2lkIG10ZF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOwojZWxzZQpzdGF0aWMgaW5saW5lIHZvaWQgbXRkX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKewoJaWYgKGluc3RyLT5jYWxsYmFjaykKCQlpbnN0ci0+Y2FsbGJhY2soaW5zdHIpOwp9CiNlbmRpZgoKLyoKICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCiAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDAJKDApCS8qIFF1aWV0ICAgKi8KI2RlZmluZSBNVERfREVCVUdfTEVWRUwxCSgxKQkvKiBBdWRpYmxlICovCiNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMgkoMikJLyogTG91ZCAgICAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDMJKDMpCS8qIE5vaXN5ICAgKi8KCiNpZmRlZiBDT05GSUdfTVREX0RFQlVHCiNkZWZpbmUgREVCVUcobiwgYXJncy4uLikJCQkJXAogCWRvIHsJCQkJCQlcCgkJaWYgKG4gPD0gQ09ORklHX01URF9ERUJVR19WRVJCT1NFKQlcCgkJCXByaW50ayhLRVJOX0lORk8gYXJncyk7CQlcCgl9IHdoaWxlKDApCiNlbHNlIC8qIENPTkZJR19NVERfREVCVUcgKi8KI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKCiNlbmRpZiAvKiBDT05GSUdfTVREX0RFQlVHICovCgojZW5kaWYgLyogX19NVERfTVREX0hfXyAqLwo=