From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OIrGPTB/; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTP id 935E65A004C for ; Mon, 07 Oct 2024 16:41:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1728312064; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=n2/txRI6XX7jd6Ri8VRYaJj2jKZ5fIAC/XKg4cE8lpc=; b=OIrGPTB/lIJz9hCe54rlSlPOHK6b4qt6XS9GOz01Z4fHOBqaAKJsdqU6Cx6LSaaxSMr1Zs ITKf/VVEvQ120qx+MyUCi8oCWPEDQ1PSuU0sMU5k6PcREs+owtL6QS+XHKVzeUE71t4zvo APupH7I9PfaS9+7pD+RwDnbbXkdwxec= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-682-6RsQ-JqaO3i9dJgfhyMFKg-1; Mon, 07 Oct 2024 10:41:03 -0400 X-MC-Unique: 6RsQ-JqaO3i9dJgfhyMFKg-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 79D8B194510A for ; Mon, 7 Oct 2024 14:41:02 +0000 (UTC) Received: from lenovo-t14s.redhat.com (unknown [10.39.192.162]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 457A01956052; Mon, 7 Oct 2024 14:41:01 +0000 (UTC) From: Laurent Vivier To: passt-dev@passt.top Subject: [PATCH v6 3/7] vhost-user: introduce vhost-user API Date: Mon, 7 Oct 2024 16:40:49 +0200 Message-ID: <20241007144054.41868-4-lvivier@redhat.com> In-Reply-To: <20241007144054.41868-1-lvivier@redhat.com> References: <20241007144054.41868-1-lvivier@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Message-ID-Hash: ISCAMFS5UR3VDKF24AO5GDTMP7JD73XN X-Message-ID-Hash: ISCAMFS5UR3VDKF24AO5GDTMP7JD73XN X-MailFrom: lvivier@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Laurent Vivier X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: QWRkIHZob3N0X3VzZXIuYyBhbmQgdmhvc3RfdXNlci5oIHRoYXQgZGVmaW5lIHRoZSBmdW5jdGlv bnMgbmVlZGVkDQp0byBpbXBsZW1lbnQgdmhvc3QtdXNlciBiYWNrZW5kLg0KDQpTaWduZWQtb2Zm LWJ5OiBMYXVyZW50IFZpdmllciA8bHZpdmllckByZWRoYXQuY29tPg0KLS0tDQogTWFrZWZpbGUg ICAgIHwgICA0ICstDQogdmhvc3RfdXNlci5jIHwgOTk5ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KIHZob3N0X3VzZXIuaCB8IDIwOCArKysrKysr KysrKw0KIHZpcnRpby5oICAgICB8ICAgMSArDQogNCBmaWxlcyBjaGFuZ2VkLCAxMjEwIGluc2Vy dGlvbnMoKyksIDIgZGVsZXRpb25zKC0pDQogY3JlYXRlIG1vZGUgMTAwNjQ0IHZob3N0X3VzZXIu Yw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB2aG9zdF91c2VyLmgNCg0KZGlmZiAtLWdpdCBhL01ha2Vm aWxlIGIvTWFrZWZpbGUNCmluZGV4IGEyMjU4ODkxZjEwNC4uMGU4ZWQ2MGEwZGExIDEwMDY0NA0K LS0tIGEvTWFrZWZpbGUNCisrKyBiL01ha2VmaWxlDQpAQCAtNTQsNyArNTQsNyBAQCBGTEFHUyAr PSAtRERVQUxfU1RBQ0tfU09DS0VUUz0kKERVQUxfU1RBQ0tfU09DS0VUUykNCiBQQVNTVF9TUkNT ID0gYXJjaC5jIGFycC5jIGNoZWNrc3VtLmMgY29uZi5jIGRoY3AuYyBkaGNwdjYuYyBmbG93LmMg ZndkLmMgXA0KIAlpY21wLmMgaWdtcC5jIGluYW55LmMgaW92LmMgaXAuYyBpc29sYXRpb24uYyBs aW5lcmVhZC5jIGxvZy5jIG1sZC5jIFwNCiAJbmRwLmMgbmV0bGluay5jIHBhY2tldC5jIHBhc3N0 LmMgcGFzdGEuYyBwY2FwLmMgcGlmLmMgdGFwLmMgdGNwLmMgXA0KLQl0Y3BfYnVmLmMgdGNwX3Nw bGljZS5jIHVkcC5jIHVkcF9mbG93LmMgdXRpbC5jIHZpcnRpby5jDQorCXRjcF9idWYuYyB0Y3Bf c3BsaWNlLmMgdWRwLmMgdWRwX2Zsb3cuYyB1dGlsLmMgdmhvc3RfdXNlci5jIHZpcnRpby5jDQog UVJBUF9TUkNTID0gcXJhcC5jDQogU1JDUyA9ICQoUEFTU1RfU1JDUykgJChRUkFQX1NSQ1MpDQog DQpAQCAtNjQsNyArNjQsNyBAQCBQQVNTVF9IRUFERVJTID0gYXJjaC5oIGFycC5oIGNoZWNrc3Vt LmggY29uZi5oIGRoY3AuaCBkaGNwdjYuaCBmbG93LmggZndkLmggXA0KIAlmbG93X3RhYmxlLmgg aWNtcC5oIGljbXBfZmxvdy5oIGluYW55LmggaW92LmggaXAuaCBpc29sYXRpb24uaCBcDQogCWxp bmVyZWFkLmggbG9nLmggbmRwLmggbmV0bGluay5oIHBhY2tldC5oIHBhc3N0LmggcGFzdGEuaCBw Y2FwLmggcGlmLmggXA0KIAlzaXBoYXNoLmggdGFwLmggdGNwLmggdGNwX2J1Zi5oIHRjcF9jb25u LmggdGNwX2ludGVybmFsLmggdGNwX3NwbGljZS5oIFwNCi0JdWRwLmggdWRwX2Zsb3cuaCB1dGls LmggdmlydGlvLmgNCisJdWRwLmggdWRwX2Zsb3cuaCB1dGlsLmggdmhvc3RfdXNlci5oIHZpcnRp by5oDQogSEVBREVSUyA9ICQoUEFTU1RfSEVBREVSUykgc2VjY29tcC5oDQogDQogQyA6PSBcI2lu Y2x1ZGUgPGxpbnV4L3RjcC5oPlxuc3RydWN0IHRjcF9pbmZvIHggPSB7IC50Y3BpX3NuZF93bmQg PSAwIH07DQpkaWZmIC0tZ2l0IGEvdmhvc3RfdXNlci5jIGIvdmhvc3RfdXNlci5jDQpuZXcgZmls ZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi45NTJlOTdlZmFhZTgNCi0tLSAvZGV2 L251bGwNCisrKyBiL3Zob3N0X3VzZXIuYw0KQEAgLTAsMCArMSw5OTkgQEANCisvLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcg0KKy8qDQorICogdmhvc3QtdXNlciBB UEksIGNvbW1hbmQgbWFuYWdlbWVudCBhbmQgdmlydGlvIGludGVyZmFjZQ0KKyAqDQorICogQ29w eXJpZ2h0IFJlZCBIYXQNCisgKiBBdXRob3I6IExhdXJlbnQgVml2aWVyIDxsdml2aWVyQHJlZGhh dC5jb20+DQorICoNCisgKiBTb21lIHBhcnRzIGZyb20gUUVNVSBzdWJwcm9qZWN0cy9saWJ2aG9z dC11c2VyL2xpYnZob3N0LXVzZXIuYw0KKyAqIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcg dGVybXM6DQorICoNCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA3DQorICogQ29weXJpZ2h0 IChjKSAyMDE2IFJlZCBIYXQsIEluYy4NCisgKg0KKyAqIEF1dGhvcnM6DQorICogIEFudGhvbnkg TGlndW9yaSA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4NCisgKiAgTWFyYy1BbmRyw6kgTHVyZWF1IDxt bHVyZWF1QHJlZGhhdC5jb20+DQorICogIFZpY3RvciBLYXBsYW5za3kgPHZpY3RvcmtAcmVkaGF0 LmNvbT4NCisgKg0KKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvcg0KKyAqIGxhdGVyLiAgU2VlIHRoZSBDT1BZSU5HIGZp bGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuDQorICovDQorDQorI2luY2x1ZGUgPGVycm5v Lmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRl IDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8c3RkZGVmLmg+DQor I2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxhc3NlcnQuaD4NCisjaW5jbHVkZSA8c3Rk Ym9vbC5oPg0KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPg0KKyNpbmNsdWRlIDx0aW1lLmg+DQorI2lu Y2x1ZGUgPG5ldC9ldGhlcm5ldC5oPg0KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQorI2luY2x1 ZGUgPHN5cy9lcG9sbC5oPg0KKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPg0KKyNpbmNsdWRlIDxz eXMvbW1hbi5oPg0KKyNpbmNsdWRlIDxsaW51eC92aG9zdF90eXBlcy5oPg0KKyNpbmNsdWRlIDxs aW51eC92aXJ0aW9fbmV0Lmg+DQorDQorI2luY2x1ZGUgInV0aWwuaCINCisjaW5jbHVkZSAicGFz c3QuaCINCisjaW5jbHVkZSAidGFwLmgiDQorI2luY2x1ZGUgInZob3N0X3VzZXIuaCINCisjaW5j bHVkZSAicGNhcC5oIg0KKw0KKy8qIHZob3N0LXVzZXIgdmVyc2lvbiB3ZSBhcmUgY29tcGF0aWJs ZSB3aXRoICovDQorI2RlZmluZSBWSE9TVF9VU0VSX1ZFUlNJT04gMQ0KKw0KKy8qKg0KKyAqIHZ1 X3ByaW50X2NhcGFiaWxpdGllcygpIC0gcHJpbnQgdmhvc3QtdXNlciBjYXBhYmlsaXRpZXMNCisg KiAJCQkgICAgIHRoaXMgaXMgcGFydCBvZiB0aGUgdmhvc3QtdXNlciBiYWNrZW5kDQorICogCQkJ ICAgICBjb252ZW50aW9uLg0KKyAqLw0KKy8qIGNwcGNoZWNrLXN1cHByZXNzIHVudXNlZEZ1bmN0 aW9uICovDQordm9pZCB2dV9wcmludF9jYXBhYmlsaXRpZXModm9pZCkNCit7DQorCWluZm8oInsi KTsNCisJaW5mbygiICBcInR5cGVcIjogXCJuZXRcIiIpOw0KKwlpbmZvKCJ9Iik7DQorCWV4aXQo RVhJVF9TVUNDRVNTKTsNCit9DQorDQorLyoqDQorICogdnVfcmVxdWVzdF90b19zdHJpbmcoKSAt IGNvbnZlcnQgYSB2aG9zdC11c2VyIHJlcXVlc3QgbnVtYmVyIHRvIGl0cyBuYW1lDQorICogQHJl cToJcmVxdWVzdCBudW1iZXINCisgKg0KKyAqIFJldHVybjogdGhlIG5hbWUgb2YgcmVxdWVzdCBu dW1iZXINCisgKi8NCitzdGF0aWMgY29uc3QgY2hhciAqdnVfcmVxdWVzdF90b19zdHJpbmcodW5z aWduZWQgaW50IHJlcSkNCit7DQorCWlmIChyZXEgPCBWSE9TVF9VU0VSX01BWCkgew0KKyNkZWZp bmUgUkVRKHJlcSkgW3JlcV0gPSAjcmVxDQorCQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZ1 X3JlcXVlc3Rfc3RyW1ZIT1NUX1VTRVJfTUFYXSA9IHsNCisJCQlSRVEoVkhPU1RfVVNFUl9OT05F KSwNCisJCQlSRVEoVkhPU1RfVVNFUl9HRVRfRkVBVFVSRVMpLA0KKwkJCVJFUShWSE9TVF9VU0VS X1NFVF9GRUFUVVJFUyksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX09XTkVSKSwNCisJCQlSRVEo VkhPU1RfVVNFUl9SRVNFVF9PV05FUiksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX01FTV9UQUJM RSksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX0xPR19CQVNFKSwNCisJCQlSRVEoVkhPU1RfVVNF Ul9TRVRfTE9HX0ZEKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9TRVRfVlJJTkdfTlVNKSwNCisJCQlS RVEoVkhPU1RfVVNFUl9TRVRfVlJJTkdfQUREUiksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX1ZS SU5HX0JBU0UpLA0KKwkJCVJFUShWSE9TVF9VU0VSX0dFVF9WUklOR19CQVNFKSwNCisJCQlSRVEo VkhPU1RfVVNFUl9TRVRfVlJJTkdfS0lDSyksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX1ZSSU5H X0NBTEwpLA0KKwkJCVJFUShWSE9TVF9VU0VSX1NFVF9WUklOR19FUlIpLA0KKwkJCVJFUShWSE9T VF9VU0VSX0dFVF9QUk9UT0NPTF9GRUFUVVJFUyksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX1BS T1RPQ09MX0ZFQVRVUkVTKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9HRVRfUVVFVUVfTlVNKSwNCisJ CQlSRVEoVkhPU1RfVVNFUl9TRVRfVlJJTkdfRU5BQkxFKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9T RU5EX1JBUlApLA0KKwkJCVJFUShWSE9TVF9VU0VSX05FVF9TRVRfTVRVKSwNCisJCQlSRVEoVkhP U1RfVVNFUl9TRVRfQkFDS0VORF9SRVFfRkQpLA0KKwkJCVJFUShWSE9TVF9VU0VSX0lPVExCX01T RyksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX1ZSSU5HX0VORElBTiksDQorCQkJUkVRKFZIT1NU X1VTRVJfR0VUX0NPTkZJRyksDQorCQkJUkVRKFZIT1NUX1VTRVJfU0VUX0NPTkZJRyksDQorCQkJ UkVRKFZIT1NUX1VTRVJfUE9TVENPUFlfQURWSVNFKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9QT1NU Q09QWV9MSVNURU4pLA0KKwkJCVJFUShWSE9TVF9VU0VSX1BPU1RDT1BZX0VORCksDQorCQkJUkVR KFZIT1NUX1VTRVJfR0VUX0lORkxJR0hUX0ZEKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9TRVRfSU5G TElHSFRfRkQpLA0KKwkJCVJFUShWSE9TVF9VU0VSX0dQVV9TRVRfU09DS0VUKSwNCisJCQlSRVEo VkhPU1RfVVNFUl9WUklOR19LSUNLKSwNCisJCQlSRVEoVkhPU1RfVVNFUl9HRVRfTUFYX01FTV9T TE9UUyksDQorCQkJUkVRKFZIT1NUX1VTRVJfQUREX01FTV9SRUcpLA0KKwkJCVJFUShWSE9TVF9V U0VSX1JFTV9NRU1fUkVHKSwNCisJCX07DQorI3VuZGVmIFJFUQ0KKwkJcmV0dXJuIHZ1X3JlcXVl c3Rfc3RyW3JlcV07DQorCX0NCisNCisJcmV0dXJuICJ1bmtub3duIjsNCit9DQorDQorLyoqDQor ICogcXZhX3RvX3ZhKCkgLSAgVHJhbnNsYXRlIGZyb250LWVuZCAoUUVNVSkgdmlydHVhbCBhZGRy ZXNzIHRvIG91ciB2aXJ0dWFsDQorICogCQkgIGFkZHJlc3MNCisgKiBAZGV2OgkJdmhvc3QtdXNl ciBkZXZpY2UNCisgKiBAcWVtdV9hZGRyOgkJZnJvbnQtZW5kIHVzZXJzcGFjZSBhZGRyZXNzDQor ICoNCisgKiBSZXR1cm46IHRoZSBtZW1vcnkgYWRkcmVzcyBpbiBvdXIgcHJvY2VzcyB2aXJ0dWFs IGFkZHJlc3Mgc3BhY2UuDQorICovDQorc3RhdGljIHZvaWQgKnF2YV90b192YShzdHJ1Y3QgdnVf ZGV2ICpkZXYsIHVpbnQ2NF90IHFlbXVfYWRkcikNCit7DQorCXVuc2lnbmVkIGludCBpOw0KKw0K KwkvKiBGaW5kIG1hdGNoaW5nIG1lbW9yeSByZWdpb24uICAqLw0KKwlmb3IgKGkgPSAwOyBpIDwg ZGV2LT5ucmVnaW9uczsgaSsrKSB7DQorCQljb25zdCBzdHJ1Y3QgdnVfZGV2X3JlZ2lvbiAqciA9 ICZkZXYtPnJlZ2lvbnNbaV07DQorDQorCQlpZiAoKHFlbXVfYWRkciA+PSByLT5xdmEpICYmIChx ZW11X2FkZHIgPCAoci0+cXZhICsgci0+c2l6ZSkpKSB7DQorCQkJLyogTk9MSU5UTkVYVExJTkUo cGVyZm9ybWFuY2Utbm8taW50LXRvLXB0cikgKi8NCisJCQlyZXR1cm4gKHZvaWQgKikocWVtdV9h ZGRyIC0gci0+cXZhICsgci0+bW1hcF9hZGRyICsNCisJCQkJCXItPm1tYXBfb2Zmc2V0KTsNCisJ CX0NCisJfQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoqDQorICogdm1zZ19jbG9zZV9m ZHMoKSAtIENsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIGEgZ2l2ZW4gbWVzc2FnZQ0KKyAq IEB2bXNnOgl2aG9zdC11c2VyIG1lc3NhZ2Ugd2l0aCB0aGUgbGlzdCBvZiB0aGUgZmlsZSBkZXNj cmlwdG9ycw0KKyAqLw0KK3N0YXRpYyB2b2lkIHZtc2dfY2xvc2VfZmRzKGNvbnN0IHN0cnVjdCB2 aG9zdF91c2VyX21zZyAqdm1zZykNCit7DQorCWludCBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwg dm1zZy0+ZmRfbnVtOyBpKyspDQorCQljbG9zZSh2bXNnLT5mZHNbaV0pOw0KK30NCisNCisvKioN CisgKiB2dV9yZW1vdmVfd2F0Y2goKSAtIFJlbW92ZSBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIG91 ciBwYXNzdCBlcG9sbA0KKyAqIAkJICAgICAgIGZpbGUgZGVzY3JpcHRvcg0KKyAqIEB2ZGV2Ogl2 aG9zdC11c2VyIGRldmljZQ0KKyAqIEBmZDoJCWZpbGUgZGVzY3JpcHRvciB0byByZW1vdmUNCisg Ki8NCitzdGF0aWMgdm9pZCB2dV9yZW1vdmVfd2F0Y2goY29uc3Qgc3RydWN0IHZ1X2RldiAqdmRl diwgaW50IGZkKQ0KK3sNCisJLyogUGxhY2Vob2xkZXIgdG8gYWRkIHBhc3N0IHJlbGF0ZWQgY29k ZSAqLw0KKwkodm9pZCl2ZGV2Ow0KKwkodm9pZClmZDsNCit9DQorDQorLyoqDQorICogdm1zZ19z ZXRfcmVwbHlfdTY0KCkgLSBTZXQgcmVwbHkgcGF5bG9hZC51NjQgYW5kIGNsZWFyIHJlcXVlc3Qg ZmxhZ3MNCisgKiAJCQkgIGFuZCBmZF9udW0NCisgKiBAdm1zZzoJdmhvc3QtdXNlciBtZXNzYWdl DQorICogQHZhbDoJNjQtYml0IHZhbHVlIHRvIHJlcGx5DQorICovDQorc3RhdGljIHZvaWQgdm1z Z19zZXRfcmVwbHlfdTY0KHN0cnVjdCB2aG9zdF91c2VyX21zZyAqdm1zZywgdWludDY0X3QgdmFs KQ0KK3sNCisJdm1zZy0+aGRyLmZsYWdzID0gMDsgLyogZGVmYXVsdHMgd2lsbCBiZSBzZXQgYnkg dnVfc2VuZF9yZXBseSgpICovDQorCXZtc2ctPmhkci5zaXplID0gc2l6ZW9mKHZtc2ctPnBheWxv YWQudTY0KTsNCisJdm1zZy0+cGF5bG9hZC51NjQgPSB2YWw7DQorCXZtc2ctPmZkX251bSA9IDA7 DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X21lc3NhZ2VfcmVhZF9kZWZhdWx0KCkgLSBSZWFkIGluY29t aW5nIHZob3N0LXVzZXIgbWVzc2FnZSBmcm9tIHRoZQ0KKyAqIAkJCSAgICAgICBmcm9udC1lbmQN CisgKiBAY29ubl9mZDoJdmhvc3QtdXNlciBjb21tYW5kIHNvY2tldA0KKyAqIEB2bXNnOgl2aG9z dC11c2VyIG1lc3NhZ2UNCisgKg0KKyAqIFJldHVybjogIDAgaWYgcmVjdm1zZygpIGhhcyBiZWVu IGludGVycnVwdGVkIG9yIGlmIHRoZXJlJ3Mgbm8gZGF0YSB0byByZWFkLA0KKyAqICAgICAgICAg IDEgaWYgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkDQorICovDQorc3RhdGljIGludCB2dV9t ZXNzYWdlX3JlYWRfZGVmYXVsdChpbnQgY29ubl9mZCwgc3RydWN0IHZob3N0X3VzZXJfbXNnICp2 bXNnKQ0KK3sNCisJY2hhciBjb250cm9sW0NNU0dfU1BBQ0UoVkhPU1RfTUVNT1JZX0JBU0VMSU5F X05SRUdJT05TICoNCisJCSAgICAgc2l6ZW9mKGludCkpXSA9IHsgMCB9Ow0KKwlzdHJ1Y3QgaW92 ZWMgaW92ID0gew0KKwkJLmlvdl9iYXNlID0gKGNoYXIgKil2bXNnLA0KKwkJLmlvdl9sZW4gPSBW SE9TVF9VU0VSX0hEUl9TSVpFLA0KKwl9Ow0KKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsNCisJCS5t c2dfaW92ID0gJmlvdiwNCisJCS5tc2dfaW92bGVuID0gMSwNCisJCS5tc2dfY29udHJvbCA9IGNv bnRyb2wsDQorCQkubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCksDQorCX07DQorCXNz aXplX3QgcmV0LCBzel9wYXlsb2FkOw0KKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsNCisNCisJcmV0 ID0gcmVjdm1zZyhjb25uX2ZkLCAmbXNnLCBNU0dfRE9OVFdBSVQpOw0KKwlpZiAocmV0IDwgMCkg ew0KKwkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBF V09VTERCTE9DSykNCisJCQlyZXR1cm4gMDsNCisJCWRpZV9wZXJyb3IoInZob3N0LXVzZXIgbWVz c2FnZSByZWNlaXZlIChyZWN2bXNnKSIpOw0KKwl9DQorDQorCXZtc2ctPmZkX251bSA9IDA7DQor CWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7IGNtc2cgIT0gTlVMTDsNCisJICAgICBj bXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZykpIHsNCisJCWlmIChjbXNnLT5jbXNnX2xldmVs ID09IFNPTF9TT0NLRVQgJiYNCisJCSAgICBjbXNnLT5jbXNnX3R5cGUgPT0gU0NNX1JJR0hUUykg ew0KKwkJCXNpemVfdCBmZF9zaXplOw0KKw0KKwkJCUFTU0VSVChjbXNnLT5jbXNnX2xlbiA+PSBD TVNHX0xFTigwKSk7DQorCQkJZmRfc2l6ZSA9IGNtc2ctPmNtc2dfbGVuIC0gQ01TR19MRU4oMCk7 DQorCQkJQVNTRVJUKGZkX3NpemUgPD0gc2l6ZW9mKHZtc2ctPmZkcykpOw0KKwkJCXZtc2ctPmZk X251bSA9IGZkX3NpemUgLyBzaXplb2YoaW50KTsNCisJCQltZW1jcHkodm1zZy0+ZmRzLCBDTVNH X0RBVEEoY21zZyksIGZkX3NpemUpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCXN6X3Bh eWxvYWQgPSB2bXNnLT5oZHIuc2l6ZTsNCisJaWYgKChzaXplX3Qpc3pfcGF5bG9hZCA+IHNpemVv Zih2bXNnLT5wYXlsb2FkKSkgew0KKwkJZGllKCJ2aG9zdC11c2VyIG1lc3NhZ2UgcmVxdWVzdCB0 b28gYmlnOiAlZCwiDQorCQkJICIgc2l6ZTogdm1zZy0+c2l6ZTogJXpkLCAiDQorCQkJICJ3aGls ZSBzaXplb2Yodm1zZy0+cGF5bG9hZCkgPSAlenUiLA0KKwkJCSB2bXNnLT5oZHIucmVxdWVzdCwg c3pfcGF5bG9hZCwgc2l6ZW9mKHZtc2ctPnBheWxvYWQpKTsNCisJfQ0KKw0KKwlpZiAoc3pfcGF5 bG9hZCkgew0KKwkJZG8NCisJCQlyZXQgPSByZWN2KGNvbm5fZmQsICZ2bXNnLT5wYXlsb2FkLCBz el9wYXlsb2FkLCAwKTsNCisJCXdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsNCisN CisJCWlmIChyZXQgPCAwKQ0KKwkJCWRpZV9wZXJyb3IoInZob3N0LXVzZXIgbWVzc2FnZSByZWNl aXZlIik7DQorDQorCQlpZiAocmV0ID09IDApDQorCQkJZGllKCJFT0Ygb24gdmhvc3QtdXNlciBt ZXNzYWdlIHJlY2VpdmUiKTsNCisNCisJCWlmIChyZXQgPCBzel9wYXlsb2FkKQ0KKwkJCWRpZSgi U2hvcnQtcmVhZCBvbiB2aG9zdC11c2VyIG1lc3NhZ2UgcmVjZWl2ZSIpOw0KKwl9DQorDQorCXJl dHVybiAxOw0KK30NCisNCisvKioNCisgKiB2dV9tZXNzYWdlX3dyaXRlKCkgLSBTZW5kIGEgbWVz c2FnZSB0byB0aGUgZnJvbnQtZW5kDQorICogQGNvbm5fZmQ6CXZob3N0LXVzZXIgY29tbWFuZCBz b2NrZXQNCisgKiBAdm1zZzoJdmhvc3QtdXNlciBtZXNzYWdlDQorICoNCisgKiAjc3lzY2FsbHM6 dnUgc2VuZG1zZw0KKyAqLw0KK3N0YXRpYyB2b2lkIHZ1X21lc3NhZ2Vfd3JpdGUoaW50IGNvbm5f ZmQsIHN0cnVjdCB2aG9zdF91c2VyX21zZyAqdm1zZykNCit7DQorCWNoYXIgY29udHJvbFtDTVNH X1NQQUNFKFZIT1NUX01FTU9SWV9CQVNFTElORV9OUkVHSU9OUyAqIHNpemVvZihpbnQpKV0gPSB7 IDAgfTsNCisJc3RydWN0IGlvdmVjIGlvdiA9IHsNCisJCS5pb3ZfYmFzZSA9IChjaGFyICopdm1z ZywNCisJCS5pb3ZfbGVuID0gVkhPU1RfVVNFUl9IRFJfU0laRSArIHZtc2ctPmhkci5zaXplLA0K Kwl9Ow0KKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsNCisJCS5tc2dfaW92ID0gJmlvdiwNCisJCS5t c2dfaW92bGVuID0gMSwNCisJCS5tc2dfY29udHJvbCA9IGNvbnRyb2wsDQorCX07DQorCWludCBy YzsNCisNCisJQVNTRVJUKHZtc2ctPmZkX251bSA8PSBWSE9TVF9NRU1PUllfQkFTRUxJTkVfTlJF R0lPTlMpOw0KKwlpZiAodm1zZy0+ZmRfbnVtID4gMCkgew0KKwkJc2l6ZV90IGZkc2l6ZSA9IHZt c2ctPmZkX251bSAqIHNpemVvZihpbnQpOw0KKwkJc3RydWN0IGNtc2doZHIgKmNtc2c7DQorDQor CQltc2cubXNnX2NvbnRyb2xsZW4gPSBDTVNHX1NQQUNFKGZkc2l6ZSk7DQorCQljbXNnID0gQ01T R19GSVJTVEhEUigmbXNnKTsNCisJCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oZmRzaXplKTsN CisJCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUOw0KKwkJY21zZy0+Y21zZ190eXBlID0g U0NNX1JJR0hUUzsNCisJCW1lbWNweShDTVNHX0RBVEEoY21zZyksIHZtc2ctPmZkcywgZmRzaXpl KTsNCisJfQ0KKw0KKwlkbw0KKwkJcmMgPSBzZW5kbXNnKGNvbm5fZmQsICZtc2csIDApOw0KKwl3 aGlsZSAocmMgPCAwICYmIGVycm5vID09IEVJTlRSKTsNCisNCisJaWYgKHJjIDwgMCkNCisJCWRp ZV9wZXJyb3IoInZob3N0LXVzZXIgbWVzc2FnZSBzZW5kIik7DQorDQorCWlmICgodWludDMyX3Qp cmMgPCBWSE9TVF9VU0VSX0hEUl9TSVpFICsgdm1zZy0+aGRyLnNpemUpDQorCQlkaWUoIkVPRiBv biB2aG9zdC11c2VyIG1lc3NhZ2Ugc2VuZCIpOw0KK30NCisNCisvKioNCisgKiB2dV9zZW5kX3Jl cGx5KCkgLSBVcGRhdGUgbWVzc2FnZSBmbGFncyBhbmQgc2VuZCBpdCB0byBmcm9udC1lbmQNCisg KiBAY29ubl9mZDoJdmhvc3QtdXNlciBjb21tYW5kIHNvY2tldA0KKyAqIEB2bXNnOgl2aG9zdC11 c2VyIG1lc3NhZ2UNCisgKi8NCitzdGF0aWMgdm9pZCB2dV9zZW5kX3JlcGx5KGludCBjb25uX2Zk LCBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cgKm1zZykNCit7DQorCW1zZy0+aGRyLmZsYWdzICY9IH5W SE9TVF9VU0VSX1ZFUlNJT05fTUFTSzsNCisJbXNnLT5oZHIuZmxhZ3MgfD0gVkhPU1RfVVNFUl9W RVJTSU9OOw0KKwltc2ctPmhkci5mbGFncyB8PSBWSE9TVF9VU0VSX1JFUExZX01BU0s7DQorDQor CXZ1X21lc3NhZ2Vfd3JpdGUoY29ubl9mZCwgbXNnKTsNCit9DQorDQorLyoqDQorICogdnVfZ2V0 X2ZlYXR1cmVzX2V4ZWMoKSAtIFByb3ZpZGUgYmFjay1lbmQgZmVhdHVyZXMgYml0bWFzayB0byBm cm9udC1lbmQNCisgKiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdm1zZzoJdmhvc3Qt dXNlciBtZXNzYWdlDQorICoNCisgKiBSZXR1cm46IFRydWUgYXMgYSByZXBseSBpcyByZXF1ZXN0 ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9nZXRfZmVhdHVyZXNfZXhlYyhzdHJ1Y3QgdnVfZGV2 ICp2ZGV2LA0KKwkJCQkgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cpDQorew0KKwl1aW50NjRf dCBmZWF0dXJlcyA9DQorCQkxVUxMIDw8IFZJUlRJT19GX1ZFUlNJT05fMSB8DQorCQkxVUxMIDw8 IFZJUlRJT19ORVRfRl9NUkdfUlhCVUYgfA0KKwkJMVVMTCA8PCBWSE9TVF9VU0VSX0ZfUFJPVE9D T0xfRkVBVFVSRVM7DQorDQorCSh2b2lkKXZkZXY7DQorDQorCXZtc2dfc2V0X3JlcGx5X3U2NCht c2csIGZlYXR1cmVzKTsNCisNCisJZGVidWcoIlNlbmRpbmcgYmFjayB0byBndWVzdCB1NjQ6IDB4 JTAxNiJQUkl4NjQsIG1zZy0+cGF5bG9hZC51NjQpOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQor DQorLyoqDQorICogdnVfc2V0X2VuYWJsZV9hbGxfcmluZ3MoKSAtIEVuYWJsZS9kaXNhYmxlIGFs bCB0aGUgdmlydHF1ZXVlcw0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEBlbmFi bGU6CU5ldyB2aXJ0cXVldWVzIHN0YXRlDQorICovDQorc3RhdGljIHZvaWQgdnVfc2V0X2VuYWJs ZV9hbGxfcmluZ3Moc3RydWN0IHZ1X2RldiAqdmRldiwgYm9vbCBlbmFibGUpDQorew0KKwl1aW50 MTZfdCBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgVkhPU1RfVVNFUl9NQVhfUVVFVUVTOyBpKysp DQorCQl2ZGV2LT52cVtpXS5lbmFibGUgPSBlbmFibGU7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3Nl dF9mZWF0dXJlc19leGVjKCkgLSBFbmFibGUgZmVhdHVyZXMgb2YgdGhlIGJhY2stZW5kDQorICog QHZkZXY6CXZob3N0LXVzZXIgZGV2aWNlDQorICogQHZtc2c6CXZob3N0LXVzZXIgbWVzc2FnZQ0K KyAqDQorICogUmV0dXJuOiBGYWxzZSBhcyBubyByZXBseSBpcyByZXF1ZXN0ZWQNCisgKi8NCitz dGF0aWMgYm9vbCB2dV9zZXRfZmVhdHVyZXNfZXhlYyhzdHJ1Y3QgdnVfZGV2ICp2ZGV2LA0KKwkJ CQkgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cpDQorew0KKwlkZWJ1ZygidTY0OiAweCUwMTYi UFJJeDY0LCBtc2ctPnBheWxvYWQudTY0KTsNCisNCisJdmRldi0+ZmVhdHVyZXMgPSBtc2ctPnBh eWxvYWQudTY0Ow0KKwkvKiBXZSBvbmx5IHN1cHBvcnQgZGV2aWNlcyBjb25mb3JtaW5nIHRvIFZJ UlRJTyAxLjAgb3INCisJICogbGF0ZXINCisJICovDQorCWlmICghdnVfaGFzX2ZlYXR1cmUodmRl diwgVklSVElPX0ZfVkVSU0lPTl8xKSkNCisJCWRpZSgidmlydGlvIGxlZ2FjeSBkZXZpY2VzIGFy ZW4ndCBzdXBwb3J0ZWQgYnkgcGFzc3QiKTsNCisNCisJaWYgKCF2dV9oYXNfZmVhdHVyZSh2ZGV2 LCBWSE9TVF9VU0VSX0ZfUFJPVE9DT0xfRkVBVFVSRVMpKQ0KKwkJdnVfc2V0X2VuYWJsZV9hbGxf cmluZ3ModmRldiwgdHJ1ZSk7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoqDQorICog dnVfc2V0X293bmVyX2V4ZWMoKSAtIFNlc3Npb24gc3RhcnQgZmxhZywgZG8gbm90aGluZyBpbiBv dXIgY2FzZQ0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEB2bXNnOgl2aG9zdC11 c2VyIG1lc3NhZ2UNCisgKg0KKyAqIFJldHVybjogRmFsc2UgYXMgbm8gcmVwbHkgaXMgcmVxdWVz dGVkDQorICovDQorc3RhdGljIGJvb2wgdnVfc2V0X293bmVyX2V4ZWMoc3RydWN0IHZ1X2RldiAq dmRldiwNCisJCQkgICAgICBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cgKm1zZykNCit7DQorCSh2b2lk KXZkZXY7DQorCSh2b2lkKW1zZzsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKioNCisg KiBtYXBfcmluZygpIC0gQ29udmVydCByaW5nIGZyb250LWVuZCAoUUVNVSkgYWRkcmVzc2VzIHRv IG91ciBwcm9jZXNzDQorICogCQl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuDQorICogQHZkZXY6CXZo b3N0LXVzZXIgZGV2aWNlDQorICogQHZxOgkJVmlydHF1ZXVlDQorICoNCisgKiBSZXR1cm46IFRy dWUgaWYgcmluZyBjYW5ub3QgYmUgbWFwcGVkIHRvIG91ciBhZGRyZXNzIHNwYWNlDQorICovDQor c3RhdGljIGJvb2wgbWFwX3Jpbmcoc3RydWN0IHZ1X2RldiAqdmRldiwgc3RydWN0IHZ1X3ZpcnRx ICp2cSkNCit7DQorCXZxLT52cmluZy5kZXNjID0gcXZhX3RvX3ZhKHZkZXYsIHZxLT52cmEuZGVz Y191c2VyX2FkZHIpOw0KKwl2cS0+dnJpbmcudXNlZCA9IHF2YV90b192YSh2ZGV2LCB2cS0+dnJh LnVzZWRfdXNlcl9hZGRyKTsNCisJdnEtPnZyaW5nLmF2YWlsID0gcXZhX3RvX3ZhKHZkZXYsIHZx LT52cmEuYXZhaWxfdXNlcl9hZGRyKTsNCisNCisJZGVidWcoIlNldHRpbmcgdmlydHEgYWRkcmVz c2VzOiIpOw0KKwlkZWJ1ZygiICAgIHZyaW5nX2Rlc2MgIGF0ICVwIiwgKHZvaWQgKil2cS0+dnJp bmcuZGVzYyk7DQorCWRlYnVnKCIgICAgdnJpbmdfdXNlZCAgYXQgJXAiLCAodm9pZCAqKXZxLT52 cmluZy51c2VkKTsNCisJZGVidWcoIiAgICB2cmluZ19hdmFpbCBhdCAlcCIsICh2b2lkICopdnEt PnZyaW5nLmF2YWlsKTsNCisNCisJcmV0dXJuICEodnEtPnZyaW5nLmRlc2MgJiYgdnEtPnZyaW5n LnVzZWQgJiYgdnEtPnZyaW5nLmF2YWlsKTsNCit9DQorDQorLyoqDQorICogdnVfcGFja2V0X2No ZWNrX3JhbmdlKCkgLSBDaGVjayBpZiBhIGdpdmVuIG1lbW9yeSB6b25lIGlzIGNvbnRhaW5lZCBp bg0KKyAqIAkJCSAgICAgYSBtYXBwZWQgZ3Vlc3QgbWVtb3J5IHJlZ2lvbg0KKyAqIEBidWY6CUFy cmF5IG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IHJlZ2lvbnMNCisgKiBAb2Zmc2V0OglPZmZzZXQg b2YgZGF0YSByYW5nZSBpbiBwYWNrZXQgZGVzY3JpcHRvcg0KKyAqIEBzaXplOglMZW5ndGggb2Yg ZGVzaXJlZCBkYXRhIHJhbmdlDQorICogQHN0YXJ0OglTdGFydCBvZiB0aGUgcGFja2V0IGRlc2Ny aXB0b3INCisgKg0KKyAqIFJldHVybjogMCBpZiB0aGUgem9uZSBpcyBpbiBhIG1hcHBlZCBtZW1v cnkgcmVnaW9uLCAtMSBvdGhlcndpc2UNCisgKi8NCisvKiBjcHBjaGVjay1zdXBwcmVzcyB1bnVz ZWRGdW5jdGlvbiAqLw0KK2ludCB2dV9wYWNrZXRfY2hlY2tfcmFuZ2Uodm9pZCAqYnVmLCBzaXpl X3Qgb2Zmc2V0LCBzaXplX3QgbGVuLA0KKwkJCSAgY29uc3QgY2hhciAqc3RhcnQpDQorew0KKwlz dHJ1Y3QgdnVfZGV2X3JlZ2lvbiAqZGV2X3JlZ2lvbjsNCisNCisJZm9yIChkZXZfcmVnaW9uID0g YnVmOyBkZXZfcmVnaW9uLT5tbWFwX2FkZHI7IGRldl9yZWdpb24rKykgew0KKwkJLyogTk9MSU5U TkVYVExJTkUocGVyZm9ybWFuY2Utbm8taW50LXRvLXB0cikgKi8NCisJCWNoYXIgKm0gPSAoY2hh ciAqKWRldl9yZWdpb24tPm1tYXBfYWRkcjsNCisNCisJCWlmIChtIDw9IHN0YXJ0ICYmDQorCQkg ICAgc3RhcnQgKyBvZmZzZXQgKyBsZW4gPD0gbSArIGRldl9yZWdpb24tPm1tYXBfb2Zmc2V0ICsN CisJCQkJCSAgICAgICBkZXZfcmVnaW9uLT5zaXplKQ0KKwkJCXJldHVybiAwOw0KKwl9DQorDQor CXJldHVybiAtMTsNCit9DQorDQorLyoqDQorICogdnVfc2V0X21lbV90YWJsZV9leGVjKCkgLSBT ZXRzIHRoZSBtZW1vcnkgbWFwIHJlZ2lvbnMgdG8gYmUgYWJsZSB0bw0KKyAqIAkJCSAgICAgdHJh bnNsYXRlIHRoZSB2cmluZyBhZGRyZXNzZXMuDQorICogQHZkZXY6CXZob3N0LXVzZXIgZGV2aWNl DQorICogQHZtc2c6CXZob3N0LXVzZXIgbWVzc2FnZQ0KKyAqDQorICogUmV0dXJuOiBGYWxzZSBh cyBubyByZXBseSBpcyByZXF1ZXN0ZWQNCisgKg0KKyAqICNzeXNjYWxsczp2dSBtbWFwIG11bm1h cA0KKyAqLw0KK3N0YXRpYyBib29sIHZ1X3NldF9tZW1fdGFibGVfZXhlYyhzdHJ1Y3QgdnVfZGV2 ICp2ZGV2LA0KKwkJCQkgIHN0cnVjdCB2aG9zdF91c2VyX21zZyAqbXNnKQ0KK3sNCisJc3RydWN0 IHZob3N0X3VzZXJfbWVtb3J5IG0gPSBtc2ctPnBheWxvYWQubWVtb3J5LCAqbWVtb3J5ID0gJm07 DQorCXVuc2lnbmVkIGludCBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bnJlZ2lvbnM7 IGkrKykgew0KKwkJc3RydWN0IHZ1X2Rldl9yZWdpb24gKnIgPSAmdmRldi0+cmVnaW9uc1tpXTsN CisJCS8qIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNlLW5vLWludC10by1wdHIpICovDQorCQl2 b2lkICptbSA9ICh2b2lkICopci0+bW1hcF9hZGRyOw0KKw0KKwkJaWYgKG1tKQ0KKwkJCW11bm1h cChtbSwgci0+c2l6ZSArIHItPm1tYXBfb2Zmc2V0KTsNCisJfQ0KKwl2ZGV2LT5ucmVnaW9ucyA9 IG1lbW9yeS0+bnJlZ2lvbnM7DQorDQorCWRlYnVnKCJ2aG9zdC11c2VyIG5yZWdpb25zOiAldSIs IG1lbW9yeS0+bnJlZ2lvbnMpOw0KKwlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bnJlZ2lvbnM7IGkr Kykgew0KKwkJc3RydWN0IHZob3N0X3VzZXJfbWVtb3J5X3JlZ2lvbiAqbXNnX3JlZ2lvbiA9ICZt ZW1vcnktPnJlZ2lvbnNbaV07DQorCQlzdHJ1Y3QgdnVfZGV2X3JlZ2lvbiAqZGV2X3JlZ2lvbiA9 ICZ2ZGV2LT5yZWdpb25zW2ldOw0KKwkJdm9pZCAqbW1hcF9hZGRyOw0KKw0KKwkJZGVidWcoInZo b3N0LXVzZXIgcmVnaW9uICVkIiwgaSk7DQorCQlkZWJ1ZygiICAgIGd1ZXN0X3BoeXNfYWRkcjog MHglMDE2IlBSSXg2NCwNCisJCSAgICAgIG1zZ19yZWdpb24tPmd1ZXN0X3BoeXNfYWRkcik7DQor CQlkZWJ1ZygiICAgIG1lbW9yeV9zaXplOiAgICAgMHglMDE2IlBSSXg2NCwNCisJCSAgICAgIG1z Z19yZWdpb24tPm1lbW9yeV9zaXplKTsNCisJCWRlYnVnKCIgICAgdXNlcnNwYWNlX2FkZHIgICAw eCUwMTYiUFJJeDY0LA0KKwkJICAgICAgbXNnX3JlZ2lvbi0+dXNlcnNwYWNlX2FkZHIpOw0KKwkJ ZGVidWcoIiAgICBtbWFwX29mZnNldCAgICAgIDB4JTAxNiJQUkl4NjQsDQorCQkgICAgICBtc2df cmVnaW9uLT5tbWFwX29mZnNldCk7DQorDQorCQlkZXZfcmVnaW9uLT5ncGEgPSBtc2dfcmVnaW9u LT5ndWVzdF9waHlzX2FkZHI7DQorCQlkZXZfcmVnaW9uLT5zaXplID0gbXNnX3JlZ2lvbi0+bWVt b3J5X3NpemU7DQorCQlkZXZfcmVnaW9uLT5xdmEgPSBtc2dfcmVnaW9uLT51c2Vyc3BhY2VfYWRk cjsNCisJCWRldl9yZWdpb24tPm1tYXBfb2Zmc2V0ID0gbXNnX3JlZ2lvbi0+bW1hcF9vZmZzZXQ7 DQorDQorCQkvKiBXZSBkb24ndCB1c2Ugb2Zmc2V0IGFyZ3VtZW50IG9mIG1tYXAoKSBzaW5jZSB0 aGUNCisJCSAqIG1hcHBlZCBhZGRyZXNzIGhhcyB0byBiZSBwYWdlIGFsaWduZWQuDQorCQkgKi8N CisJCW1tYXBfYWRkciA9IG1tYXAoMCwgZGV2X3JlZ2lvbi0+c2l6ZSArIGRldl9yZWdpb24tPm1t YXBfb2Zmc2V0LA0KKwkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8DQor CQkJCSBNQVBfTk9SRVNFUlZFLCBtc2ctPmZkc1tpXSwgMCk7DQorDQorCQlpZiAobW1hcF9hZGRy ID09IE1BUF9GQUlMRUQpDQorCQkJZGllX3BlcnJvcigidmhvc3QtdXNlciByZWdpb24gbW1hcCBl cnJvciIpOw0KKw0KKwkJZGV2X3JlZ2lvbi0+bW1hcF9hZGRyID0gKHVpbnQ2NF90KSh1aW50cHRy X3QpbW1hcF9hZGRyOw0KKwkJZGVidWcoIiAgICBtbWFwX2FkZHI6ICAgICAgIDB4JTAxNiJQUkl4 NjQsDQorCQkgICAgICBkZXZfcmVnaW9uLT5tbWFwX2FkZHIpOw0KKw0KKwkJY2xvc2UobXNnLT5m ZHNbaV0pOw0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBWSE9TVF9VU0VSX01BWF9RVUVVRVM7 IGkrKykgew0KKwkJaWYgKHZkZXYtPnZxW2ldLnZyaW5nLmRlc2MpIHsNCisJCQlpZiAobWFwX3Jp bmcodmRldiwgJnZkZXYtPnZxW2ldKSkNCisJCQkJZGllKCJyZW1hcHBpbmcgcXVldWUgJWQgZHVy aW5nIHNldG1lbXRhYmxlIiwgaSk7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30N CisNCisvKioNCisgKiB2dV9zZXRfdnJpbmdfbnVtX2V4ZWMoKSAtIFNldCB0aGUgc2l6ZSBvZiB0 aGUgcXVldWUgKHZyaW5nIHNpemUpDQorICogQHZkZXY6CXZob3N0LXVzZXIgZGV2aWNlDQorICog QHZtc2c6CXZob3N0LXVzZXIgbWVzc2FnZQ0KKyAqDQorICogUmV0dXJuOiBGYWxzZSBhcyBubyBy ZXBseSBpcyByZXF1ZXN0ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9zZXRfdnJpbmdfbnVtX2V4 ZWMoc3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJICBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cgKm1z ZykNCit7DQorCXVuc2lnbmVkIGludCBpZHggPSBtc2ctPnBheWxvYWQuc3RhdGUuaW5kZXg7DQor CXVuc2lnbmVkIGludCBudW0gPSBtc2ctPnBheWxvYWQuc3RhdGUubnVtOw0KKw0KKwlkZWJ1Zygi U3RhdGUuaW5kZXg6ICV1IiwgaWR4KTsNCisJZGVidWcoIlN0YXRlLm51bTogICAldSIsIG51bSk7 DQorCXZkZXYtPnZxW2lkeF0udnJpbmcubnVtID0gbnVtOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQor fQ0KKw0KKy8qKg0KKyAqIHZ1X3NldF92cmluZ19hZGRyX2V4ZWMoKSAtIFNldCB0aGUgYWRkcmVz c2VzIG9mIHRoZSB2cmluZw0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEB2bXNn Ogl2aG9zdC11c2VyIG1lc3NhZ2UNCisgKg0KKyAqIFJldHVybjogRmFsc2UgYXMgbm8gcmVwbHkg aXMgcmVxdWVzdGVkDQorICovDQorc3RhdGljIGJvb2wgdnVfc2V0X3ZyaW5nX2FkZHJfZXhlYyhz dHJ1Y3QgdnVfZGV2ICp2ZGV2LA0KKwkJCQkgICBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cgKm1zZykN Cit7DQorCS8qIFdlIG5lZWQgdG8gY29weSB0aGUgcGF5bG9hZCB0byB2aG9zdF92cmluZ19hZGRy IHN0cnVjdHVyZQ0KKyAgICAgICAgICogdG8gYWNjZXNzIGluZGV4IGJlY2F1c2UgYWRkcmVzcyBv ZiBtc2ctPnBheWxvYWQuYWRkcg0KKyAgICAgICAgICogY2FuIGJlIHVuYWxpZ25lZCBhcyBpdCBp cyBwYWNrZWQuDQorICAgICAgICAgKi8NCisJc3RydWN0IHZob3N0X3ZyaW5nX2FkZHIgYWRkciA9 IG1zZy0+cGF5bG9hZC5hZGRyOw0KKwlzdHJ1Y3QgdnVfdmlydHEgKnZxID0gJnZkZXYtPnZxW2Fk ZHIuaW5kZXhdOw0KKw0KKwlkZWJ1Zygidmhvc3RfdnJpbmdfYWRkcjoiKTsNCisJZGVidWcoIiAg ICBpbmRleDogICVkIiwgYWRkci5pbmRleCk7DQorCWRlYnVnKCIgICAgZmxhZ3M6ICAlZCIsIGFk ZHIuZmxhZ3MpOw0KKwlkZWJ1ZygiICAgIGRlc2NfdXNlcl9hZGRyOiAgIDB4JTAxNiIgUFJJeDY0 LA0KKwkgICAgICAodWludDY0X3QpYWRkci5kZXNjX3VzZXJfYWRkcik7DQorCWRlYnVnKCIgICAg dXNlZF91c2VyX2FkZHI6ICAgMHglMDE2IiBQUkl4NjQsDQorCSAgICAgICh1aW50NjRfdClhZGRy LnVzZWRfdXNlcl9hZGRyKTsNCisJZGVidWcoIiAgICBhdmFpbF91c2VyX2FkZHI6ICAweCUwMTYi IFBSSXg2NCwNCisJICAgICAgKHVpbnQ2NF90KWFkZHIuYXZhaWxfdXNlcl9hZGRyKTsNCisJZGVi dWcoIiAgICBsb2dfZ3Vlc3RfYWRkcjogICAweCUwMTYiIFBSSXg2NCwNCisJICAgICAgKHVpbnQ2 NF90KWFkZHIubG9nX2d1ZXN0X2FkZHIpOw0KKw0KKwl2cS0+dnJhID0gbXNnLT5wYXlsb2FkLmFk ZHI7DQorCXZxLT52cmluZy5mbGFncyA9IGFkZHIuZmxhZ3M7DQorCXZxLT52cmluZy5sb2dfZ3Vl c3RfYWRkciA9IGFkZHIubG9nX2d1ZXN0X2FkZHI7DQorDQorCWlmIChtYXBfcmluZyh2ZGV2LCB2 cSkpDQorCQlkaWUoIkludmFsaWQgdnJpbmdfYWRkciBtZXNzYWdlIik7DQorDQorCXZxLT51c2Vk X2lkeCA9IGxlMTZ0b2godnEtPnZyaW5nLnVzZWQtPmlkeCk7DQorDQorCWlmICh2cS0+bGFzdF9h dmFpbF9pZHggIT0gdnEtPnVzZWRfaWR4KSB7DQorCQlkZWJ1ZygiTGFzdCBhdmFpbCBpbmRleCAh PSB1c2VkIGluZGV4OiAldSAhPSAldSIsDQorCQkgICAgICB2cS0+bGFzdF9hdmFpbF9pZHgsIHZx LT51c2VkX2lkeCk7DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisvKioNCisgKiB2dV9z ZXRfdnJpbmdfYmFzZV9leGVjKCkgLSBTZXRzIHRoZSBuZXh0IGluZGV4IHRvIHVzZSBmb3IgZGVz Y3JpcHRvcnMNCisgKiAJCQkgICAgICBpbiB0aGlzIHZyaW5nDQorICogQHZkZXY6CXZob3N0LXVz ZXIgZGV2aWNlDQorICogQHZtc2c6CXZob3N0LXVzZXIgbWVzc2FnZQ0KKyAqDQorICogUmV0dXJu OiBGYWxzZSBhcyBubyByZXBseSBpcyByZXF1ZXN0ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9z ZXRfdnJpbmdfYmFzZV9leGVjKHN0cnVjdCB2dV9kZXYgKnZkZXYsDQorCQkJCSAgIHN0cnVjdCB2 aG9zdF91c2VyX21zZyAqbXNnKQ0KK3sNCisJdW5zaWduZWQgaW50IGlkeCA9IG1zZy0+cGF5bG9h ZC5zdGF0ZS5pbmRleDsNCisJdW5zaWduZWQgaW50IG51bSA9IG1zZy0+cGF5bG9hZC5zdGF0ZS5u dW07DQorDQorCWRlYnVnKCJTdGF0ZS5pbmRleDogJXUiLCBpZHgpOw0KKwlkZWJ1ZygiU3RhdGUu bnVtOiAgICV1IiwgbnVtKTsNCisJdmRldi0+dnFbaWR4XS5zaGFkb3dfYXZhaWxfaWR4ID0gdmRl di0+dnFbaWR4XS5sYXN0X2F2YWlsX2lkeCA9IG51bTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30N CisNCisvKioNCisgKiB2dV9nZXRfdnJpbmdfYmFzZV9leGVjKCkgLSBTdG9wcyB0aGUgdnJpbmcg YW5kIHJldHVybnMgdGhlIGN1cnJlbnQNCisgKiAJCQkgICAgICBkZXNjcmlwdG9yIGluZGV4IG9y IGluZGljZXMNCisgKiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdm1zZzoJdmhvc3Qt dXNlciBtZXNzYWdlDQorICoNCisgKiBSZXR1cm46IFRydWUgYXMgYSByZXBseSBpcyByZXF1ZXN0 ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9nZXRfdnJpbmdfYmFzZV9leGVjKHN0cnVjdCB2dV9k ZXYgKnZkZXYsDQorCQkJCSAgIHN0cnVjdCB2aG9zdF91c2VyX21zZyAqbXNnKQ0KK3sNCisJdW5z aWduZWQgaW50IGlkeCA9IG1zZy0+cGF5bG9hZC5zdGF0ZS5pbmRleDsNCisNCisJZGVidWcoIlN0 YXRlLmluZGV4OiAldSIsIGlkeCk7DQorCW1zZy0+cGF5bG9hZC5zdGF0ZS5udW0gPSB2ZGV2LT52 cVtpZHhdLmxhc3RfYXZhaWxfaWR4Ow0KKwltc2ctPmhkci5zaXplID0gc2l6ZW9mKG1zZy0+cGF5 bG9hZC5zdGF0ZSk7DQorDQorCXZkZXYtPnZxW2lkeF0uc3RhcnRlZCA9IGZhbHNlOw0KKw0KKwlp ZiAodmRldi0+dnFbaWR4XS5jYWxsX2ZkICE9IC0xKSB7DQorCQljbG9zZSh2ZGV2LT52cVtpZHhd LmNhbGxfZmQpOw0KKwkJdmRldi0+dnFbaWR4XS5jYWxsX2ZkID0gLTE7DQorCX0NCisJaWYgKHZk ZXYtPnZxW2lkeF0ua2lja19mZCAhPSAtMSkgew0KKwkJdnVfcmVtb3ZlX3dhdGNoKHZkZXYsIHZk ZXYtPnZxW2lkeF0ua2lja19mZCk7DQorCQljbG9zZSh2ZGV2LT52cVtpZHhdLmtpY2tfZmQpOw0K KwkJdmRldi0+dnFbaWR4XS5raWNrX2ZkID0gLTE7DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQor fQ0KKw0KKy8qKg0KKyAqIHZ1X3NldF93YXRjaCgpIC0gQWRkIGEgZmlsZSBkZXNjcmlwdG9yIHRv IHRoZSBwYXNzdCBlcG9sbCBmaWxlIGRlc2NyaXB0b3INCisgKiBAdmRldjoJdmhvc3QtdXNlciBk ZXZpY2UNCisgKiBAZmQ6CQlmaWxlIGRlc2NyaXB0b3IgdG8gYWRkDQorICovDQorc3RhdGljIHZv aWQgdnVfc2V0X3dhdGNoKGNvbnN0IHN0cnVjdCB2dV9kZXYgKnZkZXYsIGludCBmZCkNCit7DQor CS8qIFBsYWNlaG9sZGVyIHRvIGFkZCBwYXNzdCByZWxhdGVkIGNvZGUgKi8NCisJKHZvaWQpdmRl djsNCisJKHZvaWQpZmQ7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X2NoZWNrX3F1ZXVlX21zZ19maWxl KCkgLSBDaGVjayBpZiBhIG1lc3NhZ2UgaXMgdmFsaWQsDQorICogCQkJICAgICAgIGNsb3NlIGZk cyBpZiBOT0ZEIGJpdCBpcyBzZXQNCisgKiBAdm1zZzoJdmhvc3QtdXNlciBtZXNzYWdlDQorICov DQorc3RhdGljIHZvaWQgdnVfY2hlY2tfcXVldWVfbXNnX2ZpbGUoc3RydWN0IHZob3N0X3VzZXJf bXNnICptc2cpDQorew0KKwlib29sIG5vZmQgPSBtc2ctPnBheWxvYWQudTY0ICYgVkhPU1RfVVNF Ul9WUklOR19OT0ZEX01BU0s7DQorCWludCBpZHggPSBtc2ctPnBheWxvYWQudTY0ICYgVkhPU1Rf VVNFUl9WUklOR19JRFhfTUFTSzsNCisNCisJaWYgKGlkeCA+PSBWSE9TVF9VU0VSX01BWF9RVUVV RVMpDQorCQlkaWUoIkludmFsaWQgdmhvc3QtdXNlciBxdWV1ZSBpbmRleDogJXUiLCBpZHgpOw0K Kw0KKwlpZiAobm9mZCkgew0KKwkJdm1zZ19jbG9zZV9mZHMobXNnKTsNCisJCXJldHVybjsNCisJ fQ0KKw0KKwlpZiAobXNnLT5mZF9udW0gIT0gMSkNCisJCWRpZSgiSW52YWxpZCBmZHMgaW4gdmhv c3QtdXNlciByZXF1ZXN0OiAlZCIsIG1zZy0+aGRyLnJlcXVlc3QpOw0KK30NCisNCisvKioNCisg KiB2dV9zZXRfdnJpbmdfa2lja19leGVjKCkgLSBTZXQgdGhlIGV2ZW50IGZpbGUgZGVzY3JpcHRv ciBmb3IgYWRkaW5nIGJ1ZmZlcnMNCisgKiAJCQkgICAgICB0byB0aGUgdnJpbmcNCisgKiBAdmRl djoJdmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdm1zZzoJdmhvc3QtdXNlciBtZXNzYWdlDQorICoN CisgKiBSZXR1cm46IEZhbHNlIGFzIG5vIHJlcGx5IGlzIHJlcXVlc3RlZA0KKyAqLw0KK3N0YXRp YyBib29sIHZ1X3NldF92cmluZ19raWNrX2V4ZWMoc3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJ ICAgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cpDQorew0KKwlib29sIG5vZmQgPSBtc2ctPnBh eWxvYWQudTY0ICYgVkhPU1RfVVNFUl9WUklOR19OT0ZEX01BU0s7DQorCWludCBpZHggPSBtc2ct PnBheWxvYWQudTY0ICYgVkhPU1RfVVNFUl9WUklOR19JRFhfTUFTSzsNCisNCisJZGVidWcoInU2 NDogMHglMDE2IlBSSXg2NCwgbXNnLT5wYXlsb2FkLnU2NCk7DQorDQorCXZ1X2NoZWNrX3F1ZXVl X21zZ19maWxlKG1zZyk7DQorDQorCWlmICh2ZGV2LT52cVtpZHhdLmtpY2tfZmQgIT0gLTEpIHsN CisJCXZ1X3JlbW92ZV93YXRjaCh2ZGV2LCB2ZGV2LT52cVtpZHhdLmtpY2tfZmQpOw0KKwkJY2xv c2UodmRldi0+dnFbaWR4XS5raWNrX2ZkKTsNCisJCXZkZXYtPnZxW2lkeF0ua2lja19mZCA9IC0x Ow0KKwl9DQorDQorCWlmICghbm9mZCkNCisJCXZkZXYtPnZxW2lkeF0ua2lja19mZCA9IG1zZy0+ ZmRzWzBdOw0KKw0KKwlkZWJ1ZygiR290IGtpY2tfZmQ6ICVkIGZvciB2cTogJWQiLCB2ZGV2LT52 cVtpZHhdLmtpY2tfZmQsIGlkeCk7DQorDQorCXZkZXYtPnZxW2lkeF0uc3RhcnRlZCA9IHRydWU7 DQorDQorCWlmICh2ZGV2LT52cVtpZHhdLmtpY2tfZmQgIT0gLTEgJiYgVkhPU1RfVVNFUl9JU19R VUVVRV9UWChpZHgpKSB7DQorCQl2dV9zZXRfd2F0Y2godmRldiwgdmRldi0+dnFbaWR4XS5raWNr X2ZkKTsNCisJCWRlYnVnKCJXYWl0aW5nIGZvciBraWNrcyBvbiBmZDogJWQgZm9yIHZxOiAlZCIs DQorCQkgICAgICB2ZGV2LT52cVtpZHhdLmtpY2tfZmQsIGlkeCk7DQorCX0NCisNCisJcmV0dXJu IGZhbHNlOw0KK30NCisNCisvKioNCisgKiB2dV9zZXRfdnJpbmdfY2FsbF9leGVjKCkgLSBTZXQg dGhlIGV2ZW50IGZpbGUgZGVzY3JpcHRvciB0byBzaWduYWwgd2hlbg0KKyAqIAkJCSAgICAgIGJ1 ZmZlcnMgYXJlIHVzZWQNCisgKiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdm1zZzoJ dmhvc3QtdXNlciBtZXNzYWdlDQorICoNCisgKiBSZXR1cm46IEZhbHNlIGFzIG5vIHJlcGx5IGlz IHJlcXVlc3RlZA0KKyAqLw0KK3N0YXRpYyBib29sIHZ1X3NldF92cmluZ19jYWxsX2V4ZWMoc3Ry dWN0IHZ1X2RldiAqdmRldiwNCisJCQkJICAgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cpDQor ew0KKwlib29sIG5vZmQgPSBtc2ctPnBheWxvYWQudTY0ICYgVkhPU1RfVVNFUl9WUklOR19OT0ZE X01BU0s7DQorCWludCBpZHggPSBtc2ctPnBheWxvYWQudTY0ICYgVkhPU1RfVVNFUl9WUklOR19J RFhfTUFTSzsNCisNCisJZGVidWcoInU2NDogMHglMDE2IlBSSXg2NCwgbXNnLT5wYXlsb2FkLnU2 NCk7DQorDQorCXZ1X2NoZWNrX3F1ZXVlX21zZ19maWxlKG1zZyk7DQorDQorCWlmICh2ZGV2LT52 cVtpZHhdLmNhbGxfZmQgIT0gLTEpIHsNCisJCWNsb3NlKHZkZXYtPnZxW2lkeF0uY2FsbF9mZCk7 DQorCQl2ZGV2LT52cVtpZHhdLmNhbGxfZmQgPSAtMTsNCisJfQ0KKw0KKwlpZiAoIW5vZmQpDQor CQl2ZGV2LT52cVtpZHhdLmNhbGxfZmQgPSBtc2ctPmZkc1swXTsNCisNCisJLyogaW4gY2FzZSBv ZiBJL08gaGFuZyBhZnRlciByZWNvbm5lY3RpbmcgKi8NCisJaWYgKHZkZXYtPnZxW2lkeF0uY2Fs bF9mZCAhPSAtMSkNCisJCWV2ZW50ZmRfd3JpdGUobXNnLT5mZHNbMF0sIDEpOw0KKw0KKwlkZWJ1 ZygiR290IGNhbGxfZmQ6ICVkIGZvciB2cTogJWQiLCB2ZGV2LT52cVtpZHhdLmNhbGxfZmQsIGlk eCk7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoqDQorICogdnVfc2V0X3ZyaW5nX2Vy cl9leGVjKCkgLSBTZXQgdGhlIGV2ZW50IGZpbGUgZGVzY3JpcHRvciB0byBzaWduYWwgd2hlbg0K KyAqIAkJCSAgICAgZXJyb3Igb2NjdXJzDQorICogQHZkZXY6CXZob3N0LXVzZXIgZGV2aWNlDQor ICogQHZtc2c6CXZob3N0LXVzZXIgbWVzc2FnZQ0KKyAqDQorICogUmV0dXJuOiBGYWxzZSBhcyBu byByZXBseSBpcyByZXF1ZXN0ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9zZXRfdnJpbmdfZXJy X2V4ZWMoc3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJICBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cg Km1zZykNCit7DQorCWJvb2wgbm9mZCA9IG1zZy0+cGF5bG9hZC51NjQgJiBWSE9TVF9VU0VSX1ZS SU5HX05PRkRfTUFTSzsNCisJaW50IGlkeCA9IG1zZy0+cGF5bG9hZC51NjQgJiBWSE9TVF9VU0VS X1ZSSU5HX0lEWF9NQVNLOw0KKw0KKwlkZWJ1ZygidTY0OiAweCUwMTYiUFJJeDY0LCBtc2ctPnBh eWxvYWQudTY0KTsNCisNCisJdnVfY2hlY2tfcXVldWVfbXNnX2ZpbGUobXNnKTsNCisNCisJaWYg KHZkZXYtPnZxW2lkeF0uZXJyX2ZkICE9IC0xKSB7DQorCQljbG9zZSh2ZGV2LT52cVtpZHhdLmVy cl9mZCk7DQorCQl2ZGV2LT52cVtpZHhdLmVycl9mZCA9IC0xOw0KKwl9DQorDQorCWlmICghbm9m ZCkNCisJCXZkZXYtPnZxW2lkeF0uZXJyX2ZkID0gbXNnLT5mZHNbMF07DQorDQorCXJldHVybiBm YWxzZTsNCit9DQorDQorLyoqDQorICogdnVfZ2V0X3Byb3RvY29sX2ZlYXR1cmVzX2V4ZWMoKSAt IFByb3ZpZGUgdGhlIHByb3RvY29sICh2aG9zdC11c2VyKSBmZWF0dXJlcw0KKyAqIAkJCQkgICAg IHRvIHRoZSBmcm9udC1lbmQNCisgKiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKiBAdm1z ZzoJdmhvc3QtdXNlciBtZXNzYWdlDQorICoNCisgKiBSZXR1cm46IFRydWUgYXMgYSByZXBseSBp cyByZXF1ZXN0ZWQNCisgKi8NCitzdGF0aWMgYm9vbCB2dV9nZXRfcHJvdG9jb2xfZmVhdHVyZXNf ZXhlYyhzdHJ1Y3QgdnVfZGV2ICp2ZGV2LA0KKwkJCQkJICBzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cg Km1zZykNCit7DQorCXVpbnQ2NF90IGZlYXR1cmVzID0gMVVMTCA8PCBWSE9TVF9VU0VSX1BST1RP Q09MX0ZfUkVQTFlfQUNLOw0KKw0KKwkodm9pZCl2ZGV2Ow0KKwl2bXNnX3NldF9yZXBseV91NjQo bXNnLCBmZWF0dXJlcyk7DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKioNCisgKiB2dV9z ZXRfcHJvdG9jb2xfZmVhdHVyZXNfZXhlYygpIC0gRW5hYmxlIHByb3RvY29sICh2aG9zdC11c2Vy KSBmZWF0dXJlcw0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEB2bXNnOgl2aG9z dC11c2VyIG1lc3NhZ2UNCisgKg0KKyAqIFJldHVybjogRmFsc2UgYXMgbm8gcmVwbHkgaXMgcmVx dWVzdGVkDQorICovDQorc3RhdGljIGJvb2wgdnVfc2V0X3Byb3RvY29sX2ZlYXR1cmVzX2V4ZWMo c3RydWN0IHZ1X2RldiAqdmRldiwNCisJCQkJCSAgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cp DQorew0KKwl1aW50NjRfdCBmZWF0dXJlcyA9IG1zZy0+cGF5bG9hZC51NjQ7DQorDQorCWRlYnVn KCJ1NjQ6IDB4JTAxNiJQUkl4NjQsIGZlYXR1cmVzKTsNCisNCisJdmRldi0+cHJvdG9jb2xfZmVh dHVyZXMgPSBtc2ctPnBheWxvYWQudTY0Ow0KKw0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KKy8q Kg0KKyAqIHZ1X2dldF9xdWV1ZV9udW1fZXhlYygpIC0gVGVsbCBob3cgbWFueSBxdWV1ZXMgd2Ug c3VwcG9ydA0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEB2bXNnOgl2aG9zdC11 c2VyIG1lc3NhZ2UNCisgKg0KKyAqIFJldHVybjogVHJ1ZSBhcyBhIHJlcGx5IGlzIHJlcXVlc3Rl ZA0KKyAqLw0KK3N0YXRpYyBib29sIHZ1X2dldF9xdWV1ZV9udW1fZXhlYyhzdHJ1Y3QgdnVfZGV2 ICp2ZGV2LA0KKwkJCQkgIHN0cnVjdCB2aG9zdF91c2VyX21zZyAqbXNnKQ0KK3sNCisJKHZvaWQp dmRldjsNCisNCisJdm1zZ19zZXRfcmVwbHlfdTY0KG1zZywgVkhPU1RfVVNFUl9NQVhfUVVFVUVT KTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3NldF92cmluZ19lbmFi bGVfZXhlYygpIC0gRW5hYmxlIG9yIGRpc2FibGUgY29ycmVzcG9uZGluZyB2cmluZw0KKyAqIEB2 ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEB2bXNnOgl2aG9zdC11c2VyIG1lc3NhZ2UNCisg Kg0KKyAqIFJldHVybjogRmFsc2UgYXMgbm8gcmVwbHkgaXMgcmVxdWVzdGVkDQorICovDQorc3Rh dGljIGJvb2wgdnVfc2V0X3ZyaW5nX2VuYWJsZV9leGVjKHN0cnVjdCB2dV9kZXYgKnZkZXYsDQor CQkJCSAgICAgc3RydWN0IHZob3N0X3VzZXJfbXNnICptc2cpDQorew0KKwl1bnNpZ25lZCBpbnQg ZW5hYmxlID0gbXNnLT5wYXlsb2FkLnN0YXRlLm51bTsNCisJdW5zaWduZWQgaW50IGlkeCA9IG1z Zy0+cGF5bG9hZC5zdGF0ZS5pbmRleDsNCisNCisJZGVidWcoIlN0YXRlLmluZGV4OiAgJXUiLCBp ZHgpOw0KKwlkZWJ1ZygiU3RhdGUuZW5hYmxlOiAldSIsIGVuYWJsZSk7DQorDQorCWlmIChpZHgg Pj0gVkhPU1RfVVNFUl9NQVhfUVVFVUVTKQ0KKwkJZGllKCJJbnZhbGlkIHZyaW5nX2VuYWJsZSBp bmRleDogJXUiLCBpZHgpOw0KKw0KKwl2ZGV2LT52cVtpZHhdLmVuYWJsZSA9IGVuYWJsZTsNCisJ cmV0dXJuIGZhbHNlOw0KK30NCisNCisvKioNCisgKiB2dV9pbml0KCkgLSBJbml0aWFsaXplIHZo b3N0LXVzZXIgZGV2aWNlIHN0cnVjdHVyZQ0KKyAqIEBjOgkJZXhlY3V0aW9uIGNvbnRleHQNCisg KiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKi8NCisvKiBjcHBjaGVjay1zdXBwcmVzcyB1 bnVzZWRGdW5jdGlvbiAqLw0KK3ZvaWQgdnVfaW5pdChzdHJ1Y3QgY3R4ICpjLCBzdHJ1Y3QgdnVf ZGV2ICp2ZGV2KQ0KK3sNCisJaW50IGk7DQorDQorCXZkZXYtPmNvbnRleHQgPSBjOw0KKwlmb3Ig KGkgPSAwOyBpIDwgVkhPU1RfVVNFUl9NQVhfUVVFVUVTOyBpKyspIHsNCisJCXZkZXYtPnZxW2ld ID0gKHN0cnVjdCB2dV92aXJ0cSl7DQorCQkJLmNhbGxfZmQgPSAtMSwNCisJCQkua2lja19mZCA9 IC0xLA0KKwkJCS5lcnJfZmQgPSAtMSwNCisJCQkubm90aWZpY2F0aW9uID0gdHJ1ZSwNCisJCX07 DQorCX0NCit9DQorDQorLyoqDQorICogdnVfY2xlYW51cCgpIC0gUmVzZXQgdmhvc3QtdXNlciBk ZXZpY2UNCisgKiBAdmRldjoJdmhvc3QtdXNlciBkZXZpY2UNCisgKi8NCisvKiBjcHBjaGVjay1z dXBwcmVzcyB1bnVzZWRGdW5jdGlvbiAqLw0KK3ZvaWQgdnVfY2xlYW51cChzdHJ1Y3QgdnVfZGV2 ICp2ZGV2KQ0KK3sNCisJdW5zaWduZWQgaW50IGk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBWSE9T VF9VU0VSX01BWF9RVUVVRVM7IGkrKykgew0KKwkJc3RydWN0IHZ1X3ZpcnRxICp2cSA9ICZ2ZGV2 LT52cVtpXTsNCisNCisJCXZxLT5zdGFydGVkID0gZmFsc2U7DQorCQl2cS0+bm90aWZpY2F0aW9u ID0gdHJ1ZTsNCisNCisJCWlmICh2cS0+Y2FsbF9mZCAhPSAtMSkgew0KKwkJCWNsb3NlKHZxLT5j YWxsX2ZkKTsNCisJCQl2cS0+Y2FsbF9mZCA9IC0xOw0KKwkJfQ0KKwkJaWYgKHZxLT5lcnJfZmQg IT0gLTEpIHsNCisJCQljbG9zZSh2cS0+ZXJyX2ZkKTsNCisJCQl2cS0+ZXJyX2ZkID0gLTE7DQor CQl9DQorCQlpZiAodnEtPmtpY2tfZmQgIT0gLTEpIHsNCisJCQl2dV9yZW1vdmVfd2F0Y2godmRl diwgdnEtPmtpY2tfZmQpOw0KKwkJCWNsb3NlKHZxLT5raWNrX2ZkKTsNCisJCQl2cS0+a2lja19m ZCA9IC0xOw0KKwkJfQ0KKw0KKwkJdnEtPnZyaW5nLmRlc2MgPSAwOw0KKwkJdnEtPnZyaW5nLnVz ZWQgPSAwOw0KKwkJdnEtPnZyaW5nLmF2YWlsID0gMDsNCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBp IDwgdmRldi0+bnJlZ2lvbnM7IGkrKykgew0KKwkJY29uc3Qgc3RydWN0IHZ1X2Rldl9yZWdpb24g KnIgPSAmdmRldi0+cmVnaW9uc1tpXTsNCisJCS8qIE5PTElOVE5FWFRMSU5FKHBlcmZvcm1hbmNl LW5vLWludC10by1wdHIpICovDQorCQl2b2lkICptID0gKHZvaWQgKilyLT5tbWFwX2FkZHI7DQor DQorCQlpZiAobSkNCisJCQltdW5tYXAobSwgci0+c2l6ZSArIHItPm1tYXBfb2Zmc2V0KTsNCisJ fQ0KKwl2ZGV2LT5ucmVnaW9ucyA9IDA7DQorfQ0KKw0KKy8qKg0KKyAqIHZ1X3NvY2tfcmVzZXQo KSAtIFJlc2V0IGNvbm5lY3Rpb24gc29ja2V0DQorICogQHZkZXY6CXZob3N0LXVzZXIgZGV2aWNl DQorICovDQorc3RhdGljIHZvaWQgdnVfc29ja19yZXNldChzdHJ1Y3QgdnVfZGV2ICp2ZGV2KQ0K K3sNCisJLyogUGxhY2Vob2xkZXIgdG8gYWRkIHBhc3N0IHJlbGF0ZWQgY29kZSAqLw0KKwkodm9p ZCl2ZGV2Ow0KK30NCisNCitzdGF0aWMgYm9vbCAoKnZ1X2hhbmRsZVtWSE9TVF9VU0VSX01BWF0p KHN0cnVjdCB2dV9kZXYgKnZkZXYsDQorCQkJCQlzdHJ1Y3Qgdmhvc3RfdXNlcl9tc2cgKm1zZykg PSB7DQorCVtWSE9TVF9VU0VSX0dFVF9GRUFUVVJFU10JICAgPSB2dV9nZXRfZmVhdHVyZXNfZXhl YywNCisJW1ZIT1NUX1VTRVJfU0VUX0ZFQVRVUkVTXQkgICA9IHZ1X3NldF9mZWF0dXJlc19leGVj LA0KKwlbVkhPU1RfVVNFUl9HRVRfUFJPVE9DT0xfRkVBVFVSRVNdID0gdnVfZ2V0X3Byb3RvY29s X2ZlYXR1cmVzX2V4ZWMsDQorCVtWSE9TVF9VU0VSX1NFVF9QUk9UT0NPTF9GRUFUVVJFU10gPSB2 dV9zZXRfcHJvdG9jb2xfZmVhdHVyZXNfZXhlYywNCisJW1ZIT1NUX1VTRVJfR0VUX1FVRVVFX05V TV0JICAgPSB2dV9nZXRfcXVldWVfbnVtX2V4ZWMsDQorCVtWSE9TVF9VU0VSX1NFVF9PV05FUl0J CSAgID0gdnVfc2V0X293bmVyX2V4ZWMsDQorCVtWSE9TVF9VU0VSX1NFVF9NRU1fVEFCTEVdCSAg ID0gdnVfc2V0X21lbV90YWJsZV9leGVjLA0KKwlbVkhPU1RfVVNFUl9TRVRfVlJJTkdfTlVNXQkg ICA9IHZ1X3NldF92cmluZ19udW1fZXhlYywNCisJW1ZIT1NUX1VTRVJfU0VUX1ZSSU5HX0FERFJd CSAgID0gdnVfc2V0X3ZyaW5nX2FkZHJfZXhlYywNCisJW1ZIT1NUX1VTRVJfU0VUX1ZSSU5HX0JB U0VdCSAgID0gdnVfc2V0X3ZyaW5nX2Jhc2VfZXhlYywNCisJW1ZIT1NUX1VTRVJfR0VUX1ZSSU5H X0JBU0VdCSAgID0gdnVfZ2V0X3ZyaW5nX2Jhc2VfZXhlYywNCisJW1ZIT1NUX1VTRVJfU0VUX1ZS SU5HX0tJQ0tdCSAgID0gdnVfc2V0X3ZyaW5nX2tpY2tfZXhlYywNCisJW1ZIT1NUX1VTRVJfU0VU X1ZSSU5HX0NBTExdCSAgID0gdnVfc2V0X3ZyaW5nX2NhbGxfZXhlYywNCisJW1ZIT1NUX1VTRVJf U0VUX1ZSSU5HX0VSUl0JICAgPSB2dV9zZXRfdnJpbmdfZXJyX2V4ZWMsDQorCVtWSE9TVF9VU0VS X1NFVF9WUklOR19FTkFCTEVdCSAgID0gdnVfc2V0X3ZyaW5nX2VuYWJsZV9leGVjLA0KK307DQor DQorLyoqDQorICogdnVfY29udHJvbF9oYW5kbGVyKCkgLSBIYW5kbGUgY29udHJvbCBjb21tYW5k cyBmb3Igdmhvc3QtdXNlcg0KKyAqIEB2ZGV2Ogl2aG9zdC11c2VyIGRldmljZQ0KKyAqIEBmZDoJ CXZob3N0LXVzZXIgbWVzc2FnZSBzb2NrZXQNCisgKiBAZXZlbnRzOgllcG9sbCBldmVudHMNCisg Ki8NCisvKiBjcHBjaGVjay1zdXBwcmVzcyB1bnVzZWRGdW5jdGlvbiAqLw0KK3ZvaWQgdnVfY29u dHJvbF9oYW5kbGVyKHN0cnVjdCB2dV9kZXYgKnZkZXYsIGludCBmZCwgdWludDMyX3QgZXZlbnRz KQ0KK3sNCisJc3RydWN0IHZob3N0X3VzZXJfbXNnIG1zZyA9IHsgMCB9Ow0KKwlib29sIG5lZWRf cmVwbHksIHJlcGx5X3JlcXVlc3RlZDsNCisJaW50IHJldDsNCisNCisJaWYgKGV2ZW50cyAmIChF UE9MTFJESFVQIHwgRVBPTExIVVAgfCBFUE9MTEVSUikpIHsNCisJCXZ1X3NvY2tfcmVzZXQodmRl dik7DQorCQlyZXR1cm47DQorCX0NCisNCisJcmV0ID0gdnVfbWVzc2FnZV9yZWFkX2RlZmF1bHQo ZmQsICZtc2cpOw0KKwlpZiAocmV0ID09IDApIHsNCisJCXZ1X3NvY2tfcmVzZXQodmRldik7DQor CQlyZXR1cm47DQorCX0NCisJZGVidWcoIj09PT09PT09PT09PT09PT0gVmhvc3QgdXNlciBtZXNz YWdlID09PT09PT09PT09PT09PT0iKTsNCisJZGVidWcoIlJlcXVlc3Q6ICVzICglZCkiLCB2dV9y ZXF1ZXN0X3RvX3N0cmluZyhtc2cuaGRyLnJlcXVlc3QpLA0KKwkJbXNnLmhkci5yZXF1ZXN0KTsN CisJZGVidWcoIkZsYWdzOiAgIDB4JXgiLCBtc2cuaGRyLmZsYWdzKTsNCisJZGVidWcoIlNpemU6 ICAgICV1IiwgbXNnLmhkci5zaXplKTsNCisNCisJbmVlZF9yZXBseSA9IG1zZy5oZHIuZmxhZ3Mg JiBWSE9TVF9VU0VSX05FRURfUkVQTFlfTUFTSzsNCisNCisJaWYgKG1zZy5oZHIucmVxdWVzdCA+ PSAwICYmIG1zZy5oZHIucmVxdWVzdCA8IFZIT1NUX1VTRVJfTUFYICYmDQorCSAgICB2dV9oYW5k bGVbbXNnLmhkci5yZXF1ZXN0XSkNCisJCXJlcGx5X3JlcXVlc3RlZCA9IHZ1X2hhbmRsZVttc2cu aGRyLnJlcXVlc3RdKHZkZXYsICZtc2cpOw0KKwllbHNlDQorCQlkaWUoIlVuaGFuZGxlZCByZXF1 ZXN0OiAlZCIsIG1zZy5oZHIucmVxdWVzdCk7DQorDQorCS8qIGNwcGNoZWNrLXN1cHByZXNzIGxl Z2FjeVVuaW5pdHZhciAqLw0KKwlpZiAoIXJlcGx5X3JlcXVlc3RlZCAmJiBuZWVkX3JlcGx5KSB7 DQorCQltc2cucGF5bG9hZC51NjQgPSAwOw0KKwkJbXNnLmhkci5mbGFncyA9IDA7DQorCQltc2cu aGRyLnNpemUgPSBzaXplb2YobXNnLnBheWxvYWQudTY0KTsNCisJCW1zZy5mZF9udW0gPSAwOw0K KwkJcmVwbHlfcmVxdWVzdGVkID0gdHJ1ZTsNCisJfQ0KKw0KKwlpZiAocmVwbHlfcmVxdWVzdGVk KQ0KKwkJdnVfc2VuZF9yZXBseShmZCwgJm1zZyk7DQorfQ0KZGlmZiAtLWdpdCBhL3Zob3N0X3Vz ZXIuaCBiL3Zob3N0X3VzZXIuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAw MDAwMC4uNWFmMzQ5YmE1OGI4DQotLS0gL2Rldi9udWxsDQorKysgYi92aG9zdF91c2VyLmgNCkBA IC0wLDAgKzEsMjA4IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3It bGF0ZXINCisvKg0KKyAqIHZob3N0LXVzZXIgQVBJLCBjb21tYW5kIG1hbmFnZW1lbnQgYW5kIHZp cnRpbyBpbnRlcmZhY2UNCisgKg0KKyAqIENvcHlyaWdodCBSZWQgSGF0DQorICogQXV0aG9yOiBM YXVyZW50IFZpdmllciA8bHZpdmllckByZWRoYXQuY29tPg0KKyAqLw0KKw0KKy8qIHNvbWUgcGFy dHMgZnJvbSBzdWJwcm9qZWN0cy9saWJ2aG9zdC11c2VyL2xpYnZob3N0LXVzZXIuaCAqLw0KKw0K KyNpZm5kZWYgVkhPU1RfVVNFUl9IDQorI2RlZmluZSBWSE9TVF9VU0VSX0gNCisNCisjaW5jbHVk ZSAidmlydGlvLmgiDQorI2luY2x1ZGUgImlvdi5oIg0KKw0KKyNkZWZpbmUgVkhPU1RfVVNFUl9G X1BST1RPQ09MX0ZFQVRVUkVTIDMwDQorDQorI2RlZmluZSBWSE9TVF9NRU1PUllfQkFTRUxJTkVf TlJFR0lPTlMgOA0KKw0KKy8qKg0KKyAqIGVudW0gdmhvc3RfdXNlcl9wcm90b2NvbF9mZWF0dXJl IC0gTGlzdCBvZiBhdmFpbGFibGUgdmhvc3QtdXNlciBmZWF0dXJlcw0KKyAqLw0KK2VudW0gdmhv c3RfdXNlcl9wcm90b2NvbF9mZWF0dXJlIHsNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX01RID0g MCwNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX0xPR19TSE1GRCA9IDEsDQorCVZIT1NUX1VTRVJf UFJPVE9DT0xfRl9SQVJQID0gMiwNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX1JFUExZX0FDSyA9 IDMsDQorCVZIT1NUX1VTRVJfUFJPVE9DT0xfRl9ORVRfTVRVID0gNCwNCisJVkhPU1RfVVNFUl9Q Uk9UT0NPTF9GX0JBQ0tFTkRfUkVRID0gNSwNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX0NST1NT X0VORElBTiA9IDYsDQorCVZIT1NUX1VTRVJfUFJPVE9DT0xfRl9DUllQVE9fU0VTU0lPTiA9IDcs DQorCVZIT1NUX1VTRVJfUFJPVE9DT0xfRl9QQUdFRkFVTFQgPSA4LA0KKwlWSE9TVF9VU0VSX1BS T1RPQ09MX0ZfQ09ORklHID0gOSwNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX1NMQVZFX1NFTkRf RkQgPSAxMCwNCisJVkhPU1RfVVNFUl9QUk9UT0NPTF9GX0hPU1RfTk9USUZJRVIgPSAxMSwNCisJ VkhPU1RfVVNFUl9QUk9UT0NPTF9GX0lORkxJR0hUX1NITUZEID0gMTIsDQorCVZIT1NUX1VTRVJf UFJPVE9DT0xfRl9JTkJBTkRfTk9USUZJQ0FUSU9OUyA9IDE0LA0KKwlWSE9TVF9VU0VSX1BST1RP Q09MX0ZfQ09ORklHVVJFX01FTV9TTE9UUyA9IDE1LA0KKw0KKwlWSE9TVF9VU0VSX1BST1RPQ09M X0ZfTUFYDQorfTsNCisNCisvKioNCisgKiBlbnVtIHZob3N0X3VzZXJfcmVxdWVzdCAtIExpc3Qg b2YgYXZhaWxhYmxlIHZob3N0LXVzZXIgcmVxdWVzdHMNCisgKi8NCitlbnVtIHZob3N0X3VzZXJf cmVxdWVzdCB7DQorCVZIT1NUX1VTRVJfTk9ORSA9IDAsDQorCVZIT1NUX1VTRVJfR0VUX0ZFQVRV UkVTID0gMSwNCisJVkhPU1RfVVNFUl9TRVRfRkVBVFVSRVMgPSAyLA0KKwlWSE9TVF9VU0VSX1NF VF9PV05FUiA9IDMsDQorCVZIT1NUX1VTRVJfUkVTRVRfT1dORVIgPSA0LA0KKwlWSE9TVF9VU0VS X1NFVF9NRU1fVEFCTEUgPSA1LA0KKwlWSE9TVF9VU0VSX1NFVF9MT0dfQkFTRSA9IDYsDQorCVZI T1NUX1VTRVJfU0VUX0xPR19GRCA9IDcsDQorCVZIT1NUX1VTRVJfU0VUX1ZSSU5HX05VTSA9IDgs DQorCVZIT1NUX1VTRVJfU0VUX1ZSSU5HX0FERFIgPSA5LA0KKwlWSE9TVF9VU0VSX1NFVF9WUklO R19CQVNFID0gMTAsDQorCVZIT1NUX1VTRVJfR0VUX1ZSSU5HX0JBU0UgPSAxMSwNCisJVkhPU1Rf VVNFUl9TRVRfVlJJTkdfS0lDSyA9IDEyLA0KKwlWSE9TVF9VU0VSX1NFVF9WUklOR19DQUxMID0g MTMsDQorCVZIT1NUX1VTRVJfU0VUX1ZSSU5HX0VSUiA9IDE0LA0KKwlWSE9TVF9VU0VSX0dFVF9Q Uk9UT0NPTF9GRUFUVVJFUyA9IDE1LA0KKwlWSE9TVF9VU0VSX1NFVF9QUk9UT0NPTF9GRUFUVVJF UyA9IDE2LA0KKwlWSE9TVF9VU0VSX0dFVF9RVUVVRV9OVU0gPSAxNywNCisJVkhPU1RfVVNFUl9T RVRfVlJJTkdfRU5BQkxFID0gMTgsDQorCVZIT1NUX1VTRVJfU0VORF9SQVJQID0gMTksDQorCVZI T1NUX1VTRVJfTkVUX1NFVF9NVFUgPSAyMCwNCisJVkhPU1RfVVNFUl9TRVRfQkFDS0VORF9SRVFf RkQgPSAyMSwNCisJVkhPU1RfVVNFUl9JT1RMQl9NU0cgPSAyMiwNCisJVkhPU1RfVVNFUl9TRVRf VlJJTkdfRU5ESUFOID0gMjMsDQorCVZIT1NUX1VTRVJfR0VUX0NPTkZJRyA9IDI0LA0KKwlWSE9T VF9VU0VSX1NFVF9DT05GSUcgPSAyNSwNCisJVkhPU1RfVVNFUl9DUkVBVEVfQ1JZUFRPX1NFU1NJ T04gPSAyNiwNCisJVkhPU1RfVVNFUl9DTE9TRV9DUllQVE9fU0VTU0lPTiA9IDI3LA0KKwlWSE9T VF9VU0VSX1BPU1RDT1BZX0FEVklTRSAgPSAyOCwNCisJVkhPU1RfVVNFUl9QT1NUQ09QWV9MSVNU RU4gID0gMjksDQorCVZIT1NUX1VTRVJfUE9TVENPUFlfRU5EICAgICA9IDMwLA0KKwlWSE9TVF9V U0VSX0dFVF9JTkZMSUdIVF9GRCA9IDMxLA0KKwlWSE9TVF9VU0VSX1NFVF9JTkZMSUdIVF9GRCA9 IDMyLA0KKwlWSE9TVF9VU0VSX0dQVV9TRVRfU09DS0VUID0gMzMsDQorCVZIT1NUX1VTRVJfVlJJ TkdfS0lDSyA9IDM1LA0KKwlWSE9TVF9VU0VSX0dFVF9NQVhfTUVNX1NMT1RTID0gMzYsDQorCVZI T1NUX1VTRVJfQUREX01FTV9SRUcgPSAzNywNCisJVkhPU1RfVVNFUl9SRU1fTUVNX1JFRyA9IDM4 LA0KKwlWSE9TVF9VU0VSX01BWA0KK307DQorDQorLyoqDQorICogc3RydWN0IHZob3N0X3VzZXJf aGVhZGVyIC0gdmhvc3QtdXNlciBtZXNzYWdlIGhlYWRlcg0KKyAqIEByZXF1ZXN0OglSZXF1ZXN0 IHR5cGUgb2YgdGhlIG1lc3NhZ2UNCisgKiBAZmxhZ3M6CVJlcXVlc3QgZmxhZ3MNCisgKiBAc2l6 ZToJVGhlIGZvbGxvd2luZyBwYXlsb2FkIHNpemUNCisgKi8NCitzdHJ1Y3Qgdmhvc3RfdXNlcl9o ZWFkZXIgew0KKwllbnVtIHZob3N0X3VzZXJfcmVxdWVzdCByZXF1ZXN0Ow0KKw0KKyNkZWZpbmUg VkhPU1RfVVNFUl9WRVJTSU9OX01BU0sgICAgIDB4Mw0KKyNkZWZpbmUgVkhPU1RfVVNFUl9SRVBM WV9NQVNLICAgICAgICgweDEgPDwgMikNCisjZGVmaW5lIFZIT1NUX1VTRVJfTkVFRF9SRVBMWV9N QVNLICAoMHgxIDw8IDMpDQorCXVpbnQzMl90IGZsYWdzOw0KKwl1aW50MzJfdCBzaXplOw0KK30g X19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsNCisNCisvKioNCisgKiBzdHJ1Y3Qgdmhvc3Rf dXNlcl9tZW1vcnlfcmVnaW9uIC0gRnJvbnQtZW5kIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGluZm9y bWF0aW9uDQorICogQGd1ZXN0X3BoeXNfYWRkcjoJR3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBvZiB0 aGUgcmVnaW9uDQorICogQG1lbW9yeV9zaXplOglNZW1vcnkgc2l6ZQ0KKyAqIEB1c2Vyc3BhY2Vf YWRkcjoJZnJvbnQtZW5kIChRRU1VKSB1c2Vyc3BhY2UgYWRkcmVzcw0KKyAqIEBtbWFwX29mZnNl dDoJcmVnaW9uIG9mZnNldCBpbiB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhDQorICovDQorc3RydWN0 IHZob3N0X3VzZXJfbWVtb3J5X3JlZ2lvbiB7DQorCXVpbnQ2NF90IGd1ZXN0X3BoeXNfYWRkcjsN CisJdWludDY0X3QgbWVtb3J5X3NpemU7DQorCXVpbnQ2NF90IHVzZXJzcGFjZV9hZGRyOw0KKwl1 aW50NjRfdCBtbWFwX29mZnNldDsNCit9Ow0KKw0KKy8qKg0KKyAqIHN0cnVjdCB2aG9zdF91c2Vy X21lbW9yeSAtIExpc3Qgb2YgYWxsIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbnMNCisgKiBAbnJl Z2lvbnM6CU51bWJlciBvZiBtZW1vcnkgcmVnaW9ucw0KKyAqIEBwYWRkaW5nOglQYWRkaW5nDQor ICogQHJlZ2lvbnM6CU1lbW9yeSByZWdpb25zIGxpc3QNCisgKi8NCitzdHJ1Y3Qgdmhvc3RfdXNl cl9tZW1vcnkgew0KKwl1aW50MzJfdCBucmVnaW9uczsNCisJdWludDMyX3QgcGFkZGluZzsNCisJ c3RydWN0IHZob3N0X3VzZXJfbWVtb3J5X3JlZ2lvbiByZWdpb25zW1ZIT1NUX01FTU9SWV9CQVNF TElORV9OUkVHSU9OU107DQorfTsNCisNCisvKioNCisgKiB1bmlvbiB2aG9zdF91c2VyX3BheWxv YWQgLSB2aG9zdC11c2VyIG1lc3NhZ2UgcGF5bG9hZA0KKyAqIEB1NjQ6CQk2NC1iaXQgcGF5bG9h ZA0KKyAqIEBzdGF0ZToJCXZyaW5nIHN0YXRlIHBheWxvYWQNCisgKiBAYWRkcjoJCXZyaW5nIGFk ZHJlc3NlcyBwYXlsb2FkDQorICogdmhvc3RfdXNlcl9tZW1vcnk6CU1lbW9yeSByZWdpb25zIGlu Zm9ybWF0aW9uIHBheWxvYWQNCisgKi8NCit1bmlvbiB2aG9zdF91c2VyX3BheWxvYWQgew0KKyNk ZWZpbmUgVkhPU1RfVVNFUl9WUklOR19JRFhfTUFTSyAgIDB4ZmYNCisjZGVmaW5lIFZIT1NUX1VT RVJfVlJJTkdfTk9GRF9NQVNLICAoMHgxIDw8IDgpDQorCXVpbnQ2NF90IHU2NDsNCisJc3RydWN0 IHZob3N0X3ZyaW5nX3N0YXRlIHN0YXRlOw0KKwlzdHJ1Y3Qgdmhvc3RfdnJpbmdfYWRkciBhZGRy Ow0KKwlzdHJ1Y3Qgdmhvc3RfdXNlcl9tZW1vcnkgbWVtb3J5Ow0KK307DQorDQorLyoqDQorICog c3RydWN0IHZob3N0X3VzZXJfbXNnIC0gdmhvc3QtdXNlIG1lc3NhZ2UNCisgKiBAaGRyOgkJTWVz c2FnZSBoZWFkZXINCisgKiBAcGF5bG9hZDoJCU1lc3NhZ2UgcGF5bG9hZA0KKyAqIEBmZHM6CQlG aWxlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQ0KKyAqIAkJCWluIHRo ZSBhbmNpbGxhcnkgZGF0YS4NCisgKiAJCQkoc2hhcmVkIG1lbW9yeSBvciBldmVudCBmaWxlIGRl c2NyaXB0b3JzKQ0KKyAqIEBmZF9udW06CQlOdW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycw0KKyAq Lw0KK3N0cnVjdCB2aG9zdF91c2VyX21zZyB7DQorCXN0cnVjdCB2aG9zdF91c2VyX2hlYWRlciBo ZHI7DQorCXVuaW9uIHZob3N0X3VzZXJfcGF5bG9hZCBwYXlsb2FkOw0KKw0KKwlpbnQgZmRzW1ZI T1NUX01FTU9SWV9CQVNFTElORV9OUkVHSU9OU107DQorCWludCBmZF9udW07DQorfSBfX2F0dHJp YnV0ZV9fICgoX19wYWNrZWRfXykpOw0KKyNkZWZpbmUgVkhPU1RfVVNFUl9IRFJfU0laRSBzaXpl b2Yoc3RydWN0IHZob3N0X3VzZXJfaGVhZGVyKQ0KKw0KKy8qIGluZGV4IG9mIHRoZSBSWCB2aXJ0 cXVldWUgKi8NCisjZGVmaW5lIFZIT1NUX1VTRVJfUlhfUVVFVUUgMA0KKy8qIGluZGV4IG9mIHRo ZSBUWCB2aXJ0cXVldWUgKi8NCisjZGVmaW5lIFZIT1NUX1VTRVJfVFhfUVVFVUUgMQ0KKw0KKy8q IGluIGNhc2Ugb2YgbXVsdGlxdWV1ZSwgdGhlIFJYIGFuZCBUWCBxdWV1ZXMgYXJlIGludGVybGVh dmVkICovDQorI2RlZmluZSBWSE9TVF9VU0VSX0lTX1FVRVVFX1RYKG4pCShuICUgMikNCisjZGVm aW5lIFZIT1NUX1VTRVJfSVNfUVVFVUVfUlgobikJKCEobiAlIDIpKQ0KKw0KKy8qIERlZmF1bHQg dmlydGlvLW5ldCBoZWFkZXIgZm9yIHBhc3N0ICovDQorI2RlZmluZSBWVV9IRUFERVIgKChzdHJ1 Y3QgdmlydGlvX25ldF9oZHIpewlcDQorCS5mbGFncyA9IFZJUlRJT19ORVRfSERSX0ZfREFUQV9W QUxJRCwJXA0KKwkuZ3NvX3R5cGUgPSBWSVJUSU9fTkVUX0hEUl9HU09fTk9ORSwJXA0KK30pDQor DQorLyoqDQorICogdnVfcXVldWVfZW5hYmxlZCAtIFJldHVybiBzdGF0ZSBvZiBhIHZpcnRxdWV1 ZQ0KKyAqIEB2cToJCXZpcnRxdWV1ZSB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlm IHRoZSB2aXJxdWV1ZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UNCisgKi8NCisvKiBjcHBj aGVjay1zdXBwcmVzcyB1bnVzZWRGdW5jdGlvbiAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCB2dV9x dWV1ZV9lbmFibGVkKGNvbnN0IHN0cnVjdCB2dV92aXJ0cSAqdnEpDQorew0KKwlyZXR1cm4gdnEt PmVuYWJsZTsNCit9DQorDQorLyoqDQorICogdnVfcXVldWVfc3RhcnRlZCAtIFJldHVybiBzdGF0 ZSBvZiBhIHZpcnRxdWV1ZQ0KKyAqIEB2cToJCXZpcnRxdWV1ZSB0byBjaGVjaw0KKyAqDQorICog UmV0dXJuOiB0cnVlIGlmIHRoZSB2aXJxdWV1ZSBpcyBzdGFydGVkLCBmYWxzZSBvdGhlcndpc2UN CisgKi8NCisvKiBjcHBjaGVjay1zdXBwcmVzcyB1bnVzZWRGdW5jdGlvbiAqLw0KK3N0YXRpYyBp bmxpbmUgYm9vbCB2dV9xdWV1ZV9zdGFydGVkKGNvbnN0IHN0cnVjdCB2dV92aXJ0cSAqdnEpDQor ew0KKwlyZXR1cm4gdnEtPnN0YXJ0ZWQ7DQorfQ0KKw0KK3ZvaWQgdnVfcHJpbnRfY2FwYWJpbGl0 aWVzKHZvaWQpOw0KK3ZvaWQgdnVfaW5pdChzdHJ1Y3QgY3R4ICpjLCBzdHJ1Y3QgdnVfZGV2ICp2 ZGV2KTsNCit2b2lkIHZ1X2NsZWFudXAoc3RydWN0IHZ1X2RldiAqdmRldik7DQordm9pZCB2dV9j b250cm9sX2hhbmRsZXIoc3RydWN0IHZ1X2RldiAqdmRldiwgaW50IGZkLCB1aW50MzJfdCBldmVu dHMpOw0KKyNlbmRpZiAvKiBWSE9TVF9VU0VSX0ggKi8NCmRpZmYgLS1naXQgYS92aXJ0aW8uaCBi L3ZpcnRpby5oDQppbmRleCA5NGVmZWIwNDlmYmMuLjY0MTBkNjBmOWIzZiAxMDA2NDQNCi0tLSBh L3ZpcnRpby5oDQorKysgYi92aXJ0aW8uaA0KQEAgLTEwNSw2ICsxMDUsNyBAQCBzdHJ1Y3QgdnVf ZGV2X3JlZ2lvbiB7DQogICogQHByb3RvY29sX2ZlYXR1cmVzOglWaG9zdC11c2VyIHByb3RvY29s IGZlYXR1cmVzDQogICovDQogc3RydWN0IHZ1X2RldiB7DQorCXN0cnVjdCBjdHggKmNvbnRleHQ7 DQogCXVpbnQzMl90IG5yZWdpb25zOw0KIAlzdHJ1Y3QgdnVfZGV2X3JlZ2lvbiByZWdpb25zW1ZI T1NUX1VTRVJfTUFYX1JBTV9TTE9UU107DQogCXN0cnVjdCB2dV92aXJ0cSB2cVtWSE9TVF9VU0VS X01BWF9RVUVVRVNdOw0KLS0gDQoyLjQ2LjINCg0K