LyogdmlydHBjaS5oCiAqCiAqIENvcHlyaWdodCCpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCiAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqLwoKLyoKICogVW5pc3lzIFZpcnR1YWwgUENJIGRyaXZlciBoZWFkZXIKICovCgojaWZuZGVmIF9fVklSVFBDSV9IX18KI2RlZmluZSBfX1ZJUlRQQ0lfSF9fCgojaW5jbHVkZSAidWlzcXVldWUuaCIKI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KCiNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSEJBIDB4QUEwMAojZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklSVE5JQyAweEFCMDAKCnN0cnVjdCBzY3NpX2FkYXBfaW5mbyB7Cgl2b2lkICpzY3NpaG9zdDsJCS8qIHNjc2kgaG9zdCBpZiB0aGlzIGRldmljZSBpcyBhIHNjc2kgaGJhICovCglzdHJ1Y3QgdmhiYV93d25uIHd3bm47CS8qIHRoZSB3b3JsZCB3aWRlIG5vZGUgbmFtZSBvZiB2aGJhICovCglzdHJ1Y3QgdmhiYV9jb25maWdfbWF4IG1heDsJLyogdmFyaW91cyBtYXggc3BlY2lmaWNhdGlvbnMgdXNlZAoJCQkJCSAqIHRvIGNvbmZpZyB2aGJhICovCn07CgpzdHJ1Y3QgbmV0X2FkYXBfaW5mbyB7CglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXR3b3JrIGRldmljZSBpZiB0aGlzCgkJCQkJICogZGV2aWNlIGlzIGEgTklDICovCgl1OCBtYWNfYWRkcltNQVhfTUFDQUREUl9MRU5dOwoJaW50IG51bV9yY3ZfYnVmczsKCXVuc2lnbmVkIG10dTsKCUdVSUQgem9uZUd1aWQ7Cn07Cgp0eXBlZGVmIGVudW0gewoJVklSVEhCQV9UWVBFID0gMCwKCVZJUlROSUNfVFlQRSA9IDEsCglWSVJUQlVTX1RZUEUgPSA2LAp9IFZJUlRQQ0lfREVWX1RZUEU7CgpzdHJ1Y3QgdmlydHBjaV9kZXYgewoJVklSVFBDSV9ERVZfVFlQRSBkZXZ0eXBlOwkvKiBpbmRpY2F0ZXMgdHlwZSBvZiB0aGUKCQkJCQkgKiB2aXJ0dWFsIHBjaSBkZXZpY2UgKi8KCXN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqbXlkcml2ZXI7CS8qIHdoaWNoIGRyaXZlciBoYXMgYWxsb2NhdGVkCgkJCQkJCSAqIHRoaXMgZGV2aWNlICovCgl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CS8qIHZlbmRvciBpZCBmb3IgZGV2aWNlICovCgl1bnNpZ25lZCBzaG9ydCBkZXZpY2U7CS8qIGRldmljZSBpZCBmb3IgZGV2aWNlICovCglVMzIgYnVzTm87CQkvKiBudW1iZXIgb2YgYnVzIG9uIHdoaWNoIGRldmljZSBleGlzdHMgKi8KCVUzMiBkZXZpY2VObzsJCS8qIGRldmljZSdzIG51bWJlciBvbiB0aGUgYnVzICovCglzdHJ1Y3QgSW50ZXJydXB0SW5mbyBpbnRyOwkvKiBpbnRlcnJ1cHQgaW5mbyAqLwoJc3RydWN0IGRldmljZSBnZW5lcmljX2RldjsJLyogZ2VuZXJpYyBkZXZpY2UgKi8KCXVuaW9uIHsKCQlzdHJ1Y3Qgc2NzaV9hZGFwX2luZm8gc2NzaTsKCQlzdHJ1Y3QgbmV0X2FkYXBfaW5mbyBuZXQ7Cgl9OwoKCXN0cnVjdCB1aXNxdWV1ZV9pbmZvIHF1ZXVlaW5mbzsJLyogaG9sZHMgcHRyIHRvIGNoYW5uZWwgd2hlcmUgY21kcyAmCgkJCQkJICogcnNwcyBhcmUgcXVldWVkICYgcmV0cmlldmVkICovCglzdHJ1Y3QgdmlydHBjaV9kZXYgKm5leHQ7CS8qIHBvaW50cyB0byBuZXh0IHZpcnRwY2kgZGV2aWNlICovCn07CgpzdHJ1Y3QgdmlydHBjaV9kcml2ZXIgewoJc3RydWN0IGxpc3RfaGVhZCBub2RlOwoJY29uc3QgY2hhciAqbmFtZTsJLyogdGhlIG5hbWUgb2YgdGhlIGRyaXZlciBpbiBzeXNmcyAqLwoJY29uc3QgY2hhciAqdmVyc2lvbjsKCWNvbnN0IGNoYXIgKnZlcnRhZzsKCWNvbnN0IGNoYXIgKmJ1aWxkX2RhdGU7Cgljb25zdCBjaGFyICpidWlsZF90aW1lOwoJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkX3RhYmxlOwkvKiBtdXN0IGJlIG5vbi1OVUxMIGZvciBwcm9iZQoJCQkJCQkgKiB0byBiZSBjYWxsZWQgKi8KCWludCAoKnByb2JlKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOyAvKiBkZXZpY2UgaW5zZXJ0ZWQgKi8KCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCB2aXJ0cGNpX2RldiAqZGV2KTsgLyogRGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYKCQkJCQkJICAgICogbm90IGEgaG90LXBsdWcgY2FwYWJsZQoJCQkJCQkgICAgKiBkcml2ZXIpICovCglpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKCQkJdTMyIHN0YXRlKTsJCSAgIC8qIERldmljZSBzdXNwZW5kZWQgKi8KCWludCAoKnJlc3VtZSkoc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpOwkvKiBEZXZpY2Ugd29rZW4gdXAgKi8KCWludCAoKmVuYWJsZV93YWtlKShzdHJ1Y3QgdmlydHBjaV9kZXYgKmRldiwKCQkJICAgIHUzMiBzdGF0ZSwgaW50IGVuYWJsZSk7CS8qIEVuYWJsZSB3YWtlIGV2ZW50ICovCglzdHJ1Y3QgZGV2aWNlX2RyaXZlciBjb3JlX2RyaXZlcjsJLyogVklSVFBDSSBjb3JlIGZpbGxzIHRoaXMgaW4gKi8KfTsKCiNkZWZpbmUJZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGluX2RydikgXAoJY29udGFpbmVyX29mKGluX2Rydiwgc3RydWN0IHZpcnRwY2lfZHJpdmVyLCBjb3JlX2RyaXZlcikKI2RlZmluZSBkZXZpY2VfdG9fdmlydHBjaV9kZXYoaW5fZGV2KSBcCgljb250YWluZXJfb2YoaW5fZGV2LCBzdHJ1Y3QgdmlydHBjaV9kZXYsIGdlbmVyaWNfZGV2KQoKaW50IHZpcnRwY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqKTsKdm9pZCB2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aXJ0cGNpX2RyaXZlciAqKTsKCiNlbmRpZiAvKiBfX1ZJUlRQQ0lfSF9fICovCg==