LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICB0aW1lci5jCiAqIFZlcnNpb246CiAqIERlc2NyaXB0aW9uOgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU2F0IEF1ZyAxNiAwMDo1OToyOSAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFdlZCBEZWMgIDggMTI6NTA6MzQgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KCmV4dGVybiBpbnQgIHN5c2N0bF9zbG90X3RpbWVvdXQ7CgpzdGF0aWMgdm9pZCBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX2JhY2tvZmZfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKc3RhdGljIHZvaWQgaXJsYXBfbWVkaWFfYnVzeV9leHBpcmVkKHZvaWQqIGRhdGEpOwoKdm9pZCBpcmxhcF9zdGFydF9zbG90X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPnNsb3RfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X3F1ZXJ5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IFMsIGludCBzKQp7CglpbnQgdGltZW91dDsKCgkvKiBDYWxjdWxhdGUgd2hlbiB0aGUgcGVlciBkaXNjb3Zlcnkgc2hvdWxkIGVuZC4gTm9ybWFsbHksIHdlCgkgKiBnZXQgdGhlIGVuZC1vZi1kaXNjb3ZlcnkgZnJhbWUsIHNvIHRoaXMgaXMganVzdCBpbiBjYXNlCgkgKiB3ZSBtaXNzIGl0LgoJICogQmFzaWNhbGx5LCB3ZSBtdWx0aXBseSB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBzbG90cyBieSBvdXIKCSAqIHNsb3QgdGltZSwgcGx1cyBhZGQgc29tZSBleHRyYSB0aW1lIHRvIHByb3Blcmx5IHJlY2VpdmUgdGhlIGxhc3QKCSAqIGRpc2NvdmVyeSBwYWNrZXQgKHdoaWNoIGlzIGxvbmdlciBkdWUgdG8gZXh0cmEgZGlzY292ZXJ5IGluZm8pLAoJICogdG8gYXZvaWQgbWVzc2luZyB3aXRoIGZvciBpbmNvbW1pbmcgY29ubmVjdGlvbnMgcmVxdWVzdHMgYW5kCgkgKiB0byBhY2NvbW9kYXRlIGRldmljZXMgdGhhdCBwZXJmb3JtIGRpc2NvdmVyeSBzbG93ZXIgdGhhbiB1cy4KCSAqIEplYW4gSUkgKi8KCXRpbWVvdXQgPSAoKHN5c2N0bF9zbG90X3RpbWVvdXQgKiBIWiAvIDEwMDApICogKFMgLSBzKQoJCSAgICsgWElERVhUUkFfVElNRU9VVCArIFNNQUxMQlVTWV9USU1FT1VUKTsKCgkvKiBTZXQgb3IgcmUtc2V0IHRoZSB0aW1lci4gV2UgcmVzZXQgdGhlIHRpbWVyIGZvciBlYWNoIHJlY2VpdmVkCgkgKiBkaXNjb3ZlcnkgcXVlcnksIHdoaWNoIGFsbG93IHVzIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRvCgkgKiB0aGUgc3BlZWQgb2YgdGhlIHBlZXIgZGlzY292ZXJ5IChmYXN0ZXIgb3Igc2xvd2VyKS4gSmVhbiBJSSAqLwoJaXJkYV9zdGFydF90aW1lciggJnNlbGYtPnF1ZXJ5X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAoJCQkgIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAoJCQkgaXJsYXBfZmluYWxfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsYXBfc3RhcnRfd2RfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2RfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxhcF93ZF90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdGFydF9iYWNrb2ZmX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmJhY2tvZmZfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X21idXN5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPm1lZGlhX2J1c3lfdGltZXIsIHRpbWVvdXQsCgkJCSAodm9pZCAqKSBzZWxmLCBpcmxhcF9tZWRpYV9idXN5X2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0b3BfbWJ1c3lfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmKQp7CgkvKiBJZiB0aW1lciBpcyBhY3RpdmF0ZWQsIGtpbGwgaXQhICovCglkZWxfdGltZXIoJnNlbGYtPm1lZGlhX2J1c3lfdGltZXIpOwoKCS8qIElmIHdlIGFyZSBpbiBORE0sIHRoZXJlIGlzIGEgYnVuY2ggb2YgZXZlbnRzIGluIExBUCB0aGF0CgkgKiB0aGF0IGJlIHBlbmRpbmcgZHVlIHRvIHRoZSBtZWRpYV9idXN5IGNvbmRpdGlvbiwgc3VjaCBhcwoJICogQ09OTkVDVF9SRVFVRVNUIGFuZCBTRU5EX1VJX0ZSQU1FLiBJZiB3ZSBkb24ndCBnZW5lcmF0ZQoJICogYW4gZXZlbnQsIHRoZXkgd2lsbCB3YWl0IGZvcmV2ZXIuLi4KCSAqIEplYW4gSUkgKi8KCWlmIChzZWxmLT5zdGF0ZSA9PSBMQVBfTkRNKQoJCWlybGFwX2RvX2V2ZW50KHNlbGYsIE1FRElBX0JVU1lfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0KCnZvaWQgaXJsbXBfc3RhcnRfd2F0Y2hkb2dfdGltZXIoc3RydWN0IGxzYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKCQkJIGlybG1wX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihzdHJ1Y3QgaXJsbXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5kaXNjb3ZlcnlfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxtcF9kaXNjb3ZlcnlfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+aWRsZV90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKCQkJIGlybG1wX2lkbGVfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsbXBfc3RvcF9pZGxlX3RpbWVyKHN0cnVjdCBsYXBfY2IgKnNlbGYpCnsKCS8qIElmIHRpbWVyIGlzIGFjdGl2YXRlZCwga2lsbCBpdCEgKi8KCWRlbF90aW1lcigmc2VsZi0+aWRsZV90aW1lcik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICogICAgSXJMQVAgc2xvdCB0aW1lciBoYXMgZXhwaXJlZAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKCglpcmxhcF9kb19ldmVudChzZWxmLCBTTE9UX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBJckxBUCBxdWVyeSB0aW1lciBoYXMgZXhwaXJlZAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUVVFUllfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyZGFfZmluYWxfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICoKICoKICovCnN0YXRpYyB2b2lkIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoKCWlybGFwX2RvX2V2ZW50KHNlbGYsIEZJTkFMX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmRhX3dkX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhcF93ZF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKCglpcmxhcF9kb19ldmVudChzZWxmLCBXRF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKfQoKLyoKICogRnVuY3Rpb24gaXJkYV9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoKCWlybGFwX2RvX2V2ZW50KHNlbGYsIEJBQ0tPRkZfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0KCgovKgogKiBGdW5jdGlvbiBpcnR0eV9tZWRpYV9idXN5X2V4cGlyZWQgKGRhdGEpCiAqCiAqCiAqLwp2b2lkIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCh2b2lkKiBkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCglpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIEZBTFNFKTsKCS8qIE5vdGUgOiB0aGUgTEFQIGV2ZW50IHdpbGwgYmUgc2VuZCBpbiBpcmxhcF9zdG9wX21idXN5X3RpbWVyKCksCgkqIHRvIGNhdGNoIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBmbGFnIGlzIGNsZWFyZWQgKGZvciBleGFtcGxlCgkqIGFmdGVyIGEgZGlzY292ZXJ5KSAtIEplYW4gSUkgKi8KfQo=