LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgdGltZXIuYwogKiBWZXJzaW9uOiAgICAgICAKICogRGVzY3JpcHRpb246ICAgCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTYXQgQXVnIDE2IDAwOjU5OjI5IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAgOCAxMjo1MDozNCAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKiAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL3RpbWVyLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CgpleHRlcm4gaW50ICBzeXNjdGxfc2xvdF90aW1lb3V0OwoKc3RhdGljIHZvaWQgaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOwpzdGF0aWMgdm9pZCBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOwpzdGF0aWMgdm9pZCBpcmxhcF9maW5hbF90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOwpzdGF0aWMgdm9pZCBpcmxhcF93ZF90aW1lcl9leHBpcmVkKHZvaWQqIGRhdGEpOwpzdGF0aWMgdm9pZCBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCh2b2lkKiBkYXRhKTsgCgp2b2lkIGlybGFwX3N0YXJ0X3Nsb3RfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+c2xvdF90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCgkJCSBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X3F1ZXJ5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IFMsIGludCBzKQp7CglpbnQgdGltZW91dDsKCgkvKiBDYWxjdWxhdGUgd2hlbiB0aGUgcGVlciBkaXNjb3Zlcnkgc2hvdWxkIGVuZC4gTm9ybWFsbHksIHdlCgkgKiBnZXQgdGhlIGVuZC1vZi1kaXNjb3ZlcnkgZnJhbWUsIHNvIHRoaXMgaXMganVzdCBpbiBjYXNlCgkgKiB3ZSBtaXNzIGl0LgoJICogQmFzaWNhbGx5LCB3ZSBtdWx0aXBseSB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBzbG90cyBieSBvdXIKCSAqIHNsb3QgdGltZSwgcGx1cyBhZGQgc29tZSBleHRyYSB0aW1lIHRvIHByb3Blcmx5IHJlY2VpdmUgdGhlIGxhc3QKCSAqIGRpc2NvdmVyeSBwYWNrZXQgKHdoaWNoIGlzIGxvbmdlciBkdWUgdG8gZXh0cmEgZGlzY292ZXJ5IGluZm8pLAoJICogdG8gYXZvaWQgbWVzc2luZyB3aXRoIGZvciBpbmNvbW1pbmcgY29ubmVjdGlvbnMgcmVxdWVzdHMgYW5kCgkgKiB0byBhY2NvbW9kYXRlIGRldmljZXMgdGhhdCBwZXJmb3JtIGRpc2NvdmVyeSBzbG93ZXIgdGhhbiB1cy4KCSAqIEplYW4gSUkgKi8KCXRpbWVvdXQgPSAoKHN5c2N0bF9zbG90X3RpbWVvdXQgKiBIWiAvIDEwMDApICogKFMgLSBzKQoJCSAgICsgWElERVhUUkFfVElNRU9VVCArIFNNQUxMQlVTWV9USU1FT1VUKTsKCgkvKiBTZXQgb3IgcmUtc2V0IHRoZSB0aW1lci4gV2UgcmVzZXQgdGhlIHRpbWVyIGZvciBlYWNoIHJlY2VpdmVkCgkgKiBkaXNjb3ZlcnkgcXVlcnksIHdoaWNoIGFsbG93IHVzIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRvCgkgKiB0aGUgc3BlZWQgb2YgdGhlIHBlZXIgZGlzY292ZXJ5IChmYXN0ZXIgb3Igc2xvd2VyKS4gSmVhbiBJSSAqLwoJaXJkYV9zdGFydF90aW1lciggJnNlbGYtPnF1ZXJ5X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKCQkJICBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdGFydF9maW5hbF90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5maW5hbF90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCgkJCSBpcmxhcF9maW5hbF90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdGFydF93ZF90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53ZF90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCgkJCSBpcmxhcF93ZF90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdGFydF9iYWNrb2ZmX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmJhY2tvZmZfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAoJCQkgaXJsYXBfYmFja29mZl90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdGFydF9tYnVzeV90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyLCB0aW1lb3V0LCAKCQkJICh2b2lkICopIHNlbGYsIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsYXBfc3RvcF9tYnVzeV90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYpCnsKCS8qIElmIHRpbWVyIGlzIGFjdGl2YXRlZCwga2lsbCBpdCEgKi8KCWRlbF90aW1lcigmc2VsZi0+bWVkaWFfYnVzeV90aW1lcik7CgoJLyogSWYgd2UgYXJlIGluIE5ETSwgdGhlcmUgaXMgYSBidW5jaCBvZiBldmVudHMgaW4gTEFQIHRoYXQKCSAqIHRoYXQgYmUgcGVuZGluZyBkdWUgdG8gdGhlIG1lZGlhX2J1c3kgY29uZGl0aW9uLCBzdWNoIGFzCgkgKiBDT05ORUNUX1JFUVVFU1QgYW5kIFNFTkRfVUlfRlJBTUUuIElmIHdlIGRvbid0IGdlbmVyYXRlCgkgKiBhbiBldmVudCwgdGhleSB3aWxsIHdhaXQgZm9yZXZlci4uLgoJICogSmVhbiBJSSAqLwoJaWYgKHNlbGYtPnN0YXRlID09IExBUF9ORE0pCgkJaXJsYXBfZG9fZXZlbnQoc2VsZiwgTUVESUFfQlVTWV9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKfQoKdm9pZCBpcmxtcF9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgbHNhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpIAp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwKCQkJIGlybG1wX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybG1wX3N0YXJ0X2Rpc2NvdmVyeV90aW1lcihzdHJ1Y3QgaXJsbXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KSAKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+ZGlzY292ZXJ5X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAoJCQkgaXJsbXBfZGlzY292ZXJ5X3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybG1wX3N0YXJ0X2lkbGVfdGltZXIoc3RydWN0IGxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpIAp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5pZGxlX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAoJCQkgaXJsbXBfaWRsZV90aW1lcl9leHBpcmVkKTsKfQoKdm9pZCBpcmxtcF9zdG9wX2lkbGVfdGltZXIoc3RydWN0IGxhcF9jYiAqc2VsZikgCnsKCS8qIElmIHRpbWVyIGlzIGFjdGl2YXRlZCwga2lsbCBpdCEgKi8KCWRlbF90aW1lcigmc2VsZi0+aWRsZV90aW1lcik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICogICAgSXJMQVAgc2xvdCB0aW1lciBoYXMgZXhwaXJlZAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKCglpcmxhcF9kb19ldmVudChzZWxmLCBTTE9UX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9IAoKLyoKICogRnVuY3Rpb24gaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICogICAgSXJMQVAgcXVlcnkgdGltZXIgaGFzIGV4cGlyZWQKICoKICovCnN0YXRpYyB2b2lkIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoKCWlybGFwX2RvX2V2ZW50KHNlbGYsIFFVRVJZX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9IAoKLyoKICogRnVuY3Rpb24gaXJkYV9maW5hbF90aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICAKICoKICovCnN0YXRpYyB2b2lkIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoKCWlybGFwX2RvX2V2ZW50KHNlbGYsIEZJTkFMX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmRhX3dkX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfd2RfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoJCglpcmxhcF9kb19ldmVudChzZWxmLCBXRF9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKfQoKLyoKICogRnVuY3Rpb24gaXJkYV9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfYmFja29mZl90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKCQoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CgkKCWlybGFwX2RvX2V2ZW50KHNlbGYsIEJBQ0tPRkZfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0KCgovKgogKiBGdW5jdGlvbiBpcnR0eV9tZWRpYV9idXN5X2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIAogKi8Kdm9pZCBpcmxhcF9tZWRpYV9idXN5X2V4cGlyZWQodm9pZCogZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CgoJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBGQUxTRSk7CgkvKiBOb3RlIDogdGhlIExBUCBldmVudCB3aWxsIGJlIHNlbmQgaW4gaXJsYXBfc3RvcF9tYnVzeV90aW1lcigpLAoJKiB0byBjYXRjaCBvdGhlciBjYXNlcyB3aGVyZSB0aGUgZmxhZyBpcyBjbGVhcmVkIChmb3IgZXhhbXBsZQoJKiBhZnRlciBhIGRpc2NvdmVyeSkgLSBKZWFuIElJICovCn0K