From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.genesi-usa.com (mithrandir.softwarenexus.net [66.98.186.96]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTP id C6EE7DDE05 for ; Tue, 4 Sep 2007 21:07:53 +1000 (EST) Received: from 82-46-178-156.cable.ubr06.king.blueyonder.co.uk ([82.46.178.156] helo=[192.168.2.228]) by mail.genesi-usa.com with esmtpa (Exim 4.66 (FreeBSD)) (envelope-from ) id 1ISVyO-000E3B-9B for linuxppc-dev@ozlabs.org; Tue, 04 Sep 2007 10:49:33 +0000 Message-ID: <46DD3CE2.4060301@genesi-usa.com> Date: Tue, 04 Sep 2007 12:09:22 +0100 From: Matt Sealey MIME-Version: 1.0 To: ppc-dev Subject: "atomic" 64-bit math on 32-bit ppc's? Content-Type: multipart/mixed; boundary="------------050002030609040807070604" List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , This is a multi-part message in MIME format. --------------050002030609040807070604 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi guys, Since this is a generic PPC coding question I figured I'd send it here. We're looking to make the small effort to get ZFS-FUSE working on PPC and there is a need (as is implemented on Solaris) for some 'atomic' math operations to ease multithreading in ZFS. The Solaris PPC code drop included most of these functions for 32-bit ops on 32-bit PPC architectures but the 64-bit operations are not present. What I a not clear on is the operation of lwarx and stwcx. and if they will work if you are doing operations on two words at a time. There has to be something somewhere that implemented these already (gcc??) and if anyone knows I'd love to know.. -- Matt Sealey Genesi, Manager, Developer Relations --------------050002030609040807070604 Content-Type: text/plain; name="atomic.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="atomic.c" LyoKICogQ0RETCBIRUFERVIgU1RBUlQKICoKICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmls ZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlCiAqIENvbW1vbiBEZXZlbG9wbWVu dCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UsIFZlcnNpb24gMS4wIG9ubHkKICogKHRoZSAi TGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxp YW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLgogKgogKiBZb3UgY2FuIG9idGFpbiBhIGNvcHkg b2YgdGhlIGxpY2Vuc2UgYXQgdXNyL3NyYy9PUEVOU09MQVJJUy5MSUNFTlNFCiAqIG9yIGh0 dHA6Ly93d3cub3BlbnNvbGFyaXMub3JnL29zL2xpY2Vuc2luZy4KICogU2VlIHRoZSBMaWNl bnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCiAq IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICogV2hlbiBkaXN0cmli dXRpbmcgQ292ZXJlZCBDb2RlLCBpbmNsdWRlIHRoaXMgQ0RETCBIRUFERVIgaW4gZWFjaAog KiBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQgdXNyL3NyYy9PUEVOU09M QVJJUy5MSUNFTlNFLgogKiBJZiBhcHBsaWNhYmxlLCBhZGQgdGhlIGZvbGxvd2luZyBiZWxv dyB0aGlzIENEREwgSEVBREVSLCB3aXRoIHRoZQogKiBmaWVsZHMgZW5jbG9zZWQgYnkgYnJh Y2tldHMgIltdIiByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nCiAqIGluZm9y bWF0aW9uOiBQb3J0aW9ucyBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBv d25lcl0KICoKICogQ0RETCBIRUFERVIgRU5ECiAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDIw MDYgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICog VXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KICovCgojcHJhZ21hIGlkZW50ICAg IiVaJSVNJSAlSSUgICAgICVFJSBTTUwiCgojaW5jbHVkZSA8c3lzL2F0b21pYy5oPgoKLyoK ICogVGhlc2VzIGFyZSB0aGUgdm9pZCByZXR1cm5pbmcgdmFyaWFudHMKICovCgojZGVmaW5l IEFUT01JQ19JTkMobmFtZSwgdHlwZSkgXAoJdm9pZCBhdG9taWNfaW5jXyMjbmFtZSh2b2xh dGlsZSB0eXBlICp0YXJnZXQpCVwKCXsJCQkJCQkJXAoJCXR5cGUgbG9jazsJCQkJCVwKCQkJ CQkJCQlcCgkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCVwKCQkiMToJbHdhcngJJVtsb2Nr XSwwLCVbdGFyZ2V0XVxuIgkJXAoJCSIJYWRkaQklW2xvY2tdLCVbbG9ja10sMVxuIgkJXAoJ CSIJc3R3Y3guCSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWJuZS0gICAgMWIiCQkJ CVwKCQk6IFtsb2NrXSAiPSZyIiAobG9jaykJCQkJXAoJCTogW3RhcmdldF0gInIiICh0YXJn ZXQpCQkJCVwKCQk6ICJjYyIpOwkJCQkJXAoJfQoKQVRPTUlDX0lOQyhsb25nLCB1bnNpZ25l ZCBsb25nKQpBVE9NSUNfSU5DKDgsIHVpbnQ4X3QpCkFUT01JQ19JTkModWNoYXIsIHVjaGFy X3QpCkFUT01JQ19JTkMoMTYsIHVpbnQxNl90KQpBVE9NSUNfSU5DKHVzaG9ydCwgdXNob3J0 X3QpCkFUT01JQ19JTkMoMzIsIHVpbnQzMl90KQpBVE9NSUNfSU5DKHVpbnQsIHVpbnRfdCkK QVRPTUlDX0lOQyh1bG9uZywgdWxvbmdfdCkKCiNpZiBkZWZpbmVkKF9LRVJORUwpIHx8IGRl ZmluZWQoX0lOVDY0X1RZUEUpCnZvaWQgYXRvbWljX2luY182NCh2b2xhdGlsZSB1aW50NjRf dCAqdGFyZ2V0KQp7CgkvKiBYWFggLSBJbXBsZW1lbnQgbWUgKi8KCSgqdGFyZ2V0KSsrOwp9 CiNlbmRpZgoKI2RlZmluZSBBVE9NSUNfREVDKG5hbWUsIHR5cGUpIFwKCXZvaWQgYXRvbWlj X2RlY18jI25hbWUodm9sYXRpbGUgdHlwZSAqdGFyZ2V0KQlcCgl7CQkJCQkJCVwKCQl0eXBl IGxvY2s7CQkJCQlcCgkJCQkJCQkJXAoJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCgkJ IjE6CWx3YXJ4CSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWFkZGkJJVtsb2NrXSwl W2xvY2tdLC0xXG4iCQlcCgkJIglzdHdjeC4JJVtsb2NrXSwwLCVbdGFyZ2V0XVxuIgkJXAoJ CSIJYm5lLSAgICAxYiIJCQkJXAoJCTogW2xvY2tdICI9JnIiIChsb2NrKQkJCQlcCgkJOiBb dGFyZ2V0XSAiciIgKHRhcmdldCkJCQkJXAoJCTogImNjIik7CQkJCQlcCgl9CgpBVE9NSUNf REVDKGxvbmcsIHVuc2lnbmVkIGxvbmcpCkFUT01JQ19ERUMoOCwgdWludDhfdCkKQVRPTUlD X0RFQyh1Y2hhciwgdWNoYXJfdCkKQVRPTUlDX0RFQygxNiwgdWludDE2X3QpCkFUT01JQ19E RUModXNob3J0LCB1c2hvcnRfdCkKQVRPTUlDX0RFQygzMiwgdWludDMyX3QpCkFUT01JQ19E RUModWludCwgdWludF90KQpBVE9NSUNfREVDKHVsb25nLCB1bG9uZ190KQoKI2lmIGRlZmlu ZWQoX0tFUk5FTCkgfHwgZGVmaW5lZChfSU5UNjRfVFlQRSkKdm9pZCBhdG9taWNfZGVjXzY0 KHZvbGF0aWxlIHVpbnQ2NF90ICp0YXJnZXQpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAq LwoJKCp0YXJnZXQpLS07Cn0KI2VuZGlmCgojZGVmaW5lIEFUT01JQ19BREQobmFtZSwgdHlw ZTEsIHR5cGUyKSBcCgl2b2lkIGF0b21pY19hZGRfIyNuYW1lKHZvbGF0aWxlIHR5cGUxICp0 YXJnZXQsIHR5cGUyIGJpdHMpIFwKCXsJCQkJCQkJXAoJCXR5cGUxIGxvY2s7CQkJCQlcCgkJ CQkJCQkJXAoJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCgkJIjE6CWx3YXJ4CSVbbG9j a10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWFkZAklW2xvY2tdLCVbYml0c10sJVtsb2NrXVxu IglcCgkJIglzdHdjeC4JJVtsb2NrXSwwLCVbdGFyZ2V0XVxuIgkJXAoJCSIJYm5lLSAgICAx YiIJCQkJXAoJCTogW2xvY2tdICI9JnIiIChsb2NrKQkJCQlcCgkJOiBbdGFyZ2V0XSAiciIg KHRhcmdldCksIFtiaXRzXSAiciIgKGJpdHMpCVwKCQk6ICJjYyIpOwkJCQkJXAoJfQoKQVRP TUlDX0FERCg4LCB1aW50OF90LCBpbnQ4X3QpCkFUT01JQ19BREQoY2hhciwgdWNoYXJfdCwg c2lnbmVkIGNoYXIpCkFUT01JQ19BREQoMTYsIHVpbnQxNl90LCBpbnQxNl90KQpBVE9NSUNf QUREKHNob3J0LCB1c2hvcnRfdCwgc2hvcnQpCkFUT01JQ19BREQoMzIsIHVpbnQzMl90LCBp bnQzMl90KQpBVE9NSUNfQUREKGludCwgdWludF90LCBpbnQpCkFUT01JQ19BREQobG9uZywg dWxvbmdfdCwgbG9uZykKCnZvaWQgYXRvbWljX2FkZF9wdHIodm9sYXRpbGUgdm9pZCAqdGFy Z2V0LCBzc2l6ZV90IGJpdHMpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwoJKihjYWRk cl90ICopdGFyZ2V0ICs9IGJpdHM7Cn0KCiNpZiBkZWZpbmVkKF9LRVJORUwpIHx8IGRlZmlu ZWQoX0lOVDY0X1RZUEUpCnZvaWQgYXRvbWljX2FkZF82NCh2b2xhdGlsZSB1aW50NjRfdCAq dGFyZ2V0LCBpbnQ2NF90IGJpdHMpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwoJKnRh cmdldCArPSBiaXRzOwp9CiNlbmRpZgoKI2RlZmluZSBBVE9NSUNfT1IobmFtZSwgdHlwZSkg XAoJdm9pZCBhdG9taWNfb3JfIyNuYW1lKHZvbGF0aWxlIHR5cGUgKnRhcmdldCwgdHlwZSBi aXRzKSBcCgl7CQkJCQkJCVwKCQl0eXBlIGxvY2s7CQkJCQlcCgkJCQkJCQkJXAoJCV9fYXNt X18gX192b2xhdGlsZV9fKAkJCQlcCgkJIjE6CWx3YXJ4CSVbbG9ja10sMCwlW3RhcmdldF1c biIJCVwKCQkiCW9yCSVbbG9ja10sJVtiaXRzXSwlW2xvY2tdXG4iCVwKCQkiCXN0d2N4Lgkl W2xvY2tdLDAsJVt0YXJnZXRdXG4iCQlcCgkJIglibmUtICAgIDFiIgkJCQlcCgkJOiBbbG9j a10gIj0mciIgKGxvY2spCQkJCVwKCQk6IFt0YXJnZXRdICJyIiAodGFyZ2V0KSwgW2JpdHNd ICJyIiAoYml0cykJXAoJCTogImNjIik7CQkJCQlcCgl9CgovL0FUT01JQ19PUihsb25nLCB1 bG9uZ190KQpBVE9NSUNfT1IoOCwgdWludDhfdCkKQVRPTUlDX09SKHVjaGFyLCB1Y2hhcl90 KQpBVE9NSUNfT1IoMTYsIHVpbnQxNl90KQpBVE9NSUNfT1IodXNob3J0LCB1c2hvcnRfdCkK QVRPTUlDX09SKDMyLCB1aW50MzJfdCkKQVRPTUlDX09SKHVpbnQsIHVpbnRfdCkKQVRPTUlD X09SKHVsb25nLCB1bG9uZ190KQoKI2lmIGRlZmluZWQoX0tFUk5FTCkgfHwgZGVmaW5lZChf SU5UNjRfVFlQRSkKdm9pZCBhdG9taWNfb3JfNjQodm9sYXRpbGUgdWludDY0X3QgKnRhcmdl dCwgdWludDY0X3QgYml0cykKewoJLyogWFhYIC0gSW1wbGVtZW50IG1lICovCgkqdGFyZ2V0 IHw9IGJpdHM7Cn0KI2VuZGlmCgojZGVmaW5lIEFUT01JQ19BTkQobmFtZSwgdHlwZSkgXAoJ dm9pZCBhdG9taWNfYW5kXyMjbmFtZSh2b2xhdGlsZSB0eXBlICp0YXJnZXQsIHR5cGUgYml0 cykgXAoJewkJCQkJCQlcCgkJdHlwZSBsb2NrOwkJCQkJXAoJCQkJCQkJCVwKCQlfX2FzbV9f IF9fdm9sYXRpbGVfXygJCQkJXAoJCSIxOglsd2FyeAklW2xvY2tdLDAsJVt0YXJnZXRdXG4i CQlcCgkJIglhbmQJJVtsb2NrXSwlW2JpdHNdLCVbbG9ja11cbiIJXAoJCSIJc3R3Y3guCSVb bG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWJuZS0gICAgMWIiCQkJCVwKCQk6IFtsb2Nr XSAiPSZyIiAobG9jaykJCQkJXAoJCTogW3RhcmdldF0gInIiICh0YXJnZXQpLCBbYml0c10g InIiIChiaXRzKQlcCgkJOiAiY2MiKTsJCQkJCVwKCX0KCi8vQVRPTUlDX0FORChsb25nLCB1 bG9uZ190KQpBVE9NSUNfQU5EKDgsIHVpbnQ4X3QpCkFUT01JQ19BTkQodWNoYXIsIHVjaGFy X3QpCkFUT01JQ19BTkQoMTYsIHVpbnQxNl90KQpBVE9NSUNfQU5EKHVzaG9ydCwgdXNob3J0 X3QpCkFUT01JQ19BTkQoMzIsIHVpbnQzMl90KQpBVE9NSUNfQU5EKHVpbnQsIHVpbnRfdCkK QVRPTUlDX0FORCh1bG9uZywgdWxvbmdfdCkKCiNpZiBkZWZpbmVkKF9LRVJORUwpIHx8IGRl ZmluZWQoX0lOVDY0X1RZUEUpCnZvaWQgYXRvbWljX2FuZF82NCh2b2xhdGlsZSB1aW50NjRf dCAqdGFyZ2V0LCB1aW50NjRfdCBiaXRzKQp7CgkvKiBYWFggLSBJbXBsZW1lbnQgbWUgKi8K CSp0YXJnZXQgJj0gYml0czsKfQojZW5kaWYKCi8qCiAqIE5ldyB2YWx1ZSByZXR1cm5pbmcg dmFyaWFudHMKICovIAoKI2RlZmluZSBBVE9NSUNfSU5DX05WKG5hbWUsIHR5cGUpIFwKCXR5 cGUgYXRvbWljX2luY18jI25hbWUjI19udih2b2xhdGlsZSB0eXBlICp0YXJnZXQpIFwKCXsJ CQkJCQkJXAoJCXR5cGUgbG9jazsJCQkJCVwKCQkJCQkJCQlcCgkJX19hc21fXyBfX3ZvbGF0 aWxlX18oCQkJCVwKCQkiMToJbHdhcngJJVtsb2NrXSwwLCVbdGFyZ2V0XVxuIgkJXAoJCSIJ YWRkaQklW2xvY2tdLCVbbG9ja10sMVxuIgkJXAoJCSIJc3R3Y3guCSVbbG9ja10sMCwlW3Rh cmdldF1cbiIJCVwKCQkiCWJuZS0gICAgMWIiCQkJCVwKCQk6IFtsb2NrXSAiPSZyIiAobG9j aykJCQkJXAoJCTogW3RhcmdldF0gInIiICh0YXJnZXQpCQkJCVwKCQk6ICJjYyIpOwkJCQkJ XAoJCQkJCQkJCVwKCQlyZXR1cm4gbG9jazsJCQkJCVwKCX0KCkFUT01JQ19JTkNfTlYobG9u ZywgdW5zaWduZWQgbG9uZykKQVRPTUlDX0lOQ19OVig4LCB1aW50OF90KQpBVE9NSUNfSU5D X05WKHVjaGFyLCB1Y2hhcl90KQpBVE9NSUNfSU5DX05WKDE2LCB1aW50MTZfdCkKQVRPTUlD X0lOQ19OVih1c2hvcnQsIHVzaG9ydF90KQpBVE9NSUNfSU5DX05WKDMyLCB1aW50MzJfdCkK QVRPTUlDX0lOQ19OVih1aW50LCB1aW50X3QpCkFUT01JQ19JTkNfTlYodWxvbmcsIHVsb25n X3QpCgojaWYgZGVmaW5lZChfS0VSTkVMKSB8fCBkZWZpbmVkKF9JTlQ2NF9UWVBFKQp1aW50 NjRfdCBhdG9taWNfaW5jXzY0X252KHZvbGF0aWxlIHVpbnQ2NF90ICp0YXJnZXQpCnsKCS8q IFhYWCAtIEltcGxlbWVudCBtZSAqLwoJcmV0dXJuICgrKygqdGFyZ2V0KSk7Cn0KI2VuZGlm CgojZGVmaW5lIEFUT01JQ19ERUNfTlYobmFtZSwgdHlwZSkgXAoJdHlwZSBhdG9taWNfZGVj XyMjbmFtZSMjX252KHZvbGF0aWxlIHR5cGUgKnRhcmdldCkgXAoJewkJCQkJCQlcCgkJdHlw ZSBsb2NrOwkJCQkJXAoJCQkJCQkJCVwKCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAoJ CSIxOglsd2FyeAklW2xvY2tdLDAsJVt0YXJnZXRdXG4iCQlcCgkJIglhZGRpCSVbbG9ja10s JVtsb2NrXSwtMVxuIgkJXAoJCSIJc3R3Y3guCSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwK CQkiCWJuZS0gICAgMWIiCQkJCVwKCQk6IFtsb2NrXSAiPSZyIiAobG9jaykJCQkJXAoJCTog W3RhcmdldF0gInIiICh0YXJnZXQpCQkJCVwKCQk6ICJjYyIpOwkJCQkJXAoJCQkJCQkJCVwK CQlyZXR1cm4gbG9jazsJCQkJCVwKCX0KCkFUT01JQ19ERUNfTlYobG9uZywgdW5zaWduZWQg bG9uZykKQVRPTUlDX0RFQ19OVig4LCB1aW50OF90KQpBVE9NSUNfREVDX05WKHVjaGFyLCB1 Y2hhcl90KQpBVE9NSUNfREVDX05WKDE2LCB1aW50MTZfdCkKQVRPTUlDX0RFQ19OVih1c2hv cnQsIHVzaG9ydF90KQpBVE9NSUNfREVDX05WKDMyLCB1aW50MzJfdCkKQVRPTUlDX0RFQ19O Vih1aW50LCB1aW50X3QpCkFUT01JQ19ERUNfTlYodWxvbmcsIHVsb25nX3QpCgojaWYgZGVm aW5lZChfS0VSTkVMKSB8fCBkZWZpbmVkKF9JTlQ2NF9UWVBFKQp1aW50NjRfdCBhdG9taWNf ZGVjXzY0X252KHZvbGF0aWxlIHVpbnQ2NF90ICp0YXJnZXQpCnsKCS8qIFhYWCAtIEltcGxl bWVudCBtZSAqLwoJcmV0dXJuICgtLSgqdGFyZ2V0KSk7Cn0KI2VuZGlmCgojZGVmaW5lIEFU T01JQ19BRERfTlYobmFtZSwgdHlwZTEsIHR5cGUyKSBcCgl0eXBlMSBhdG9taWNfYWRkXyMj bmFtZSMjX252KHZvbGF0aWxlIHR5cGUxICp0YXJnZXQsIHR5cGUyIGJpdHMpIFwKCXsJCQkJ CQkJXAoJCXR5cGUxIGxvY2s7CQkJCQlcCgkJCQkJCQkJXAoJCV9fYXNtX18gX192b2xhdGls ZV9fKAkJCQlcCgkJIjE6CWx3YXJ4CSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWFk ZAklW2xvY2tdLCVbYml0c10sJVtsb2NrXVxuIglcCgkJIglzdHdjeC4JJVtsb2NrXSwwLCVb dGFyZ2V0XVxuIgkJXAoJCSIJYm5lLSAgICAxYiIJCQkJXAoJCTogW2xvY2tdICI9JnIiIChs b2NrKQkJCQlcCgkJOiBbdGFyZ2V0XSAiciIgKHRhcmdldCksIFtiaXRzXSAiciIgKGJpdHMp CVwKCQk6ICJjYyIpOwkJCQkJXAoJCQkJCQkJCVwKCQlyZXR1cm4gbG9jazsJCQkJCVwKCX0K CkFUT01JQ19BRERfTlYoOCwgdWludDhfdCwgaW50OF90KQpBVE9NSUNfQUREX05WKGNoYXIs IHVjaGFyX3QsIHNpZ25lZCBjaGFyKQpBVE9NSUNfQUREX05WKDE2LCB1aW50MTZfdCwgaW50 MTZfdCkKQVRPTUlDX0FERF9OVihzaG9ydCwgdXNob3J0X3QsIHNob3J0KQpBVE9NSUNfQURE X05WKDMyLCB1aW50MzJfdCwgaW50MzJfdCkKQVRPTUlDX0FERF9OVihpbnQsIHVpbnRfdCwg aW50KQpBVE9NSUNfQUREX05WKGxvbmcsIHVsb25nX3QsIGxvbmcpCgp2b2lkICphdG9taWNf YWRkX3B0cl9udih2b2xhdGlsZSB2b2lkICp0YXJnZXQsIHNzaXplX3QgYml0cykKewoJLyog WFhYIC0gSW1wbGVtZW50IG1lICovCglyZXR1cm4gKCooY2FkZHJfdCAqKXRhcmdldCArPSBi aXRzKTsKfQoKI2lmIGRlZmluZWQoX0tFUk5FTCkgfHwgZGVmaW5lZChfSU5UNjRfVFlQRSkK dWludDY0X3QgYXRvbWljX2FkZF82NF9udih2b2xhdGlsZSB1aW50NjRfdCAqdGFyZ2V0LCBp bnQ2NF90IGJpdHMpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwoJcmV0dXJuICgqdGFy Z2V0ICs9IGJpdHMpOwp9CiNlbmRpZgoKI2RlZmluZSBBVE9NSUNfT1JfTlYobmFtZSwgdHlw ZSkgXAoJdHlwZSBhdG9taWNfb3JfIyNuYW1lIyNfbnYodm9sYXRpbGUgdHlwZSAqdGFyZ2V0 LCB0eXBlIGJpdHMpIFwKCXsJCQkJCQkJXAoJCXR5cGUgbG9jazsJCQkJCVwKCQkJCQkJCQlc CgkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCVwKCQkiMToJbHdhcngJJVtsb2NrXSwwLCVb dGFyZ2V0XVxuIgkJXAoJCSIJb3IJJVtsb2NrXSwlW2JpdHNdLCVbbG9ja11cbiIJXAoJCSIJ c3R3Y3guCSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWJuZS0gICAgMWIiCQkJCVwK CQk6IFtsb2NrXSAiPSZyIiAobG9jaykJCQkJXAoJCTogW3RhcmdldF0gInIiICh0YXJnZXQp LCBbYml0c10gInIiIChiaXRzKQlcCgkJOiAiY2MiKTsJCQkJCVwKCQkJCQkJCQlcCgkJcmV0 dXJuIGxvY2s7CQkJCQlcCgl9CgpBVE9NSUNfT1JfTlYobG9uZywgdW5zaWduZWQgbG9uZykK QVRPTUlDX09SX05WKDgsIHVpbnQ4X3QpCkFUT01JQ19PUl9OVih1Y2hhciwgdWNoYXJfdCkK QVRPTUlDX09SX05WKDE2LCB1aW50MTZfdCkKQVRPTUlDX09SX05WKHVzaG9ydCwgdXNob3J0 X3QpCkFUT01JQ19PUl9OVigzMiwgdWludDMyX3QpCkFUT01JQ19PUl9OVih1aW50LCB1aW50 X3QpCkFUT01JQ19PUl9OVih1bG9uZywgdWxvbmdfdCkKCiNpZiBkZWZpbmVkKF9LRVJORUwp IHx8IGRlZmluZWQoX0lOVDY0X1RZUEUpCnVpbnQ2NF90IGF0b21pY19vcl82NF9udih2b2xh dGlsZSB1aW50NjRfdCAqdGFyZ2V0LCB1aW50NjRfdCBiaXRzKQp7CgkvKiBYWFggLSBJbXBs ZW1lbnQgbWUgKi8KCXJldHVybiAoKnRhcmdldCB8PSBiaXRzKTsKfQojZW5kaWYKCiNkZWZp bmUgQVRPTUlDX0FORF9OVihuYW1lLCB0eXBlKSBcCgl0eXBlIGF0b21pY19hbmRfIyNuYW1l IyNfbnYodm9sYXRpbGUgdHlwZSAqdGFyZ2V0LCB0eXBlIGJpdHMpIFwKCXsJCQkJCQkJXAoJ CXR5cGUgbG9jazsJCQkJCVwKCQkJCQkJCQlcCgkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJ CVwKCQkiMToJbHdhcngJJVtsb2NrXSwwLCVbdGFyZ2V0XVxuIgkJXAoJCSIJYW5kCSVbbG9j a10sJVtiaXRzXSwlW2xvY2tdXG4iCVwKCQkiCXN0d2N4LgklW2xvY2tdLDAsJVt0YXJnZXRd XG4iCQlcCgkJIglibmUtICAgIDFiIgkJCQlcCgkJOiBbbG9ja10gIj0mciIgKGxvY2spCQkJ CVwKCQk6IFt0YXJnZXRdICJyIiAodGFyZ2V0KSwgW2JpdHNdICJyIiAoYml0cykJXAoJCTog ImNjIik7CQkJCQlcCgkJCQkJCQkJXAoJCXJldHVybiBsb2NrOwkJCQkJXAoJfQoKQVRPTUlD X0FORF9OVihsb25nLCB1bnNpZ25lZCBsb25nKQpBVE9NSUNfQU5EX05WKDgsIHVpbnQ4X3Qp CkFUT01JQ19BTkRfTlYodWNoYXIsIHVjaGFyX3QpCkFUT01JQ19BTkRfTlYoMTYsIHVpbnQx Nl90KQpBVE9NSUNfQU5EX05WKHVzaG9ydCwgdXNob3J0X3QpCkFUT01JQ19BTkRfTlYoMzIs IHVpbnQzMl90KQpBVE9NSUNfQU5EX05WKHVpbnQsIHVpbnRfdCkKQVRPTUlDX0FORF9OVih1 bG9uZywgdWxvbmdfdCkKCiNpZiBkZWZpbmVkKF9LRVJORUwpIHx8IGRlZmluZWQoX0lOVDY0 X1RZUEUpCnVpbnQ2NF90IGF0b21pY19hbmRfNjRfbnYodm9sYXRpbGUgdWludDY0X3QgKnRh cmdldCwgdWludDY0X3QgYml0cykKewoJLyogWFhYIC0gSW1wbGVtZW50IG1lICovCglyZXR1 cm4gKCp0YXJnZXQgJj0gYml0cyk7Cn0KI2VuZGlmCgoKLyoKICogIElmICphcmcxID09IGFy ZzIsIHNldCAqYXJnMSA9IGFyZzM7IHJldHVybiBvbGQgdmFsdWUKICovCgojZGVmaW5lIEFU T01JQ19DQVMobmFtZSwgdHlwZSkgXAoJdHlwZSBhdG9taWNfY2FzXyMjbmFtZSh2b2xhdGls ZSB0eXBlICp0YXJnZXQsIHR5cGUgYXJnMSwgdHlwZSBhcmcyKSBcCgl7CQkJCQkJCVwKCQl0 eXBlIGxvY2ssIG9sZCA9ICp0YXJnZXQ7CQkJXAoJCQkJCQkJCVwKCQlfX2FzbV9fIF9fdm9s YXRpbGVfXygJCQkJXAoJCSIxOglsd2FyeAklW2xvY2tdLDAsJVt0YXJnZXRdXG4iCQlcCgkJ IgljbXB3CSVbbG9ja10sJVthcmcxXVxuIgkJXAoJCSIJYm5lLQkyZlxuIgkJCQlcCgkJIglt cgklW2xvY2tdLCVbYXJnMl1cbiIJCVwKCQkiCXN0d2N4LgklW2xvY2tdLDAsJVt0YXJnZXRd XG4iCQlcCgkJIglibmUtCTFiXG4iCQkJCVwKCQkiMjoiCQkJCQkJXAoJCTogW2xvY2tdICI9 JnIiIChsb2NrKQkJCQlcCgkJOiBbdGFyZ2V0XSAiciIgKHRhcmdldCksIFthcmcxXSAiciIg KGFyZzEpLCBbYXJnMl0gInIiIChhcmcyKQlcCgkJOiAiY2MiKTsJCQkJCVwKCQkJCQkJCQlc CgkJcmV0dXJuIG9sZDsJCQkJCVwKCX0KCkFUT01JQ19DQVMoOCwgdWludDhfdCkKQVRPTUlD X0NBUyh1Y2hhciwgdWNoYXJfdCkKQVRPTUlDX0NBUygxNiwgdWludDE2X3QpCkFUT01JQ19D QVModXNob3J0LCB1c2hvcnRfdCkKQVRPTUlDX0NBUygzMiwgdWludDMyX3QpCkFUT01JQ19D QVModWludCwgdWludF90KQpBVE9NSUNfQ0FTKHVsb25nLCB1bG9uZ190KQoKdm9pZCAqYXRv bWljX2Nhc19wdHIodm9sYXRpbGUgdm9pZCAqdGFyZ2V0LCB2b2lkICphcmcxLCB2b2lkICph cmcyKQp7CgkvKiBYWFggLSBJbXBsZW1lbnQgbWUgKi8KCXZvaWQgKm9sZCA9ICoodm9pZCAq Kil0YXJnZXQ7CiAgICAgICAgaWYgKG9sZCA9PSBhcmcxKQogICAgICAgICAgICAgICAgKih2 b2lkICoqKXRhcmdldCA9IGFyZzI7CiAgICAgICAgcmV0dXJuIChvbGQpOwp9CgojaWYgZGVm aW5lZChfS0VSTkVMKSB8fCBkZWZpbmVkKF9JTlQ2NF9UWVBFKQp1aW50NjRfdCBhdG9taWNf Y2FzXzY0KHZvbGF0aWxlIHVpbnQ2NF90ICp0YXJnZXQsIHVpbnQ2NF90IGFyZzEsIHVpbnQ2 NF90IGFyZzIpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwoJdWludDY0X3Qgb2xkID0g KnRhcmdldDsKICAgICAgICBpZiAob2xkID09IGFyZzEpCiAgICAgICAgICAgICAgICAqdGFy Z2V0ID0gYXJnMjsKICAgICAgICByZXR1cm4gKG9sZCk7Cn0KI2VuZGlmCgovKgogKiBTd2Fw IHRhcmdldCBhbmQgcmV0dXJuIG9sZCB2YWx1ZQogKi8KCiNkZWZpbmUgQVRPTUlDX1NXQVAo bmFtZSwgdHlwZSkgXAoJdHlwZSBhdG9taWNfc3dhcF8jI25hbWUodm9sYXRpbGUgdHlwZSAq dGFyZ2V0LCB0eXBlIGJpdHMpIFwKCXsJCQkJCQkJXAoJCXR5cGUgbG9jaywgb2xkID0gKnRh cmdldDsJCQlcCgkJCQkJCQkJXAoJCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQlcCgkJIjE6 CWx3YXJ4CSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCW1yCSVbbG9ja10sJVtiaXRz XVxuIgkJXAoJCSIJc3R3Y3guCSVbbG9ja10sMCwlW3RhcmdldF1cbiIJCVwKCQkiCWJuZS0J MWIiCQkJCVwKCQk6IFtsb2NrXSAiPSZyIiAobG9jaykJCQkJXAoJCTogW3RhcmdldF0gInIi ICh0YXJnZXQpLCBbYml0c10gInIiIChiaXRzKQlcCgkJOiAiY2MiKTsJCQkJCVwKCQkJCQkJ CQlcCgkJcmV0dXJuIG9sZDsJCQkJCVwKCX0KCkFUT01JQ19TV0FQKDgsIHVpbnQ4X3QpCkFU T01JQ19TV0FQKHVjaGFyLCB1Y2hhcl90KQpBVE9NSUNfU1dBUCgxNiwgdWludDE2X3QpCkFU T01JQ19TV0FQKHVzaG9ydCwgdXNob3J0X3QpCkFUT01JQ19TV0FQKDMyLCB1aW50MzJfdCkK QVRPTUlDX1NXQVAodWludCwgdWludF90KQpBVE9NSUNfU1dBUCh1bG9uZywgdWxvbmdfdCkK CnZvaWQgKmF0b21pY19zd2FwX3B0cih2b2xhdGlsZSB2b2lkICp0YXJnZXQsIHZvaWQgKmJp dHMpCnsKCS8qIFhYWCAtIEltcGxlbWVudCBtZSAqLwoJdm9pZCAqb2xkID0gKih2b2lkICoq KXRhcmdldDsKCSoodm9pZCAqKil0YXJnZXQgPSBiaXRzOwoJcmV0dXJuIChvbGQpOwp9Cgoj aWYgZGVmaW5lZChfS0VSTkVMKSB8fCBkZWZpbmVkKF9JTlQ2NF9UWVBFKQp1aW50NjRfdCBh dG9taWNfc3dhcF82NCh2b2xhdGlsZSB1aW50NjRfdCAqdGFyZ2V0LCB1aW50NjRfdCBiaXRz KQp7CgkvKiBYWFggLSBJbXBsZW1lbnQgbWUgKi8KCXVpbnQ2NF90IG9sZCA9ICp0YXJnZXQ7 CgkqdGFyZ2V0ID0gYml0czsKCXJldHVybiAob2xkKTsKfQojZW5kaWYKCmludCBhdG9taWNf c2V0X2xvbmdfZXhjbCh2b2xhdGlsZSB1bG9uZ190ICp0YXJnZXQsIHVpbnRfdCB2YWx1ZSkK ewoJLyogWFhYIC0gSW1wbGVtZW50IG1lICovCgl1bG9uZ190IGJpdCA9ICgxVUwgPDwgdmFs dWUpOwoJaWYgKCgqdGFyZ2V0ICYgYml0KSAhPSAwKQoJCXJldHVybiAoLTEpOwoJKnRhcmdl dCB8PSBiaXQ7CglyZXR1cm4gKDApOwp9CgppbnQgYXRvbWljX2NsZWFyX2xvbmdfZXhjbCh2 b2xhdGlsZSB1bG9uZ190ICp0YXJnZXQsIHVpbnRfdCB2YWx1ZSkKewoJLyogWFhYIC0gSW1w bGVtZW50IG1lICovCgl1bG9uZ190IGJpdCA9ICgxVUwgPDwgdmFsdWUpOwoJaWYgKCgqdGFy Z2V0ICYgYml0KSAhPSAwKQoJCXJldHVybiAoLTEpOwoJKnRhcmdldCAmPSB+Yml0OwoJcmV0 dXJuICgwKTsKfQoKdm9pZCBtZW1iYXJfZW50ZXIodm9pZCkKewoJLyogWFhYIC0gSW1wbGVt ZW50IG1lICovCn0KCnZvaWQgbWVtYmFyX2V4aXQodm9pZCkKewoJLyogWFhYIC0gSW1wbGVt ZW50IG1lICovCn0KCnZvaWQgbWVtYmFyX3Byb2R1Y2VyKHZvaWQpCnsKCS8qIFhYWCAtIElt cGxlbWVudCBtZSAqLwp9Cgp2b2lkIG1lbWJhcl9jb25zdW1lcih2b2lkKQp7CgkvKiBYWFgg LSBJbXBsZW1lbnQgbWUgKi8KfQoKLyogTGVnYWN5IGtlcm5lbCBpbnRlcmZhY2VzOyB0aGV5 IHdpbGwgZ28gYXdheSAoZXZlbnR1YWxseSkuICovCgp1aW50OF90IGNhczgodWludDhfdCAq dGFyZ2V0LCB1aW50OF90IGFyZzEsIHVpbnQ4X3QgYXJnMikKewoJcmV0dXJuIGF0b21pY19j YXNfOCh0YXJnZXQsIGFyZzEsIGFyZzIpOwp9Cgp1aW50MzJfdCBjYXMzMih1aW50MzJfdCAq dGFyZ2V0LCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyKQp7CglyZXR1cm4gYXRvbWlj X2Nhc18zMih0YXJnZXQsIGFyZzEsIGFyZzIpOwp9Cgp1aW50NjRfdCBjYXM2NCh1aW50NjRf dCAqdGFyZ2V0LCB1aW50NjRfdCBhcmcxLCB1aW50NjRfdCBhcmcyKQp7CglyZXR1cm4gYXRv bWljX2Nhc182NCh0YXJnZXQsIGFyZzEsIGFyZzIpOwp9Cgp1bG9uZ190IGNhc2xvbmcodWxv bmdfdCAqdGFyZ2V0LCB1bG9uZ190IGFyZzEsIHVsb25nX3QgYXJnMikKewoJcmV0dXJuIGF0 b21pY19jYXNfdWxvbmcodGFyZ2V0LCBhcmcxLCBhcmcyKTsKfQoKdm9pZCAqY2FzcHRyKHZv aWQgKnRhcmdldCwgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMikKewoJcmV0dXJuIGF0b21pY19j YXNfcHRyKHRhcmdldCwgYXJnMSwgYXJnMik7Cn0KCnZvaWQgYXRvbWljX2FuZF9sb25nKHVs b25nX3QgKnRhcmdldCwgdWxvbmdfdCBiaXRzKQp7CglyZXR1cm4gYXRvbWljX2FuZF91bG9u Zyh0YXJnZXQsIGJpdHMpOwp9Cgp2b2lkIGF0b21pY19vcl9sb25nKHVsb25nX3QgKnRhcmdl dCwgdWxvbmdfdCBiaXRzKQp7CglyZXR1cm4gYXRvbWljX29yX3Vsb25nKHRhcmdldCwgYml0 cyk7Cn0K --------------050002030609040807070604--