LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgdGltZXIuYwogKiBWZXJzaW9uOiAgICAgICAKICogRGVzY3JpcHRpb246ICAgCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBTYXQgQXVnIDE2IDAwOjU5OjI5IDE5OTcKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAgOCAxMjo1MDozNCAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwgCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgogKiAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KCmV4dGVybiBpbnQgIHN5c2N0bF9zbG90X3RpbWVvdXQ7CgpzdGF0aWMgdm9pZCBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQodm9pZCogZGF0YSk7CnN0YXRpYyB2b2lkIGlybGFwX2JhY2tvZmZfdGltZXJfZXhwaXJlZCh2b2lkKiBkYXRhKTsKc3RhdGljIHZvaWQgaXJsYXBfbWVkaWFfYnVzeV9leHBpcmVkKHZvaWQqIGRhdGEpOyAKCnZvaWQgaXJsYXBfc3RhcnRfc2xvdF90aW1lcihzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYsIGludCB0aW1lb3V0KQp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5zbG90X3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKCQkJIGlybGFwX3Nsb3RfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsYXBfc3RhcnRfcXVlcnlfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgUywgaW50IHMpCnsKCWludCB0aW1lb3V0OwoKCS8qIENhbGN1bGF0ZSB3aGVuIHRoZSBwZWVyIGRpc2NvdmVyeSBzaG91bGQgZW5kLiBOb3JtYWxseSwgd2UKCSAqIGdldCB0aGUgZW5kLW9mLWRpc2NvdmVyeSBmcmFtZSwgc28gdGhpcyBpcyBqdXN0IGluIGNhc2UKCSAqIHdlIG1pc3MgaXQuCgkgKiBCYXNpY2FsbHksIHdlIG11bHRpcGx5IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHNsb3RzIGJ5IG91cgoJICogc2xvdCB0aW1lLCBwbHVzIGFkZCBzb21lIGV4dHJhIHRpbWUgdG8gcHJvcGVybHkgcmVjZWl2ZSB0aGUgbGFzdAoJICogZGlzY292ZXJ5IHBhY2tldCAod2hpY2ggaXMgbG9uZ2VyIGR1ZSB0byBleHRyYSBkaXNjb3ZlcnkgaW5mbyksCgkgKiB0byBhdm9pZCBtZXNzaW5nIHdpdGggZm9yIGluY29tbWluZyBjb25uZWN0aW9ucyByZXF1ZXN0cyBhbmQKCSAqIHRvIGFjY29tb2RhdGUgZGV2aWNlcyB0aGF0IHBlcmZvcm0gZGlzY292ZXJ5IHNsb3dlciB0aGFuIHVzLgoJICogSmVhbiBJSSAqLwoJdGltZW91dCA9ICgoc3lzY3RsX3Nsb3RfdGltZW91dCAqIEhaIC8gMTAwMCkgKiAoUyAtIHMpCgkJICAgKyBYSURFWFRSQV9USU1FT1VUICsgU01BTExCVVNZX1RJTUVPVVQpOwoKCS8qIFNldCBvciByZS1zZXQgdGhlIHRpbWVyLiBXZSByZXNldCB0aGUgdGltZXIgZm9yIGVhY2ggcmVjZWl2ZWQKCSAqIGRpc2NvdmVyeSBxdWVyeSwgd2hpY2ggYWxsb3cgdXMgdG8gYXV0b21hdGljYWxseSBhZGp1c3QgdG8KCSAqIHRoZSBzcGVlZCBvZiB0aGUgcGVlciBkaXNjb3ZlcnkgKGZhc3RlciBvciBzbG93ZXIpLiBKZWFuIElJICovCglpcmRhX3N0YXJ0X3RpbWVyKCAmc2VsZi0+cXVlcnlfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsIAoJCQkgIGlybGFwX3F1ZXJ5X3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X2ZpbmFsX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmZpbmFsX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKCQkJIGlybGFwX2ZpbmFsX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X3dkX3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndkX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLCAKCQkJIGlybGFwX3dkX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X2JhY2tvZmZfdGltZXIoc3RydWN0IGlybGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+YmFja29mZl90aW1lciwgdGltZW91dCwgKHZvaWQgKikgc2VsZiwgCgkJCSBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybGFwX3N0YXJ0X21idXN5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPm1lZGlhX2J1c3lfdGltZXIsIHRpbWVvdXQsIAoJCQkgKHZvaWQgKikgc2VsZiwgaXJsYXBfbWVkaWFfYnVzeV9leHBpcmVkKTsKfQoKdm9pZCBpcmxhcF9zdG9wX21idXN5X3RpbWVyKHN0cnVjdCBpcmxhcF9jYiAqc2VsZikKewoJLyogSWYgdGltZXIgaXMgYWN0aXZhdGVkLCBraWxsIGl0ISAqLwoJZGVsX3RpbWVyKCZzZWxmLT5tZWRpYV9idXN5X3RpbWVyKTsKCgkvKiBJZiB3ZSBhcmUgaW4gTkRNLCB0aGVyZSBpcyBhIGJ1bmNoIG9mIGV2ZW50cyBpbiBMQVAgdGhhdAoJICogdGhhdCBiZSBwZW5kaW5nIGR1ZSB0byB0aGUgbWVkaWFfYnVzeSBjb25kaXRpb24sIHN1Y2ggYXMKCSAqIENPTk5FQ1RfUkVRVUVTVCBhbmQgU0VORF9VSV9GUkFNRS4gSWYgd2UgZG9uJ3QgZ2VuZXJhdGUKCSAqIGFuIGV2ZW50LCB0aGV5IHdpbGwgd2FpdCBmb3JldmVyLi4uCgkgKiBKZWFuIElJICovCglpZiAoc2VsZi0+c3RhdGUgPT0gTEFQX05ETSkKCQlpcmxhcF9kb19ldmVudChzZWxmLCBNRURJQV9CVVNZX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9Cgp2b2lkIGlybG1wX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHN0cnVjdCBsc2FwX2NiICpzZWxmLCBpbnQgdGltZW91dCkgCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyLCB0aW1lb3V0LCAodm9pZCAqKSBzZWxmLAoJCQkgaXJsbXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsbXBfc3RhcnRfZGlzY292ZXJ5X3RpbWVyKHN0cnVjdCBpcmxtcF9jYiAqc2VsZiwgaW50IHRpbWVvdXQpIAp7CglpcmRhX3N0YXJ0X3RpbWVyKCZzZWxmLT5kaXNjb3ZlcnlfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxtcF9kaXNjb3ZlcnlfdGltZXJfZXhwaXJlZCk7Cn0KCnZvaWQgaXJsbXBfc3RhcnRfaWRsZV90aW1lcihzdHJ1Y3QgbGFwX2NiICpzZWxmLCBpbnQgdGltZW91dCkgCnsKCWlyZGFfc3RhcnRfdGltZXIoJnNlbGYtPmlkbGVfdGltZXIsIHRpbWVvdXQsICh2b2lkICopIHNlbGYsCgkJCSBpcmxtcF9pZGxlX3RpbWVyX2V4cGlyZWQpOwp9Cgp2b2lkIGlybG1wX3N0b3BfaWRsZV90aW1lcihzdHJ1Y3QgbGFwX2NiICpzZWxmKSAKewoJLyogSWYgdGltZXIgaXMgYWN0aXZhdGVkLCBraWxsIGl0ISAqLwoJZGVsX3RpbWVyKCZzZWxmLT5pZGxlX3RpbWVyKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYXBfc2xvdF90aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBJckxBUCBzbG90IHRpbWVyIGhhcyBleHBpcmVkCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhcF9zbG90X3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwoKCWlybGFwX2RvX2V2ZW50KHNlbGYsIFNMT1RfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0gCgovKgogKiBGdW5jdGlvbiBpcmxhcF9xdWVyeV90aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBJckxBUCBxdWVyeSB0aW1lciBoYXMgZXhwaXJlZAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfcXVlcnlfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsYXBfZG9fZXZlbnQoc2VsZiwgUVVFUllfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0gCgovKgogKiBGdW5jdGlvbiBpcmRhX2ZpbmFsX3RpbWVyX2V4cGlyZWQgKGRhdGEpCiAqCiAqICAgIAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYXBfZmluYWxfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CgoJaXJsYXBfZG9fZXZlbnQoc2VsZiwgRklOQUxfVElNRVJfRVhQSVJFRCwgTlVMTCwgTlVMTCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyZGFfd2RfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICogICAgCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhcF93ZF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCnsKCXN0cnVjdCBpcmxhcF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJsYXBfY2IgKikgZGF0YTsKCQoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CgkKCWlybGFwX2RvX2V2ZW50KHNlbGYsIFdEX1RJTUVSX0VYUElSRUQsIE5VTEwsIE5VTEwpOwp9CgovKgogKiBGdW5jdGlvbiBpcmRhX2JhY2tvZmZfdGltZXJfZXhwaXJlZCAoZGF0YSkKICoKICogICAgCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhcF9iYWNrb2ZmX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlybGFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmxhcF9jYiAqKSBkYXRhOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gTEFQX01BR0lDLCByZXR1cm47KTsKCQoJaXJsYXBfZG9fZXZlbnQoc2VsZiwgQkFDS09GRl9USU1FUl9FWFBJUkVELCBOVUxMLCBOVUxMKTsKfQoKCi8qCiAqIEZ1bmN0aW9uIGlydHR5X21lZGlhX2J1c3lfZXhwaXJlZCAoZGF0YSkKICoKICogICAgCiAqLwp2b2lkIGlybGFwX21lZGlhX2J1c3lfZXhwaXJlZCh2b2lkKiBkYXRhKQp7CglzdHJ1Y3QgaXJsYXBfY2IgKnNlbGYgPSAoc3RydWN0IGlybGFwX2NiICopIGRhdGE7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCglpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIEZBTFNFKTsKCS8qIE5vdGUgOiB0aGUgTEFQIGV2ZW50IHdpbGwgYmUgc2VuZCBpbiBpcmxhcF9zdG9wX21idXN5X3RpbWVyKCksCgkqIHRvIGNhdGNoIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBmbGFnIGlzIGNsZWFyZWQgKGZvciBleGFtcGxlCgkqIGFmdGVyIGEgZGlzY292ZXJ5KSAtIEplYW4gSUkgKi8KfQo=