From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DDE1C433FE for ; Wed, 6 Oct 2021 17:41:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 170E6610E6 for ; Wed, 6 Oct 2021 17:41:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238959AbhJFRnW (ORCPT ); Wed, 6 Oct 2021 13:43:22 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:53654 "EHLO mx01.bbu.dsd.mx.bitdefender.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239208AbhJFRml (ORCPT ); Wed, 6 Oct 2021 13:42:41 -0400 Received: from smtp.bitdefender.com (smtp01.buh.bitdefender.com [10.17.80.75]) by mx01.bbu.dsd.mx.bitdefender.com (Postfix) with ESMTPS id AC8DB305D355; Wed, 6 Oct 2021 20:31:15 +0300 (EEST) Received: from localhost (unknown [91.199.104.28]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 8FFE23064495; Wed, 6 Oct 2021 20:31:15 +0300 (EEST) X-Is-Junk-Enabled: fGZTSsP0qEJE2AIKtlSuFiRRwg9xyHmJ From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: kvm@vger.kernel.org Cc: virtualization@lists.linux-foundation.org, Paolo Bonzini , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Mathieu Tarral , Tamas K Lengyel , Marian Rotariu , =?UTF-8?q?Adalbert=20Laz=C4=83r?= Subject: [PATCH v12 52/77] KVM: introspection: add KVMI_VCPU_GET_CPUID Date: Wed, 6 Oct 2021 20:30:48 +0300 Message-Id: <20211006173113.26445-53-alazar@bitdefender.com> In-Reply-To: <20211006173113.26445-1-alazar@bitdefender.com> References: <20211006173113.26445-1-alazar@bitdefender.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Marian Rotariu This command returns a CPUID leaf (as seen by the guest OS). Signed-off-by: Marian Rotariu Co-developed-by: Adalbert Lazăr Signed-off-by: Adalbert Lazăr --- Documentation/virt/kvm/kvmi.rst | 36 +++++++++++++++++++ arch/x86/include/uapi/asm/kvmi.h | 12 +++++++ arch/x86/kvm/kvmi_msg.c | 26 ++++++++++++++ include/uapi/linux/kvmi.h | 1 + .../testing/selftests/kvm/x86_64/kvmi_test.c | 30 ++++++++++++++++ 5 files changed, 105 insertions(+) diff --git a/Documentation/virt/kvm/kvmi.rst b/Documentation/virt/kvm/kvmi.rst index beea20a306ef..8b9938032650 100644 --- a/Documentation/virt/kvm/kvmi.rst +++ b/Documentation/virt/kvm/kvmi.rst @@ -630,6 +630,42 @@ currently being handled is replied to. * -KVM_EAGAIN - the selected vCPU can't be introspected yet * -KVM_EOPNOTSUPP - the command hasn't been received during an introspection event +13. KVMI_VCPU_GET_CPUID +----------------------- + +:Architectures: x86 +:Versions: >= 1 +:Parameters: + +:: + + struct kvmi_vcpu_hdr; + struct kvmi_vcpu_get_cpuid { + __u32 function; + __u32 index; + }; + +:Returns: + +:: + + struct kvmi_error_code; + struct kvmi_vcpu_get_cpuid_reply { + __u32 eax; + __u32 ebx; + __u32 ecx; + __u32 edx; + }; + +Returns a CPUID leaf (as seen by the guest OS). + +:Errors: + +* -KVM_EINVAL - the selected vCPU is invalid +* -KVM_EINVAL - the padding is not zero +* -KVM_EAGAIN - the selected vCPU can't be introspected yet +* -KVM_ENOENT - the selected leaf is not present or is invalid + Events ====== diff --git a/arch/x86/include/uapi/asm/kvmi.h b/arch/x86/include/uapi/asm/kvmi.h index 11835bf9bdc6..3631da9eef8c 100644 --- a/arch/x86/include/uapi/asm/kvmi.h +++ b/arch/x86/include/uapi/asm/kvmi.h @@ -45,4 +45,16 @@ struct kvmi_vcpu_get_registers_reply { struct kvm_msrs msrs; }; +struct kvmi_vcpu_get_cpuid { + __u32 function; + __u32 index; +}; + +struct kvmi_vcpu_get_cpuid_reply { + __u32 eax; + __u32 ebx; + __u32 ecx; + __u32 edx; +}; + #endif /* _UAPI_ASM_X86_KVMI_H */ diff --git a/arch/x86/kvm/kvmi_msg.c b/arch/x86/kvm/kvmi_msg.c index b4113749bcd0..d48abfe5133b 100644 --- a/arch/x86/kvm/kvmi_msg.c +++ b/arch/x86/kvm/kvmi_msg.c @@ -6,6 +6,7 @@ * */ +#include "cpuid.h" #include "../../../virt/kvm/introspection/kvmi_int.h" #include "kvmi.h" @@ -110,7 +111,32 @@ static int handle_vcpu_set_registers(const struct kvmi_vcpu_msg_job *job, return kvmi_msg_vcpu_reply(job, msg, ec, NULL, 0); } +static int handle_vcpu_get_cpuid(const struct kvmi_vcpu_msg_job *job, + const struct kvmi_msg_hdr *msg, + const void *_req) +{ + const struct kvmi_vcpu_get_cpuid *req = _req; + struct kvmi_vcpu_get_cpuid_reply rpl; + struct kvm_cpuid_entry2 *entry; + int ec = 0; + + entry = kvm_find_cpuid_entry(job->vcpu, req->function, req->index); + if (!entry) { + ec = -KVM_ENOENT; + } else { + memset(&rpl, 0, sizeof(rpl)); + + rpl.eax = entry->eax; + rpl.ebx = entry->ebx; + rpl.ecx = entry->ecx; + rpl.edx = entry->edx; + } + + return kvmi_msg_vcpu_reply(job, msg, ec, &rpl, sizeof(rpl)); +} + static const kvmi_vcpu_msg_job_fct msg_vcpu[] = { + [KVMI_VCPU_GET_CPUID] = handle_vcpu_get_cpuid, [KVMI_VCPU_GET_INFO] = handle_vcpu_get_info, [KVMI_VCPU_GET_REGISTERS] = handle_vcpu_get_registers, [KVMI_VCPU_SET_REGISTERS] = handle_vcpu_set_registers, diff --git a/include/uapi/linux/kvmi.h b/include/uapi/linux/kvmi.h index 4b756d388ad3..2c93a36bfa43 100644 --- a/include/uapi/linux/kvmi.h +++ b/include/uapi/linux/kvmi.h @@ -39,6 +39,7 @@ enum { KVMI_VCPU_CONTROL_EVENTS = KVMI_VCPU_MESSAGE_ID(2), KVMI_VCPU_GET_REGISTERS = KVMI_VCPU_MESSAGE_ID(3), KVMI_VCPU_SET_REGISTERS = KVMI_VCPU_MESSAGE_ID(4), + KVMI_VCPU_GET_CPUID = KVMI_VCPU_MESSAGE_ID(5), KVMI_NEXT_VCPU_MESSAGE }; diff --git a/tools/testing/selftests/kvm/x86_64/kvmi_test.c b/tools/testing/selftests/kvm/x86_64/kvmi_test.c index 4e93b70dd7d3..837d14dae448 100644 --- a/tools/testing/selftests/kvm/x86_64/kvmi_test.c +++ b/tools/testing/selftests/kvm/x86_64/kvmi_test.c @@ -962,6 +962,35 @@ static void test_cmd_vcpu_set_registers(struct kvm_vm *vm) wait_vcpu_worker(vcpu_thread); } +static void cmd_vcpu_get_cpuid(struct kvm_vm *vm, + __u32 function, __u32 index, + struct kvmi_vcpu_get_cpuid_reply *rpl) +{ + struct { + struct kvmi_msg_hdr hdr; + struct kvmi_vcpu_hdr vcpu_hdr; + struct kvmi_vcpu_get_cpuid cmd; + } req = {}; + + req.cmd.function = function; + req.cmd.index = index; + + test_vcpu0_command(vm, KVMI_VCPU_GET_CPUID, &req.hdr, sizeof(req), + rpl, sizeof(*rpl), 0); +} + +static void test_cmd_vcpu_get_cpuid(struct kvm_vm *vm) +{ + struct kvmi_vcpu_get_cpuid_reply rpl = {}; + __u32 function = 0; + __u32 index = 0; + + cmd_vcpu_get_cpuid(vm, function, index, &rpl); + + pr_debug("cpuid(%u, %u) => eax 0x%.8x, ebx 0x%.8x, ecx 0x%.8x, edx 0x%.8x\n", + function, index, rpl.eax, rpl.ebx, rpl.ecx, rpl.edx); +} + static void test_introspection(struct kvm_vm *vm) { srandom(time(0)); @@ -981,6 +1010,7 @@ static void test_introspection(struct kvm_vm *vm) test_cmd_vcpu_control_events(vm); test_cmd_vcpu_get_registers(vm); test_cmd_vcpu_set_registers(vm); + test_cmd_vcpu_get_cpuid(vm); unhook_introspection(vm); } From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5BF76C43217 for ; Wed, 6 Oct 2021 17:50:52 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 243D76117A for ; Wed, 6 Oct 2021 17:50:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 243D76117A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=bitdefender.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id BD58C8406E; Wed, 6 Oct 2021 17:50:50 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id A1wf6MDRRtAZ; Wed, 6 Oct 2021 17:50:49 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 43F3384073; Wed, 6 Oct 2021 17:50:48 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 24699C0032; Wed, 6 Oct 2021 17:50:47 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 25A8EC000D for ; Wed, 6 Oct 2021 17:50:44 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B8B78407EB for ; Wed, 6 Oct 2021 17:50:43 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id f5vK270EaUCd for ; Wed, 6 Oct 2021 17:50:42 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 Received: from mx01.bbu.dsd.mx.bitdefender.com (mx01.bbu.dsd.mx.bitdefender.com [91.199.104.161]) by smtp2.osuosl.org (Postfix) with ESMTPS id 65EB9407D0 for ; Wed, 6 Oct 2021 17:50:42 +0000 (UTC) Received: from smtp.bitdefender.com (smtp01.buh.bitdefender.com [10.17.80.75]) by mx01.bbu.dsd.mx.bitdefender.com (Postfix) with ESMTPS id AC8DB305D355; Wed, 6 Oct 2021 20:31:15 +0300 (EEST) Received: from localhost (unknown [91.199.104.28]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 8FFE23064495; Wed, 6 Oct 2021 20:31:15 +0300 (EEST) X-Is-Junk-Enabled: fGZTSsP0qEJE2AIKtlSuFiRRwg9xyHmJ From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: kvm@vger.kernel.org Subject: [PATCH v12 52/77] KVM: introspection: add KVMI_VCPU_GET_CPUID Date: Wed, 6 Oct 2021 20:30:48 +0300 Message-Id: <20211006173113.26445-53-alazar@bitdefender.com> In-Reply-To: <20211006173113.26445-1-alazar@bitdefender.com> References: <20211006173113.26445-1-alazar@bitdefender.com> MIME-Version: 1.0 Cc: Tamas K Lengyel , Wanpeng Li , Sean Christopherson , Joerg Roedel , virtualization@lists.linux-foundation.org, =?UTF-8?q?Adalbert=20Laz=C4=83r?= , Marian Rotariu , Mathieu Tarral , Paolo Bonzini , Jim Mattson X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" RnJvbTogTWFyaWFuIFJvdGFyaXUgPG1hcmlhbi5jLnJvdGFyaXVAZ21haWwuY29tPgoKVGhpcyBj b21tYW5kIHJldHVybnMgYSBDUFVJRCBsZWFmIChhcyBzZWVuIGJ5IHRoZSBndWVzdCBPUykuCgpT aWduZWQtb2ZmLWJ5OiBNYXJpYW4gUm90YXJpdSA8bWFyaWFuLmMucm90YXJpdUBnbWFpbC5jb20+ CkNvLWRldmVsb3BlZC1ieTogQWRhbGJlcnQgTGF6xINyIDxhbGF6YXJAYml0ZGVmZW5kZXIuY29t PgpTaWduZWQtb2ZmLWJ5OiBBZGFsYmVydCBMYXrEg3IgPGFsYXphckBiaXRkZWZlbmRlci5jb20+ Ci0tLQogRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9rdm1pLnJzdCAgICAgICAgICAgICAgIHwgMzYg KysrKysrKysrKysrKysrKysrKwogYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9rdm1pLmggICAg ICAgICAgICAgIHwgMTIgKysrKysrKwogYXJjaC94ODYva3ZtL2t2bWlfbXNnLmMgICAgICAgICAg ICAgICAgICAgICAgIHwgMjYgKysrKysrKysrKysrKysKIGluY2x1ZGUvdWFwaS9saW51eC9rdm1p LmggICAgICAgICAgICAgICAgICAgICB8ICAxICsKIC4uLi90ZXN0aW5nL3NlbGZ0ZXN0cy9rdm0v eDg2XzY0L2t2bWlfdGVzdC5jICB8IDMwICsrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdl ZCwgMTA1IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnQva3Zt L2t2bWkucnN0IGIvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9rdm1pLnJzdAppbmRleCBiZWVhMjBh MzA2ZWYuLjhiOTkzODAzMjY1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0L2t2bS9r dm1pLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnQva3ZtL2t2bWkucnN0CkBAIC02MzAsNiAr NjMwLDQyIEBAIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIGlzIHJlcGxpZWQgdG8uCiAqIC1LVk1f RUFHQUlOIC0gdGhlIHNlbGVjdGVkIHZDUFUgY2FuJ3QgYmUgaW50cm9zcGVjdGVkIHlldAogKiAt S1ZNX0VPUE5PVFNVUFAgLSB0aGUgY29tbWFuZCBoYXNuJ3QgYmVlbiByZWNlaXZlZCBkdXJpbmcg YW4gaW50cm9zcGVjdGlvbiBldmVudAogCisxMy4gS1ZNSV9WQ1BVX0dFVF9DUFVJRAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKworOkFyY2hpdGVjdHVyZXM6IHg4NgorOlZlcnNpb25zOiA+PSAx Cis6UGFyYW1ldGVyczoKKworOjoKKworCXN0cnVjdCBrdm1pX3ZjcHVfaGRyOworCXN0cnVjdCBr dm1pX3ZjcHVfZ2V0X2NwdWlkIHsKKwkJX191MzIgZnVuY3Rpb247CisJCV9fdTMyIGluZGV4Owor CX07CisKKzpSZXR1cm5zOgorCis6OgorCisJc3RydWN0IGt2bWlfZXJyb3JfY29kZTsKKwlzdHJ1 Y3Qga3ZtaV92Y3B1X2dldF9jcHVpZF9yZXBseSB7CisJCV9fdTMyIGVheDsKKwkJX191MzIgZWJ4 OworCQlfX3UzMiBlY3g7CisJCV9fdTMyIGVkeDsKKwl9OworCitSZXR1cm5zIGEgQ1BVSUQgbGVh ZiAoYXMgc2VlbiBieSB0aGUgZ3Vlc3QgT1MpLgorCis6RXJyb3JzOgorCisqIC1LVk1fRUlOVkFM IC0gdGhlIHNlbGVjdGVkIHZDUFUgaXMgaW52YWxpZAorKiAtS1ZNX0VJTlZBTCAtIHRoZSBwYWRk aW5nIGlzIG5vdCB6ZXJvCisqIC1LVk1fRUFHQUlOIC0gdGhlIHNlbGVjdGVkIHZDUFUgY2FuJ3Qg YmUgaW50cm9zcGVjdGVkIHlldAorKiAtS1ZNX0VOT0VOVCAtIHRoZSBzZWxlY3RlZCBsZWFmIGlz IG5vdCBwcmVzZW50IG9yIGlzIGludmFsaWQKKwogRXZlbnRzCiA9PT09PT0KIApkaWZmIC0tZ2l0 IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9rdm1pLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3Vh cGkvYXNtL2t2bWkuaAppbmRleCAxMTgzNWJmOWJkYzYuLjM2MzFkYTllZWY4YyAxMDA2NDQKLS0t IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9rdm1pLmgKKysrIGIvYXJjaC94ODYvaW5jbHVk ZS91YXBpL2FzbS9rdm1pLmgKQEAgLTQ1LDQgKzQ1LDE2IEBAIHN0cnVjdCBrdm1pX3ZjcHVfZ2V0 X3JlZ2lzdGVyc19yZXBseSB7CiAJc3RydWN0IGt2bV9tc3JzIG1zcnM7CiB9OwogCitzdHJ1Y3Qg a3ZtaV92Y3B1X2dldF9jcHVpZCB7CisJX191MzIgZnVuY3Rpb247CisJX191MzIgaW5kZXg7Cit9 OworCitzdHJ1Y3Qga3ZtaV92Y3B1X2dldF9jcHVpZF9yZXBseSB7CisJX191MzIgZWF4OworCV9f dTMyIGVieDsKKwlfX3UzMiBlY3g7CisJX191MzIgZWR4OworfTsKKwogI2VuZGlmIC8qIF9VQVBJ X0FTTV9YODZfS1ZNSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0va3ZtaV9tc2cuYyBi L2FyY2gveDg2L2t2bS9rdm1pX21zZy5jCmluZGV4IGI0MTEzNzQ5YmNkMC4uZDQ4YWJmZTUxMzNi IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0va3ZtaV9tc2cuYworKysgYi9hcmNoL3g4Ni9rdm0v a3ZtaV9tc2cuYwpAQCAtNiw2ICs2LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgImNwdWlkLmgi CiAjaW5jbHVkZSAiLi4vLi4vLi4vdmlydC9rdm0vaW50cm9zcGVjdGlvbi9rdm1pX2ludC5oIgog I2luY2x1ZGUgImt2bWkuaCIKIApAQCAtMTEwLDcgKzExMSwzMiBAQCBzdGF0aWMgaW50IGhhbmRs ZV92Y3B1X3NldF9yZWdpc3RlcnMoY29uc3Qgc3RydWN0IGt2bWlfdmNwdV9tc2dfam9iICpqb2Is CiAJcmV0dXJuIGt2bWlfbXNnX3ZjcHVfcmVwbHkoam9iLCBtc2csIGVjLCBOVUxMLCAwKTsKIH0K IAorc3RhdGljIGludCBoYW5kbGVfdmNwdV9nZXRfY3B1aWQoY29uc3Qgc3RydWN0IGt2bWlfdmNw dV9tc2dfam9iICpqb2IsCisJCQkJIGNvbnN0IHN0cnVjdCBrdm1pX21zZ19oZHIgKm1zZywKKwkJ CQkgY29uc3Qgdm9pZCAqX3JlcSkKK3sKKwljb25zdCBzdHJ1Y3Qga3ZtaV92Y3B1X2dldF9jcHVp ZCAqcmVxID0gX3JlcTsKKwlzdHJ1Y3Qga3ZtaV92Y3B1X2dldF9jcHVpZF9yZXBseSBycGw7CisJ c3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmVudHJ5OworCWludCBlYyA9IDA7CisKKwllbnRyeSA9 IGt2bV9maW5kX2NwdWlkX2VudHJ5KGpvYi0+dmNwdSwgcmVxLT5mdW5jdGlvbiwgcmVxLT5pbmRl eCk7CisJaWYgKCFlbnRyeSkgeworCQllYyA9IC1LVk1fRU5PRU5UOworCX0gZWxzZSB7CisJCW1l bXNldCgmcnBsLCAwLCBzaXplb2YocnBsKSk7CisKKwkJcnBsLmVheCA9IGVudHJ5LT5lYXg7CisJ CXJwbC5lYnggPSBlbnRyeS0+ZWJ4OworCQlycGwuZWN4ID0gZW50cnktPmVjeDsKKwkJcnBsLmVk eCA9IGVudHJ5LT5lZHg7CisJfQorCisJcmV0dXJuIGt2bWlfbXNnX3ZjcHVfcmVwbHkoam9iLCBt c2csIGVjLCAmcnBsLCBzaXplb2YocnBsKSk7Cit9CisKIHN0YXRpYyBjb25zdCBrdm1pX3ZjcHVf bXNnX2pvYl9mY3QgbXNnX3ZjcHVbXSA9IHsKKwlbS1ZNSV9WQ1BVX0dFVF9DUFVJRF0gICAgID0g aGFuZGxlX3ZjcHVfZ2V0X2NwdWlkLAogCVtLVk1JX1ZDUFVfR0VUX0lORk9dICAgICAgPSBoYW5k bGVfdmNwdV9nZXRfaW5mbywKIAlbS1ZNSV9WQ1BVX0dFVF9SRUdJU1RFUlNdID0gaGFuZGxlX3Zj cHVfZ2V0X3JlZ2lzdGVycywKIAlbS1ZNSV9WQ1BVX1NFVF9SRUdJU1RFUlNdID0gaGFuZGxlX3Zj cHVfc2V0X3JlZ2lzdGVycywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm1pLmgg Yi9pbmNsdWRlL3VhcGkvbGludXgva3ZtaS5oCmluZGV4IDRiNzU2ZDM4OGFkMy4uMmM5M2EzNmJm YTQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgva3ZtaS5oCisrKyBiL2luY2x1ZGUv dWFwaS9saW51eC9rdm1pLmgKQEAgLTM5LDYgKzM5LDcgQEAgZW51bSB7CiAJS1ZNSV9WQ1BVX0NP TlRST0xfRVZFTlRTID0gS1ZNSV9WQ1BVX01FU1NBR0VfSUQoMiksCiAJS1ZNSV9WQ1BVX0dFVF9S RUdJU1RFUlMgID0gS1ZNSV9WQ1BVX01FU1NBR0VfSUQoMyksCiAJS1ZNSV9WQ1BVX1NFVF9SRUdJ U1RFUlMgID0gS1ZNSV9WQ1BVX01FU1NBR0VfSUQoNCksCisJS1ZNSV9WQ1BVX0dFVF9DUFVJRCAg ICAgID0gS1ZNSV9WQ1BVX01FU1NBR0VfSUQoNSksCiAKIAlLVk1JX05FWFRfVkNQVV9NRVNTQUdF CiB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva3ZtL3g4Nl82NC9rdm1p X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2t2bS94ODZfNjQva3ZtaV90ZXN0LmMK aW5kZXggNGU5M2I3MGRkN2QzLi44MzdkMTRkYWU0NDggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL2t2bS94ODZfNjQva3ZtaV90ZXN0LmMKKysrIGIvdG9vbHMvdGVzdGluZy9z ZWxmdGVzdHMva3ZtL3g4Nl82NC9rdm1pX3Rlc3QuYwpAQCAtOTYyLDYgKzk2MiwzNSBAQCBzdGF0 aWMgdm9pZCB0ZXN0X2NtZF92Y3B1X3NldF9yZWdpc3RlcnMoc3RydWN0IGt2bV92bSAqdm0pCiAJ d2FpdF92Y3B1X3dvcmtlcih2Y3B1X3RocmVhZCk7CiB9CiAKK3N0YXRpYyB2b2lkIGNtZF92Y3B1 X2dldF9jcHVpZChzdHJ1Y3Qga3ZtX3ZtICp2bSwKKwkJCSAgICAgICBfX3UzMiBmdW5jdGlvbiwg X191MzIgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IGt2bWlfdmNwdV9nZXRfY3B1aWRfcmVwbHkg KnJwbCkKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qga3ZtaV9tc2dfaGRyIGhkcjsKKwkJc3RydWN0 IGt2bWlfdmNwdV9oZHIgdmNwdV9oZHI7CisJCXN0cnVjdCBrdm1pX3ZjcHVfZ2V0X2NwdWlkIGNt ZDsKKwl9IHJlcSA9IHt9OworCisJcmVxLmNtZC5mdW5jdGlvbiA9IGZ1bmN0aW9uOworCXJlcS5j bWQuaW5kZXggPSBpbmRleDsKKworCXRlc3RfdmNwdTBfY29tbWFuZCh2bSwgS1ZNSV9WQ1BVX0dF VF9DUFVJRCwgJnJlcS5oZHIsIHNpemVvZihyZXEpLAorCQkJICAgcnBsLCBzaXplb2YoKnJwbCks IDApOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NtZF92Y3B1X2dldF9jcHVpZChzdHJ1Y3Qga3Zt X3ZtICp2bSkKK3sKKwlzdHJ1Y3Qga3ZtaV92Y3B1X2dldF9jcHVpZF9yZXBseSBycGwgPSB7fTsK KwlfX3UzMiBmdW5jdGlvbiA9IDA7CisJX191MzIgaW5kZXggPSAwOworCisJY21kX3ZjcHVfZ2V0 X2NwdWlkKHZtLCBmdW5jdGlvbiwgaW5kZXgsICZycGwpOworCisJcHJfZGVidWcoImNwdWlkKCV1 LCAldSkgPT4gZWF4IDB4JS44eCwgZWJ4IDB4JS44eCwgZWN4IDB4JS44eCwgZWR4IDB4JS44eFxu IiwKKwkgICAgICBmdW5jdGlvbiwgaW5kZXgsIHJwbC5lYXgsIHJwbC5lYngsIHJwbC5lY3gsIHJw bC5lZHgpOworfQorCiBzdGF0aWMgdm9pZCB0ZXN0X2ludHJvc3BlY3Rpb24oc3RydWN0IGt2bV92 bSAqdm0pCiB7CiAJc3JhbmRvbSh0aW1lKDApKTsKQEAgLTk4MSw2ICsxMDEwLDcgQEAgc3RhdGlj IHZvaWQgdGVzdF9pbnRyb3NwZWN0aW9uKHN0cnVjdCBrdm1fdm0gKnZtKQogCXRlc3RfY21kX3Zj cHVfY29udHJvbF9ldmVudHModm0pOwogCXRlc3RfY21kX3ZjcHVfZ2V0X3JlZ2lzdGVycyh2bSk7 CiAJdGVzdF9jbWRfdmNwdV9zZXRfcmVnaXN0ZXJzKHZtKTsKKwl0ZXN0X2NtZF92Y3B1X2dldF9j cHVpZCh2bSk7CiAKIAl1bmhvb2tfaW50cm9zcGVjdGlvbih2bSk7CiB9Cl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1YWxpemF0aW9uIG1haWxpbmcg bGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xp c3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby92aXJ0dWFsaXphdGlvbg==