From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: [PATCH v3 08/18] xen: duplicate xen_disk.c as basis of dataplane/xen-block.c Date: Tue, 11 Dec 2018 10:47:08 +0000 Message-ID: <1544525238-3527-9-git-send-email-paul.durrant@citrix.com> References: <1544525238-3527-1-git-send-email-paul.durrant@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gWfZo-00053G-UI for xen-devel@lists.xenproject.org; Tue, 11 Dec 2018 10:47:45 +0000 In-Reply-To: <1544525238-3527-1-git-send-email-paul.durrant@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: qemu-devel@nongnu.org, qemu-block@nongnu.org, xen-devel@lists.xenproject.org Cc: Kevin Wolf , Paul Durrant , Stefano Stabellini , Stefan Hajnoczi , Max Reitz List-Id: xen-devel@lists.xenproject.org VGhlIG5ldyB4ZW4tYmxvY2sgWGVuRGV2aWNlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIHRoZSBz YW1lIGNvcmUKZGF0YXBsYW5lIGFzIHRoZSBsZWdhY3kgeGVuX2Rpc2sgaW1wbGVtZW50YXRpb24g aXQgd2lsbCBldmVudHVhbGx5IHJlcGxhY2UuClRoaXMgcGF0Y2ggdGhlcmVmb3JlIGNvcGllcyB0 aGUgbGVnYWN5IHhlbl9kaXNrLmMgc291cmNlIG1vZHVsZSBpbnRvIGEgbmV3CmRhdGFwbGFuZS94 ZW4tYmxvY2suYyBzb3VyY2UgbW9kdWxlIGFzIHRoZSBiYXNpcyBmb3IgdGhlIG5ldyBkYXRhcGxh bmUgYW5kCmFkanVzdHMgdGhlIE1BSU5UQUlORVJTIGZpbGUgYWNjb3JkaW5nbHkuCgpOT1RFOiBU aGUgZHVwbGljYXRlZCBjb2RlIGlzIG5vdCB5ZXQgYnVpbHQuIEl0IGlzIHNpbXBseSBwdXQgaW50 byBwbGFjZSBieQogICAgICB0aGlzIHBhdGNoIChqdXN0IGZpeGluZyBzdHlsZSB2aW9sYXRpb25z KSBzdWNoIHRoYXQgdGhlCiAgICAgIG1vZGlmaWNhdGlvbnMgdGhhdCB3aWxsIG5lZWQgdG8gYmUg bWFkZSB0byB0aGUgY29kZSBhcmUgbm90CiAgICAgIGNvbmZsYXRlZCB3aXRoIGNvZGUgbW92ZW1l bnQsIHRodXMgbWFraW5nIHJldmlldyBoYXJkZXIuCgpTaWduZWQtb2ZmLWJ5OiBQYXVsIER1cnJh bnQgPHBhdWwuZHVycmFudEBjaXRyaXguY29tPgpBY2tlZC1ieTogQW50aG9ueSBQZXJhcmQgPGFu dGhvbnkucGVyYXJkQGNpdHJpeC5jb20+Ci0tLQpDYzogU3RlZmFubyBTdGFiZWxsaW5pIDxzc3Rh YmVsbGluaUBrZXJuZWwub3JnPgpDYzogU3RlZmFuIEhham5vY3ppIDxzdGVmYW5oYUByZWRoYXQu Y29tPgpDYzogS2V2aW4gV29sZiA8a3dvbGZAcmVkaGF0LmNvbT4KQ2M6IE1heCBSZWl0eiA8bXJl aXR6QHJlZGhhdC5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgIHwgICAg MSArCiBody9ibG9jay9kYXRhcGxhbmUveGVuLWJsb2NrLmMgfCAxMDE5ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTAyMCBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaHcvYmxvY2svZGF0YXBsYW5lL3hlbi1ibG9jay5j CgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBkZDcyOGMzLi5h YjYyYWQ0IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNDA0 LDYgKzQwNCw3IEBAIEY6IGh3L2NoYXIveGVuX2NvbnNvbGUuYwogRjogaHcvZGlzcGxheS94ZW5m Yi5jCiBGOiBody9uZXQveGVuX25pYy5jCiBGOiBody9ibG9jay94ZW4qCitGOiBody9ibG9jay9k YXRhcGxhbmUveGVuKgogRjogaHcveGVuLwogRjogaHcveGVucHYvCiBGOiBody9pMzg2L3hlbi8K ZGlmZiAtLWdpdCBhL2h3L2Jsb2NrL2RhdGFwbGFuZS94ZW4tYmxvY2suYyBiL2h3L2Jsb2NrL2Rh dGFwbGFuZS94ZW4tYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45 ZmFlNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvaHcvYmxvY2svZGF0YXBsYW5lL3hlbi1ibG9jay5j CkBAIC0wLDAgKzEsMTAxOSBAQAorLyoKKyAqICB4ZW4gcGFyYXZpcnQgYmxvY2sgZGV2aWNlIGJh Y2tlbmQKKyAqCisgKiAgKGMpIEdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgorICoK KyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgdW5kZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBw cm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgor ICogIENvbnRyaWJ1dGlvbnMgYWZ0ZXIgMjAxMi0wMS0xMyBhcmUgbGljZW5zZWQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZQorICogIEdOVSBHUEwsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24p IGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5j bHVkZSAicWVtdS91bml0cy5oIgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5 cy91aW8uaD4KKworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcveGVuL3hlbl9iYWNr ZW5kLmgiCisjaW5jbHVkZSAieGVuX2Jsa2lmLmgiCisjaW5jbHVkZSAic3lzZW11L2Jsb2NrZGV2 LmgiCisjaW5jbHVkZSAic3lzZW11L2lvdGhyZWFkLmgiCisjaW5jbHVkZSAic3lzZW11L2Jsb2Nr LWJhY2tlbmQuaCIKKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAv cWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xc3RyaW5nLmgiCisjaW5jbHVkZSAidHJhY2Uu aCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJMT0NLX1NJWkUgIDUxMgorI2RlZmluZSBJT0NC X0NPVU5UICAoQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUICsgMikKKworc3RydWN0IGlv cmVxIHsKKyAgICBibGtpZl9yZXF1ZXN0X3QgICAgIHJlcTsKKyAgICBpbnQxNl90ICAgICAgICAg ICAgIHN0YXR1czsKKworICAgIC8qIHBhcnNlZCByZXF1ZXN0ICovCisgICAgb2ZmX3QgICAgICAg ICAgICAgICBzdGFydDsKKyAgICBRRU1VSU9WZWN0b3IgICAgICAgIHY7CisgICAgdm9pZCAgICAg ICAgICAgICAgICAqYnVmOworICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKKyAgICBpbnQg ICAgICAgICAgICAgICAgIHByZXN5bmM7CisKKyAgICAvKiBhaW8gc3RhdHVzICovCisgICAgaW50 ICAgICAgICAgICAgICAgICBhaW9faW5mbGlnaHQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBh aW9fZXJyb3JzOworCisgICAgc3RydWN0IFhlbkJsa0RldiAgICAqYmxrZGV2OworICAgIFFMSVNU X0VOVFJZKGlvcmVxKSAgIGxpc3Q7CisgICAgQmxvY2tBY2N0Q29va2llICAgICBhY2N0OworfTsK KworI2RlZmluZSBNQVhfUklOR19QQUdFX09SREVSIDQKKworc3RydWN0IFhlbkJsa0RldiB7Cisg ICAgc3RydWN0IFhlbkxlZ2FjeURldmljZSAgICB4ZW5kZXY7ICAvKiBtdXN0IGJlIGZpcnN0ICov CisgICAgY2hhciAgICAgICAgICAgICAgICAqcGFyYW1zOworICAgIGNoYXIgICAgICAgICAgICAg ICAgKm1vZGU7CisgICAgY2hhciAgICAgICAgICAgICAgICAqdHlwZTsKKyAgICBjaGFyICAgICAg ICAgICAgICAgICpkZXY7CisgICAgY2hhciAgICAgICAgICAgICAgICAqZGV2dHlwZTsKKyAgICBi b29sICAgICAgICAgICAgICAgIGRpcmVjdGlvc2FmZTsKKyAgICBjb25zdCBjaGFyICAgICAgICAg ICpmaWxlcHJvdG87CisgICAgY29uc3QgY2hhciAgICAgICAgICAqZmlsZW5hbWU7CisgICAgdW5z aWduZWQgaW50ICAgICAgICByaW5nX3JlZlsxIDw8IE1BWF9SSU5HX1BBR0VfT1JERVJdOworICAg IHVuc2lnbmVkIGludCAgICAgICAgbnJfcmluZ19yZWY7CisgICAgdm9pZCAgICAgICAgICAgICAg ICAqc3Jpbmc7CisgICAgaW50NjRfdCAgICAgICAgICAgICBmaWxlX2JsazsKKyAgICBpbnQ2NF90 ICAgICAgICAgICAgIGZpbGVfc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHByb3RvY29s OworICAgIGJsa2lmX2JhY2tfcmluZ3NfdCAgcmluZ3M7CisgICAgaW50ICAgICAgICAgICAgICAg ICBtb3JlX3dvcms7CisKKyAgICAvKiByZXF1ZXN0IGxpc3RzICovCisgICAgUUxJU1RfSEVBRChp bmZsaWdodF9oZWFkLCBpb3JlcSkgaW5mbGlnaHQ7CisgICAgUUxJU1RfSEVBRChmaW5pc2hlZF9o ZWFkLCBpb3JlcSkgZmluaXNoZWQ7CisgICAgUUxJU1RfSEVBRChmcmVlbGlzdF9oZWFkLCBpb3Jl cSkgZnJlZWxpc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXF1ZXN0c190b3RhbDsKKyAg ICBpbnQgICAgICAgICAgICAgICAgIHJlcXVlc3RzX2luZmxpZ2h0OworICAgIGludCAgICAgICAg ICAgICAgICAgcmVxdWVzdHNfZmluaXNoZWQ7CisgICAgdW5zaWduZWQgaW50ICAgICAgICBtYXhf cmVxdWVzdHM7CisKKyAgICBnYm9vbGVhbiAgICAgICAgICAgIGZlYXR1cmVfZGlzY2FyZDsKKwor ICAgIC8qIHFlbXUgYmxvY2sgZHJpdmVyICovCisgICAgRHJpdmVJbmZvICAgICAgICAgICAqZGlu Zm87CisgICAgQmxvY2tCYWNrZW5kICAgICAgICAqYmxrOworICAgIFFFTVVCSCAgICAgICAgICAg ICAgKmJoOworCisgICAgSU9UaHJlYWQgICAgICAgICAgICAqaW90aHJlYWQ7CisgICAgQWlvQ29u dGV4dCAgICAgICAgICAqY3R4OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBpb3Jl cV9yZXNldChzdHJ1Y3QgaW9yZXEgKmlvcmVxKQoreworICAgIG1lbXNldCgmaW9yZXEtPnJlcSwg MCwgc2l6ZW9mKGlvcmVxLT5yZXEpKTsKKyAgICBpb3JlcS0+c3RhdHVzID0gMDsKKyAgICBpb3Jl cS0+c3RhcnQgPSAwOworICAgIGlvcmVxLT5idWYgPSBOVUxMOworICAgIGlvcmVxLT5zaXplID0g MDsKKyAgICBpb3JlcS0+cHJlc3luYyA9IDA7CisKKyAgICBpb3JlcS0+YWlvX2luZmxpZ2h0ID0g MDsKKyAgICBpb3JlcS0+YWlvX2Vycm9ycyA9IDA7CisKKyAgICBpb3JlcS0+YmxrZGV2ID0gTlVM TDsKKyAgICBtZW1zZXQoJmlvcmVxLT5saXN0LCAwLCBzaXplb2YoaW9yZXEtPmxpc3QpKTsKKyAg ICBtZW1zZXQoJmlvcmVxLT5hY2N0LCAwLCBzaXplb2YoaW9yZXEtPmFjY3QpKTsKKworICAgIHFl bXVfaW92ZWNfcmVzZXQoJmlvcmVxLT52KTsKK30KKworc3RhdGljIHN0cnVjdCBpb3JlcSAqaW9y ZXFfc3RhcnQoc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2KQoreworICAgIHN0cnVjdCBpb3JlcSAq aW9yZXEgPSBOVUxMOworCisgICAgaWYgKFFMSVNUX0VNUFRZKCZibGtkZXYtPmZyZWVsaXN0KSkg eworICAgICAgICBpZiAoYmxrZGV2LT5yZXF1ZXN0c190b3RhbCA+PSBibGtkZXYtPm1heF9yZXF1 ZXN0cykgeworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgLyogYWxs b2NhdGUgbmV3IHN0cnVjdCAqLworICAgICAgICBpb3JlcSA9IGdfbWFsbG9jMChzaXplb2YoKmlv cmVxKSk7CisgICAgICAgIGlvcmVxLT5ibGtkZXYgPSBibGtkZXY7CisgICAgICAgIGJsa2Rldi0+ cmVxdWVzdHNfdG90YWwrKzsKKyAgICAgICAgcWVtdV9pb3ZlY19pbml0KCZpb3JlcS0+diwgMSk7 CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZ2V0IG9uZSBmcm9tIGZyZWVsaXN0ICovCisgICAg ICAgIGlvcmVxID0gUUxJU1RfRklSU1QoJmJsa2Rldi0+ZnJlZWxpc3QpOworICAgICAgICBRTElT VF9SRU1PVkUoaW9yZXEsIGxpc3QpOworICAgIH0KKyAgICBRTElTVF9JTlNFUlRfSEVBRCgmYmxr ZGV2LT5pbmZsaWdodCwgaW9yZXEsIGxpc3QpOworICAgIGJsa2Rldi0+cmVxdWVzdHNfaW5mbGln aHQrKzsKKworb3V0OgorICAgIHJldHVybiBpb3JlcTsKK30KKworc3RhdGljIHZvaWQgaW9yZXFf ZmluaXNoKHN0cnVjdCBpb3JlcSAqaW9yZXEpCit7CisgICAgc3RydWN0IFhlbkJsa0RldiAqYmxr ZGV2ID0gaW9yZXEtPmJsa2RldjsKKworICAgIFFMSVNUX1JFTU9WRShpb3JlcSwgbGlzdCk7Cisg ICAgUUxJU1RfSU5TRVJUX0hFQUQoJmJsa2Rldi0+ZmluaXNoZWQsIGlvcmVxLCBsaXN0KTsKKyAg ICBibGtkZXYtPnJlcXVlc3RzX2luZmxpZ2h0LS07CisgICAgYmxrZGV2LT5yZXF1ZXN0c19maW5p c2hlZCsrOworfQorCitzdGF0aWMgdm9pZCBpb3JlcV9yZWxlYXNlKHN0cnVjdCBpb3JlcSAqaW9y ZXEsIGJvb2wgZmluaXNoKQoreworICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVx LT5ibGtkZXY7CisKKyAgICBRTElTVF9SRU1PVkUoaW9yZXEsIGxpc3QpOworICAgIGlvcmVxX3Jl c2V0KGlvcmVxKTsKKyAgICBpb3JlcS0+YmxrZGV2ID0gYmxrZGV2OworICAgIFFMSVNUX0lOU0VS VF9IRUFEKCZibGtkZXYtPmZyZWVsaXN0LCBpb3JlcSwgbGlzdCk7CisgICAgaWYgKGZpbmlzaCkg eworICAgICAgICBibGtkZXYtPnJlcXVlc3RzX2ZpbmlzaGVkLS07CisgICAgfSBlbHNlIHsKKyAg ICAgICAgYmxrZGV2LT5yZXF1ZXN0c19pbmZsaWdodC0tOworICAgIH0KK30KKworLyoKKyAqIHRy YW5zbGF0ZSByZXF1ZXN0IGludG8gaW92ZWMgKyBzdGFydCBvZmZzZXQKKyAqIGRvIHNhbml0eSBj aGVja3MgYWxvbmcgdGhlIHdheQorICovCitzdGF0aWMgaW50IGlvcmVxX3BhcnNlKHN0cnVjdCBp b3JlcSAqaW9yZXEpCit7CisgICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gaW9yZXEtPmJs a2RldjsKKyAgICBzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYgPSAmYmxrZGV2LT54ZW5k ZXY7CisgICAgc2l6ZV90IGxlbjsKKyAgICBpbnQgaTsKKworICAgIHhlbl9wdl9wcmludGYoCisg ICAgICAgIHhlbmRldiwgMywKKyAgICAgICAgIm9wICVkLCBuciAlZCwgaGFuZGxlICVkLCBpZCAl IiBQUklkNjQgIiwgc2VjdG9yICUiIFBSSWQ2NCAiXG4iLAorICAgICAgICBpb3JlcS0+cmVxLm9w ZXJhdGlvbiwgaW9yZXEtPnJlcS5ucl9zZWdtZW50cywKKyAgICAgICAgaW9yZXEtPnJlcS5oYW5k bGUsIGlvcmVxLT5yZXEuaWQsIGlvcmVxLT5yZXEuc2VjdG9yX251bWJlcik7CisgICAgc3dpdGNo IChpb3JlcS0+cmVxLm9wZXJhdGlvbikgeworICAgIGNhc2UgQkxLSUZfT1BfUkVBRDoKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSBCTEtJRl9PUF9GTFVTSF9ESVNLQ0FDSEU6CisgICAgICAgIGlv cmVxLT5wcmVzeW5jID0gMTsKKyAgICAgICAgaWYgKCFpb3JlcS0+cmVxLm5yX3NlZ21lbnRzKSB7 CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsIHRocm91 Z2ggKi8KKyAgICBjYXNlIEJMS0lGX09QX1dSSVRFOgorICAgICAgICBicmVhazsKKyAgICBjYXNl IEJMS0lGX09QX0RJU0NBUkQ6CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAg ICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiZXJyb3I6IHVua25vd24gb3BlcmF0aW9uICgl ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaW9yZXEtPnJlcS5vcGVyYXRpb24pOworICAg ICAgICBnb3RvIGVycjsKKyAgICB9OworCisgICAgaWYgKGlvcmVxLT5yZXEub3BlcmF0aW9uICE9 IEJMS0lGX09QX1JFQUQgJiYgYmxrZGV2LT5tb2RlWzBdICE9ICd3JykgeworICAgICAgICB4ZW5f cHZfcHJpbnRmKHhlbmRldiwgMCwgImVycm9yOiB3cml0ZSByZXEgZm9yIHJvIGRldmljZVxuIik7 CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlvcmVxLT5zdGFydCA9IGlvcmVxLT5y ZXEuc2VjdG9yX251bWJlciAqIGJsa2Rldi0+ZmlsZV9ibGs7CisgICAgZm9yIChpID0gMDsgaSA8 IGlvcmVxLT5yZXEubnJfc2VnbWVudHM7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBCTEtJRl9N QVhfU0VHTUVOVFNfUEVSX1JFUVVFU1QpIHsKKyAgICAgICAgICAgIHhlbl9wdl9wcmludGYoeGVu ZGV2LCAwLCAiZXJyb3I6IG5yX3NlZ21lbnRzIHRvbyBiaWdcbiIpOworICAgICAgICAgICAgZ290 byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0X3Nl Y3QgPiBpb3JlcS0+cmVxLnNlZ1tpXS5sYXN0X3NlY3QpIHsKKyAgICAgICAgICAgIHhlbl9wdl9w cmludGYoeGVuZGV2LCAwLCAiZXJyb3I6IGZpcnN0ID4gbGFzdCBzZWN0b3JcbiIpOworICAgICAg ICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlvcmVxLT5yZXEuc2VnW2ld Lmxhc3Rfc2VjdCAqIEJMT0NLX1NJWkUgPj0gWENfUEFHRV9TSVpFKSB7CisgICAgICAgICAgICB4 ZW5fcHZfcHJpbnRmKHhlbmRldiwgMCwgImVycm9yOiBwYWdlIGNyb3NzaW5nXG4iKTsKKyAgICAg ICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gKGlvcmVxLT5yZXEu c2VnW2ldLmxhc3Rfc2VjdCAtCisgICAgICAgICAgICAgICBpb3JlcS0+cmVxLnNlZ1tpXS5maXJz dF9zZWN0ICsgMSkgKiBibGtkZXYtPmZpbGVfYmxrOworICAgICAgICBpb3JlcS0+c2l6ZSArPSBs ZW47CisgICAgfQorICAgIGlmIChpb3JlcS0+c3RhcnQgKyBpb3JlcS0+c2l6ZSA+IGJsa2Rldi0+ ZmlsZV9zaXplKSB7CisgICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiZXJyb3I6IGFj Y2VzcyBiZXlvbmQgZW5kIG9mIGZpbGVcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9Cisg ICAgcmV0dXJuIDA7CisKK2VycjoKKyAgICBpb3JlcS0+c3RhdHVzID0gQkxLSUZfUlNQX0VSUk9S OworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBpb3JlcV9ncmFudF9jb3B5KHN0cnVj dCBpb3JlcSAqaW9yZXEpCit7CisgICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gaW9yZXEt PmJsa2RldjsKKyAgICBzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYgPSAmYmxrZGV2LT54 ZW5kZXY7CisgICAgWGVuR3JhbnRDb3B5U2VnbWVudCBzZWdzW0JMS0lGX01BWF9TRUdNRU5UU19Q RVJfUkVRVUVTVF07CisgICAgaW50IGksIGNvdW50LCByYzsKKyAgICBpbnQ2NF90IGZpbGVfYmxr ID0gYmxrZGV2LT5maWxlX2JsazsKKyAgICBib29sIHRvX2RvbWFpbiA9IChpb3JlcS0+cmVxLm9w ZXJhdGlvbiA9PSBCTEtJRl9PUF9SRUFEKTsKKyAgICB2b2lkICp2aXJ0ID0gaW9yZXEtPmJ1ZjsK KworICAgIGlmIChpb3JlcS0+cmVxLm5yX3NlZ21lbnRzID09IDApIHsKKyAgICAgICAgcmV0dXJu IDA7CisgICAgfQorCisgICAgY291bnQgPSBpb3JlcS0+cmVxLm5yX3NlZ21lbnRzOworCisgICAg Zm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHRvX2RvbWFpbikgewor ICAgICAgICAgICAgc2Vnc1tpXS5kZXN0LmZvcmVpZ24ucmVmID0gaW9yZXEtPnJlcS5zZWdbaV0u Z3JlZjsKKyAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLm9mZnNldCA9IGlvcmVxLT5y ZXEuc2VnW2ldLmZpcnN0X3NlY3QgKgorICAgICAgICAgICAgICAgIGZpbGVfYmxrOworICAgICAg ICAgICAgc2Vnc1tpXS5zb3VyY2UudmlydCA9IHZpcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICBzZWdzW2ldLnNvdXJjZS5mb3JlaWduLnJlZiA9IGlvcmVxLT5yZXEuc2VnW2ldLmdy ZWY7CisgICAgICAgICAgICBzZWdzW2ldLnNvdXJjZS5mb3JlaWduLm9mZnNldCA9IGlvcmVxLT5y ZXEuc2VnW2ldLmZpcnN0X3NlY3QgKgorICAgICAgICAgICAgICAgIGZpbGVfYmxrOworICAgICAg ICAgICAgc2Vnc1tpXS5kZXN0LnZpcnQgPSB2aXJ0OworICAgICAgICB9CisgICAgICAgIHNlZ3Nb aV0ubGVuID0gKGlvcmVxLT5yZXEuc2VnW2ldLmxhc3Rfc2VjdAorICAgICAgICAgICAgICAgICAg ICAgICAtIGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0X3NlY3QgKyAxKSAqIGZpbGVfYmxrOworICAg ICAgICB2aXJ0ICs9IHNlZ3NbaV0ubGVuOworICAgIH0KKworICAgIHJjID0geGVuX2JlX2NvcHlf Z3JhbnRfcmVmcyh4ZW5kZXYsIHRvX2RvbWFpbiwgc2VncywgY291bnQpOworCisgICAgaWYgKHJj KSB7CisgICAgICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLAorICAgICAgICAgICAgICAgICAg ICAgICJmYWlsZWQgdG8gY29weSBkYXRhICVkXG4iLCByYyk7CisgICAgICAgIGlvcmVxLT5haW9f ZXJyb3JzKys7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9 CisKK3N0YXRpYyBpbnQgaW9yZXFfcnVuaW9fcWVtdV9haW8oc3RydWN0IGlvcmVxICppb3JlcSk7 CisKK3N0YXRpYyB2b2lkIHFlbXVfYWlvX2NvbXBsZXRlKHZvaWQgKm9wYXF1ZSwgaW50IHJldCkK K3sKKyAgICBzdHJ1Y3QgaW9yZXEgKmlvcmVxID0gb3BhcXVlOworICAgIHN0cnVjdCBYZW5CbGtE ZXYgKmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7CisgICAgc3RydWN0IFhlbkxlZ2FjeURldmljZSAq eGVuZGV2ID0gJmJsa2Rldi0+eGVuZGV2OworCisgICAgYWlvX2NvbnRleHRfYWNxdWlyZShibGtk ZXYtPmN0eCk7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgeGVuX3B2X3ByaW50Zih4 ZW5kZXYsIDAsICIlcyBJL08gZXJyb3JcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaW9yZXEt PnJlcS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfUkVBRCA/ICJyZWFkIiA6ICJ3cml0ZSIpOworICAg ICAgICBpb3JlcS0+YWlvX2Vycm9ycysrOworICAgIH0KKworICAgIGlvcmVxLT5haW9faW5mbGln aHQtLTsKKyAgICBpZiAoaW9yZXEtPnByZXN5bmMpIHsKKyAgICAgICAgaW9yZXEtPnByZXN5bmMg PSAwOworICAgICAgICBpb3JlcV9ydW5pb19xZW11X2Fpbyhpb3JlcSk7CisgICAgICAgIGdvdG8g ZG9uZTsKKyAgICB9CisgICAgaWYgKGlvcmVxLT5haW9faW5mbGlnaHQgPiAwKSB7CisgICAgICAg IGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGlvcmVxLT5yZXEub3BlcmF0aW9uKSB7 CisgICAgY2FzZSBCTEtJRl9PUF9SRUFEOgorICAgICAgICAvKiBpbiBjYXNlIG9mIGZhaWx1cmUg aW9yZXEtPmFpb19lcnJvcnMgaXMgaW5jcmVhc2VkICovCisgICAgICAgIGlmIChyZXQgPT0gMCkg eworICAgICAgICAgICAgaW9yZXFfZ3JhbnRfY29weShpb3JlcSk7CisgICAgICAgIH0KKyAgICAg ICAgcWVtdV92ZnJlZShpb3JlcS0+YnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCTEtJ Rl9PUF9XUklURToKKyAgICBjYXNlIEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKKyAgICAgICAg aWYgKCFpb3JlcS0+cmVxLm5yX3NlZ21lbnRzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgfQorICAgICAgICBxZW11X3ZmcmVlKGlvcmVxLT5idWYpOworICAgICAgICBicmVhazsKKyAg ICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpb3JlcS0+c3RhdHVzID0g aW9yZXEtPmFpb19lcnJvcnMgPyBCTEtJRl9SU1BfRVJST1IgOiBCTEtJRl9SU1BfT0tBWTsKKyAg ICBpb3JlcV9maW5pc2goaW9yZXEpOworCisgICAgc3dpdGNoIChpb3JlcS0+cmVxLm9wZXJhdGlv bikgeworICAgIGNhc2UgQkxLSUZfT1BfV1JJVEU6CisgICAgY2FzZSBCTEtJRl9PUF9GTFVTSF9E SVNLQ0FDSEU6CisgICAgICAgIGlmICghaW9yZXEtPnJlcS5ucl9zZWdtZW50cykgeworICAgICAg ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEJMS0lGX09QX1JFQUQ6CisgICAgICAg IGlmIChpb3JlcS0+c3RhdHVzID09IEJMS0lGX1JTUF9PS0FZKSB7CisgICAgICAgICAgICBibG9j a19hY2N0X2RvbmUoYmxrX2dldF9zdGF0cyhibGtkZXYtPmJsayksICZpb3JlcS0+YWNjdCk7Cisg ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9ja19hY2N0X2ZhaWxlZChibGtfZ2V0X3N0 YXRzKGJsa2Rldi0+YmxrKSwgJmlvcmVxLT5hY2N0KTsKKyAgICAgICAgfQorICAgICAgICBicmVh azsKKyAgICBjYXNlIEJMS0lGX09QX0RJU0NBUkQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJl YWs7CisgICAgfQorICAgIHFlbXVfYmhfc2NoZWR1bGUoYmxrZGV2LT5iaCk7CisKK2RvbmU6Cisg ICAgYWlvX2NvbnRleHRfcmVsZWFzZShibGtkZXYtPmN0eCk7Cit9CisKK3N0YXRpYyBib29sIGJs a19zcGxpdF9kaXNjYXJkKHN0cnVjdCBpb3JlcSAqaW9yZXEsIGJsa2lmX3NlY3Rvcl90IHNlY3Rv cl9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBucl9zZWN0 b3JzKQoreworICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7Cisg ICAgaW50NjRfdCBieXRlX29mZnNldDsKKyAgICBpbnQgYnl0ZV9jaHVuazsKKyAgICB1aW50NjRf dCBieXRlX3JlbWFpbmluZywgbGltaXQ7CisgICAgdWludDY0X3Qgc2VjX3N0YXJ0ID0gc2VjdG9y X251bWJlcjsKKyAgICB1aW50NjRfdCBzZWNfY291bnQgPSBucl9zZWN0b3JzOworCisgICAgLyog V3JhcCBhcm91bmQsIG9yIG92ZXJmbG93aW5nIGJ5dGUgbGltaXQ/ICovCisgICAgaWYgKHNlY19z dGFydCArIHNlY19jb3VudCA8IHNlY19jb3VudCB8fAorICAgICAgICBzZWNfc3RhcnQgKyBzZWNf Y291bnQgPiBJTlQ2NF9NQVggPj4gQkRSVl9TRUNUT1JfQklUUykgeworICAgICAgICByZXR1cm4g ZmFsc2U7CisgICAgfQorCisgICAgbGltaXQgPSBCRFJWX1JFUVVFU1RfTUFYX1NFQ1RPUlMgPDwg QkRSVl9TRUNUT1JfQklUUzsKKyAgICBieXRlX29mZnNldCA9IHNlY19zdGFydCA8PCBCRFJWX1NF Q1RPUl9CSVRTOworICAgIGJ5dGVfcmVtYWluaW5nID0gc2VjX2NvdW50IDw8IEJEUlZfU0VDVE9S X0JJVFM7CisKKyAgICBkbyB7CisgICAgICAgIGJ5dGVfY2h1bmsgPSBieXRlX3JlbWFpbmluZyA+ IGxpbWl0ID8gbGltaXQgOiBieXRlX3JlbWFpbmluZzsKKyAgICAgICAgaW9yZXEtPmFpb19pbmZs aWdodCsrOworICAgICAgICBibGtfYWlvX3BkaXNjYXJkKGJsa2Rldi0+YmxrLCBieXRlX29mZnNl dCwgYnl0ZV9jaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2Fpb19jb21wbGV0 ZSwgaW9yZXEpOworICAgICAgICBieXRlX3JlbWFpbmluZyAtPSBieXRlX2NodW5rOworICAgICAg ICBieXRlX29mZnNldCArPSBieXRlX2NodW5rOworICAgIH0gd2hpbGUgKGJ5dGVfcmVtYWluaW5n ID4gMCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBpb3JlcV9ydW5pb19x ZW11X2FpbyhzdHJ1Y3QgaW9yZXEgKmlvcmVxKQoreworICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJs a2RldiA9IGlvcmVxLT5ibGtkZXY7CisKKyAgICBpb3JlcS0+YnVmID0gcWVtdV9tZW1hbGlnbihY Q19QQUdFX1NJWkUsIGlvcmVxLT5zaXplKTsKKyAgICBpZiAoaW9yZXEtPnJlcS5ucl9zZWdtZW50 cyAmJgorICAgICAgICAoaW9yZXEtPnJlcS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfV1JJVEUgfHwK KyAgICAgICAgIGlvcmVxLT5yZXEub3BlcmF0aW9uID09IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNI RSkgJiYKKyAgICAgICAgaW9yZXFfZ3JhbnRfY29weShpb3JlcSkpIHsKKyAgICAgICAgcWVtdV92 ZnJlZShpb3JlcS0+YnVmKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaW9yZXEt PmFpb19pbmZsaWdodCsrOworICAgIGlmIChpb3JlcS0+cHJlc3luYykgeworICAgICAgICBibGtf YWlvX2ZsdXNoKGlvcmVxLT5ibGtkZXYtPmJsaywgcWVtdV9haW9fY29tcGxldGUsIGlvcmVxKTsK KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChpb3JlcS0+cmVxLm9wZXJh dGlvbikgeworICAgIGNhc2UgQkxLSUZfT1BfUkVBRDoKKyAgICAgICAgcWVtdV9pb3ZlY19hZGQo JmlvcmVxLT52LCBpb3JlcS0+YnVmLCBpb3JlcS0+c2l6ZSk7CisgICAgICAgIGJsb2NrX2FjY3Rf c3RhcnQoYmxrX2dldF9zdGF0cyhibGtkZXYtPmJsayksICZpb3JlcS0+YWNjdCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICBpb3JlcS0+di5zaXplLCBCTE9DS19BQ0NUX1JFQUQpOworICAgICAg ICBpb3JlcS0+YWlvX2luZmxpZ2h0Kys7CisgICAgICAgIGJsa19haW9fcHJlYWR2KGJsa2Rldi0+ YmxrLCBpb3JlcS0+c3RhcnQsICZpb3JlcS0+diwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAg cWVtdV9haW9fY29tcGxldGUsIGlvcmVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCTEtJ Rl9PUF9XUklURToKKyAgICBjYXNlIEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRToKKyAgICAgICAg aWYgKCFpb3JlcS0+cmVxLm5yX3NlZ21lbnRzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAg ICAgfQorCisgICAgICAgIHFlbXVfaW92ZWNfYWRkKCZpb3JlcS0+diwgaW9yZXEtPmJ1ZiwgaW9y ZXEtPnNpemUpOworICAgICAgICBibG9ja19hY2N0X3N0YXJ0KGJsa19nZXRfc3RhdHMoYmxrZGV2 LT5ibGspLCAmaW9yZXEtPmFjY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9yZXEtPnYu c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3JlcS0+cmVxLm9wZXJhdGlvbiA9PSBC TEtJRl9PUF9XUklURSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfQUNDVF9XUklU RSA6IEJMT0NLX0FDQ1RfRkxVU0gpOworICAgICAgICBpb3JlcS0+YWlvX2luZmxpZ2h0Kys7Cisg ICAgICAgIGJsa19haW9fcHdyaXRldihibGtkZXYtPmJsaywgaW9yZXEtPnN0YXJ0LCAmaW9yZXEt PnYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2Fpb19jb21wbGV0ZSwgaW9yZXEp OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJMS0lGX09QX0RJU0NBUkQ6CisgICAgeworICAg ICAgICBzdHJ1Y3QgYmxraWZfcmVxdWVzdF9kaXNjYXJkICpyZXEgPSAodm9pZCAqKSZpb3JlcS0+ cmVxOworICAgICAgICBpZiAoIWJsa19zcGxpdF9kaXNjYXJkKGlvcmVxLCByZXEtPnNlY3Rvcl9u dW1iZXIsIHJlcS0+bnJfc2VjdG9ycykpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAg ICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICAvKiB1bmtu b3duIG9wZXJhdGlvbiAoc2hvdWxkbid0IGhhcHBlbiAtLSBwYXJzZSBjYXRjaGVzIHRoaXMpICov CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHFlbXVfYWlvX2NvbXBsZXRlKGlvcmVx LCAwKTsKKworICAgIHJldHVybiAwOworCitlcnI6CisgICAgaW9yZXFfZmluaXNoKGlvcmVxKTsK KyAgICBpb3JlcS0+c3RhdHVzID0gQkxLSUZfUlNQX0VSUk9SOworICAgIHJldHVybiAtMTsKK30K Kworc3RhdGljIGludCBibGtfc2VuZF9yZXNwb25zZV9vbmUoc3RydWN0IGlvcmVxICppb3JlcSkK K3sKKyAgICBzdHJ1Y3QgWGVuQmxrRGV2ICAqYmxrZGV2ID0gaW9yZXEtPmJsa2RldjsKKyAgICBp bnQgICAgICAgICAgICAgICBzZW5kX25vdGlmeSAgID0gMDsKKyAgICBpbnQgICAgICAgICAgICAg ICBoYXZlX3JlcXVlc3RzID0gMDsKKyAgICBibGtpZl9yZXNwb25zZV90ICAqcmVzcDsKKworICAg IC8qIFBsYWNlIG9uIHRoZSByZXNwb25zZSByaW5nIGZvciB0aGUgcmVsZXZhbnQgZG9tYWluLiAq LworICAgIHN3aXRjaCAoYmxrZGV2LT5wcm90b2NvbCkgeworICAgIGNhc2UgQkxLSUZfUFJPVE9D T0xfTkFUSVZFOgorICAgICAgICByZXNwID0gKGJsa2lmX3Jlc3BvbnNlX3QgKilSSU5HX0dFVF9S RVNQT05TRSgKKyAgICAgICAgICAgICZibGtkZXYtPnJpbmdzLm5hdGl2ZSwKKyAgICAgICAgICAg IGJsa2Rldi0+cmluZ3MubmF0aXZlLnJzcF9wcm9kX3B2dCk7CisgICAgICAgIGJyZWFrOworICAg IGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzMyOgorICAgICAgICByZXNwID0gKGJsa2lmX3Jlc3Bv bnNlX3QgKilSSU5HX0dFVF9SRVNQT05TRSgKKyAgICAgICAgICAgICZibGtkZXYtPnJpbmdzLng4 Nl8zMl9wYXJ0LAorICAgICAgICAgICAgYmxrZGV2LT5yaW5ncy54ODZfMzJfcGFydC5yc3BfcHJv ZF9wdnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJMS0lGX1BST1RPQ09MX1g4Nl82NDoK KyAgICAgICAgcmVzcCA9IChibGtpZl9yZXNwb25zZV90ICopUklOR19HRVRfUkVTUE9OU0UoCisg ICAgICAgICAgICAmYmxrZGV2LT5yaW5ncy54ODZfNjRfcGFydCwKKyAgICAgICAgICAgIGJsa2Rl di0+cmluZ3MueDg2XzY0X3BhcnQucnNwX3Byb2RfcHZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAg ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmVzcC0+aWQgICAgICAg ID0gaW9yZXEtPnJlcS5pZDsKKyAgICByZXNwLT5vcGVyYXRpb24gPSBpb3JlcS0+cmVxLm9wZXJh dGlvbjsKKyAgICByZXNwLT5zdGF0dXMgICAgPSBpb3JlcS0+c3RhdHVzOworCisgICAgYmxrZGV2 LT5yaW5ncy5jb21tb24ucnNwX3Byb2RfcHZ0Kys7CisKKyAgICBSSU5HX1BVU0hfUkVTUE9OU0VT X0FORF9DSEVDS19OT1RJRlkoJmJsa2Rldi0+cmluZ3MuY29tbW9uLCBzZW5kX25vdGlmeSk7Cisg ICAgaWYgKGJsa2Rldi0+cmluZ3MuY29tbW9uLnJzcF9wcm9kX3B2dCA9PSBibGtkZXYtPnJpbmdz LmNvbW1vbi5yZXFfY29ucykgeworICAgICAgICAvKgorICAgICAgICAgKiBUYWlsIGNoZWNrIGZv ciBwZW5kaW5nIHJlcXVlc3RzLiBBbGxvd3MgZnJvbnRlbmQgdG8gYXZvaWQKKyAgICAgICAgICog bm90aWZpY2F0aW9ucyBpZiByZXF1ZXN0cyBhcmUgYWxyZWFkeSBpbiBmbGlnaHQgKGxvd2VyCisg ICAgICAgICAqIG92ZXJoZWFkcyBhbmQgcHJvbW90ZXMgYmF0Y2hpbmcpLgorICAgICAgICAgKi8K KyAgICAgICAgUklOR19GSU5BTF9DSEVDS19GT1JfUkVRVUVTVFMoJmJsa2Rldi0+cmluZ3MuY29t bW9uLCBoYXZlX3JlcXVlc3RzKTsKKyAgICB9IGVsc2UgaWYgKFJJTkdfSEFTX1VOQ09OU1VNRURf UkVRVUVTVFMoJmJsa2Rldi0+cmluZ3MuY29tbW9uKSkgeworICAgICAgICBoYXZlX3JlcXVlc3Rz ID0gMTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZV9yZXF1ZXN0cykgeworICAgICAgICBibGtkZXYt Pm1vcmVfd29yaysrOworICAgIH0KKyAgICByZXR1cm4gc2VuZF9ub3RpZnk7Cit9CisKKy8qIHdh bGsgZmluaXNoZWQgbGlzdCwgc2VuZCBvdXRzdGFuZGluZyByZXNwb25zZXMsIGZyZWUgcmVxdWVz dHMgKi8KK3N0YXRpYyB2b2lkIGJsa19zZW5kX3Jlc3BvbnNlX2FsbChzdHJ1Y3QgWGVuQmxrRGV2 ICpibGtkZXYpCit7CisgICAgc3RydWN0IGlvcmVxICppb3JlcTsKKyAgICBpbnQgc2VuZF9ub3Rp ZnkgPSAwOworCisgICAgd2hpbGUgKCFRTElTVF9FTVBUWSgmYmxrZGV2LT5maW5pc2hlZCkpIHsK KyAgICAgICAgaW9yZXEgPSBRTElTVF9GSVJTVCgmYmxrZGV2LT5maW5pc2hlZCk7CisgICAgICAg IHNlbmRfbm90aWZ5ICs9IGJsa19zZW5kX3Jlc3BvbnNlX29uZShpb3JlcSk7CisgICAgICAgIGlv cmVxX3JlbGVhc2UoaW9yZXEsIHRydWUpOworICAgIH0KKyAgICBpZiAoc2VuZF9ub3RpZnkpIHsK KyAgICAgICAgeGVuX3B2X3NlbmRfbm90aWZ5KCZibGtkZXYtPnhlbmRldik7CisgICAgfQorfQor CitzdGF0aWMgaW50IGJsa19nZXRfcmVxdWVzdChzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYsIHN0 cnVjdCBpb3JlcSAqaW9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSSU5HX0lEWCBy YykKK3sKKyAgICBzd2l0Y2ggKGJsa2Rldi0+cHJvdG9jb2wpIHsKKyAgICBjYXNlIEJMS0lGX1BS T1RPQ09MX05BVElWRToKKyAgICAgICAgbWVtY3B5KCZpb3JlcS0+cmVxLCBSSU5HX0dFVF9SRVFV RVNUKCZibGtkZXYtPnJpbmdzLm5hdGl2ZSwgcmMpLAorICAgICAgICAgICAgICAgc2l6ZW9mKGlv cmVxLT5yZXEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9YODZf MzI6CisgICAgICAgIGJsa2lmX2dldF94ODZfMzJfcmVxKCZpb3JlcS0+cmVxLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBSSU5HX0dFVF9SRVFVRVNUKCZibGtkZXYtPnJpbmdzLng4Nl8z Ml9wYXJ0LCByYykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJMS0lGX1BST1RPQ09MX1g4 Nl82NDoKKyAgICAgICAgYmxraWZfZ2V0X3g4Nl82NF9yZXEoJmlvcmVxLT5yZXEsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFJJTkdfR0VUX1JFUVVFU1QoJmJsa2Rldi0+cmluZ3MueDg2 XzY0X3BhcnQsIHJjKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBQcmV2ZW50IHRo ZSBjb21waWxlciBmcm9tIGFjY2Vzc2luZyB0aGUgb24tcmluZyBmaWVsZHMgaW5zdGVhZC4gKi8K KyAgICBiYXJyaWVyKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJsa19oYW5k bGVfcmVxdWVzdHMoc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2KQoreworICAgIFJJTkdfSURYIHJj LCBycDsKKyAgICBzdHJ1Y3QgaW9yZXEgKmlvcmVxOworCisgICAgYmxrZGV2LT5tb3JlX3dvcmsg PSAwOworCisgICAgcmMgPSBibGtkZXYtPnJpbmdzLmNvbW1vbi5yZXFfY29uczsKKyAgICBycCA9 IGJsa2Rldi0+cmluZ3MuY29tbW9uLnNyaW5nLT5yZXFfcHJvZDsKKyAgICB4ZW5fcm1iKCk7IC8q IEVuc3VyZSB3ZSBzZWUgcXVldWVkIHJlcXVlc3RzIHVwIHRvICdycCcuICovCisKKyAgICBibGtf c2VuZF9yZXNwb25zZV9hbGwoYmxrZGV2KTsKKyAgICB3aGlsZSAocmMgIT0gcnApIHsKKyAgICAg ICAgLyogcHVsbCByZXF1ZXN0IGZyb20gcmluZyAqLworICAgICAgICBpZiAoUklOR19SRVFVRVNU X0NPTlNfT1ZFUkZMT1coJmJsa2Rldi0+cmluZ3MuY29tbW9uLCByYykpIHsKKyAgICAgICAgICAg IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlvcmVxID0gaW9yZXFfc3RhcnQoYmxrZGV2KTsK KyAgICAgICAgaWYgKGlvcmVxID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJsa2Rldi0+bW9yZV93 b3JrKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBibGtfZ2V0X3Jl cXVlc3QoYmxrZGV2LCBpb3JlcSwgcmMpOworICAgICAgICBibGtkZXYtPnJpbmdzLmNvbW1vbi5y ZXFfY29ucyA9ICsrcmM7CisKKyAgICAgICAgLyogcGFyc2UgdGhlbSAqLworICAgICAgICBpZiAo aW9yZXFfcGFyc2UoaW9yZXEpICE9IDApIHsKKworICAgICAgICAgICAgc3dpdGNoIChpb3JlcS0+ cmVxLm9wZXJhdGlvbikgeworICAgICAgICAgICAgY2FzZSBCTEtJRl9PUF9SRUFEOgorICAgICAg ICAgICAgICAgIGJsb2NrX2FjY3RfaW52YWxpZChibGtfZ2V0X3N0YXRzKGJsa2Rldi0+YmxrKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfQUNDVF9SRUFEKTsKKyAg ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxLSUZfT1BfV1JJVEU6Cisg ICAgICAgICAgICAgICAgYmxvY2tfYWNjdF9pbnZhbGlkKGJsa19nZXRfc3RhdHMoYmxrZGV2LT5i bGspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19BQ0NUX1dSSVRF KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxLSUZfT1BfRkxV U0hfRElTS0NBQ0hFOgorICAgICAgICAgICAgICAgIGJsb2NrX2FjY3RfaW52YWxpZChibGtfZ2V0 X3N0YXRzKGJsa2Rldi0+YmxrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg QkxPQ0tfQUNDVF9GTFVTSCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg IGJyZWFrOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaWYgKGJsa19zZW5kX3Jlc3Bv bnNlX29uZShpb3JlcSkpIHsKKyAgICAgICAgICAgICAgICB4ZW5fcHZfc2VuZF9ub3RpZnkoJmJs a2Rldi0+eGVuZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlvcmVxX3JlbGVhc2Uo aW9yZXEsIGZhbHNlKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAg ICAgaW9yZXFfcnVuaW9fcWVtdV9haW8oaW9yZXEpOworICAgIH0KKworICAgIGlmIChibGtkZXYt Pm1vcmVfd29yayAmJiBibGtkZXYtPnJlcXVlc3RzX2luZmxpZ2h0IDwgYmxrZGV2LT5tYXhfcmVx dWVzdHMpIHsKKyAgICAgICAgcWVtdV9iaF9zY2hlZHVsZShibGtkZXYtPmJoKTsKKyAgICB9Cit9 CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgYmxrX2JoKHZvaWQgKm9wYXF1ZSkKK3sKKyAg ICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBvcGFxdWU7CisKKyAgICBhaW9fY29udGV4dF9h Y3F1aXJlKGJsa2Rldi0+Y3R4KTsKKyAgICBibGtfaGFuZGxlX3JlcXVlc3RzKGJsa2Rldik7Cisg ICAgYWlvX2NvbnRleHRfcmVsZWFzZShibGtkZXYtPmN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIGJs a19hbGxvYyhzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYpCit7CisgICAgc3RydWN0IFhl bkJsa0RldiAqYmxrZGV2ID0gY29udGFpbmVyX29mKHhlbmRldiwgc3RydWN0IFhlbkJsa0Rldiwg eGVuZGV2KTsKKyAgICBFcnJvciAqZXJyID0gTlVMTDsKKworICAgIHRyYWNlX3hlbl9kaXNrX2Fs bG9jKHhlbmRldi0+bmFtZSk7CisKKyAgICBRTElTVF9JTklUKCZibGtkZXYtPmluZmxpZ2h0KTsK KyAgICBRTElTVF9JTklUKCZibGtkZXYtPmZpbmlzaGVkKTsKKyAgICBRTElTVF9JTklUKCZibGtk ZXYtPmZyZWVsaXN0KTsKKworICAgIGJsa2Rldi0+aW90aHJlYWQgPSBpb3RocmVhZF9jcmVhdGUo eGVuZGV2LT5uYW1lLCAmZXJyKTsKKyAgICBhc3NlcnQoIWVycik7CisKKyAgICBibGtkZXYtPmN0 eCA9IGlvdGhyZWFkX2dldF9haW9fY29udGV4dChibGtkZXYtPmlvdGhyZWFkKTsKKyAgICBibGtk ZXYtPmJoID0gYWlvX2JoX25ldyhibGtkZXYtPmN0eCwgYmxrX2JoLCBibGtkZXYpOworfQorCitz dGF0aWMgdm9pZCBibGtfcGFyc2VfZGlzY2FyZChzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYpCit7 CisgICAgc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2ID0gJmJsa2Rldi0+eGVuZGV2Owor ICAgIGludCBlbmFibGU7CisKKyAgICBibGtkZXYtPmZlYXR1cmVfZGlzY2FyZCA9IHRydWU7CisK KyAgICBpZiAoeGVuc3RvcmVfcmVhZF9iZV9pbnQoeGVuZGV2LCAiZGlzY2FyZC1lbmFibGUiLCAm ZW5hYmxlKSA9PSAwKSB7CisgICAgICAgIGJsa2Rldi0+ZmVhdHVyZV9kaXNjYXJkID0gISFlbmFi bGU7CisgICAgfQorCisgICAgaWYgKGJsa2Rldi0+ZmVhdHVyZV9kaXNjYXJkKSB7CisgICAgICAg IHhlbnN0b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYsICJmZWF0dXJlLWRpc2NhcmQiLCAxKTsKKyAg ICB9Cit9CisKK3N0YXRpYyBpbnQgYmxrX2luaXQoc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVu ZGV2KQoreworICAgIHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRhaW5lcl9vZih4ZW5k ZXYsIHN0cnVjdCBYZW5CbGtEZXYsIHhlbmRldik7CisgICAgaW50IGluZm8gPSAwOworICAgIGNo YXIgKmRpcmVjdGlvc2FmZSA9IE5VTEw7CisKKyAgICB0cmFjZV94ZW5fZGlza19pbml0KHhlbmRl di0+bmFtZSk7CisKKyAgICAvKiByZWFkIHhlbnN0b3JlIGVudHJpZXMgKi8KKyAgICBpZiAoYmxr ZGV2LT5wYXJhbXMgPT0gTlVMTCkgeworICAgICAgICBjaGFyICpoID0gTlVMTDsKKyAgICAgICAg YmxrZGV2LT5wYXJhbXMgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJwYXJhbXMiKTsK KyAgICAgICAgaWYgKGJsa2Rldi0+cGFyYW1zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGggPSBz dHJjaHIoYmxrZGV2LT5wYXJhbXMsICc6Jyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGggIT0g TlVMTCkgeworICAgICAgICAgICAgYmxrZGV2LT5maWxlcHJvdG8gPSBibGtkZXYtPnBhcmFtczsK KyAgICAgICAgICAgIGJsa2Rldi0+ZmlsZW5hbWUgID0gaCArIDE7CisgICAgICAgICAgICAqaCA9 IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibGtkZXYtPmZpbGVwcm90byA9ICI8 dW5zZXQ+IjsKKyAgICAgICAgICAgIGJsa2Rldi0+ZmlsZW5hbWUgID0gYmxrZGV2LT5wYXJhbXM7 CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdHJjbXAoImFpbyIsIGJsa2Rldi0+ZmlsZXBy b3RvKSkgeworICAgICAgICBibGtkZXYtPmZpbGVwcm90byA9ICJyYXciOworICAgIH0KKyAgICBp ZiAoIXN0cmNtcCgidmhkIiwgYmxrZGV2LT5maWxlcHJvdG8pKSB7CisgICAgICAgIGJsa2Rldi0+ ZmlsZXByb3RvID0gInZwYyI7CisgICAgfQorICAgIGlmIChibGtkZXYtPm1vZGUgPT0gTlVMTCkg eworICAgICAgICBibGtkZXYtPm1vZGUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJt b2RlIik7CisgICAgfQorICAgIGlmIChibGtkZXYtPnR5cGUgPT0gTlVMTCkgeworICAgICAgICBi bGtkZXYtPnR5cGUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJ0eXBlIik7CisgICAg fQorICAgIGlmIChibGtkZXYtPmRldiA9PSBOVUxMKSB7CisgICAgICAgIGJsa2Rldi0+ZGV2ID0g eGVuc3RvcmVfcmVhZF9iZV9zdHIoeGVuZGV2LCAiZGV2Iik7CisgICAgfQorICAgIGlmIChibGtk ZXYtPmRldnR5cGUgPT0gTlVMTCkgeworICAgICAgICBibGtkZXYtPmRldnR5cGUgPSB4ZW5zdG9y ZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJkZXZpY2UtdHlwZSIpOworICAgIH0KKyAgICBkaXJlY3Rp b3NhZmUgPSB4ZW5zdG9yZV9yZWFkX2JlX3N0cih4ZW5kZXYsICJkaXJlY3QtaW8tc2FmZSIpOwor ICAgIGJsa2Rldi0+ZGlyZWN0aW9zYWZlID0gKGRpcmVjdGlvc2FmZSAmJiBhdG9pKGRpcmVjdGlv c2FmZSkpOworCisgICAgLyogZG8gd2UgaGF2ZSBhbGwgd2UgbmVlZD8gKi8KKyAgICBpZiAoYmxr ZGV2LT5wYXJhbXMgPT0gTlVMTCB8fAorICAgICAgICBibGtkZXYtPm1vZGUgPT0gTlVMTCAgIHx8 CisgICAgICAgIGJsa2Rldi0+dHlwZSA9PSBOVUxMICAgfHwKKyAgICAgICAgYmxrZGV2LT5kZXYg PT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dF9lcnJvcjsKKyAgICB9CisKKyAgICAvKiByZWFk LW9ubHkgPyAqLworICAgIGlmIChzdHJjbXAoYmxrZGV2LT5tb2RlLCAidyIpKSB7CisgICAgICAg IGluZm8gIHw9IFZESVNLX1JFQURPTkxZOworICAgIH0KKworICAgIC8qIGNkcm9tID8gKi8KKyAg ICBpZiAoYmxrZGV2LT5kZXZ0eXBlICYmICFzdHJjbXAoYmxrZGV2LT5kZXZ0eXBlLCAiY2Ryb20i KSkgeworICAgICAgICBpbmZvICB8PSBWRElTS19DRFJPTTsKKyAgICB9CisKKyAgICBibGtkZXYt PmZpbGVfYmxrICA9IEJMT0NLX1NJWkU7CisKKyAgICAvKiBmaWxsIGluZm8KKyAgICAgKiBibGtf Y29ubmVjdCBzdXBwbGllcyBzZWN0b3Itc2l6ZSBhbmQgc2VjdG9ycworICAgICAqLworICAgIHhl bnN0b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYsICJmZWF0dXJlLWZsdXNoLWNhY2hlIiwgMSk7Cisg ICAgeGVuc3RvcmVfd3JpdGVfYmVfaW50KHhlbmRldiwgImluZm8iLCBpbmZvKTsKKworICAgIHhl bnN0b3JlX3dyaXRlX2JlX2ludCh4ZW5kZXYsICJtYXgtcmluZy1wYWdlLW9yZGVyIiwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgTUFYX1JJTkdfUEFHRV9PUkRFUik7CisKKyAgICBibGtfcGFy c2VfZGlzY2FyZChibGtkZXYpOworCisgICAgZ19mcmVlKGRpcmVjdGlvc2FmZSk7CisgICAgcmV0 dXJuIDA7CisKK291dF9lcnJvcjoKKyAgICBnX2ZyZWUoYmxrZGV2LT5wYXJhbXMpOworICAgIGJs a2Rldi0+cGFyYW1zID0gTlVMTDsKKyAgICBnX2ZyZWUoYmxrZGV2LT5tb2RlKTsKKyAgICBibGtk ZXYtPm1vZGUgPSBOVUxMOworICAgIGdfZnJlZShibGtkZXYtPnR5cGUpOworICAgIGJsa2Rldi0+ dHlwZSA9IE5VTEw7CisgICAgZ19mcmVlKGJsa2Rldi0+ZGV2KTsKKyAgICBibGtkZXYtPmRldiA9 IE5VTEw7CisgICAgZ19mcmVlKGJsa2Rldi0+ZGV2dHlwZSk7CisgICAgYmxrZGV2LT5kZXZ0eXBl ID0gTlVMTDsKKyAgICBnX2ZyZWUoZGlyZWN0aW9zYWZlKTsKKyAgICBibGtkZXYtPmRpcmVjdGlv c2FmZSA9IGZhbHNlOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBibGtfY29ubmVj dChzdHJ1Y3QgWGVuTGVnYWN5RGV2aWNlICp4ZW5kZXYpCit7CisgICAgc3RydWN0IFhlbkJsa0Rl diAqYmxrZGV2ID0gY29udGFpbmVyX29mKHhlbmRldiwgc3RydWN0IFhlbkJsa0RldiwgeGVuZGV2 KTsKKyAgICBpbnQgaW5kZXgsIHFmbGFnczsKKyAgICBib29sIHJlYWRvbmx5ID0gdHJ1ZTsKKyAg ICBib29sIHdyaXRldGhyb3VnaCA9IHRydWU7CisgICAgaW50IG9yZGVyLCByaW5nX3JlZjsKKyAg ICB1bnNpZ25lZCBpbnQgcmluZ19zaXplLCBtYXhfZ3JhbnRzOworICAgIHVuc2lnbmVkIGludCBp OworCisgICAgdHJhY2VfeGVuX2Rpc2tfY29ubmVjdCh4ZW5kZXYtPm5hbWUpOworCisgICAgLyog cmVhZC1vbmx5ID8gKi8KKyAgICBpZiAoYmxrZGV2LT5kaXJlY3Rpb3NhZmUpIHsKKyAgICAgICAg cWZsYWdzID0gQkRSVl9PX05PQ0FDSEUgfCBCRFJWX09fTkFUSVZFX0FJTzsKKyAgICB9IGVsc2Ug eworICAgICAgICBxZmxhZ3MgPSAwOworICAgICAgICB3cml0ZXRocm91Z2ggPSBmYWxzZTsKKyAg ICB9CisgICAgaWYgKHN0cmNtcChibGtkZXYtPm1vZGUsICJ3IikgPT0gMCkgeworICAgICAgICBx ZmxhZ3MgfD0gQkRSVl9PX1JEV1I7CisgICAgICAgIHJlYWRvbmx5ID0gZmFsc2U7CisgICAgfQor ICAgIGlmIChibGtkZXYtPmZlYXR1cmVfZGlzY2FyZCkgeworICAgICAgICBxZmxhZ3MgfD0gQkRS Vl9PX1VOTUFQOworICAgIH0KKworICAgIC8qIGluaXQgcWVtdSBibG9jayBkcml2ZXIgKi8KKyAg ICBpbmRleCA9ICh4ZW5kZXYtPmRldiAtIDIwMiAqIDI1NikgLyAxNjsKKyAgICBibGtkZXYtPmRp bmZvID0gZHJpdmVfZ2V0KElGX1hFTiwgMCwgaW5kZXgpOworICAgIGlmICghYmxrZGV2LT5kaW5m bykgeworICAgICAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKKyAgICAgICAgUURpY3QgKm9w dGlvbnMgPSBOVUxMOworCisgICAgICAgIGlmIChzdHJjbXAoYmxrZGV2LT5maWxlcHJvdG8sICI8 dW5zZXQ+IikpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBxZGljdF9uZXcoKTsKKyAgICAgICAg ICAgIHFkaWN0X3B1dF9zdHIob3B0aW9ucywgImRyaXZlciIsIGJsa2Rldi0+ZmlsZXByb3RvKTsK KyAgICAgICAgfQorCisgICAgICAgIC8qIHNldHVwIHZpYSB4ZW5idXMgLT4gY3JlYXRlIG5ldyBi bG9jayBkcml2ZXIgaW5zdGFuY2UgKi8KKyAgICAgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDIs ICJjcmVhdGUgbmV3IGJkcnYgKHhlbmJ1cyBzZXR1cClcbiIpOworICAgICAgICBibGtkZXYtPmJs ayA9IGJsa19uZXdfb3BlbihibGtkZXYtPmZpbGVuYW1lLCBOVUxMLCBvcHRpb25zLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZmxhZ3MsICZsb2NhbF9lcnIpOworICAgICAg ICBpZiAoIWJsa2Rldi0+YmxrKSB7CisgICAgICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwg MCwgImVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfZ2V0X3By ZXR0eShsb2NhbF9lcnIpKTsKKyAgICAgICAgICAgIGVycm9yX2ZyZWUobG9jYWxfZXJyKTsKKyAg ICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBibGtfc2V0X2VuYWJsZV93 cml0ZV9jYWNoZShibGtkZXYtPmJsaywgIXdyaXRldGhyb3VnaCk7CisgICAgfSBlbHNlIHsKKyAg ICAgICAgLyogc2V0dXAgdmlhIHFlbXUgY21kbGluZSAtPiBhbHJlYWR5IHNldHVwIGZvciB1cyAq LworICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRldiwgMiwKKyAgICAgICAgICAgICAgICAgICAg ICAiZ2V0IGNvbmZpZ3VyZWQgYmRydiAoY21kbGluZSBzZXR1cClcbiIpOworICAgICAgICBibGtk ZXYtPmJsayA9IGJsa19ieV9sZWdhY3lfZGluZm8oYmxrZGV2LT5kaW5mbyk7CisgICAgICAgIGlm IChibGtfaXNfcmVhZF9vbmx5KGJsa2Rldi0+YmxrKSAmJiAhcmVhZG9ubHkpIHsKKyAgICAgICAg ICAgIHhlbl9wdl9wcmludGYoeGVuZGV2LCAwLCAiVW5leHBlY3RlZCByZWFkLW9ubHkgZHJpdmUi KTsKKyAgICAgICAgICAgIGJsa2Rldi0+YmxrID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAt MTsKKyAgICAgICAgfQorICAgICAgICAvKiBibGtkZXYtPmJsayBpcyBub3QgY3JlYXRlIGJ5IHVz LCB3ZSBnZXQgYSByZWZlcmVuY2UKKyAgICAgICAgICogc28gd2UgY2FuIGJsa191bnJlZigpIHVu Y29uZGl0aW9uYWxseSAqLworICAgICAgICBibGtfcmVmKGJsa2Rldi0+YmxrKTsKKyAgICB9Cisg ICAgYmxrX2F0dGFjaF9kZXZfbGVnYWN5KGJsa2Rldi0+YmxrLCBibGtkZXYpOworICAgIGJsa2Rl di0+ZmlsZV9zaXplID0gYmxrX2dldGxlbmd0aChibGtkZXYtPmJsayk7CisgICAgaWYgKGJsa2Rl di0+ZmlsZV9zaXplIDwgMCkgeworICAgICAgICBCbG9ja0RyaXZlclN0YXRlICpicyA9IGJsa19i cyhibGtkZXYtPmJsayk7CisgICAgICAgIGNvbnN0IGNoYXIgKmRydl9uYW1lID0gYnMgPyBiZHJ2 X2dldF9mb3JtYXRfbmFtZShicykgOiBOVUxMOworICAgICAgICB4ZW5fcHZfcHJpbnRmKHhlbmRl diwgMSwgImJsa19nZXRsZW5ndGg6ICVkICglcykgfCBkcnYgJXNcbiIsCisgICAgICAgICAgICAg ICAgICAgICAgKGludClibGtkZXYtPmZpbGVfc2l6ZSwgc3RyZXJyb3IoLWJsa2Rldi0+ZmlsZV9z aXplKSwKKyAgICAgICAgICAgICAgICAgICAgICBkcnZfbmFtZSA/OiAiLSIpOworICAgICAgICBi bGtkZXYtPmZpbGVfc2l6ZSA9IDA7CisgICAgfQorCisgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYs IDEsICJ0eXBlIFwiJXNcIiwgZmlsZXByb3RvIFwiJXNcIiwgZmlsZW5hbWUgXCIlc1wiLCIKKyAg ICAgICAgICAgICAgICAgICIgc2l6ZSAlIiBQUklkNjQgIiAoJSIgUFJJZDY0ICIgTUIpXG4iLAor ICAgICAgICAgICAgICAgICAgYmxrZGV2LT50eXBlLCBibGtkZXYtPmZpbGVwcm90bywgYmxrZGV2 LT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGJsa2Rldi0+ZmlsZV9zaXplLCBibGtkZXYt PmZpbGVfc2l6ZSAvIE1pQik7CisKKyAgICAvKiBGaWxsIGluIG51bWJlciBvZiBzZWN0b3Igc2l6 ZSBhbmQgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKyAgICB4ZW5zdG9yZV93cml0ZV9iZV9pbnQoeGVu ZGV2LCAic2VjdG9yLXNpemUiLCBibGtkZXYtPmZpbGVfYmxrKTsKKyAgICB4ZW5zdG9yZV93cml0 ZV9iZV9pbnQ2NCh4ZW5kZXYsICJzZWN0b3JzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBibGtkZXYtPmZpbGVfc2l6ZSAvIGJsa2Rldi0+ZmlsZV9ibGspOworCisgICAgaWYgKHhlbnN0 b3JlX3JlYWRfZmVfaW50KHhlbmRldiwgInJpbmctcGFnZS1vcmRlciIsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZvcmRlcikgPT0gLTEpIHsKKyAgICAgICAgYmxrZGV2LT5ucl9yaW5n X3JlZiA9IDE7CisKKyAgICAgICAgaWYgKHhlbnN0b3JlX3JlYWRfZmVfaW50KHhlbmRldiwgInJp bmctcmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaW5nX3JlZikgPT0g LTEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBibGtkZXYt PnJpbmdfcmVmWzBdID0gcmluZ19yZWY7CisKKyAgICB9IGVsc2UgaWYgKG9yZGVyID49IDAgJiYg b3JkZXIgPD0gTUFYX1JJTkdfUEFHRV9PUkRFUikgeworICAgICAgICBibGtkZXYtPm5yX3Jpbmdf cmVmID0gMSA8PCBvcmRlcjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxrZGV2LT5ucl9y aW5nX3JlZjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyICprZXk7CisKKyAgICAgICAgICAgIGtl eSA9IGdfc3RyZHVwX3ByaW50ZigicmluZy1yZWYldSIsIGkpOworICAgICAgICAgICAgaWYgKCFr ZXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAg ICAgICAgIGlmICh4ZW5zdG9yZV9yZWFkX2ZlX2ludCh4ZW5kZXYsIGtleSwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAmcmluZ19yZWYpID09IC0xKSB7CisgICAgICAgICAg ICAgICAgZ19mcmVlKGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAg ICAgfQorICAgICAgICAgICAgYmxrZGV2LT5yaW5nX3JlZltpXSA9IHJpbmdfcmVmOworCisgICAg ICAgICAgICBnX2ZyZWUoa2V5KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHhl bl9wdl9wcmludGYoeGVuZGV2LCAwLCAiaW52YWxpZCByaW5nLXBhZ2Utb3JkZXI6ICVkXG4iLAor ICAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0K KworICAgIGlmICh4ZW5zdG9yZV9yZWFkX2ZlX2ludCh4ZW5kZXYsICJldmVudC1jaGFubmVsIiwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhlbmRldi0+cmVtb3RlX3BvcnQpID09IC0x KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIXhlbmRldi0+cHJvdG9j b2wpIHsKKyAgICAgICAgYmxrZGV2LT5wcm90b2NvbCA9IEJMS0lGX1BST1RPQ09MX05BVElWRTsK KyAgICB9IGVsc2UgaWYgKHN0cmNtcCh4ZW5kZXYtPnByb3RvY29sLCBYRU5fSU9fUFJPVE9fQUJJ X05BVElWRSkgPT0gMCkgeworICAgICAgICBibGtkZXYtPnByb3RvY29sID0gQkxLSUZfUFJPVE9D T0xfTkFUSVZFOworICAgIH0gZWxzZSBpZiAoc3RyY21wKHhlbmRldi0+cHJvdG9jb2wsIFhFTl9J T19QUk9UT19BQklfWDg2XzMyKSA9PSAwKSB7CisgICAgICAgIGJsa2Rldi0+cHJvdG9jb2wgPSBC TEtJRl9QUk9UT0NPTF9YODZfMzI7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoeGVuZGV2LT5wcm90 b2NvbCwgWEVOX0lPX1BST1RPX0FCSV9YODZfNjQpID09IDApIHsKKyAgICAgICAgYmxrZGV2LT5w cm90b2NvbCA9IEJMS0lGX1BST1RPQ09MX1g4Nl82NDsKKyAgICB9IGVsc2UgeworICAgICAgICBi bGtkZXYtPnByb3RvY29sID0gQkxLSUZfUFJPVE9DT0xfTkFUSVZFOworICAgIH0KKworICAgIHJp bmdfc2l6ZSA9IFhDX1BBR0VfU0laRSAqIGJsa2Rldi0+bnJfcmluZ19yZWY7CisgICAgc3dpdGNo IChibGtkZXYtPnByb3RvY29sKSB7CisgICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9OQVRJVkU6Cisg ICAgeworICAgICAgICBibGtkZXYtPm1heF9yZXF1ZXN0cyA9IF9fQ09OU1RfUklOR19TSVpFKGJs a2lmLCByaW5nX3NpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCTEtJRl9Q Uk9UT0NPTF9YODZfMzI6CisgICAgeworICAgICAgICBibGtkZXYtPm1heF9yZXF1ZXN0cyA9IF9f Q09OU1RfUklOR19TSVpFKGJsa2lmX3g4Nl8zMiwgcmluZ19zaXplKTsKKyAgICAgICAgYnJlYWs7 CisgICAgfQorICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzY0OgorICAgIHsKKyAgICAgICAg YmxrZGV2LT5tYXhfcmVxdWVzdHMgPSBfX0NPTlNUX1JJTkdfU0laRShibGtpZl94ODZfNjQsIHJp bmdfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBy ZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQWRkIG9uIHRoZSBudW1iZXIgbmVlZGVkIGZvciB0 aGUgcmluZyBwYWdlcyAqLworICAgIG1heF9ncmFudHMgPSBibGtkZXYtPm5yX3JpbmdfcmVmOwor CisgICAgeGVuX2JlX3NldF9tYXhfZ3JhbnRfcmVmcyh4ZW5kZXYsIG1heF9ncmFudHMpOworICAg IGJsa2Rldi0+c3JpbmcgPSB4ZW5fYmVfbWFwX2dyYW50X3JlZnMoeGVuZGV2LCBibGtkZXYtPnJp bmdfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrZGV2 LT5ucl9yaW5nX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworICAgIGlmICghYmxrZGV2LT5zcmluZykgeworICAg ICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3dpdGNoIChibGtkZXYtPnByb3RvY29sKSB7 CisgICAgY2FzZSBCTEtJRl9QUk9UT0NPTF9OQVRJVkU6CisgICAgeworICAgICAgICBibGtpZl9z cmluZ190ICpzcmluZ19uYXRpdmUgPSBibGtkZXYtPnNyaW5nOworICAgICAgICBCQUNLX1JJTkdf SU5JVCgmYmxrZGV2LT5yaW5ncy5uYXRpdmUsIHNyaW5nX25hdGl2ZSwgcmluZ19zaXplKTsKKyAg ICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzMyOgorICAg IHsKKyAgICAgICAgYmxraWZfeDg2XzMyX3NyaW5nX3QgKnNyaW5nX3g4Nl8zMiA9IGJsa2Rldi0+ c3Jpbmc7CisKKyAgICAgICAgQkFDS19SSU5HX0lOSVQoJmJsa2Rldi0+cmluZ3MueDg2XzMyX3Bh cnQsIHNyaW5nX3g4Nl8zMiwgcmluZ19zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg IGNhc2UgQkxLSUZfUFJPVE9DT0xfWDg2XzY0OgorICAgIHsKKyAgICAgICAgYmxraWZfeDg2XzY0 X3NyaW5nX3QgKnNyaW5nX3g4Nl82NCA9IGJsa2Rldi0+c3Jpbmc7CisKKyAgICAgICAgQkFDS19S SU5HX0lOSVQoJmJsa2Rldi0+cmluZ3MueDg2XzY0X3BhcnQsIHNyaW5nX3g4Nl82NCwgcmluZ19z aXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKworICAgIGJsa19zZXRfYWlvX2Nv bnRleHQoYmxrZGV2LT5ibGssIGJsa2Rldi0+Y3R4KTsKKworICAgIHhlbl9iZV9iaW5kX2V2dGNo bih4ZW5kZXYpOworCisgICAgeGVuX3B2X3ByaW50Zih4ZW5kZXYsIDEsICJvazogcHJvdG8gJXMs IG5yLXJpbmctcmVmICV1LCAiCisgICAgICAgICAgICAgICAgICAicmVtb3RlIHBvcnQgJWQsIGxv Y2FsIHBvcnQgJWRcbiIsCisgICAgICAgICAgICAgICAgICB4ZW5kZXYtPnByb3RvY29sLCBibGtk ZXYtPm5yX3JpbmdfcmVmLAorICAgICAgICAgICAgICAgICAgeGVuZGV2LT5yZW1vdGVfcG9ydCwg eGVuZGV2LT5sb2NhbF9wb3J0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmxr X2Rpc2Nvbm5lY3Qoc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2KQoreworICAgIHN0cnVj dCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRhaW5lcl9vZih4ZW5kZXYsIHN0cnVjdCBYZW5CbGtE ZXYsIHhlbmRldik7CisKKyAgICB0cmFjZV94ZW5fZGlza19kaXNjb25uZWN0KHhlbmRldi0+bmFt ZSk7CisKKyAgICBhaW9fY29udGV4dF9hY3F1aXJlKGJsa2Rldi0+Y3R4KTsKKworICAgIGlmIChi bGtkZXYtPmJsaykgeworICAgICAgICBibGtfc2V0X2Fpb19jb250ZXh0KGJsa2Rldi0+YmxrLCBx ZW11X2dldF9haW9fY29udGV4dCgpKTsKKyAgICAgICAgYmxrX2RldGFjaF9kZXYoYmxrZGV2LT5i bGssIGJsa2Rldik7CisgICAgICAgIGJsa191bnJlZihibGtkZXYtPmJsayk7CisgICAgICAgIGJs a2Rldi0+YmxrID0gTlVMTDsKKyAgICB9CisgICAgeGVuX3B2X3VuYmluZF9ldnRjaG4oeGVuZGV2 KTsKKworICAgIGFpb19jb250ZXh0X3JlbGVhc2UoYmxrZGV2LT5jdHgpOworCisgICAgaWYgKGJs a2Rldi0+c3JpbmcpIHsKKyAgICAgICAgeGVuX2JlX3VubWFwX2dyYW50X3JlZnMoeGVuZGV2LCBi bGtkZXYtPnNyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtkZXYtPm5y X3JpbmdfcmVmKTsKKyAgICAgICAgYmxrZGV2LT5zcmluZyA9IE5VTEw7CisgICAgfQorfQorCitz dGF0aWMgaW50IGJsa19mcmVlKHN0cnVjdCBYZW5MZWdhY3lEZXZpY2UgKnhlbmRldikKK3sKKyAg ICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBjb250YWluZXJfb2YoeGVuZGV2LCBzdHJ1Y3Qg WGVuQmxrRGV2LCB4ZW5kZXYpOworICAgIHN0cnVjdCBpb3JlcSAqaW9yZXE7CisKKyAgICB0cmFj ZV94ZW5fZGlza19mcmVlKHhlbmRldi0+bmFtZSk7CisKKyAgICBibGtfZGlzY29ubmVjdCh4ZW5k ZXYpOworCisgICAgd2hpbGUgKCFRTElTVF9FTVBUWSgmYmxrZGV2LT5mcmVlbGlzdCkpIHsKKyAg ICAgICAgaW9yZXEgPSBRTElTVF9GSVJTVCgmYmxrZGV2LT5mcmVlbGlzdCk7CisgICAgICAgIFFM SVNUX1JFTU9WRShpb3JlcSwgbGlzdCk7CisgICAgICAgIHFlbXVfaW92ZWNfZGVzdHJveSgmaW9y ZXEtPnYpOworICAgICAgICBnX2ZyZWUoaW9yZXEpOworICAgIH0KKworICAgIGdfZnJlZShibGtk ZXYtPnBhcmFtcyk7CisgICAgZ19mcmVlKGJsa2Rldi0+bW9kZSk7CisgICAgZ19mcmVlKGJsa2Rl di0+dHlwZSk7CisgICAgZ19mcmVlKGJsa2Rldi0+ZGV2KTsKKyAgICBnX2ZyZWUoYmxrZGV2LT5k ZXZ0eXBlKTsKKyAgICBxZW11X2JoX2RlbGV0ZShibGtkZXYtPmJoKTsKKyAgICBpb3RocmVhZF9k ZXN0cm95KGJsa2Rldi0+aW90aHJlYWQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBibGtfZXZlbnQoc3RydWN0IFhlbkxlZ2FjeURldmljZSAqeGVuZGV2KQoreworICAgIHN0cnVj dCBYZW5CbGtEZXYgKmJsa2RldiA9IGNvbnRhaW5lcl9vZih4ZW5kZXYsIHN0cnVjdCBYZW5CbGtE ZXYsIHhlbmRldik7CisKKyAgICBxZW11X2JoX3NjaGVkdWxlKGJsa2Rldi0+YmgpOworfQorCitz dHJ1Y3QgWGVuRGV2T3BzIHhlbl9ibGtkZXZfb3BzID0geworICAgIC5mbGFncyAgICAgID0gREVW T1BTX0ZMQUdfTkVFRF9HTlRERVYsCisgICAgLnNpemUgICAgICAgPSBzaXplb2Yoc3RydWN0IFhl bkJsa0RldiksCisgICAgLmFsbG9jICAgICAgPSBibGtfYWxsb2MsCisgICAgLmluaXQgICAgICAg PSBibGtfaW5pdCwKKyAgICAuaW5pdGlhbGlzZSA9IGJsa19jb25uZWN0LAorICAgIC5kaXNjb25u ZWN0ID0gYmxrX2Rpc2Nvbm5lY3QsCisgICAgLmV2ZW50ICAgICAgPSBibGtfZXZlbnQsCisgICAg LmZyZWUgICAgICAgPSBibGtfZnJlZSwKK307Ci0tIAoyLjEuNAoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVu LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcv bWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56032) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gWfZq-0003qC-DO for qemu-devel@nongnu.org; Tue, 11 Dec 2018 05:47:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gWfZl-00008t-Pe for qemu-devel@nongnu.org; Tue, 11 Dec 2018 05:47:46 -0500 From: Paul Durrant Date: Tue, 11 Dec 2018 10:47:08 +0000 Message-ID: <1544525238-3527-9-git-send-email-paul.durrant@citrix.com> In-Reply-To: <1544525238-3527-1-git-send-email-paul.durrant@citrix.com> References: <1544525238-3527-1-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v3 08/18] xen: duplicate xen_disk.c as basis of dataplane/xen-block.c List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, qemu-block@nongnu.org, xen-devel@lists.xenproject.org Cc: Paul Durrant , Stefano Stabellini , Stefan Hajnoczi , Kevin Wolf , Max Reitz The new xen-block XenDevice implementation requires the same core dataplane as the legacy xen_disk implementation it will eventually replace. This patch therefore copies the legacy xen_disk.c source module into a new dataplane/xen-block.c source module as the basis for the new dataplane and adjusts the MAINTAINERS file accordingly. NOTE: The duplicated code is not yet built. It is simply put into place by this patch (just fixing style violations) such that the modifications that will need to be made to the code are not conflated with code movement, thus making review harder. Signed-off-by: Paul Durrant Acked-by: Anthony Perard --- Cc: Stefano Stabellini Cc: Stefan Hajnoczi Cc: Kevin Wolf Cc: Max Reitz --- MAINTAINERS | 1 + hw/block/dataplane/xen-block.c | 1019 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1020 insertions(+) create mode 100644 hw/block/dataplane/xen-block.c diff --git a/MAINTAINERS b/MAINTAINERS index dd728c3..ab62ad4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -404,6 +404,7 @@ F: hw/char/xen_console.c F: hw/display/xenfb.c F: hw/net/xen_nic.c F: hw/block/xen* +F: hw/block/dataplane/xen* F: hw/xen/ F: hw/xenpv/ F: hw/i386/xen/ diff --git a/hw/block/dataplane/xen-block.c b/hw/block/dataplane/xen-block.c new file mode 100644 index 0000000..9fae505 --- /dev/null +++ b/hw/block/dataplane/xen-block.c @@ -0,0 +1,1019 @@ +/* + * xen paravirt block device backend + * + * (c) Gerd Hoffmann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + * + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include +#include + +#include "hw/hw.h" +#include "hw/xen/xen_backend.h" +#include "xen_blkif.h" +#include "sysemu/blockdev.h" +#include "sysemu/iothread.h" +#include "sysemu/block-backend.h" +#include "qapi/error.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qstring.h" +#include "trace.h" + +/* ------------------------------------------------------------- */ + +#define BLOCK_SIZE 512 +#define IOCB_COUNT (BLKIF_MAX_SEGMENTS_PER_REQUEST + 2) + +struct ioreq { + blkif_request_t req; + int16_t status; + + /* parsed request */ + off_t start; + QEMUIOVector v; + void *buf; + size_t size; + int presync; + + /* aio status */ + int aio_inflight; + int aio_errors; + + struct XenBlkDev *blkdev; + QLIST_ENTRY(ioreq) list; + BlockAcctCookie acct; +}; + +#define MAX_RING_PAGE_ORDER 4 + +struct XenBlkDev { + struct XenLegacyDevice xendev; /* must be first */ + char *params; + char *mode; + char *type; + char *dev; + char *devtype; + bool directiosafe; + const char *fileproto; + const char *filename; + unsigned int ring_ref[1 << MAX_RING_PAGE_ORDER]; + unsigned int nr_ring_ref; + void *sring; + int64_t file_blk; + int64_t file_size; + int protocol; + blkif_back_rings_t rings; + int more_work; + + /* request lists */ + QLIST_HEAD(inflight_head, ioreq) inflight; + QLIST_HEAD(finished_head, ioreq) finished; + QLIST_HEAD(freelist_head, ioreq) freelist; + int requests_total; + int requests_inflight; + int requests_finished; + unsigned int max_requests; + + gboolean feature_discard; + + /* qemu block driver */ + DriveInfo *dinfo; + BlockBackend *blk; + QEMUBH *bh; + + IOThread *iothread; + AioContext *ctx; +}; + +/* ------------------------------------------------------------- */ + +static void ioreq_reset(struct ioreq *ioreq) +{ + memset(&ioreq->req, 0, sizeof(ioreq->req)); + ioreq->status = 0; + ioreq->start = 0; + ioreq->buf = NULL; + ioreq->size = 0; + ioreq->presync = 0; + + ioreq->aio_inflight = 0; + ioreq->aio_errors = 0; + + ioreq->blkdev = NULL; + memset(&ioreq->list, 0, sizeof(ioreq->list)); + memset(&ioreq->acct, 0, sizeof(ioreq->acct)); + + qemu_iovec_reset(&ioreq->v); +} + +static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) +{ + struct ioreq *ioreq = NULL; + + if (QLIST_EMPTY(&blkdev->freelist)) { + if (blkdev->requests_total >= blkdev->max_requests) { + goto out; + } + /* allocate new struct */ + ioreq = g_malloc0(sizeof(*ioreq)); + ioreq->blkdev = blkdev; + blkdev->requests_total++; + qemu_iovec_init(&ioreq->v, 1); + } else { + /* get one from freelist */ + ioreq = QLIST_FIRST(&blkdev->freelist); + QLIST_REMOVE(ioreq, list); + } + QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list); + blkdev->requests_inflight++; + +out: + return ioreq; +} + +static void ioreq_finish(struct ioreq *ioreq) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + + QLIST_REMOVE(ioreq, list); + QLIST_INSERT_HEAD(&blkdev->finished, ioreq, list); + blkdev->requests_inflight--; + blkdev->requests_finished++; +} + +static void ioreq_release(struct ioreq *ioreq, bool finish) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + + QLIST_REMOVE(ioreq, list); + ioreq_reset(ioreq); + ioreq->blkdev = blkdev; + QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list); + if (finish) { + blkdev->requests_finished--; + } else { + blkdev->requests_inflight--; + } +} + +/* + * translate request into iovec + start offset + * do sanity checks along the way + */ +static int ioreq_parse(struct ioreq *ioreq) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + struct XenLegacyDevice *xendev = &blkdev->xendev; + size_t len; + int i; + + xen_pv_printf( + xendev, 3, + "op %d, nr %d, handle %d, id %" PRId64 ", sector %" PRId64 "\n", + ioreq->req.operation, ioreq->req.nr_segments, + ioreq->req.handle, ioreq->req.id, ioreq->req.sector_number); + switch (ioreq->req.operation) { + case BLKIF_OP_READ: + break; + case BLKIF_OP_FLUSH_DISKCACHE: + ioreq->presync = 1; + if (!ioreq->req.nr_segments) { + return 0; + } + /* fall through */ + case BLKIF_OP_WRITE: + break; + case BLKIF_OP_DISCARD: + return 0; + default: + xen_pv_printf(xendev, 0, "error: unknown operation (%d)\n", + ioreq->req.operation); + goto err; + }; + + if (ioreq->req.operation != BLKIF_OP_READ && blkdev->mode[0] != 'w') { + xen_pv_printf(xendev, 0, "error: write req for ro device\n"); + goto err; + } + + ioreq->start = ioreq->req.sector_number * blkdev->file_blk; + for (i = 0; i < ioreq->req.nr_segments; i++) { + if (i == BLKIF_MAX_SEGMENTS_PER_REQUEST) { + xen_pv_printf(xendev, 0, "error: nr_segments too big\n"); + goto err; + } + if (ioreq->req.seg[i].first_sect > ioreq->req.seg[i].last_sect) { + xen_pv_printf(xendev, 0, "error: first > last sector\n"); + goto err; + } + if (ioreq->req.seg[i].last_sect * BLOCK_SIZE >= XC_PAGE_SIZE) { + xen_pv_printf(xendev, 0, "error: page crossing\n"); + goto err; + } + + len = (ioreq->req.seg[i].last_sect - + ioreq->req.seg[i].first_sect + 1) * blkdev->file_blk; + ioreq->size += len; + } + if (ioreq->start + ioreq->size > blkdev->file_size) { + xen_pv_printf(xendev, 0, "error: access beyond end of file\n"); + goto err; + } + return 0; + +err: + ioreq->status = BLKIF_RSP_ERROR; + return -1; +} + +static int ioreq_grant_copy(struct ioreq *ioreq) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + struct XenLegacyDevice *xendev = &blkdev->xendev; + XenGrantCopySegment segs[BLKIF_MAX_SEGMENTS_PER_REQUEST]; + int i, count, rc; + int64_t file_blk = blkdev->file_blk; + bool to_domain = (ioreq->req.operation == BLKIF_OP_READ); + void *virt = ioreq->buf; + + if (ioreq->req.nr_segments == 0) { + return 0; + } + + count = ioreq->req.nr_segments; + + for (i = 0; i < count; i++) { + if (to_domain) { + segs[i].dest.foreign.ref = ioreq->req.seg[i].gref; + segs[i].dest.foreign.offset = ioreq->req.seg[i].first_sect * + file_blk; + segs[i].source.virt = virt; + } else { + segs[i].source.foreign.ref = ioreq->req.seg[i].gref; + segs[i].source.foreign.offset = ioreq->req.seg[i].first_sect * + file_blk; + segs[i].dest.virt = virt; + } + segs[i].len = (ioreq->req.seg[i].last_sect + - ioreq->req.seg[i].first_sect + 1) * file_blk; + virt += segs[i].len; + } + + rc = xen_be_copy_grant_refs(xendev, to_domain, segs, count); + + if (rc) { + xen_pv_printf(xendev, 0, + "failed to copy data %d\n", rc); + ioreq->aio_errors++; + return -1; + } + + return rc; +} + +static int ioreq_runio_qemu_aio(struct ioreq *ioreq); + +static void qemu_aio_complete(void *opaque, int ret) +{ + struct ioreq *ioreq = opaque; + struct XenBlkDev *blkdev = ioreq->blkdev; + struct XenLegacyDevice *xendev = &blkdev->xendev; + + aio_context_acquire(blkdev->ctx); + + if (ret != 0) { + xen_pv_printf(xendev, 0, "%s I/O error\n", + ioreq->req.operation == BLKIF_OP_READ ? "read" : "write"); + ioreq->aio_errors++; + } + + ioreq->aio_inflight--; + if (ioreq->presync) { + ioreq->presync = 0; + ioreq_runio_qemu_aio(ioreq); + goto done; + } + if (ioreq->aio_inflight > 0) { + goto done; + } + + switch (ioreq->req.operation) { + case BLKIF_OP_READ: + /* in case of failure ioreq->aio_errors is increased */ + if (ret == 0) { + ioreq_grant_copy(ioreq); + } + qemu_vfree(ioreq->buf); + break; + case BLKIF_OP_WRITE: + case BLKIF_OP_FLUSH_DISKCACHE: + if (!ioreq->req.nr_segments) { + break; + } + qemu_vfree(ioreq->buf); + break; + default: + break; + } + + ioreq->status = ioreq->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; + ioreq_finish(ioreq); + + switch (ioreq->req.operation) { + case BLKIF_OP_WRITE: + case BLKIF_OP_FLUSH_DISKCACHE: + if (!ioreq->req.nr_segments) { + break; + } + case BLKIF_OP_READ: + if (ioreq->status == BLKIF_RSP_OKAY) { + block_acct_done(blk_get_stats(blkdev->blk), &ioreq->acct); + } else { + block_acct_failed(blk_get_stats(blkdev->blk), &ioreq->acct); + } + break; + case BLKIF_OP_DISCARD: + default: + break; + } + qemu_bh_schedule(blkdev->bh); + +done: + aio_context_release(blkdev->ctx); +} + +static bool blk_split_discard(struct ioreq *ioreq, blkif_sector_t sector_number, + uint64_t nr_sectors) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + int64_t byte_offset; + int byte_chunk; + uint64_t byte_remaining, limit; + uint64_t sec_start = sector_number; + uint64_t sec_count = nr_sectors; + + /* Wrap around, or overflowing byte limit? */ + if (sec_start + sec_count < sec_count || + sec_start + sec_count > INT64_MAX >> BDRV_SECTOR_BITS) { + return false; + } + + limit = BDRV_REQUEST_MAX_SECTORS << BDRV_SECTOR_BITS; + byte_offset = sec_start << BDRV_SECTOR_BITS; + byte_remaining = sec_count << BDRV_SECTOR_BITS; + + do { + byte_chunk = byte_remaining > limit ? limit : byte_remaining; + ioreq->aio_inflight++; + blk_aio_pdiscard(blkdev->blk, byte_offset, byte_chunk, + qemu_aio_complete, ioreq); + byte_remaining -= byte_chunk; + byte_offset += byte_chunk; + } while (byte_remaining > 0); + + return true; +} + +static int ioreq_runio_qemu_aio(struct ioreq *ioreq) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + + ioreq->buf = qemu_memalign(XC_PAGE_SIZE, ioreq->size); + if (ioreq->req.nr_segments && + (ioreq->req.operation == BLKIF_OP_WRITE || + ioreq->req.operation == BLKIF_OP_FLUSH_DISKCACHE) && + ioreq_grant_copy(ioreq)) { + qemu_vfree(ioreq->buf); + goto err; + } + + ioreq->aio_inflight++; + if (ioreq->presync) { + blk_aio_flush(ioreq->blkdev->blk, qemu_aio_complete, ioreq); + return 0; + } + + switch (ioreq->req.operation) { + case BLKIF_OP_READ: + qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); + block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct, + ioreq->v.size, BLOCK_ACCT_READ); + ioreq->aio_inflight++; + blk_aio_preadv(blkdev->blk, ioreq->start, &ioreq->v, 0, + qemu_aio_complete, ioreq); + break; + case BLKIF_OP_WRITE: + case BLKIF_OP_FLUSH_DISKCACHE: + if (!ioreq->req.nr_segments) { + break; + } + + qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); + block_acct_start(blk_get_stats(blkdev->blk), &ioreq->acct, + ioreq->v.size, + ioreq->req.operation == BLKIF_OP_WRITE ? + BLOCK_ACCT_WRITE : BLOCK_ACCT_FLUSH); + ioreq->aio_inflight++; + blk_aio_pwritev(blkdev->blk, ioreq->start, &ioreq->v, 0, + qemu_aio_complete, ioreq); + break; + case BLKIF_OP_DISCARD: + { + struct blkif_request_discard *req = (void *)&ioreq->req; + if (!blk_split_discard(ioreq, req->sector_number, req->nr_sectors)) { + goto err; + } + break; + } + default: + /* unknown operation (shouldn't happen -- parse catches this) */ + goto err; + } + + qemu_aio_complete(ioreq, 0); + + return 0; + +err: + ioreq_finish(ioreq); + ioreq->status = BLKIF_RSP_ERROR; + return -1; +} + +static int blk_send_response_one(struct ioreq *ioreq) +{ + struct XenBlkDev *blkdev = ioreq->blkdev; + int send_notify = 0; + int have_requests = 0; + blkif_response_t *resp; + + /* Place on the response ring for the relevant domain. */ + switch (blkdev->protocol) { + case BLKIF_PROTOCOL_NATIVE: + resp = (blkif_response_t *)RING_GET_RESPONSE( + &blkdev->rings.native, + blkdev->rings.native.rsp_prod_pvt); + break; + case BLKIF_PROTOCOL_X86_32: + resp = (blkif_response_t *)RING_GET_RESPONSE( + &blkdev->rings.x86_32_part, + blkdev->rings.x86_32_part.rsp_prod_pvt); + break; + case BLKIF_PROTOCOL_X86_64: + resp = (blkif_response_t *)RING_GET_RESPONSE( + &blkdev->rings.x86_64_part, + blkdev->rings.x86_64_part.rsp_prod_pvt); + break; + default: + return 0; + } + + resp->id = ioreq->req.id; + resp->operation = ioreq->req.operation; + resp->status = ioreq->status; + + blkdev->rings.common.rsp_prod_pvt++; + + RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blkdev->rings.common, send_notify); + if (blkdev->rings.common.rsp_prod_pvt == blkdev->rings.common.req_cons) { + /* + * Tail check for pending requests. Allows frontend to avoid + * notifications if requests are already in flight (lower + * overheads and promotes batching). + */ + RING_FINAL_CHECK_FOR_REQUESTS(&blkdev->rings.common, have_requests); + } else if (RING_HAS_UNCONSUMED_REQUESTS(&blkdev->rings.common)) { + have_requests = 1; + } + + if (have_requests) { + blkdev->more_work++; + } + return send_notify; +} + +/* walk finished list, send outstanding responses, free requests */ +static void blk_send_response_all(struct XenBlkDev *blkdev) +{ + struct ioreq *ioreq; + int send_notify = 0; + + while (!QLIST_EMPTY(&blkdev->finished)) { + ioreq = QLIST_FIRST(&blkdev->finished); + send_notify += blk_send_response_one(ioreq); + ioreq_release(ioreq, true); + } + if (send_notify) { + xen_pv_send_notify(&blkdev->xendev); + } +} + +static int blk_get_request(struct XenBlkDev *blkdev, struct ioreq *ioreq, + RING_IDX rc) +{ + switch (blkdev->protocol) { + case BLKIF_PROTOCOL_NATIVE: + memcpy(&ioreq->req, RING_GET_REQUEST(&blkdev->rings.native, rc), + sizeof(ioreq->req)); + break; + case BLKIF_PROTOCOL_X86_32: + blkif_get_x86_32_req(&ioreq->req, + RING_GET_REQUEST(&blkdev->rings.x86_32_part, rc)); + break; + case BLKIF_PROTOCOL_X86_64: + blkif_get_x86_64_req(&ioreq->req, + RING_GET_REQUEST(&blkdev->rings.x86_64_part, rc)); + break; + } + /* Prevent the compiler from accessing the on-ring fields instead. */ + barrier(); + return 0; +} + +static void blk_handle_requests(struct XenBlkDev *blkdev) +{ + RING_IDX rc, rp; + struct ioreq *ioreq; + + blkdev->more_work = 0; + + rc = blkdev->rings.common.req_cons; + rp = blkdev->rings.common.sring->req_prod; + xen_rmb(); /* Ensure we see queued requests up to 'rp'. */ + + blk_send_response_all(blkdev); + while (rc != rp) { + /* pull request from ring */ + if (RING_REQUEST_CONS_OVERFLOW(&blkdev->rings.common, rc)) { + break; + } + ioreq = ioreq_start(blkdev); + if (ioreq == NULL) { + blkdev->more_work++; + break; + } + blk_get_request(blkdev, ioreq, rc); + blkdev->rings.common.req_cons = ++rc; + + /* parse them */ + if (ioreq_parse(ioreq) != 0) { + + switch (ioreq->req.operation) { + case BLKIF_OP_READ: + block_acct_invalid(blk_get_stats(blkdev->blk), + BLOCK_ACCT_READ); + break; + case BLKIF_OP_WRITE: + block_acct_invalid(blk_get_stats(blkdev->blk), + BLOCK_ACCT_WRITE); + break; + case BLKIF_OP_FLUSH_DISKCACHE: + block_acct_invalid(blk_get_stats(blkdev->blk), + BLOCK_ACCT_FLUSH); + default: + break; + }; + + if (blk_send_response_one(ioreq)) { + xen_pv_send_notify(&blkdev->xendev); + } + ioreq_release(ioreq, false); + continue; + } + + ioreq_runio_qemu_aio(ioreq); + } + + if (blkdev->more_work && blkdev->requests_inflight < blkdev->max_requests) { + qemu_bh_schedule(blkdev->bh); + } +} + +/* ------------------------------------------------------------- */ + +static void blk_bh(void *opaque) +{ + struct XenBlkDev *blkdev = opaque; + + aio_context_acquire(blkdev->ctx); + blk_handle_requests(blkdev); + aio_context_release(blkdev->ctx); +} + +static void blk_alloc(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + Error *err = NULL; + + trace_xen_disk_alloc(xendev->name); + + QLIST_INIT(&blkdev->inflight); + QLIST_INIT(&blkdev->finished); + QLIST_INIT(&blkdev->freelist); + + blkdev->iothread = iothread_create(xendev->name, &err); + assert(!err); + + blkdev->ctx = iothread_get_aio_context(blkdev->iothread); + blkdev->bh = aio_bh_new(blkdev->ctx, blk_bh, blkdev); +} + +static void blk_parse_discard(struct XenBlkDev *blkdev) +{ + struct XenLegacyDevice *xendev = &blkdev->xendev; + int enable; + + blkdev->feature_discard = true; + + if (xenstore_read_be_int(xendev, "discard-enable", &enable) == 0) { + blkdev->feature_discard = !!enable; + } + + if (blkdev->feature_discard) { + xenstore_write_be_int(xendev, "feature-discard", 1); + } +} + +static int blk_init(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + int info = 0; + char *directiosafe = NULL; + + trace_xen_disk_init(xendev->name); + + /* read xenstore entries */ + if (blkdev->params == NULL) { + char *h = NULL; + blkdev->params = xenstore_read_be_str(xendev, "params"); + if (blkdev->params != NULL) { + h = strchr(blkdev->params, ':'); + } + if (h != NULL) { + blkdev->fileproto = blkdev->params; + blkdev->filename = h + 1; + *h = 0; + } else { + blkdev->fileproto = ""; + blkdev->filename = blkdev->params; + } + } + if (!strcmp("aio", blkdev->fileproto)) { + blkdev->fileproto = "raw"; + } + if (!strcmp("vhd", blkdev->fileproto)) { + blkdev->fileproto = "vpc"; + } + if (blkdev->mode == NULL) { + blkdev->mode = xenstore_read_be_str(xendev, "mode"); + } + if (blkdev->type == NULL) { + blkdev->type = xenstore_read_be_str(xendev, "type"); + } + if (blkdev->dev == NULL) { + blkdev->dev = xenstore_read_be_str(xendev, "dev"); + } + if (blkdev->devtype == NULL) { + blkdev->devtype = xenstore_read_be_str(xendev, "device-type"); + } + directiosafe = xenstore_read_be_str(xendev, "direct-io-safe"); + blkdev->directiosafe = (directiosafe && atoi(directiosafe)); + + /* do we have all we need? */ + if (blkdev->params == NULL || + blkdev->mode == NULL || + blkdev->type == NULL || + blkdev->dev == NULL) { + goto out_error; + } + + /* read-only ? */ + if (strcmp(blkdev->mode, "w")) { + info |= VDISK_READONLY; + } + + /* cdrom ? */ + if (blkdev->devtype && !strcmp(blkdev->devtype, "cdrom")) { + info |= VDISK_CDROM; + } + + blkdev->file_blk = BLOCK_SIZE; + + /* fill info + * blk_connect supplies sector-size and sectors + */ + xenstore_write_be_int(xendev, "feature-flush-cache", 1); + xenstore_write_be_int(xendev, "info", info); + + xenstore_write_be_int(xendev, "max-ring-page-order", + MAX_RING_PAGE_ORDER); + + blk_parse_discard(blkdev); + + g_free(directiosafe); + return 0; + +out_error: + g_free(blkdev->params); + blkdev->params = NULL; + g_free(blkdev->mode); + blkdev->mode = NULL; + g_free(blkdev->type); + blkdev->type = NULL; + g_free(blkdev->dev); + blkdev->dev = NULL; + g_free(blkdev->devtype); + blkdev->devtype = NULL; + g_free(directiosafe); + blkdev->directiosafe = false; + return -1; +} + +static int blk_connect(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + int index, qflags; + bool readonly = true; + bool writethrough = true; + int order, ring_ref; + unsigned int ring_size, max_grants; + unsigned int i; + + trace_xen_disk_connect(xendev->name); + + /* read-only ? */ + if (blkdev->directiosafe) { + qflags = BDRV_O_NOCACHE | BDRV_O_NATIVE_AIO; + } else { + qflags = 0; + writethrough = false; + } + if (strcmp(blkdev->mode, "w") == 0) { + qflags |= BDRV_O_RDWR; + readonly = false; + } + if (blkdev->feature_discard) { + qflags |= BDRV_O_UNMAP; + } + + /* init qemu block driver */ + index = (xendev->dev - 202 * 256) / 16; + blkdev->dinfo = drive_get(IF_XEN, 0, index); + if (!blkdev->dinfo) { + Error *local_err = NULL; + QDict *options = NULL; + + if (strcmp(blkdev->fileproto, "")) { + options = qdict_new(); + qdict_put_str(options, "driver", blkdev->fileproto); + } + + /* setup via xenbus -> create new block driver instance */ + xen_pv_printf(xendev, 2, "create new bdrv (xenbus setup)\n"); + blkdev->blk = blk_new_open(blkdev->filename, NULL, options, + qflags, &local_err); + if (!blkdev->blk) { + xen_pv_printf(xendev, 0, "error: %s\n", + error_get_pretty(local_err)); + error_free(local_err); + return -1; + } + blk_set_enable_write_cache(blkdev->blk, !writethrough); + } else { + /* setup via qemu cmdline -> already setup for us */ + xen_pv_printf(xendev, 2, + "get configured bdrv (cmdline setup)\n"); + blkdev->blk = blk_by_legacy_dinfo(blkdev->dinfo); + if (blk_is_read_only(blkdev->blk) && !readonly) { + xen_pv_printf(xendev, 0, "Unexpected read-only drive"); + blkdev->blk = NULL; + return -1; + } + /* blkdev->blk is not create by us, we get a reference + * so we can blk_unref() unconditionally */ + blk_ref(blkdev->blk); + } + blk_attach_dev_legacy(blkdev->blk, blkdev); + blkdev->file_size = blk_getlength(blkdev->blk); + if (blkdev->file_size < 0) { + BlockDriverState *bs = blk_bs(blkdev->blk); + const char *drv_name = bs ? bdrv_get_format_name(bs) : NULL; + xen_pv_printf(xendev, 1, "blk_getlength: %d (%s) | drv %s\n", + (int)blkdev->file_size, strerror(-blkdev->file_size), + drv_name ?: "-"); + blkdev->file_size = 0; + } + + xen_pv_printf(xendev, 1, "type \"%s\", fileproto \"%s\", filename \"%s\"," + " size %" PRId64 " (%" PRId64 " MB)\n", + blkdev->type, blkdev->fileproto, blkdev->filename, + blkdev->file_size, blkdev->file_size / MiB); + + /* Fill in number of sector size and number of sectors */ + xenstore_write_be_int(xendev, "sector-size", blkdev->file_blk); + xenstore_write_be_int64(xendev, "sectors", + blkdev->file_size / blkdev->file_blk); + + if (xenstore_read_fe_int(xendev, "ring-page-order", + &order) == -1) { + blkdev->nr_ring_ref = 1; + + if (xenstore_read_fe_int(xendev, "ring-ref", + &ring_ref) == -1) { + return -1; + } + blkdev->ring_ref[0] = ring_ref; + + } else if (order >= 0 && order <= MAX_RING_PAGE_ORDER) { + blkdev->nr_ring_ref = 1 << order; + + for (i = 0; i < blkdev->nr_ring_ref; i++) { + char *key; + + key = g_strdup_printf("ring-ref%u", i); + if (!key) { + return -1; + } + + if (xenstore_read_fe_int(xendev, key, + &ring_ref) == -1) { + g_free(key); + return -1; + } + blkdev->ring_ref[i] = ring_ref; + + g_free(key); + } + } else { + xen_pv_printf(xendev, 0, "invalid ring-page-order: %d\n", + order); + return -1; + } + + if (xenstore_read_fe_int(xendev, "event-channel", + &xendev->remote_port) == -1) { + return -1; + } + + if (!xendev->protocol) { + blkdev->protocol = BLKIF_PROTOCOL_NATIVE; + } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_NATIVE) == 0) { + blkdev->protocol = BLKIF_PROTOCOL_NATIVE; + } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_X86_32) == 0) { + blkdev->protocol = BLKIF_PROTOCOL_X86_32; + } else if (strcmp(xendev->protocol, XEN_IO_PROTO_ABI_X86_64) == 0) { + blkdev->protocol = BLKIF_PROTOCOL_X86_64; + } else { + blkdev->protocol = BLKIF_PROTOCOL_NATIVE; + } + + ring_size = XC_PAGE_SIZE * blkdev->nr_ring_ref; + switch (blkdev->protocol) { + case BLKIF_PROTOCOL_NATIVE: + { + blkdev->max_requests = __CONST_RING_SIZE(blkif, ring_size); + break; + } + case BLKIF_PROTOCOL_X86_32: + { + blkdev->max_requests = __CONST_RING_SIZE(blkif_x86_32, ring_size); + break; + } + case BLKIF_PROTOCOL_X86_64: + { + blkdev->max_requests = __CONST_RING_SIZE(blkif_x86_64, ring_size); + break; + } + default: + return -1; + } + + /* Add on the number needed for the ring pages */ + max_grants = blkdev->nr_ring_ref; + + xen_be_set_max_grant_refs(xendev, max_grants); + blkdev->sring = xen_be_map_grant_refs(xendev, blkdev->ring_ref, + blkdev->nr_ring_ref, + PROT_READ | PROT_WRITE); + if (!blkdev->sring) { + return -1; + } + + switch (blkdev->protocol) { + case BLKIF_PROTOCOL_NATIVE: + { + blkif_sring_t *sring_native = blkdev->sring; + BACK_RING_INIT(&blkdev->rings.native, sring_native, ring_size); + break; + } + case BLKIF_PROTOCOL_X86_32: + { + blkif_x86_32_sring_t *sring_x86_32 = blkdev->sring; + + BACK_RING_INIT(&blkdev->rings.x86_32_part, sring_x86_32, ring_size); + break; + } + case BLKIF_PROTOCOL_X86_64: + { + blkif_x86_64_sring_t *sring_x86_64 = blkdev->sring; + + BACK_RING_INIT(&blkdev->rings.x86_64_part, sring_x86_64, ring_size); + break; + } + } + + blk_set_aio_context(blkdev->blk, blkdev->ctx); + + xen_be_bind_evtchn(xendev); + + xen_pv_printf(xendev, 1, "ok: proto %s, nr-ring-ref %u, " + "remote port %d, local port %d\n", + xendev->protocol, blkdev->nr_ring_ref, + xendev->remote_port, xendev->local_port); + return 0; +} + +static void blk_disconnect(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + + trace_xen_disk_disconnect(xendev->name); + + aio_context_acquire(blkdev->ctx); + + if (blkdev->blk) { + blk_set_aio_context(blkdev->blk, qemu_get_aio_context()); + blk_detach_dev(blkdev->blk, blkdev); + blk_unref(blkdev->blk); + blkdev->blk = NULL; + } + xen_pv_unbind_evtchn(xendev); + + aio_context_release(blkdev->ctx); + + if (blkdev->sring) { + xen_be_unmap_grant_refs(xendev, blkdev->sring, + blkdev->nr_ring_ref); + blkdev->sring = NULL; + } +} + +static int blk_free(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + struct ioreq *ioreq; + + trace_xen_disk_free(xendev->name); + + blk_disconnect(xendev); + + while (!QLIST_EMPTY(&blkdev->freelist)) { + ioreq = QLIST_FIRST(&blkdev->freelist); + QLIST_REMOVE(ioreq, list); + qemu_iovec_destroy(&ioreq->v); + g_free(ioreq); + } + + g_free(blkdev->params); + g_free(blkdev->mode); + g_free(blkdev->type); + g_free(blkdev->dev); + g_free(blkdev->devtype); + qemu_bh_delete(blkdev->bh); + iothread_destroy(blkdev->iothread); + return 0; +} + +static void blk_event(struct XenLegacyDevice *xendev) +{ + struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev); + + qemu_bh_schedule(blkdev->bh); +} + +struct XenDevOps xen_blkdev_ops = { + .flags = DEVOPS_FLAG_NEED_GNTDEV, + .size = sizeof(struct XenBlkDev), + .alloc = blk_alloc, + .init = blk_init, + .initialise = blk_connect, + .disconnect = blk_disconnect, + .event = blk_event, + .free = blk_free, +}; -- 2.1.4