From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from [222.73.24.84] (helo=song.cn.fujitsu.com) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1SmMim-0007IW-TN for kexec@lists.infradead.org; Wed, 04 Jul 2012 10:22:18 +0000 Message-ID: <4FF4155F.6070508@cn.fujitsu.com> Date: Wed, 04 Jul 2012 18:05:19 +0800 From: Yanfei Zhang MIME-Version: 1.0 Subject: [PATCH v4 2/3] KVM-INTEL: Add new module vmcsinfo-intel to fill VMCSINFO References: <4FF413D2.4030006@cn.fujitsu.com> In-Reply-To: <4FF413D2.4030006@cn.fujitsu.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: kexec-bounces@lists.infradead.org Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Avi Kivity , mtosatti@redhat.com Cc: dzickus@redhat.com, luto@mit.edu, kvm@vger.kernel.org, Joerg Roedel , kexec@lists.infradead.org, linux-kernel@vger.kernel.org, paul.gortmaker@windriver.com, ludwig.nussel@suse.de, ebiederm@xmission.com, Greg KH VGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgbmV3IG1vZHVsZSBuYW1lZCB2bWNzaW5mby1pbnRlbC4g VGhlCm1vZHVsZSBmaWxscyBWTUNTSU5GTyB3aXRoIHRoZSBWTUNTIHJldmlzaW9uIGlkZW50aWZp ZXIsCmFuZCBvZmZzZXRzIG9mIFZNQ1MgZmllbGRzLgoKTm90ZSwgb2Zmc2V0cyBvZiBmaWVsZHMg dGhhdCBkZWZpbmVkIGluIEludGVsIHNwZWNpZmljYXRpb24KKEludGVswq4gNjQgYW5kIElBLTMy IEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVy4oCZcyBNYW51YWwsClZvbHVtZSAzQykg YnV0IG5vdCBkZWZpbmVkIGluICp2bWNzX2ZpZWxkKiB3aWxsIG5vdCBiZSBmaWxsZWQgaW4KVk1D U0lORk8uIEFuZCwgc29tZSBmaWVsZHMgbWF5IGJlIHVuc3VwcG9ydGVkIGluIHNvbWUgbWFjaGlu ZXMsCmluIHRoZXNlIG1hY2hpbmVzLCBjb3JyZXNwb25kaW5nIG9mZnNldHMgd2lsbCBiZSB6ZXJv LgoKQmVzaWRlcywgdGhpcyBwYXRjaCBhbHNvIGV4cG9ydHMgdm1jcyByZXZpc2lvbiBpZGVudGlm aWVyIHZpYQovc3lzL2RldmljZXMvc3lzdGVtL2NwdS92bWNzX2lkIGFuZCBvZmZzZXRzIG9mIGZp ZWxkcyB2aWEKL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvdm1jcy8uCkluZGl2aWR1YWwgb2Zmc2V0 cyBhcmUgY29udGFpbmVkIGluIHN1YmZpbGVzIG5hbWVkIGJ5IHRoZSBmaWxlZCdzCmVuY29kaW5n LCBlLmcuOiAvc3lzL2RldmljZXMvY3B1L3ZtY3MvMDgwMAoKU2lnbmVkLW9mZi1ieTogemhhbmd5 YW5mZWkgPHpoYW5neWFuZmVpQGNuLmZ1aml0c3UuY29tPgotLS0KIGFyY2gveDg2L2t2bS9LY29u ZmlnICAgIHwgICAxMSArCiBhcmNoL3g4Ni9rdm0vTWFrZWZpbGUgICB8ICAgIDMgKwogYXJjaC94 ODYva3ZtL3ZtY3NpbmZvLmMgfCAgNTg2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDYwMCBpbnNlcnRpb25zKCspLCAwIGRl bGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gveDg2L2t2bS92bWNzaW5mby5jCgpk aWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL0tjb25maWcgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwpp bmRleCBhMjhmMzM4Li4xZGQ2NGIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vS2NvbmZpZwor KysgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwpAQCAtNjMsNiArNjMsMTcgQEAgY29uZmlnIEtWTV9J TlRFTAogCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUg bW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBrdm0taW50ZWwuCiAKK2NvbmZpZyBWTUNTSU5GT19J TlRFTAorCXRyaXN0YXRlICJFeHBvcnQgVk1DU0lORk8gZm9yIEludGVsIHByb2Nlc3NvcnMiCisJ ZGVwZW5kcyBvbiBLVk1fSU5URUwKKwktLS1oZWxwLS0tCisJICBQcm92aWRlcyBzdXBwb3J0IGZv ciBleHBvcnRpbmcgVk1DU0lORk8gb24gSW50ZWwgcHJvY2Vzc29ycyBlcXVpcHBlZAorCSAgd2l0 aCB0aGUgVlQgZXh0ZW5zaW9ucy4gVGhlIFZNQ1NJTkZPIGNvbnRhaW5zIGEgVk1DUyByZXZpc2lv bgorCSAgaWRlbnRpZmllciBhbmQgb2Zmc2V0cyBvZiBWTUNTIGZpZWxkcy4KKworCSAgVG8gY29t cGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxs IGJlIGNhbGxlZCB2bWNzaW5mby1pbnRlbC4KKwogY29uZmlnIEtWTV9BTUQKIAl0cmlzdGF0ZSAi S1ZNIGZvciBBTUQgcHJvY2Vzc29ycyBzdXBwb3J0IgogCWRlcGVuZHMgb24gS1ZNCmRpZmYgLS1n aXQgYS9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKaW5kZXgg NGY1NzllOC4uMTJhMWVmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL01ha2VmaWxlCisrKyBi L2FyY2gveDg2L2t2bS9NYWtlZmlsZQpAQCAtNCw2ICs0LDcgQEAgY2NmbGFncy15ICs9IC1Jdmly dC9rdm0gLUlhcmNoL3g4Ni9rdm0KIENGTEFHU194ODYubyA6PSAtSS4KIENGTEFHU19zdm0ubyA6 PSAtSS4KIENGTEFHU192bXgubyA6PSAtSS4KK0NGTEFHU192bWNzaW5mby5vIDo9IC1JLgogCiBr dm0teQkJCSs9ICQoYWRkcHJlZml4IC4uLy4uLy4uL3ZpcnQva3ZtLywga3ZtX21haW4ubyBpb2Fw aWMubyBcCiAJCQkJY29hbGVzY2VkX21taW8ubyBpcnFfY29tbS5vIGV2ZW50ZmQubyBcCkBAIC0x NSw3ICsxNiw5IEBAIGt2bS15CQkJKz0geDg2Lm8gbW11Lm8gZW11bGF0ZS5vIGk4MjU5Lm8gaXJx Lm8gbGFwaWMubyBcCiAJCQkgICBpODI1NC5vIHRpbWVyLm8gY3B1aWQubyBwbXUubwoga3ZtLWlu dGVsLXkJCSs9IHZteC5vCiBrdm0tYW1kLXkJCSs9IHN2bS5vCit2bWNzaW5mby1pbnRlbC15CSs9 IHZtY3NpbmZvLm8KIAogb2JqLSQoQ09ORklHX0tWTSkJKz0ga3ZtLm8KIG9iai0kKENPTkZJR19L Vk1fSU5URUwpCSs9IGt2bS1pbnRlbC5vCiBvYmotJChDT05GSUdfS1ZNX0FNRCkJKz0ga3ZtLWFt ZC5vCitvYmotJChDT05GSUdfVk1DU0lORk9fSU5URUwpCSs9IHZtY3NpbmZvLWludGVsLm8KZGlm ZiAtLWdpdCBhL2FyY2gveDg2L2t2bS92bWNzaW5mby5jIGIvYXJjaC94ODYva3ZtL3ZtY3NpbmZv LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNmExZQotLS0gL2Rldi9u dWxsCisrKyBiL2FyY2gveDg2L2t2bS92bWNzaW5mby5jCkBAIC0wLDAgKzEsNTg2IEBACisvKgor ICogS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICog VGhpcyBtb2R1bGUgZW5hYmxlcyBtYWNoaW5lcyB3aXRoIEludGVsIFZULXggZXh0ZW5zaW9ucyB0 byBleHBvcnQKKyAqIG9mZnNldHMgb2YgVk1DUyBmaWVsZHMgZm9yIGd1ZXN0IGRlYnVnZ2luZy4K KyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRnVqaXRzdSwgSW5jLgorICoKKyAqIEF1dGhvcnM6 CisgKiAgIFpoYW5nIFlhbmZlaSA8emhhbmd5YW5mZWlAY24uZnVqaXRzdS5jb20+CisgKgorICog VGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVy c2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0 b3J5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu dXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVk ZSA8bGludXgvc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNt L3ZteC5oPgorCitNT0RVTEVfQVVUSE9SKCJGdWppdHN1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BM Iik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCB2bWNzaW5mb19jcHVfaWRbXSA9 IHsKKwlYODZfRkVBVFVSRV9NQVRDSChYODZfRkVBVFVSRV9WTVgpLAorCXt9Cit9OworTU9EVUxF X0RFVklDRV9UQUJMRSh4ODZjcHUsIHZtY3NpbmZvX2NwdV9pZCk7CisKKy8qCisgKiB2bWNzIGZp ZWxkIG9mZnNldHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1jc2luZm8geworCXUzMiB2bWNzX3Jl dmlzaW9uX2lkOworCXUxNiB2bWNzX2ZpZWxkX3RvX29mZnNldF90YWJsZVtIT1NUX1JJUCArIDFd OworfSB2bWNzaW5mbzsKKworI2RlZmluZSBWTUNTSU5GT19NQVhfRklFTEQgXAorCUFSUkFZX1NJ WkUodm1jc2luZm8udm1jc19maWVsZF90b19vZmZzZXRfdGFibGUpCisKK3N0YXRpYyBpbmxpbmUg dm9pZCB2bWNzaW5mb19yZXZpc2lvbl9pZCh1MzIgaWQpCit7CisJdm1jc2luZm8udm1jc19yZXZp c2lvbl9pZCA9IGlkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm1jc2luZm9fZmllbGQodW5z aWduZWQgbG9uZyBmaWVsZCwgdTE2IG9mZnNldCkKK3sKKwlpZiAoZmllbGQgPCBWTUNTSU5GT19N QVhfRklFTEQpCisJCXZtY3NpbmZvLnZtY3NfZmllbGRfdG9fb2Zmc2V0X3RhYmxlW2ZpZWxkXSA9 IG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBzaG9ydCBnZXRfdm1jc19maWVsZF9vZmZzZXQo dW5zaWduZWQgbG9uZyBmaWVsZCkKK3sKKwlpZiAoZmllbGQgPj0gVk1DU0lORk9fTUFYX0ZJRUxE IHx8CisJICAgIHZtY3NpbmZvLnZtY3NfZmllbGRfdG9fb2Zmc2V0X3RhYmxlW2ZpZWxkXSA9PSAw KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZtY3NpbmZvLnZtY3NfZmllbGRfdG9fb2Zmc2V0X3Rh YmxlW2ZpZWxkXTsKK30KKworY29uc3QgY2hhciB2bWNzX2dyb3VwX25hbWVbXSA9ICJ2bWNzIjsK KworI2RlZmluZSBCVUlMRF9PRkZTRVRfU0hPVyhmaWVsZF9jb2RlKSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3QgXyMjZmllbGRfY29kZSMj X3Nob3coc3RydWN0IGRldmljZSAqZGV2LCAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAg ICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgICAgICAgICAgICBcCisJCQkJICAgIGNo YXIgKmJ1ZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgICAgdm1jc2luZm8udm1jc19maWVsZF90 b19vZmZzZXRfdGFibGVbMHgjI2ZpZWxkX2NvZGVdKTsgIFwKK30gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZF9jb2RlLCAwNDQ0LCBfIyNmaWVsZF9jb2RlIyNf c2hvdywgTlVMTCk7ICAgICAgICAgICAgIFwKKworQlVJTERfT0ZGU0VUX1NIT1coMDAwMCk7IC8q IFZJUlRVQUxfUFJPQ0VTU09SX0lEICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygw ODAwKTsgLyogR1VFU1RfRVNfU0VMRUNUT1IgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNF VF9TSE9XKDA4MDIpOyAvKiBHVUVTVF9DU19TRUxFQ1RPUiAgICAgICAgICAgICAgICAqLworQlVJ TERfT0ZGU0VUX1NIT1coMDgwNCk7IC8qIEdVRVNUX1NTX1NFTEVDVE9SICAgICAgICAgICAgICAg ICovCitCVUlMRF9PRkZTRVRfU0hPVygwODA2KTsgLyogR1VFU1RfRFNfU0VMRUNUT1IgICAgICAg ICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDA4MDgpOyAvKiBHVUVTVF9GU19TRUxFQ1RP UiAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMDgwYSk7IC8qIEdVRVNUX0dT X1NFTEVDVE9SICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygwODBjKTsgLyog R1VFU1RfTERUUl9TRUxFQ1RPUiAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDA4 MGUpOyAvKiBHVUVTVF9UUl9TRUxFQ1RPUiAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coMGMwMCk7IC8qIEhPU1RfRVNfU0VMRUNUT1IgICAgICAgICAgICAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVygwYzAyKTsgLyogSE9TVF9DU19TRUxFQ1RPUiAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKDBjMDQpOyAvKiBIT1NUX1NTX1NFTEVDVE9SICAgICAgICAg ICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMGMwNik7IC8qIEhPU1RfRFNfU0VMRUNUT1Ig ICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygwYzA4KTsgLyogSE9TVF9GU19T RUxFQ1RPUiAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDBjMGEpOyAvKiBI T1NUX0dTX1NFTEVDVE9SICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMGMw Yyk7IC8qIEhPU1RfVFJfU0VMRUNUT1IgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVygyMDAwKTsgLyogSU9fQklUTUFQX0EgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKDIwMDEpOyAvKiBJT19CSVRNQVBfQV9ISUdIICAgICAgICAgICAgICAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coMjAwMik7IC8qIElPX0JJVE1BUF9CICAgICAgICAgICAgICAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyMDAzKTsgLyogSU9fQklUTUFQX0JfSElHSCAg ICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDIwMDQpOyAvKiBNU1JfQklUTUFQ ICAgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjAwNSk7IC8qIE1T Ul9CSVRNQVBfSElHSCAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyMDA2 KTsgLyogVk1fRVhJVF9NU1JfU1RPUkVfQUREUiAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKDIwMDcpOyAvKiBWTV9FWElUX01TUl9TVE9SRV9BRERSX0hJR0ggICAgICAqLworQlVJTERf T0ZGU0VUX1NIT1coMjAwOCk7IC8qIFZNX0VYSVRfTVNSX0xPQURfQUREUiAgICAgICAgICAgICov CitCVUlMRF9PRkZTRVRfU0hPVygyMDA5KTsgLyogVk1fRVhJVF9NU1JfTE9BRF9BRERSX0hJR0gg ICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDIwMGEpOyAvKiBWTV9FTlRSWV9NU1JfTE9BRF9B RERSICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjAwYik7IC8qIFZNX0VOVFJZX01T Ul9MT0FEX0FERFJfSElHSCAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyMDEwKTsgLyogVFND X09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDIwMTEp OyAvKiBUU0NfT0ZGU0VUX0hJR0ggICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coMjAxMik7IC8qIFZJUlRVQUxfQVBJQ19QQUdFX0FERFIgICAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVygyMDEzKTsgLyogVklSVFVBTF9BUElDX1BBR0VfQUREUl9ISUdIICAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKDIwMTQpOyAvKiBBUElDX0FDQ0VTU19BRERSICAgICAgICAgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjAxNSk7IC8qIEFQSUNfQUNDRVNTX0FERFJfSElH SCAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyMDFhKTsgLyogRVBUX1BPSU5URVIg ICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDIwMWIpOyAvKiBFUFRf UE9JTlRFUl9ISUdIICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjQwMCk7 IC8qIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hP VygyNDAxKTsgLyogR1VFU1RfUEhZU0lDQUxfQUREUkVTU19ISUdIICAgICAgKi8KK0JVSUxEX09G RlNFVF9TSE9XKDI4MDApOyAvKiBWTUNTX0xJTktfUE9JTlRFUiAgICAgICAgICAgICAgICAqLwor QlVJTERfT0ZGU0VUX1NIT1coMjgwMSk7IC8qIFZNQ1NfTElOS19QT0lOVEVSX0hJR0ggICAgICAg ICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyODAyKTsgLyogR1VFU1RfSUEzMl9ERUJVR0NUTCAg ICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDI4MDMpOyAvKiBHVUVTVF9JQTMyX0RF QlVHQ1RMX0hJR0ggICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjgwNCk7IC8qIEdVRVNU X0lBMzJfUEFUICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyODA1KTsg LyogR1VFU1RfSUEzMl9QQVRfSElHSCAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9X KDI4MDYpOyAvKiBHVUVTVF9JQTMyX0VGRVIgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZG U0VUX1NIT1coMjgwNyk7IC8qIEdVRVNUX0lBMzJfRUZFUl9ISUdIICAgICAgICAgICAgICovCitC VUlMRF9PRkZTRVRfU0hPVygyODA4KTsgLyogR1VFU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMICAg ICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDI4MDkpOyAvKiBHVUVTVF9JQTMyX1BFUkZfR0xPQkFM X0NUUkxfSElHSCAqLworQlVJTERfT0ZGU0VUX1NIT1coMjgwYSk7IC8qIEdVRVNUX1BEUFRSMCAg ICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyODBiKTsgLyogR1VFU1Rf UERQVFIwX0hJR0ggICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDI4MGMpOyAv KiBHVUVTVF9QRFBUUjEgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1co MjgwZCk7IC8qIEdVRVNUX1BEUFRSMV9ISUdIICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZT RVRfU0hPVygyODBlKTsgLyogR1VFU1RfUERQVFIyICAgICAgICAgICAgICAgICAgICAgKi8KK0JV SUxEX09GRlNFVF9TSE9XKDI4MGYpOyAvKiBHVUVTVF9QRFBUUjJfSElHSCAgICAgICAgICAgICAg ICAqLworQlVJTERfT0ZGU0VUX1NIT1coMjgxMCk7IC8qIEdVRVNUX1BEUFRSMyAgICAgICAgICAg ICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygyODExKTsgLyogR1VFU1RfUERQVFIzX0hJ R0ggICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDJjMDApOyAvKiBIT1NUX0lB MzJfUEFUICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMmMwMSk7IC8q IEhPU1RfSUEzMl9QQVRfSElHSCAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygy YzAyKTsgLyogSE9TVF9JQTMyX0VGRVIgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNF VF9TSE9XKDJjMDMpOyAvKiBIT1NUX0lBMzJfRUZFUl9ISUdIICAgICAgICAgICAgICAqLworQlVJ TERfT0ZGU0VUX1NIT1coMmMwNCk7IC8qIEhPU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMICAgICAg ICovCitCVUlMRF9PRkZTRVRfU0hPVygyYzA1KTsgLyogSE9TVF9JQTMyX1BFUkZfR0xPQkFMX0NU UkxfSElHSCAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQwMDApOyAvKiBQSU5fQkFTRURfVk1fRVhF Q19DT05UUk9MICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDAwMik7IC8qIENQVV9CQVNF RF9WTV9FWEVDX0NPTlRST0wgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0MDA0KTsgLyog RVhDRVBUSU9OX0JJVE1BUCAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQw MDYpOyAvKiBQQUdFX0ZBVUxUX0VSUk9SX0NPREVfTUFTSyAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coNDAwOCk7IC8qIFBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVRDSCAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVyg0MDBhKTsgLyogQ1IzX1RBUkdFVF9DT1VOVCAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKDQwMGMpOyAvKiBWTV9FWElUX0NPTlRST0xTICAgICAgICAg ICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDAwZSk7IC8qIFZNX0VYSVRfTVNSX1NUT1JF X0NPVU5UICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0MDEwKTsgLyogVk1fRVhJVF9N U1JfTE9BRF9DT1VOVCAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQwMTIpOyAvKiBW TV9FTlRSWV9DT05UUk9MUyAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDAx NCk7IC8qIFZNX0VOVFJZX01TUl9MT0FEX0NPVU5UICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVyg0MDE2KTsgLyogVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxEICAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKDQwMTgpOyAvKiBWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coNDAxYSk7IC8qIFZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0MDFjKTsgLyogVFBSX1RIUkVTSE9MRCAgICAg ICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQwMWUpOyAvKiBTRUNPTkRBUllf Vk1fRVhFQ19DT05UUk9MICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDAyMCk7IC8qIFBM RV9HQVAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0MDIy KTsgLyogUExFX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKDQ0MDApOyAvKiBWTV9JTlNUUlVDVElPTl9FUlJPUiAgICAgICAgICAgICAqLworQlVJTERf T0ZGU0VUX1NIT1coNDQwMik7IC8qIFZNX0VYSVRfUkVBU09OICAgICAgICAgICAgICAgICAgICov CitCVUlMRF9PRkZTRVRfU0hPVyg0NDA0KTsgLyogVk1fRVhJVF9JTlRSX0lORk8gICAgICAgICAg ICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ0MDYpOyAvKiBWTV9FWElUX0lOVFJfRVJST1Jf Q09ERSAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDQwOCk7IC8qIElEVF9WRUNUT1JJ TkdfSU5GT19GSUVMRCAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0NDBhKTsgLyogSURU X1ZFQ1RPUklOR19FUlJPUl9DT0RFICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ0MGMp OyAvKiBWTV9FWElUX0lOU1RSVUNUSU9OX0xFTiAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coNDQwZSk7IC8qIFZNWF9JTlNUUlVDVElPTl9JTkZPICAgICAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVyg0ODAwKTsgLyogR1VFU1RfRVNfTElNSVQgICAgICAgICAgICAgICAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKDQ4MDIpOyAvKiBHVUVTVF9DU19MSU1JVCAgICAgICAgICAgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDgwNCk7IC8qIEdVRVNUX1NTX0xJTUlUICAgICAg ICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0ODA2KTsgLyogR1VFU1RfRFNfTElN SVQgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ4MDgpOyAvKiBHVUVT VF9GU19MSU1JVCAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDgwYSk7 IC8qIEdVRVNUX0dTX0xJTUlUICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hP Vyg0ODBjKTsgLyogR1VFU1RfTERUUl9MSU1JVCAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09G RlNFVF9TSE9XKDQ4MGUpOyAvKiBHVUVTVF9UUl9MSU1JVCAgICAgICAgICAgICAgICAgICAqLwor QlVJTERfT0ZGU0VUX1NIT1coNDgxMCk7IC8qIEdVRVNUX0dEVFJfTElNSVQgICAgICAgICAgICAg ICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0ODEyKTsgLyogR1VFU1RfSURUUl9MSU1JVCAgICAg ICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ4MTQpOyAvKiBHVUVTVF9FU19BUl9C WVRFUyAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDgxNik7IC8qIEdVRVNU X0NTX0FSX0JZVEVTICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0ODE4KTsg LyogR1VFU1RfU1NfQVJfQllURVMgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9X KDQ4MWEpOyAvKiBHVUVTVF9EU19BUl9CWVRFUyAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZG U0VUX1NIT1coNDgxYyk7IC8qIEdVRVNUX0ZTX0FSX0JZVEVTICAgICAgICAgICAgICAgICovCitC VUlMRF9PRkZTRVRfU0hPVyg0ODFlKTsgLyogR1VFU1RfR1NfQVJfQllURVMgICAgICAgICAgICAg ICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ4MjApOyAvKiBHVUVTVF9MRFRSX0FSX0JZVEVTICAg ICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNDgyMik7IC8qIEdVRVNUX1RSX0FSX0JZ VEVTICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg0ODI0KTsgLyogR1VFU1Rf SU5URVJSVVBUSUJJTElUWV9JTkZPICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDQ4MjYpOyAv KiBHVUVTVF9BQ1RJVklUWV9TVEFURSAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1co NDgyQSk7IC8qIEdVRVNUX1NZU0VOVEVSX0NTICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZT RVRfU0hPVyg0YzAwKTsgLyogSE9TVF9JQTMyX1NZU0VOVEVSX0NTICAgICAgICAgICAgKi8KK0JV SUxEX09GRlNFVF9TSE9XKDYwMDApOyAvKiBDUjBfR1VFU1RfSE9TVF9NQVNLICAgICAgICAgICAg ICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjAwMik7IC8qIENSNF9HVUVTVF9IT1NUX01BU0sgICAg ICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2MDA0KTsgLyogQ1IwX1JFQURfU0hBRE9X ICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDYwMDYpOyAvKiBDUjRfUkVB RF9TSEFET1cgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjAwOCk7IC8q IENSM19UQVJHRVRfVkFMVUUwICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2 MDBhKTsgLyogQ1IzX1RBUkdFVF9WQUxVRTEgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNF VF9TSE9XKDYwMGMpOyAvKiBDUjNfVEFSR0VUX1ZBTFVFMiAgICAgICAgICAgICAgICAqLworQlVJ TERfT0ZGU0VUX1NIT1coNjAwZSk7IC8qIENSM19UQVJHRVRfVkFMVUUzICAgICAgICAgICAgICAg ICovCitCVUlMRF9PRkZTRVRfU0hPVyg2NDAwKTsgLyogRVhJVF9RVUFMSUZJQ0FUSU9OICAgICAg ICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDY0MGEpOyAvKiBHVUVTVF9MSU5FQVJfQURE UkVTUyAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjgwMCk7IC8qIEdVRVNUX0NS MCAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2ODAyKTsgLyog R1VFU1RfQ1IzICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDY4 MDQpOyAvKiBHVUVTVF9DUjQgICAgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coNjgwNik7IC8qIEdVRVNUX0VTX0JBU0UgICAgICAgICAgICAgICAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVyg2ODA4KTsgLyogR1VFU1RfQ1NfQkFTRSAgICAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKDY4MGEpOyAvKiBHVUVTVF9TU19CQVNFICAgICAgICAgICAg ICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjgwYyk7IC8qIEdVRVNUX0RTX0JBU0UgICAg ICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2ODBlKTsgLyogR1VFU1RfRlNf QkFTRSAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDY4MTApOyAvKiBH VUVTVF9HU19CQVNFICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjgx Mik7IC8qIEdVRVNUX0xEVFJfQkFTRSAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVyg2ODE0KTsgLyogR1VFU1RfVFJfQkFTRSAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKDY4MTYpOyAvKiBHVUVTVF9HRFRSX0JBU0UgICAgICAgICAgICAgICAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coNjgxOCk7IC8qIEdVRVNUX0lEVFJfQkFTRSAgICAgICAgICAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2ODFhKTsgLyogR1VFU1RfRFI3ICAgICAgICAg ICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDY4MWMpOyAvKiBHVUVTVF9SU1Ag ICAgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNjgxZSk7IC8qIEdV RVNUX1JJUCAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2ODIw KTsgLyogR1VFU1RfUkZMQUdTICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKDY4MjIpOyAvKiBHVUVTVF9QRU5ESU5HX0RCR19FWENFUFRJT05TICAgICAqLworQlVJTERf T0ZGU0VUX1NIT1coNjgyNCk7IC8qIEdVRVNUX1NZU0VOVEVSX0VTUCAgICAgICAgICAgICAgICov CitCVUlMRF9PRkZTRVRfU0hPVyg2ODI2KTsgLyogR1VFU1RfU1lTRU5URVJfRUlQICAgICAgICAg ICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDZjMDApOyAvKiBIT1NUX0NSMCAgICAgICAgICAg ICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNmMwMik7IC8qIEhPU1RfQ1IzICAg ICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2YzA0KTsgLyogSE9T VF9DUjQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDZjMDYp OyAvKiBIT1NUX0ZTX0JBU0UgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coNmMwOCk7IC8qIEhPU1RfR1NfQkFTRSAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVyg2YzBhKTsgLyogSE9TVF9UUl9CQVNFICAgICAgICAgICAgICAgICAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKDZjMGMpOyAvKiBIT1NUX0dEVFJfQkFTRSAgICAgICAgICAgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNmMwZSk7IC8qIEhPU1RfSURUUl9CQVNFICAgICAg ICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyg2YzEwKTsgLyogSE9TVF9JQTMyX1NZ U0VOVEVSX0VTUCAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDZjMTIpOyAvKiBIT1NU X0lBMzJfU1lTRU5URVJfRUlQICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coNmMxNCk7 IC8qIEhPU1RfUlNQICAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hP Vyg2YzE2KTsgLyogSE9TVF9SSVAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworc3RhdGlj IHN0cnVjdCBhdHRyaWJ1dGUgKnZtY3NfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfMDAwMC5hdHRy LAorCSZkZXZfYXR0cl8wODAwLmF0dHIsCisJJmRldl9hdHRyXzA4MDIuYXR0ciwKKwkmZGV2X2F0 dHJfMDgwNC5hdHRyLAorCSZkZXZfYXR0cl8wODA2LmF0dHIsCisJJmRldl9hdHRyXzA4MDguYXR0 ciwKKwkmZGV2X2F0dHJfMDgwYS5hdHRyLAorCSZkZXZfYXR0cl8wODBjLmF0dHIsCisJJmRldl9h dHRyXzA4MGUuYXR0ciwKKwkmZGV2X2F0dHJfMGMwMC5hdHRyLAorCSZkZXZfYXR0cl8wYzAyLmF0 dHIsCisJJmRldl9hdHRyXzBjMDQuYXR0ciwKKwkmZGV2X2F0dHJfMGMwNi5hdHRyLAorCSZkZXZf YXR0cl8wYzA4LmF0dHIsCisJJmRldl9hdHRyXzBjMGEuYXR0ciwKKwkmZGV2X2F0dHJfMGMwYy5h dHRyLAorCSZkZXZfYXR0cl8yMDAwLmF0dHIsCisJJmRldl9hdHRyXzIwMDEuYXR0ciwKKwkmZGV2 X2F0dHJfMjAwMi5hdHRyLAorCSZkZXZfYXR0cl8yMDAzLmF0dHIsCisJJmRldl9hdHRyXzIwMDQu YXR0ciwKKwkmZGV2X2F0dHJfMjAwNS5hdHRyLAorCSZkZXZfYXR0cl8yMDA2LmF0dHIsCisJJmRl dl9hdHRyXzIwMDcuYXR0ciwKKwkmZGV2X2F0dHJfMjAwOC5hdHRyLAorCSZkZXZfYXR0cl8yMDA5 LmF0dHIsCisJJmRldl9hdHRyXzIwMGEuYXR0ciwKKwkmZGV2X2F0dHJfMjAwYi5hdHRyLAorCSZk ZXZfYXR0cl8yMDEwLmF0dHIsCisJJmRldl9hdHRyXzIwMTEuYXR0ciwKKwkmZGV2X2F0dHJfMjAx Mi5hdHRyLAorCSZkZXZfYXR0cl8yMDEzLmF0dHIsCisJJmRldl9hdHRyXzIwMTQuYXR0ciwKKwkm ZGV2X2F0dHJfMjAxNS5hdHRyLAorCSZkZXZfYXR0cl8yMDFhLmF0dHIsCisJJmRldl9hdHRyXzIw MWIuYXR0ciwKKwkmZGV2X2F0dHJfMjQwMC5hdHRyLAorCSZkZXZfYXR0cl8yNDAxLmF0dHIsCisJ JmRldl9hdHRyXzI4MDAuYXR0ciwKKwkmZGV2X2F0dHJfMjgwMS5hdHRyLAorCSZkZXZfYXR0cl8y ODAyLmF0dHIsCisJJmRldl9hdHRyXzI4MDMuYXR0ciwKKwkmZGV2X2F0dHJfMjgwNC5hdHRyLAor CSZkZXZfYXR0cl8yODA1LmF0dHIsCisJJmRldl9hdHRyXzI4MDYuYXR0ciwKKwkmZGV2X2F0dHJf MjgwNy5hdHRyLAorCSZkZXZfYXR0cl8yODA4LmF0dHIsCisJJmRldl9hdHRyXzI4MDkuYXR0ciwK KwkmZGV2X2F0dHJfMjgwYS5hdHRyLAorCSZkZXZfYXR0cl8yODBiLmF0dHIsCisJJmRldl9hdHRy XzI4MGMuYXR0ciwKKwkmZGV2X2F0dHJfMjgwZC5hdHRyLAorCSZkZXZfYXR0cl8yODBlLmF0dHIs CisJJmRldl9hdHRyXzI4MGYuYXR0ciwKKwkmZGV2X2F0dHJfMjgxMC5hdHRyLAorCSZkZXZfYXR0 cl8yODExLmF0dHIsCisJJmRldl9hdHRyXzJjMDAuYXR0ciwKKwkmZGV2X2F0dHJfMmMwMS5hdHRy LAorCSZkZXZfYXR0cl8yYzAyLmF0dHIsCisJJmRldl9hdHRyXzJjMDMuYXR0ciwKKwkmZGV2X2F0 dHJfMmMwNC5hdHRyLAorCSZkZXZfYXR0cl8yYzA1LmF0dHIsCisJJmRldl9hdHRyXzQwMDAuYXR0 ciwKKwkmZGV2X2F0dHJfNDAwMi5hdHRyLAorCSZkZXZfYXR0cl80MDA0LmF0dHIsCisJJmRldl9h dHRyXzQwMDYuYXR0ciwKKwkmZGV2X2F0dHJfNDAwOC5hdHRyLAorCSZkZXZfYXR0cl80MDBhLmF0 dHIsCisJJmRldl9hdHRyXzQwMGMuYXR0ciwKKwkmZGV2X2F0dHJfNDAwZS5hdHRyLAorCSZkZXZf YXR0cl80MDEwLmF0dHIsCisJJmRldl9hdHRyXzQwMTIuYXR0ciwKKwkmZGV2X2F0dHJfNDAxNC5h dHRyLAorCSZkZXZfYXR0cl80MDE2LmF0dHIsCisJJmRldl9hdHRyXzQwMTguYXR0ciwKKwkmZGV2 X2F0dHJfNDAxYS5hdHRyLAorCSZkZXZfYXR0cl80MDFjLmF0dHIsCisJJmRldl9hdHRyXzQwMWUu YXR0ciwKKwkmZGV2X2F0dHJfNDAyMC5hdHRyLAorCSZkZXZfYXR0cl80MDIyLmF0dHIsCisJJmRl dl9hdHRyXzQ0MDAuYXR0ciwKKwkmZGV2X2F0dHJfNDQwMi5hdHRyLAorCSZkZXZfYXR0cl80NDA0 LmF0dHIsCisJJmRldl9hdHRyXzQ0MDYuYXR0ciwKKwkmZGV2X2F0dHJfNDQwOC5hdHRyLAorCSZk ZXZfYXR0cl80NDBhLmF0dHIsCisJJmRldl9hdHRyXzQ0MGMuYXR0ciwKKwkmZGV2X2F0dHJfNDQw ZS5hdHRyLAorCSZkZXZfYXR0cl80ODAwLmF0dHIsCisJJmRldl9hdHRyXzQ4MDIuYXR0ciwKKwkm ZGV2X2F0dHJfNDgwNC5hdHRyLAorCSZkZXZfYXR0cl80ODA2LmF0dHIsCisJJmRldl9hdHRyXzQ4 MDguYXR0ciwKKwkmZGV2X2F0dHJfNDgwYS5hdHRyLAorCSZkZXZfYXR0cl80ODBjLmF0dHIsCisJ JmRldl9hdHRyXzQ4MGUuYXR0ciwKKwkmZGV2X2F0dHJfNDgxMC5hdHRyLAorCSZkZXZfYXR0cl80 ODEyLmF0dHIsCisJJmRldl9hdHRyXzQ4MTQuYXR0ciwKKwkmZGV2X2F0dHJfNDgxNi5hdHRyLAor CSZkZXZfYXR0cl80ODE4LmF0dHIsCisJJmRldl9hdHRyXzQ4MWEuYXR0ciwKKwkmZGV2X2F0dHJf NDgxYy5hdHRyLAorCSZkZXZfYXR0cl80ODFlLmF0dHIsCisJJmRldl9hdHRyXzQ4MjAuYXR0ciwK KwkmZGV2X2F0dHJfNDgyMi5hdHRyLAorCSZkZXZfYXR0cl80ODI0LmF0dHIsCisJJmRldl9hdHRy XzQ4MjYuYXR0ciwKKwkmZGV2X2F0dHJfNDgyQS5hdHRyLAorCSZkZXZfYXR0cl80YzAwLmF0dHIs CisJJmRldl9hdHRyXzYwMDAuYXR0ciwKKwkmZGV2X2F0dHJfNjAwMi5hdHRyLAorCSZkZXZfYXR0 cl82MDA0LmF0dHIsCisJJmRldl9hdHRyXzYwMDYuYXR0ciwKKwkmZGV2X2F0dHJfNjAwOC5hdHRy LAorCSZkZXZfYXR0cl82MDBhLmF0dHIsCisJJmRldl9hdHRyXzYwMGMuYXR0ciwKKwkmZGV2X2F0 dHJfNjAwZS5hdHRyLAorCSZkZXZfYXR0cl82NDAwLmF0dHIsCisJJmRldl9hdHRyXzY0MGEuYXR0 ciwKKwkmZGV2X2F0dHJfNjgwMC5hdHRyLAorCSZkZXZfYXR0cl82ODAyLmF0dHIsCisJJmRldl9h dHRyXzY4MDQuYXR0ciwKKwkmZGV2X2F0dHJfNjgwNi5hdHRyLAorCSZkZXZfYXR0cl82ODA4LmF0 dHIsCisJJmRldl9hdHRyXzY4MGEuYXR0ciwKKwkmZGV2X2F0dHJfNjgwYy5hdHRyLAorCSZkZXZf YXR0cl82ODBlLmF0dHIsCisJJmRldl9hdHRyXzY4MTAuYXR0ciwKKwkmZGV2X2F0dHJfNjgxMi5h dHRyLAorCSZkZXZfYXR0cl82ODE0LmF0dHIsCisJJmRldl9hdHRyXzY4MTYuYXR0ciwKKwkmZGV2 X2F0dHJfNjgxOC5hdHRyLAorCSZkZXZfYXR0cl82ODFhLmF0dHIsCisJJmRldl9hdHRyXzY4MWMu YXR0ciwKKwkmZGV2X2F0dHJfNjgxZS5hdHRyLAorCSZkZXZfYXR0cl82ODIwLmF0dHIsCisJJmRl dl9hdHRyXzY4MjIuYXR0ciwKKwkmZGV2X2F0dHJfNjgyNC5hdHRyLAorCSZkZXZfYXR0cl82ODI2 LmF0dHIsCisJJmRldl9hdHRyXzZjMDAuYXR0ciwKKwkmZGV2X2F0dHJfNmMwMi5hdHRyLAorCSZk ZXZfYXR0cl82YzA0LmF0dHIsCisJJmRldl9hdHRyXzZjMDYuYXR0ciwKKwkmZGV2X2F0dHJfNmMw OC5hdHRyLAorCSZkZXZfYXR0cl82YzBhLmF0dHIsCisJJmRldl9hdHRyXzZjMGMuYXR0ciwKKwkm ZGV2X2F0dHJfNmMwZS5hdHRyLAorCSZkZXZfYXR0cl82YzEwLmF0dHIsCisJJmRldl9hdHRyXzZj MTIuYXR0ciwKKwkmZGV2X2F0dHJfNmMxNC5hdHRyLAorCSZkZXZfYXR0cl82YzE2LmF0dHIsCisJ TlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZtY3NfYXR0cl9ncm91 cCA9IHsKKwkubmFtZSA9IHZtY3NfZ3JvdXBfbmFtZSwKKwkuYXR0cnMgPSB2bWNzX2F0dHJzLAor fTsKKworaW50IHZtY3Nfc3lzZnNfYWRkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4g c3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZ2bWNzX2F0dHJfZ3JvdXApOworfQorCit2 b2lkIHZtY3Nfc3lzZnNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzeXNmc19yZW1v dmVfZ3JvdXAoJmRldi0+a29iaiwgJnZtY3NfYXR0cl9ncm91cCk7Cit9CisKK3N0YXRpYyBzc2l6 ZV90IHZtY3NfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmlj ZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRm KGJ1ZiwgIiVkXG4iLCB2bWNzaW5mby52bWNzX3JldmlzaW9uX2lkKTsKK30KKworc3RhdGljIERF VklDRV9BVFRSKHZtY3NfaWQsIDA0NDQsIHZtY3NfaWRfc2hvdywgTlVMTCk7CisKK2ludCB2bWNz X2lkX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldmljZV9jcmVh dGVfZmlsZShkZXYsICZkZXZfYXR0cl92bWNzX2lkKTsKK30KKwordm9pZCB2bWNzX2lkX3N5c2Zz X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwg JmRldl9hdHRyX3ZtY3NfaWQpOworfQorCisvKgorICogRm9yIGNhY3VsYXRpbmcgb2Zmc2V0cyBv ZiBmaWVsZHMgaW4gVk1DUyBkYXRhLCB3ZSBpbmRleCBldmVyeSAxNi1iaXQKKyAqIGZpZWxkIGJ5 IHRoaXMga2luZCBvZiBmb3JtYXQ6CisgKiAgICAgICAgIHwgLS0tLS0tLS0tIDE2IGJpdHMgLS0t LS0tLS0tLSB8CisgKiAgICAgICAgICstLS0tLS0tLS0tLS0tKy0rLS0tLS0tLS0tLS0tKy0rCisg KiAgICAgICAgIHwgaGlnaCA3IGJpdHMgfDF8IGxvdyA3IGJpdHMgfDB8CisgKiAgICAgICAgICst LS0tLS0tLS0tLS0tKy0rLS0tLS0tLS0tLS0tKy0rCisgKiBJbiBoaWdoIGJ5dGUsIHRoZSBsb3dl c3QgYml0IG11c3QgYmUgMTsgSW4gbG93IGJ5dGUsIHRoZSBsb3dlc3QgYml0CisgKiBtdXN0IGJl IDAuIFRoZSB0d28gYml0cyBhcmUgc2V0IGxpa2UgdGhpcyBpbiBjYXNlIGluZGV4ZXMgaW4gVk1D UworICogZGF0YSBhcmUgcmVhZCBhcyBiaWcgZW5kaWFuIG1vZGUuCisgKiBUaGUgcmVtYWluaW5n IDE0IGJpdHMgb2YgdGhlIGluZGV4IGluZGljYXRlIHRoZSByZWFsIG9mZnNldCBvZiB0aGUKKyAq IGZpZWxkLiBCZWNhdXNlIHRoZSBzaXplIG9mIGEgVk1DUyByZWdpb24gaXMgYXQgbW9zdCA0IEtC eXRlcywgc28KKyAqIDE0IGJpdHMgYXJlIGVub3VnaCB0byBpbmRleCB0aGUgd2hvbGUgVk1DUyBy ZWdpb24uCisgKgorICogRU5DT0RJTkdfT0ZGU0VUOiBlbmNvZGUgdGhlIG9mZnNldCBpbnRvIHRo ZSBpbmRleCBvZiB0aGlzIGtpbmQuCisgKiBERUNPRElOR19PRkZTRVQ6IGRlY29kZSB0aGUgaW5k ZXggb2YgdGhpcyBraW5kIGludG8gcmVhbCBvZmZzZXQuCisgKi8KKyNkZWZpbmUgT0ZGU0VUX0hJ R0hfU0hJRlQgKDcpCisjZGVmaW5lIE9GRlNFVF9MT1dfTUFTSyAgICgoMSA8PCBPRkZTRVRfSElH SF9TSElGVCkgLSAxKSAvKiAweDdmICovCisjZGVmaW5lIE9GRlNFVF9ISUdIX01BU0sgIChPRkZT RVRfTE9XX01BU0sgPDwgT0ZGU0VUX0hJR0hfU0hJRlQpIC8qIDB4M2Y4MCAqLworI2RlZmluZSBF TkNPRElOR19PRkZTRVQob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisJKCgoKG9mZnNldCkgJiBPRkZTRVRfTE9XX01BU0spIDw8IDEpICsgICAgICAgICAgICAg ICAgICAgICAgXAorCSgoKChvZmZzZXQpICYgT0ZGU0VUX0hJR0hfTUFTSykgPDwgMikgfCAweDEw MCkpCisvKgorICogaW5kZXggaGVyZSBzaG91bGQgYmUgYWx3YXlzIHJlYWQgaW4gbGl0dGxlIGVu ZGlhbiBtb2RlLgorICovCisjZGVmaW5lIERFQ09ESU5HX09GRlNFVF9MRShpbmRleCkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKCgoaW5kZXgpID4+IDEpICYgT0ZGU0VU X0xPV19NQVNLKSArICAgICAgICAgICAgICAgICAgICAgICBcCisJKCgoaW5kZXgpID4+IDIpICYg T0ZGU0VUX0hJR0hfTUFTSykpCisvKgorICogbiBpbmRpY2F0ZXMgdGhlIGJpdHMgb2YgaW5kZXgu IFdlIGZpcnN0IGNoZWNrIGlmIGluZGV4CisgKiBpcyByZWFkIGluIGJpZyBlbmRpYW4gbW9kZS4K KyAqLworI2RlZmluZSBERUNPRElOR19PRkZTRVQoaW5kZXgsIG4pICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCisJKChpbmRleCAmIDEpID8gKERFQ09ESU5HX09GRlNFVF9MRShf X3N3YWIjI24oaW5kZXgpKSkgOiAgICAgXAorCShERUNPRElOR19PRkZTRVRfTEUoaW5kZXgpKSkK KworI2RlZmluZSBGSUVMRF9PRkZTRVQxNihmaWVsZCwgb2Zmc2V0KSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCisJdm1jc2luZm9fZmllbGQoZmllbGQsIERFQ09ESU5HX09GRlNFVChv ZmZzZXQsIDE2KSkKKyNkZWZpbmUgRklFTERfT0ZGU0VUNjQoZmllbGQsIG9mZnNldCkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZtY3NpbmZvX2ZpZWxkKGZpZWxkLCBERUNPRElO R19PRkZTRVQob2Zmc2V0LCA2NCkpCisjZGVmaW5lIEZJRUxEX09GRlNFVDMyKGZpZWxkLCBvZmZz ZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl2bWNzaW5mb19maWVsZChmaWVs ZCwgREVDT0RJTkdfT0ZGU0VUKG9mZnNldCwgMzIpKQorI2RlZmluZSBGSUVMRF9PRkZTRVROVyhm aWVsZCwgb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKwlpZiAoc2l6ZW9mKG9mZnNldCkgPT0gOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisJCXZtY3NpbmZvX2ZpZWxkKGZpZWxkLCBERUNPRElOR19PRkZTRVQob2Zmc2V0 LCA2NCkpOyBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorCQl2bWNzaW5mb19maWVsZChmaWVsZCwgREVDT0RJTkdfT0ZGU0VU KG9mZnNldCwgMzIpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBWTUNTX0ZJRUxEX0NIRUNL KGZpZWxkLCBvZmZzZXQsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKKwlpZiAodm1jc19yZWFkMzIoVk1fSU5TVFJVQ1RJT05fRVJST1IpICE9ICAgICAgICAgICAg ICAgICAgICBcCisJCVZNWEVSUl9VTlNVUFBPUlRFRF9WTUNTX0NPTVBPTkVOVCkgICAgICAgICAg ICAgICAgICBcCisJCUZJRUxEX09GRlNFVCMjdHlwZShmaWVsZCwgb2Zmc2V0KTsgICAgICAgICAg ICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm1jc19yZWFkX2No ZWNraW5nKHVuc2lnbmVkIGxvbmcgZmllbGQpCit7CisJdTE2IG9mZnNldDE2OworCXU2NCBvZmZz ZXQ2NDsKKwl1MzIgb2Zmc2V0MzI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXRudzsKKworCXN3aXRj aCAodm1jc19maWVsZF90eXBlKGZpZWxkKSkgeworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1UxNjoK KwkJb2Zmc2V0MTYgPSB2bWNzX3JlYWQxNihmaWVsZCk7CisJCVZNQ1NfRklFTERfQ0hFQ0soZmll bGQsIG9mZnNldDE2LCAxNik7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1U2NDoK KwkJb2Zmc2V0NjQgPSB2bWNzX3JlYWQ2NChmaWVsZCk7CisJCVZNQ1NfRklFTERfQ0hFQ0soZmll bGQsIG9mZnNldDY0LCA2NCk7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1UzMjoK KwkJb2Zmc2V0MzIgPSB2bWNzX3JlYWQzMihmaWVsZCk7CisJCVZNQ1NfRklFTERfQ0hFQ0soZmll bGQsIG9mZnNldDMyLCAzMik7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX05BVFVS QUxfV0lEVEg6CisJCW9mZnNldG53ID0gdm1jc19yZWFkbChmaWVsZCk7CisJCVZNQ1NfRklFTERf Q0hFQ0soZmllbGQsIG9mZnNldG53LCBOVyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIE5v dGUsIG9mZnNldHMgb2YgZmllbGRzIGJlbG93IHdpbGwgbm90IGJlIGZpbGxlZCBpbnRvCisgKiBW TUNTSU5GTzoKKyAqIDEuIGZpZWxkcyBkZWZpbmVkIGluIEludGVsIHNwZWNpZmljYXRpb24gKElu dGVswq4gNjQgYW5kCisgKiAgICBJQS0zMiBBcmNoaXRlY3R1cmVzIFNvZnR3YXJlIERldmVsb3Bl cuKAmXMgTWFudWFsLCBWb2x1bWUKKyAqICAgIDNDKSBidXQgbm90IGRlZmluZWQgaW4gKnZtY3Nf ZmllbGQqLgorICogMi4gZmllbGRzIHVuc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50IF9faW5p dCBhbGxvY192bWNzaW5mb19pbml0KHZvaWQpCit7CisvKgorICogVGhlIGZpcnN0IDggYnl0ZXMg aW4gdm1jcyByZWdpb24gYXJlIGZvcgorICogICBWTUNTIHJldmlzaW9uIGlkZW50aWZpZXIKKyAq ICAgVk1YLWFib3J0IGluZGljYXRvcgorICovCisjZGVmaW5lIEZJRUxEX1NUQVJUICg4KQorCisJ aW50IHIsIG9mZnNldDsKKwlzdHJ1Y3Qgdm1jcyAqdm1jczsKKwlpbnQgY3B1OworCXVuc2lnbmVk IGxvbmcgZmllbGQ7CisKKwl2bWNzID0gYWxsb2Nfdm1jcygpOworCWlmICghdm1jcykgeworCQly ZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyID0gaGFyZHdhcmVfZW5hYmxlX2FsbCgpOworCWlmIChy KQorCQlnb3RvIG91dDsKKworCS8qCisJICogV3JpdGUgZW5jb2RlZCBvZmZzZXRzIGludG8gVk1D UyBkYXRhIGZvciBsYXRlciB2bWNzX3JlYWQuCisJICovCisJZm9yIChvZmZzZXQgPSBGSUVMRF9T VEFSVDsgb2Zmc2V0IDwgdm1jc19jb25maWcuc2l6ZTsKKwkgICAgIG9mZnNldCArPSBzaXplb2Yo dTE2KSkKKwkJKih1MTYgKikoKGNoYXIgKil2bWNzICsgb2Zmc2V0KSA9IEVOQ09ESU5HX09GRlNF VChvZmZzZXQpOworCisJY3B1ID0gZ2V0X2NwdSgpOworCXZtY3NfY2xlYXIodm1jcyk7CisJcGVy X2NwdShjdXJyZW50X3ZtY3MsIGNwdSkgPSB2bWNzOworCXZtY3NfbG9hZCh2bWNzKTsKKworCXZt Y3NpbmZvX3JldmlzaW9uX2lkKHZtY3MtPnJldmlzaW9uX2lkKTsKKwl2bWNzX3JlYWRfY2hlY2tp bmcoVk1fSU5TVFJVQ1RJT05fRVJST1IpOworCW9mZnNldCA9IGdldF92bWNzX2ZpZWxkX29mZnNl dChWTV9JTlNUUlVDVElPTl9FUlJPUik7CisJaWYgKG9mZnNldCA9PSAtMSkKKwkJZ290byBvdXRf Y2xlYXI7CisKKwlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBWTUNTSU5GT19NQVhfRklFTEQ7ICsr ZmllbGQpIHsKKwkJaWYgKGZpZWxkID09IFZNX0lOU1RSVUNUSU9OX0VSUk9SKQorCQkJY29udGlu dWU7CisJCS8qCisJCSAqIEJlZm9yZSBlYWNoIHJlYWRpbmcsIHplcm9lZCBmaWVsZCBWTV9JTlNU UlVDVElPTl9FUlJPUgorCQkgKi8KKwkJKih1MzIgKikoKGNoYXIgKil2bWNzICsgb2Zmc2V0KSA9 IDA7CisJCXZtY3NfcmVhZF9jaGVja2luZyhmaWVsZCk7CisJfQorCisJciA9IHZtY3NfaWRfc3lz ZnNfYWRkKGNwdV9zdWJzeXMuZGV2X3Jvb3QpOworCWlmIChyKQorCQlnb3RvIG91dF9jbGVhcjsK KwlyID0gdm1jc19zeXNmc19hZGQoY3B1X3N1YnN5cy5kZXZfcm9vdCk7CisJaWYgKHIpCisJCXZt Y3NfaWRfc3lzZnNfcmVtb3ZlKGNwdV9zdWJzeXMuZGV2X3Jvb3QpOworCitvdXRfY2xlYXI6CisJ dm1jc19jbGVhcih2bWNzKTsKKwlwdXRfY3B1KCk7CisJaGFyZHdhcmVfZGlzYWJsZV9hbGwoKTsK K291dDoKKwlmcmVlX3ZtY3Modm1jcyk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIF9f ZXhpdCBhbGxvY192bWNzaW5mb19leGl0KHZvaWQpCit7CisJdm1jc19zeXNmc19yZW1vdmUoY3B1 X3N1YnN5cy5kZXZfcm9vdCk7CisJdm1jc19pZF9zeXNmc19yZW1vdmUoY3B1X3N1YnN5cy5kZXZf cm9vdCk7Cit9CisKK21vZHVsZV9pbml0KGFsbG9jX3ZtY3NpbmZvX2luaXQpOworbW9kdWxlX2V4 aXQoYWxsb2Nfdm1jc2luZm9fZXhpdCk7Ci0tIAoxLjcuMQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18Ka2V4ZWMgbWFpbGluZyBsaXN0CmtleGVjQGxpc3Rz LmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5m by9rZXhlYwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yanfei Zhang Subject: [PATCH v4 2/3] KVM-INTEL: Add new module vmcsinfo-intel to fill VMCSINFO Date: Wed, 04 Jul 2012 18:05:19 +0800 Message-ID: <4FF4155F.6070508@cn.fujitsu.com> References: <4FF413D2.4030006@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: ebiederm@xmission.com, luto@mit.edu, Joerg Roedel , dzickus@redhat.com, paul.gortmaker@windriver.com, ludwig.nussel@suse.de, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kexec@lists.infradead.org, Greg KH To: Avi Kivity , mtosatti@redhat.com Return-path: In-Reply-To: <4FF413D2.4030006@cn.fujitsu.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org This patch implements a new module named vmcsinfo-intel. The module fills VMCSINFO with the VMCS revision identifier, and offsets of VMCS fields. Note, offsets of fields that defined in Intel specification (Intel=C2=AE 64 and IA-32 Architectures Software Developer=E2=80=99s Ma= nual, Volume 3C) but not defined in *vmcs_field* will not be filled in VMCSINFO. And, some fields may be unsupported in some machines, in these machines, corresponding offsets will be zero. Besides, this patch also exports vmcs revision identifier via /sys/devices/system/cpu/vmcs_id and offsets of fields via /sys/devices/system/cpu/vmcs/. Individual offsets are contained in subfiles named by the filed's encoding, e.g.: /sys/devices/cpu/vmcs/0800 Signed-off-by: zhangyanfei --- arch/x86/kvm/Kconfig | 11 + arch/x86/kvm/Makefile | 3 + arch/x86/kvm/vmcsinfo.c | 586 +++++++++++++++++++++++++++++++++++++++= ++++++++ 3 files changed, 600 insertions(+), 0 deletions(-) create mode 100644 arch/x86/kvm/vmcsinfo.c diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index a28f338..1dd64b1 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -63,6 +63,17 @@ config KVM_INTEL To compile this as a module, choose M here: the module will be called kvm-intel. =20 +config VMCSINFO_INTEL + tristate "Export VMCSINFO for Intel processors" + depends on KVM_INTEL + ---help--- + Provides support for exporting VMCSINFO on Intel processors equippe= d + with the VT extensions. The VMCSINFO contains a VMCS revision + identifier and offsets of VMCS fields. + + To compile this as a module, choose M here: the module + will be called vmcsinfo-intel. + config KVM_AMD tristate "KVM for AMD processors support" depends on KVM diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 4f579e8..12a1ef6 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -4,6 +4,7 @@ ccflags-y +=3D -Ivirt/kvm -Iarch/x86/kvm CFLAGS_x86.o :=3D -I. CFLAGS_svm.o :=3D -I. CFLAGS_vmx.o :=3D -I. +CFLAGS_vmcsinfo.o :=3D -I. =20 kvm-y +=3D $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ coalesced_mmio.o irq_comm.o eventfd.o \ @@ -15,7 +16,9 @@ kvm-y +=3D x86.o mmu.o emulate.o i8259.o irq.o lapi= c.o \ i8254.o timer.o cpuid.o pmu.o kvm-intel-y +=3D vmx.o kvm-amd-y +=3D svm.o +vmcsinfo-intel-y +=3D vmcsinfo.o =20 obj-$(CONFIG_KVM) +=3D kvm.o obj-$(CONFIG_KVM_INTEL) +=3D kvm-intel.o obj-$(CONFIG_KVM_AMD) +=3D kvm-amd.o +obj-$(CONFIG_VMCSINFO_INTEL) +=3D vmcsinfo-intel.o diff --git a/arch/x86/kvm/vmcsinfo.c b/arch/x86/kvm/vmcsinfo.c new file mode 100644 index 0000000..bff6a1e --- /dev/null +++ b/arch/x86/kvm/vmcsinfo.c @@ -0,0 +1,586 @@ +/* + * Kernel-based Virtual Machine driver for Linux + * + * This module enables machines with Intel VT-x extensions to export + * offsets of VMCS fields for guest debugging. + * + * Copyright (C) 2012 Fujitsu, Inc. + * + * Authors: + * Zhang Yanfei + * + * This work is licensed under the terms of the GNU GPL, version 2. S= ee + * the COPYING file in the top-level directory. + * + */ + +#include +#include +#include +#include +#include + +#include + +MODULE_AUTHOR("Fujitsu"); +MODULE_LICENSE("GPL"); + +static const struct x86_cpu_id vmcsinfo_cpu_id[] =3D { + X86_FEATURE_MATCH(X86_FEATURE_VMX), + {} +}; +MODULE_DEVICE_TABLE(x86cpu, vmcsinfo_cpu_id); + +/* + * vmcs field offsets. + */ +static struct vmcsinfo { + u32 vmcs_revision_id; + u16 vmcs_field_to_offset_table[HOST_RIP + 1]; +} vmcsinfo; + +#define VMCSINFO_MAX_FIELD \ + ARRAY_SIZE(vmcsinfo.vmcs_field_to_offset_table) + +static inline void vmcsinfo_revision_id(u32 id) +{ + vmcsinfo.vmcs_revision_id =3D id; +} + +static inline void vmcsinfo_field(unsigned long field, u16 offset) +{ + if (field < VMCSINFO_MAX_FIELD) + vmcsinfo.vmcs_field_to_offset_table[field] =3D offset; +} + +static inline short get_vmcs_field_offset(unsigned long field) +{ + if (field >=3D VMCSINFO_MAX_FIELD || + vmcsinfo.vmcs_field_to_offset_table[field] =3D=3D 0) + return -1; + return vmcsinfo.vmcs_field_to_offset_table[field]; +} + +const char vmcs_group_name[] =3D "vmcs"; + +#define BUILD_OFFSET_SHOW(field_code) = \ +static ssize_t _##field_code##_show(struct device *dev, = \ + struct device_attribute *attr, \ + char *buf) \ +{ = \ + return sprintf(buf, "%d\n", = \ + vmcsinfo.vmcs_field_to_offset_table[0x##field_code]); \ +} = \ +static DEVICE_ATTR(field_code, 0444, _##field_code##_show, NULL); = \ + +BUILD_OFFSET_SHOW(0000); /* VIRTUAL_PROCESSOR_ID */ +BUILD_OFFSET_SHOW(0800); /* GUEST_ES_SELECTOR */ +BUILD_OFFSET_SHOW(0802); /* GUEST_CS_SELECTOR */ +BUILD_OFFSET_SHOW(0804); /* GUEST_SS_SELECTOR */ +BUILD_OFFSET_SHOW(0806); /* GUEST_DS_SELECTOR */ +BUILD_OFFSET_SHOW(0808); /* GUEST_FS_SELECTOR */ +BUILD_OFFSET_SHOW(080a); /* GUEST_GS_SELECTOR */ +BUILD_OFFSET_SHOW(080c); /* GUEST_LDTR_SELECTOR */ +BUILD_OFFSET_SHOW(080e); /* GUEST_TR_SELECTOR */ +BUILD_OFFSET_SHOW(0c00); /* HOST_ES_SELECTOR */ +BUILD_OFFSET_SHOW(0c02); /* HOST_CS_SELECTOR */ +BUILD_OFFSET_SHOW(0c04); /* HOST_SS_SELECTOR */ +BUILD_OFFSET_SHOW(0c06); /* HOST_DS_SELECTOR */ +BUILD_OFFSET_SHOW(0c08); /* HOST_FS_SELECTOR */ +BUILD_OFFSET_SHOW(0c0a); /* HOST_GS_SELECTOR */ +BUILD_OFFSET_SHOW(0c0c); /* HOST_TR_SELECTOR */ +BUILD_OFFSET_SHOW(2000); /* IO_BITMAP_A */ +BUILD_OFFSET_SHOW(2001); /* IO_BITMAP_A_HIGH */ +BUILD_OFFSET_SHOW(2002); /* IO_BITMAP_B */ +BUILD_OFFSET_SHOW(2003); /* IO_BITMAP_B_HIGH */ +BUILD_OFFSET_SHOW(2004); /* MSR_BITMAP */ +BUILD_OFFSET_SHOW(2005); /* MSR_BITMAP_HIGH */ +BUILD_OFFSET_SHOW(2006); /* VM_EXIT_MSR_STORE_ADDR */ +BUILD_OFFSET_SHOW(2007); /* VM_EXIT_MSR_STORE_ADDR_HIGH */ +BUILD_OFFSET_SHOW(2008); /* VM_EXIT_MSR_LOAD_ADDR */ +BUILD_OFFSET_SHOW(2009); /* VM_EXIT_MSR_LOAD_ADDR_HIGH */ +BUILD_OFFSET_SHOW(200a); /* VM_ENTRY_MSR_LOAD_ADDR */ +BUILD_OFFSET_SHOW(200b); /* VM_ENTRY_MSR_LOAD_ADDR_HIGH */ +BUILD_OFFSET_SHOW(2010); /* TSC_OFFSET */ +BUILD_OFFSET_SHOW(2011); /* TSC_OFFSET_HIGH */ +BUILD_OFFSET_SHOW(2012); /* VIRTUAL_APIC_PAGE_ADDR */ +BUILD_OFFSET_SHOW(2013); /* VIRTUAL_APIC_PAGE_ADDR_HIGH */ +BUILD_OFFSET_SHOW(2014); /* APIC_ACCESS_ADDR */ +BUILD_OFFSET_SHOW(2015); /* APIC_ACCESS_ADDR_HIGH */ +BUILD_OFFSET_SHOW(201a); /* EPT_POINTER */ +BUILD_OFFSET_SHOW(201b); /* EPT_POINTER_HIGH */ +BUILD_OFFSET_SHOW(2400); /* GUEST_PHYSICAL_ADDRESS */ +BUILD_OFFSET_SHOW(2401); /* GUEST_PHYSICAL_ADDRESS_HIGH */ +BUILD_OFFSET_SHOW(2800); /* VMCS_LINK_POINTER */ +BUILD_OFFSET_SHOW(2801); /* VMCS_LINK_POINTER_HIGH */ +BUILD_OFFSET_SHOW(2802); /* GUEST_IA32_DEBUGCTL */ +BUILD_OFFSET_SHOW(2803); /* GUEST_IA32_DEBUGCTL_HIGH */ +BUILD_OFFSET_SHOW(2804); /* GUEST_IA32_PAT */ +BUILD_OFFSET_SHOW(2805); /* GUEST_IA32_PAT_HIGH */ +BUILD_OFFSET_SHOW(2806); /* GUEST_IA32_EFER */ +BUILD_OFFSET_SHOW(2807); /* GUEST_IA32_EFER_HIGH */ +BUILD_OFFSET_SHOW(2808); /* GUEST_IA32_PERF_GLOBAL_CTRL */ +BUILD_OFFSET_SHOW(2809); /* GUEST_IA32_PERF_GLOBAL_CTRL_HIGH */ +BUILD_OFFSET_SHOW(280a); /* GUEST_PDPTR0 */ +BUILD_OFFSET_SHOW(280b); /* GUEST_PDPTR0_HIGH */ +BUILD_OFFSET_SHOW(280c); /* GUEST_PDPTR1 */ +BUILD_OFFSET_SHOW(280d); /* GUEST_PDPTR1_HIGH */ +BUILD_OFFSET_SHOW(280e); /* GUEST_PDPTR2 */ +BUILD_OFFSET_SHOW(280f); /* GUEST_PDPTR2_HIGH */ +BUILD_OFFSET_SHOW(2810); /* GUEST_PDPTR3 */ +BUILD_OFFSET_SHOW(2811); /* GUEST_PDPTR3_HIGH */ +BUILD_OFFSET_SHOW(2c00); /* HOST_IA32_PAT */ +BUILD_OFFSET_SHOW(2c01); /* HOST_IA32_PAT_HIGH */ +BUILD_OFFSET_SHOW(2c02); /* HOST_IA32_EFER */ +BUILD_OFFSET_SHOW(2c03); /* HOST_IA32_EFER_HIGH */ +BUILD_OFFSET_SHOW(2c04); /* HOST_IA32_PERF_GLOBAL_CTRL */ +BUILD_OFFSET_SHOW(2c05); /* HOST_IA32_PERF_GLOBAL_CTRL_HIGH */ +BUILD_OFFSET_SHOW(4000); /* PIN_BASED_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW(4002); /* CPU_BASED_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW(4004); /* EXCEPTION_BITMAP */ +BUILD_OFFSET_SHOW(4006); /* PAGE_FAULT_ERROR_CODE_MASK */ +BUILD_OFFSET_SHOW(4008); /* PAGE_FAULT_ERROR_CODE_MATCH */ +BUILD_OFFSET_SHOW(400a); /* CR3_TARGET_COUNT */ +BUILD_OFFSET_SHOW(400c); /* VM_EXIT_CONTROLS */ +BUILD_OFFSET_SHOW(400e); /* VM_EXIT_MSR_STORE_COUNT */ +BUILD_OFFSET_SHOW(4010); /* VM_EXIT_MSR_LOAD_COUNT */ +BUILD_OFFSET_SHOW(4012); /* VM_ENTRY_CONTROLS */ +BUILD_OFFSET_SHOW(4014); /* VM_ENTRY_MSR_LOAD_COUNT */ +BUILD_OFFSET_SHOW(4016); /* VM_ENTRY_INTR_INFO_FIELD */ +BUILD_OFFSET_SHOW(4018); /* VM_ENTRY_EXCEPTION_ERROR_CODE */ +BUILD_OFFSET_SHOW(401a); /* VM_ENTRY_INSTRUCTION_LEN */ +BUILD_OFFSET_SHOW(401c); /* TPR_THRESHOLD */ +BUILD_OFFSET_SHOW(401e); /* SECONDARY_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW(4020); /* PLE_GAP */ +BUILD_OFFSET_SHOW(4022); /* PLE_WINDOW */ +BUILD_OFFSET_SHOW(4400); /* VM_INSTRUCTION_ERROR */ +BUILD_OFFSET_SHOW(4402); /* VM_EXIT_REASON */ +BUILD_OFFSET_SHOW(4404); /* VM_EXIT_INTR_INFO */ +BUILD_OFFSET_SHOW(4406); /* VM_EXIT_INTR_ERROR_CODE */ +BUILD_OFFSET_SHOW(4408); /* IDT_VECTORING_INFO_FIELD */ +BUILD_OFFSET_SHOW(440a); /* IDT_VECTORING_ERROR_CODE */ +BUILD_OFFSET_SHOW(440c); /* VM_EXIT_INSTRUCTION_LEN */ +BUILD_OFFSET_SHOW(440e); /* VMX_INSTRUCTION_INFO */ +BUILD_OFFSET_SHOW(4800); /* GUEST_ES_LIMIT */ +BUILD_OFFSET_SHOW(4802); /* GUEST_CS_LIMIT */ +BUILD_OFFSET_SHOW(4804); /* GUEST_SS_LIMIT */ +BUILD_OFFSET_SHOW(4806); /* GUEST_DS_LIMIT */ +BUILD_OFFSET_SHOW(4808); /* GUEST_FS_LIMIT */ +BUILD_OFFSET_SHOW(480a); /* GUEST_GS_LIMIT */ +BUILD_OFFSET_SHOW(480c); /* GUEST_LDTR_LIMIT */ +BUILD_OFFSET_SHOW(480e); /* GUEST_TR_LIMIT */ +BUILD_OFFSET_SHOW(4810); /* GUEST_GDTR_LIMIT */ +BUILD_OFFSET_SHOW(4812); /* GUEST_IDTR_LIMIT */ +BUILD_OFFSET_SHOW(4814); /* GUEST_ES_AR_BYTES */ +BUILD_OFFSET_SHOW(4816); /* GUEST_CS_AR_BYTES */ +BUILD_OFFSET_SHOW(4818); /* GUEST_SS_AR_BYTES */ +BUILD_OFFSET_SHOW(481a); /* GUEST_DS_AR_BYTES */ +BUILD_OFFSET_SHOW(481c); /* GUEST_FS_AR_BYTES */ +BUILD_OFFSET_SHOW(481e); /* GUEST_GS_AR_BYTES */ +BUILD_OFFSET_SHOW(4820); /* GUEST_LDTR_AR_BYTES */ +BUILD_OFFSET_SHOW(4822); /* GUEST_TR_AR_BYTES */ +BUILD_OFFSET_SHOW(4824); /* GUEST_INTERRUPTIBILITY_INFO */ +BUILD_OFFSET_SHOW(4826); /* GUEST_ACTIVITY_STATE */ +BUILD_OFFSET_SHOW(482A); /* GUEST_SYSENTER_CS */ +BUILD_OFFSET_SHOW(4c00); /* HOST_IA32_SYSENTER_CS */ +BUILD_OFFSET_SHOW(6000); /* CR0_GUEST_HOST_MASK */ +BUILD_OFFSET_SHOW(6002); /* CR4_GUEST_HOST_MASK */ +BUILD_OFFSET_SHOW(6004); /* CR0_READ_SHADOW */ +BUILD_OFFSET_SHOW(6006); /* CR4_READ_SHADOW */ +BUILD_OFFSET_SHOW(6008); /* CR3_TARGET_VALUE0 */ +BUILD_OFFSET_SHOW(600a); /* CR3_TARGET_VALUE1 */ +BUILD_OFFSET_SHOW(600c); /* CR3_TARGET_VALUE2 */ +BUILD_OFFSET_SHOW(600e); /* CR3_TARGET_VALUE3 */ +BUILD_OFFSET_SHOW(6400); /* EXIT_QUALIFICATION */ +BUILD_OFFSET_SHOW(640a); /* GUEST_LINEAR_ADDRESS */ +BUILD_OFFSET_SHOW(6800); /* GUEST_CR0 */ +BUILD_OFFSET_SHOW(6802); /* GUEST_CR3 */ +BUILD_OFFSET_SHOW(6804); /* GUEST_CR4 */ +BUILD_OFFSET_SHOW(6806); /* GUEST_ES_BASE */ +BUILD_OFFSET_SHOW(6808); /* GUEST_CS_BASE */ +BUILD_OFFSET_SHOW(680a); /* GUEST_SS_BASE */ +BUILD_OFFSET_SHOW(680c); /* GUEST_DS_BASE */ +BUILD_OFFSET_SHOW(680e); /* GUEST_FS_BASE */ +BUILD_OFFSET_SHOW(6810); /* GUEST_GS_BASE */ +BUILD_OFFSET_SHOW(6812); /* GUEST_LDTR_BASE */ +BUILD_OFFSET_SHOW(6814); /* GUEST_TR_BASE */ +BUILD_OFFSET_SHOW(6816); /* GUEST_GDTR_BASE */ +BUILD_OFFSET_SHOW(6818); /* GUEST_IDTR_BASE */ +BUILD_OFFSET_SHOW(681a); /* GUEST_DR7 */ +BUILD_OFFSET_SHOW(681c); /* GUEST_RSP */ +BUILD_OFFSET_SHOW(681e); /* GUEST_RIP */ +BUILD_OFFSET_SHOW(6820); /* GUEST_RFLAGS */ +BUILD_OFFSET_SHOW(6822); /* GUEST_PENDING_DBG_EXCEPTIONS */ +BUILD_OFFSET_SHOW(6824); /* GUEST_SYSENTER_ESP */ +BUILD_OFFSET_SHOW(6826); /* GUEST_SYSENTER_EIP */ +BUILD_OFFSET_SHOW(6c00); /* HOST_CR0 */ +BUILD_OFFSET_SHOW(6c02); /* HOST_CR3 */ +BUILD_OFFSET_SHOW(6c04); /* HOST_CR4 */ +BUILD_OFFSET_SHOW(6c06); /* HOST_FS_BASE */ +BUILD_OFFSET_SHOW(6c08); /* HOST_GS_BASE */ +BUILD_OFFSET_SHOW(6c0a); /* HOST_TR_BASE */ +BUILD_OFFSET_SHOW(6c0c); /* HOST_GDTR_BASE */ +BUILD_OFFSET_SHOW(6c0e); /* HOST_IDTR_BASE */ +BUILD_OFFSET_SHOW(6c10); /* HOST_IA32_SYSENTER_ESP */ +BUILD_OFFSET_SHOW(6c12); /* HOST_IA32_SYSENTER_EIP */ +BUILD_OFFSET_SHOW(6c14); /* HOST_RSP */ +BUILD_OFFSET_SHOW(6c16); /* HOST_RIP */ + +static struct attribute *vmcs_attrs[] =3D { + &dev_attr_0000.attr, + &dev_attr_0800.attr, + &dev_attr_0802.attr, + &dev_attr_0804.attr, + &dev_attr_0806.attr, + &dev_attr_0808.attr, + &dev_attr_080a.attr, + &dev_attr_080c.attr, + &dev_attr_080e.attr, + &dev_attr_0c00.attr, + &dev_attr_0c02.attr, + &dev_attr_0c04.attr, + &dev_attr_0c06.attr, + &dev_attr_0c08.attr, + &dev_attr_0c0a.attr, + &dev_attr_0c0c.attr, + &dev_attr_2000.attr, + &dev_attr_2001.attr, + &dev_attr_2002.attr, + &dev_attr_2003.attr, + &dev_attr_2004.attr, + &dev_attr_2005.attr, + &dev_attr_2006.attr, + &dev_attr_2007.attr, + &dev_attr_2008.attr, + &dev_attr_2009.attr, + &dev_attr_200a.attr, + &dev_attr_200b.attr, + &dev_attr_2010.attr, + &dev_attr_2011.attr, + &dev_attr_2012.attr, + &dev_attr_2013.attr, + &dev_attr_2014.attr, + &dev_attr_2015.attr, + &dev_attr_201a.attr, + &dev_attr_201b.attr, + &dev_attr_2400.attr, + &dev_attr_2401.attr, + &dev_attr_2800.attr, + &dev_attr_2801.attr, + &dev_attr_2802.attr, + &dev_attr_2803.attr, + &dev_attr_2804.attr, + &dev_attr_2805.attr, + &dev_attr_2806.attr, + &dev_attr_2807.attr, + &dev_attr_2808.attr, + &dev_attr_2809.attr, + &dev_attr_280a.attr, + &dev_attr_280b.attr, + &dev_attr_280c.attr, + &dev_attr_280d.attr, + &dev_attr_280e.attr, + &dev_attr_280f.attr, + &dev_attr_2810.attr, + &dev_attr_2811.attr, + &dev_attr_2c00.attr, + &dev_attr_2c01.attr, + &dev_attr_2c02.attr, + &dev_attr_2c03.attr, + &dev_attr_2c04.attr, + &dev_attr_2c05.attr, + &dev_attr_4000.attr, + &dev_attr_4002.attr, + &dev_attr_4004.attr, + &dev_attr_4006.attr, + &dev_attr_4008.attr, + &dev_attr_400a.attr, + &dev_attr_400c.attr, + &dev_attr_400e.attr, + &dev_attr_4010.attr, + &dev_attr_4012.attr, + &dev_attr_4014.attr, + &dev_attr_4016.attr, + &dev_attr_4018.attr, + &dev_attr_401a.attr, + &dev_attr_401c.attr, + &dev_attr_401e.attr, + &dev_attr_4020.attr, + &dev_attr_4022.attr, + &dev_attr_4400.attr, + &dev_attr_4402.attr, + &dev_attr_4404.attr, + &dev_attr_4406.attr, + &dev_attr_4408.attr, + &dev_attr_440a.attr, + &dev_attr_440c.attr, + &dev_attr_440e.attr, + &dev_attr_4800.attr, + &dev_attr_4802.attr, + &dev_attr_4804.attr, + &dev_attr_4806.attr, + &dev_attr_4808.attr, + &dev_attr_480a.attr, + &dev_attr_480c.attr, + &dev_attr_480e.attr, + &dev_attr_4810.attr, + &dev_attr_4812.attr, + &dev_attr_4814.attr, + &dev_attr_4816.attr, + &dev_attr_4818.attr, + &dev_attr_481a.attr, + &dev_attr_481c.attr, + &dev_attr_481e.attr, + &dev_attr_4820.attr, + &dev_attr_4822.attr, + &dev_attr_4824.attr, + &dev_attr_4826.attr, + &dev_attr_482A.attr, + &dev_attr_4c00.attr, + &dev_attr_6000.attr, + &dev_attr_6002.attr, + &dev_attr_6004.attr, + &dev_attr_6006.attr, + &dev_attr_6008.attr, + &dev_attr_600a.attr, + &dev_attr_600c.attr, + &dev_attr_600e.attr, + &dev_attr_6400.attr, + &dev_attr_640a.attr, + &dev_attr_6800.attr, + &dev_attr_6802.attr, + &dev_attr_6804.attr, + &dev_attr_6806.attr, + &dev_attr_6808.attr, + &dev_attr_680a.attr, + &dev_attr_680c.attr, + &dev_attr_680e.attr, + &dev_attr_6810.attr, + &dev_attr_6812.attr, + &dev_attr_6814.attr, + &dev_attr_6816.attr, + &dev_attr_6818.attr, + &dev_attr_681a.attr, + &dev_attr_681c.attr, + &dev_attr_681e.attr, + &dev_attr_6820.attr, + &dev_attr_6822.attr, + &dev_attr_6824.attr, + &dev_attr_6826.attr, + &dev_attr_6c00.attr, + &dev_attr_6c02.attr, + &dev_attr_6c04.attr, + &dev_attr_6c06.attr, + &dev_attr_6c08.attr, + &dev_attr_6c0a.attr, + &dev_attr_6c0c.attr, + &dev_attr_6c0e.attr, + &dev_attr_6c10.attr, + &dev_attr_6c12.attr, + &dev_attr_6c14.attr, + &dev_attr_6c16.attr, + NULL, +}; + +static struct attribute_group vmcs_attr_group =3D { + .name =3D vmcs_group_name, + .attrs =3D vmcs_attrs, +}; + +int vmcs_sysfs_add(struct device *dev) +{ + return sysfs_create_group(&dev->kobj, &vmcs_attr_group); +} + +void vmcs_sysfs_remove(struct device *dev) +{ + sysfs_remove_group(&dev->kobj, &vmcs_attr_group); +} + +static ssize_t vmcs_id_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "%d\n", vmcsinfo.vmcs_revision_id); +} + +static DEVICE_ATTR(vmcs_id, 0444, vmcs_id_show, NULL); + +int vmcs_id_sysfs_add(struct device *dev) +{ + return device_create_file(dev, &dev_attr_vmcs_id); +} + +void vmcs_id_sysfs_remove(struct device *dev) +{ + device_remove_file(dev, &dev_attr_vmcs_id); +} + +/* + * For caculating offsets of fields in VMCS data, we index every 16-bi= t + * field by this kind of format: + * | --------- 16 bits ---------- | + * +-------------+-+------------+-+ + * | high 7 bits |1| low 7 bits |0| + * +-------------+-+------------+-+ + * In high byte, the lowest bit must be 1; In low byte, the lowest bit + * must be 0. The two bits are set like this in case indexes in VMCS + * data are read as big endian mode. + * The remaining 14 bits of the index indicate the real offset of the + * field. Because the size of a VMCS region is at most 4 KBytes, so + * 14 bits are enough to index the whole VMCS region. + * + * ENCODING_OFFSET: encode the offset into the index of this kind. + * DECODING_OFFSET: decode the index of this kind into real offset. + */ +#define OFFSET_HIGH_SHIFT (7) +#define OFFSET_LOW_MASK ((1 << OFFSET_HIGH_SHIFT) - 1) /* 0x7f */ +#define OFFSET_HIGH_MASK (OFFSET_LOW_MASK << OFFSET_HIGH_SHIFT) /* 0x= 3f80 */ +#define ENCODING_OFFSET(offset) \ + ((((offset) & OFFSET_LOW_MASK) << 1) + \ + ((((offset) & OFFSET_HIGH_MASK) << 2) | 0x100)) +/* + * index here should be always read in little endian mode. + */ +#define DECODING_OFFSET_LE(index) \ + ((((index) >> 1) & OFFSET_LOW_MASK) + \ + (((index) >> 2) & OFFSET_HIGH_MASK)) +/* + * n indicates the bits of index. We first check if index + * is read in big endian mode. + */ +#define DECODING_OFFSET(index, n) \ + ((index & 1) ? (DECODING_OFFSET_LE(__swab##n(index))) : \ + (DECODING_OFFSET_LE(index))) + +#define FIELD_OFFSET16(field, offset) \ + vmcsinfo_field(field, DECODING_OFFSET(offset, 16)) +#define FIELD_OFFSET64(field, offset) \ + vmcsinfo_field(field, DECODING_OFFSET(offset, 64)) +#define FIELD_OFFSET32(field, offset) \ + vmcsinfo_field(field, DECODING_OFFSET(offset, 32)) +#define FIELD_OFFSETNW(field, offset) \ +do { \ + if (sizeof(offset) =3D=3D 8) \ + vmcsinfo_field(field, DECODING_OFFSET(offset, 64)); \ + else \ + vmcsinfo_field(field, DECODING_OFFSET(offset, 32)); \ +} while (0) + +#define VMCS_FIELD_CHECK(field, offset, type) \ +do { \ + if (vmcs_read32(VM_INSTRUCTION_ERROR) !=3D \ + VMXERR_UNSUPPORTED_VMCS_COMPONENT) \ + FIELD_OFFSET##type(field, offset); \ +} while (0) + +static inline void vmcs_read_checking(unsigned long field) +{ + u16 offset16; + u64 offset64; + u32 offset32; + unsigned long offsetnw; + + switch (vmcs_field_type(field)) { + case VMCS_FIELD_TYPE_U16: + offset16 =3D vmcs_read16(field); + VMCS_FIELD_CHECK(field, offset16, 16); + break; + case VMCS_FIELD_TYPE_U64: + offset64 =3D vmcs_read64(field); + VMCS_FIELD_CHECK(field, offset64, 64); + break; + case VMCS_FIELD_TYPE_U32: + offset32 =3D vmcs_read32(field); + VMCS_FIELD_CHECK(field, offset32, 32); + break; + case VMCS_FIELD_TYPE_NATURAL_WIDTH: + offsetnw =3D vmcs_readl(field); + VMCS_FIELD_CHECK(field, offsetnw, NW); + break; + } +} + +/* + * Note, offsets of fields below will not be filled into + * VMCSINFO: + * 1. fields defined in Intel specification (Intel=C2=AE 64 and + * IA-32 Architectures Software Developer=E2=80=99s Manual, Volume + * 3C) but not defined in *vmcs_field*. + * 2. fields unsupported. + */ +static int __init alloc_vmcsinfo_init(void) +{ +/* + * The first 8 bytes in vmcs region are for + * VMCS revision identifier + * VMX-abort indicator + */ +#define FIELD_START (8) + + int r, offset; + struct vmcs *vmcs; + int cpu; + unsigned long field; + + vmcs =3D alloc_vmcs(); + if (!vmcs) { + return -ENOMEM; + } + + r =3D hardware_enable_all(); + if (r) + goto out; + + /* + * Write encoded offsets into VMCS data for later vmcs_read. + */ + for (offset =3D FIELD_START; offset < vmcs_config.size; + offset +=3D sizeof(u16)) + *(u16 *)((char *)vmcs + offset) =3D ENCODING_OFFSET(offset); + + cpu =3D get_cpu(); + vmcs_clear(vmcs); + per_cpu(current_vmcs, cpu) =3D vmcs; + vmcs_load(vmcs); + + vmcsinfo_revision_id(vmcs->revision_id); + vmcs_read_checking(VM_INSTRUCTION_ERROR); + offset =3D get_vmcs_field_offset(VM_INSTRUCTION_ERROR); + if (offset =3D=3D -1) + goto out_clear; + + for (field =3D 0; field < VMCSINFO_MAX_FIELD; ++field) { + if (field =3D=3D VM_INSTRUCTION_ERROR) + continue; + /* + * Before each reading, zeroed field VM_INSTRUCTION_ERROR + */ + *(u32 *)((char *)vmcs + offset) =3D 0; + vmcs_read_checking(field); + } + + r =3D vmcs_id_sysfs_add(cpu_subsys.dev_root); + if (r) + goto out_clear; + r =3D vmcs_sysfs_add(cpu_subsys.dev_root); + if (r) + vmcs_id_sysfs_remove(cpu_subsys.dev_root); + +out_clear: + vmcs_clear(vmcs); + put_cpu(); + hardware_disable_all(); +out: + free_vmcs(vmcs); + return r; +} + +static void __exit alloc_vmcsinfo_exit(void) +{ + vmcs_sysfs_remove(cpu_subsys.dev_root); + vmcs_id_sysfs_remove(cpu_subsys.dev_root); +} + +module_init(alloc_vmcsinfo_init); +module_exit(alloc_vmcsinfo_exit); --=20 1.7.1