LyoKICogJElkOiAvL2RlcG90L3N3L3FjYV9tYWluL2NvbXBvbmVudHMvYm9vdGxvYWRlcnMvdS1ib290LTEuMS40LzEuMS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCMzICQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiBldCBhbC4KICogQ29weXJpZ2h0IChjKSAyMDEzIFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICogUmVsZWFzZWQgdW5kZXIgR1BMCiAqLwoKI2lmbmRlZiBfX01URF9NVERfSF9fCiNkZWZpbmUgX19NVERfTVREX0hfXwojaW5jbHVkZSA8bGludXgvbXRkL210ZC1hYmkuaD4KCnR5cGVkZWYgc3RydWN0IG10ZF9pbmZvX3VzZXIgbXRkX2luZm9fdDsKdHlwZWRlZiBzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGVyYXNlX2luZm9fdDsKdHlwZWRlZiBzdHJ1Y3QgcmVnaW9uX2luZm9fdXNlciByZWdpb25faW5mb190OwoKI2RlZmluZSBNQVhfTVREX0RFVklDRVMgMTYKCiNkZWZpbmUgTVREX0VSQVNFX1BFTkRJTkcgICAgICAJMHgwMQojZGVmaW5lIE1URF9FUkFTSU5HCQkweDAyCiNkZWZpbmUgTVREX0VSQVNFX1NVU1BFTkQJMHgwNAojZGVmaW5lIE1URF9FUkFTRV9ET05FICAgICAgICAgIDB4MDgKI2RlZmluZSBNVERfRVJBU0VfRkFJTEVEICAgICAgICAweDEwCgovKiBJZiB0aGUgZXJhc2UgZmFpbHMsIGZhaWxfYWRkciBtaWdodCBpbmRpY2F0ZSBleGFjdGx5IHdoaWNoIGJsb2NrIGZhaWxlZC4gIElmCiAgIGZhaWxfYWRkciA9IDB4ZmZmZmZmZmYsIHRoZSBmYWlsdXJlIHdhcyBub3QgYXQgdGhlIGRldmljZSBsZXZlbCBvciB3YXMgbm90CiAgIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGJsb2NrLiAqLwpzdHJ1Y3QgZXJhc2VfaW5mbyB7CglzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKCXVfaW50MzJfdCBhZGRyOwoJdV9pbnQzMl90IGxlbjsKCXVfaW50MzJfdCBmYWlsX2FkZHI7Cgl1X2xvbmcgdGltZTsKCXVfbG9uZyByZXRyaWVzOwoJdV9pbnQgZGV2OwoJdV9pbnQgY2VsbDsKCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBlcmFzZV9pbmZvICpzZWxmKTsKCXVfbG9uZyBwcml2OwoJdV9jaGFyIHN0YXRlOwoJc3RydWN0IGVyYXNlX2luZm8gKm5leHQ7Cn07CgpzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvIHsKCXVfaW50MzJfdCBvZmZzZXQ7CQkJLyogQXQgd2hpY2ggdGhpcyByZWdpb24gc3RhcnRzLCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1URCAqLwoJdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwoJdV9pbnQzMl90IG51bWJsb2NrczsJCS8qIE51bWJlciBvZiBibG9ja3Mgb2YgZXJhc2VzaXplIGluIHRoaXMgcmVnaW9uICovCn07CgpzdHJ1Y3QgbXRkX2luZm8gewoJdV9jaGFyIHR5cGU7Cgl1X2ludDMyX3QgZmxhZ3M7Cgl1X2ludDMyX3Qgc2l6ZTsJIC8qIFRvdGFsIHNpemUgb2YgdGhlIE1URCAqLwoKCS8qICJNYWpvciIgZXJhc2Ugc2l6ZSBmb3IgdGhlIGRldmljZS4gTmHvdmUgdXNlcnMgbWF5IHRha2UgdGhpcwoJICogdG8gYmUgdGhlIG9ubHkgZXJhc2Ugc2l6ZSBhdmFpbGFibGUsIG9yIG1heSB1c2UgdGhlIG1vcmUgZGV0YWlsZWQKCSAqIGluZm9ybWF0aW9uIGJlbG93IGlmIHRoZXkgZGVzaXJlCgkgKi8KCXVfaW50MzJfdCBlcmFzZXNpemU7CgoJdV9pbnQzMl90IG9vYmJsb2NrOyAgLyogU2l6ZSBvZiBPT0IgYmxvY2tzIChlLmcuIDUxMikgKi8KCXVfaW50MzJfdCBvb2JzaXplOyAgIC8qIEFtb3VudCBvZiBPT0IgZGF0YSBwZXIgYmxvY2sgKGUuZy4gMTYpICovCgl1X2ludDMyX3Qgb29iYXZhaWw7ICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gT09CIGFyZWEgYXZhaWxhYmxlIGZvciBmcyAgKi8KCXVfaW50MzJfdCBlY2N0eXBlOwoJdV9pbnQzMl90IGVjY3NpemU7CgoJdV9pbnQzMl90IGVyYXNlc2l6ZV9zaGlmdDsKCXVfaW50MzJfdCBlcmFzZXNpemVfbWFzazsKCXVfaW50MzJfdCB3cml0ZXNpemVfc2hpZnQ7Cgl1X2ludDMyX3Qgd3JpdGVzaXplX21hc2s7CgoJLyogS2VybmVsLW9ubHkgc3R1ZmYgc3RhcnRzIGhlcmUuICovCgljaGFyICpuYW1lOwoJaW50IGluZGV4OwoKCS8qIG9vYmluZm8gaXMgYSBuYW5kX29vYmluZm8gc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgc2V0IGJ5IGlvdGNsIChNRU1TRVRPT0JJTkZPKSAqLwoJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOwoKCS8qIERhdGEgZm9yIHZhcmlhYmxlIGVyYXNlIHJlZ2lvbnMuIElmIG51bWVyYXNlcmVnaW9ucyBpcyB6ZXJvLAoJICogaXQgbWVhbnMgdGhhdCB0aGUgd2hvbGUgZGV2aWNlIGhhcyBlcmFzZXNpemUgYXMgZ2l2ZW4gYWJvdmUuCgkgKi8KCWludCBudW1lcmFzZXJlZ2lvbnM7CglzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvICplcmFzZXJlZ2lvbnM7CgoJLyogVGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIGhlcmUuIEl0IGNhbiBnbyBhd2F5IGluIDIuNSAqLwoJdV9pbnQzMl90IGJhbmtfc2l6ZTsKCglpbnQgKCplcmFzZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpOwoKCS8qIFRoaXMgc3R1ZmYgZm9yIGVYZWN1dGUtSW4tUGxhY2UgKi8KCWludCAoKnBvaW50KSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICoqbXRkYnVmKTsKCgkvKiBXZSBwcm9iYWJseSBzaG91bGRuJ3QgYWxsb3cgWElQIGlmIHRoZSB1bnBvaW50IGlzbid0IGEgTlVMTCAqLwoJdm9pZCAoKnVucG9pbnQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICogYWRkciwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pOwoKCglpbnQgKCpyZWFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoJaW50ICgqd3JpdGUpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOwoKCWludCAoKnJlYWRfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYsIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwoJaW50ICgqd3JpdGVfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKCglpbnQgKCpyZWFkX29vYikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCWludCAoKndyaXRlX29vYikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1Zik7CgoJLyoKCSAqIE1ldGhvZHMgdG8gYWNjZXNzIHRoZSBwcm90ZWN0aW9uIHJlZ2lzdGVyIGFyZWEsIHByZXNlbnQgaW4gc29tZQoJICogZmxhc2ggZGV2aWNlcy4gVGhlIHVzZXIgZGF0YSBpcyBvbmUgdGltZSBwcm9ncmFtbWFibGUgYnV0IHRoZQoJICogZmFjdG9yeSBkYXRhIGlzIHJlYWQgb25seS4KCSAqLwoJaW50ICgqcmVhZF91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwoKCWludCAoKnJlYWRfZmFjdF9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKCgkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KCWludCAoKndyaXRlX3VzZXJfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CiNpZiAwCgkvKiBrdmVjLWJhc2VkIHJlYWQvd3JpdGUgbWV0aG9kcy4gV2UgbmVlZCB0aGVzZSBlc3BlY2lhbGx5IGZvciBOQU5EIGZsYXNoLAoJICAgd2l0aCBpdHMgbGltaXRlZCBudW1iZXIgb2Ygd3JpdGUgY3ljbGVzIHBlciBlcmFzZS4KCSAgIE5COiBUaGUgJ2NvdW50JyBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBfdmVjdG9yc18sIGVhY2ggb2YKCSAgIHdoaWNoIGNvbnRhaW5zIGFuIChvZnMsIGxlbikgdHVwbGUuCgkqLwoJaW50ICgqcmVhZHYpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLCBzaXplX3QgKnJldGxlbik7CglpbnQgKCpyZWFkdl9lY2MpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCBmcm9tLAoJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmVjY2J1Ziwgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsKTsKCWludCAoKndyaXRldikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CglpbnQgKCp3cml0ZXZfZWNjKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sCgkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqZWNjYnVmLCBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwpOwojZW5kaWYKCS8qIFN5bmMgKi8KCXZvaWQgKCpzeW5jKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwojaWYgMAoJLyogQ2hpcC1zdXBwb3J0ZWQgZGV2aWNlIGxvY2tpbmcgKi8KCWludCAoKmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CglpbnQgKCp1bmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CgoJLyogUG93ZXIgTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7Cgl2b2lkICgqcmVzdW1lKSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwojZW5kaWYKCS8qIEJhZCBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwoJaW50ICgqYmxvY2tfaXNiYWQpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcyk7CglpbnQgKCpibG9ja19tYXJrYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwoKCXZvaWQgKnByaXY7CgoJc3RydWN0IG1vZHVsZSAqb3duZXI7CglpbnQgdXNlY291bnQ7Cn07CgoKCS8qIEtlcm5lbC1zaWRlIGlvY3RsIGRlZmluaXRpb25zICovCgpleHRlcm4gaW50IGFkZF9tdGRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKZXh0ZXJuIGludCBkZWxfbXRkX2RldmljZSAoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKZXh0ZXJuIHN0cnVjdCBtdGRfaW5mbyAqZ2V0X210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBudW0pOwoKZXh0ZXJuIHZvaWQgcHV0X210ZF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQpOwoKI2lmIDAKc3RydWN0IG10ZF9ub3RpZmllciB7Cgl2b2lkICgqYWRkKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7Cgl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CglzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cn07CgoKZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfbXRkX3VzZXIgKHN0cnVjdCBtdGRfbm90aWZpZXIgKm5ldyk7CmV4dGVybiBpbnQgdW5yZWdpc3Rlcl9tdGRfdXNlciAoc3RydWN0IG10ZF9ub3RpZmllciAqb2xkKTsKCmludCBkZWZhdWx0X210ZF93cml0ZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLAoJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKTsKCmludCBkZWZhdWx0X210ZF9yZWFkdihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGt2ZWMgKnZlY3MsCgkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IGZyb20sIHNpemVfdCAqcmV0bGVuKTsKI2VuZGlmCgojZGVmaW5lIE1URF9FUkFTRShtdGQsIGFyZ3MuLi4pICgqKG10ZC0+ZXJhc2UpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1BPSU5UKG10ZCwgYSxiLGMsZCkgKCoobXRkLT5wb2ludCkpKG10ZCwgYSxiLGMsICh1X2NoYXIgKiopKGQpKQojZGVmaW5lIE1URF9VTlBPSU5UKG10ZCwgYXJnKSAoKihtdGQtPnVucG9pbnQpKShtdGQsICh1X2NoYXIgKilhcmcpCiNkZWZpbmUgTVREX1JFQUQobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWQpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1dSSVRFKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZSkpKG10ZCwgYXJncykKI2RlZmluZSBNVERfUkVBRFYobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWR2KSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURVYobXRkLCBhcmdzLi4uKSAoKihtdGQtPndyaXRldikpKG10ZCwgYXJncykKI2RlZmluZSBNVERfUkVBREVDQyhtdGQsIGFyZ3MuLi4pICgqKG10ZC0+cmVhZF9lY2MpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1dSSVRFRUNDKG10ZCwgYXJncy4uLikgKCoobXRkLT53cml0ZV9lY2MpKShtdGQsIGFyZ3MpCiNkZWZpbmUgTVREX1JFQURPT0IobXRkLCBhcmdzLi4uKSAoKihtdGQtPnJlYWRfb29iKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9XUklURU9PQihtdGQsIGFyZ3MuLi4pICgqKG10ZC0+d3JpdGVfb29iKSkobXRkLCBhcmdzKQojZGVmaW5lIE1URF9TWU5DKG10ZCkgZG8geyBpZiAobXRkLT5zeW5jKSAoKihtdGQtPnN5bmMpKShtdGQpOyAgfSB3aGlsZSAoMCkKCgojaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCnZvaWQgbXRkX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cik7CiNlbHNlCnN0YXRpYyBpbmxpbmUgdm9pZCBtdGRfZXJhc2VfY2FsbGJhY2soc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQp7CglpZiAoaW5zdHItPmNhbGxiYWNrKQoJCWluc3RyLT5jYWxsYmFjayhpbnN0cik7Cn0KI2VuZGlmCgovKgogKiBEZWJ1Z2dpbmcgbWFjcm8gYW5kIGRlZmluZXMKICovCiNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMAkoMCkJLyogUXVpZXQgICAqLwojZGVmaW5lIE1URF9ERUJVR19MRVZFTDEJKDEpCS8qIEF1ZGlibGUgKi8KI2RlZmluZSBNVERfREVCVUdfTEVWRUwyCSgyKQkvKiBMb3VkICAgICovCiNkZWZpbmUgTVREX0RFQlVHX0xFVkVMMwkoMykJLyogTm9pc3kgICAqLwoKI2lmZGVmIENPTkZJR19NVERfREVCVUcKI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQkJCQlcCiAJZG8gewkJCQkJCVwKCQlpZiAobiA8PSBDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UpCVwKCQkJcHJpbnRrKEtFUk5fSU5GTyBhcmdzKTsJCVwKCX0gd2hpbGUoMCkKI2Vsc2UgLyogQ09ORklHX01URF9ERUJVRyAqLwojZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSgwKQoKI2VuZGlmIC8qIENPTkZJR19NVERfREVCVUcgKi8KCiNlbmRpZiAvKiBfX01URF9NVERfSF9fICovCg==