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 6E4D8C433F5 for ; Wed, 6 Oct 2021 17:41:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5954C6052B for ; Wed, 6 Oct 2021 17:41:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239661AbhJFRnN (ORCPT ); Wed, 6 Oct 2021 13:43:13 -0400 Received: from mx01.bbu.dsd.mx.bitdefender.com ([91.199.104.161]:53560 "EHLO mx01.bbu.dsd.mx.bitdefender.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239239AbhJFRmk (ORCPT ); Wed, 6 Oct 2021 13:42:40 -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 2770E305CD43; Wed, 6 Oct 2021 20:31:11 +0300 (EEST) Received: from localhost (unknown [91.199.104.28]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 0D3783011FD8; Wed, 6 Oct 2021 20:31:11 +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 , =?UTF-8?q?Mihai=20Don=C8=9Bu?= , =?UTF-8?q?Mircea=20C=C3=AErjaliu?= , =?UTF-8?q?Adalbert=20Laz=C4=83r?= Subject: [PATCH v12 42/77] KVM: introspection: handle vCPU introspection requests Date: Wed, 6 Oct 2021 20:30:38 +0300 Message-Id: <20211006173113.26445-43-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: Mihai Donțu The receiving thread dispatches the vCPU introspection commands by adding them to the vCPU's jobs list and kicking the vCPU. Before entering in guest, the vCPU thread checks the introspection request (KVM_REQ_INTROSPECTION) and runs its queued jobs. Signed-off-by: Mihai Donțu Co-developed-by: Mircea Cîrjaliu Signed-off-by: Mircea Cîrjaliu Co-developed-by: Adalbert Lazăr Signed-off-by: Adalbert Lazăr --- arch/x86/kvm/x86.c | 3 ++ include/linux/kvm_host.h | 1 + include/linux/kvmi_host.h | 4 ++ virt/kvm/introspection/kvmi.c | 73 +++++++++++++++++++++++++++++++++++ virt/kvm/kvm_main.c | 2 + 5 files changed, 83 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ee08fb330f0f..0315c5a94af3 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -9827,6 +9827,9 @@ static int vcpu_run(struct kvm_vcpu *vcpu) vcpu->arch.l1tf_flush_l1d = true; for (;;) { + if (kvm_check_request(KVM_REQ_INTROSPECTION, vcpu)) + kvmi_handle_requests(vcpu); + if (kvm_vcpu_running(vcpu)) { r = vcpu_enter_guest(vcpu); } else { diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 30bf1227c4a7..7d429d3afbb6 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -151,6 +151,7 @@ static inline bool is_error_page(struct page *page) #define KVM_REQ_UNBLOCK 2 #define KVM_REQ_UNHALT 3 #define KVM_REQ_VM_BUGGED (4 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) +#define KVM_REQ_INTROSPECTION 5 #define KVM_REQUEST_ARCH_BASE 8 #define KVM_ARCH_REQ_FLAGS(nr, flags) ({ \ diff --git a/include/linux/kvmi_host.h b/include/linux/kvmi_host.h index b3874419511d..736edb400c05 100644 --- a/include/linux/kvmi_host.h +++ b/include/linux/kvmi_host.h @@ -53,6 +53,8 @@ int kvmi_ioctl_event(struct kvm *kvm, const struct kvm_introspection_feature *feat); int kvmi_ioctl_preunhook(struct kvm *kvm); +void kvmi_handle_requests(struct kvm_vcpu *vcpu); + #else static inline int kvmi_version(void) { return 0; } @@ -62,6 +64,8 @@ static inline void kvmi_create_vm(struct kvm *kvm) { } static inline void kvmi_destroy_vm(struct kvm *kvm) { } static inline void kvmi_vcpu_uninit(struct kvm_vcpu *vcpu) { } +static inline void kvmi_handle_requests(struct kvm_vcpu *vcpu) { } + #endif /* CONFIG_KVM_INTROSPECTION */ #endif diff --git a/virt/kvm/introspection/kvmi.c b/virt/kvm/introspection/kvmi.c index e8d2d280fb43..93b1bec23e48 100644 --- a/virt/kvm/introspection/kvmi.c +++ b/virt/kvm/introspection/kvmi.c @@ -124,6 +124,12 @@ void kvmi_uninit(void) kvmi_cache_destroy(); } +static void kvmi_make_request(struct kvm_vcpu *vcpu) +{ + kvm_make_request(KVM_REQ_INTROSPECTION, vcpu); + kvm_vcpu_kick(vcpu); +} + static int __kvmi_add_job(struct kvm_vcpu *vcpu, void (*fct)(struct kvm_vcpu *vcpu, void *ctx), void *ctx, void (*free_fct)(void *ctx)) @@ -155,6 +161,9 @@ int kvmi_add_job(struct kvm_vcpu *vcpu, err = __kvmi_add_job(vcpu, fct, ctx, free_fct); + if (!err) + kvmi_make_request(vcpu); + return err; } @@ -323,6 +332,14 @@ int kvmi_ioctl_unhook(struct kvm *kvm) return 0; } +struct kvm_introspection * __must_check kvmi_get(struct kvm *kvm) +{ + if (refcount_inc_not_zero(&kvm->kvmi_ref)) + return kvm->kvmi; + + return NULL; +} + static void kvmi_put(struct kvm *kvm) { if (refcount_dec_and_test(&kvm->kvmi_ref)) @@ -340,6 +357,19 @@ static int __kvmi_hook(struct kvm *kvm, return 0; } +static void kvmi_job_release_vcpu(struct kvm_vcpu *vcpu, void *ctx) +{ +} + +static void kvmi_release_vcpus(struct kvm *kvm) +{ + struct kvm_vcpu *vcpu; + int i; + + kvm_for_each_vcpu(i, vcpu, kvm) + kvmi_add_job(vcpu, kvmi_job_release_vcpu, NULL, NULL); +} + static int kvmi_recv_thread(void *arg) { struct kvm_introspection *kvmi = arg; @@ -350,6 +380,8 @@ static int kvmi_recv_thread(void *arg) /* Signal userspace and prevent the vCPUs from sending events. */ kvmi_sock_shutdown(kvmi); + kvmi_release_vcpus(kvmi->kvm); + kvmi_put(kvmi->kvm); return 0; } @@ -382,6 +414,10 @@ static int kvmi_hook(struct kvm *kvm, init_completion(&kvm->kvmi_complete); refcount_set(&kvm->kvmi_ref, 1); + /* + * Paired with refcount_inc_not_zero() from kvmi_get(). + */ + smp_wmb(); kvmi->recv = kthread_run(kvmi_recv_thread, kvmi, "kvmi-recv"); if (IS_ERR(kvmi->recv)) { @@ -670,3 +706,40 @@ int kvmi_cmd_write_physical(struct kvm *kvm, u64 gpa, size_t size, return ec; } + +static struct kvmi_job *kvmi_pull_job(struct kvm_vcpu_introspection *vcpui) +{ + struct kvmi_job *job = NULL; + + spin_lock(&vcpui->job_lock); + job = list_first_entry_or_null(&vcpui->job_list, typeof(*job), link); + if (job) + list_del(&job->link); + spin_unlock(&vcpui->job_lock); + + return job; +} + +void kvmi_run_jobs(struct kvm_vcpu *vcpu) +{ + struct kvm_vcpu_introspection *vcpui = VCPUI(vcpu); + struct kvmi_job *job; + + while ((job = kvmi_pull_job(vcpui))) { + job->fct(vcpu, job->ctx); + kvmi_free_job(job); + } +} + +void kvmi_handle_requests(struct kvm_vcpu *vcpu) +{ + struct kvm_introspection *kvmi; + + kvmi = kvmi_get(vcpu->kvm); + if (!kvmi) + return; + + kvmi_run_jobs(vcpu); + + kvmi_put(vcpu->kvm); +} diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index d70ec110696f..fd05869d703a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3202,6 +3202,8 @@ static int kvm_vcpu_check_block(struct kvm_vcpu *vcpu) goto out; if (kvm_check_request(KVM_REQ_UNBLOCK, vcpu)) goto out; + if (kvm_test_request(KVM_REQ_INTROSPECTION, vcpu)) + goto out; ret = 0; out: 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 6D368C433F5 for ; Wed, 6 Oct 2021 17:50:45 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 36EAC61151 for ; Wed, 6 Oct 2021 17:50:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 36EAC61151 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 smtp4.osuosl.org (Postfix) with ESMTP id ED833405CC; Wed, 6 Oct 2021 17:50:44 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4yDDYEvepYPb; Wed, 6 Oct 2021 17:50:44 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 83913405FD; Wed, 6 Oct 2021 17:50:43 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 76001C0027; Wed, 6 Oct 2021 17:50:42 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4C41DC001D for ; Wed, 6 Oct 2021 17:50:41 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 1BB42405E9 for ; Wed, 6 Oct 2021 17:50:41 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SmalmXRiAvGF for ; Wed, 6 Oct 2021 17:50:40 +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 smtp4.osuosl.org (Postfix) with ESMTPS id 1F37F405CC for ; Wed, 6 Oct 2021 17:50:40 +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 2770E305CD43; Wed, 6 Oct 2021 20:31:11 +0300 (EEST) Received: from localhost (unknown [91.199.104.28]) by smtp.bitdefender.com (Postfix) with ESMTPSA id 0D3783011FD8; Wed, 6 Oct 2021 20:31:11 +0300 (EEST) X-Is-Junk-Enabled: fGZTSsP0qEJE2AIKtlSuFiRRwg9xyHmJ From: =?UTF-8?q?Adalbert=20Laz=C4=83r?= To: kvm@vger.kernel.org Subject: [PATCH v12 42/77] KVM: introspection: handle vCPU introspection requests Date: Wed, 6 Oct 2021 20:30:38 +0300 Message-Id: <20211006173113.26445-43-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?= , Mathieu Tarral , =?UTF-8?q?Mircea=20C=C3=AErjaliu?= , Paolo Bonzini , =?UTF-8?q?Mihai=20Don=C8=9Bu?= , 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" RnJvbTogTWloYWkgRG9uyJt1IDxtZG9udHVAYml0ZGVmZW5kZXIuY29tPgoKVGhlIHJlY2Vpdmlu ZyB0aHJlYWQgZGlzcGF0Y2hlcyB0aGUgdkNQVSBpbnRyb3NwZWN0aW9uIGNvbW1hbmRzIGJ5CmFk ZGluZyB0aGVtIHRvIHRoZSB2Q1BVJ3Mgam9icyBsaXN0IGFuZCBraWNraW5nIHRoZSB2Q1BVLiBC ZWZvcmUKZW50ZXJpbmcgaW4gZ3Vlc3QsIHRoZSB2Q1BVIHRocmVhZCBjaGVja3MgdGhlIGludHJv c3BlY3Rpb24gcmVxdWVzdAooS1ZNX1JFUV9JTlRST1NQRUNUSU9OKSBhbmQgcnVucyBpdHMgcXVl dWVkIGpvYnMuCgpTaWduZWQtb2ZmLWJ5OiBNaWhhaSBEb27Im3UgPG1kb250dUBiaXRkZWZlbmRl ci5jb20+CkNvLWRldmVsb3BlZC1ieTogTWlyY2VhIEPDrnJqYWxpdSA8bWNpcmphbGl1QGJpdGRl ZmVuZGVyLmNvbT4KU2lnbmVkLW9mZi1ieTogTWlyY2VhIEPDrnJqYWxpdSA8bWNpcmphbGl1QGJp dGRlZmVuZGVyLmNvbT4KQ28tZGV2ZWxvcGVkLWJ5OiBBZGFsYmVydCBMYXrEg3IgPGFsYXphckBi aXRkZWZlbmRlci5jb20+ClNpZ25lZC1vZmYtYnk6IEFkYWxiZXJ0IExhesSDciA8YWxhemFyQGJp dGRlZmVuZGVyLmNvbT4KLS0tCiBhcmNoL3g4Ni9rdm0veDg2LmMgICAgICAgICAgICB8ICAzICsr CiBpbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggICAgICB8ICAxICsKIGluY2x1ZGUvbGludXgva3Zt aV9ob3N0LmggICAgIHwgIDQgKysKIHZpcnQva3ZtL2ludHJvc3BlY3Rpb24va3ZtaS5jIHwgNzMg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHZpcnQva3ZtL2t2bV9tYWluLmMg ICAgICAgICAgIHwgIDIgKwogNSBmaWxlcyBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspCgpkaWZm IC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IGVl MDhmYjMzMGYwZi4uMDMxNWM1YTk0YWYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmMK KysrIGIvYXJjaC94ODYva3ZtL3g4Ni5jCkBAIC05ODI3LDYgKzk4MjcsOSBAQCBzdGF0aWMgaW50 IHZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAl2Y3B1LT5hcmNoLmwxdGZfZmx1c2hf bDFkID0gdHJ1ZTsKIAogCWZvciAoOzspIHsKKwkJaWYgKGt2bV9jaGVja19yZXF1ZXN0KEtWTV9S RVFfSU5UUk9TUEVDVElPTiwgdmNwdSkpCisJCQlrdm1pX2hhbmRsZV9yZXF1ZXN0cyh2Y3B1KTsK KwogCQlpZiAoa3ZtX3ZjcHVfcnVubmluZyh2Y3B1KSkgewogCQkJciA9IHZjcHVfZW50ZXJfZ3Vl c3QodmNwdSk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0 LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggMzBiZjEyMjdjNGE3Li43ZDQyOWQz YWZiYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAorKysgYi9pbmNsdWRl L2xpbnV4L2t2bV9ob3N0LmgKQEAgLTE1MSw2ICsxNTEsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wg aXNfZXJyb3JfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKICNkZWZpbmUgS1ZNX1JFUV9VTkJMT0NL ICAgICAgICAgICAyCiAjZGVmaW5lIEtWTV9SRVFfVU5IQUxUICAgICAgICAgICAgMwogI2RlZmlu ZSBLVk1fUkVRX1ZNX0JVR0dFRCAgICAgICAgICg0IHwgS1ZNX1JFUVVFU1RfV0FJVCB8IEtWTV9S RVFVRVNUX05PX1dBS0VVUCkKKyNkZWZpbmUgS1ZNX1JFUV9JTlRST1NQRUNUSU9OICAgICA1CiAj ZGVmaW5lIEtWTV9SRVFVRVNUX0FSQ0hfQkFTRSAgICAgOAogCiAjZGVmaW5lIEtWTV9BUkNIX1JF UV9GTEFHUyhuciwgZmxhZ3MpICh7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtaV9o b3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bWlfaG9zdC5oCmluZGV4IGIzODc0NDE5NTExZC4uNzM2 ZWRiNDAwYzA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bWlfaG9zdC5oCisrKyBiL2lu Y2x1ZGUvbGludXgva3ZtaV9ob3N0LmgKQEAgLTUzLDYgKzUzLDggQEAgaW50IGt2bWlfaW9jdGxf ZXZlbnQoc3RydWN0IGt2bSAqa3ZtLAogCQkgICAgIGNvbnN0IHN0cnVjdCBrdm1faW50cm9zcGVj dGlvbl9mZWF0dXJlICpmZWF0KTsKIGludCBrdm1pX2lvY3RsX3ByZXVuaG9vayhzdHJ1Y3Qga3Zt ICprdm0pOwogCit2b2lkIGt2bWlfaGFuZGxlX3JlcXVlc3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNw dSk7CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IGt2bWlfdmVyc2lvbih2b2lkKSB7IHJl dHVybiAwOyB9CkBAIC02Miw2ICs2NCw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1pX2NyZWF0 ZV92bShzdHJ1Y3Qga3ZtICprdm0pIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGt2bWlfZGVzdHJv eV92bShzdHJ1Y3Qga3ZtICprdm0pIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGt2bWlfdmNwdV91 bmluaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7IH0KIAorc3RhdGljIGlubGluZSB2b2lkIGt2 bWlfaGFuZGxlX3JlcXVlc3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkgeyB9CisKICNlbmRpZiAv KiBDT05GSUdfS1ZNX0lOVFJPU1BFQ1RJT04gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS92aXJ0 L2t2bS9pbnRyb3NwZWN0aW9uL2t2bWkuYyBiL3ZpcnQva3ZtL2ludHJvc3BlY3Rpb24va3ZtaS5j CmluZGV4IGU4ZDJkMjgwZmI0My4uOTNiMWJlYzIzZTQ4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9p bnRyb3NwZWN0aW9uL2t2bWkuYworKysgYi92aXJ0L2t2bS9pbnRyb3NwZWN0aW9uL2t2bWkuYwpA QCAtMTI0LDYgKzEyNCwxMiBAQCB2b2lkIGt2bWlfdW5pbml0KHZvaWQpCiAJa3ZtaV9jYWNoZV9k ZXN0cm95KCk7CiB9CiAKK3N0YXRpYyB2b2lkIGt2bWlfbWFrZV9yZXF1ZXN0KHN0cnVjdCBrdm1f dmNwdSAqdmNwdSkKK3sKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfSU5UUk9TUEVDVElPTiwg dmNwdSk7CisJa3ZtX3ZjcHVfa2ljayh2Y3B1KTsKK30KKwogc3RhdGljIGludCBfX2t2bWlfYWRk X2pvYihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkgIHZvaWQgKCpmY3QpKHN0cnVjdCBrdm1f dmNwdSAqdmNwdSwgdm9pZCAqY3R4KSwKIAkJCSAgdm9pZCAqY3R4LCB2b2lkICgqZnJlZV9mY3Qp KHZvaWQgKmN0eCkpCkBAIC0xNTUsNiArMTYxLDkgQEAgaW50IGt2bWlfYWRkX2pvYihzdHJ1Y3Qg a3ZtX3ZjcHUgKnZjcHUsCiAKIAllcnIgPSBfX2t2bWlfYWRkX2pvYih2Y3B1LCBmY3QsIGN0eCwg ZnJlZV9mY3QpOwogCisJaWYgKCFlcnIpCisJCWt2bWlfbWFrZV9yZXF1ZXN0KHZjcHUpOworCiAJ cmV0dXJuIGVycjsKIH0KIApAQCAtMzIzLDYgKzMzMiwxNCBAQCBpbnQga3ZtaV9pb2N0bF91bmhv b2soc3RydWN0IGt2bSAqa3ZtKQogCXJldHVybiAwOwogfQogCitzdHJ1Y3Qga3ZtX2ludHJvc3Bl Y3Rpb24gKiBfX211c3RfY2hlY2sga3ZtaV9nZXQoc3RydWN0IGt2bSAqa3ZtKQoreworCWlmIChy ZWZjb3VudF9pbmNfbm90X3plcm8oJmt2bS0+a3ZtaV9yZWYpKQorCQlyZXR1cm4ga3ZtLT5rdm1p OworCisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGt2bWlfcHV0KHN0cnVjdCBrdm0g Kmt2bSkKIHsKIAlpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KCZrdm0tPmt2bWlfcmVmKSkKQEAg LTM0MCw2ICszNTcsMTkgQEAgc3RhdGljIGludCBfX2t2bWlfaG9vayhzdHJ1Y3Qga3ZtICprdm0s CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGt2bWlfam9iX3JlbGVhc2VfdmNwdShzdHJ1 Y3Qga3ZtX3ZjcHUgKnZjcHUsIHZvaWQgKmN0eCkKK3sKK30KKworc3RhdGljIHZvaWQga3ZtaV9y ZWxlYXNlX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7 CisJaW50IGk7CisKKwlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBrdm0pCisJCWt2bWlfYWRk X2pvYih2Y3B1LCBrdm1pX2pvYl9yZWxlYXNlX3ZjcHUsIE5VTEwsIE5VTEwpOworfQorCiBzdGF0 aWMgaW50IGt2bWlfcmVjdl90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBrdm1faW50cm9z cGVjdGlvbiAqa3ZtaSA9IGFyZzsKQEAgLTM1MCw2ICszODAsOCBAQCBzdGF0aWMgaW50IGt2bWlf cmVjdl90aHJlYWQodm9pZCAqYXJnKQogCS8qIFNpZ25hbCB1c2Vyc3BhY2UgYW5kIHByZXZlbnQg dGhlIHZDUFVzIGZyb20gc2VuZGluZyBldmVudHMuICovCiAJa3ZtaV9zb2NrX3NodXRkb3duKGt2 bWkpOwogCisJa3ZtaV9yZWxlYXNlX3ZjcHVzKGt2bWktPmt2bSk7CisKIAlrdm1pX3B1dChrdm1p LT5rdm0pOwogCXJldHVybiAwOwogfQpAQCAtMzgyLDYgKzQxNCwxMCBAQCBzdGF0aWMgaW50IGt2 bWlfaG9vayhzdHJ1Y3Qga3ZtICprdm0sCiAJaW5pdF9jb21wbGV0aW9uKCZrdm0tPmt2bWlfY29t cGxldGUpOwogCiAJcmVmY291bnRfc2V0KCZrdm0tPmt2bWlfcmVmLCAxKTsKKwkvKgorCSAqIFBh aXJlZCB3aXRoIHJlZmNvdW50X2luY19ub3RfemVybygpIGZyb20ga3ZtaV9nZXQoKS4KKwkgKi8K KwlzbXBfd21iKCk7CiAKIAlrdm1pLT5yZWN2ID0ga3RocmVhZF9ydW4oa3ZtaV9yZWN2X3RocmVh ZCwga3ZtaSwgImt2bWktcmVjdiIpOwogCWlmIChJU19FUlIoa3ZtaS0+cmVjdikpIHsKQEAgLTY3 MCwzICs3MDYsNDAgQEAgaW50IGt2bWlfY21kX3dyaXRlX3BoeXNpY2FsKHN0cnVjdCBrdm0gKmt2 bSwgdTY0IGdwYSwgc2l6ZV90IHNpemUsCiAKIAlyZXR1cm4gZWM7CiB9CisKK3N0YXRpYyBzdHJ1 Y3Qga3ZtaV9qb2IgKmt2bWlfcHVsbF9qb2Ioc3RydWN0IGt2bV92Y3B1X2ludHJvc3BlY3Rpb24g KnZjcHVpKQoreworCXN0cnVjdCBrdm1pX2pvYiAqam9iID0gTlVMTDsKKworCXNwaW5fbG9jaygm dmNwdWktPmpvYl9sb2NrKTsKKwlqb2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnZjcHVp LT5qb2JfbGlzdCwgdHlwZW9mKCpqb2IpLCBsaW5rKTsKKwlpZiAoam9iKQorCQlsaXN0X2RlbCgm am9iLT5saW5rKTsKKwlzcGluX3VubG9jaygmdmNwdWktPmpvYl9sb2NrKTsKKworCXJldHVybiBq b2I7Cit9CisKK3ZvaWQga3ZtaV9ydW5fam9icyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJ c3RydWN0IGt2bV92Y3B1X2ludHJvc3BlY3Rpb24gKnZjcHVpID0gVkNQVUkodmNwdSk7CisJc3Ry dWN0IGt2bWlfam9iICpqb2I7CisKKwl3aGlsZSAoKGpvYiA9IGt2bWlfcHVsbF9qb2IodmNwdWkp KSkgeworCQlqb2ItPmZjdCh2Y3B1LCBqb2ItPmN0eCk7CisJCWt2bWlfZnJlZV9qb2Ioam9iKTsK Kwl9Cit9CisKK3ZvaWQga3ZtaV9oYW5kbGVfcmVxdWVzdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1 KQoreworCXN0cnVjdCBrdm1faW50cm9zcGVjdGlvbiAqa3ZtaTsKKworCWt2bWkgPSBrdm1pX2dl dCh2Y3B1LT5rdm0pOworCWlmICgha3ZtaSkKKwkJcmV0dXJuOworCisJa3ZtaV9ydW5fam9icyh2 Y3B1KTsKKworCWt2bWlfcHV0KHZjcHUtPmt2bSk7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9r dm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCBkNzBlYzExMDY5NmYuLmZkMDU4 NjlkNzAzYSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9r dm1fbWFpbi5jCkBAIC0zMjAyLDYgKzMyMDIsOCBAQCBzdGF0aWMgaW50IGt2bV92Y3B1X2NoZWNr X2Jsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAkJZ290byBvdXQ7CiAJaWYgKGt2bV9jaGVj a19yZXF1ZXN0KEtWTV9SRVFfVU5CTE9DSywgdmNwdSkpCiAJCWdvdG8gb3V0OworCWlmIChrdm1f dGVzdF9yZXF1ZXN0KEtWTV9SRVFfSU5UUk9TUEVDVElPTiwgdmNwdSkpCisJCWdvdG8gb3V0Owog CiAJcmV0ID0gMDsKIG91dDoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KVmlydHVhbGl6YXRpb24gbWFpbGluZyBsaXN0ClZpcnR1YWxpemF0aW9uQGxpc3Rz LmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9t YWlsbWFuL2xpc3RpbmZvL3ZpcnR1YWxpemF0aW9u