From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Michael S. Tsirkin" Subject: Re: [PATCH 6/7] qemu: Implement virtio-pstore device Date: Thu, 28 Jul 2016 03:02:54 +0300 Message-ID: <20160728023254-mutt-send-email-mst@kernel.org> References: <1469632111-23260-1-git-send-email-namhyung@kernel.org> <1469632111-23260-7-git-send-email-namhyung@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1469632111-23260-7-git-send-email-namhyung@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: Namhyung Kim Cc: Tony Luck , Kees Cook , kvm@vger.kernel.org, Radim =?utf-8?B?S3LEjW3DocWZ?= , Anton Vorontsov , LKML , Steven Rostedt , qemu-devel@nongnu.org, Minchan Kim , Anthony Liguori , Colin Cross , Paolo Bonzini , virtualization@lists.linux-foundation.org, Ingo Molnar List-Id: virtualization@lists.linuxfoundation.org T24gVGh1LCBKdWwgMjgsIDIwMTYgYXQgMTI6MDg6MzBBTSArMDkwMCwgTmFtaHl1bmcgS2ltIHdy b3RlOgo+IEFkZCB2aXJ0aW8gcHN0b3JlIGRldmljZSB0byBhbGxvdyBrZXJuZWwgbG9nIGZpbGVz IHNhdmVkIG9uIHRoZSBob3N0Lgo+IEl0IHdpbGwgc2F2ZSB0aGUgbG9nIGZpbGVzIG9uIHRoZSBk aXJlY3RvcnkgZ2l2ZW4gYnkgcHN0b3JlIGRldmljZQo+IG9wdGlvbi4KPiAKPiAgICQgcWVtdS1z eXN0ZW0teDg2XzY0IC1kZXZpY2UgdmlydGlvLXBzdG9yZSxkaXJlY3Rvcnk9ZGlyLXh4IC4uLgo+ IAo+ICAgKGd1ZXN0KSAjIGVjaG8gYyA+IC9wcm9jL3N5c3JxLXRyaWdnZXIKClNvIGlmIHRoZSBw b2ludCBpcyBoYW5kbGluZyBzeXN0ZW0gY3Jhc2hlcywgSSBzdXNwZWN0CnZpcnRpbyBpcyB0aGUg d3JvbmcgcHJvdG9jb2wgdG8gdXNlLiBBVE0gaXQncyByYXRoZXIKZWxhYm9yYXRlIGZvciBwZXJm b3JtYW5jZSwgaXQncyBsaWtlbHkgbm90IHRvIHdvcmsgd2hlbgpsaW51eCBpcyBjcmFzaGluZy4g SSB0aGluayB5b3Ugd2FudCBzb21ldGhpbmcgdmVyeSB2ZXJ5CnNpbXBsZSB0aGF0IHdpbGwgc3Rp bGwgd29yayB3aGVuIHlvdSBjcmFzaC4gTGlrZSBtYXliZQphIHNlcmlhbCBkZXZpY2U/Cgo+ICAg JCBscyBkaXIteHgKPiAgIGRtZXNnLTEuZW5jLnogIGRtZXNnLTIuZW5jLnoKPiAKPiBUaGUgbG9n IGZpbGVzIGFyZSB1c3VhbGx5IGNvbXByZXNzZWQgdXNpbmcgemxpYi4gIFVzZXJzIGNhbiBzZWUg dGhlIGxvZwo+IG1lc3NhZ2VzIGRpcmVjdGx5IG9uIHRoZSBob3N0IG9yIG9uIHRoZSBndWVzdCAo dXNpbmcgcHN0b3JlIGZpbGVzeXN0ZW0pLgoKU28gdGhpcyBsYWNrcyBhbGwgbWFuYWdlbWVudCB0 b29scyB0aGF0IGEgcmVndWxhciBzdG9yYWdlIGRldmljZQpoYXMsIGFuZCB0aGVzZSBhcmUgbmVj ZXNzYXJ5IGlmIHBlb3BsZSBhcmUgdG8gdXNlIHRoaXMKaW4gcHJvZHVjdGlvbi4KCkZvciBleGFt cGxlLCBzb21lIGtpbmQgb2YgcHJvdmlzaW9uIGZvciBsaW1pdGluZyB0aGUgYW1vdW50IG9mIGhv c3QgZGlzawp0aGlzIGNhbiBjb25zdW1lIHNlZW1zIGNhbGxlZCBmb3IuIFJhdGUtbGltaXRpbmcg ZGlzayB3cml0ZXMKb24gaG9zdCBhbHNvIHNlZW1zIG5lY2Vzc2FyeS4gSGFuZGxpbmcgaG9zdCBk aXNrIGVycm9ycyBhbHdheXMKcHJvcGFnYXRlcyBlcnJvciB0byBndWVzdCBidXQgYW4gb3B0aW9u IHRvIGUuZy4gc3RvcCB2bSBtaWdodApiZSB1c2VmdWwgdG8gYXZvaWQgY29ycnVwdGlvbi4KCj4g Cj4gVGhlICdkaXJlY3RvcnknIHByb3BlcnR5IGlzIHJlcXVpcmVkIGZvciB2aXJ0aW8tcHN0b3Jl IGRldmljZSB0byB3b3JrLgo+IEl0IGFsc28gYWRkcyAnYnVmc2l6ZScgYW5kICdjb25zb2xlJyAo Ym9vbGVhbikgcHJvcGVydGllcy4KCk5vIGlkZWEgd2hhdCB0aGVzZSBkby4gU2VlbSB0byBiZSBS VyBieSBndWVzdCBidXQgaGF2ZSBubyBlZmZlY3QKb3RoZXJ3aXNlLgoKCj4gQ2M6IFBhb2xvIEJv bnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+Cj4gQ2M6IFJhZGltIEtyxI1tw6HFmSA8cmtyY21h ckByZWRoYXQuY29tPgo+IENjOiAiTWljaGFlbCBTLiBUc2lya2luIiA8bXN0QHJlZGhhdC5jb20+ Cj4gQ2M6IEFudGhvbnkgTGlndW9yaSA8YWxpZ3VvcmlAYW1hem9uLmNvbT4KPiBDYzogQW50b24g Vm9yb250c292IDxhbnRvbkBlbm9tc2cub3JnPgo+IENjOiBDb2xpbiBDcm9zcyA8Y2Nyb3NzQGFu ZHJvaWQuY29tPgo+IENjOiBLZWVzIENvb2sgPGtlZXNjb29rQGNocm9taXVtLm9yZz4KPiBDYzog VG9ueSBMdWNrIDx0b255Lmx1Y2tAaW50ZWwuY29tPgo+IENjOiBTdGV2ZW4gUm9zdGVkdCA8cm9z dGVkdEBnb29kbWlzLm9yZz4KPiBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQGtlcm5lbC5vcmc+Cj4g Q2M6IE1pbmNoYW4gS2ltIDxtaW5jaGFuQGtlcm5lbC5vcmc+Cj4gQ2M6IGt2bUB2Z2VyLmtlcm5l bC5vcmcKPiBDYzogcWVtdS1kZXZlbEBub25nbnUub3JnCj4gQ2M6IHZpcnR1YWxpemF0aW9uQGxp c3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCj4gU2lnbmVkLW9mZi1ieTogTmFtaHl1bmcgS2ltIDxu YW1oeXVuZ0BrZXJuZWwub3JnPgo+IC0tLQo+ICBody92aXJ0aW8vTWFrZWZpbGUub2JqcyAgICAg ICAgICAgICAgICAgICAgICAgIHwgICAyICstCj4gIGh3L3ZpcnRpby92aXJ0aW8tcGNpLmMgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgNTQgKysrCj4gIGh3L3ZpcnRpby92aXJ0aW8tcGNpLmgg ICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTQgKwo+ICBody92aXJ0aW8vdmlydGlvLXBzdG9y ZS5jICAgICAgICAgICAgICAgICAgICAgIHwgNDc3ICsrKysrKysrKysrKysrKysrKysrKysrKysK PiAgaW5jbHVkZS9ody9wY2kvcGNpLmggICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSAr Cj4gIGluY2x1ZGUvaHcvdmlydGlvL3ZpcnRpby1wc3RvcmUuaCAgICAgICAgICAgICAgfCAgMzQg KysKPiAgaW5jbHVkZS9zdGFuZGFyZC1oZWFkZXJzL2xpbnV4L3ZpcnRpb19pZHMuaCAgICB8ICAg MSArCj4gIGluY2x1ZGUvc3RhbmRhcmQtaGVhZGVycy9saW51eC92aXJ0aW9fcHN0b3JlLmggfCAg ODAgKysrKysKPiAgcWRldi1tb25pdG9yLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICAgMSArCj4gIDkgZmlsZXMgY2hhbmdlZCwgNjYzIGluc2VydGlvbnMoKyksIDEgZGVsZXRp b24oLSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGh3L3ZpcnRpby92aXJ0aW8tcHN0b3JlLmMKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvaHcvdmlydGlvL3ZpcnRpby1wc3RvcmUuaAo+ICBj cmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9zdGFuZGFyZC1oZWFkZXJzL2xpbnV4L3ZpcnRpb19w c3RvcmUuaAo+IAo+IGRpZmYgLS1naXQgYS9ody92aXJ0aW8vTWFrZWZpbGUub2JqcyBiL2h3L3Zp cnRpby9NYWtlZmlsZS5vYmpzCj4gaW5kZXggM2UyYjE3NS4uYWFlNzA4MiAxMDA2NDQKPiAtLS0g YS9ody92aXJ0aW8vTWFrZWZpbGUub2Jqcwo+ICsrKyBiL2h3L3ZpcnRpby9NYWtlZmlsZS5vYmpz Cj4gQEAgLTQsNCArNCw0IEBAIGNvbW1vbi1vYmoteSArPSB2aXJ0aW8tYnVzLm8KPiAgY29tbW9u LW9iai15ICs9IHZpcnRpby1tbWlvLm8KPiAgCj4gIG9iai15ICs9IHZpcnRpby5vIHZpcnRpby1i YWxsb29uLm8gCj4gLW9iai0kKENPTkZJR19MSU5VWCkgKz0gdmhvc3QubyB2aG9zdC1iYWNrZW5k Lm8gdmhvc3QtdXNlci5vCj4gK29iai0kKENPTkZJR19MSU5VWCkgKz0gdmhvc3QubyB2aG9zdC1i YWNrZW5kLm8gdmhvc3QtdXNlci5vIHZpcnRpby1wc3RvcmUubwo+IGRpZmYgLS1naXQgYS9ody92 aXJ0aW8vdmlydGlvLXBjaS5jIGIvaHcvdmlydGlvL3ZpcnRpby1wY2kuYwo+IGluZGV4IGYwNjc3 YjcuLmQ5OWE0MDUgMTAwNjQ0Cj4gLS0tIGEvaHcvdmlydGlvL3ZpcnRpby1wY2kuYwo+ICsrKyBi L2h3L3ZpcnRpby92aXJ0aW8tcGNpLmMKPiBAQCAtMjQxNCw2ICsyNDE0LDU5IEBAIHN0YXRpYyBj b25zdCBUeXBlSW5mbyB2aXJ0aW9faG9zdF9wY2lfaW5mbyA9IHsKPiAgfTsKPiAgI2VuZGlmCj4g IAo+ICsvKiB2aXJ0aW8tcHN0b3JlLXBjaSAqLwo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX3Bz dG9yZV9wY2lfcmVhbGl6ZShWaXJ0SU9QQ0lQcm94eSAqdnBjaV9kZXYsIEVycm9yICoqZXJycCkK PiArewo+ICsgICAgVmlydElPUHN0b3JlUENJICp2cHMgPSBWSVJUSU9fUFNUT1JFX1BDSSh2cGNp X2Rldik7Cj4gKyAgICBEZXZpY2VTdGF0ZSAqdmRldiA9IERFVklDRSgmdnBzLT52ZGV2KTsKPiAr ICAgIEVycm9yICplcnIgPSBOVUxMOwo+ICsKPiArICAgIHFkZXZfc2V0X3BhcmVudF9idXModmRl diwgQlVTKCZ2cGNpX2Rldi0+YnVzKSk7Cj4gKyAgICBvYmplY3RfcHJvcGVydHlfc2V0X2Jvb2wo T0JKRUNUKHZkZXYpLCB0cnVlLCAicmVhbGl6ZWQiLCAmZXJyKTsKPiArICAgIGlmIChlcnIpIHsK PiArICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKPiArICAgICAgICByZXR1cm47 Cj4gKyAgICB9Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHZpcnRpb19wc3RvcmVfcGNpX2NsYXNz X2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQo+ICt7Cj4gKyAgICBEZXZpY2VD bGFzcyAqZGMgPSBERVZJQ0VfQ0xBU1Moa2xhc3MpOwo+ICsgICAgVmlydGlvUENJQ2xhc3MgKmsg PSBWSVJUSU9fUENJX0NMQVNTKGtsYXNzKTsKPiArICAgIFBDSURldmljZUNsYXNzICpwY2lkZXZf ayA9IFBDSV9ERVZJQ0VfQ0xBU1Moa2xhc3MpOwo+ICsKPiArICAgIGstPnJlYWxpemUgPSB2aXJ0 aW9fcHN0b3JlX3BjaV9yZWFsaXplOwo+ICsgICAgc2V0X2JpdChERVZJQ0VfQ0FURUdPUllfTUlT QywgZGMtPmNhdGVnb3JpZXMpOwo+ICsKPiArICAgIHBjaWRldl9rLT52ZW5kb3JfaWQgPSBQQ0lf VkVORE9SX0lEX1JFREhBVF9RVU1SQU5FVDsKPiArICAgIHBjaWRldl9rLT5kZXZpY2VfaWQgPSBQ Q0lfREVWSUNFX0lEX1ZJUlRJT19QU1RPUkU7Cj4gKyAgICBwY2lkZXZfay0+cmV2aXNpb24gPSBW SVJUSU9fUENJX0FCSV9WRVJTSU9OOwo+ICsgICAgcGNpZGV2X2stPmNsYXNzX2lkID0gUENJX0NM QVNTX09USEVSUzsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX3BzdG9yZV9wY2lfaW5z dGFuY2VfaW5pdChPYmplY3QgKm9iaikKPiArewo+ICsgICAgVmlydElPUHN0b3JlUENJICpkZXYg PSBWSVJUSU9fUFNUT1JFX1BDSShvYmopOwo+ICsKPiArICAgIHZpcnRpb19pbnN0YW5jZV9pbml0 X2NvbW1vbihvYmosICZkZXYtPnZkZXYsIHNpemVvZihkZXYtPnZkZXYpLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVklSVElPX1BTVE9SRSk7Cj4gKyAgICBvYmplY3Rf cHJvcGVydHlfYWRkX2FsaWFzKG9iaiwgImRpcmVjdG9yeSIsIE9CSkVDVCgmZGV2LT52ZGV2KSwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSIsICZlcnJvcl9hYm9y dCk7Cj4gKyAgICBvYmplY3RfcHJvcGVydHlfYWRkX2FsaWFzKG9iaiwgImJ1ZnNpemUiLCBPQkpF Q1QoJmRldi0+dmRldiksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZzaXpl IiwgJmVycm9yX2Fib3J0KTsKPiArICAgIG9iamVjdF9wcm9wZXJ0eV9hZGRfYWxpYXMob2JqLCAi Y29uc29sZSIsIE9CSkVDVCgmZGV2LT52ZGV2KSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgImNvbnNvbGUiLCAmZXJyb3JfYWJvcnQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qg VHlwZUluZm8gdmlydGlvX3BzdG9yZV9wY2lfaW5mbyA9IHsKPiArICAgIC5uYW1lICAgICAgICAg ID0gVFlQRV9WSVJUSU9fUFNUT1JFX1BDSSwKPiArICAgIC5wYXJlbnQgICAgICAgID0gVFlQRV9W SVJUSU9fUENJLAo+ICsgICAgLmluc3RhbmNlX3NpemUgPSBzaXplb2YoVmlydElPUHN0b3JlUENJ KSwKPiArICAgIC5pbnN0YW5jZV9pbml0ID0gdmlydGlvX3BzdG9yZV9wY2lfaW5zdGFuY2VfaW5p dCwKPiArICAgIC5jbGFzc19pbml0ICAgID0gdmlydGlvX3BzdG9yZV9wY2lfY2xhc3NfaW5pdCwK PiArfTsKPiArCj4gIC8qIHZpcnRpby1wY2ktYnVzICovCj4gIAo+ICBzdGF0aWMgdm9pZCB2aXJ0 aW9fcGNpX2J1c19uZXcoVmlydGlvQnVzU3RhdGUgKmJ1cywgc2l6ZV90IGJ1c19zaXplLAo+IEBA IC0yNDgzLDYgKzI1MzYsNyBAQCBzdGF0aWMgdm9pZCB2aXJ0aW9fcGNpX3JlZ2lzdGVyX3R5cGVz KHZvaWQpCj4gICNpZmRlZiBDT05GSUdfVkhPU1RfU0NTSQo+ICAgICAgdHlwZV9yZWdpc3Rlcl9z dGF0aWMoJnZob3N0X3Njc2lfcGNpX2luZm8pOwo+ICAjZW5kaWYKPiArICAgIHR5cGVfcmVnaXN0 ZXJfc3RhdGljKCZ2aXJ0aW9fcHN0b3JlX3BjaV9pbmZvKTsKPiAgfQo+ICAKPiAgdHlwZV9pbml0 KHZpcnRpb19wY2lfcmVnaXN0ZXJfdHlwZXMpCj4gZGlmZiAtLWdpdCBhL2h3L3ZpcnRpby92aXJ0 aW8tcGNpLmggYi9ody92aXJ0aW8vdmlydGlvLXBjaS5oCj4gaW5kZXggZTQ1NDhjMi4uYjRjMDM5 ZiAxMDA2NDQKPiAtLS0gYS9ody92aXJ0aW8vdmlydGlvLXBjaS5oCj4gKysrIGIvaHcvdmlydGlv L3ZpcnRpby1wY2kuaAo+IEBAIC0zMSw2ICszMSw3IEBACj4gICNpZmRlZiBDT05GSUdfVkhPU1Rf U0NTSQo+ICAjaW5jbHVkZSAiaHcvdmlydGlvL3Zob3N0LXNjc2kuaCIKPiAgI2VuZGlmCj4gKyNp bmNsdWRlICJody92aXJ0aW8vdmlydGlvLXBzdG9yZS5oIgo+ICAKPiAgdHlwZWRlZiBzdHJ1Y3Qg VmlydElPUENJUHJveHkgVmlydElPUENJUHJveHk7Cj4gIHR5cGVkZWYgc3RydWN0IFZpcnRJT0Js a1BDSSBWaXJ0SU9CbGtQQ0k7Cj4gQEAgLTQ0LDYgKzQ1LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgVmly dElPSW5wdXRQQ0kgVmlydElPSW5wdXRQQ0k7Cj4gIHR5cGVkZWYgc3RydWN0IFZpcnRJT0lucHV0 SElEUENJIFZpcnRJT0lucHV0SElEUENJOwo+ICB0eXBlZGVmIHN0cnVjdCBWaXJ0SU9JbnB1dEhv c3RQQ0kgVmlydElPSW5wdXRIb3N0UENJOwo+ICB0eXBlZGVmIHN0cnVjdCBWaXJ0SU9HUFVQQ0kg VmlydElPR1BVUENJOwo+ICt0eXBlZGVmIHN0cnVjdCBWaXJ0SU9Qc3RvcmVQQ0kgVmlydElPUHN0 b3JlUENJOwo+ICAKPiAgLyogdmlydGlvLXBjaS1idXMgKi8KPiAgCj4gQEAgLTMxMSw2ICszMTMs MTggQEAgc3RydWN0IFZpcnRJT0dQVVBDSSB7Cj4gICAgICBWaXJ0SU9HUFUgdmRldjsKPiAgfTsK PiAgCj4gKy8qCj4gKyAqIHZpcnRpby1wc3RvcmUtcGNpOiBUaGlzIGV4dGVuZHMgVmlydGlvUENJ UHJveHkuCj4gKyAqLwo+ICsjZGVmaW5lIFRZUEVfVklSVElPX1BTVE9SRV9QQ0kgInZpcnRpby1w c3RvcmUtcGNpIgo+ICsjZGVmaW5lIFZJUlRJT19QU1RPUkVfUENJKG9iaikgXAo+ICsgICAgICAg IE9CSkVDVF9DSEVDSyhWaXJ0SU9Qc3RvcmVQQ0ksIChvYmopLCBUWVBFX1ZJUlRJT19QU1RPUkVf UENJKQo+ICsKPiArc3RydWN0IFZpcnRJT1BzdG9yZVBDSSB7Cj4gKyAgICBWaXJ0SU9QQ0lQcm94 eSBwYXJlbnRfb2JqOwo+ICsgICAgVmlydElPUHN0b3JlIHZkZXY7Cj4gK307Cj4gKwo+ICAvKiBW aXJ0aW8gQUJJIHZlcnNpb24sIGlmIHdlIGluY3JlbWVudCB0aGlzLCB3ZSBicmVhayB0aGUgZ3Vl c3QgZHJpdmVyLiAqLwo+ICAjZGVmaW5lIFZJUlRJT19QQ0lfQUJJX1ZFUlNJT04gICAgICAgICAg MAo+ICAKPiBkaWZmIC0tZ2l0IGEvaHcvdmlydGlvL3ZpcnRpby1wc3RvcmUuYyBiL2h3L3ZpcnRp by92aXJ0aW8tcHN0b3JlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAu LjJjYTc3ODYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvaHcvdmlydGlvL3ZpcnRpby1wc3RvcmUu Ywo+IEBAIC0wLDAgKzEsNDc3IEBACj4gKy8qCj4gKyAqIFZpcnRpbyBQc3RvcmUgRGV2aWNlCj4g KyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAxNiAgTEcgRWxlY3Ryb25pY3MKPiArICoKPiArICog QXV0aG9yczoKPiArICogIE5hbWh5dW5nIEtpbSAgPG5hbWh5dW5nQGdtYWlsLmNvbT4KPiArICoK PiArICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQ TCwgdmVyc2lvbiAyLgoKV2UgZ2VuZXJhbGx5IGFzayBuZXcgY29kZSB0byBiZSB2MiBvciBsYXRl ci4KCj4gIFNlZQo+ICsgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0 b3J5Lgo+ICsgKgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsKPiArI2luY2x1 ZGUgInFlbXUvb3NkZXAuaCIKPiArI2luY2x1ZGUgInFlbXUvaW92LmgiCj4gKyNpbmNsdWRlICJx ZW11LWNvbW1vbi5oIgo+ICsjaW5jbHVkZSAicWVtdS9jdXRpbHMuaCIKPiArI2luY2x1ZGUgInFl bXUvZXJyb3ItcmVwb3J0LmgiCj4gKyNpbmNsdWRlICJzeXNlbXUva3ZtLmgiCj4gKyNpbmNsdWRl ICJxYXBpL3Zpc2l0b3IuaCIKPiArI2luY2x1ZGUgInFhcGktZXZlbnQuaCIKPiArI2luY2x1ZGUg InRyYWNlLmgiCj4gKwo+ICsjaW5jbHVkZSAiaHcvdmlydGlvL3ZpcnRpby5oIgo+ICsjaW5jbHVk ZSAiaHcvdmlydGlvL3ZpcnRpby1idXMuaCIKPiArI2luY2x1ZGUgImh3L3ZpcnRpby92aXJ0aW8t YWNjZXNzLmgiCj4gKyNpbmNsdWRlICJody92aXJ0aW8vdmlydGlvLXBzdG9yZS5oIgo+ICsKPiAr Cj4gK3N0YXRpYyB2b2lkIHZpcnRpb19wc3RvcmVfdG9fZmlsZW5hbWUoVmlydElPUHN0b3JlICpz LCBjaGFyICpidWYsIHNpemVfdCBzeiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgdmlydGlvX3BzdG9yZV9yZXEgKnJlcSkKPiArewo+ICsgICAgY29uc3Qg Y2hhciAqYmFzZW5hbWU7Cj4gKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaWQgPSAwOwo+ICsgICAg dW5zaWduZWQgaW50IGZsYWdzID0gbGUzMl90b19jcHUocmVxLT5mbGFncyk7Cj4gKwo+ICsgICAg c3dpdGNoIChsZTE2X3RvX2NwdShyZXEtPnR5cGUpKSB7Cj4gKyAgICBjYXNlIFZJUlRJT19QU1RP UkVfVFlQRV9ETUVTRzoKPiArICAgICAgICBiYXNlbmFtZSA9ICJkbWVzZyI7Cj4gKyAgICAgICAg aWQgPSBzLT5pZCsrOwo+ICsgICAgICAgIGJyZWFrOwo+ICsgICAgY2FzZSBWSVJUSU9fUFNUT1JF X1RZUEVfQ09OU09MRToKPiArICAgICAgICBiYXNlbmFtZSA9ICJjb25zb2xlIjsKPiArICAgICAg ICBpZiAocy0+Y29uc29sZV9pZCkgewo+ICsgICAgICAgICAgICBpZCA9IHMtPmNvbnNvbGVfaWQ7 Cj4gKyAgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAgaWQgPSBzLT5jb25zb2xlX2lkID0g cy0+aWQrKzsKPiArICAgICAgICB9Cj4gKyAgICAgICAgYnJlYWs7Cj4gKyAgICBkZWZhdWx0Ogo+ ICsgICAgICAgIGJhc2VuYW1lID0gInVua25vd24iOwo+ICsgICAgICAgIGJyZWFrOwo+ICsgICAg fQo+ICsKPiArICAgIHNucHJpbnRmKGJ1Ziwgc3osICIlcy8lcy0lbGx1JXMiLCBzLT5kaXJlY3Rv cnksIGJhc2VuYW1lLCBpZCwKPiArICAgICAgICAgICAgIGZsYWdzICYgVklSVElPX1BTVE9SRV9G TF9DT01QUkVTU0VEID8gIi5lbmMueiIgOiAiIik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHZp cnRpb19wc3RvcmVfZnJvbV9maWxlbmFtZShWaXJ0SU9Qc3RvcmUgKnMsIGNoYXIgKm5hbWUsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYsIHNpemVf dCBzeiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2 aXJ0aW9fcHN0b3JlX2ZpbGVpbmZvICppbmZvKQo+ICt7Cj4gKyAgICBzbnByaW50ZihidWYsIHN6 LCAiJXMvJXMiLCBzLT5kaXJlY3RvcnksIG5hbWUpOwoKaWYgdGhpcyBkb2VzIG5vdCBmaXQsIGJ1 ZiB3aWxsIG5vdCBiZSAwIHRlcm1pbmF0ZWQgYW5kIGNhbgpnZW5lcmFsbHkgYmUgY29ycnVwdGVk LgoKCj4gKwo+ICsgICAgaWYgKGdfc3RyX2hhc19wcmVmaXgobmFtZSwgImRtZXNnLSIpKSB7Cj4g KyAgICAgICAgaW5mby0+dHlwZSA9IFZJUlRJT19QU1RPUkVfVFlQRV9ETUVTRzsKPiArICAgICAg ICBuYW1lICs9IHN0cmxlbigiZG1lc2ctIik7Cj4gKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19w cmVmaXgobmFtZSwgImNvbnNvbGUtIikpIHsKPiArICAgICAgICBpbmZvLT50eXBlID0gVklSVElP X1BTVE9SRV9UWVBFX0NPTlNPTEU7Cj4gKyAgICAgICAgbmFtZSArPSBzdHJsZW4oImNvbnNvbGUt Iik7Cj4gKyAgICB9IGVsc2UgaWYgKGdfc3RyX2hhc19wcmVmaXgobmFtZSwgInVua25vd24tIikp IHsKPiArICAgICAgICBpbmZvLT50eXBlID0gVklSVElPX1BTVE9SRV9UWVBFX1VOS05PV047Cj4g KyAgICAgICAgbmFtZSArPSBzdHJsZW4oInVua25vd24tIik7Cj4gKyAgICB9Cj4gKwo+ICsgICAg cWVtdV9zdHJ0b3VsbChuYW1lLCBOVUxMLCAwLCAmaW5mby0+aWQpOwo+ICsKPiArICAgIGluZm8t PmZsYWdzID0gMDsKPiArICAgIGlmIChnX3N0cl9oYXNfc3VmZml4KG5hbWUsICIuZW5jLnoiKSkg ewo+ICsgICAgICAgIGluZm8tPmZsYWdzIHw9IFZJUlRJT19QU1RPUkVfRkxfQ09NUFJFU1NFRDsK PiArICAgIH0KPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgdmlydGlvX3BzdG9yZV9kb19vcGVu KFZpcnRJT1BzdG9yZSAqcykKPiArewo+ICsgICAgcy0+ZGlycCA9IG9wZW5kaXIocy0+ZGlyZWN0 b3J5KTsKPiArICAgIGlmIChzLT5kaXJwID09IE5VTEwpIHsKPiArICAgICAgICByZXR1cm4gLTE7 Cj4gKyAgICB9Cj4gKwo+ICsgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90 IHZpcnRpb19wc3RvcmVfZG9fcmVhZChWaXJ0SU9Qc3RvcmUgKnMsIHN0cnVjdCBpb3ZlYyAqaW5f c2csCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQg aW5fbnVtLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZp cnRpb19wc3RvcmVfcmVzICpyZXMpCj4gK3sKPiArICAgIGNoYXIgcGF0aFtQQVRIX01BWF07Cj4g KyAgICBpbnQgZmQ7Cj4gKyAgICBzc2l6ZV90IGxlbjsKPiArICAgIHN0cnVjdCBzdGF0IHN0YnVm Owo+ICsgICAgc3RydWN0IGRpcmVudCAqZGVudDsKPiArICAgIGludCBzZ19udW0gPSBpbl9udW07 Cj4gKyAgICBzdHJ1Y3QgaW92ZWMgc2dbc2dfbnVtXTsKPiArICAgIHN0cnVjdCB2aXJ0aW9fcHN0 b3JlX2ZpbGVpbmZvIGluZm87Cj4gKyAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKCpyZXMpICsg c2l6ZW9mKGluZm8pOwo+ICsKPiArICAgIGlmIChzLT5kaXJwID09IE5VTEwpIHsKPiArICAgICAg ICByZXR1cm4gLTE7Cj4gKyAgICB9Cj4gKwo+ICsgICAgZGVudCA9IHJlYWRkaXIocy0+ZGlycCk7 Cj4gKyAgICB3aGlsZSAoZGVudCkgewo+ICsgICAgICAgIGlmIChkZW50LT5kX25hbWVbMF0gIT0g Jy4nKSB7Cj4gKyAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgIH0KPiArICAgICAgICBkZW50 ID0gcmVhZGRpcihzLT5kaXJwKTsKPiArICAgIH0KPiArCj4gKyAgICBpZiAoZGVudCA9PSBOVUxM KSB7Cj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKyAgICB9Cj4gKwo+ICsgICAgLyogc2tpcCByZXMg YW5kIGZpbGVpbmZvICovCj4gKyAgICBzZ19udW0gPSBpb3ZfY29weShzZywgc2dfbnVtLCBpbl9z ZywgaW5fbnVtLCBvZmZzZXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICBpb3Zfc2l6ZShpbl9z ZywgaW5fbnVtKSAtIG9mZnNldCk7Cj4gKwo+ICsgICAgdmlydGlvX3BzdG9yZV9mcm9tX2ZpbGVu YW1lKHMsIGRlbnQtPmRfbmFtZSwgcGF0aCwgc2l6ZW9mKHBhdGgpLCAmaW5mbyk7Cj4gKyAgICBm ZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOwo+ICsgICAgaWYgKGZkIDwgMCkgewo+ICsgICAgICAg IGVycm9yX3JlcG9ydCgiY2Fubm90IG9wZW4gJXMiLCBwYXRoKTsKPiArICAgICAgICByZXR1cm4g LTE7Cj4gKyAgICB9Cj4gKwo+ICsgICAgaWYgKGZzdGF0KGZkLCAmc3RidWYpIDwgMCkgewo+ICsg ICAgICAgIGxlbiA9IC0xOwo+ICsgICAgICAgIGdvdG8gb3V0Owo+ICsgICAgfQo+ICsKPiArICAg IGxlbiA9IHJlYWR2KGZkLCBzZywgc2dfbnVtKTsKPiArICAgIGlmIChsZW4gPCAwKSB7Cj4gKyAg ICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgewo+ICsgICAgICAgICAgICBsZW4gPSAwOwo+ICsg ICAgICAgIH0KPiArICAgICAgICBnb3RvIG91dDsKPiArICAgIH0KPiArCj4gKyAgICBpbmZvLmlk ICAgICAgICA9IGNwdV90b19sZTY0KGluZm8uaWQpOwo+ICsgICAgaW5mby50eXBlICAgICAgPSBj cHVfdG9fbGUxNihpbmZvLnR5cGUpOwo+ICsgICAgaW5mby5mbGFncyAgICAgPSBjcHVfdG9fbGUz MihpbmZvLmZsYWdzKTsKPiArICAgIGluZm8ubGVuICAgICAgID0gY3B1X3RvX2xlMzIobGVuKTsK PiArICAgIGluZm8udGltZV9zZWMgID0gY3B1X3RvX2xlNjQoc3RidWYuc3RfY3RpbS50dl9zZWMp Owo+ICsgICAgaW5mby50aW1lX25zZWMgPSBjcHVfdG9fbGUzMihzdGJ1Zi5zdF9jdGltLnR2X25z ZWMpOwo+ICsKPiArICAgIGlvdl9mcm9tX2J1Zihpbl9zZywgaW5fbnVtLCBzaXplb2YoKnJlcyks ICZpbmZvLCBzaXplb2YoaW5mbykpOwo+ICsgICAgbGVuICs9IHNpemVvZihpbmZvKTsKPiArCj4g KyBvdXQ6Cj4gKyAgICBjbG9zZShmZCk7Cj4gKyAgICByZXR1cm4gbGVuOwo+ICt9Cj4gKwo+ICtz dGF0aWMgc3NpemVfdCB2aXJ0aW9fcHN0b3JlX2RvX3dyaXRlKFZpcnRJT1BzdG9yZSAqcywgc3Ry dWN0IGlvdmVjICpvdXRfc2csCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IG91dF9udW0sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IHZpcnRpb19wc3RvcmVfcmVxICpyZXEpCj4gK3sKPiArICAgIGNoYXIg cGF0aFtQQVRIX01BWF07Cj4gKyAgICBpbnQgZmQ7Cj4gKyAgICBzc2l6ZV90IGxlbjsKPiArICAg IHVuc2lnbmVkIHNob3J0IHR5cGU7Cj4gKyAgICBpbnQgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JF QVQ7Cj4gKwo+ICsgICAgLyogd2UgYWxyZWFkeSBjb25zdW1lIHRoZSByZXEgKi8KPiArICAgIGlv dl9kaXNjYXJkX2Zyb250KCZvdXRfc2csICZvdXRfbnVtLCBzaXplb2YoKnJlcSkpOwo+ICsKPiAr ICAgIHZpcnRpb19wc3RvcmVfdG9fZmlsZW5hbWUocywgcGF0aCwgc2l6ZW9mKHBhdGgpLCByZXEp Owo+ICsKPiArICAgIHR5cGUgPSBsZTE2X3RvX2NwdShyZXEtPnR5cGUpOwo+ICsKPiArICAgIGlm ICh0eXBlID09IFZJUlRJT19QU1RPUkVfVFlQRV9ETUVTRykgewo+ICsgICAgICAgIGZsYWdzIHw9 IE9fVFJVTkM7Cj4gKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVklSVElPX1BTVE9SRV9UWVBFX0NP TlNPTEUpIHsKPiArICAgICAgICBmbGFncyB8PSBPX0FQUEVORDsKPiArICAgIH0KPiArCj4gKyAg ICBmZCA9IG9wZW4ocGF0aCwgZmxhZ3MsIDA2NDQpOwo+ICsgICAgaWYgKGZkIDwgMCkgewo+ICsg ICAgICAgIGVycm9yX3JlcG9ydCgiY2Fubm90IG9wZW4gJXMiLCBwYXRoKTsKPiArICAgICAgICBy ZXR1cm4gLTE7Cj4gKyAgICB9Cj4gKyAgICBsZW4gPSB3cml0ZXYoZmQsIG91dF9zZywgb3V0X251 bSk7Cj4gKyAgICBjbG9zZShmZCk7Cj4gKwo+ICsgICAgcmV0dXJuIGxlbjsKCkFsbCB0aGlzIGlz IGJsb2NraW5nIFZNIHVudGlsIGhvc3QgaW8gY29tcGxldGVzLgoKCj4gK30KPiArCj4gK3N0YXRp YyBzc2l6ZV90IHZpcnRpb19wc3RvcmVfZG9fY2xvc2UoVmlydElPUHN0b3JlICpzKQo+ICt7Cj4g KyAgICBpZiAocy0+ZGlycCA9PSBOVUxMKSB7Cj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKyAgICB9 Cj4gKwo+ICsgICAgY2xvc2VkaXIocy0+ZGlycCk7Cj4gKyAgICBzLT5kaXJwID0gTlVMTDsKPiAr Cj4gKyAgICByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgdmlydGlvX3BzdG9y ZV9kb19lcmFzZShWaXJ0SU9Qc3RvcmUgKnMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IHZpcnRpb19wc3RvcmVfcmVxICpyZXEpCj4gK3sKPiArICAgIGNo YXIgcGF0aFtQQVRIX01BWF07Cj4gKwo+ICsgICAgdmlydGlvX3BzdG9yZV90b19maWxlbmFtZShz LCBwYXRoLCBzaXplb2YocGF0aCksIHJlcSk7Cj4gKwo+ICsgICAgcmV0dXJuIHVubGluayhwYXRo KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX3BzdG9yZV9oYW5kbGVfaW8oVmlydElP RGV2aWNlICp2ZGV2LCBWaXJ0UXVldWUgKnZxKQo+ICt7Cj4gKyAgICBWaXJ0SU9Qc3RvcmUgKnMg PSBWSVJUSU9fUFNUT1JFKHZkZXYpOwo+ICsgICAgVmlydFF1ZXVlRWxlbWVudCAqZWxlbTsKPiAr ICAgIHN0cnVjdCB2aXJ0aW9fcHN0b3JlX3JlcSByZXE7Cj4gKyAgICBzdHJ1Y3QgdmlydGlvX3Bz dG9yZV9yZXMgcmVzOwo+ICsgICAgc3NpemVfdCBsZW4gPSAwOwo+ICsgICAgaW50IHJldDsKPiAr Cj4gKyAgICBmb3IgKDs7KSB7Cj4gKyAgICAgICAgZWxlbSA9IHZpcnRxdWV1ZV9wb3AodnEsIHNp emVvZihWaXJ0UXVldWVFbGVtZW50KSk7Cj4gKyAgICAgICAgaWYgKCFlbGVtKSB7Cj4gKyAgICAg ICAgICAgIHJldHVybjsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIGlmIChlbGVtLT5vdXRf bnVtIDwgMSB8fCBlbGVtLT5pbl9udW0gPCAxKSB7Cj4gKyAgICAgICAgICAgIGVycm9yX3JlcG9y dCgicmVxdWVzdCBvciByZXNwb25zZSBidWZmZXIgaXMgbWlzc2luZyIpOwo+ICsgICAgICAgICAg ICBleGl0KDEpOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgICAgbGVuID0gaW92X3RvX2J1Zihl bGVtLT5vdXRfc2csIGVsZW0tPm91dF9udW0sIDAsICZyZXEsIHNpemVvZihyZXEpKTsKPiArICAg ICAgICBpZiAobGVuICE9IChzc2l6ZV90KXNpemVvZihyZXEpKSB7Cj4gKyAgICAgICAgICAgIGVy cm9yX3JlcG9ydCgiaW52YWxpZCByZXF1ZXN0IHNpemU6ICVsZCIsIChsb25nKWxlbik7Cj4gKyAg ICAgICAgICAgIGV4aXQoMSk7Cj4gKyAgICAgICAgfQo+ICsgICAgICAgIHJlcy5jbWQgID0gcmVx LmNtZDsKPiArICAgICAgICByZXMudHlwZSA9IHJlcS50eXBlOwo+ICsKPiArICAgICAgICBzd2l0 Y2ggKGxlMTZfdG9fY3B1KHJlcS5jbWQpKSB7Cj4gKyAgICAgICAgY2FzZSBWSVJUSU9fUFNUT1JF X0NNRF9PUEVOOgo+ICsgICAgICAgICAgICByZXQgPSB2aXJ0aW9fcHN0b3JlX2RvX29wZW4ocyk7 Cj4gKyAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgIGNhc2UgVklSVElPX1BTVE9SRV9DTURf UkVBRDoKPiArICAgICAgICAgICAgcmV0ID0gdmlydGlvX3BzdG9yZV9kb19yZWFkKHMsIGVsZW0t PmluX3NnLCBlbGVtLT5pbl9udW0sICZyZXMpOwo+ICsgICAgICAgICAgICBpZiAocmV0ID4gMCkg ewo+ICsgICAgICAgICAgICAgICAgbGVuID0gcmV0Owo+ICsgICAgICAgICAgICAgICAgcmV0ID0g MDsKPiArICAgICAgICAgICAgfQo+ICsgICAgICAgICAgICBicmVhazsKPiArICAgICAgICBjYXNl IFZJUlRJT19QU1RPUkVfQ01EX1dSSVRFOgo+ICsgICAgICAgICAgICByZXQgPSB2aXJ0aW9fcHN0 b3JlX2RvX3dyaXRlKHMsIGVsZW0tPm91dF9zZywgZWxlbS0+b3V0X251bSwgJnJlcSk7Cj4gKyAg ICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgIGNhc2UgVklSVElPX1BTVE9SRV9DTURfQ0xPU0U6 Cj4gKyAgICAgICAgICAgIHJldCA9IHZpcnRpb19wc3RvcmVfZG9fY2xvc2Uocyk7Cj4gKyAgICAg ICAgICAgIGJyZWFrOwo+ICsgICAgICAgIGNhc2UgVklSVElPX1BTVE9SRV9DTURfRVJBU0U6Cj4g KyAgICAgICAgICAgIHJldCA9IHZpcnRpb19wc3RvcmVfZG9fZXJhc2UocywgJnJlcSk7Cj4gKyAg ICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAgICAgICAgIHJldCA9 IC0xOwo+ICsgICAgICAgICAgICBicmVhazsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIHJl cy5yZXQgID0gcmV0Owo+ICsKPiArICAgICAgICBpb3ZfZnJvbV9idWYoZWxlbS0+aW5fc2csIGVs ZW0tPmluX251bSwgMCwgJnJlcywgc2l6ZW9mKHJlcykpOwo+ICsgICAgICAgIHZpcnRxdWV1ZV9w dXNoKHZxLCBlbGVtLCBzaXplb2YocmVzKSArIGxlbik7CgoKdGhpcyBpcyB3cm9uZyAtIGxlbiBz aG91bGQgYmUgIyBvZiBieXRlcyB3cml0dGVuIGludG8gZ3Vlc3QgbWVtb3J5LgoKPiArCj4gKyAg ICAgICAgdmlydGlvX25vdGlmeSh2ZGV2LCB2cSk7Cj4gKyAgICAgICAgZ19mcmVlKGVsZW0pOwo+ ICsKPiArICAgICAgICBpZiAocmV0IDwgMCkgewo+ICsgICAgICAgICAgICByZXR1cm47Cj4gKyAg ICAgICAgfQo+ICsgICAgfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fcHN0b3JlX2Rl dmljZV9yZWFsaXplKERldmljZVN0YXRlICpkZXYsIEVycm9yICoqZXJycCkKPiArewo+ICsgICAg VmlydElPRGV2aWNlICp2ZGV2ID0gVklSVElPX0RFVklDRShkZXYpOwo+ICsgICAgVmlydElPUHN0 b3JlICpzID0gVklSVElPX1BTVE9SRShkZXYpOwo+ICsKPiArICAgIHZpcnRpb19pbml0KHZkZXYs ICJ2aXJ0aW8tcHN0b3JlIiwgVklSVElPX0lEX1BTVE9SRSwKPiArICAgICAgICAgICAgICAgIHNp emVvZihzdHJ1Y3QgdmlydGlvX3BzdG9yZV9jb25maWcpKTsKPiArCj4gKyAgICBzLT5pZCA9IDE7 Cj4gKyAgICBzLT5jb25zb2xlX2lkID0gMDsKPiArCj4gKyAgICBzLT52cVswXSA9IHZpcnRpb19h ZGRfcXVldWUodmRldiwgMTI4LCB2aXJ0aW9fcHN0b3JlX2hhbmRsZV9pbyk7Cj4gKyAgICBzLT52 cVsxXSA9IHZpcnRpb19hZGRfcXVldWUodmRldiwgMTI4LCB2aXJ0aW9fcHN0b3JlX2hhbmRsZV9p byk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHZpcnRpb19wc3RvcmVfZGV2aWNlX3VucmVhbGl6 ZShEZXZpY2VTdGF0ZSAqZGV2LCBFcnJvciAqKmVycnApCj4gK3sKPiArICAgIFZpcnRJT0Rldmlj ZSAqdmRldiA9IFZJUlRJT19ERVZJQ0UoZGV2KTsKPiArCj4gKyAgICB2aXJ0aW9fY2xlYW51cCh2 ZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX3BzdG9yZV9nZXRfY29uZmlnKFZp cnRJT0RldmljZSAqdmRldiwgdWludDhfdCAqY29uZmlnX2RhdGEpCj4gK3sKPiArICAgIFZpcnRJ T1BzdG9yZSAqZGV2ID0gVklSVElPX1BTVE9SRSh2ZGV2KTsKPiArICAgIHN0cnVjdCB2aXJ0aW9f cHN0b3JlX2NvbmZpZyBjb25maWc7Cj4gKwo+ICsgICAgY29uZmlnLmJ1ZnNpemUgPSBjcHVfdG9f bGUzMihkZXYtPmJ1ZnNpemUpOwo+ICsgICAgaWYgKGRldi0+Y29uc29sZSkgewo+ICsgICAgICAg IGNvbmZpZy5mbGFncyB8PSBjcHVfdG9fbGUzMihWSVJUSU9fUFNUT1JFX0NPTkZJR19GTF9DT05T T0xFKTsKPiArICAgIH0KPiArCj4gKyAgICBtZW1jcHkoY29uZmlnX2RhdGEsICZjb25maWcsIHNp emVvZihzdHJ1Y3QgdmlydGlvX3BzdG9yZV9jb25maWcpKTsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgdmlydGlvX3BzdG9yZV9zZXRfY29uZmlnKFZpcnRJT0RldmljZSAqdmRldiwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbmZpZ19kYXRh KQo+ICt7Cj4gKyAgICBWaXJ0SU9Qc3RvcmUgKmRldiA9IFZJUlRJT19QU1RPUkUodmRldik7Cj4g KyAgICBzdHJ1Y3QgdmlydGlvX3BzdG9yZV9jb25maWcgY29uZmlnOwo+ICsKPiArICAgIG1lbWNw eSgmY29uZmlnLCBjb25maWdfZGF0YSwgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fcHN0b3JlX2NvbmZp ZykpOwo+ICsKPiArICAgIGRldi0+YnVmc2l6ZSA9IGxlMzJfdG9fY3B1KGNvbmZpZy5idWZzaXpl KTsKPiArfQo+ICsKPiArc3RhdGljIHVpbnQ2NF90IGdldF9mZWF0dXJlcyhWaXJ0SU9EZXZpY2Ug KnZkZXYsIHVpbnQ2NF90IGYsIEVycm9yICoqZXJycCkKPiArewo+ICsgICAgcmV0dXJuIGY7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIHBzdG9yZV9nZXRfZGlyZWN0b3J5KE9iamVjdCAqb2JqLCBW aXNpdG9yICp2LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFy ICpuYW1lLCB2b2lkICpvcGFxdWUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEVycm9yICoqZXJycCkKPiArewo+ICsgICAgVmlydElPUHN0b3JlICpzID0gb3BhcXVlOwo+ICsK PiArICAgIHZpc2l0X3R5cGVfc3RyKHYsIG5hbWUsICZzLT5kaXJlY3RvcnksIGVycnApOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBwc3RvcmVfc2V0X2RpcmVjdG9yeShPYmplY3QgKm9iaiwgVmlz aXRvciAqdiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAq bmFtZSwgdm9pZCAqb3BhcXVlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBF cnJvciAqKmVycnApCj4gK3sKPiArICAgIFZpcnRJT1BzdG9yZSAqcyA9IG9wYXF1ZTsKPiArICAg IEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOwo+ICsgICAgY2hhciAqdmFsdWU7Cj4gKwo+ICsgICAg dmlzaXRfdHlwZV9zdHIodiwgbmFtZSwgJnZhbHVlLCAmbG9jYWxfZXJyKTsKPiArICAgIGlmIChs b2NhbF9lcnIpIHsKPiArICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9jYWxfZXJyKTsK PiArICAgICAgICByZXR1cm47Cj4gKyAgICB9Cj4gKwo+ICsgICAgZ19mcmVlKHMtPmRpcmVjdG9y eSk7Cj4gKyAgICBzLT5kaXJlY3RvcnkgPSB2YWx1ZTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg cHN0b3JlX3JlbGVhc2VfZGlyZWN0b3J5KE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQo+ICt7 Cj4gKyAgICBWaXJ0SU9Qc3RvcmUgKnMgPSBvcGFxdWU7Cj4gKwo+ICsgICAgZ19mcmVlKHMtPmRp cmVjdG9yeSk7Cj4gKyAgICBzLT5kaXJlY3RvcnkgPSBOVUxMOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBwc3RvcmVfZ2V0X2J1ZnNpemUoT2JqZWN0ICpvYmosIFZpc2l0b3IgKnYsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpvcGFxdWUs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApCj4gK3sKPiAr ICAgIFZpcnRJT1BzdG9yZSAqcyA9IG9wYXF1ZTsKPiArICAgIHVpbnQ2NF90IHZhbHVlID0gcy0+ YnVmc2l6ZTsKPiArCj4gKyAgICB2aXNpdF90eXBlX3NpemUodiwgbmFtZSwgJnZhbHVlLCBlcnJw KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcHN0b3JlX3NldF9idWZzaXplKE9iamVjdCAqb2Jq LCBWaXNpdG9yICp2LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hh ciAqbmFtZSwgdm9pZCAqb3BhcXVlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg RXJyb3IgKiplcnJwKQo+ICt7Cj4gKyAgICBWaXJ0SU9Qc3RvcmUgKnMgPSBvcGFxdWU7Cj4gKyAg ICBFcnJvciAqZXJyb3IgPSBOVUxMOwo+ICsgICAgdWludDY0X3QgdmFsdWU7Cj4gKwo+ICsgICAg dmlzaXRfdHlwZV9zaXplKHYsIG5hbWUsICZ2YWx1ZSwgJmVycm9yKTsKPiArICAgIGlmIChlcnJv cikgewo+ICsgICAgICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnJvcik7Cj4gKyAgICAgICAg cmV0dXJuOwo+ICsgICAgfQo+ICsKPiArICAgIGlmICh2YWx1ZSA8IDQwOTYpIHsKPiArICAgICAg ICBlcnJvcl9yZXBvcnQoIldhcm5pbmc6IHRvbyBzbWFsbCBidWZmZXIgc2l6ZTogJSJQUkl1NjQs IHZhbHVlKTsKPiArICAgIH0KPiArCj4gKyAgICBzLT5idWZzaXplID0gdmFsdWU7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIHBzdG9yZV9nZXRfY29uc29sZShPYmplY3QgKm9iaiwgVmlzaXRvciAq diwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZv aWQgKm9wYXF1ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJy cCkKPiArewo+ICsgICAgVmlydElPUHN0b3JlICpzID0gb3BhcXVlOwo+ICsgICAgYm9vbCB2YWx1 ZSA9IHMtPmNvbnNvbGU7Cj4gKwo+ICsgICAgdmlzaXRfdHlwZV9ib29sKHYsIG5hbWUsICZ2YWx1 ZSwgZXJycCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHBzdG9yZV9zZXRfY29uc29sZShPYmpl Y3QgKm9iaiwgVmlzaXRvciAqdiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IGNoYXIgKm5hbWUsIHZvaWQgKm9wYXF1ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEVycm9yICoqZXJycCkKPiArewo+ICsgICAgVmlydElPUHN0b3JlICpzID0gb3BhcXVl Owo+ICsgICAgRXJyb3IgKmVycm9yID0gTlVMTDsKPiArICAgIGJvb2wgdmFsdWU7Cj4gKwo+ICsg ICAgdmlzaXRfdHlwZV9ib29sKHYsIG5hbWUsICZ2YWx1ZSwgJmVycm9yKTsKPiArICAgIGlmIChl cnJvcikgewo+ICsgICAgICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnJvcik7Cj4gKyAgICAg ICAgcmV0dXJuOwo+ICsgICAgfQo+ICsKPiArICAgIHMtPmNvbnNvbGUgPSB2YWx1ZTsKPiArfQo+ ICsKPiArc3RhdGljIFByb3BlcnR5IHZpcnRpb19wc3RvcmVfcHJvcGVydGllc1tdID0gewo+ICsg ICAgREVGSU5FX1BST1BfRU5EX09GX0xJU1QoKSwKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lkIHZp cnRpb19wc3RvcmVfaW5zdGFuY2VfaW5pdChPYmplY3QgKm9iaikKPiArewo+ICsgICAgVmlydElP UHN0b3JlICpzID0gVklSVElPX1BTVE9SRShvYmopOwo+ICsKPiArICAgIG9iamVjdF9wcm9wZXJ0 eV9hZGQob2JqLCAiZGlyZWN0b3J5IiwgInN0ciIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg IHBzdG9yZV9nZXRfZGlyZWN0b3J5LCBwc3RvcmVfc2V0X2RpcmVjdG9yeSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgcHN0b3JlX3JlbGVhc2VfZGlyZWN0b3J5LCBzLCBOVUxMKTsKPiArICAg IG9iamVjdF9wcm9wZXJ0eV9hZGQob2JqLCAiYnVmc2l6ZSIsICJzaXplIiwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgcHN0b3JlX2dldF9idWZzaXplLCBwc3RvcmVfc2V0X2J1ZnNpemUsIE5V TEwsIHMsIE5VTEwpOwo+ICsgICAgb2JqZWN0X3Byb3BlcnR5X2FkZChvYmosICJjb25zb2xlIiwg ImJvb2wiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICBwc3RvcmVfZ2V0X2NvbnNvbGUsIHBz dG9yZV9zZXRfY29uc29sZSwgTlVMTCwgcywgTlVMTCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IHZpcnRpb19wc3RvcmVfY2xhc3NfaW5pdChPYmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKmRhdGEp Cj4gK3sKPiArICAgIERldmljZUNsYXNzICpkYyA9IERFVklDRV9DTEFTUyhrbGFzcyk7Cj4gKyAg ICBWaXJ0aW9EZXZpY2VDbGFzcyAqdmRjID0gVklSVElPX0RFVklDRV9DTEFTUyhrbGFzcyk7Cj4g Kwo+ICsgICAgZGMtPnByb3BzID0gdmlydGlvX3BzdG9yZV9wcm9wZXJ0aWVzOwo+ICsgICAgc2V0 X2JpdChERVZJQ0VfQ0FURUdPUllfTUlTQywgZGMtPmNhdGVnb3JpZXMpOwo+ICsgICAgdmRjLT5y ZWFsaXplID0gdmlydGlvX3BzdG9yZV9kZXZpY2VfcmVhbGl6ZTsKPiArICAgIHZkYy0+dW5yZWFs aXplID0gdmlydGlvX3BzdG9yZV9kZXZpY2VfdW5yZWFsaXplOwo+ICsgICAgdmRjLT5nZXRfY29u ZmlnID0gdmlydGlvX3BzdG9yZV9nZXRfY29uZmlnOwo+ICsgICAgdmRjLT5zZXRfY29uZmlnID0g dmlydGlvX3BzdG9yZV9zZXRfY29uZmlnOwo+ICsgICAgdmRjLT5nZXRfZmVhdHVyZXMgPSBnZXRf ZmVhdHVyZXM7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBUeXBlSW5mbyB2aXJ0aW9fcHN0b3Jl X2luZm8gPSB7Cj4gKyAgICAubmFtZSA9IFRZUEVfVklSVElPX1BTVE9SRSwKPiArICAgIC5wYXJl bnQgPSBUWVBFX1ZJUlRJT19ERVZJQ0UsCj4gKyAgICAuaW5zdGFuY2Vfc2l6ZSA9IHNpemVvZihW aXJ0SU9Qc3RvcmUpLAo+ICsgICAgLmluc3RhbmNlX2luaXQgPSB2aXJ0aW9fcHN0b3JlX2luc3Rh bmNlX2luaXQsCj4gKyAgICAuY2xhc3NfaW5pdCA9IHZpcnRpb19wc3RvcmVfY2xhc3NfaW5pdCwK PiArfTsKPiArCj4gK3N0YXRpYyB2b2lkIHZpcnRpb19yZWdpc3Rlcl90eXBlcyh2b2lkKQo+ICt7 Cj4gKyAgICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmdmlydGlvX3BzdG9yZV9pbmZvKTsKPiArfQo+ ICsKPiArdHlwZV9pbml0KHZpcnRpb19yZWdpc3Rlcl90eXBlcykKPiBkaWZmIC0tZ2l0IGEvaW5j bHVkZS9ody9wY2kvcGNpLmggYi9pbmNsdWRlL2h3L3BjaS9wY2kuaAo+IGluZGV4IDc0ZDc5N2Qu LjAwMGUxZTkgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9ody9wY2kvcGNpLmgKPiArKysgYi9pbmNs dWRlL2h3L3BjaS9wY2kuaAo+IEBAIC03OSw2ICs3OSw3IEBACj4gICNkZWZpbmUgUENJX0RFVklD RV9JRF9WSVJUSU9fU0NTSSAgICAgICAgMHgxMDA0Cj4gICNkZWZpbmUgUENJX0RFVklDRV9JRF9W SVJUSU9fUk5HICAgICAgICAgMHgxMDA1Cj4gICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSU9f OVAgICAgICAgICAgMHgxMDA5Cj4gKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSU9fUFNUT1JF ICAgICAgMHgxMDBhCj4gIAo+ICAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUkVESEFUICAgICAgICAg ICAgIDB4MWIzNgo+ICAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkVESEFUX0JSSURHRSAgICAgIDB4 MDAwMQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2h3L3ZpcnRpby92aXJ0aW8tcHN0b3JlLmggYi9p bmNsdWRlL2h3L3ZpcnRpby92aXJ0aW8tcHN0b3JlLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAuLmQxODhhNDgKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvaW5jbHVkZS9o dy92aXJ0aW8vdmlydGlvLXBzdG9yZS5oCj4gQEAgLTAsMCArMSwzNCBAQAo+ICsvKgo+ICsgKiBW aXJ0aW8gUHN0b3JlIFN1cHBvcnQKPiArICoKPiArICogQXV0aG9yczoKPiArICogIE5hbWh5dW5n IEtpbSAgICAgIDxuYW1oeXVuZ0BnbWFpbC5jb20+Cj4gKyAqCj4gKyAqIFRoaXMgd29yayBpcyBs aWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQo+ ICsgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5Lgo+ICsgKgo+ ICsgKi8KPiArCj4gKyNpZm5kZWYgX1FFTVVfVklSVElPX1BTVE9SRV9ICj4gKyNkZWZpbmUgX1FF TVVfVklSVElPX1BTVE9SRV9ICj4gKwo+ICsjaW5jbHVkZSAic3RhbmRhcmQtaGVhZGVycy9saW51 eC92aXJ0aW9fcHN0b3JlLmgiCj4gKyNpbmNsdWRlICJody92aXJ0aW8vdmlydGlvLmgiCj4gKyNp bmNsdWRlICJody9wY2kvcGNpLmgiCj4gKwo+ICsjZGVmaW5lIFRZUEVfVklSVElPX1BTVE9SRSAi dmlydGlvLXBzdG9yZS1kZXZpY2UiCj4gKyNkZWZpbmUgVklSVElPX1BTVE9SRShvYmopIFwKPiAr ICAgICAgICBPQkpFQ1RfQ0hFQ0soVmlydElPUHN0b3JlLCAob2JqKSwgVFlQRV9WSVJUSU9fUFNU T1JFKQo+ICsKPiArdHlwZWRlZiBzdHJ1Y3QgVmlydElPUHN0b3JlIHsKPiArICAgIFZpcnRJT0Rl dmljZSAgICBwYXJlbnRfb2JqOwo+ICsgICAgVmlydFF1ZXVlICAgICAgKnZxWzJdOwo+ICsgICAg Y2hhciAgICAgICAgICAgKmRpcmVjdG9yeTsKPiArICAgIHVpbnQ2NF90ICAgICAgICBpZDsKPiAr ICAgIHVpbnQ2NF90ICAgICAgICBjb25zb2xlX2lkOwo+ICsgICAgRElSICAgICAgICAgICAgKmRp cnA7Cj4gKyAgICB1aW50NjRfdCAgICAgICAgYnVmc2l6ZTsKPiArICAgIGJvb2wgICAgICAgICAg ICBjb25zb2xlOwo+ICt9IFZpcnRJT1BzdG9yZTsKPiArCj4gKyNlbmRpZgo+IGRpZmYgLS1naXQg YS9pbmNsdWRlL3N0YW5kYXJkLWhlYWRlcnMvbGludXgvdmlydGlvX2lkcy5oIGIvaW5jbHVkZS9z dGFuZGFyZC1oZWFkZXJzL2xpbnV4L3ZpcnRpb19pZHMuaAo+IGluZGV4IDc3OTI1ZjUuLmM3MmE5 YWIgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9zdGFuZGFyZC1oZWFkZXJzL2xpbnV4L3ZpcnRpb19p ZHMuaAo+ICsrKyBiL2luY2x1ZGUvc3RhbmRhcmQtaGVhZGVycy9saW51eC92aXJ0aW9faWRzLmgK PiBAQCAtNDEsNSArNDEsNiBAQAo+ICAjZGVmaW5lIFZJUlRJT19JRF9DQUlGCSAgICAgICAxMiAv KiBWaXJ0aW8gY2FpZiAqLwo+ICAjZGVmaW5lIFZJUlRJT19JRF9HUFUgICAgICAgICAgMTYgLyog dmlydGlvIEdQVSAqLwo+ICAjZGVmaW5lIFZJUlRJT19JRF9JTlBVVCAgICAgICAgMTggLyogdmly dGlvIGlucHV0ICovCj4gKyNkZWZpbmUgVklSVElPX0lEX1BTVE9SRSAgICAgICAyMiAvKiB2aXJ0 aW8gcHN0b3JlICovCj4gIAo+ICAjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19JRFNfSCAqLwo+IGRp ZmYgLS1naXQgYS9pbmNsdWRlL3N0YW5kYXJkLWhlYWRlcnMvbGludXgvdmlydGlvX3BzdG9yZS5o IGIvaW5jbHVkZS9zdGFuZGFyZC1oZWFkZXJzL2xpbnV4L3ZpcnRpb19wc3RvcmUuaAo+IG5ldyBm aWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYjg5M2QxNQo+IC0tLSAvZGV2L251bGwK PiArKysgYi9pbmNsdWRlL3N0YW5kYXJkLWhlYWRlcnMvbGludXgvdmlydGlvX3BzdG9yZS5oCj4g QEAgLTAsMCArMSw4MCBAQAo+ICsjaWZuZGVmIF9MSU5VWF9WSVJUSU9fUFNUT1JFX0gKPiArI2Rl ZmluZSBfTElOVVhfVklSVElPX1BTVE9SRV9ICj4gKy8qIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNl bnNlZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMgdG8gaW1wbGVtZW50Cj4gKyAq IGNvbXBhdGlibGUgZHJpdmVycy9zZXJ2ZXJzLgo+ICsgKgo+ICsgKiBSZWRpc3RyaWJ1dGlvbiBh bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKPiArICog bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj b25kaXRpb25zCj4gKyAqIGFyZSBtZXQ6Cj4gKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cj4gKyAqICAgIG5vdGljZSwg dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KPiAr ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh Ym92ZSBjb3B5cmlnaHQKPiArICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQo+ICsgKiAgICBkb2N1bWVudGF0aW9u IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgo+ ICsgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIElCTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250 cmlidXRvcnMKPiArICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1 Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCj4gKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMg cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgo+ICsgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQK PiArICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO T1QgTElNSVRFRCBUTywgVEhFCj4gKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCj4gKyAqIEFSRSBESVND TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSUJNIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUK PiArICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN UExBUlksIE9SIENPTlNFUVVFTlRJQUwKPiArICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKPiArICogT1IgU0VS VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV UFRJT04pCj4gKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCj4gKyAqIExJQUJJTElUWSwgT1IgVE9SVCAo SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKPiAr ICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI RSBQT1NTSUJJTElUWSBPRgo+ICsgKiBTVUNIIERBTUFHRS4gKi8KPiArI2luY2x1ZGUgInN0YW5k YXJkLWhlYWRlcnMvbGludXgvdHlwZXMuaCIKPiArI2luY2x1ZGUgInN0YW5kYXJkLWhlYWRlcnMv bGludXgvdmlydGlvX3R5cGVzLmgiCj4gKyNpbmNsdWRlICJzdGFuZGFyZC1oZWFkZXJzL2xpbnV4 L3ZpcnRpb19pZHMuaCIKPiArI2luY2x1ZGUgInN0YW5kYXJkLWhlYWRlcnMvbGludXgvdmlydGlv X2NvbmZpZy5oIgo+ICsKPiArI2RlZmluZSBWSVJUSU9fUFNUT1JFX0NNRF9OVUxMICAgMAo+ICsj ZGVmaW5lIFZJUlRJT19QU1RPUkVfQ01EX09QRU4gICAxCj4gKyNkZWZpbmUgVklSVElPX1BTVE9S RV9DTURfUkVBRCAgIDIKPiArI2RlZmluZSBWSVJUSU9fUFNUT1JFX0NNRF9XUklURSAgMwo+ICsj ZGVmaW5lIFZJUlRJT19QU1RPUkVfQ01EX0VSQVNFICA0Cj4gKyNkZWZpbmUgVklSVElPX1BTVE9S RV9DTURfQ0xPU0UgIDUKPiArCj4gKyNkZWZpbmUgVklSVElPX1BTVE9SRV9UWVBFX1VOS05PV04g IDAKPiArI2RlZmluZSBWSVJUSU9fUFNUT1JFX1RZUEVfRE1FU0cgICAgMQo+ICsjZGVmaW5lIFZJ UlRJT19QU1RPUkVfVFlQRV9DT05TT0xFICAyCj4gKwo+ICsjZGVmaW5lIFZJUlRJT19QU1RPUkVf RkxfQ09NUFJFU1NFRCAgMQo+ICsKPiArI2RlZmluZSBWSVJUSU9fUFNUT1JFX0NPTkZJR19GTF9D T05TT0xFICAoMSA8PCAwKQo+ICsKPiArc3RydWN0IHZpcnRpb19wc3RvcmVfcmVxIHsKPiArICAg IF9fdmlydGlvMTYgY21kOwo+ICsgICAgX192aXJ0aW8xNiB0eXBlOwo+ICsgICAgX192aXJ0aW8z MiBmbGFnczsKPiArICAgIF9fdmlydGlvNjQgaWQ7Cj4gKyAgICBfX3ZpcnRpbzMyIGNvdW50Owo+ ICsgICAgX192aXJ0aW8zMiByZXNlcnZlZDsKPiArfTsKPiArCj4gK3N0cnVjdCB2aXJ0aW9fcHN0 b3JlX3JlcyB7Cj4gKyAgICBfX3ZpcnRpbzE2IGNtZDsKPiArICAgIF9fdmlydGlvMTYgdHlwZTsK PiArICAgIF9fdmlydGlvMzIgcmV0Owo+ICt9Owo+ICsKPiArc3RydWN0IHZpcnRpb19wc3RvcmVf ZmlsZWluZm8gewo+ICsgICAgX192aXJ0aW82NCBpZDsKPiArICAgIF9fdmlydGlvMzIgY291bnQ7 Cj4gKyAgICBfX3ZpcnRpbzE2IHR5cGU7Cj4gKyAgICBfX3ZpcnRpbzE2IHVudXNlZDsKPiArICAg IF9fdmlydGlvMzIgZmxhZ3M7Cj4gKyAgICBfX3ZpcnRpbzMyIGxlbjsKPiArICAgIF9fdmlydGlv NjQgdGltZV9zZWM7Cj4gKyAgICBfX3ZpcnRpbzMyIHRpbWVfbnNlYzsKPiArICAgIF9fdmlydGlv MzIgcmVzZXJ2ZWQ7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgdmlydGlvX3BzdG9yZV9jb25maWcgewo+ ICsgICAgX192aXJ0aW8zMiBidWZzaXplOwo+ICsgICAgX192aXJ0aW8zMiBmbGFnczsKPiArfTsK PiArCj4gKyNlbmRpZiAvKiBfTElOVVhfVklSVElPX1BTVE9SRV9IICovCj4gZGlmZiAtLWdpdCBh L3FkZXYtbW9uaXRvci5jIGIvcWRldi1tb25pdG9yLmMKPiBpbmRleCBlMTk2MTdmLi5lMWRmNWE5 IDEwMDY0NAo+IC0tLSBhL3FkZXYtbW9uaXRvci5jCj4gKysrIGIvcWRldi1tb25pdG9yLmMKPiBA QCAtNzMsNiArNzMsNyBAQCBzdGF0aWMgY29uc3QgUURldkFsaWFzIHFkZXZfYWxpYXNfdGFibGVb XSA9IHsKPiAgICAgIHsgInZpcnRpby1zZXJpYWwtcGNpIiwgInZpcnRpby1zZXJpYWwiLCBRRU1V X0FSQ0hfQUxMICYgflFFTVVfQVJDSF9TMzkwWCB9LAo+ICAgICAgeyAidmlydGlvLXRhYmxldC1j Y3ciLCAidmlydGlvLXRhYmxldCIsIFFFTVVfQVJDSF9TMzkwWCB9LAo+ICAgICAgeyAidmlydGlv LXRhYmxldC1wY2kiLCAidmlydGlvLXRhYmxldCIsIFFFTVVfQVJDSF9BTEwgJiB+UUVNVV9BUkNI X1MzOTBYIH0sCj4gKyAgICB7ICJ2aXJ0aW8tcHN0b3JlLXBjaSIsICJ2aXJ0aW8tcHN0b3JlIiB9 LAo+ICAgICAgeyB9Cj4gIH07Cj4gIAo+IC0tIAo+IDIuOC4wCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1YWxpemF0aW9uIG1haWxpbmcgbGlzdApW aXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxp bnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby92aXJ0dWFsaXphdGlvbg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932720AbcG1ADN (ORCPT ); Wed, 27 Jul 2016 20:03:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49980 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758277AbcG1ADG (ORCPT ); Wed, 27 Jul 2016 20:03:06 -0400 Date: Thu, 28 Jul 2016 03:02:54 +0300 From: "Michael S. Tsirkin" To: Namhyung Kim Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org, virtualization@lists.linux-foundation.org, LKML , Paolo Bonzini , Radim =?utf-8?B?S3LEjW3DocWZ?= , Anthony Liguori , Anton Vorontsov , Colin Cross , Kees Cook , Tony Luck , Steven Rostedt , Ingo Molnar , Minchan Kim Subject: Re: [PATCH 6/7] qemu: Implement virtio-pstore device Message-ID: <20160728023254-mutt-send-email-mst@kernel.org> References: <1469632111-23260-1-git-send-email-namhyung@kernel.org> <1469632111-23260-7-git-send-email-namhyung@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1469632111-23260-7-git-send-email-namhyung@kernel.org> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 28 Jul 2016 00:03:04 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jul 28, 2016 at 12:08:30AM +0900, Namhyung Kim wrote: > Add virtio pstore device to allow kernel log files saved on the host. > It will save the log files on the directory given by pstore device > option. > > $ qemu-system-x86_64 -device virtio-pstore,directory=dir-xx ... > > (guest) # echo c > /proc/sysrq-trigger So if the point is handling system crashes, I suspect virtio is the wrong protocol to use. ATM it's rather elaborate for performance, it's likely not to work when linux is crashing. I think you want something very very simple that will still work when you crash. Like maybe a serial device? > $ ls dir-xx > dmesg-1.enc.z dmesg-2.enc.z > > The log files are usually compressed using zlib. Users can see the log > messages directly on the host or on the guest (using pstore filesystem). So this lacks all management tools that a regular storage device has, and these are necessary if people are to use this in production. For example, some kind of provision for limiting the amount of host disk this can consume seems called for. Rate-limiting disk writes on host also seems necessary. Handling host disk errors always propagates error to guest but an option to e.g. stop vm might be useful to avoid corruption. > > The 'directory' property is required for virtio-pstore device to work. > It also adds 'bufsize' and 'console' (boolean) properties. No idea what these do. Seem to be RW by guest but have no effect otherwise. > Cc: Paolo Bonzini > Cc: Radim Krčmář > Cc: "Michael S. Tsirkin" > Cc: Anthony Liguori > Cc: Anton Vorontsov > Cc: Colin Cross > Cc: Kees Cook > Cc: Tony Luck > Cc: Steven Rostedt > Cc: Ingo Molnar > Cc: Minchan Kim > Cc: kvm@vger.kernel.org > Cc: qemu-devel@nongnu.org > Cc: virtualization@lists.linux-foundation.org > Signed-off-by: Namhyung Kim > --- > hw/virtio/Makefile.objs | 2 +- > hw/virtio/virtio-pci.c | 54 +++ > hw/virtio/virtio-pci.h | 14 + > hw/virtio/virtio-pstore.c | 477 +++++++++++++++++++++++++ > include/hw/pci/pci.h | 1 + > include/hw/virtio/virtio-pstore.h | 34 ++ > include/standard-headers/linux/virtio_ids.h | 1 + > include/standard-headers/linux/virtio_pstore.h | 80 +++++ > qdev-monitor.c | 1 + > 9 files changed, 663 insertions(+), 1 deletion(-) > create mode 100644 hw/virtio/virtio-pstore.c > create mode 100644 include/hw/virtio/virtio-pstore.h > create mode 100644 include/standard-headers/linux/virtio_pstore.h > > diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs > index 3e2b175..aae7082 100644 > --- a/hw/virtio/Makefile.objs > +++ b/hw/virtio/Makefile.objs > @@ -4,4 +4,4 @@ common-obj-y += virtio-bus.o > common-obj-y += virtio-mmio.o > > obj-y += virtio.o virtio-balloon.o > -obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o > +obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o virtio-pstore.o > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index f0677b7..d99a405 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -2414,6 +2414,59 @@ static const TypeInfo virtio_host_pci_info = { > }; > #endif > > +/* virtio-pstore-pci */ > + > +static void virtio_pstore_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) > +{ > + VirtIOPstorePCI *vps = VIRTIO_PSTORE_PCI(vpci_dev); > + DeviceState *vdev = DEVICE(&vps->vdev); > + Error *err = NULL; > + > + qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus)); > + object_property_set_bool(OBJECT(vdev), true, "realized", &err); > + if (err) { > + error_propagate(errp, err); > + return; > + } > +} > + > +static void virtio_pstore_pci_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); > + PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); > + > + k->realize = virtio_pstore_pci_realize; > + set_bit(DEVICE_CATEGORY_MISC, dc->categories); > + > + pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; > + pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_PSTORE; > + pcidev_k->revision = VIRTIO_PCI_ABI_VERSION; > + pcidev_k->class_id = PCI_CLASS_OTHERS; > +} > + > +static void virtio_pstore_pci_instance_init(Object *obj) > +{ > + VirtIOPstorePCI *dev = VIRTIO_PSTORE_PCI(obj); > + > + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), > + TYPE_VIRTIO_PSTORE); > + object_property_add_alias(obj, "directory", OBJECT(&dev->vdev), > + "directory", &error_abort); > + object_property_add_alias(obj, "bufsize", OBJECT(&dev->vdev), > + "bufsize", &error_abort); > + object_property_add_alias(obj, "console", OBJECT(&dev->vdev), > + "console", &error_abort); > +} > + > +static const TypeInfo virtio_pstore_pci_info = { > + .name = TYPE_VIRTIO_PSTORE_PCI, > + .parent = TYPE_VIRTIO_PCI, > + .instance_size = sizeof(VirtIOPstorePCI), > + .instance_init = virtio_pstore_pci_instance_init, > + .class_init = virtio_pstore_pci_class_init, > +}; > + > /* virtio-pci-bus */ > > static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size, > @@ -2483,6 +2536,7 @@ static void virtio_pci_register_types(void) > #ifdef CONFIG_VHOST_SCSI > type_register_static(&vhost_scsi_pci_info); > #endif > + type_register_static(&virtio_pstore_pci_info); > } > > type_init(virtio_pci_register_types) > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h > index e4548c2..b4c039f 100644 > --- a/hw/virtio/virtio-pci.h > +++ b/hw/virtio/virtio-pci.h > @@ -31,6 +31,7 @@ > #ifdef CONFIG_VHOST_SCSI > #include "hw/virtio/vhost-scsi.h" > #endif > +#include "hw/virtio/virtio-pstore.h" > > typedef struct VirtIOPCIProxy VirtIOPCIProxy; > typedef struct VirtIOBlkPCI VirtIOBlkPCI; > @@ -44,6 +45,7 @@ typedef struct VirtIOInputPCI VirtIOInputPCI; > typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI; > typedef struct VirtIOInputHostPCI VirtIOInputHostPCI; > typedef struct VirtIOGPUPCI VirtIOGPUPCI; > +typedef struct VirtIOPstorePCI VirtIOPstorePCI; > > /* virtio-pci-bus */ > > @@ -311,6 +313,18 @@ struct VirtIOGPUPCI { > VirtIOGPU vdev; > }; > > +/* > + * virtio-pstore-pci: This extends VirtioPCIProxy. > + */ > +#define TYPE_VIRTIO_PSTORE_PCI "virtio-pstore-pci" > +#define VIRTIO_PSTORE_PCI(obj) \ > + OBJECT_CHECK(VirtIOPstorePCI, (obj), TYPE_VIRTIO_PSTORE_PCI) > + > +struct VirtIOPstorePCI { > + VirtIOPCIProxy parent_obj; > + VirtIOPstore vdev; > +}; > + > /* Virtio ABI version, if we increment this, we break the guest driver. */ > #define VIRTIO_PCI_ABI_VERSION 0 > > diff --git a/hw/virtio/virtio-pstore.c b/hw/virtio/virtio-pstore.c > new file mode 100644 > index 0000000..2ca7786 > --- /dev/null > +++ b/hw/virtio/virtio-pstore.c > @@ -0,0 +1,477 @@ > +/* > + * Virtio Pstore Device > + * > + * Copyright (C) 2016 LG Electronics > + * > + * Authors: > + * Namhyung Kim > + * > + * This work is licensed under the terms of the GNU GPL, version 2. We generally ask new code to be v2 or later. > See > + * the COPYING file in the top-level directory. > + * > + */ > + > +#include > + > +#include "qemu/osdep.h" > +#include "qemu/iov.h" > +#include "qemu-common.h" > +#include "qemu/cutils.h" > +#include "qemu/error-report.h" > +#include "sysemu/kvm.h" > +#include "qapi/visitor.h" > +#include "qapi-event.h" > +#include "trace.h" > + > +#include "hw/virtio/virtio.h" > +#include "hw/virtio/virtio-bus.h" > +#include "hw/virtio/virtio-access.h" > +#include "hw/virtio/virtio-pstore.h" > + > + > +static void virtio_pstore_to_filename(VirtIOPstore *s, char *buf, size_t sz, > + struct virtio_pstore_req *req) > +{ > + const char *basename; > + unsigned long long id = 0; > + unsigned int flags = le32_to_cpu(req->flags); > + > + switch (le16_to_cpu(req->type)) { > + case VIRTIO_PSTORE_TYPE_DMESG: > + basename = "dmesg"; > + id = s->id++; > + break; > + case VIRTIO_PSTORE_TYPE_CONSOLE: > + basename = "console"; > + if (s->console_id) { > + id = s->console_id; > + } else { > + id = s->console_id = s->id++; > + } > + break; > + default: > + basename = "unknown"; > + break; > + } > + > + snprintf(buf, sz, "%s/%s-%llu%s", s->directory, basename, id, > + flags & VIRTIO_PSTORE_FL_COMPRESSED ? ".enc.z" : ""); > +} > + > +static void virtio_pstore_from_filename(VirtIOPstore *s, char *name, > + char *buf, size_t sz, > + struct virtio_pstore_fileinfo *info) > +{ > + snprintf(buf, sz, "%s/%s", s->directory, name); if this does not fit, buf will not be 0 terminated and can generally be corrupted. > + > + if (g_str_has_prefix(name, "dmesg-")) { > + info->type = VIRTIO_PSTORE_TYPE_DMESG; > + name += strlen("dmesg-"); > + } else if (g_str_has_prefix(name, "console-")) { > + info->type = VIRTIO_PSTORE_TYPE_CONSOLE; > + name += strlen("console-"); > + } else if (g_str_has_prefix(name, "unknown-")) { > + info->type = VIRTIO_PSTORE_TYPE_UNKNOWN; > + name += strlen("unknown-"); > + } > + > + qemu_strtoull(name, NULL, 0, &info->id); > + > + info->flags = 0; > + if (g_str_has_suffix(name, ".enc.z")) { > + info->flags |= VIRTIO_PSTORE_FL_COMPRESSED; > + } > +} > + > +static ssize_t virtio_pstore_do_open(VirtIOPstore *s) > +{ > + s->dirp = opendir(s->directory); > + if (s->dirp == NULL) { > + return -1; > + } > + > + return 0; > +} > + > +static ssize_t virtio_pstore_do_read(VirtIOPstore *s, struct iovec *in_sg, > + unsigned int in_num, > + struct virtio_pstore_res *res) > +{ > + char path[PATH_MAX]; > + int fd; > + ssize_t len; > + struct stat stbuf; > + struct dirent *dent; > + int sg_num = in_num; > + struct iovec sg[sg_num]; > + struct virtio_pstore_fileinfo info; > + size_t offset = sizeof(*res) + sizeof(info); > + > + if (s->dirp == NULL) { > + return -1; > + } > + > + dent = readdir(s->dirp); > + while (dent) { > + if (dent->d_name[0] != '.') { > + break; > + } > + dent = readdir(s->dirp); > + } > + > + if (dent == NULL) { > + return 0; > + } > + > + /* skip res and fileinfo */ > + sg_num = iov_copy(sg, sg_num, in_sg, in_num, offset, > + iov_size(in_sg, in_num) - offset); > + > + virtio_pstore_from_filename(s, dent->d_name, path, sizeof(path), &info); > + fd = open(path, O_RDONLY); > + if (fd < 0) { > + error_report("cannot open %s", path); > + return -1; > + } > + > + if (fstat(fd, &stbuf) < 0) { > + len = -1; > + goto out; > + } > + > + len = readv(fd, sg, sg_num); > + if (len < 0) { > + if (errno == EAGAIN) { > + len = 0; > + } > + goto out; > + } > + > + info.id = cpu_to_le64(info.id); > + info.type = cpu_to_le16(info.type); > + info.flags = cpu_to_le32(info.flags); > + info.len = cpu_to_le32(len); > + info.time_sec = cpu_to_le64(stbuf.st_ctim.tv_sec); > + info.time_nsec = cpu_to_le32(stbuf.st_ctim.tv_nsec); > + > + iov_from_buf(in_sg, in_num, sizeof(*res), &info, sizeof(info)); > + len += sizeof(info); > + > + out: > + close(fd); > + return len; > +} > + > +static ssize_t virtio_pstore_do_write(VirtIOPstore *s, struct iovec *out_sg, > + unsigned int out_num, > + struct virtio_pstore_req *req) > +{ > + char path[PATH_MAX]; > + int fd; > + ssize_t len; > + unsigned short type; > + int flags = O_WRONLY | O_CREAT; > + > + /* we already consume the req */ > + iov_discard_front(&out_sg, &out_num, sizeof(*req)); > + > + virtio_pstore_to_filename(s, path, sizeof(path), req); > + > + type = le16_to_cpu(req->type); > + > + if (type == VIRTIO_PSTORE_TYPE_DMESG) { > + flags |= O_TRUNC; > + } else if (type == VIRTIO_PSTORE_TYPE_CONSOLE) { > + flags |= O_APPEND; > + } > + > + fd = open(path, flags, 0644); > + if (fd < 0) { > + error_report("cannot open %s", path); > + return -1; > + } > + len = writev(fd, out_sg, out_num); > + close(fd); > + > + return len; All this is blocking VM until host io completes. > +} > + > +static ssize_t virtio_pstore_do_close(VirtIOPstore *s) > +{ > + if (s->dirp == NULL) { > + return 0; > + } > + > + closedir(s->dirp); > + s->dirp = NULL; > + > + return 0; > +} > + > +static ssize_t virtio_pstore_do_erase(VirtIOPstore *s, > + struct virtio_pstore_req *req) > +{ > + char path[PATH_MAX]; > + > + virtio_pstore_to_filename(s, path, sizeof(path), req); > + > + return unlink(path); > +} > + > +static void virtio_pstore_handle_io(VirtIODevice *vdev, VirtQueue *vq) > +{ > + VirtIOPstore *s = VIRTIO_PSTORE(vdev); > + VirtQueueElement *elem; > + struct virtio_pstore_req req; > + struct virtio_pstore_res res; > + ssize_t len = 0; > + int ret; > + > + for (;;) { > + elem = virtqueue_pop(vq, sizeof(VirtQueueElement)); > + if (!elem) { > + return; > + } > + > + if (elem->out_num < 1 || elem->in_num < 1) { > + error_report("request or response buffer is missing"); > + exit(1); > + } > + > + len = iov_to_buf(elem->out_sg, elem->out_num, 0, &req, sizeof(req)); > + if (len != (ssize_t)sizeof(req)) { > + error_report("invalid request size: %ld", (long)len); > + exit(1); > + } > + res.cmd = req.cmd; > + res.type = req.type; > + > + switch (le16_to_cpu(req.cmd)) { > + case VIRTIO_PSTORE_CMD_OPEN: > + ret = virtio_pstore_do_open(s); > + break; > + case VIRTIO_PSTORE_CMD_READ: > + ret = virtio_pstore_do_read(s, elem->in_sg, elem->in_num, &res); > + if (ret > 0) { > + len = ret; > + ret = 0; > + } > + break; > + case VIRTIO_PSTORE_CMD_WRITE: > + ret = virtio_pstore_do_write(s, elem->out_sg, elem->out_num, &req); > + break; > + case VIRTIO_PSTORE_CMD_CLOSE: > + ret = virtio_pstore_do_close(s); > + break; > + case VIRTIO_PSTORE_CMD_ERASE: > + ret = virtio_pstore_do_erase(s, &req); > + break; > + default: > + ret = -1; > + break; > + } > + > + res.ret = ret; > + > + iov_from_buf(elem->in_sg, elem->in_num, 0, &res, sizeof(res)); > + virtqueue_push(vq, elem, sizeof(res) + len); this is wrong - len should be # of bytes written into guest memory. > + > + virtio_notify(vdev, vq); > + g_free(elem); > + > + if (ret < 0) { > + return; > + } > + } > +} > + > +static void virtio_pstore_device_realize(DeviceState *dev, Error **errp) > +{ > + VirtIODevice *vdev = VIRTIO_DEVICE(dev); > + VirtIOPstore *s = VIRTIO_PSTORE(dev); > + > + virtio_init(vdev, "virtio-pstore", VIRTIO_ID_PSTORE, > + sizeof(struct virtio_pstore_config)); > + > + s->id = 1; > + s->console_id = 0; > + > + s->vq[0] = virtio_add_queue(vdev, 128, virtio_pstore_handle_io); > + s->vq[1] = virtio_add_queue(vdev, 128, virtio_pstore_handle_io); > +} > + > +static void virtio_pstore_device_unrealize(DeviceState *dev, Error **errp) > +{ > + VirtIODevice *vdev = VIRTIO_DEVICE(dev); > + > + virtio_cleanup(vdev); > +} > + > +static void virtio_pstore_get_config(VirtIODevice *vdev, uint8_t *config_data) > +{ > + VirtIOPstore *dev = VIRTIO_PSTORE(vdev); > + struct virtio_pstore_config config; > + > + config.bufsize = cpu_to_le32(dev->bufsize); > + if (dev->console) { > + config.flags |= cpu_to_le32(VIRTIO_PSTORE_CONFIG_FL_CONSOLE); > + } > + > + memcpy(config_data, &config, sizeof(struct virtio_pstore_config)); > +} > + > +static void virtio_pstore_set_config(VirtIODevice *vdev, > + const uint8_t *config_data) > +{ > + VirtIOPstore *dev = VIRTIO_PSTORE(vdev); > + struct virtio_pstore_config config; > + > + memcpy(&config, config_data, sizeof(struct virtio_pstore_config)); > + > + dev->bufsize = le32_to_cpu(config.bufsize); > +} > + > +static uint64_t get_features(VirtIODevice *vdev, uint64_t f, Error **errp) > +{ > + return f; > +} > + > +static void pstore_get_directory(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + > + visit_type_str(v, name, &s->directory, errp); > +} > + > +static void pstore_set_directory(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + Error *local_err = NULL; > + char *value; > + > + visit_type_str(v, name, &value, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + g_free(s->directory); > + s->directory = value; > +} > + > +static void pstore_release_directory(Object *obj, const char *name, > + void *opaque) > +{ > + VirtIOPstore *s = opaque; > + > + g_free(s->directory); > + s->directory = NULL; > +} > + > +static void pstore_get_bufsize(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + uint64_t value = s->bufsize; > + > + visit_type_size(v, name, &value, errp); > +} > + > +static void pstore_set_bufsize(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + Error *error = NULL; > + uint64_t value; > + > + visit_type_size(v, name, &value, &error); > + if (error) { > + error_propagate(errp, error); > + return; > + } > + > + if (value < 4096) { > + error_report("Warning: too small buffer size: %"PRIu64, value); > + } > + > + s->bufsize = value; > +} > + > +static void pstore_get_console(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + bool value = s->console; > + > + visit_type_bool(v, name, &value, errp); > +} > + > +static void pstore_set_console(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s = opaque; > + Error *error = NULL; > + bool value; > + > + visit_type_bool(v, name, &value, &error); > + if (error) { > + error_propagate(errp, error); > + return; > + } > + > + s->console = value; > +} > + > +static Property virtio_pstore_properties[] = { > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void virtio_pstore_instance_init(Object *obj) > +{ > + VirtIOPstore *s = VIRTIO_PSTORE(obj); > + > + object_property_add(obj, "directory", "str", > + pstore_get_directory, pstore_set_directory, > + pstore_release_directory, s, NULL); > + object_property_add(obj, "bufsize", "size", > + pstore_get_bufsize, pstore_set_bufsize, NULL, s, NULL); > + object_property_add(obj, "console", "bool", > + pstore_get_console, pstore_set_console, NULL, s, NULL); > +} > + > +static void virtio_pstore_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); > + > + dc->props = virtio_pstore_properties; > + set_bit(DEVICE_CATEGORY_MISC, dc->categories); > + vdc->realize = virtio_pstore_device_realize; > + vdc->unrealize = virtio_pstore_device_unrealize; > + vdc->get_config = virtio_pstore_get_config; > + vdc->set_config = virtio_pstore_set_config; > + vdc->get_features = get_features; > +} > + > +static const TypeInfo virtio_pstore_info = { > + .name = TYPE_VIRTIO_PSTORE, > + .parent = TYPE_VIRTIO_DEVICE, > + .instance_size = sizeof(VirtIOPstore), > + .instance_init = virtio_pstore_instance_init, > + .class_init = virtio_pstore_class_init, > +}; > + > +static void virtio_register_types(void) > +{ > + type_register_static(&virtio_pstore_info); > +} > + > +type_init(virtio_register_types) > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index 74d797d..000e1e9 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -79,6 +79,7 @@ > #define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004 > #define PCI_DEVICE_ID_VIRTIO_RNG 0x1005 > #define PCI_DEVICE_ID_VIRTIO_9P 0x1009 > +#define PCI_DEVICE_ID_VIRTIO_PSTORE 0x100a > > #define PCI_VENDOR_ID_REDHAT 0x1b36 > #define PCI_DEVICE_ID_REDHAT_BRIDGE 0x0001 > diff --git a/include/hw/virtio/virtio-pstore.h b/include/hw/virtio/virtio-pstore.h > new file mode 100644 > index 0000000..d188a48 > --- /dev/null > +++ b/include/hw/virtio/virtio-pstore.h > @@ -0,0 +1,34 @@ > +/* > + * Virtio Pstore Support > + * > + * Authors: > + * Namhyung Kim > + * > + * This work is licensed under the terms of the GNU GPL, version 2. See > + * the COPYING file in the top-level directory. > + * > + */ > + > +#ifndef _QEMU_VIRTIO_PSTORE_H > +#define _QEMU_VIRTIO_PSTORE_H > + > +#include "standard-headers/linux/virtio_pstore.h" > +#include "hw/virtio/virtio.h" > +#include "hw/pci/pci.h" > + > +#define TYPE_VIRTIO_PSTORE "virtio-pstore-device" > +#define VIRTIO_PSTORE(obj) \ > + OBJECT_CHECK(VirtIOPstore, (obj), TYPE_VIRTIO_PSTORE) > + > +typedef struct VirtIOPstore { > + VirtIODevice parent_obj; > + VirtQueue *vq[2]; > + char *directory; > + uint64_t id; > + uint64_t console_id; > + DIR *dirp; > + uint64_t bufsize; > + bool console; > +} VirtIOPstore; > + > +#endif > diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h > index 77925f5..c72a9ab 100644 > --- a/include/standard-headers/linux/virtio_ids.h > +++ b/include/standard-headers/linux/virtio_ids.h > @@ -41,5 +41,6 @@ > #define VIRTIO_ID_CAIF 12 /* Virtio caif */ > #define VIRTIO_ID_GPU 16 /* virtio GPU */ > #define VIRTIO_ID_INPUT 18 /* virtio input */ > +#define VIRTIO_ID_PSTORE 22 /* virtio pstore */ > > #endif /* _LINUX_VIRTIO_IDS_H */ > diff --git a/include/standard-headers/linux/virtio_pstore.h b/include/standard-headers/linux/virtio_pstore.h > new file mode 100644 > index 0000000..b893d15 > --- /dev/null > +++ b/include/standard-headers/linux/virtio_pstore.h > @@ -0,0 +1,80 @@ > +#ifndef _LINUX_VIRTIO_PSTORE_H > +#define _LINUX_VIRTIO_PSTORE_H > +/* This header is BSD licensed so anyone can use the definitions to implement > + * compatible drivers/servers. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 3. Neither the name of IBM nor the names of its contributors > + * may be used to endorse or promote products derived from this software > + * without specific prior written permission. > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. */ > +#include "standard-headers/linux/types.h" > +#include "standard-headers/linux/virtio_types.h" > +#include "standard-headers/linux/virtio_ids.h" > +#include "standard-headers/linux/virtio_config.h" > + > +#define VIRTIO_PSTORE_CMD_NULL 0 > +#define VIRTIO_PSTORE_CMD_OPEN 1 > +#define VIRTIO_PSTORE_CMD_READ 2 > +#define VIRTIO_PSTORE_CMD_WRITE 3 > +#define VIRTIO_PSTORE_CMD_ERASE 4 > +#define VIRTIO_PSTORE_CMD_CLOSE 5 > + > +#define VIRTIO_PSTORE_TYPE_UNKNOWN 0 > +#define VIRTIO_PSTORE_TYPE_DMESG 1 > +#define VIRTIO_PSTORE_TYPE_CONSOLE 2 > + > +#define VIRTIO_PSTORE_FL_COMPRESSED 1 > + > +#define VIRTIO_PSTORE_CONFIG_FL_CONSOLE (1 << 0) > + > +struct virtio_pstore_req { > + __virtio16 cmd; > + __virtio16 type; > + __virtio32 flags; > + __virtio64 id; > + __virtio32 count; > + __virtio32 reserved; > +}; > + > +struct virtio_pstore_res { > + __virtio16 cmd; > + __virtio16 type; > + __virtio32 ret; > +}; > + > +struct virtio_pstore_fileinfo { > + __virtio64 id; > + __virtio32 count; > + __virtio16 type; > + __virtio16 unused; > + __virtio32 flags; > + __virtio32 len; > + __virtio64 time_sec; > + __virtio32 time_nsec; > + __virtio32 reserved; > +}; > + > +struct virtio_pstore_config { > + __virtio32 bufsize; > + __virtio32 flags; > +}; > + > +#endif /* _LINUX_VIRTIO_PSTORE_H */ > diff --git a/qdev-monitor.c b/qdev-monitor.c > index e19617f..e1df5a9 100644 > --- a/qdev-monitor.c > +++ b/qdev-monitor.c > @@ -73,6 +73,7 @@ static const QDevAlias qdev_alias_table[] = { > { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, > { "virtio-tablet-ccw", "virtio-tablet", QEMU_ARCH_S390X }, > { "virtio-tablet-pci", "virtio-tablet", QEMU_ARCH_ALL & ~QEMU_ARCH_S390X }, > + { "virtio-pstore-pci", "virtio-pstore" }, > { } > }; > > -- > 2.8.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50513) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSYn7-0000uG-V5 for qemu-devel@nongnu.org; Wed, 27 Jul 2016 20:03:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSYn3-0007Kk-JK for qemu-devel@nongnu.org; Wed, 27 Jul 2016 20:03:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48658) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSYn3-0007Kd-89 for qemu-devel@nongnu.org; Wed, 27 Jul 2016 20:03:05 -0400 Date: Thu, 28 Jul 2016 03:02:54 +0300 From: "Michael S. Tsirkin" Message-ID: <20160728023254-mutt-send-email-mst@kernel.org> References: <1469632111-23260-1-git-send-email-namhyung@kernel.org> <1469632111-23260-7-git-send-email-namhyung@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1469632111-23260-7-git-send-email-namhyung@kernel.org> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 6/7] qemu: Implement virtio-pstore device List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Namhyung Kim Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org, virtualization@lists.linux-foundation.org, LKML , Paolo Bonzini , Radim =?utf-8?B?S3LEjW3DocWZ?= , Anthony Liguori , Anton Vorontsov , Colin Cross , Kees Cook , Tony Luck , Steven Rostedt , Ingo Molnar , Minchan Kim On Thu, Jul 28, 2016 at 12:08:30AM +0900, Namhyung Kim wrote: > Add virtio pstore device to allow kernel log files saved on the host. > It will save the log files on the directory given by pstore device > option. >=20 > $ qemu-system-x86_64 -device virtio-pstore,directory=3Ddir-xx ... >=20 > (guest) # echo c > /proc/sysrq-trigger So if the point is handling system crashes, I suspect virtio is the wrong protocol to use. ATM it's rather elaborate for performance, it's likely not to work when linux is crashing. I think you want something very very simple that will still work when you crash. Like maybe a serial device? > $ ls dir-xx > dmesg-1.enc.z dmesg-2.enc.z >=20 > The log files are usually compressed using zlib. Users can see the log > messages directly on the host or on the guest (using pstore filesystem)= . So this lacks all management tools that a regular storage device has, and these are necessary if people are to use this in production. For example, some kind of provision for limiting the amount of host disk this can consume seems called for. Rate-limiting disk writes on host also seems necessary. Handling host disk errors always propagates error to guest but an option to e.g. stop vm might be useful to avoid corruption. >=20 > The 'directory' property is required for virtio-pstore device to work. > It also adds 'bufsize' and 'console' (boolean) properties. No idea what these do. Seem to be RW by guest but have no effect otherwise. > Cc: Paolo Bonzini > Cc: Radim Kr=C4=8Dm=C3=A1=C5=99 > Cc: "Michael S. Tsirkin" > Cc: Anthony Liguori > Cc: Anton Vorontsov > Cc: Colin Cross > Cc: Kees Cook > Cc: Tony Luck > Cc: Steven Rostedt > Cc: Ingo Molnar > Cc: Minchan Kim > Cc: kvm@vger.kernel.org > Cc: qemu-devel@nongnu.org > Cc: virtualization@lists.linux-foundation.org > Signed-off-by: Namhyung Kim > --- > hw/virtio/Makefile.objs | 2 +- > hw/virtio/virtio-pci.c | 54 +++ > hw/virtio/virtio-pci.h | 14 + > hw/virtio/virtio-pstore.c | 477 +++++++++++++++++= ++++++++ > include/hw/pci/pci.h | 1 + > include/hw/virtio/virtio-pstore.h | 34 ++ > include/standard-headers/linux/virtio_ids.h | 1 + > include/standard-headers/linux/virtio_pstore.h | 80 +++++ > qdev-monitor.c | 1 + > 9 files changed, 663 insertions(+), 1 deletion(-) > create mode 100644 hw/virtio/virtio-pstore.c > create mode 100644 include/hw/virtio/virtio-pstore.h > create mode 100644 include/standard-headers/linux/virtio_pstore.h >=20 > diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs > index 3e2b175..aae7082 100644 > --- a/hw/virtio/Makefile.objs > +++ b/hw/virtio/Makefile.objs > @@ -4,4 +4,4 @@ common-obj-y +=3D virtio-bus.o > common-obj-y +=3D virtio-mmio.o > =20 > obj-y +=3D virtio.o virtio-balloon.o=20 > -obj-$(CONFIG_LINUX) +=3D vhost.o vhost-backend.o vhost-user.o > +obj-$(CONFIG_LINUX) +=3D vhost.o vhost-backend.o vhost-user.o virtio-p= store.o > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index f0677b7..d99a405 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -2414,6 +2414,59 @@ static const TypeInfo virtio_host_pci_info =3D { > }; > #endif > =20 > +/* virtio-pstore-pci */ > + > +static void virtio_pstore_pci_realize(VirtIOPCIProxy *vpci_dev, Error = **errp) > +{ > + VirtIOPstorePCI *vps =3D VIRTIO_PSTORE_PCI(vpci_dev); > + DeviceState *vdev =3D DEVICE(&vps->vdev); > + Error *err =3D NULL; > + > + qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus)); > + object_property_set_bool(OBJECT(vdev), true, "realized", &err); > + if (err) { > + error_propagate(errp, err); > + return; > + } > +} > + > +static void virtio_pstore_pci_class_init(ObjectClass *klass, void *dat= a) > +{ > + DeviceClass *dc =3D DEVICE_CLASS(klass); > + VirtioPCIClass *k =3D VIRTIO_PCI_CLASS(klass); > + PCIDeviceClass *pcidev_k =3D PCI_DEVICE_CLASS(klass); > + > + k->realize =3D virtio_pstore_pci_realize; > + set_bit(DEVICE_CATEGORY_MISC, dc->categories); > + > + pcidev_k->vendor_id =3D PCI_VENDOR_ID_REDHAT_QUMRANET; > + pcidev_k->device_id =3D PCI_DEVICE_ID_VIRTIO_PSTORE; > + pcidev_k->revision =3D VIRTIO_PCI_ABI_VERSION; > + pcidev_k->class_id =3D PCI_CLASS_OTHERS; > +} > + > +static void virtio_pstore_pci_instance_init(Object *obj) > +{ > + VirtIOPstorePCI *dev =3D VIRTIO_PSTORE_PCI(obj); > + > + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), > + TYPE_VIRTIO_PSTORE); > + object_property_add_alias(obj, "directory", OBJECT(&dev->vdev), > + "directory", &error_abort); > + object_property_add_alias(obj, "bufsize", OBJECT(&dev->vdev), > + "bufsize", &error_abort); > + object_property_add_alias(obj, "console", OBJECT(&dev->vdev), > + "console", &error_abort); > +} > + > +static const TypeInfo virtio_pstore_pci_info =3D { > + .name =3D TYPE_VIRTIO_PSTORE_PCI, > + .parent =3D TYPE_VIRTIO_PCI, > + .instance_size =3D sizeof(VirtIOPstorePCI), > + .instance_init =3D virtio_pstore_pci_instance_init, > + .class_init =3D virtio_pstore_pci_class_init, > +}; > + > /* virtio-pci-bus */ > =20 > static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size, > @@ -2483,6 +2536,7 @@ static void virtio_pci_register_types(void) > #ifdef CONFIG_VHOST_SCSI > type_register_static(&vhost_scsi_pci_info); > #endif > + type_register_static(&virtio_pstore_pci_info); > } > =20 > type_init(virtio_pci_register_types) > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h > index e4548c2..b4c039f 100644 > --- a/hw/virtio/virtio-pci.h > +++ b/hw/virtio/virtio-pci.h > @@ -31,6 +31,7 @@ > #ifdef CONFIG_VHOST_SCSI > #include "hw/virtio/vhost-scsi.h" > #endif > +#include "hw/virtio/virtio-pstore.h" > =20 > typedef struct VirtIOPCIProxy VirtIOPCIProxy; > typedef struct VirtIOBlkPCI VirtIOBlkPCI; > @@ -44,6 +45,7 @@ typedef struct VirtIOInputPCI VirtIOInputPCI; > typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI; > typedef struct VirtIOInputHostPCI VirtIOInputHostPCI; > typedef struct VirtIOGPUPCI VirtIOGPUPCI; > +typedef struct VirtIOPstorePCI VirtIOPstorePCI; > =20 > /* virtio-pci-bus */ > =20 > @@ -311,6 +313,18 @@ struct VirtIOGPUPCI { > VirtIOGPU vdev; > }; > =20 > +/* > + * virtio-pstore-pci: This extends VirtioPCIProxy. > + */ > +#define TYPE_VIRTIO_PSTORE_PCI "virtio-pstore-pci" > +#define VIRTIO_PSTORE_PCI(obj) \ > + OBJECT_CHECK(VirtIOPstorePCI, (obj), TYPE_VIRTIO_PSTORE_PCI) > + > +struct VirtIOPstorePCI { > + VirtIOPCIProxy parent_obj; > + VirtIOPstore vdev; > +}; > + > /* Virtio ABI version, if we increment this, we break the guest driver= . */ > #define VIRTIO_PCI_ABI_VERSION 0 > =20 > diff --git a/hw/virtio/virtio-pstore.c b/hw/virtio/virtio-pstore.c > new file mode 100644 > index 0000000..2ca7786 > --- /dev/null > +++ b/hw/virtio/virtio-pstore.c > @@ -0,0 +1,477 @@ > +/* > + * Virtio Pstore Device > + * > + * Copyright (C) 2016 LG Electronics > + * > + * Authors: > + * Namhyung Kim > + * > + * This work is licensed under the terms of the GNU GPL, version 2. We generally ask new code to be v2 or later. > See > + * the COPYING file in the top-level directory. > + * > + */ > + > +#include > + > +#include "qemu/osdep.h" > +#include "qemu/iov.h" > +#include "qemu-common.h" > +#include "qemu/cutils.h" > +#include "qemu/error-report.h" > +#include "sysemu/kvm.h" > +#include "qapi/visitor.h" > +#include "qapi-event.h" > +#include "trace.h" > + > +#include "hw/virtio/virtio.h" > +#include "hw/virtio/virtio-bus.h" > +#include "hw/virtio/virtio-access.h" > +#include "hw/virtio/virtio-pstore.h" > + > + > +static void virtio_pstore_to_filename(VirtIOPstore *s, char *buf, size= _t sz, > + struct virtio_pstore_req *req) > +{ > + const char *basename; > + unsigned long long id =3D 0; > + unsigned int flags =3D le32_to_cpu(req->flags); > + > + switch (le16_to_cpu(req->type)) { > + case VIRTIO_PSTORE_TYPE_DMESG: > + basename =3D "dmesg"; > + id =3D s->id++; > + break; > + case VIRTIO_PSTORE_TYPE_CONSOLE: > + basename =3D "console"; > + if (s->console_id) { > + id =3D s->console_id; > + } else { > + id =3D s->console_id =3D s->id++; > + } > + break; > + default: > + basename =3D "unknown"; > + break; > + } > + > + snprintf(buf, sz, "%s/%s-%llu%s", s->directory, basename, id, > + flags & VIRTIO_PSTORE_FL_COMPRESSED ? ".enc.z" : ""); > +} > + > +static void virtio_pstore_from_filename(VirtIOPstore *s, char *name, > + char *buf, size_t sz, > + struct virtio_pstore_fileinfo = *info) > +{ > + snprintf(buf, sz, "%s/%s", s->directory, name); if this does not fit, buf will not be 0 terminated and can generally be corrupted. > + > + if (g_str_has_prefix(name, "dmesg-")) { > + info->type =3D VIRTIO_PSTORE_TYPE_DMESG; > + name +=3D strlen("dmesg-"); > + } else if (g_str_has_prefix(name, "console-")) { > + info->type =3D VIRTIO_PSTORE_TYPE_CONSOLE; > + name +=3D strlen("console-"); > + } else if (g_str_has_prefix(name, "unknown-")) { > + info->type =3D VIRTIO_PSTORE_TYPE_UNKNOWN; > + name +=3D strlen("unknown-"); > + } > + > + qemu_strtoull(name, NULL, 0, &info->id); > + > + info->flags =3D 0; > + if (g_str_has_suffix(name, ".enc.z")) { > + info->flags |=3D VIRTIO_PSTORE_FL_COMPRESSED; > + } > +} > + > +static ssize_t virtio_pstore_do_open(VirtIOPstore *s) > +{ > + s->dirp =3D opendir(s->directory); > + if (s->dirp =3D=3D NULL) { > + return -1; > + } > + > + return 0; > +} > + > +static ssize_t virtio_pstore_do_read(VirtIOPstore *s, struct iovec *in= _sg, > + unsigned int in_num, > + struct virtio_pstore_res *res) > +{ > + char path[PATH_MAX]; > + int fd; > + ssize_t len; > + struct stat stbuf; > + struct dirent *dent; > + int sg_num =3D in_num; > + struct iovec sg[sg_num]; > + struct virtio_pstore_fileinfo info; > + size_t offset =3D sizeof(*res) + sizeof(info); > + > + if (s->dirp =3D=3D NULL) { > + return -1; > + } > + > + dent =3D readdir(s->dirp); > + while (dent) { > + if (dent->d_name[0] !=3D '.') { > + break; > + } > + dent =3D readdir(s->dirp); > + } > + > + if (dent =3D=3D NULL) { > + return 0; > + } > + > + /* skip res and fileinfo */ > + sg_num =3D iov_copy(sg, sg_num, in_sg, in_num, offset, > + iov_size(in_sg, in_num) - offset); > + > + virtio_pstore_from_filename(s, dent->d_name, path, sizeof(path), &= info); > + fd =3D open(path, O_RDONLY); > + if (fd < 0) { > + error_report("cannot open %s", path); > + return -1; > + } > + > + if (fstat(fd, &stbuf) < 0) { > + len =3D -1; > + goto out; > + } > + > + len =3D readv(fd, sg, sg_num); > + if (len < 0) { > + if (errno =3D=3D EAGAIN) { > + len =3D 0; > + } > + goto out; > + } > + > + info.id =3D cpu_to_le64(info.id); > + info.type =3D cpu_to_le16(info.type); > + info.flags =3D cpu_to_le32(info.flags); > + info.len =3D cpu_to_le32(len); > + info.time_sec =3D cpu_to_le64(stbuf.st_ctim.tv_sec); > + info.time_nsec =3D cpu_to_le32(stbuf.st_ctim.tv_nsec); > + > + iov_from_buf(in_sg, in_num, sizeof(*res), &info, sizeof(info)); > + len +=3D sizeof(info); > + > + out: > + close(fd); > + return len; > +} > + > +static ssize_t virtio_pstore_do_write(VirtIOPstore *s, struct iovec *o= ut_sg, > + unsigned int out_num, > + struct virtio_pstore_req *req) > +{ > + char path[PATH_MAX]; > + int fd; > + ssize_t len; > + unsigned short type; > + int flags =3D O_WRONLY | O_CREAT; > + > + /* we already consume the req */ > + iov_discard_front(&out_sg, &out_num, sizeof(*req)); > + > + virtio_pstore_to_filename(s, path, sizeof(path), req); > + > + type =3D le16_to_cpu(req->type); > + > + if (type =3D=3D VIRTIO_PSTORE_TYPE_DMESG) { > + flags |=3D O_TRUNC; > + } else if (type =3D=3D VIRTIO_PSTORE_TYPE_CONSOLE) { > + flags |=3D O_APPEND; > + } > + > + fd =3D open(path, flags, 0644); > + if (fd < 0) { > + error_report("cannot open %s", path); > + return -1; > + } > + len =3D writev(fd, out_sg, out_num); > + close(fd); > + > + return len; All this is blocking VM until host io completes. > +} > + > +static ssize_t virtio_pstore_do_close(VirtIOPstore *s) > +{ > + if (s->dirp =3D=3D NULL) { > + return 0; > + } > + > + closedir(s->dirp); > + s->dirp =3D NULL; > + > + return 0; > +} > + > +static ssize_t virtio_pstore_do_erase(VirtIOPstore *s, > + struct virtio_pstore_req *req) > +{ > + char path[PATH_MAX]; > + > + virtio_pstore_to_filename(s, path, sizeof(path), req); > + > + return unlink(path); > +} > + > +static void virtio_pstore_handle_io(VirtIODevice *vdev, VirtQueue *vq) > +{ > + VirtIOPstore *s =3D VIRTIO_PSTORE(vdev); > + VirtQueueElement *elem; > + struct virtio_pstore_req req; > + struct virtio_pstore_res res; > + ssize_t len =3D 0; > + int ret; > + > + for (;;) { > + elem =3D virtqueue_pop(vq, sizeof(VirtQueueElement)); > + if (!elem) { > + return; > + } > + > + if (elem->out_num < 1 || elem->in_num < 1) { > + error_report("request or response buffer is missing"); > + exit(1); > + } > + > + len =3D iov_to_buf(elem->out_sg, elem->out_num, 0, &req, sizeo= f(req)); > + if (len !=3D (ssize_t)sizeof(req)) { > + error_report("invalid request size: %ld", (long)len); > + exit(1); > + } > + res.cmd =3D req.cmd; > + res.type =3D req.type; > + > + switch (le16_to_cpu(req.cmd)) { > + case VIRTIO_PSTORE_CMD_OPEN: > + ret =3D virtio_pstore_do_open(s); > + break; > + case VIRTIO_PSTORE_CMD_READ: > + ret =3D virtio_pstore_do_read(s, elem->in_sg, elem->in_num= , &res); > + if (ret > 0) { > + len =3D ret; > + ret =3D 0; > + } > + break; > + case VIRTIO_PSTORE_CMD_WRITE: > + ret =3D virtio_pstore_do_write(s, elem->out_sg, elem->out_= num, &req); > + break; > + case VIRTIO_PSTORE_CMD_CLOSE: > + ret =3D virtio_pstore_do_close(s); > + break; > + case VIRTIO_PSTORE_CMD_ERASE: > + ret =3D virtio_pstore_do_erase(s, &req); > + break; > + default: > + ret =3D -1; > + break; > + } > + > + res.ret =3D ret; > + > + iov_from_buf(elem->in_sg, elem->in_num, 0, &res, sizeof(res)); > + virtqueue_push(vq, elem, sizeof(res) + len); this is wrong - len should be # of bytes written into guest memory. > + > + virtio_notify(vdev, vq); > + g_free(elem); > + > + if (ret < 0) { > + return; > + } > + } > +} > + > +static void virtio_pstore_device_realize(DeviceState *dev, Error **err= p) > +{ > + VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); > + VirtIOPstore *s =3D VIRTIO_PSTORE(dev); > + > + virtio_init(vdev, "virtio-pstore", VIRTIO_ID_PSTORE, > + sizeof(struct virtio_pstore_config)); > + > + s->id =3D 1; > + s->console_id =3D 0; > + > + s->vq[0] =3D virtio_add_queue(vdev, 128, virtio_pstore_handle_io); > + s->vq[1] =3D virtio_add_queue(vdev, 128, virtio_pstore_handle_io); > +} > + > +static void virtio_pstore_device_unrealize(DeviceState *dev, Error **e= rrp) > +{ > + VirtIODevice *vdev =3D VIRTIO_DEVICE(dev); > + > + virtio_cleanup(vdev); > +} > + > +static void virtio_pstore_get_config(VirtIODevice *vdev, uint8_t *conf= ig_data) > +{ > + VirtIOPstore *dev =3D VIRTIO_PSTORE(vdev); > + struct virtio_pstore_config config; > + > + config.bufsize =3D cpu_to_le32(dev->bufsize); > + if (dev->console) { > + config.flags |=3D cpu_to_le32(VIRTIO_PSTORE_CONFIG_FL_CONSOLE)= ; > + } > + > + memcpy(config_data, &config, sizeof(struct virtio_pstore_config)); > +} > + > +static void virtio_pstore_set_config(VirtIODevice *vdev, > + const uint8_t *config_data) > +{ > + VirtIOPstore *dev =3D VIRTIO_PSTORE(vdev); > + struct virtio_pstore_config config; > + > + memcpy(&config, config_data, sizeof(struct virtio_pstore_config)); > + > + dev->bufsize =3D le32_to_cpu(config.bufsize); > +} > + > +static uint64_t get_features(VirtIODevice *vdev, uint64_t f, Error **e= rrp) > +{ > + return f; > +} > + > +static void pstore_get_directory(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + > + visit_type_str(v, name, &s->directory, errp); > +} > + > +static void pstore_set_directory(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + Error *local_err =3D NULL; > + char *value; > + > + visit_type_str(v, name, &value, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + g_free(s->directory); > + s->directory =3D value; > +} > + > +static void pstore_release_directory(Object *obj, const char *name, > + void *opaque) > +{ > + VirtIOPstore *s =3D opaque; > + > + g_free(s->directory); > + s->directory =3D NULL; > +} > + > +static void pstore_get_bufsize(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + uint64_t value =3D s->bufsize; > + > + visit_type_size(v, name, &value, errp); > +} > + > +static void pstore_set_bufsize(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + Error *error =3D NULL; > + uint64_t value; > + > + visit_type_size(v, name, &value, &error); > + if (error) { > + error_propagate(errp, error); > + return; > + } > + > + if (value < 4096) { > + error_report("Warning: too small buffer size: %"PRIu64, value)= ; > + } > + > + s->bufsize =3D value; > +} > + > +static void pstore_get_console(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + bool value =3D s->console; > + > + visit_type_bool(v, name, &value, errp); > +} > + > +static void pstore_set_console(Object *obj, Visitor *v, > + const char *name, void *opaque, > + Error **errp) > +{ > + VirtIOPstore *s =3D opaque; > + Error *error =3D NULL; > + bool value; > + > + visit_type_bool(v, name, &value, &error); > + if (error) { > + error_propagate(errp, error); > + return; > + } > + > + s->console =3D value; > +} > + > +static Property virtio_pstore_properties[] =3D { > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void virtio_pstore_instance_init(Object *obj) > +{ > + VirtIOPstore *s =3D VIRTIO_PSTORE(obj); > + > + object_property_add(obj, "directory", "str", > + pstore_get_directory, pstore_set_directory, > + pstore_release_directory, s, NULL); > + object_property_add(obj, "bufsize", "size", > + pstore_get_bufsize, pstore_set_bufsize, NULL, = s, NULL); > + object_property_add(obj, "console", "bool", > + pstore_get_console, pstore_set_console, NULL, = s, NULL); > +} > + > +static void virtio_pstore_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc =3D DEVICE_CLASS(klass); > + VirtioDeviceClass *vdc =3D VIRTIO_DEVICE_CLASS(klass); > + > + dc->props =3D virtio_pstore_properties; > + set_bit(DEVICE_CATEGORY_MISC, dc->categories); > + vdc->realize =3D virtio_pstore_device_realize; > + vdc->unrealize =3D virtio_pstore_device_unrealize; > + vdc->get_config =3D virtio_pstore_get_config; > + vdc->set_config =3D virtio_pstore_set_config; > + vdc->get_features =3D get_features; > +} > + > +static const TypeInfo virtio_pstore_info =3D { > + .name =3D TYPE_VIRTIO_PSTORE, > + .parent =3D TYPE_VIRTIO_DEVICE, > + .instance_size =3D sizeof(VirtIOPstore), > + .instance_init =3D virtio_pstore_instance_init, > + .class_init =3D virtio_pstore_class_init, > +}; > + > +static void virtio_register_types(void) > +{ > + type_register_static(&virtio_pstore_info); > +} > + > +type_init(virtio_register_types) > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index 74d797d..000e1e9 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -79,6 +79,7 @@ > #define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004 > #define PCI_DEVICE_ID_VIRTIO_RNG 0x1005 > #define PCI_DEVICE_ID_VIRTIO_9P 0x1009 > +#define PCI_DEVICE_ID_VIRTIO_PSTORE 0x100a > =20 > #define PCI_VENDOR_ID_REDHAT 0x1b36 > #define PCI_DEVICE_ID_REDHAT_BRIDGE 0x0001 > diff --git a/include/hw/virtio/virtio-pstore.h b/include/hw/virtio/virt= io-pstore.h > new file mode 100644 > index 0000000..d188a48 > --- /dev/null > +++ b/include/hw/virtio/virtio-pstore.h > @@ -0,0 +1,34 @@ > +/* > + * Virtio Pstore Support > + * > + * Authors: > + * Namhyung Kim > + * > + * This work is licensed under the terms of the GNU GPL, version 2. S= ee > + * the COPYING file in the top-level directory. > + * > + */ > + > +#ifndef _QEMU_VIRTIO_PSTORE_H > +#define _QEMU_VIRTIO_PSTORE_H > + > +#include "standard-headers/linux/virtio_pstore.h" > +#include "hw/virtio/virtio.h" > +#include "hw/pci/pci.h" > + > +#define TYPE_VIRTIO_PSTORE "virtio-pstore-device" > +#define VIRTIO_PSTORE(obj) \ > + OBJECT_CHECK(VirtIOPstore, (obj), TYPE_VIRTIO_PSTORE) > + > +typedef struct VirtIOPstore { > + VirtIODevice parent_obj; > + VirtQueue *vq[2]; > + char *directory; > + uint64_t id; > + uint64_t console_id; > + DIR *dirp; > + uint64_t bufsize; > + bool console; > +} VirtIOPstore; > + > +#endif > diff --git a/include/standard-headers/linux/virtio_ids.h b/include/stan= dard-headers/linux/virtio_ids.h > index 77925f5..c72a9ab 100644 > --- a/include/standard-headers/linux/virtio_ids.h > +++ b/include/standard-headers/linux/virtio_ids.h > @@ -41,5 +41,6 @@ > #define VIRTIO_ID_CAIF 12 /* Virtio caif */ > #define VIRTIO_ID_GPU 16 /* virtio GPU */ > #define VIRTIO_ID_INPUT 18 /* virtio input */ > +#define VIRTIO_ID_PSTORE 22 /* virtio pstore */ > =20 > #endif /* _LINUX_VIRTIO_IDS_H */ > diff --git a/include/standard-headers/linux/virtio_pstore.h b/include/s= tandard-headers/linux/virtio_pstore.h > new file mode 100644 > index 0000000..b893d15 > --- /dev/null > +++ b/include/standard-headers/linux/virtio_pstore.h > @@ -0,0 +1,80 @@ > +#ifndef _LINUX_VIRTIO_PSTORE_H > +#define _LINUX_VIRTIO_PSTORE_H > +/* This header is BSD licensed so anyone can use the definitions to im= plement > + * compatible drivers/servers. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyrigh= t > + * notice, this list of conditions and the following disclaimer in = the > + * documentation and/or other materials provided with the distribut= ion. > + * 3. Neither the name of IBM nor the names of its contributors > + * may be used to endorse or promote products derived from this sof= tware > + * without specific prior written permission. > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS= ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, T= HE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR = PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQ= UENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE G= OODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTIO= N) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,= STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN A= NY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY= OF > + * SUCH DAMAGE. */ > +#include "standard-headers/linux/types.h" > +#include "standard-headers/linux/virtio_types.h" > +#include "standard-headers/linux/virtio_ids.h" > +#include "standard-headers/linux/virtio_config.h" > + > +#define VIRTIO_PSTORE_CMD_NULL 0 > +#define VIRTIO_PSTORE_CMD_OPEN 1 > +#define VIRTIO_PSTORE_CMD_READ 2 > +#define VIRTIO_PSTORE_CMD_WRITE 3 > +#define VIRTIO_PSTORE_CMD_ERASE 4 > +#define VIRTIO_PSTORE_CMD_CLOSE 5 > + > +#define VIRTIO_PSTORE_TYPE_UNKNOWN 0 > +#define VIRTIO_PSTORE_TYPE_DMESG 1 > +#define VIRTIO_PSTORE_TYPE_CONSOLE 2 > + > +#define VIRTIO_PSTORE_FL_COMPRESSED 1 > + > +#define VIRTIO_PSTORE_CONFIG_FL_CONSOLE (1 << 0) > + > +struct virtio_pstore_req { > + __virtio16 cmd; > + __virtio16 type; > + __virtio32 flags; > + __virtio64 id; > + __virtio32 count; > + __virtio32 reserved; > +}; > + > +struct virtio_pstore_res { > + __virtio16 cmd; > + __virtio16 type; > + __virtio32 ret; > +}; > + > +struct virtio_pstore_fileinfo { > + __virtio64 id; > + __virtio32 count; > + __virtio16 type; > + __virtio16 unused; > + __virtio32 flags; > + __virtio32 len; > + __virtio64 time_sec; > + __virtio32 time_nsec; > + __virtio32 reserved; > +}; > + > +struct virtio_pstore_config { > + __virtio32 bufsize; > + __virtio32 flags; > +}; > + > +#endif /* _LINUX_VIRTIO_PSTORE_H */ > diff --git a/qdev-monitor.c b/qdev-monitor.c > index e19617f..e1df5a9 100644 > --- a/qdev-monitor.c > +++ b/qdev-monitor.c > @@ -73,6 +73,7 @@ static const QDevAlias qdev_alias_table[] =3D { > { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_ALL & ~QEMU_ARCH= _S390X }, > { "virtio-tablet-ccw", "virtio-tablet", QEMU_ARCH_S390X }, > { "virtio-tablet-pci", "virtio-tablet", QEMU_ARCH_ALL & ~QEMU_ARCH= _S390X }, > + { "virtio-pstore-pci", "virtio-pstore" }, > { } > }; > =20 > --=20 > 2.8.0