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 1SpG9S-0006yu-KU for kexec@lists.infradead.org; Thu, 12 Jul 2012 09:57:47 +0000 Message-ID: <4FFE9F79.5010805@cn.fujitsu.com> Date: Thu, 12 Jul 2012 17:57:13 +0800 From: Zhang Yanfei MIME-Version: 1.0 Subject: [PATCH v5 2/3] KVM-INTEL: Add new module vmcsinfo-intel to fill VMCSINFO References: <4FFE9EDE.8080107@cn.fujitsu.com> In-Reply-To: <4FFE9EDE.8080107@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 aWVyIHZpYQovc3lzL2RldmljZXMvc3lzdGVtL2NwdS92bWNzL2lkIGFuZCBvZmZzZXRzIG9mIGZp ZWxkcyB2aWEKL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvdm1jcy8uCkluZGl2aWR1YWwgb2Zmc2V0 cyBhcmUgY29udGFpbmVkIGluIHN1YmZpbGVzIG5hbWVkIGJ5IHRoZSBmaWxlZCdzCmVuY29kaW5n LCBlLmcuOiAvc3lzL2RldmljZXMvY3B1L3ZtY3MvMDgwMAoKU2lnbmVkLW9mZi1ieTogemhhbmd5 YW5mZWkgPHpoYW5neWFuZmVpQGNuLmZ1aml0c3UuY29tPgotLS0KIGFyY2gveDg2L2t2bS9LY29u ZmlnICAgIHwgICAxMSArCiBhcmNoL3g4Ni9rdm0vTWFrZWZpbGUgICB8ICAgIDMgKwogYXJjaC94 ODYva3ZtL3ZtY3NpbmZvLmMgfCAgNzE0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDcyOCBpbnNlcnRpb25zKCspLCAwIGRl 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 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczMDQ3MwotLS0gL2Rldi9u dWxsCisrKyBiL2FyY2gveDg2L2t2bS92bWNzaW5mby5jCkBAIC0wLDAgKzEsNzE0IEBACisvKgor ICogS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICog VGhpcyBtb2R1bGUgZW5hYmxlcyBtYWNoaW5lcyB3aXRoIEludGVsIFZULXggZXh0ZW5zaW9ucyB0 byBleHBvcnQKKyAqIG9mZnNldHMgb2YgVk1DUyBmaWVsZHMgZm9yIGd1ZXN0IGRlYnVnZ2luZy4K KyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRnVqaXRzdSwgSW5jLgorICoKKyAqIEF1dGhvcnM6 CisgKiAgIFpoYW5nIFlhbmZlaSA8emhhbmd5YW5mZWlAY24uZnVqaXRzdS5jb20+CisgKgorICog VGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVy c2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0 b3J5LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu dXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVk ZSA8bGludXgvc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNt L3ZteC5oPgorCitNT0RVTEVfQVVUSE9SKCJGdWppdHN1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BM Iik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCB2bWNzaW5mb19jcHVfaWRbXSA9 IHsKKwlYODZfRkVBVFVSRV9NQVRDSChYODZfRkVBVFVSRV9WTVgpLAorCXt9Cit9OworTU9EVUxF X0RFVklDRV9UQUJMRSh4ODZjcHUsIHZtY3NpbmZvX2NwdV9pZCk7CisKKy8qCisgKiB2bWNzIGZp ZWxkIG9mZnNldHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1jc2luZm8geworCXUzMiB2bWNzX3Jl dmlzaW9uX2lkOworCXUxNiBmaWVsZF9vZmZzZXRbXVsyXTsKK30gdm1jc2luZm8gPSB7CisJMCwK Kwl7CisJCXtWSVJUVUFMX1BST0NFU1NPUl9JRCwgMH0sCisJCXtHVUVTVF9FU19TRUxFQ1RPUiwg MH0sCisJCXtHVUVTVF9DU19TRUxFQ1RPUiwgMH0sCisJCXtHVUVTVF9TU19TRUxFQ1RPUiwgMH0s CisJCXtHVUVTVF9EU19TRUxFQ1RPUiwgMH0sCisJCXtHVUVTVF9GU19TRUxFQ1RPUiwgMH0sCisJ CXtHVUVTVF9HU19TRUxFQ1RPUiwgMH0sCisJCXtHVUVTVF9MRFRSX1NFTEVDVE9SLCAwfSwKKwkJ e0dVRVNUX1RSX1NFTEVDVE9SLCAwfSwKKwkJe0hPU1RfRVNfU0VMRUNUT1IsIDB9LAorCQl7SE9T VF9DU19TRUxFQ1RPUiwgMH0sCisJCXtIT1NUX1NTX1NFTEVDVE9SLCAwfSwKKwkJe0hPU1RfRFNf U0VMRUNUT1IsIDB9LAorCQl7SE9TVF9GU19TRUxFQ1RPUiwgMH0sCisJCXtIT1NUX0dTX1NFTEVD VE9SLCAwfSwKKwkJe0hPU1RfVFJfU0VMRUNUT1IsIDB9LAorCQl7SU9fQklUTUFQX0EsIDB9LAor CQl7SU9fQklUTUFQX0FfSElHSCwgMH0sCisJCXtJT19CSVRNQVBfQiwgMH0sCisJCXtJT19CSVRN QVBfQl9ISUdILCAwfSwKKwkJe01TUl9CSVRNQVAsIDB9LAorCQl7TVNSX0JJVE1BUF9ISUdILCAw fSwKKwkJe1ZNX0VYSVRfTVNSX1NUT1JFX0FERFIsIDB9LAorCQl7Vk1fRVhJVF9NU1JfU1RPUkVf QUREUl9ISUdILCAwfSwKKwkJe1ZNX0VYSVRfTVNSX0xPQURfQUREUiwgMH0sCisJCXtWTV9FWElU X01TUl9MT0FEX0FERFJfSElHSCwgMH0sCisJCXtWTV9FTlRSWV9NU1JfTE9BRF9BRERSLCAwfSwK KwkJe1ZNX0VOVFJZX01TUl9MT0FEX0FERFJfSElHSCwgMH0sCisJCXtUU0NfT0ZGU0VULCAwfSwK KwkJe1RTQ19PRkZTRVRfSElHSCwgMH0sCisJCXtWSVJUVUFMX0FQSUNfUEFHRV9BRERSLCAwfSwK KwkJe1ZJUlRVQUxfQVBJQ19QQUdFX0FERFJfSElHSCwgMH0sCisJCXtBUElDX0FDQ0VTU19BRERS LCAwfSwKKwkJe0FQSUNfQUNDRVNTX0FERFJfSElHSCwgMH0sCisJCXtFUFRfUE9JTlRFUiwgMH0s CisJCXtFUFRfUE9JTlRFUl9ISUdILCAwfSwKKwkJe0dVRVNUX1BIWVNJQ0FMX0FERFJFU1MsIDB9 LAorCQl7R1VFU1RfUEhZU0lDQUxfQUREUkVTU19ISUdILCAwfSwKKwkJe1ZNQ1NfTElOS19QT0lO VEVSLCAwfSwKKwkJe1ZNQ1NfTElOS19QT0lOVEVSX0hJR0gsIDB9LAorCQl7R1VFU1RfSUEzMl9E RUJVR0NUTCwgMH0sCisJCXtHVUVTVF9JQTMyX0RFQlVHQ1RMX0hJR0gsIDB9LAorCQl7R1VFU1Rf SUEzMl9QQVQsIDB9LAorCQl7R1VFU1RfSUEzMl9QQVRfSElHSCwgMH0sCisJCXtHVUVTVF9JQTMy X0VGRVIsIDB9LAorCQl7R1VFU1RfSUEzMl9FRkVSX0hJR0gsIDB9LAorCQl7R1VFU1RfSUEzMl9Q RVJGX0dMT0JBTF9DVFJMLCAwfSwKKwkJe0dVRVNUX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTF9ISUdI LCAwfSwKKwkJe0dVRVNUX1BEUFRSMCwgMH0sCisJCXtHVUVTVF9QRFBUUjBfSElHSCwgMH0sCisJ CXtHVUVTVF9QRFBUUjEsIDB9LAorCQl7R1VFU1RfUERQVFIxX0hJR0gsIDB9LAorCQl7R1VFU1Rf UERQVFIyLCAwfSwKKwkJe0dVRVNUX1BEUFRSMl9ISUdILCAwfSwKKwkJe0dVRVNUX1BEUFRSMywg MH0sCisJCXtHVUVTVF9QRFBUUjNfSElHSCwgMH0sCisJCXtIT1NUX0lBMzJfUEFULCAwfSwKKwkJ e0hPU1RfSUEzMl9QQVRfSElHSCwgMH0sCisJCXtIT1NUX0lBMzJfRUZFUiwgMH0sCisJCXtIT1NU X0lBMzJfRUZFUl9ISUdILCAwfSwKKwkJe0hPU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMLCAwfSwK KwkJe0hPU1RfSUEzMl9QRVJGX0dMT0JBTF9DVFJMX0hJR0gsIDB9LAorCQl7UElOX0JBU0VEX1ZN X0VYRUNfQ09OVFJPTCwgMH0sCisJCXtDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MLCAwfSwKKwkJ e0VYQ0VQVElPTl9CSVRNQVAsIDB9LAorCQl7UEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BU0ssIDB9 LAorCQl7UEFHRV9GQVVMVF9FUlJPUl9DT0RFX01BVENILCAwfSwKKwkJe0NSM19UQVJHRVRfQ09V TlQsIDB9LAorCQl7Vk1fRVhJVF9DT05UUk9MUywgMH0sCisJCXtWTV9FWElUX01TUl9TVE9SRV9D T1VOVCwgMH0sCisJCXtWTV9FWElUX01TUl9MT0FEX0NPVU5ULCAwfSwKKwkJe1ZNX0VOVFJZX0NP TlRST0xTLCAwfSwKKwkJe1ZNX0VOVFJZX01TUl9MT0FEX0NPVU5ULCAwfSwKKwkJe1ZNX0VOVFJZ X0lOVFJfSU5GT19GSUVMRCwgMH0sCisJCXtWTV9FTlRSWV9FWENFUFRJT05fRVJST1JfQ09ERSwg MH0sCisJCXtWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sIDB9LAorCQl7VFBSX1RIUkVTSE9MRCwg MH0sCisJCXtTRUNPTkRBUllfVk1fRVhFQ19DT05UUk9MLCAwfSwKKwkJe1BMRV9HQVAsIDB9LAor CQl7UExFX1dJTkRPVywgMH0sCisJCXtWTV9JTlNUUlVDVElPTl9FUlJPUiwgMH0sCisJCXtWTV9F WElUX1JFQVNPTiwgMH0sCisJCXtWTV9FWElUX0lOVFJfSU5GTywgMH0sCisJCXtWTV9FWElUX0lO VFJfRVJST1JfQ09ERSwgMH0sCisJCXtJRFRfVkVDVE9SSU5HX0lORk9fRklFTEQsIDB9LAorCQl7 SURUX1ZFQ1RPUklOR19FUlJPUl9DT0RFLCAwfSwKKwkJe1ZNX0VYSVRfSU5TVFJVQ1RJT05fTEVO LCAwfSwKKwkJe1ZNWF9JTlNUUlVDVElPTl9JTkZPLCAwfSwKKwkJe0dVRVNUX0VTX0xJTUlULCAw fSwKKwkJe0dVRVNUX0NTX0xJTUlULCAwfSwKKwkJe0dVRVNUX1NTX0xJTUlULCAwfSwKKwkJe0dV RVNUX0RTX0xJTUlULCAwfSwKKwkJe0dVRVNUX0ZTX0xJTUlULCAwfSwKKwkJe0dVRVNUX0dTX0xJ TUlULCAwfSwKKwkJe0dVRVNUX0xEVFJfTElNSVQsIDB9LAorCQl7R1VFU1RfVFJfTElNSVQsIDB9 LAorCQl7R1VFU1RfR0RUUl9MSU1JVCwgMH0sCisJCXtHVUVTVF9JRFRSX0xJTUlULCAwfSwKKwkJ e0dVRVNUX0VTX0FSX0JZVEVTLCAwfSwKKwkJe0dVRVNUX0NTX0FSX0JZVEVTLCAwfSwKKwkJe0dV RVNUX1NTX0FSX0JZVEVTLCAwfSwKKwkJe0dVRVNUX0RTX0FSX0JZVEVTLCAwfSwKKwkJe0dVRVNU X0ZTX0FSX0JZVEVTLCAwfSwKKwkJe0dVRVNUX0dTX0FSX0JZVEVTLCAwfSwKKwkJe0dVRVNUX0xE VFJfQVJfQllURVMsIDB9LAorCQl7R1VFU1RfVFJfQVJfQllURVMsIDB9LAorCQl7R1VFU1RfSU5U RVJSVVBUSUJJTElUWV9JTkZPLCAwfSwKKwkJe0dVRVNUX0FDVElWSVRZX1NUQVRFLCAwfSwKKwkJ e0dVRVNUX1NZU0VOVEVSX0NTLCAwfSwKKwkJe0hPU1RfSUEzMl9TWVNFTlRFUl9DUywgMH0sCisJ CXtDUjBfR1VFU1RfSE9TVF9NQVNLLCAwfSwKKwkJe0NSNF9HVUVTVF9IT1NUX01BU0ssIDB9LAor CQl7Q1IwX1JFQURfU0hBRE9XLCAwfSwKKwkJe0NSNF9SRUFEX1NIQURPVywgMH0sCisJCXtDUjNf VEFSR0VUX1ZBTFVFMCwgMH0sCisJCXtDUjNfVEFSR0VUX1ZBTFVFMSwgMH0sCisJCXtDUjNfVEFS R0VUX1ZBTFVFMiwgMH0sCisJCXtDUjNfVEFSR0VUX1ZBTFVFMywgMH0sCisJCXtFWElUX1FVQUxJ RklDQVRJT04sIDB9LAorCQl7R1VFU1RfTElORUFSX0FERFJFU1MsIDB9LAorCQl7R1VFU1RfQ1Iw LCAwfSwKKwkJe0dVRVNUX0NSMywgMH0sCisJCXtHVUVTVF9DUjQsIDB9LAorCQl7R1VFU1RfRVNf QkFTRSwgMH0sCisJCXtHVUVTVF9DU19CQVNFLCAwfSwKKwkJe0dVRVNUX1NTX0JBU0UsIDB9LAor CQl7R1VFU1RfRFNfQkFTRSwgMH0sCisJCXtHVUVTVF9GU19CQVNFLCAwfSwKKwkJe0dVRVNUX0dT X0JBU0UsIDB9LAorCQl7R1VFU1RfTERUUl9CQVNFLCAwfSwKKwkJe0dVRVNUX1RSX0JBU0UsIDB9 LAorCQl7R1VFU1RfR0RUUl9CQVNFLCAwfSwKKwkJe0dVRVNUX0lEVFJfQkFTRSwgMH0sCisJCXtH VUVTVF9EUjcsIDB9LAorCQl7R1VFU1RfUlNQLCAwfSwKKwkJe0dVRVNUX1JJUCwgMH0sCisJCXtH VUVTVF9SRkxBR1MsIDB9LAorCQl7R1VFU1RfUEVORElOR19EQkdfRVhDRVBUSU9OUywgMH0sCisJ CXtHVUVTVF9TWVNFTlRFUl9FU1AsIDB9LAorCQl7R1VFU1RfU1lTRU5URVJfRUlQLCAwfSwKKwkJ e0hPU1RfQ1IwLCAwfSwKKwkJe0hPU1RfQ1IzLCAwfSwKKwkJe0hPU1RfQ1I0LCAwfSwKKwkJe0hP U1RfRlNfQkFTRSwgMH0sCisJCXtIT1NUX0dTX0JBU0UsIDB9LAorCQl7SE9TVF9UUl9CQVNFLCAw fSwKKwkJe0hPU1RfR0RUUl9CQVNFLCAwfSwKKwkJe0hPU1RfSURUUl9CQVNFLCAwfSwKKwkJe0hP U1RfSUEzMl9TWVNFTlRFUl9FU1AsIDB9LAorCQl7SE9TVF9JQTMyX1NZU0VOVEVSX0VJUCwgMH0s CisJCXtIT1NUX1JTUCwgMH0sCisJCXtIT1NUX1JJUCwgMH0KKwl9Cit9OworCitjb25zdCBjaGFy IHZtY3NfZ3JvdXBfbmFtZVtdID0gInZtY3MiOworCitzdGF0aWMgc3NpemVfdCB2bWNzX2lkX3No b3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICph dHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwg dm1jc2luZm8udm1jc19yZXZpc2lvbl9pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaWQsIDA0 NDQsIHZtY3NfaWRfc2hvdywgTlVMTCk7CisKKyNkZWZpbmUgQlVJTERfT0ZGU0VUX1NIT1coaSwg ZmllbGRfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRp YyBzc2l6ZV90IF8jI2ZpZWxkX2NvZGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgICAgICAg ICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIs ICAgICAgICAgICAgXAorCQkJCSAgICBjaGFyICpidWYpICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNwcmludGYoYnVmLCAi JWRcbiIsIHZtY3NpbmZvLmZpZWxkX29mZnNldFtpXVsxXSk7ICAgICAgICAgICAgIFwKK30gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWVsZF9jb2RlLCAwNDQ0LCBf IyNmaWVsZF9jb2RlIyNfc2hvdywgTlVMTCk7CisKK0JVSUxEX09GRlNFVF9TSE9XKCAgMCwgMDAw MCk7IC8qIFZJUlRVQUxfUFJPQ0VTU09SX0lEICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVyggIDEsIDA4MDApOyAvKiBHVUVTVF9FU19TRUxFQ1RPUiAgICAgICAgICAgICAgICAqLwor QlVJTERfT0ZGU0VUX1NIT1coICAyLCAwODAyKTsgLyogR1VFU1RfQ1NfU0VMRUNUT1IgICAgICAg ICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAgMywgMDgwNCk7IC8qIEdVRVNUX1NTX1NF TEVDVE9SICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggIDQsIDA4MDYpOyAv KiBHVUVTVF9EU19TRUxFQ1RPUiAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1co ICA1LCAwODA4KTsgLyogR1VFU1RfRlNfU0VMRUNUT1IgICAgICAgICAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKCAgNiwgMDgwYSk7IC8qIEdVRVNUX0dTX1NFTEVDVE9SICAgICAgICAgICAg ICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggIDcsIDA4MGMpOyAvKiBHVUVTVF9MRFRSX1NFTEVD VE9SICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coICA4LCAwODBlKTsgLyogR1VF U1RfVFJfU0VMRUNUT1IgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAgOSwg MGMwMCk7IC8qIEhPU1RfRVNfU0VMRUNUT1IgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZT RVRfU0hPVyggMTAsIDBjMDIpOyAvKiBIT1NUX0NTX1NFTEVDVE9SICAgICAgICAgICAgICAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coIDExLCAwYzA0KTsgLyogSE9TVF9TU19TRUxFQ1RPUiAgICAg ICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAxMiwgMGMwNik7IC8qIEhPU1RfRFNf U0VMRUNUT1IgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMTMsIDBjMDgp OyAvKiBIT1NUX0ZTX1NFTEVDVE9SICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coIDE0LCAwYzBhKTsgLyogSE9TVF9HU19TRUxFQ1RPUiAgICAgICAgICAgICAgICAgKi8KK0JV SUxEX09GRlNFVF9TSE9XKCAxNSwgMGMwYyk7IC8qIEhPU1RfVFJfU0VMRUNUT1IgICAgICAgICAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMTYsIDIwMDApOyAvKiBJT19CSVRNQVBfQSAg ICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDE3LCAyMDAxKTsgLyog SU9fQklUTUFQX0FfSElHSCAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAx OCwgMjAwMik7IC8qIElPX0JJVE1BUF9CICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVyggMTksIDIwMDMpOyAvKiBJT19CSVRNQVBfQl9ISUdIICAgICAgICAgICAgICAg ICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDIwLCAyMDA0KTsgLyogTVNSX0JJVE1BUCAgICAgICAg ICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAyMSwgMjAwNSk7IC8qIE1TUl9C SVRNQVBfSElHSCAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMjIsIDIw MDYpOyAvKiBWTV9FWElUX01TUl9TVE9SRV9BRERSICAgICAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coIDIzLCAyMDA3KTsgLyogVk1fRVhJVF9NU1JfU1RPUkVfQUREUl9ISUdIICAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKCAyNCwgMjAwOCk7IC8qIFZNX0VYSVRfTVNSX0xPQURfQUREUiAg ICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMjUsIDIwMDkpOyAvKiBWTV9FWElUX01T Ul9MT0FEX0FERFJfSElHSCAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDI2LCAyMDBhKTsg LyogVk1fRU5UUllfTVNSX0xPQURfQUREUiAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9X KCAyNywgMjAwYik7IC8qIFZNX0VOVFJZX01TUl9MT0FEX0FERFJfSElHSCAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVyggMjgsIDIwMTApOyAvKiBUU0NfT0ZGU0VUICAgICAgICAgICAgICAgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDI5LCAyMDExKTsgLyogVFNDX09GRlNFVF9ISUdI ICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAzMCwgMjAxMik7IC8qIFZJ UlRVQUxfQVBJQ19QQUdFX0FERFIgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMzEs IDIwMTMpOyAvKiBWSVJUVUFMX0FQSUNfUEFHRV9BRERSX0hJR0ggICAgICAqLworQlVJTERfT0ZG U0VUX1NIT1coIDMyLCAyMDE0KTsgLyogQVBJQ19BQ0NFU1NfQUREUiAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKCAzMywgMjAxNSk7IC8qIEFQSUNfQUNDRVNTX0FERFJfSElH SCAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggMzQsIDIwMWEpOyAvKiBFUFRfUE9J TlRFUiAgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDM1LCAyMDFi KTsgLyogRVBUX1BPSU5URVJfSElHSCAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKCAzNiwgMjQwMCk7IC8qIEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICovCitC VUlMRF9PRkZTRVRfU0hPVyggMzcsIDI0MDEpOyAvKiBHVUVTVF9QSFlTSUNBTF9BRERSRVNTX0hJ R0ggICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDM4LCAyODAwKTsgLyogVk1DU19MSU5LX1BP SU5URVIgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCAzOSwgMjgwMSk7IC8q IFZNQ1NfTElOS19QT0lOVEVSX0hJR0ggICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygg NDAsIDI4MDIpOyAvKiBHVUVTVF9JQTMyX0RFQlVHQ1RMICAgICAgICAgICAgICAqLworQlVJTERf T0ZGU0VUX1NIT1coIDQxLCAyODAzKTsgLyogR1VFU1RfSUEzMl9ERUJVR0NUTF9ISUdIICAgICAg ICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA0MiwgMjgwNCk7IC8qIEdVRVNUX0lBMzJfUEFUICAg ICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNDMsIDI4MDUpOyAvKiBHVUVT VF9JQTMyX1BBVF9ISUdIICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDQ0LCAy ODA2KTsgLyogR1VFU1RfSUEzMl9FRkVSICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNF VF9TSE9XKCA0NSwgMjgwNyk7IC8qIEdVRVNUX0lBMzJfRUZFUl9ISUdIICAgICAgICAgICAgICov CitCVUlMRF9PRkZTRVRfU0hPVyggNDYsIDI4MDgpOyAvKiBHVUVTVF9JQTMyX1BFUkZfR0xPQkFM X0NUUkwgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDQ3LCAyODA5KTsgLyogR1VFU1RfSUEz Ml9QRVJGX0dMT0JBTF9DVFJMX0hJR0ggKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA0OCwgMjgwYSk7 IC8qIEdVRVNUX1BEUFRSMCAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hP VyggNDksIDI4MGIpOyAvKiBHVUVTVF9QRFBUUjBfSElHSCAgICAgICAgICAgICAgICAqLworQlVJ TERfT0ZGU0VUX1NIT1coIDUwLCAyODBjKTsgLyogR1VFU1RfUERQVFIxICAgICAgICAgICAgICAg ICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA1MSwgMjgwZCk7IC8qIEdVRVNUX1BEUFRSMV9I SUdIICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNTIsIDI4MGUpOyAvKiBH VUVTVF9QRFBUUjIgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDUz LCAyODBmKTsgLyogR1VFU1RfUERQVFIyX0hJR0ggICAgICAgICAgICAgICAgKi8KK0JVSUxEX09G RlNFVF9TSE9XKCA1NCwgMjgxMCk7IC8qIEdVRVNUX1BEUFRSMyAgICAgICAgICAgICAgICAgICAg ICovCitCVUlMRF9PRkZTRVRfU0hPVyggNTUsIDI4MTEpOyAvKiBHVUVTVF9QRFBUUjNfSElHSCAg ICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDU2LCAyYzAwKTsgLyogSE9TVF9J QTMyX1BBVCAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA1NywgMmMw MSk7IC8qIEhPU1RfSUEzMl9QQVRfSElHSCAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVyggNTgsIDJjMDIpOyAvKiBIT1NUX0lBMzJfRUZFUiAgICAgICAgICAgICAgICAgICAqLwor QlVJTERfT0ZGU0VUX1NIT1coIDU5LCAyYzAzKTsgLyogSE9TVF9JQTMyX0VGRVJfSElHSCAgICAg ICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA2MCwgMmMwNCk7IC8qIEhPU1RfSUEzMl9Q RVJGX0dMT0JBTF9DVFJMICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNjEsIDJjMDUpOyAv KiBIT1NUX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTF9ISUdIICAqLworQlVJTERfT0ZGU0VUX1NIT1co IDYyLCA0MDAwKTsgLyogUElOX0JBU0VEX1ZNX0VYRUNfQ09OVFJPTCAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKCA2MywgNDAwMik7IC8qIENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wgICAg ICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNjQsIDQwMDQpOyAvKiBFWENFUFRJT05fQklUTUFQ ICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDY1LCA0MDA2KTsgLyogUEFH RV9GQVVMVF9FUlJPUl9DT0RFX01BU0sgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA2Niwg NDAwOCk7IC8qIFBBR0VfRkFVTFRfRVJST1JfQ09ERV9NQVRDSCAgICAgICovCitCVUlMRF9PRkZT RVRfU0hPVyggNjcsIDQwMGEpOyAvKiBDUjNfVEFSR0VUX0NPVU5UICAgICAgICAgICAgICAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coIDY4LCA0MDBjKTsgLyogVk1fRVhJVF9DT05UUk9MUyAgICAg ICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA2OSwgNDAwZSk7IC8qIFZNX0VYSVRf TVNSX1NUT1JFX0NPVU5UICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNzAsIDQwMTAp OyAvKiBWTV9FWElUX01TUl9MT0FEX0NPVU5UICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coIDcxLCA0MDEyKTsgLyogVk1fRU5UUllfQ09OVFJPTFMgICAgICAgICAgICAgICAgKi8KK0JV SUxEX09GRlNFVF9TSE9XKCA3MiwgNDAxNCk7IC8qIFZNX0VOVFJZX01TUl9MT0FEX0NPVU5UICAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNzMsIDQwMTYpOyAvKiBWTV9FTlRSWV9JTlRS X0lORk9fRklFTEQgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDc0LCA0MDE4KTsgLyog Vk1fRU5UUllfRVhDRVBUSU9OX0VSUk9SX0NPREUgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA3 NSwgNDAxYSk7IC8qIFZNX0VOVFJZX0lOU1RSVUNUSU9OX0xFTiAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVyggNzYsIDQwMWMpOyAvKiBUUFJfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAg ICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDc3LCA0MDFlKTsgLyogU0VDT05EQVJZX1ZNX0VYRUNf Q09OVFJPTCAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA3OCwgNDAyMCk7IC8qIFBMRV9H QVAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggNzksIDQw MjIpOyAvKiBQTEVfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coIDgwLCA0NDAwKTsgLyogVk1fSU5TVFJVQ1RJT05fRVJST1IgICAgICAgICAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKCA4MSwgNDQwMik7IC8qIFZNX0VYSVRfUkVBU09OICAgICAgICAg ICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggODIsIDQ0MDQpOyAvKiBWTV9FWElUX0lO VFJfSU5GTyAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDgzLCA0NDA2KTsg LyogVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9X KCA4NCwgNDQwOCk7IC8qIElEVF9WRUNUT1JJTkdfSU5GT19GSUVMRCAgICAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVyggODUsIDQ0MGEpOyAvKiBJRFRfVkVDVE9SSU5HX0VSUk9SX0NPREUgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDg2LCA0NDBjKTsgLyogVk1fRVhJVF9JTlNUUlVD VElPTl9MRU4gICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA4NywgNDQwZSk7IC8qIFZN WF9JTlNUUlVDVElPTl9JTkZPICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggODgs IDQ4MDApOyAvKiBHVUVTVF9FU19MSU1JVCAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZG U0VUX1NIT1coIDg5LCA0ODAyKTsgLyogR1VFU1RfQ1NfTElNSVQgICAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKCA5MCwgNDgwNCk7IC8qIEdVRVNUX1NTX0xJTUlUICAgICAg ICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVyggOTEsIDQ4MDYpOyAvKiBHVUVTVF9E U19MSU1JVCAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDkyLCA0ODA4 KTsgLyogR1VFU1RfRlNfTElNSVQgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKCA5MywgNDgwYSk7IC8qIEdVRVNUX0dTX0xJTUlUICAgICAgICAgICAgICAgICAgICovCitC VUlMRF9PRkZTRVRfU0hPVyggOTQsIDQ4MGMpOyAvKiBHVUVTVF9MRFRSX0xJTUlUICAgICAgICAg ICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coIDk1LCA0ODBlKTsgLyogR1VFU1RfVFJfTElN SVQgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA5NiwgNDgxMCk7IC8q IEdVRVNUX0dEVFJfTElNSVQgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygg OTcsIDQ4MTIpOyAvKiBHVUVTVF9JRFRSX0xJTUlUICAgICAgICAgICAgICAgICAqLworQlVJTERf T0ZGU0VUX1NIT1coIDk4LCA0ODE0KTsgLyogR1VFU1RfRVNfQVJfQllURVMgICAgICAgICAgICAg ICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKCA5OSwgNDgxNik7IC8qIEdVRVNUX0NTX0FSX0JZVEVT ICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMDAsIDQ4MTgpOyAvKiBHVUVT VF9TU19BUl9CWVRFUyAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTAxLCA0 ODFhKTsgLyogR1VFU1RfRFNfQVJfQllURVMgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNF VF9TSE9XKDEwMiwgNDgxYyk7IC8qIEdVRVNUX0ZTX0FSX0JZVEVTICAgICAgICAgICAgICAgICov CitCVUlMRF9PRkZTRVRfU0hPVygxMDMsIDQ4MWUpOyAvKiBHVUVTVF9HU19BUl9CWVRFUyAgICAg ICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTA0LCA0ODIwKTsgLyogR1VFU1RfTERU Ul9BUl9CWVRFUyAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEwNSwgNDgyMik7 IC8qIEdVRVNUX1RSX0FSX0JZVEVTICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hP VygxMDYsIDQ4MjQpOyAvKiBHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8gICAgICAqLworQlVJ TERfT0ZGU0VUX1NIT1coMTA3LCA0ODI2KTsgLyogR1VFU1RfQUNUSVZJVFlfU1RBVEUgICAgICAg ICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEwOCwgNDgyQSk7IC8qIEdVRVNUX1NZU0VOVEVS X0NTICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMDksIDRjMDApOyAvKiBI T1NUX0lBMzJfU1lTRU5URVJfQ1MgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTEw LCA2MDAwKTsgLyogQ1IwX0dVRVNUX0hPU1RfTUFTSyAgICAgICAgICAgICAgKi8KK0JVSUxEX09G RlNFVF9TSE9XKDExMSwgNjAwMik7IC8qIENSNF9HVUVTVF9IT1NUX01BU0sgICAgICAgICAgICAg ICovCitCVUlMRF9PRkZTRVRfU0hPVygxMTIsIDYwMDQpOyAvKiBDUjBfUkVBRF9TSEFET1cgICAg ICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTEzLCA2MDA2KTsgLyogQ1I0X1JF QURfU0hBRE9XICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDExNCwgNjAw OCk7IC8qIENSM19UQVJHRVRfVkFMVUUwICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRf U0hPVygxMTUsIDYwMGEpOyAvKiBDUjNfVEFSR0VUX1ZBTFVFMSAgICAgICAgICAgICAgICAqLwor QlVJTERfT0ZGU0VUX1NIT1coMTE2LCA2MDBjKTsgLyogQ1IzX1RBUkdFVF9WQUxVRTIgICAgICAg ICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDExNywgNjAwZSk7IC8qIENSM19UQVJHRVRf VkFMVUUzICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMTgsIDY0MDApOyAv KiBFWElUX1FVQUxJRklDQVRJT04gICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1co MTE5LCA2NDBhKTsgLyogR1VFU1RfTElORUFSX0FERFJFU1MgICAgICAgICAgICAgKi8KK0JVSUxE X09GRlNFVF9TSE9XKDEyMCwgNjgwMCk7IC8qIEdVRVNUX0NSMCAgICAgICAgICAgICAgICAgICAg ICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMjEsIDY4MDIpOyAvKiBHVUVTVF9DUjMgICAgICAg ICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTIyLCA2ODA0KTsgLyogR1VF U1RfQ1I0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEyMywg NjgwNik7IC8qIEdVRVNUX0VTX0JBU0UgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZT RVRfU0hPVygxMjQsIDY4MDgpOyAvKiBHVUVTVF9DU19CQVNFICAgICAgICAgICAgICAgICAgICAq LworQlVJTERfT0ZGU0VUX1NIT1coMTI1LCA2ODBhKTsgLyogR1VFU1RfU1NfQkFTRSAgICAgICAg ICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEyNiwgNjgwYyk7IC8qIEdVRVNUX0RT X0JBU0UgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMjcsIDY4MGUp OyAvKiBHVUVTVF9GU19CQVNFICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NI T1coMTI4LCA2ODEwKTsgLyogR1VFU1RfR1NfQkFTRSAgICAgICAgICAgICAgICAgICAgKi8KK0JV SUxEX09GRlNFVF9TSE9XKDEyOSwgNjgxMik7IC8qIEdVRVNUX0xEVFJfQkFTRSAgICAgICAgICAg ICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMzAsIDY4MTQpOyAvKiBHVUVTVF9UUl9CQVNF ICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTMxLCA2ODE2KTsgLyog R1VFU1RfR0RUUl9CQVNFICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEz MiwgNjgxOCk7IC8qIEdVRVNUX0lEVFJfQkFTRSAgICAgICAgICAgICAgICAgICovCitCVUlMRF9P RkZTRVRfU0hPVygxMzMsIDY4MWEpOyAvKiBHVUVTVF9EUjcgICAgICAgICAgICAgICAgICAgICAg ICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTM0LCA2ODFjKTsgLyogR1VFU1RfUlNQICAgICAgICAg ICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDEzNSwgNjgxZSk7IC8qIEdVRVNU X1JJUCAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMzYsIDY4 MjApOyAvKiBHVUVTVF9SRkxBR1MgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VU X1NIT1coMTM3LCA2ODIyKTsgLyogR1VFU1RfUEVORElOR19EQkdfRVhDRVBUSU9OUyAgICAgKi8K K0JVSUxEX09GRlNFVF9TSE9XKDEzOCwgNjgyNCk7IC8qIEdVRVNUX1NZU0VOVEVSX0VTUCAgICAg ICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxMzksIDY4MjYpOyAvKiBHVUVTVF9TWVNF TlRFUl9FSVAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTQwLCA2YzAwKTsg LyogSE9TVF9DUjAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9X KDE0MSwgNmMwMik7IC8qIEhPU1RfQ1IzICAgICAgICAgICAgICAgICAgICAgICAgICovCitCVUlM RF9PRkZTRVRfU0hPVygxNDIsIDZjMDQpOyAvKiBIT1NUX0NSNCAgICAgICAgICAgICAgICAgICAg ICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTQzLCA2YzA2KTsgLyogSE9TVF9GU19CQVNFICAg ICAgICAgICAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9TSE9XKDE0NCwgNmMwOCk7IC8qIEhP U1RfR1NfQkFTRSAgICAgICAgICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxNDUs IDZjMGEpOyAvKiBIT1NUX1RSX0JBU0UgICAgICAgICAgICAgICAgICAgICAqLworQlVJTERfT0ZG U0VUX1NIT1coMTQ2LCA2YzBjKTsgLyogSE9TVF9HRFRSX0JBU0UgICAgICAgICAgICAgICAgICAg Ki8KK0JVSUxEX09GRlNFVF9TSE9XKDE0NywgNmMwZSk7IC8qIEhPU1RfSURUUl9CQVNFICAgICAg ICAgICAgICAgICAgICovCitCVUlMRF9PRkZTRVRfU0hPVygxNDgsIDZjMTApOyAvKiBIT1NUX0lB MzJfU1lTRU5URVJfRVNQICAgICAgICAgICAqLworQlVJTERfT0ZGU0VUX1NIT1coMTQ5LCA2YzEy KTsgLyogSE9TVF9JQTMyX1NZU0VOVEVSX0VJUCAgICAgICAgICAgKi8KK0JVSUxEX09GRlNFVF9T SE9XKDE1MCwgNmMxNCk7IC8qIEhPU1RfUlNQICAgICAgICAgICAgICAgICAgICAgICAgICovCitC VUlMRF9PRkZTRVRfU0hPVygxNTEsIDZjMTYpOyAvKiBIT1NUX1JJUCAgICAgICAgICAgICAgICAg ICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdm1jc19hdHRyc1tdID0gewor CSZkZXZfYXR0cl9pZC5hdHRyLAorCSZkZXZfYXR0cl8wMDAwLmF0dHIsCisJJmRldl9hdHRyXzA4 MDAuYXR0ciwKKwkmZGV2X2F0dHJfMDgwMi5hdHRyLAorCSZkZXZfYXR0cl8wODA0LmF0dHIsCisJ JmRldl9hdHRyXzA4MDYuYXR0ciwKKwkmZGV2X2F0dHJfMDgwOC5hdHRyLAorCSZkZXZfYXR0cl8w ODBhLmF0dHIsCisJJmRldl9hdHRyXzA4MGMuYXR0ciwKKwkmZGV2X2F0dHJfMDgwZS5hdHRyLAor CSZkZXZfYXR0cl8wYzAwLmF0dHIsCisJJmRldl9hdHRyXzBjMDIuYXR0ciwKKwkmZGV2X2F0dHJf MGMwNC5hdHRyLAorCSZkZXZfYXR0cl8wYzA2LmF0dHIsCisJJmRldl9hdHRyXzBjMDguYXR0ciwK KwkmZGV2X2F0dHJfMGMwYS5hdHRyLAorCSZkZXZfYXR0cl8wYzBjLmF0dHIsCisJJmRldl9hdHRy XzIwMDAuYXR0ciwKKwkmZGV2X2F0dHJfMjAwMS5hdHRyLAorCSZkZXZfYXR0cl8yMDAyLmF0dHIs CisJJmRldl9hdHRyXzIwMDMuYXR0ciwKKwkmZGV2X2F0dHJfMjAwNC5hdHRyLAorCSZkZXZfYXR0 cl8yMDA1LmF0dHIsCisJJmRldl9hdHRyXzIwMDYuYXR0ciwKKwkmZGV2X2F0dHJfMjAwNy5hdHRy LAorCSZkZXZfYXR0cl8yMDA4LmF0dHIsCisJJmRldl9hdHRyXzIwMDkuYXR0ciwKKwkmZGV2X2F0 dHJfMjAwYS5hdHRyLAorCSZkZXZfYXR0cl8yMDBiLmF0dHIsCisJJmRldl9hdHRyXzIwMTAuYXR0 ciwKKwkmZGV2X2F0dHJfMjAxMS5hdHRyLAorCSZkZXZfYXR0cl8yMDEyLmF0dHIsCisJJmRldl9h dHRyXzIwMTMuYXR0ciwKKwkmZGV2X2F0dHJfMjAxNC5hdHRyLAorCSZkZXZfYXR0cl8yMDE1LmF0 dHIsCisJJmRldl9hdHRyXzIwMWEuYXR0ciwKKwkmZGV2X2F0dHJfMjAxYi5hdHRyLAorCSZkZXZf YXR0cl8yNDAwLmF0dHIsCisJJmRldl9hdHRyXzI0MDEuYXR0ciwKKwkmZGV2X2F0dHJfMjgwMC5h dHRyLAorCSZkZXZfYXR0cl8yODAxLmF0dHIsCisJJmRldl9hdHRyXzI4MDIuYXR0ciwKKwkmZGV2 X2F0dHJfMjgwMy5hdHRyLAorCSZkZXZfYXR0cl8yODA0LmF0dHIsCisJJmRldl9hdHRyXzI4MDUu YXR0ciwKKwkmZGV2X2F0dHJfMjgwNi5hdHRyLAorCSZkZXZfYXR0cl8yODA3LmF0dHIsCisJJmRl dl9hdHRyXzI4MDguYXR0ciwKKwkmZGV2X2F0dHJfMjgwOS5hdHRyLAorCSZkZXZfYXR0cl8yODBh LmF0dHIsCisJJmRldl9hdHRyXzI4MGIuYXR0ciwKKwkmZGV2X2F0dHJfMjgwYy5hdHRyLAorCSZk ZXZfYXR0cl8yODBkLmF0dHIsCisJJmRldl9hdHRyXzI4MGUuYXR0ciwKKwkmZGV2X2F0dHJfMjgw Zi5hdHRyLAorCSZkZXZfYXR0cl8yODEwLmF0dHIsCisJJmRldl9hdHRyXzI4MTEuYXR0ciwKKwkm ZGV2X2F0dHJfMmMwMC5hdHRyLAorCSZkZXZfYXR0cl8yYzAxLmF0dHIsCisJJmRldl9hdHRyXzJj MDIuYXR0ciwKKwkmZGV2X2F0dHJfMmMwMy5hdHRyLAorCSZkZXZfYXR0cl8yYzA0LmF0dHIsCisJ JmRldl9hdHRyXzJjMDUuYXR0ciwKKwkmZGV2X2F0dHJfNDAwMC5hdHRyLAorCSZkZXZfYXR0cl80 MDAyLmF0dHIsCisJJmRldl9hdHRyXzQwMDQuYXR0ciwKKwkmZGV2X2F0dHJfNDAwNi5hdHRyLAor CSZkZXZfYXR0cl80MDA4LmF0dHIsCisJJmRldl9hdHRyXzQwMGEuYXR0ciwKKwkmZGV2X2F0dHJf NDAwYy5hdHRyLAorCSZkZXZfYXR0cl80MDBlLmF0dHIsCisJJmRldl9hdHRyXzQwMTAuYXR0ciwK KwkmZGV2X2F0dHJfNDAxMi5hdHRyLAorCSZkZXZfYXR0cl80MDE0LmF0dHIsCisJJmRldl9hdHRy XzQwMTYuYXR0ciwKKwkmZGV2X2F0dHJfNDAxOC5hdHRyLAorCSZkZXZfYXR0cl80MDFhLmF0dHIs CisJJmRldl9hdHRyXzQwMWMuYXR0ciwKKwkmZGV2X2F0dHJfNDAxZS5hdHRyLAorCSZkZXZfYXR0 cl80MDIwLmF0dHIsCisJJmRldl9hdHRyXzQwMjIuYXR0ciwKKwkmZGV2X2F0dHJfNDQwMC5hdHRy LAorCSZkZXZfYXR0cl80NDAyLmF0dHIsCisJJmRldl9hdHRyXzQ0MDQuYXR0ciwKKwkmZGV2X2F0 dHJfNDQwNi5hdHRyLAorCSZkZXZfYXR0cl80NDA4LmF0dHIsCisJJmRldl9hdHRyXzQ0MGEuYXR0 ciwKKwkmZGV2X2F0dHJfNDQwYy5hdHRyLAorCSZkZXZfYXR0cl80NDBlLmF0dHIsCisJJmRldl9h dHRyXzQ4MDAuYXR0ciwKKwkmZGV2X2F0dHJfNDgwMi5hdHRyLAorCSZkZXZfYXR0cl80ODA0LmF0 dHIsCisJJmRldl9hdHRyXzQ4MDYuYXR0ciwKKwkmZGV2X2F0dHJfNDgwOC5hdHRyLAorCSZkZXZf YXR0cl80ODBhLmF0dHIsCisJJmRldl9hdHRyXzQ4MGMuYXR0ciwKKwkmZGV2X2F0dHJfNDgwZS5h dHRyLAorCSZkZXZfYXR0cl80ODEwLmF0dHIsCisJJmRldl9hdHRyXzQ4MTIuYXR0ciwKKwkmZGV2 X2F0dHJfNDgxNC5hdHRyLAorCSZkZXZfYXR0cl80ODE2LmF0dHIsCisJJmRldl9hdHRyXzQ4MTgu YXR0ciwKKwkmZGV2X2F0dHJfNDgxYS5hdHRyLAorCSZkZXZfYXR0cl80ODFjLmF0dHIsCisJJmRl dl9hdHRyXzQ4MWUuYXR0ciwKKwkmZGV2X2F0dHJfNDgyMC5hdHRyLAorCSZkZXZfYXR0cl80ODIy LmF0dHIsCisJJmRldl9hdHRyXzQ4MjQuYXR0ciwKKwkmZGV2X2F0dHJfNDgyNi5hdHRyLAorCSZk ZXZfYXR0cl80ODJBLmF0dHIsCisJJmRldl9hdHRyXzRjMDAuYXR0ciwKKwkmZGV2X2F0dHJfNjAw MC5hdHRyLAorCSZkZXZfYXR0cl82MDAyLmF0dHIsCisJJmRldl9hdHRyXzYwMDQuYXR0ciwKKwkm ZGV2X2F0dHJfNjAwNi5hdHRyLAorCSZkZXZfYXR0cl82MDA4LmF0dHIsCisJJmRldl9hdHRyXzYw MGEuYXR0ciwKKwkmZGV2X2F0dHJfNjAwYy5hdHRyLAorCSZkZXZfYXR0cl82MDBlLmF0dHIsCisJ JmRldl9hdHRyXzY0MDAuYXR0ciwKKwkmZGV2X2F0dHJfNjQwYS5hdHRyLAorCSZkZXZfYXR0cl82 ODAwLmF0dHIsCisJJmRldl9hdHRyXzY4MDIuYXR0ciwKKwkmZGV2X2F0dHJfNjgwNC5hdHRyLAor CSZkZXZfYXR0cl82ODA2LmF0dHIsCisJJmRldl9hdHRyXzY4MDguYXR0ciwKKwkmZGV2X2F0dHJf NjgwYS5hdHRyLAorCSZkZXZfYXR0cl82ODBjLmF0dHIsCisJJmRldl9hdHRyXzY4MGUuYXR0ciwK KwkmZGV2X2F0dHJfNjgxMC5hdHRyLAorCSZkZXZfYXR0cl82ODEyLmF0dHIsCisJJmRldl9hdHRy XzY4MTQuYXR0ciwKKwkmZGV2X2F0dHJfNjgxNi5hdHRyLAorCSZkZXZfYXR0cl82ODE4LmF0dHIs CisJJmRldl9hdHRyXzY4MWEuYXR0ciwKKwkmZGV2X2F0dHJfNjgxYy5hdHRyLAorCSZkZXZfYXR0 cl82ODFlLmF0dHIsCisJJmRldl9hdHRyXzY4MjAuYXR0ciwKKwkmZGV2X2F0dHJfNjgyMi5hdHRy LAorCSZkZXZfYXR0cl82ODI0LmF0dHIsCisJJmRldl9hdHRyXzY4MjYuYXR0ciwKKwkmZGV2X2F0 dHJfNmMwMC5hdHRyLAorCSZkZXZfYXR0cl82YzAyLmF0dHIsCisJJmRldl9hdHRyXzZjMDQuYXR0 ciwKKwkmZGV2X2F0dHJfNmMwNi5hdHRyLAorCSZkZXZfYXR0cl82YzA4LmF0dHIsCisJJmRldl9h dHRyXzZjMGEuYXR0ciwKKwkmZGV2X2F0dHJfNmMwYy5hdHRyLAorCSZkZXZfYXR0cl82YzBlLmF0 dHIsCisJJmRldl9hdHRyXzZjMTAuYXR0ciwKKwkmZGV2X2F0dHJfNmMxMi5hdHRyLAorCSZkZXZf YXR0cl82YzE0LmF0dHIsCisJJmRldl9hdHRyXzZjMTYuYXR0ciwKKwlOVUxMLAorfTsKKworc3Rh dGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdm1jc19hdHRyX2dyb3VwID0geworCS5uYW1lID0g dm1jc19ncm91cF9uYW1lLAorCS5hdHRycyA9IHZtY3NfYXR0cnMsCit9OworCisjZGVmaW5lIFZN Q1NJTkZPX01BWF9GSUVMRCAoQVJSQVlfU0laRSh2bWNzX2F0dHJzKSAtIDEpCisKK3N0YXRpYyBp bmxpbmUgdm9pZCB2bWNzaW5mb19yZXZpc2lvbl9pZCh1MzIgaWQpCit7CisJdm1jc2luZm8udm1j c19yZXZpc2lvbl9pZCA9IGlkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm1jc2luZm9fZmll bGQoaW50IGksIHUxNiBvZmZzZXQpCit7CisJaWYgKGkgPCBWTUNTSU5GT19NQVhfRklFTEQpCisJ CXZtY3NpbmZvLmZpZWxkX29mZnNldFtpXVsxXSA9IG9mZnNldDsKK30KKworLyoKKyAqIEZvciBj YWN1bGF0aW5nIG9mZnNldHMgb2YgZmllbGRzIGluIFZNQ1MgZGF0YSwgd2UgaW5kZXggZXZlcnkg MTYtYml0CisgKiBmaWVsZCBieSB0aGlzIGtpbmQgb2YgZm9ybWF0OgorICogICAgICAgICB8IC0t LS0tLS0tLSAxNiBiaXRzIC0tLS0tLS0tLS0gfAorICogICAgICAgICArLS0tLS0tLS0tLS0tLSst Ky0tLS0tLS0tLS0tLSstKworICogICAgICAgICB8IGhpZ2ggNyBiaXRzIHwxfCBsb3cgNyBiaXRz IHwwfAorICogICAgICAgICArLS0tLS0tLS0tLS0tLSstKy0tLS0tLS0tLS0tLSstKworICogSW4g aGlnaCBieXRlLCB0aGUgbG93ZXN0IGJpdCBtdXN0IGJlIDE7IEluIGxvdyBieXRlLCB0aGUgbG93 ZXN0IGJpdAorICogbXVzdCBiZSAwLiBUaGUgdHdvIGJpdHMgYXJlIHNldCBsaWtlIHRoaXMgaW4g Y2FzZSBpbmRleGVzIGluIFZNQ1MKKyAqIGRhdGEgYXJlIHJlYWQgYXMgYmlnIGVuZGlhbiBtb2Rl LgorICogVGhlIHJlbWFpbmluZyAxNCBiaXRzIG9mIHRoZSBpbmRleCBpbmRpY2F0ZSB0aGUgcmVh bCBvZmZzZXQgb2YgdGhlCisgKiBmaWVsZC4gQmVjYXVzZSB0aGUgc2l6ZSBvZiBhIFZNQ1MgcmVn aW9uIGlzIGF0IG1vc3QgNCBLQnl0ZXMsIHNvCisgKiAxNCBiaXRzIGFyZSBlbm91Z2ggdG8gaW5k ZXggdGhlIHdob2xlIFZNQ1MgcmVnaW9uLgorICoKKyAqIEVOQ09ESU5HX09GRlNFVDogZW5jb2Rl IHRoZSBvZmZzZXQgaW50byB0aGUgaW5kZXggb2YgdGhpcyBraW5kLgorICogREVDT0RJTkdfT0ZG U0VUOiBkZWNvZGUgdGhlIGluZGV4IG9mIHRoaXMga2luZCBpbnRvIHJlYWwgb2Zmc2V0LgorICov CisjZGVmaW5lIE9GRlNFVF9ISUdIX1NISUZUICg3KQorI2RlZmluZSBPRkZTRVRfTE9XX01BU0sg ICAoKDEgPDwgT0ZGU0VUX0hJR0hfU0hJRlQpIC0gMSkgLyogMHg3ZiAqLworI2RlZmluZSBPRkZT RVRfSElHSF9NQVNLICAoT0ZGU0VUX0xPV19NQVNLIDw8IE9GRlNFVF9ISUdIX1NISUZUKSAvKiAw eDNmODAgKi8KKyNkZWZpbmUgRU5DT0RJTkdfT0ZGU0VUKG9mZnNldCkgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAorCSgoKChvZmZzZXQpICYgT0ZGU0VUX0xPV19NQVNLKSA8 PCAxKSArICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKCgob2Zmc2V0KSAmIE9GRlNFVF9ISUdI X01BU0spIDw8IDIpIHwgMHgxMDApKQorLyoKKyAqIGluZGV4IGhlcmUgc2hvdWxkIGJlIGFsd2F5 cyByZWFkIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KKyAqLworI2RlZmluZSBERUNPRElOR19PRkZT RVRfTEUoaW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCgoKGlu ZGV4KSA+PiAxKSAmIE9GRlNFVF9MT1dfTUFTSykgKyAgICAgICAgICAgICAgICAgICAgICAgXAor CSgoKGluZGV4KSA+PiAyKSAmIE9GRlNFVF9ISUdIX01BU0spKQorLyoKKyAqIG4gaW5kaWNhdGVz IHRoZSBiaXRzIG9mIGluZGV4LiBXZSBmaXJzdCBjaGVjayBpZiBpbmRleAorICogaXMgcmVhZCBp biBiaWcgZW5kaWFuIG1vZGUuCisgKi8KKyNkZWZpbmUgREVDT0RJTkdfT0ZGU0VUKGluZGV4LCBu KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSgoaW5kZXggJiAxKSA/IChE RUNPRElOR19PRkZTRVRfTEUoX19zd2FiIyNuKGluZGV4KSkpIDogICAgIFwKKwkoREVDT0RJTkdf T0ZGU0VUX0xFKGluZGV4KSkpCisKKyNkZWZpbmUgRklFTERfT0ZGU0VUMTYoaSwgb2Zmc2V0KSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZtY3NpbmZvX2ZpZWxkKGksIERF Q09ESU5HX09GRlNFVChvZmZzZXQsIDE2KSkKKyNkZWZpbmUgRklFTERfT0ZGU0VUNjQoaSwgb2Zm c2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZtY3NpbmZvX2ZpZWxk KGksIERFQ09ESU5HX09GRlNFVChvZmZzZXQsIDY0KSkKKyNkZWZpbmUgRklFTERfT0ZGU0VUMzIo aSwgb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXZtY3NpbmZv X2ZpZWxkKGksIERFQ09ESU5HX09GRlNFVChvZmZzZXQsIDMyKSkKKyNkZWZpbmUgRklFTERfT0ZG U0VUTlcoaSwgb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8g eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisJaWYgKHNpemVvZihvZmZzZXQpID09IDgpICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAorCQl2bWNzaW5mb19maWVsZChpLCBERUNPRElOR19PRkZTRVQob2Zm c2V0LCA2NCkpOyAgICAgXAorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKKwkJdm1jc2luZm9fZmllbGQoaSwgREVDT0RJTkdfT0ZG U0VUKG9mZnNldCwgMzIpKTsgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVk1DU19GSUVM RF9DSEVDSyhpLCBvZmZzZXQsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8g eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCisJaWYgKHZtY3NfcmVhZDMyKFZNX0lOU1RSVUNUSU9OX0VSUk9SKSAhPSAgICAg ICAgICAgICAgICAgICAgXAorCQlWTVhFUlJfVU5TVVBQT1JURURfVk1DU19DT01QT05FTlQpICAg ICAgICAgICAgICAgICAgXAorCQlGSUVMRF9PRkZTRVQjI3R5cGUoaSwgb2Zmc2V0KTsgICAgICAg ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHZtY3Nf cmVhZF9jaGVja2luZyhpbnQgaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZpZWxkOworCXUxNiBvZmZz ZXQxNjsKKwl1NjQgb2Zmc2V0NjQ7CisJdTMyIG9mZnNldDMyOworCXVuc2lnbmVkIGxvbmcgb2Zm c2V0bnc7CisKKwlmaWVsZCA9IHZtY3NpbmZvLmZpZWxkX29mZnNldFtpXVswXTsKKwlzd2l0Y2gg KHZtY3NfZmllbGRfdHlwZShmaWVsZCkpIHsKKwljYXNlIFZNQ1NfRklFTERfVFlQRV9VMTY6CisJ CW9mZnNldDE2ID0gdm1jc19yZWFkMTYoZmllbGQpOworCQlWTUNTX0ZJRUxEX0NIRUNLKGksIG9m ZnNldDE2LCAxNik7CisJCWJyZWFrOworCWNhc2UgVk1DU19GSUVMRF9UWVBFX1U2NDoKKwkJb2Zm c2V0NjQgPSB2bWNzX3JlYWQ2NChmaWVsZCk7CisJCVZNQ1NfRklFTERfQ0hFQ0soaSwgb2Zmc2V0 NjQsIDY0KTsKKwkJYnJlYWs7CisJY2FzZSBWTUNTX0ZJRUxEX1RZUEVfVTMyOgorCQlvZmZzZXQz MiA9IHZtY3NfcmVhZDMyKGZpZWxkKTsKKwkJVk1DU19GSUVMRF9DSEVDSyhpLCBvZmZzZXQzMiwg MzIpOworCQlicmVhazsKKwljYXNlIFZNQ1NfRklFTERfVFlQRV9OQVRVUkFMX1dJRFRIOgorCQlv ZmZzZXRudyA9IHZtY3NfcmVhZGwoZmllbGQpOworCQlWTUNTX0ZJRUxEX0NIRUNLKGksIG9mZnNl dG53LCBOVyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIE5vdGUsIG9mZnNldHMgb2YgZmll bGRzIHRoYXQgZGVmaW5lZCBpbiBJbnRlbCBzcGVjaWZpY2F0aW9uCisgKiAoSW50ZWzCriA2NCBh bmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXLigJlzIE1hbnVhbCwKKyAq IFZvbHVtZSAzQykgYnV0IG5vdCBkZWZpbmVkIGluICp2bWNzX2ZpZWxkKiB3aWxsIG5vdCBiZSBm aWxsZWQgaW4KKyAqIFZNQ1NJTkZPLiBBbmQsIHNvbWUgZmllbGRzIG1heSBiZSB1bnN1cHBvcnRl ZCBpbiBzb21lIG1hY2hpbmVzLAorICogaW4gdGhlc2UgbWFjaGluZXMsIGNvcnJlc3BvbmRpbmcg b2Zmc2V0cyB3aWxsIGJlIHplcm8uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsbG9jX3ZtY3Np bmZvX2luaXQodm9pZCkKK3sKKy8qCisgKiBUaGUgZmlyc3QgOCBieXRlcyBpbiB2bWNzIHJlZ2lv biBhcmUgZm9yCisgKiAgIFZNQ1MgcmV2aXNpb24gaWRlbnRpZmllcgorICogICBWTVgtYWJvcnQg aW5kaWNhdG9yCisgKi8KKyNkZWZpbmUgRklFTERfU1RBUlQgKDgpCisKKwlpbnQgciwgb2Zmc2V0 LCBpOworCXN0cnVjdCB2bWNzICp2bWNzOworCWludCBjcHU7CisKKwl2bWNzID0gYWxsb2Nfdm1j cygpOworCWlmICghdm1jcykgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyID0gaGFyZHdh cmVfZW5hYmxlX2FsbCgpOworCWlmIChyKQorCQlnb3RvIG91dDsKKworCS8qCisJICogV3JpdGUg ZW5jb2RlZCBvZmZzZXRzIGludG8gVk1DUyBkYXRhIGZvciBsYXRlciB2bWNzX3JlYWQuCisJICov CisJZm9yIChvZmZzZXQgPSBGSUVMRF9TVEFSVDsgb2Zmc2V0IDwgdm1jc19jb25maWcuc2l6ZTsK KwkgICAgIG9mZnNldCArPSBzaXplb2YodTE2KSkKKwkJKih1MTYgKikoKGNoYXIgKil2bWNzICsg b2Zmc2V0KSA9IEVOQ09ESU5HX09GRlNFVChvZmZzZXQpOworCisJY3B1ID0gZ2V0X2NwdSgpOwor CXZtY3NfY2xlYXIodm1jcyk7CisJcGVyX2NwdShjdXJyZW50X3ZtY3MsIGNwdSkgPSB2bWNzOwor CXZtY3NfbG9hZCh2bWNzKTsKKworCXZtY3NpbmZvX3JldmlzaW9uX2lkKHZtY3MtPnJldmlzaW9u X2lkKTsKKworCWZvciAoaSA9IDA7IGkgPCBWTUNTSU5GT19NQVhfRklFTEQ7ICsraSkgeworCQlp ZiAodm1jc2luZm8uZmllbGRfb2Zmc2V0W2ldWzBdICE9IFZNX0lOU1RSVUNUSU9OX0VSUk9SKQor CQkJY29udGludWU7CisJCXZtY3NfcmVhZF9jaGVja2luZyhpKTsKKwkJaWYgKHZtY3NpbmZvLmZp ZWxkX29mZnNldFtpXVsxXSA9PSAwKSB7CisJCQlnb3RvIG91dF9jbGVhcjsKKwkJfSBlbHNlIHsK KwkJCW9mZnNldCA9IHZtY3NpbmZvLmZpZWxkX29mZnNldFtpXVsxXTsKKwkJCWJyZWFrOworCQl9 CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZNQ1NJTkZPX01BWF9GSUVMRDsgKytpKSB7CisJCWlm ICh2bWNzaW5mby5maWVsZF9vZmZzZXRbaV1bMF0gPT0gVk1fSU5TVFJVQ1RJT05fRVJST1IpCisJ CQljb250aW51ZTsKKwkJLyoKKwkJICogQmVmb3JlIGVhY2ggcmVhZGluZywgemVyb2VkIGZpZWxk IFZNX0lOU1RSVUNUSU9OX0VSUk9SCisJCSAqLworCQkqKHUzMiAqKSgoY2hhciAqKXZtY3MgKyBv ZmZzZXQpID0gMDsKKwkJdm1jc19yZWFkX2NoZWNraW5nKGkpOworCX0KKworCXIgPSBzeXNmc19j cmVhdGVfZ3JvdXAoJmNwdV9zdWJzeXMuZGV2X3Jvb3QtPmtvYmosICZ2bWNzX2F0dHJfZ3JvdXAp OworCitvdXRfY2xlYXI6CisJdm1jc19jbGVhcih2bWNzKTsKKwlwdXRfY3B1KCk7CisJaGFyZHdh cmVfZGlzYWJsZV9hbGwoKTsKK291dDoKKwlmcmVlX3ZtY3Modm1jcyk7CisJcmV0dXJuIHI7Cit9 CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbGxvY192bWNzaW5mb19leGl0KHZvaWQpCit7CisJc3lz ZnNfcmVtb3ZlX2dyb3VwKCZjcHVfc3Vic3lzLmRldl9yb290LT5rb2JqLCAmdm1jc19hdHRyX2dy b3VwKTsKK30KKworbW9kdWxlX2luaXQoYWxsb2Nfdm1jc2luZm9faW5pdCk7Cittb2R1bGVfZXhp dChhbGxvY192bWNzaW5mb19leGl0KTsKLS0gCjEuNy4xCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwprZXhlYyBtYWlsaW5nIGxpc3QKa2V4ZWNAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2tleGVjCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhang Yanfei Subject: [PATCH v5 2/3] KVM-INTEL: Add new module vmcsinfo-intel to fill VMCSINFO Date: Thu, 12 Jul 2012 17:57:13 +0800 Message-ID: <4FFE9F79.5010805@cn.fujitsu.com> References: <4FFE9EDE.8080107@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: Received: from cn.fujitsu.com ([222.73.24.84]:60918 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S933601Ab2GLJ5j convert rfc822-to-8bit (ORCPT ); Thu, 12 Jul 2012 05:57:39 -0400 In-Reply-To: <4FFE9EDE.8080107@cn.fujitsu.com> Sender: kvm-owner@vger.kernel.org List-ID: 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 | 714 +++++++++++++++++++++++++++++++++++++++= ++++++++ 3 files changed, 728 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..0730473 --- /dev/null +++ b/arch/x86/kvm/vmcsinfo.c @@ -0,0 +1,714 @@ +/* + * 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 field_offset[][2]; +} vmcsinfo =3D { + 0, + { + {VIRTUAL_PROCESSOR_ID, 0}, + {GUEST_ES_SELECTOR, 0}, + {GUEST_CS_SELECTOR, 0}, + {GUEST_SS_SELECTOR, 0}, + {GUEST_DS_SELECTOR, 0}, + {GUEST_FS_SELECTOR, 0}, + {GUEST_GS_SELECTOR, 0}, + {GUEST_LDTR_SELECTOR, 0}, + {GUEST_TR_SELECTOR, 0}, + {HOST_ES_SELECTOR, 0}, + {HOST_CS_SELECTOR, 0}, + {HOST_SS_SELECTOR, 0}, + {HOST_DS_SELECTOR, 0}, + {HOST_FS_SELECTOR, 0}, + {HOST_GS_SELECTOR, 0}, + {HOST_TR_SELECTOR, 0}, + {IO_BITMAP_A, 0}, + {IO_BITMAP_A_HIGH, 0}, + {IO_BITMAP_B, 0}, + {IO_BITMAP_B_HIGH, 0}, + {MSR_BITMAP, 0}, + {MSR_BITMAP_HIGH, 0}, + {VM_EXIT_MSR_STORE_ADDR, 0}, + {VM_EXIT_MSR_STORE_ADDR_HIGH, 0}, + {VM_EXIT_MSR_LOAD_ADDR, 0}, + {VM_EXIT_MSR_LOAD_ADDR_HIGH, 0}, + {VM_ENTRY_MSR_LOAD_ADDR, 0}, + {VM_ENTRY_MSR_LOAD_ADDR_HIGH, 0}, + {TSC_OFFSET, 0}, + {TSC_OFFSET_HIGH, 0}, + {VIRTUAL_APIC_PAGE_ADDR, 0}, + {VIRTUAL_APIC_PAGE_ADDR_HIGH, 0}, + {APIC_ACCESS_ADDR, 0}, + {APIC_ACCESS_ADDR_HIGH, 0}, + {EPT_POINTER, 0}, + {EPT_POINTER_HIGH, 0}, + {GUEST_PHYSICAL_ADDRESS, 0}, + {GUEST_PHYSICAL_ADDRESS_HIGH, 0}, + {VMCS_LINK_POINTER, 0}, + {VMCS_LINK_POINTER_HIGH, 0}, + {GUEST_IA32_DEBUGCTL, 0}, + {GUEST_IA32_DEBUGCTL_HIGH, 0}, + {GUEST_IA32_PAT, 0}, + {GUEST_IA32_PAT_HIGH, 0}, + {GUEST_IA32_EFER, 0}, + {GUEST_IA32_EFER_HIGH, 0}, + {GUEST_IA32_PERF_GLOBAL_CTRL, 0}, + {GUEST_IA32_PERF_GLOBAL_CTRL_HIGH, 0}, + {GUEST_PDPTR0, 0}, + {GUEST_PDPTR0_HIGH, 0}, + {GUEST_PDPTR1, 0}, + {GUEST_PDPTR1_HIGH, 0}, + {GUEST_PDPTR2, 0}, + {GUEST_PDPTR2_HIGH, 0}, + {GUEST_PDPTR3, 0}, + {GUEST_PDPTR3_HIGH, 0}, + {HOST_IA32_PAT, 0}, + {HOST_IA32_PAT_HIGH, 0}, + {HOST_IA32_EFER, 0}, + {HOST_IA32_EFER_HIGH, 0}, + {HOST_IA32_PERF_GLOBAL_CTRL, 0}, + {HOST_IA32_PERF_GLOBAL_CTRL_HIGH, 0}, + {PIN_BASED_VM_EXEC_CONTROL, 0}, + {CPU_BASED_VM_EXEC_CONTROL, 0}, + {EXCEPTION_BITMAP, 0}, + {PAGE_FAULT_ERROR_CODE_MASK, 0}, + {PAGE_FAULT_ERROR_CODE_MATCH, 0}, + {CR3_TARGET_COUNT, 0}, + {VM_EXIT_CONTROLS, 0}, + {VM_EXIT_MSR_STORE_COUNT, 0}, + {VM_EXIT_MSR_LOAD_COUNT, 0}, + {VM_ENTRY_CONTROLS, 0}, + {VM_ENTRY_MSR_LOAD_COUNT, 0}, + {VM_ENTRY_INTR_INFO_FIELD, 0}, + {VM_ENTRY_EXCEPTION_ERROR_CODE, 0}, + {VM_ENTRY_INSTRUCTION_LEN, 0}, + {TPR_THRESHOLD, 0}, + {SECONDARY_VM_EXEC_CONTROL, 0}, + {PLE_GAP, 0}, + {PLE_WINDOW, 0}, + {VM_INSTRUCTION_ERROR, 0}, + {VM_EXIT_REASON, 0}, + {VM_EXIT_INTR_INFO, 0}, + {VM_EXIT_INTR_ERROR_CODE, 0}, + {IDT_VECTORING_INFO_FIELD, 0}, + {IDT_VECTORING_ERROR_CODE, 0}, + {VM_EXIT_INSTRUCTION_LEN, 0}, + {VMX_INSTRUCTION_INFO, 0}, + {GUEST_ES_LIMIT, 0}, + {GUEST_CS_LIMIT, 0}, + {GUEST_SS_LIMIT, 0}, + {GUEST_DS_LIMIT, 0}, + {GUEST_FS_LIMIT, 0}, + {GUEST_GS_LIMIT, 0}, + {GUEST_LDTR_LIMIT, 0}, + {GUEST_TR_LIMIT, 0}, + {GUEST_GDTR_LIMIT, 0}, + {GUEST_IDTR_LIMIT, 0}, + {GUEST_ES_AR_BYTES, 0}, + {GUEST_CS_AR_BYTES, 0}, + {GUEST_SS_AR_BYTES, 0}, + {GUEST_DS_AR_BYTES, 0}, + {GUEST_FS_AR_BYTES, 0}, + {GUEST_GS_AR_BYTES, 0}, + {GUEST_LDTR_AR_BYTES, 0}, + {GUEST_TR_AR_BYTES, 0}, + {GUEST_INTERRUPTIBILITY_INFO, 0}, + {GUEST_ACTIVITY_STATE, 0}, + {GUEST_SYSENTER_CS, 0}, + {HOST_IA32_SYSENTER_CS, 0}, + {CR0_GUEST_HOST_MASK, 0}, + {CR4_GUEST_HOST_MASK, 0}, + {CR0_READ_SHADOW, 0}, + {CR4_READ_SHADOW, 0}, + {CR3_TARGET_VALUE0, 0}, + {CR3_TARGET_VALUE1, 0}, + {CR3_TARGET_VALUE2, 0}, + {CR3_TARGET_VALUE3, 0}, + {EXIT_QUALIFICATION, 0}, + {GUEST_LINEAR_ADDRESS, 0}, + {GUEST_CR0, 0}, + {GUEST_CR3, 0}, + {GUEST_CR4, 0}, + {GUEST_ES_BASE, 0}, + {GUEST_CS_BASE, 0}, + {GUEST_SS_BASE, 0}, + {GUEST_DS_BASE, 0}, + {GUEST_FS_BASE, 0}, + {GUEST_GS_BASE, 0}, + {GUEST_LDTR_BASE, 0}, + {GUEST_TR_BASE, 0}, + {GUEST_GDTR_BASE, 0}, + {GUEST_IDTR_BASE, 0}, + {GUEST_DR7, 0}, + {GUEST_RSP, 0}, + {GUEST_RIP, 0}, + {GUEST_RFLAGS, 0}, + {GUEST_PENDING_DBG_EXCEPTIONS, 0}, + {GUEST_SYSENTER_ESP, 0}, + {GUEST_SYSENTER_EIP, 0}, + {HOST_CR0, 0}, + {HOST_CR3, 0}, + {HOST_CR4, 0}, + {HOST_FS_BASE, 0}, + {HOST_GS_BASE, 0}, + {HOST_TR_BASE, 0}, + {HOST_GDTR_BASE, 0}, + {HOST_IDTR_BASE, 0}, + {HOST_IA32_SYSENTER_ESP, 0}, + {HOST_IA32_SYSENTER_EIP, 0}, + {HOST_RSP, 0}, + {HOST_RIP, 0} + } +}; + +const char vmcs_group_name[] =3D "vmcs"; + +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(id, 0444, vmcs_id_show, NULL); + +#define BUILD_OFFSET_SHOW(i, field_code) = \ +static ssize_t _##field_code##_show(struct device *dev, = \ + struct device_attribute *attr, \ + char *buf) \ +{ = \ + return sprintf(buf, "%d\n", vmcsinfo.field_offset[i][1]); = \ +} = \ +static DEVICE_ATTR(field_code, 0444, _##field_code##_show, NULL); + +BUILD_OFFSET_SHOW( 0, 0000); /* VIRTUAL_PROCESSOR_ID */ +BUILD_OFFSET_SHOW( 1, 0800); /* GUEST_ES_SELECTOR */ +BUILD_OFFSET_SHOW( 2, 0802); /* GUEST_CS_SELECTOR */ +BUILD_OFFSET_SHOW( 3, 0804); /* GUEST_SS_SELECTOR */ +BUILD_OFFSET_SHOW( 4, 0806); /* GUEST_DS_SELECTOR */ +BUILD_OFFSET_SHOW( 5, 0808); /* GUEST_FS_SELECTOR */ +BUILD_OFFSET_SHOW( 6, 080a); /* GUEST_GS_SELECTOR */ +BUILD_OFFSET_SHOW( 7, 080c); /* GUEST_LDTR_SELECTOR */ +BUILD_OFFSET_SHOW( 8, 080e); /* GUEST_TR_SELECTOR */ +BUILD_OFFSET_SHOW( 9, 0c00); /* HOST_ES_SELECTOR */ +BUILD_OFFSET_SHOW( 10, 0c02); /* HOST_CS_SELECTOR */ +BUILD_OFFSET_SHOW( 11, 0c04); /* HOST_SS_SELECTOR */ +BUILD_OFFSET_SHOW( 12, 0c06); /* HOST_DS_SELECTOR */ +BUILD_OFFSET_SHOW( 13, 0c08); /* HOST_FS_SELECTOR */ +BUILD_OFFSET_SHOW( 14, 0c0a); /* HOST_GS_SELECTOR */ +BUILD_OFFSET_SHOW( 15, 0c0c); /* HOST_TR_SELECTOR */ +BUILD_OFFSET_SHOW( 16, 2000); /* IO_BITMAP_A */ +BUILD_OFFSET_SHOW( 17, 2001); /* IO_BITMAP_A_HIGH */ +BUILD_OFFSET_SHOW( 18, 2002); /* IO_BITMAP_B */ +BUILD_OFFSET_SHOW( 19, 2003); /* IO_BITMAP_B_HIGH */ +BUILD_OFFSET_SHOW( 20, 2004); /* MSR_BITMAP */ +BUILD_OFFSET_SHOW( 21, 2005); /* MSR_BITMAP_HIGH */ +BUILD_OFFSET_SHOW( 22, 2006); /* VM_EXIT_MSR_STORE_ADDR */ +BUILD_OFFSET_SHOW( 23, 2007); /* VM_EXIT_MSR_STORE_ADDR_HIGH */ +BUILD_OFFSET_SHOW( 24, 2008); /* VM_EXIT_MSR_LOAD_ADDR */ +BUILD_OFFSET_SHOW( 25, 2009); /* VM_EXIT_MSR_LOAD_ADDR_HIGH */ +BUILD_OFFSET_SHOW( 26, 200a); /* VM_ENTRY_MSR_LOAD_ADDR */ +BUILD_OFFSET_SHOW( 27, 200b); /* VM_ENTRY_MSR_LOAD_ADDR_HIGH */ +BUILD_OFFSET_SHOW( 28, 2010); /* TSC_OFFSET */ +BUILD_OFFSET_SHOW( 29, 2011); /* TSC_OFFSET_HIGH */ +BUILD_OFFSET_SHOW( 30, 2012); /* VIRTUAL_APIC_PAGE_ADDR */ +BUILD_OFFSET_SHOW( 31, 2013); /* VIRTUAL_APIC_PAGE_ADDR_HIGH */ +BUILD_OFFSET_SHOW( 32, 2014); /* APIC_ACCESS_ADDR */ +BUILD_OFFSET_SHOW( 33, 2015); /* APIC_ACCESS_ADDR_HIGH */ +BUILD_OFFSET_SHOW( 34, 201a); /* EPT_POINTER */ +BUILD_OFFSET_SHOW( 35, 201b); /* EPT_POINTER_HIGH */ +BUILD_OFFSET_SHOW( 36, 2400); /* GUEST_PHYSICAL_ADDRESS */ +BUILD_OFFSET_SHOW( 37, 2401); /* GUEST_PHYSICAL_ADDRESS_HIGH */ +BUILD_OFFSET_SHOW( 38, 2800); /* VMCS_LINK_POINTER */ +BUILD_OFFSET_SHOW( 39, 2801); /* VMCS_LINK_POINTER_HIGH */ +BUILD_OFFSET_SHOW( 40, 2802); /* GUEST_IA32_DEBUGCTL */ +BUILD_OFFSET_SHOW( 41, 2803); /* GUEST_IA32_DEBUGCTL_HIGH */ +BUILD_OFFSET_SHOW( 42, 2804); /* GUEST_IA32_PAT */ +BUILD_OFFSET_SHOW( 43, 2805); /* GUEST_IA32_PAT_HIGH */ +BUILD_OFFSET_SHOW( 44, 2806); /* GUEST_IA32_EFER */ +BUILD_OFFSET_SHOW( 45, 2807); /* GUEST_IA32_EFER_HIGH */ +BUILD_OFFSET_SHOW( 46, 2808); /* GUEST_IA32_PERF_GLOBAL_CTRL */ +BUILD_OFFSET_SHOW( 47, 2809); /* GUEST_IA32_PERF_GLOBAL_CTRL_HIGH */ +BUILD_OFFSET_SHOW( 48, 280a); /* GUEST_PDPTR0 */ +BUILD_OFFSET_SHOW( 49, 280b); /* GUEST_PDPTR0_HIGH */ +BUILD_OFFSET_SHOW( 50, 280c); /* GUEST_PDPTR1 */ +BUILD_OFFSET_SHOW( 51, 280d); /* GUEST_PDPTR1_HIGH */ +BUILD_OFFSET_SHOW( 52, 280e); /* GUEST_PDPTR2 */ +BUILD_OFFSET_SHOW( 53, 280f); /* GUEST_PDPTR2_HIGH */ +BUILD_OFFSET_SHOW( 54, 2810); /* GUEST_PDPTR3 */ +BUILD_OFFSET_SHOW( 55, 2811); /* GUEST_PDPTR3_HIGH */ +BUILD_OFFSET_SHOW( 56, 2c00); /* HOST_IA32_PAT */ +BUILD_OFFSET_SHOW( 57, 2c01); /* HOST_IA32_PAT_HIGH */ +BUILD_OFFSET_SHOW( 58, 2c02); /* HOST_IA32_EFER */ +BUILD_OFFSET_SHOW( 59, 2c03); /* HOST_IA32_EFER_HIGH */ +BUILD_OFFSET_SHOW( 60, 2c04); /* HOST_IA32_PERF_GLOBAL_CTRL */ +BUILD_OFFSET_SHOW( 61, 2c05); /* HOST_IA32_PERF_GLOBAL_CTRL_HIGH */ +BUILD_OFFSET_SHOW( 62, 4000); /* PIN_BASED_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW( 63, 4002); /* CPU_BASED_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW( 64, 4004); /* EXCEPTION_BITMAP */ +BUILD_OFFSET_SHOW( 65, 4006); /* PAGE_FAULT_ERROR_CODE_MASK */ +BUILD_OFFSET_SHOW( 66, 4008); /* PAGE_FAULT_ERROR_CODE_MATCH */ +BUILD_OFFSET_SHOW( 67, 400a); /* CR3_TARGET_COUNT */ +BUILD_OFFSET_SHOW( 68, 400c); /* VM_EXIT_CONTROLS */ +BUILD_OFFSET_SHOW( 69, 400e); /* VM_EXIT_MSR_STORE_COUNT */ +BUILD_OFFSET_SHOW( 70, 4010); /* VM_EXIT_MSR_LOAD_COUNT */ +BUILD_OFFSET_SHOW( 71, 4012); /* VM_ENTRY_CONTROLS */ +BUILD_OFFSET_SHOW( 72, 4014); /* VM_ENTRY_MSR_LOAD_COUNT */ +BUILD_OFFSET_SHOW( 73, 4016); /* VM_ENTRY_INTR_INFO_FIELD */ +BUILD_OFFSET_SHOW( 74, 4018); /* VM_ENTRY_EXCEPTION_ERROR_CODE */ +BUILD_OFFSET_SHOW( 75, 401a); /* VM_ENTRY_INSTRUCTION_LEN */ +BUILD_OFFSET_SHOW( 76, 401c); /* TPR_THRESHOLD */ +BUILD_OFFSET_SHOW( 77, 401e); /* SECONDARY_VM_EXEC_CONTROL */ +BUILD_OFFSET_SHOW( 78, 4020); /* PLE_GAP */ +BUILD_OFFSET_SHOW( 79, 4022); /* PLE_WINDOW */ +BUILD_OFFSET_SHOW( 80, 4400); /* VM_INSTRUCTION_ERROR */ +BUILD_OFFSET_SHOW( 81, 4402); /* VM_EXIT_REASON */ +BUILD_OFFSET_SHOW( 82, 4404); /* VM_EXIT_INTR_INFO */ +BUILD_OFFSET_SHOW( 83, 4406); /* VM_EXIT_INTR_ERROR_CODE */ +BUILD_OFFSET_SHOW( 84, 4408); /* IDT_VECTORING_INFO_FIELD */ +BUILD_OFFSET_SHOW( 85, 440a); /* IDT_VECTORING_ERROR_CODE */ +BUILD_OFFSET_SHOW( 86, 440c); /* VM_EXIT_INSTRUCTION_LEN */ +BUILD_OFFSET_SHOW( 87, 440e); /* VMX_INSTRUCTION_INFO */ +BUILD_OFFSET_SHOW( 88, 4800); /* GUEST_ES_LIMIT */ +BUILD_OFFSET_SHOW( 89, 4802); /* GUEST_CS_LIMIT */ +BUILD_OFFSET_SHOW( 90, 4804); /* GUEST_SS_LIMIT */ +BUILD_OFFSET_SHOW( 91, 4806); /* GUEST_DS_LIMIT */ +BUILD_OFFSET_SHOW( 92, 4808); /* GUEST_FS_LIMIT */ +BUILD_OFFSET_SHOW( 93, 480a); /* GUEST_GS_LIMIT */ +BUILD_OFFSET_SHOW( 94, 480c); /* GUEST_LDTR_LIMIT */ +BUILD_OFFSET_SHOW( 95, 480e); /* GUEST_TR_LIMIT */ +BUILD_OFFSET_SHOW( 96, 4810); /* GUEST_GDTR_LIMIT */ +BUILD_OFFSET_SHOW( 97, 4812); /* GUEST_IDTR_LIMIT */ +BUILD_OFFSET_SHOW( 98, 4814); /* GUEST_ES_AR_BYTES */ +BUILD_OFFSET_SHOW( 99, 4816); /* GUEST_CS_AR_BYTES */ +BUILD_OFFSET_SHOW(100, 4818); /* GUEST_SS_AR_BYTES */ +BUILD_OFFSET_SHOW(101, 481a); /* GUEST_DS_AR_BYTES */ +BUILD_OFFSET_SHOW(102, 481c); /* GUEST_FS_AR_BYTES */ +BUILD_OFFSET_SHOW(103, 481e); /* GUEST_GS_AR_BYTES */ +BUILD_OFFSET_SHOW(104, 4820); /* GUEST_LDTR_AR_BYTES */ +BUILD_OFFSET_SHOW(105, 4822); /* GUEST_TR_AR_BYTES */ +BUILD_OFFSET_SHOW(106, 4824); /* GUEST_INTERRUPTIBILITY_INFO */ +BUILD_OFFSET_SHOW(107, 4826); /* GUEST_ACTIVITY_STATE */ +BUILD_OFFSET_SHOW(108, 482A); /* GUEST_SYSENTER_CS */ +BUILD_OFFSET_SHOW(109, 4c00); /* HOST_IA32_SYSENTER_CS */ +BUILD_OFFSET_SHOW(110, 6000); /* CR0_GUEST_HOST_MASK */ +BUILD_OFFSET_SHOW(111, 6002); /* CR4_GUEST_HOST_MASK */ +BUILD_OFFSET_SHOW(112, 6004); /* CR0_READ_SHADOW */ +BUILD_OFFSET_SHOW(113, 6006); /* CR4_READ_SHADOW */ +BUILD_OFFSET_SHOW(114, 6008); /* CR3_TARGET_VALUE0 */ +BUILD_OFFSET_SHOW(115, 600a); /* CR3_TARGET_VALUE1 */ +BUILD_OFFSET_SHOW(116, 600c); /* CR3_TARGET_VALUE2 */ +BUILD_OFFSET_SHOW(117, 600e); /* CR3_TARGET_VALUE3 */ +BUILD_OFFSET_SHOW(118, 6400); /* EXIT_QUALIFICATION */ +BUILD_OFFSET_SHOW(119, 640a); /* GUEST_LINEAR_ADDRESS */ +BUILD_OFFSET_SHOW(120, 6800); /* GUEST_CR0 */ +BUILD_OFFSET_SHOW(121, 6802); /* GUEST_CR3 */ +BUILD_OFFSET_SHOW(122, 6804); /* GUEST_CR4 */ +BUILD_OFFSET_SHOW(123, 6806); /* GUEST_ES_BASE */ +BUILD_OFFSET_SHOW(124, 6808); /* GUEST_CS_BASE */ +BUILD_OFFSET_SHOW(125, 680a); /* GUEST_SS_BASE */ +BUILD_OFFSET_SHOW(126, 680c); /* GUEST_DS_BASE */ +BUILD_OFFSET_SHOW(127, 680e); /* GUEST_FS_BASE */ +BUILD_OFFSET_SHOW(128, 6810); /* GUEST_GS_BASE */ +BUILD_OFFSET_SHOW(129, 6812); /* GUEST_LDTR_BASE */ +BUILD_OFFSET_SHOW(130, 6814); /* GUEST_TR_BASE */ +BUILD_OFFSET_SHOW(131, 6816); /* GUEST_GDTR_BASE */ +BUILD_OFFSET_SHOW(132, 6818); /* GUEST_IDTR_BASE */ +BUILD_OFFSET_SHOW(133, 681a); /* GUEST_DR7 */ +BUILD_OFFSET_SHOW(134, 681c); /* GUEST_RSP */ +BUILD_OFFSET_SHOW(135, 681e); /* GUEST_RIP */ +BUILD_OFFSET_SHOW(136, 6820); /* GUEST_RFLAGS */ +BUILD_OFFSET_SHOW(137, 6822); /* GUEST_PENDING_DBG_EXCEPTIONS */ +BUILD_OFFSET_SHOW(138, 6824); /* GUEST_SYSENTER_ESP */ +BUILD_OFFSET_SHOW(139, 6826); /* GUEST_SYSENTER_EIP */ +BUILD_OFFSET_SHOW(140, 6c00); /* HOST_CR0 */ +BUILD_OFFSET_SHOW(141, 6c02); /* HOST_CR3 */ +BUILD_OFFSET_SHOW(142, 6c04); /* HOST_CR4 */ +BUILD_OFFSET_SHOW(143, 6c06); /* HOST_FS_BASE */ +BUILD_OFFSET_SHOW(144, 6c08); /* HOST_GS_BASE */ +BUILD_OFFSET_SHOW(145, 6c0a); /* HOST_TR_BASE */ +BUILD_OFFSET_SHOW(146, 6c0c); /* HOST_GDTR_BASE */ +BUILD_OFFSET_SHOW(147, 6c0e); /* HOST_IDTR_BASE */ +BUILD_OFFSET_SHOW(148, 6c10); /* HOST_IA32_SYSENTER_ESP */ +BUILD_OFFSET_SHOW(149, 6c12); /* HOST_IA32_SYSENTER_EIP */ +BUILD_OFFSET_SHOW(150, 6c14); /* HOST_RSP */ +BUILD_OFFSET_SHOW(151, 6c16); /* HOST_RIP */ + +static struct attribute *vmcs_attrs[] =3D { + &dev_attr_id.attr, + &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, +}; + +#define VMCSINFO_MAX_FIELD (ARRAY_SIZE(vmcs_attrs) - 1) + +static inline void vmcsinfo_revision_id(u32 id) +{ + vmcsinfo.vmcs_revision_id =3D id; +} + +static inline void vmcsinfo_field(int i, u16 offset) +{ + if (i < VMCSINFO_MAX_FIELD) + vmcsinfo.field_offset[i][1] =3D offset; +} + +/* + * 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(i, offset) \ + vmcsinfo_field(i, DECODING_OFFSET(offset, 16)) +#define FIELD_OFFSET64(i, offset) \ + vmcsinfo_field(i, DECODING_OFFSET(offset, 64)) +#define FIELD_OFFSET32(i, offset) \ + vmcsinfo_field(i, DECODING_OFFSET(offset, 32)) +#define FIELD_OFFSETNW(i, offset) \ +do { \ + if (sizeof(offset) =3D=3D 8) \ + vmcsinfo_field(i, DECODING_OFFSET(offset, 64)); \ + else \ + vmcsinfo_field(i, DECODING_OFFSET(offset, 32)); \ +} while (0) + +#define VMCS_FIELD_CHECK(i, offset, type) \ +do { \ + if (vmcs_read32(VM_INSTRUCTION_ERROR) !=3D \ + VMXERR_UNSUPPORTED_VMCS_COMPONENT) \ + FIELD_OFFSET##type(i, offset); \ +} while (0) + +static inline void vmcs_read_checking(int i) +{ + unsigned long field; + u16 offset16; + u64 offset64; + u32 offset32; + unsigned long offsetnw; + + field =3D vmcsinfo.field_offset[i][0]; + switch (vmcs_field_type(field)) { + case VMCS_FIELD_TYPE_U16: + offset16 =3D vmcs_read16(field); + VMCS_FIELD_CHECK(i, offset16, 16); + break; + case VMCS_FIELD_TYPE_U64: + offset64 =3D vmcs_read64(field); + VMCS_FIELD_CHECK(i, offset64, 64); + break; + case VMCS_FIELD_TYPE_U32: + offset32 =3D vmcs_read32(field); + VMCS_FIELD_CHECK(i, offset32, 32); + break; + case VMCS_FIELD_TYPE_NATURAL_WIDTH: + offsetnw =3D vmcs_readl(field); + VMCS_FIELD_CHECK(i, offsetnw, NW); + break; + } +} + +/* + * Note, offsets of fields that defined in Intel specification + * (Intel=C2=AE 64 and IA-32 Architectures Software Developer=E2=80=99= s Manual, + * 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. + */ +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, i; + struct vmcs *vmcs; + int cpu; + + 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); + + for (i =3D 0; i < VMCSINFO_MAX_FIELD; ++i) { + if (vmcsinfo.field_offset[i][0] !=3D VM_INSTRUCTION_ERROR) + continue; + vmcs_read_checking(i); + if (vmcsinfo.field_offset[i][1] =3D=3D 0) { + goto out_clear; + } else { + offset =3D vmcsinfo.field_offset[i][1]; + break; + } + } + + for (i =3D 0; i < VMCSINFO_MAX_FIELD; ++i) { + if (vmcsinfo.field_offset[i][0] =3D=3D VM_INSTRUCTION_ERROR) + continue; + /* + * Before each reading, zeroed field VM_INSTRUCTION_ERROR + */ + *(u32 *)((char *)vmcs + offset) =3D 0; + vmcs_read_checking(i); + } + + r =3D sysfs_create_group(&cpu_subsys.dev_root->kobj, &vmcs_attr_group= ); + +out_clear: + vmcs_clear(vmcs); + put_cpu(); + hardware_disable_all(); +out: + free_vmcs(vmcs); + return r; +} + +static void __exit alloc_vmcsinfo_exit(void) +{ + sysfs_remove_group(&cpu_subsys.dev_root->kobj, &vmcs_attr_group); +} + +module_init(alloc_vmcsinfo_init); +module_exit(alloc_vmcsinfo_exit); --=20 1.7.1