From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="IXz5sly6Gd" Message-ID: <17690.64482.319084.61866@cargo.ozlabs.ibm.com> Date: Thu, 28 Sep 2006 08:32:02 +1000 From: Paul Mackerras To: "Mark A. Greer" Subject: Re: common flatdevtree code In-Reply-To: <20060919194527.GD11361@mag.az.mvista.com> References: <20060831184020.GA13494@mag.az.mvista.com> <17662.17895.852128.729679@cargo.ozlabs.ibm.com> <20060907003625.GA15533@mag.az.mvista.com> <1157615011.18137.14.camel@diesel> <20060907182717.GC4398@mag.az.mvista.com> <1157667816.5220.30.camel@basalt.austin.ibm.com> <20060908005630.GA9823@mag.az.mvista.com> <17665.28367.380866.565218@cargo.ozlabs.ibm.com> <20060919194527.GD11361@mag.az.mvista.com> Cc: linuxppc-dev , Hollis Blanchard List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , --IXz5sly6Gd Content-Type: text/plain; charset=us-ascii Content-Description: message body text Content-Transfer-Encoding: 7bit Here's the latest version of my version of the flatdevtree code... I talked to David Gibson about this and he pointed out that there is a problem with using a void * to identify nodes (i.e. returned from ft_find_device and passed to ft_set_prop etc.). The problem is that if we reallocate the space for the tree, then any void * handles that the user of the library has are then invalid. Perhaps we have to use offsets from the beginning of the struct region instead - the offset for a node will be stable across changes of the node or any of its descendents, at least. Paul. --IXz5sly6Gd Content-Type: application/x-csrc Content-Description: flatdevtree.c Content-Disposition: attachment; filename="flatdevtree.c" Content-Transfer-Encoding: base64 LyoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK ICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v ciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgogKgogKiBDb3B5cmlnaHQgUGFudGVsaXMg QW50b25pb3UgMjAwNgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiAyMDA2CiAqCiAq IEF1dGhvcnM6IFBhbnRlbGlzIEFudG9uaW91IDxwYW50ZWxpc0BlbWJlZGRlZGFsbGV5LmNvbT4K ICogICAgICAgICAgSG9sbGlzIEJsYW5jaGFyZCA8aG9sbGlzYkB1cy5pYm0uY29tPgogKiAgICAg ICAgICBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KICoJICAgIFBhdWwgTWFja2Vy cmFzIDxwYXVsdXNAc2FtYmEub3JnPgogKi8KCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUg PHN0ZGRlZi5oPgojaW5jbHVkZSAiZmxhdGRldnRyZWUuaCIKI2luY2x1ZGUgImZsYXRkZXZ0cmVl X2Vudi5oIgoKI2RlZmluZSBfQUxJR04oeCwgYWwpCSgoKHgpICsgKGFsKSAtIDEpICYgfigoYWwp IC0gMSkpCgovKiBTdHJ1Y3QgdXNlZCB0byByZXR1cm4gaW5mbyBmcm9tIGZ0X25leHQoKSAqLwpz dHJ1Y3QgZnRfYXRvbSB7Cgl1MzIgdGFnOwoJY29uc3QgY2hhciAqbmFtZTsKCXZvaWQgKmRhdGE7 Cgl1MzIgc2l6ZTsKfTsKCi8qIFNldCBwdHJzIHRvIGN1cnJlbnQgb25lJ3MgaW5mbzsgcmV0dXJu IGFkZHIgb2YgbmV4dCBvbmUgKi8Kc3RhdGljIGNoYXIgKmZ0X25leHQoc3RydWN0IGZ0X2N4dCAq Y3h0LCBjaGFyICpwLCBzdHJ1Y3QgZnRfYXRvbSAqcmV0KQp7Cgl1MzIgc3o7CgoJaWYgKHAgPj0g Y3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCArIGN4dC0+cmduW0ZUX1NUUlVDVF0uc2l6ZSkKCQly ZXR1cm4gTlVMTDsKCglyZXQtPnRhZyA9IGJlMzJfdG9fY3B1KCoodTMyICopcCk7CglwICs9IDQ7 CgoJc3dpdGNoIChyZXQtPnRhZykgeyAvKiBUYWcgKi8KCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToK CQlyZXQtPm5hbWUgPSBwOwoJCXJldC0+ZGF0YSA9ICh2b2lkICopKHAgLSA0KTsJLyogc3RhcnQg b2Ygbm9kZSAqLwoJCXAgKz0gX0FMSUdOKHN0cmxlbihwKSArIDEsIDQpOwoJCWJyZWFrOwoJY2Fz ZSBPRl9EVF9QUk9QOgoJCXJldC0+c2l6ZSA9IHN6ID0gYmUzMl90b19jcHUoKih1MzIgKilwKTsK CQlyZXQtPm5hbWUgPSBjeHQtPnN0cl9hbmNob3IgKyBiZTMyX3RvX2NwdSgqKHUzMiAqKShwICsg NCkpOwoJCXJldC0+ZGF0YSA9ICh2b2lkICopKHAgKyA4KTsKCQlwICs9IDggKyBfQUxJR04oc3os IDQpOwoJCWJyZWFrOwoJY2FzZSBPRl9EVF9FTkRfTk9ERToKCWNhc2UgT0ZfRFRfTk9QOgoJCWJy ZWFrOwoJY2FzZSBPRl9EVF9FTkQ6CglkZWZhdWx0OgoJCXAgPSBOVUxMOwoJCWJyZWFrOwoJfQoK CXJldHVybiBwOwp9CgojZGVmaW5lIEhEUl9TSVpFCV9BTElHTihzaXplb2Yoc3RydWN0IGJvb3Rf cGFyYW1faGVhZGVyKSwgOCkKI2RlZmluZSBFWFBBTkRfSU5DUgkxMDI0CS8qIGFsbG9jIHRoaXMg bXVjaCBleHRyYSB3aGVuIGV4cGFuZGluZyAqLwoKLyogU2VlIGlmIHRoZSByZWdpb25zIGFyZSBp biB0aGUgc3RhbmRhcmQgb3JkZXIgYW5kIG5vbi1vdmVybGFwcGluZyAqLwpzdGF0aWMgaW50IGZ0 X29yZGVyZWQoc3RydWN0IGZ0X2N4dCAqY3h0KQp7CgljaGFyICpwID0gKGNoYXIgKikgY3h0LT5i cGggKyBIRFJfU0laRTsKCWVudW0gZnRfcmduX2lkIHI7CgoJZm9yIChyID0gRlRfUlNWTUFQOyBy IDw9IEZUX1NUUklOR1M7ICsrcikgewoJCWlmIChjeHQtPnJnbltyXS5zdGFydCA8IHApCgkJCXJl dHVybiAwOwoJCXAgPSBjeHQtPnJnbltyXS5zdGFydCArIGN4dC0+cmduW3JdLnNpemU7Cgl9Cgly ZXR1cm4gcCA8PSAoY2hhciAqKSBjeHQtPmJwaCArIGN4dC0+bWF4X3NpemU7Cn0KCi8qIENvcHkg dGhlIHRyZWUgdG8gYSBuZXdseS1hbGxvY2F0ZWQgcmVnaW9uIGFuZCBwdXQgdGhpbmdzIGluIG9y ZGVyICovCnN0YXRpYyBpbnQgZnRfcmVvcmRlcihzdHJ1Y3QgZnRfY3h0ICpjeHQsIGludCBuZXh0 cmEpCnsKCXVuc2lnbmVkIGxvbmcgdG90OwoJZW51bSBmdF9yZ25faWQgcjsKCWNoYXIgKnAsICpw ZW5kOwoJaW50IHN0cm9mZjsKCgl0b3QgPSBIRFJfU0laRSArIEVYUEFORF9JTkNSOwoJZm9yIChy ID0gRlRfUlNWTUFQOyByIDw9IEZUX1NUUklOR1M7ICsrcikKCQl0b3QgKz0gY3h0LT5yZ25bcl0u c2l6ZTsKCWlmIChuZXh0cmEgPiAwKQoJCXRvdCArPSBuZXh0cmE7Cgl0b3QgPSBfQUxJR04odG90 LCA4KTsKCglpZiAoIWN4dC0+cmVhbGxvYykKCQlyZXR1cm4gMDsKCXAgPSBjeHQtPnJlYWxsb2Mo TlVMTCwgdG90KTsKCWlmICghcCkKCQlyZXR1cm4gMDsKCgltZW1jcHkocCwgY3h0LT5icGgsIHNp emVvZihzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIpKTsKCS8qIG9mZnNldHMgZ2V0IGZpeGVkIHVw IGxhdGVyICovCgoJY3h0LT5icGggPSAoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopIHA7Cglj eHQtPm1heF9zaXplID0gdG90OwoJcGVuZCA9IHAgKyB0b3Q7CglwICs9IEhEUl9TSVpFOwoKCW1l bWNweShwLCBjeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0LCBjeHQtPnJnbltGVF9SU1ZNQVBdLnNp emUpOwoJY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFydCA9IHA7CglwICs9IGN4dC0+cmduW0ZUX1JT Vk1BUF0uc2l6ZTsKCgltZW1jcHkocCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwgY3h0LT5y Z25bRlRfU1RSVUNUXS5zaXplKTsKCWN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQgPSBwOwoKCXAg PSBwZW5kIC0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZTsKCW1lbWNweShwLCBjeHQtPnJnbltG VF9TVFJJTkdTXS5zdGFydCwgY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZSk7CglzdHJvZmYgPSBj eHQtPnN0cl9hbmNob3IgLSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydDsKCWN4dC0+cmduW0ZU X1NUUklOR1NdLnN0YXJ0ID0gcDsKCWN4dC0+c3RyX2FuY2hvciA9IHAgKyBzdHJvZmY7CgoJY3h0 LT5pc29yZGVyZWQgPSAxOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbmxpbmUgY2hhciAqcHJldl9l bmQoc3RydWN0IGZ0X2N4dCAqY3h0LCBlbnVtIGZ0X3Jnbl9pZCByKQp7CglpZiAociA+IEZUX1JT Vk1BUCkKCQlyZXR1cm4gY3h0LT5yZ25bci0xXS5zdGFydCArIGN4dC0+cmduW3ItMV0uc2l6ZTsK CXJldHVybiAoY2hhciAqKSBjeHQtPmJwaCArIEhEUl9TSVpFOwp9CgpzdGF0aWMgaW5saW5lIGNo YXIgKm5leHRfc3RhcnQoc3RydWN0IGZ0X2N4dCAqY3h0LCBlbnVtIGZ0X3Jnbl9pZCByKQp7Cglp ZiAociA8IEZUX1NUUklOR1MpCgkJcmV0dXJuIGN4dC0+cmduW3IrMV0uc3RhcnQ7CglyZXR1cm4g KGNoYXIgKikgY3h0LT5icGggKyBjeHQtPm1heF9zaXplOwp9CgovKgogKiBTZWUgaWYgd2UgY2Fu IGV4cGFuZCByZWdpb24gcmduIGJ5IG5leHRyYSBieXRlcyBieSB1c2luZyB1cAogKiBmcmVlIHNw YWNlIGFmdGVyIG9yIGJlZm9yZSB0aGUgcmVnaW9uLgogKi8Kc3RhdGljIGludCBmdF9zaHVmZmxl KHN0cnVjdCBmdF9jeHQgKmN4dCwgY2hhciAqKnBwLCBlbnVtIGZ0X3Jnbl9pZCByZ24sCgkJICAg ICAgaW50IG5leHRyYSkKewoJY2hhciAqcCA9ICpwcDsKCWNoYXIgKnJnbl9zdGFydCwgKnJnbl9l bmQ7CgoJcmduX3N0YXJ0ID0gY3h0LT5yZ25bcmduXS5zdGFydDsKCXJnbl9lbmQgPSByZ25fc3Rh cnQgKyBjeHQtPnJnbltyZ25dLnNpemU7CglpZiAobmV4dHJhIDw9IDAgfHwgcmduX2VuZCArIG5l eHRyYSA8PSBuZXh0X3N0YXJ0KGN4dCwgcmduKSkgewoJCS8qIG1vdmUgZm9sbG93aW5nIHN0dWZm ICovCgkJaWYgKG5leHRyYSA8IDApCgkJCXAgLT0gbmV4dHJhOwoJCWlmIChwIDwgcmduX2VuZCkK CQkJbWVtbW92ZShwICsgbmV4dHJhLCBwLCByZ25fZW5kIC0gcCk7CgkJY3h0LT5yZ25bcmduXS5z aXplICs9IG5leHRyYTsKCQlpZiAocmduID09IEZUX1NUUklOR1MpCgkJCS8qIGFzc3VtZXMgc3Ry aW5ncyBvbmx5IGFkZGVkIGF0IGJlZ2lubmluZyAqLwoJCQljeHQtPnN0cl9hbmNob3IgKz0gbmV4 dHJhOwoJCXJldHVybiAxOwoJfQoJaWYgKHByZXZfZW5kKGN4dCwgcmduKSA8PSByZ25fc3RhcnQg LSBuZXh0cmEpIHsKCQkvKiBtb3ZlIHByZWNlZGluZyBzdHVmZiAqLwoJCWlmIChwID4gcmduX3N0 YXJ0KQoJCQltZW1tb3ZlKHJnbl9zdGFydCAtIG5leHRyYSwgcmduX3N0YXJ0LCBwIC0gcmduX3N0 YXJ0KTsKCQkqcCAtPSBuZXh0cmE7CgkJY3h0LT5yZ25bcmduXS5zdGFydCAtPSBuZXh0cmE7CgkJ Y3h0LT5yZ25bcmduXS5zaXplICs9IG5leHRyYTsKCQlyZXR1cm4gMTsKCX0KCXJldHVybiAwOwp9 CgpzdGF0aWMgaW50IGZ0X21ha2Vfc3BhY2Uoc3RydWN0IGZ0X2N4dCAqY3h0LCBjaGFyICoqcHAs IGVudW0gZnRfcmduX2lkIHJnbiwKCQkJIGludCBuZXh0cmEpCnsKCXVuc2lnbmVkIGxvbmcgc2l6 ZSwgc3NpemUsIHRvdDsKCWNoYXIgKnN0ciwgKm5leHQ7CgllbnVtIGZ0X3Jnbl9pZCByOwoKCWlm ICghY3h0LT5pc29yZGVyZWQgJiYgIWZ0X3Jlb3JkZXIoY3h0LCBuZXh0cmEpKQoJCXJldHVybiAw OwoJaWYgKGZ0X3NodWZmbGUoY3h0LCBwcCwgcmduLCBuZXh0cmEpKQoJCXJldHVybiAxOwoKCS8q IFNlZSBpZiB0aGVyZSBpcyBzcGFjZSBhZnRlciB0aGUgc3RyaW5ncyBzZWN0aW9uICovCglzc2l6 ZSA9IGN4dC0+cmduW0ZUX1NUUklOR1NdLnNpemU7CglpZiAoY3h0LT5yZ25bRlRfU1RSSU5HU10u c3RhcnQgKyBzc2l6ZQoJICAgIDwgKGNoYXIgKikgY3h0LT5icGggKyBjeHQtPm1heF9zaXplKSB7 CgkJLyogbW92ZSBzdHJpbmdzIHVwIGFzIGZhciBhcyBwb3NzaWJsZSAqLwoJCXN0ciA9IChjaGFy ICopIGN4dC0+YnBoICsgY3h0LT5tYXhfc2l6ZSAtIHNzaXplOwoJCWN4dC0+c3RyX2FuY2hvciAr PSBzdHIgLSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydDsKCQltZW1tb3ZlKHN0ciwgY3h0LT5y Z25bRlRfU1RSSU5HU10uc3RhcnQsIHNzaXplKTsKCQljeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFy dCA9IHN0cjsKCQkvKiBlbm91Z2ggc3BhY2Ugbm93PyAqLwoJCWlmIChyZ24gPj0gRlRfU1RSVUNU ICYmIGZ0X3NodWZmbGUoY3h0LCBwcCwgcmduLCBuZXh0cmEpKQoJCQlyZXR1cm4gMTsKCX0KCgkv KiBob3cgbXVjaCB0b3RhbCBmcmVlIHNwYWNlIGlzIHRoZXJlIGZvbGxvd2luZyB0aGlzIHJlZ2lv bj8gKi8KCXRvdCA9IDA7Cglmb3IgKHIgPSByZ247IHIgPCBGVF9TVFJJTkdTOyArK3IpIHsKCQlj aGFyICpyX2VuZCA9IGN4dC0+cmduW3JdLnN0YXJ0ICsgY3h0LT5yZ25bcl0uc2l6ZTsKCQl0b3Qg Kz0gbmV4dF9zdGFydChjeHQsIHJnbikgLSByX2VuZDsKCX0KCgkvKiBjYXN0IGlzIHRvIHNodXQg Z2NjIHVwOyB3ZSBrbm93IG5leHRyYSA+PSAwICovCglpZiAodG90IDwgKHVuc2lnbmVkIGludCkg bmV4dHJhKSB7CgkJLyogaGF2ZSB0byByZWFsbG9jYXRlICovCgkJY2hhciAqbmV3cCwgKm9sZHA7 CgoJCWlmICghY3h0LT5yZWFsbG9jKQoJCQlyZXR1cm4gMDsKCQlzaXplID0gX0FMSUdOKGN4dC0+ bWF4X3NpemUgKyAobmV4dHJhIC0gdG90KSArIEVYUEFORF9JTkNSLCA4KTsKCQluZXdwID0gY3h0 LT5yZWFsbG9jKGN4dC0+YnBoLCBzaXplKTsKCQlpZiAoIW5ld3ApCgkJCXJldHVybiAwOwoJCW9s ZHAgPSAoY2hhciAqKSBjeHQtPmJwaDsKCQljeHQtPmJwaCA9IChzdHJ1Y3QgYm9vdF9wYXJhbV9o ZWFkZXIgKikgbmV3cDsKCQljeHQtPm1heF9zaXplID0gc2l6ZTsKCQlmb3IgKHIgPSBGVF9SU1ZN QVA7IHIgPD0gRlRfU1RSSU5HUzsgKytyKQoJCQljeHQtPnJnbltyZ25dLnN0YXJ0ICs9IG5ld3Ag LSBvbGRwOwoJCSpwcCArPSBuZXdwIC0gb2xkcDsKCgkJLyogbW92ZSBzdHJpbmdzIHVwIHRvIHRo ZSBlbmQgKi8KCQlzdHIgPSBuZXdwICsgc2l6ZSAtIHNzaXplOwoJCWN4dC0+c3RyX2FuY2hvciAr PSBzdHIgLSBjeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFydDsKCQltZW1tb3ZlKHN0ciwgY3h0LT5y Z25bRlRfU1RSSU5HU10uc3RhcnQsIHNzaXplKTsKCQljeHQtPnJnbltGVF9TVFJJTkdTXS5zdGFy dCA9IHN0cjsKCQlpZiAoZnRfc2h1ZmZsZShjeHQsIHBwLCByZ24sIG5leHRyYSkpCgkJCXJldHVy biAxOwoJfQoKCS8qIG11c3QgYmUgRlRfUlNWTUFQIGFuZCB3ZSBuZWVkIHRvIG1vdmUgRlRfU1RS VUNUIHVwICovCglpZiAocmduID09IEZUX1JTVk1BUCkgewoJCW5leHQgPSBjeHQtPnJnbltGVF9S U1ZNQVBdLnN0YXJ0ICsgY3h0LT5yZ25bRlRfUlNWTUFQXS5zaXplCgkJCSsgbmV4dHJhOwoJCXNz aXplID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zaXplOwoJCWlmIChuZXh0ICsgc3NpemUgPj0gY3h0 LT5yZ25bRlRfU1RSSU5HU10uc3RhcnQpCgkJCXJldHVybiAwOwkvKiAiY2FuJ3QgaGFwcGVuIiAq LwoJCW1lbW1vdmUobmV4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwgc3NpemUpOwoJCWN4 dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQgPSBuZXh0OwoJCWlmIChmdF9zaHVmZmxlKGN4dCwgcHAs IHJnbiwgbmV4dHJhKSkKCQkJcmV0dXJuIDE7Cgl9CgoJcmV0dXJuIDA7CS8qICJjYW4ndCBoYXBw ZW4iICovCn0KCnN0YXRpYyB2b2lkIGZ0X3B1dF93b3JkKHN0cnVjdCBmdF9jeHQgKmN4dCwgdTMy IHYpCnsKCSoodTMyICopIGN4dC0+cCA9IGNwdV90b19iZTMyKHYpOwoJY3h0LT5wICs9IDQ7Cn0K CnN0YXRpYyB2b2lkIGZ0X3B1dF9iaW4oc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpk YXRhLCB1bnNpZ25lZCBpbnQgc3opCnsKCXVuc2lnbmVkIGxvbmcgc3phID0gX0FMSUdOKHN6LCA0 KTsKCgkvKiB6ZXJvIG91dCB0aGUgYWxpZ25tZW50IGdhcCBpZiBuZWNlc3NhcnkgKi8KCWlmIChz eiA8IHN6YSkKCQkqKHUzMiAqKShjeHQtPnAgKyBzemEgLSA0KSA9IDA7CgoJLyogY29weSBpbiB0 aGUgZGF0YSAqLwoJbWVtY3B5KGN4dC0+cCwgZGF0YSwgc3opOwoKCWN4dC0+cCArPSBzemE7Cn0K CmludCBmdF9iZWdpbl9ub2RlKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3QgY2hhciAqbmFtZSkK ewoJdW5zaWduZWQgbG9uZyBubGVuID0gc3RybGVuKG5hbWUpICsgMTsKCXVuc2lnbmVkIGxvbmcg bGVuID0gOCArIF9BTElHTihubGVuLCA0KTsKCglpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmY3h0 LT5wLCBGVF9TVFJVQ1QsIGxlbikpCgkJcmV0dXJuIC0xOwoJZnRfcHV0X3dvcmQoY3h0LCBPRl9E VF9CRUdJTl9OT0RFKTsKCWZ0X3B1dF9iaW4oY3h0LCBuYW1lLCBzdHJsZW4obmFtZSkgKyAxKTsK CXJldHVybiAwOwp9Cgp2b2lkIGZ0X2VuZF9ub2RlKHN0cnVjdCBmdF9jeHQgKmN4dCkKewoJZnRf cHV0X3dvcmQoY3h0LCBPRl9EVF9FTkRfTk9ERSk7Cn0KCnZvaWQgZnRfbm9wKHN0cnVjdCBmdF9j eHQgKmN4dCkKewoJaWYgKGZ0X21ha2Vfc3BhY2UoY3h0LCAmY3h0LT5wLCBGVF9TVFJVQ1QsIDQp KQoJCWZ0X3B1dF93b3JkKGN4dCwgT0ZfRFRfTk9QKTsKfQoKI2RlZmluZSBOT19TVFJJTkcJMHg3 ZmZmZmZmZgoKc3RhdGljIGludCBsb29rdXBfc3RyaW5nKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29u c3QgY2hhciAqbmFtZSkKewoJY2hhciAqcCwgKmVuZDsKCglwID0gY3h0LT5yZ25bRlRfU1RSSU5H U10uc3RhcnQ7CgllbmQgPSBwICsgY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZTsKCXdoaWxlIChw IDwgZW5kKSB7CgkJaWYgKHN0cmNtcChwLCAoY2hhciAqKW5hbWUpID09IDApCgkJCXJldHVybiBw IC0gY3h0LT5zdHJfYW5jaG9yOwoJCXAgKz0gc3RybGVuKHApICsgMTsKCX0KCglyZXR1cm4gTk9f U1RSSU5HOwp9CgovKiBsb29rdXAgc3RyaW5nIGFuZCBpbnNlcnQgaWYgbm90IGZvdW5kICovCnN0 YXRpYyBpbnQgbWFwX3N0cmluZyhzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUp CnsKCWludCBvZmY7CgljaGFyICpwOwoKCW9mZiA9IGxvb2t1cF9zdHJpbmcoY3h0LCBuYW1lKTsK CWlmIChvZmYgIT0gTk9fU1RSSU5HKQoJCXJldHVybiBvZmY7CglwID0gY3h0LT5yZ25bRlRfU1RS SU5HU10uc3RhcnQ7CglpZiAoIWZ0X21ha2Vfc3BhY2UoY3h0LCAmcCwgRlRfU1RSSU5HUywgc3Ry bGVuKG5hbWUpICsgMSkpCgkJcmV0dXJuIE5PX1NUUklORzsKCXN0cmNweShwLCBuYW1lKTsKCXJl dHVybiBwIC0gY3h0LT5zdHJfYW5jaG9yOwp9CgppbnQgZnRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpj eHQsIGNvbnN0IGNoYXIgKm5hbWUsCgkgICAgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50 IHN6KQp7CglpbnQgb2ZmLCBsZW47CgoJb2ZmID0gbG9va3VwX3N0cmluZyhjeHQsIG5hbWUpOwoJ aWYgKG9mZiA9PSBOT19TVFJJTkcpCgkJcmV0dXJuIC0xOwoKCWxlbiA9IDEyICsgX0FMSUdOKHN6 LCA0KTsKCWlmICghZnRfbWFrZV9zcGFjZShjeHQsICZjeHQtPnAsIEZUX1NUUlVDVCwgbGVuKSkK CQlyZXR1cm4gLTE7CgoJZnRfcHV0X3dvcmQoY3h0LCBPRl9EVF9QUk9QKTsKCWZ0X3B1dF93b3Jk KGN4dCwgc3opOwoJZnRfcHV0X3dvcmQoY3h0LCBvZmYpOwoJZnRfcHV0X2JpbihjeHQsIGRhdGEs IHN6KTsKCXJldHVybiAwOwp9CgppbnQgZnRfcHJvcF9zdHIoc3RydWN0IGZ0X2N4dCAqY3h0LCBj b25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdHIpCnsKCXJldHVybiBmdF9wcm9wKGN4dCwg bmFtZSwgc3RyLCBzdHJsZW4oc3RyKSArIDEpOwp9CgppbnQgZnRfcHJvcF9pbnQoc3RydWN0IGZ0 X2N4dCAqY3h0LCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgdmFsKQp7Cgl1MzIgdiA9 IGNwdV90b19iZTMyKCh1MzIpIHZhbCk7CgoJcmV0dXJuIGZ0X3Byb3AoY3h0LCBuYW1lLCAmdiwg NCk7Cn0KCi8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2ZWQgbWFwICovCnN0YXRp YyB1bnNpZ25lZCBsb25nIHJzdm1hcF9zaXplKHN0cnVjdCBmdF9jeHQgKmN4dCkKewoJc3RydWN0 IGZ0X3Jlc2VydmUgKnJlczsKCglyZXMgPSAoc3RydWN0IGZ0X3Jlc2VydmUgKikgY3h0LT5yZ25b RlRfUlNWTUFQXS5zdGFydDsKCXdoaWxlIChyZXMtPnN0YXJ0IHx8IHJlcy0+bGVuKQoJCSsrcmVz OwoJcmV0dXJuIChjaGFyICopKHJlcyArIDEpIC0gY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFydDsK fQoKLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgcmVnaW9uIGJ5IHN0ZXBwaW5n IHRocm91Z2ggaXQgKi8Kc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RydWN0X3NpemUoc3RydWN0IGZ0 X2N4dCAqY3h0KQp7CgljaGFyICpwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsKCWNoYXIg Km5leHQ7CglzdHJ1Y3QgZnRfYXRvbSBhdG9tOwoKCXdoaWxlICgobmV4dCA9IGZ0X25leHQoY3h0 LCBwLCAmYXRvbSkpICE9IE5VTEwpCgkJcCA9IG5leHQ7CglyZXR1cm4gcCArIDQgLSBjeHQtPnJn bltGVF9TVFJVQ1RdLnN0YXJ0Owp9CgovKiBhZGQgYGFkaicgb24gdG8gYWxsIHN0cmluZyBvZmZz ZXQgdmFsdWVzIGluIHRoZSBzdHJ1Y3QgYXJlYSAqLwpzdGF0aWMgdm9pZCBhZGp1c3Rfc3RyaW5n X29mZnNldHMoc3RydWN0IGZ0X2N4dCAqY3h0LCBpbnQgYWRqKQp7CgljaGFyICpwID0gY3h0LT5y Z25bRlRfU1RSVUNUXS5zdGFydDsKCWNoYXIgKm5leHQ7CglzdHJ1Y3QgZnRfYXRvbSBhdG9tOwoJ aW50IG9mZjsKCgl3aGlsZSAoKG5leHQgPSBmdF9uZXh0KGN4dCwgcCwgJmF0b20pKSAhPSBOVUxM KSB7CgkJaWYgKGF0b20udGFnID09IE9GX0RUX1BST1ApIHsKCQkJb2ZmID0gYmUzMl90b19jcHUo Kih1MzIgKikocCArIDgpKTsKCQkJKih1MzIgKikocCArIDgpID0gY3B1X3RvX2JlMzIob2ZmICsg YWRqKTsKCQl9CgkJcCA9IG5leHQ7Cgl9Cn0KCi8qIHN0YXJ0IGNvbnN0cnVjdGlvbiBvZiB0aGUg ZmxhdCBPRiB0cmVlIGZyb20gc2NyYXRjaCAqLwp2b2lkIGZ0X2JlZ2luKHN0cnVjdCBmdF9jeHQg KmN4dCwgdm9pZCAqYmxvYiwgdW5zaWduZWQgaW50IG1heF9zaXplLAoJICAgICAgdm9pZCAqKCpy ZWFsbG9jX2ZuKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpKQp7CglzdHJ1Y3QgYm9vdF9wYXJhbV9o ZWFkZXIgKmJwaCA9IGJsb2I7CgljaGFyICpwOwoJc3RydWN0IGZ0X3Jlc2VydmUgKnByZXM7CgoJ LyogY2xlYXIgdGhlIGN4dCAqLwoJbWVtc2V0KGN4dCwgMCwgc2l6ZW9mKCpjeHQpKTsKCgljeHQt PmJwaCA9IGJwaDsKCWN4dC0+bWF4X3NpemUgPSBtYXhfc2l6ZTsKCWN4dC0+cmVhbGxvYyA9IHJl YWxsb2NfZm47CgljeHQtPmlzb3JkZXJlZCA9IDE7CgoJLyogemVybyBldmVyeXRoaW5nIGluIHRo ZSBoZWFkZXIgYXJlYSAqLwoJbWVtc2V0KGJwaCwgMCwgc2l6ZW9mKCpicGgpKTsKCglicGgtPm1h Z2ljID0gY3B1X3RvX2JlMzIoT0ZfRFRfSEVBREVSKTsKCWJwaC0+dmVyc2lvbiA9IGNwdV90b19i ZTMyKDB4MTApOwoJYnBoLT5sYXN0X2NvbXBfdmVyc2lvbiA9IGNwdV90b19iZTMyKDB4MTApOwoK CS8qIHN0YXJ0IHBvaW50ZXJzICovCgljeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ID0gcCA9IGJs b2IgKyBIRFJfU0laRTsKCWN4dC0+cmduW0ZUX1JTVk1BUF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3Qg ZnRfcmVzZXJ2ZSk7CglwcmVzID0gKHN0cnVjdCBmdF9yZXNlcnZlICopIHA7CgljeHQtPnJnbltG VF9TVFJVQ1RdLnN0YXJ0ID0gcCArPSBzaXplb2Yoc3RydWN0IGZ0X3Jlc2VydmUpOwoJY3h0LT5y Z25bRlRfU1RSVUNUXS5zaXplID0gNDsKCWN4dC0+cmduW0ZUX1NUUklOR1NdLnN0YXJ0ID0gYmxv YiArIG1heF9zaXplOwoJY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZSA9IDA7CgoJLyogaW5pdCBy c3ZtYXAgYW5kIHN0cnVjdCAqLwoJcHJlcy0+c3RhcnQgPSAwOwoJcHJlcy0+bGVuID0gMDsKCSoo dTMyICopcCA9IGNwdV90b19iZTMyKE9GX0RUX0VORCk7CgoJY3h0LT5zdHJfYW5jaG9yID0gYmxv YjsKfQoKLyogb3BlbiB1cCBhbiBleGlzdGluZyBibG9iIHRvIGJlIGV4YW1pbmVkIG9yIG1vZGlm aWVkICovCmludCBmdF9vcGVuKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqYmxvYiwgdW5zaWdu ZWQgaW50IG1heF9zaXplLAoJICAgIHZvaWQgKigqcmVhbGxvY19mbikodm9pZCAqLCB1bnNpZ25l ZCBsb25nKSkKewoJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpicGggPSBibG9iOwoKCS8qIGNh bid0IGNvcGUgd2l0aCB2ZXJzaW9uIDwgMTYgKi8KCWlmIChiZTMyX3RvX2NwdShicGgtPnZlcnNp b24pIDwgMTYpCgkJcmV0dXJuIC0xOwoKCS8qIGNsZWFyIHRoZSBjeHQgKi8KCW1lbXNldChjeHQs IDAsIHNpemVvZigqY3h0KSk7CgoJY3h0LT5icGggPSBicGg7CgljeHQtPm1heF9zaXplID0gbWF4 X3NpemU7CgljeHQtPnJlYWxsb2MgPSByZWFsbG9jX2ZuOwoKCWN4dC0+cmduW0ZUX1JTVk1BUF0u c3RhcnQgPSBibG9iICsgYmUzMl90b19jcHUoYnBoLT5vZmZfbWVtX3Jzdm1hcCk7CgljeHQtPnJn bltGVF9SU1ZNQVBdLnNpemUgPSByc3ZtYXBfc2l6ZShjeHQpOwoJY3h0LT5yZ25bRlRfU1RSVUNU XS5zdGFydCA9IGJsb2IgKyBiZTMyX3RvX2NwdShicGgtPm9mZl9kdF9zdHJ1Y3QpOwoJY3h0LT5y Z25bRlRfU1RSVUNUXS5zaXplID0gc3RydWN0X3NpemUoY3h0KTsKCWN4dC0+cmduW0ZUX1NUUklO R1NdLnN0YXJ0ID0gYmxvYiArIGJlMzJfdG9fY3B1KGJwaC0+b2ZmX2R0X3N0cmluZ3MpOwoJY3h0 LT5yZ25bRlRfU1RSSU5HU10uc2l6ZSA9IGJlMzJfdG9fY3B1KGJwaC0+ZHRfc3RyaW5nc19zaXpl KTsKCWN4dC0+aXNvcmRlcmVkID0gZnRfb3JkZXJlZChjeHQpOwoKCWN4dC0+cCA9IGN4dC0+cmdu W0ZUX1NUUlVDVF0uc3RhcnQ7CgljeHQtPnN0cl9hbmNob3IgPSBjeHQtPnJnbltGVF9TVFJJTkdT XS5zdGFydDsKCglyZXR1cm4gMDsKfQoKLyogYWRkIGEgcmVzZXJ2ZXIgcGh5c2ljYWwgYXJlYSB0 byB0aGUgcnN2bWFwICovCmludCBmdF9hZGRfcnN2bWFwKHN0cnVjdCBmdF9jeHQgKmN4dCwgdTY0 IHBoeXNhZGRyLCB1NjQgc2l6ZSkKewoJY2hhciAqcDsKCXN0cnVjdCBmdF9yZXNlcnZlICpwcmVz OwoKCXAgPSBjeHQtPnJnbltGVF9SU1ZNQVBdLnN0YXJ0ICsgY3h0LT5yZ25bRlRfUlNWTUFQXS5z aXplCgkJLSBzaXplb2Yoc3RydWN0IGZ0X3Jlc2VydmUpOwoJaWYgKCFmdF9tYWtlX3NwYWNlKGN4 dCwgJnAsIEZUX1JTVk1BUCwgc2l6ZW9mKHN0cnVjdCBmdF9yZXNlcnZlKSkpCgkJcmV0dXJuIC0x OwoKCXByZXMgPSAoc3RydWN0IGZ0X3Jlc2VydmUgKikgcDsKCXByZXMtPnN0YXJ0ID0gY3B1X3Rv X2JlNjQocGh5c2FkZHIpOwoJcHJlcy0+bGVuID0gY3B1X3RvX2JlNjQoc2l6ZSk7CgoJcmV0dXJu IDA7Cn0KCnZvaWQgZnRfYmVnaW5fdHJlZShzdHJ1Y3QgZnRfY3h0ICpjeHQpCnsKCWN4dC0+cCA9 IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7Cn0KCnZvaWQgZnRfZW5kX3RyZWUoc3RydWN0IGZ0 X2N4dCAqY3h0KQp7CglzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJwaCA9IGN4dC0+YnBoOwoJ Y2hhciAqcCwgKm9sZHN0ciwgKnN0ciwgKmVuZHA7Cgl1bnNpZ25lZCBsb25nIHNzaXplOwoKCWlm ICghY3h0LT5pc29yZGVyZWQpCgkJcmV0dXJuOwkJLyogd2UgaGF2ZW4ndCB0b3VjaGVkIGFueXRo aW5nICovCgoJLyogYWRqdXN0IHN0cmluZyBvZmZzZXRzICovCglvbGRzdHIgPSBjeHQtPnJnbltG VF9TVFJJTkdTXS5zdGFydDsKCWFkanVzdF9zdHJpbmdfb2Zmc2V0cyhjeHQsIGN4dC0+c3RyX2Fu Y2hvciAtIG9sZHN0cik7CgoJLyogbWFrZSBzdHJpbmdzIGVuZCBvbiA4LWJ5dGUgYm91bmRhcnkg Ki8KCXNzaXplID0gY3h0LT5yZ25bRlRfU1RSSU5HU10uc2l6ZTsKCWVuZHAgPSAoY2hhciAqKV9B TElHTigodW5zaWduZWQgbG9uZykgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydAoJCQkgICAgICAr IGN4dC0+cmduW0ZUX1NUUlVDVF0uc2l6ZSArIHNzaXplLCA4KTsKCXN0ciA9IGVuZHAgLSBzc2l6 ZTsKCgkvKiBtb3ZlIHN0cmluZ3MgZG93biB0byBlbmQgb2Ygc3RydWN0cyAqLwoJbWVtbW92ZShz dHIsIG9sZHN0ciwgc3NpemUpOwoJY3h0LT5zdHJfYW5jaG9yID0gc3RyOwoJY3h0LT5yZ25bRlRf U1RSSU5HU10uc3RhcnQgPSBzdHI7CgoJLyogZmlsbCBpbiBoZWFkZXIgZmllbGRzICovCglwID0g KGNoYXIgKikgYnBoOwoJYnBoLT50b3RhbHNpemUgPSBjcHVfdG9fYmUzMihlbmRwIC0gcCk7Cgli cGgtPm9mZl9tZW1fcnN2bWFwID0gY3B1X3RvX2JlMzIoY3h0LT5yZ25bRlRfUlNWTUFQXS5zdGFy dCAtIHApOwoJYnBoLT5vZmZfZHRfc3RydWN0ID0gY3B1X3RvX2JlMzIoY3h0LT5yZ25bRlRfU1RS VUNUXS5zdGFydCAtIHApOwoJYnBoLT5vZmZfZHRfc3RyaW5ncyA9IGNwdV90b19iZTMyKGN4dC0+ cmduW0ZUX1NUUklOR1NdLnN0YXJ0IC0gcCk7CglicGgtPmR0X3N0cmluZ3Nfc2l6ZSA9IGNwdV90 b19iZTMyKHNzaXplKTsKfQoKdm9pZCAqZnRfZmluZF9kZXZpY2Uoc3RydWN0IGZ0X2N4dCAqY3h0 LCBjb25zdCBjaGFyICpzcmNoX3BhdGgpCnsKCS8qIHJlcXVpcmUgYWJzb2x1dGUgcGF0aCAqLwoJ aWYgKHNyY2hfcGF0aFswXSAhPSAnLycpCgkJcmV0dXJuIE5VTEw7CglyZXR1cm4gZnRfZmluZF9k ZXNjZW5kZW50KGN4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwgc3JjaF9wYXRoKTsKfQoK dm9pZCAqZnRfZmluZF9kZXNjZW5kZW50KHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqdG9wLCBj b25zdCBjaGFyICpzcmNoX3BhdGgpCnsKCXN0cnVjdCBmdF9hdG9tIGF0b207CgljaGFyICpwOwoJ Y29uc3QgY2hhciAqY3AsICpxOwoJaW50IGNsOwoJaW50IGRlcHRoID0gLTE7CglpbnQgZG1hdGNo ID0gMDsKCWNvbnN0IGNoYXIgKnBhdGhfY29tcFtGVF9NQVhfREVQVEhdOwoKCWNwID0gc3JjaF9w YXRoOwoJY2wgPSAwOwoJcCA9IHRvcDsKCgl3aGlsZSAoKHAgPSBmdF9uZXh0KGN4dCwgcCwgJmF0 b20pKSAhPSBOVUxMKSB7CgkJc3dpdGNoIChhdG9tLnRhZykgewoJCWNhc2UgT0ZfRFRfQkVHSU5f Tk9ERToKCQkJKytkZXB0aDsKCQkJaWYgKGRlcHRoICE9IGRtYXRjaCkKCQkJCWJyZWFrOwoJCQlj eHQtPmdlbmVhbG9neVtkZXB0aF0gPSBhdG9tLmRhdGE7CgkJCWN4dC0+Z2VuZWFsb2d5W2RlcHRo KzFdID0gTlVMTDsKCQkJaWYgKGRlcHRoICYmICEoc3RybmNtcChhdG9tLm5hbWUsIGNwLCBjbCkg PT0gMCAmJgoJCQkJICAgICAgIChhdG9tLm5hbWVbY2xdID09IDAgfHwKCQkJCQlhdG9tLm5hbWVb Y2xdID09ICdAJykpKQoJCQkJYnJlYWs7CgkJCXBhdGhfY29tcFtkbWF0Y2hdID0gY3A7CgkJCS8q IGl0IG1hdGNoZXMgc28gZmFyLCBhZHZhbmNlIHRvIG5leHQgcGF0aCBjb21wb25lbnQgKi8KCQkJ Y3AgKz0gY2w7CgkJCS8qIHNraXAgc2xhc2hlcyAqLwoJCQl3aGlsZSAoKmNwID09ICcvJykKCQkJ CSsrY3A7CgkJCS8qIHdlJ3JlIGRvbmUgaWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcg Ki8KCQkJaWYgKCpjcCA9PSAwKQoJCQkJcmV0dXJuIGF0b20uZGF0YTsKCQkJLyogbG9vayBmb3Ig ZW5kIG9mIHRoaXMgY29tcG9uZW50ICovCgkJCXEgPSBzdHJjaHIoY3AsICcvJyk7CgkJCWlmIChx KQoJCQkJY2wgPSBxIC0gc3JjaF9wYXRoOwoJCQllbHNlCgkJCQljbCA9IHN0cmxlbihjcCk7CgkJ CSsrZG1hdGNoOwoJCQlicmVhazsKCQljYXNlIE9GX0RUX0VORF9OT0RFOgoJCQlpZiAoZGVwdGgg PT0gMCkKCQkJCXJldHVybiBOVUxMOwoJCQlpZiAoZG1hdGNoID4gZGVwdGgpIHsKCQkJCS0tZG1h dGNoOwoJCQkJY2wgPSBjcCAtIHBhdGhfY29tcFtkbWF0Y2hdIC0gMTsKCQkJCWNwID0gcGF0aF9j b21wW2RtYXRjaF07CgkJCQl3aGlsZSAoY2wgPiAwICYmIGNwW2NsLTFdID09ICcvJykKCQkJCQkt LWNsOwoJCQl9CgkJCS0tZGVwdGg7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiBOVUxMOwp9Cgp2 b2lkICpmdF9nZXRfcGFyZW50KHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqbm9kZSkKewoJaW50 IGQ7CglzdHJ1Y3QgZnRfYXRvbSBhdG9tOwoJY2hhciAqcDsKCglmb3IgKGQgPSAwOyBjeHQtPmdl bmVhbG9neVtkXSAhPSBOVUxMOyArK2QpCgkJaWYgKGN4dC0+Z2VuZWFsb2d5W2RdID09IG5vZGUp CgkJCXJldHVybiBjeHQtPmdlbmVhbG9neVtkID4gMD8gZCAtIDE6IDBdOwoKCS8qIGhhdmUgdG8g ZG8gaXQgdGhlIGhhcmQgd2F5Li4uICovCglwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsK CWQgPSAwOwoJd2hpbGUgKChwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgewoJ CXN3aXRjaCAoYXRvbS50YWcpIHsKCQljYXNlIE9GX0RUX0JFR0lOX05PREU6CgkJCWN4dC0+Z2Vu ZWFsb2d5W2RdID0gYXRvbS5kYXRhOwoJCQlpZiAobm9kZSA9PSBhdG9tLmRhdGEpIHsKCQkJCS8q IGZvdW5kIGl0ICovCgkJCQljeHQtPmdlbmVhbG9neVtkKzFdID0gTlVMTDsKCQkJCXJldHVybiBk ID4gMD8gY3h0LT5nZW5lYWxvZ3lbZC0xXTogbm9kZTsKCQkJfQoJCQkrK2Q7CgkJCWJyZWFrOwoJ CWNhc2UgT0ZfRFRfRU5EX05PREU6CgkJCS0tZDsKCQkJYnJlYWs7CgkJfQoJfQp9CgppbnQgZnRf Z2V0X3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpub2RlLCBjb25zdCBjaGFy ICpwcm9wbmFtZSwKCQl2b2lkICpidWYsIGNvbnN0IHVuc2lnbmVkIGludCBidWZsZW4pCnsKCXN0 cnVjdCBmdF9hdG9tIGF0b207CgljaGFyICpwOwoJaW50IGRlcHRoOwoJdW5zaWduZWQgaW50IHNp emU7CgoJZGVwdGggPSAwOwoJcCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CgoJd2hpbGUg KChwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgewoJCXN3aXRjaCAoYXRvbS50 YWcpIHsKCQljYXNlIE9GX0RUX0JFR0lOX05PREU6CgkJCWlmIChkZXB0aCkKCQkJCXJldHVybiAt MTsKCQkJZGVwdGggPSAxOwoJCQlicmVhazsKCQljYXNlIE9GX0RUX1BST1A6CgkJCWlmIChzdHJj bXAoYXRvbS5uYW1lLCBwcm9wbmFtZSkpCgkJCQlicmVhazsKCQkJc2l6ZSA9IG1pbihhdG9tLnNp emUsIGJ1Zmxlbik7CgkJCW1lbWNweShidWYsIGF0b20uZGF0YSwgc2l6ZSk7CgkJCXJldHVybiBh dG9tLnNpemU7CgkJY2FzZSBPRl9EVF9FTkRfTk9ERToKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCXJl dHVybiAtMTsKfQoKaW50IGZ0X3NldF9wcm9wKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqbm9k ZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsCgkJY29uc3Qgdm9pZCAqYnVmLCBjb25zdCB1bnNpZ25l ZCBpbnQgYnVmbGVuKQp7CglzdHJ1Y3QgZnRfYXRvbSBhdG9tOwoJY2hhciAqcCwgKm5leHQ7Cglp bnQgbmV4dHJhOwoKCXAgPSBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0OwoKCS8qIHNraXAgaW5p dGlhbCBPRl9EVF9CRUdJTl9OT0RFICovCglwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKTsKCWlm IChwID09IE5VTEwgfHwgYXRvbS50YWcgIT0gT0ZfRFRfQkVHSU5fTk9ERSkKCQlyZXR1cm4gLTE7 CgoJd2hpbGUgKChuZXh0ID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgewoJCXN3 aXRjaCAoYXRvbS50YWcpIHsKCQljYXNlIE9GX0RUX0JFR0lOX05PREU6CgkJY2FzZSBPRl9EVF9F TkRfTk9ERToKCQkJLyogaGF2ZW4ndCBmb3VuZCB0aGUgcHJvcGVydHksIGluc2VydCBoZXJlICov CgkJCWN4dC0+cCA9IHA7CgkJCXJldHVybiBmdF9wcm9wKGN4dCwgcHJvcG5hbWUsIGJ1ZiwgYnVm bGVuKTsKCQljYXNlIE9GX0RUX1BST1A6CgkJCWlmIChzdHJjbXAoYXRvbS5uYW1lLCBwcm9wbmFt ZSkpCgkJCQlicmVhazsKCQkJLyogZm91bmQgYW4gZXhpc3RpbmcgcHJvcGVydHksIG92ZXJ3cml0 ZSBpdCAqLwoJCQluZXh0cmEgPSBfQUxJR04oYnVmbGVuLCA0KSAtIF9BTElHTihhdG9tLnNpemUs IDQpOwoJCQljeHQtPnAgPSBhdG9tLmRhdGE7CgkJCWlmICghZnRfbWFrZV9zcGFjZShjeHQsICZj eHQtPnAsIEZUX1NUUlVDVCwgbmV4dHJhKSkKCQkJCXJldHVybiAtMTsKCQkJKih1MzIgKikoY3h0 LT5wIC0gOCkgPSBjcHVfdG9fYmUzMihidWZsZW4pOwoJCQlmdF9wdXRfYmluKGN4dCwgYnVmLCBi dWZsZW4pOwoJCQlyZXR1cm4gMDsKCQl9CgkJcCA9IG5leHQ7Cgl9CglyZXR1cm4gLTE7Cn0KCmlu dCBmdF9kZWxfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHZvaWQgKm5vZGUsIGNvbnN0IGNoYXIg KnByb3BuYW1lKQp7CglzdHJ1Y3QgZnRfYXRvbSBhdG9tOwoJY2hhciAqcCwgKm5leHQ7CglpbnQg c2l6ZTsKCglwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsKCgkvKiBza2lwIGluaXRpYWwg T0ZfRFRfQkVHSU5fTk9ERSAqLwoJcCA9IGZ0X25leHQoY3h0LCBwLCAmYXRvbSk7CglpZiAocCA9 PSBOVUxMIHx8IGF0b20udGFnICE9IE9GX0RUX0JFR0lOX05PREUpCgkJcmV0dXJuIC0xOwoKCXdo aWxlICgobmV4dCA9IGZ0X25leHQoY3h0LCBwLCAmYXRvbSkpICE9IE5VTEwpIHsKCQlzd2l0Y2gg KGF0b20udGFnKSB7CgkJY2FzZSBPRl9EVF9CRUdJTl9OT0RFOgoJCWNhc2UgT0ZfRFRfRU5EX05P REU6CgkJCXJldHVybiAtMTsKCQljYXNlIE9GX0RUX1BST1A6CgkJCWlmIChzdHJjbXAoYXRvbS5u YW1lLCBwcm9wbmFtZSkpCgkJCQlicmVhazsKCQkJLyogZm91bmQgdGhlIHByb3BlcnR5LCByZW1v dmUgaXQgKi8KCQkJc2l6ZSA9IDEyICsgLSBfQUxJR04oYXRvbS5zaXplLCA0KTsKCQkJY3h0LT5w ID0gcDsKCQkJaWYgKCFmdF9tYWtlX3NwYWNlKGN4dCwgJmN4dC0+cCwgRlRfU1RSVUNULCAtc2l6 ZSkpCgkJCQlyZXR1cm4gLTE7CgkJCXJldHVybiAwOwoJCX0KCQlwID0gbmV4dDsKCX0KCXJldHVy biAtMTsKfQoKdm9pZCAqZnRfY3JlYXRlX25vZGUoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2 b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKnBhdGgpCnsKCXN0cnVjdCBmdF9hdG9tIGF0b207Cglj aGFyICpwLCAqbmV4dDsKCWludCBkZXB0aCA9IDA7CgoJcCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0u c3RhcnQ7Cgl3aGlsZSAoKG5leHQgPSBmdF9uZXh0KGN4dCwgcCwgJmF0b20pKSAhPSBOVUxMKSB7 CgkJc3dpdGNoIChhdG9tLnRhZykgewoJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKCQkJKytkZXB0 aDsKCQkJaWYgKGRlcHRoID09IDEgJiYgc3RyY21wKGF0b20ubmFtZSwgcGF0aCkgPT0gMCkKCQkJ CS8qIGR1cGxpY2F0ZSBub2RlIHBhdGgsIHJldHVybiBlcnJvciAqLwoJCQkJcmV0dXJuIE5VTEw7 CgkJCWJyZWFrOwoJCWNhc2UgT0ZfRFRfRU5EX05PREU6CgkJCS0tZGVwdGg7CgkJCWlmIChkZXB0 aCA+IDApCgkJCQlicmVhazsKCQkJLyogZW5kIG9mIG5vZGUsIGluc2VydCBoZXJlICovCgkJCWN4 dC0+cCA9IHA7CgkJCWZ0X2JlZ2luX25vZGUoY3h0LCBwYXRoKTsKCQkJZnRfZW5kX25vZGUoY3h0 KTsKCQkJcmV0dXJuIHA7CgkJfQoJCXAgPSBuZXh0OwoJfQp9Cg== --IXz5sly6Gd Content-Type: application/x-chdr Content-Description: flatdevtree.h Content-Disposition: attachment; filename="flatdevtree.h" Content-Transfer-Encoding: base64 LyoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK ICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy ZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v ciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgogKi8KCiNpZm5kZWYgRkxBVERFVlRSRUVf SAojZGVmaW5lIEZMQVRERVZUUkVFX0gKCiNpbmNsdWRlICJ0eXBlcy5oIgoKLyogRGVmaW5pdGlv bnMgdXNlZCBieSB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlICovCiNkZWZpbmUgT0ZfRFRfSEVB REVSICAgICAgICAgICAgMHhkMDBkZmVlZCAgICAgIC8qIG1hcmtlciAqLwojZGVmaW5lIE9GX0RU X0JFR0lOX05PREUgICAgICAgIDB4MSAgICAgLyogU3RhcnQgb2Ygbm9kZSwgZnVsbCBuYW1lICov CiNkZWZpbmUgT0ZfRFRfRU5EX05PREUgICAgICAgICAgMHgyICAgICAvKiBFbmQgbm9kZSAqLwoj ZGVmaW5lIE9GX0RUX1BST1AgICAgICAgICAgICAgIDB4MyAgICAgLyogUHJvcGVydHk6IG5hbWUg b2ZmLCBzaXplLCBjb250ZW50ICovCiNkZWZpbmUgT0ZfRFRfTk9QICAgICAgICAgICAgICAgMHg0 ICAgICAvKiBub3AgKi8KI2RlZmluZSBPRl9EVF9FTkQgICAgICAgICAgICAgICAweDkKCiNkZWZp bmUgT0ZfRFRfVkVSU0lPTiAgICAgICAgICAgMHgxMAoKc3RydWN0IGJvb3RfcGFyYW1faGVhZGVy IHsKCXUzMiBtYWdpYzsgICAgICAgICAgICAgIC8qIG1hZ2ljIHdvcmQgT0ZfRFRfSEVBREVSICov Cgl1MzIgdG90YWxzaXplOyAgICAgICAgICAvKiB0b3RhbCBzaXplIG9mIERUIGJsb2NrICovCgl1 MzIgb2ZmX2R0X3N0cnVjdDsgICAgICAvKiBvZmZzZXQgdG8gc3RydWN0dXJlICovCgl1MzIgb2Zm X2R0X3N0cmluZ3M7ICAgICAvKiBvZmZzZXQgdG8gc3RyaW5ncyAqLwoJdTMyIG9mZl9tZW1fcnN2 bWFwOyAgICAgLyogb2Zmc2V0IHRvIG1lbW9yeSByZXNlcnZlIG1hcCAqLwoJdTMyIHZlcnNpb247 ICAgICAgICAgICAgLyogZm9ybWF0IHZlcnNpb24gKi8KCXUzMiBsYXN0X2NvbXBfdmVyc2lvbjsg IC8qIGxhc3QgY29tcGF0aWJsZSB2ZXJzaW9uICovCgkvKiB2ZXJzaW9uIDIgZmllbGRzIGJlbG93 ICovCgl1MzIgYm9vdF9jcHVpZF9waHlzOyAgICAvKiBQaHlzaWNhbCBDUFUgaWQgd2UncmUgYm9v dGluZyBvbiAqLwoJLyogdmVyc2lvbiAzIGZpZWxkcyBiZWxvdyAqLwoJdTMyIGR0X3N0cmluZ3Nf c2l6ZTsgICAgLyogc2l6ZSBvZiB0aGUgRFQgc3RyaW5ncyBibG9jayAqLwp9OwoKc3RydWN0IGZ0 X3Jlc2VydmUgewoJdTY0IHN0YXJ0OwoJdTY0IGxlbjsKfTsKCnN0cnVjdCBmdF9yZWdpb24gewoJ Y2hhciAqc3RhcnQ7Cgl1bnNpZ25lZCBsb25nIHNpemU7Cn07CgplbnVtIGZ0X3Jnbl9pZCB7CglG VF9SU1ZNQVAsCglGVF9TVFJVQ1QsCglGVF9TVFJJTkdTLAoJRlRfTl9SRUdJT04KfTsKCiNkZWZp bmUgRlRfTUFYX0RFUFRICTUwCgpzdHJ1Y3QgZnRfY3h0IHsKCXN0cnVjdCBib290X3BhcmFtX2hl YWRlciAqYnBoOwoJaW50IG1heF9zaXplOyAgICAgICAgICAgLyogbWF4aW11bSBzaXplIG9mIHRy ZWUgKi8KCWludCBpc29yZGVyZWQ7CQkvKiBldmVyeXRoaW5nIGluIHN0YW5kYXJkIG9yZGVyICov Cgl2b2lkICooKnJlYWxsb2MpKHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7CgljaGFyICpzdHJfYW5j aG9yOwoJY2hhciAqcDsJCS8qIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50IGluIHN0cnVjdHMgKi8K CXN0cnVjdCBmdF9yZWdpb24gcmduW0ZUX05fUkVHSU9OXTsKCXZvaWQgKmdlbmVhbG9neVtGVF9N QVhfREVQVEgrMV07Cn07CgppbnQgZnRfYmVnaW5fbm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNv bnN0IGNoYXIgKm5hbWUpOwp2b2lkIGZ0X2VuZF9ub2RlKHN0cnVjdCBmdF9jeHQgKmN4dCk7Cgp2 b2lkIGZ0X2JlZ2luX3RyZWUoc3RydWN0IGZ0X2N4dCAqY3h0KTsKdm9pZCBmdF9lbmRfdHJlZShz dHJ1Y3QgZnRfY3h0ICpjeHQpOwoKdm9pZCBmdF9ub3Aoc3RydWN0IGZ0X2N4dCAqY3h0KTsKaW50 IGZ0X3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCBjaGFyICpuYW1lLAoJICAgIGNvbnN0 IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzeik7CmludCBmdF9wcm9wX3N0cihzdHJ1Y3QgZnRf Y3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN0cik7CmludCBmdF9wcm9w X2ludChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCB2 YWwpOwp2b2lkIGZ0X2JlZ2luKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqYmxvYiwgdW5zaWdu ZWQgaW50IG1heF9zaXplLAoJICAgICAgdm9pZCAqKCpyZWFsbG9jX2ZuKSh2b2lkICosIHVuc2ln bmVkIGxvbmcpKTsKaW50IGZ0X29wZW4oc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICpibG9iLCB1 bnNpZ25lZCBpbnQgbWF4X3NpemUsCgkgICAgdm9pZCAqKCpyZWFsbG9jX2ZuKSh2b2lkICosIHVu c2lnbmVkIGxvbmcpKTsKaW50IGZ0X2FkZF9yc3ZtYXAoc3RydWN0IGZ0X2N4dCAqY3h0LCB1NjQg cGh5c2FkZHIsIHU2NCBzaXplKTsKCnZvaWQgZnRfZHVtcF9ibG9iKGNvbnN0IHZvaWQgKmJwaHAp Owp2b2lkIGZ0X21lcmdlX2Jsb2Ioc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICpibG9iKTsKdm9p ZCAqZnRfZmluZF9kZXZpY2Uoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCBjaGFyICpzcmNoX3Bh dGgpOwp2b2lkICpmdF9maW5kX2Rlc2NlbmRlbnQoc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICp0 b3AsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCk7CmludCBmdF9nZXRfcHJvcChzdHJ1Y3QgZnRfY3h0 ICpjeHQsIGNvbnN0IHZvaWQgKm5vZGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAoJCXZvaWQgKmJ1 ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1Zmxlbik7CmludCBmdF9zZXRfcHJvcChzdHJ1Y3QgZnRf Y3h0ICpjeHQsIHZvaWQgKm5vZGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAoJCWNvbnN0IHZvaWQg KmJ1ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1Zmxlbik7CgpzdGF0aWMgaW5saW5lIGNoYXIgKmZ0 X3N0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCnsKCWNvbnN0IGNoYXIgKnAgPSBzICsgc3Ry bGVuKHMpOwoKCWRvIHsKCQlpZiAoKnAgPT0gKGNoYXIpYykKCQkJcmV0dXJuIChjaGFyICopcDsK CX0gd2hpbGUgKC0tcCA+PSBzKTsKCXJldHVybiBOVUxMOwp9CgovKiAncGF0aCcgaXMgbW9kaWZp ZWQgKi8Kc3RhdGljIGlubGluZSB2b2lkIGZ0X3BhcmVudGl6ZShjaGFyICpwYXRoLCB1OCBsZWF2 ZV9zbGFzaCkKewoJY2hhciAqcyA9ICZwYXRoW3N0cmxlbihwYXRoKSAtIDFdOwoKCWlmICgqcyA9 PSAnLycpCgkJKnMgPSAnXDAnOwoJcyA9IGZ0X3N0cnJjaHIocGF0aCwgJy8nKTsKCWlmIChzICE9 IE5VTEwpIHsKCQlpZiAobGVhdmVfc2xhc2gpCgkJCXNbMV0gPSAnXDAnOwoJCWVsc2UgaWYgKHNb MF0gPT0gJy8nKQoJCQlzWzBdID0gJ1wwJzsKCX0KfQojZW5kaWYgLyogRkxBVERFVlRSRUVfSCAq Lwo= --IXz5sly6Gd--