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 X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8411CA9EA0 for ; Fri, 18 Oct 2019 13:51:38 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 9EAD3222BD for ; Fri, 18 Oct 2019 13:51:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9EAD3222BD Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iLSf7-0006Yx-QW; Fri, 18 Oct 2019 13:51:25 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1iLSf6-0006YA-9j for xen-devel@lists.xenproject.org; Fri, 18 Oct 2019 13:51:24 +0000 X-Inumbo-ID: 5eba40b8-f1ae-11e9-93f5-12813bfff9fa Received: from mx1.redhat.com (unknown [209.132.183.28]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 5eba40b8-f1ae-11e9-93f5-12813bfff9fa; Fri, 18 Oct 2019 13:51:23 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24C753090FEE; Fri, 18 Oct 2019 13:51:23 +0000 (UTC) Received: from x1w.redhat.com (unknown [10.40.205.74]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 434FB60BF1; Fri, 18 Oct 2019 13:51:11 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Date: Fri, 18 Oct 2019 15:47:52 +0200 Message-Id: <20191018134754.16362-19-philmd@redhat.com> In-Reply-To: <20191018134754.16362-1-philmd@redhat.com> References: <20191018134754.16362-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Fri, 18 Oct 2019 13:51:23 +0000 (UTC) Subject: [Xen-devel] [PATCH v2 18/20] hw/pci-host/piix: Extract PIIX3 functions to hw/isa/piix3.c X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Marcel Apfelbaum , "Michael S. Tsirkin" , Paul Durrant , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Paolo Bonzini , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , Aleksandar Markovic , Igor Mammedov , Anthony Perard , xen-devel@lists.xenproject.org, Aleksandar Rikalo , Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , Eduardo Habkost Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" RnJvbTogUGhpbGlwcGUgTWF0aGlldS1EYXVkw6kgPGY0YnVnQGFtc2F0Lm9yZz4KCk1vdmUgYWxs IHRoZSBQSUlYMyBmdW5jdGlvbnMgdG8gYSBuZXcgZmlsZTogaHcvaXNhL3BpaXgzLmMuCgpSZXZp ZXdlZC1ieTogQWxla3NhbmRhciBNYXJrb3ZpYyA8YW1hcmtvdmljQHdhdmVjb21wLmNvbT4KU2ln bmVkLW9mZi1ieTogUGhpbGlwcGUgTWF0aGlldS1EYXVkw6kgPHBoaWxtZEByZWRoYXQuY29tPgot LS0KQ2hlY2twYXRjaCB3YXJuaW5nOgoKIEVSUk9SOiBzcGFjZXMgcmVxdWlyZWQgYXJvdW5kIHRo YXQgJyonIChjdHg6VnhWKQogIzMxMjogRklMRTogaHcvaXNhL3BpaXgzLmM6MjQ4OgogKyAgICAu c3Vic2VjdGlvbnMgPSAoY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uKltdKSB7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0tLQogTUFJTlRBSU5FUlMgICAg ICAgICAgICAgICAgICAgfCAgIDEgKwogaHcvaTM4Ni9LY29uZmlnICAgICAgICAgICAgICAgfCAg IDEgKwogaHcvaXNhL0tjb25maWcgICAgICAgICAgICAgICAgfCAgIDQgKwogaHcvaXNhL01ha2Vm aWxlLm9ianMgICAgICAgICAgfCAgIDEgKwogaHcvaXNhL3BpaXgzLmMgICAgICAgICAgICAgICAg fCAzOTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBody9wY2ktaG9zdC9LY29u ZmlnICAgICAgICAgICB8ICAgMSAtCiBody9wY2ktaG9zdC9waWl4LmMgICAgICAgICAgICB8IDQw MiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbmNsdWRlL2h3L3NvdXRoYnJp ZGdlL3BpaXguaCB8ICAzNiArKysKIDggZmlsZXMgY2hhbmdlZCwgNDQyIGluc2VydGlvbnMoKyks IDQwMyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBody9pc2EvcGlpeDMuYwoKZGlm ZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYWRmMDU5YTE2NC4uNDg0 NWY0N2Q5MyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTEy MzEsNiArMTIzMSw3IEBAIEY6IGh3L3BjaS1ob3N0L3BhbS5jCiBGOiBpbmNsdWRlL2h3L3BjaS1o b3N0L2k0NDBmeC5oCiBGOiBpbmNsdWRlL2h3L3BjaS1ob3N0L3EzNS5oCiBGOiBpbmNsdWRlL2h3 L3BjaS1ob3N0L3BhbS5oCitGOiBody9pc2EvcGlpeDMuYwogRjogaHcvaXNhL2xwY19pY2g5LmMK IEY6IGh3L2kyYy9zbWJ1c19pY2g5LmMKIEY6IGh3L2FjcGkvcGlpeDQuYwpkaWZmIC0tZ2l0IGEv aHcvaTM4Ni9LY29uZmlnIGIvaHcvaTM4Ni9LY29uZmlnCmluZGV4IGM1YzlkNDkwMGUuLjU4OWQ3 NWUyNmEgMTAwNjQ0Ci0tLSBhL2h3L2kzODYvS2NvbmZpZworKysgYi9ody9pMzg2L0tjb25maWcK QEAgLTYxLDYgKzYxLDcgQEAgY29uZmlnIEk0NDBGWAogICAgIHNlbGVjdCBQQ19BQ1BJCiAgICAg c2VsZWN0IEFDUElfU01CVVMKICAgICBzZWxlY3QgUENJX1BJSVgKKyAgICBzZWxlY3QgUElJWDMK ICAgICBzZWxlY3QgSURFX1BJSVgKICAgICBzZWxlY3QgRElNTQogICAgIHNlbGVjdCBTTUJJT1MK ZGlmZiAtLWdpdCBhL2h3L2lzYS9LY29uZmlnIGIvaHcvaXNhL0tjb25maWcKaW5kZXggOThhMjg5 OTU3ZS4uOGEzODgxM2NjMSAxMDA2NDQKLS0tIGEvaHcvaXNhL0tjb25maWcKKysrIGIvaHcvaXNh L0tjb25maWcKQEAgLTI5LDYgKzI5LDEwIEBAIGNvbmZpZyBQQzg3MzEyCiAgICAgc2VsZWN0IEZE QwogICAgIHNlbGVjdCBJREVfSVNBCiAKK2NvbmZpZyBQSUlYMworICAgIGJvb2wKKyAgICBzZWxl Y3QgSVNBX0JVUworCiBjb25maWcgUElJWDQKICAgICBib29sCiAgICAgIyBGb3IgaGlzdG9yaWNh bCByZWFzb25zLCBTdXBlcklPIGRldmljZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIGJvYXJkCmRpZmYg LS1naXQgYS9ody9pc2EvTWFrZWZpbGUub2JqcyBiL2h3L2lzYS9NYWtlZmlsZS5vYmpzCmluZGV4 IGZmOTc0ODU1MDQuLjhlNzM5NjBhNzUgMTAwNjQ0Ci0tLSBhL2h3L2lzYS9NYWtlZmlsZS5vYmpz CisrKyBiL2h3L2lzYS9NYWtlZmlsZS5vYmpzCkBAIC0zLDYgKzMsNyBAQCBjb21tb24tb2JqLSQo Q09ORklHX0lTQV9TVVBFUklPKSArPSBpc2Etc3VwZXJpby5vCiBjb21tb24tb2JqLSQoQ09ORklH X0FQTSkgKz0gYXBtLm8KIGNvbW1vbi1vYmotJChDT05GSUdfSTgyMzc4KSArPSBpODIzNzgubwog Y29tbW9uLW9iai0kKENPTkZJR19QQzg3MzEyKSArPSBwYzg3MzEyLm8KK2NvbW1vbi1vYmotJChD T05GSUdfUElJWDMpICs9IHBpaXgzLm8KIGNvbW1vbi1vYmotJChDT05GSUdfUElJWDQpICs9IHBp aXg0Lm8KIGNvbW1vbi1vYmotJChDT05GSUdfVlQ4MkM2ODYpICs9IHZ0ODJjNjg2Lm8KIGNvbW1v bi1vYmotJChDT05GSUdfU01DMzdDNjY5KSArPSBzbWMzN2M2Njktc3VwZXJpby5vCmRpZmYgLS1n aXQgYS9ody9pc2EvcGlpeDMuYyBiL2h3L2lzYS9waWl4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAuLmZkMWM3ODg3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9ody9pc2Ev cGlpeDMuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIFFFTVUgUElJWCBQQ0kgSVNBIEJyaWRn ZSBFbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRmFicmljZSBCZWxsYXJkCisg KgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFu eSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2Np YXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGlu IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1p dGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlz aCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwor ICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u IG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlh bCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENP UFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVS CisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9S IE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNP RlRXQVJFLgorICovCisKKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAicWVtdS9y YW5nZS5oIgorI2luY2x1ZGUgImh3L3NvdXRoYnJpZGdlL3BpaXguaCIKKyNpbmNsdWRlICJody9p cnEuaCIKKyNpbmNsdWRlICJody9pc2EvaXNhLmgiCisjaW5jbHVkZSAiaHcveGVuL3hlbi5oIgor I2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJzeXNlbXUvcmVzZXQuaCIKKyNp bmNsdWRlICJzeXNlbXUvcnVuc3RhdGUuaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vdm1zdGF0ZS5o IgorCisjZGVmaW5lIFhFTl9QSUlYX05VTV9QSVJRUyAgICAgIDEyOFVMTAorCisjZGVmaW5lIFRZ UEVfUElJWDNfUENJX0RFVklDRSAicGNpLXBpaXgzIgorI2RlZmluZSBQSUlYM19QQ0lfREVWSUNF KG9iaikgXAorICAgIE9CSkVDVF9DSEVDSyhQSUlYM1N0YXRlLCAob2JqKSwgVFlQRV9QSUlYM19Q Q0lfREVWSUNFKQorCisjZGVmaW5lIFRZUEVfUElJWDNfREVWSUNFICJQSUlYMyIKKyNkZWZpbmUg VFlQRV9QSUlYM19YRU5fREVWSUNFICJQSUlYMy14ZW4iCisKK3N0YXRpYyB2b2lkIHBpaXgzX3Nl dF9pcnFfcGljKFBJSVgzU3RhdGUgKnBpaXgzLCBpbnQgcGljX2lycSkKK3sKKyAgICBxZW11X3Nl dF9pcnEocGlpeDMtPnBpY1twaWNfaXJxXSwKKyAgICAgICAgICAgICAgICAgISEocGlpeDMtPnBp Y19sZXZlbHMgJgorICAgICAgICAgICAgICAgICAgICAoKCgxVUxMIDw8IFBJSVhfTlVNX1BJUlFT KSAtIDEpIDw8CisgICAgICAgICAgICAgICAgICAgICAocGljX2lycSAqIFBJSVhfTlVNX1BJUlFT KSkpKTsKK30KKworc3RhdGljIHZvaWQgcGlpeDNfc2V0X2lycV9sZXZlbF9pbnRlcm5hbChQSUlY M1N0YXRlICpwaWl4MywgaW50IHBpcnEsIGludCBsZXZlbCkKK3sKKyAgICBpbnQgcGljX2lycTsK KyAgICB1aW50NjRfdCBtYXNrOworCisgICAgcGljX2lycSA9IHBpaXgzLT5kZXYuY29uZmlnW1BJ SVhfUElSUUNBICsgcGlycV07CisgICAgaWYgKHBpY19pcnEgPj0gUElJWF9OVU1fUElDX0lSUVMp IHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1hc2sgPSAxVUxMIDw8ICgocGljX2ly cSAqIFBJSVhfTlVNX1BJUlFTKSArIHBpcnEpOworICAgIHBpaXgzLT5waWNfbGV2ZWxzICY9IH5t YXNrOworICAgIHBpaXgzLT5waWNfbGV2ZWxzIHw9IG1hc2sgKiAhIWxldmVsOworfQorCitzdGF0 aWMgdm9pZCBwaWl4M19zZXRfaXJxX2xldmVsKFBJSVgzU3RhdGUgKnBpaXgzLCBpbnQgcGlycSwg aW50IGxldmVsKQoreworICAgIGludCBwaWNfaXJxOworCisgICAgcGljX2lycSA9IHBpaXgzLT5k ZXYuY29uZmlnW1BJSVhfUElSUUNBICsgcGlycV07CisgICAgaWYgKHBpY19pcnEgPj0gUElJWF9O VU1fUElDX0lSUVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpaXgzX3NldF9p cnFfbGV2ZWxfaW50ZXJuYWwocGlpeDMsIHBpcnEsIGxldmVsKTsKKworICAgIHBpaXgzX3NldF9p cnFfcGljKHBpaXgzLCBwaWNfaXJxKTsKK30KKworc3RhdGljIHZvaWQgcGlpeDNfc2V0X2lycSh2 b2lkICpvcGFxdWUsIGludCBwaXJxLCBpbnQgbGV2ZWwpCit7CisgICAgUElJWDNTdGF0ZSAqcGlp eDMgPSBvcGFxdWU7CisgICAgcGlpeDNfc2V0X2lycV9sZXZlbChwaWl4MywgcGlycSwgbGV2ZWwp OworfQorCitzdGF0aWMgUENJSU5UeFJvdXRlIHBpaXgzX3JvdXRlX2ludHhfcGluX3RvX2lycSh2 b2lkICpvcGFxdWUsIGludCBwaW4pCit7CisgICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBvcGFxdWU7 CisgICAgaW50IGlycSA9IHBpaXgzLT5kZXYuY29uZmlnW1BJSVhfUElSUUNBICsgcGluXTsKKyAg ICBQQ0lJTlR4Um91dGUgcm91dGU7CisKKyAgICBpZiAoaXJxIDwgUElJWF9OVU1fUElDX0lSUVMp IHsKKyAgICAgICAgcm91dGUubW9kZSA9IFBDSV9JTlRYX0VOQUJMRUQ7CisgICAgICAgIHJvdXRl LmlycSA9IGlycTsKKyAgICB9IGVsc2UgeworICAgICAgICByb3V0ZS5tb2RlID0gUENJX0lOVFhf RElTQUJMRUQ7CisgICAgICAgIHJvdXRlLmlycSA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcm91 dGU7Cit9CisKKy8qIGlycSByb3V0aW5nIGlzIGNoYW5nZWQuIHNvIHJlYnVpbGQgYml0bWFwICov CitzdGF0aWMgdm9pZCBwaWl4M191cGRhdGVfaXJxX2xldmVscyhQSUlYM1N0YXRlICpwaWl4MykK K3sKKyAgICBQQ0lCdXMgKmJ1cyA9IHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KTsKKyAgICBpbnQg cGlycTsKKworICAgIHBpaXgzLT5waWNfbGV2ZWxzID0gMDsKKyAgICBmb3IgKHBpcnEgPSAwOyBw aXJxIDwgUElJWF9OVU1fUElSUVM7IHBpcnErKykgeworICAgICAgICBwaWl4M19zZXRfaXJxX2xl dmVsKHBpaXgzLCBwaXJxLCBwY2lfYnVzX2dldF9pcnFfbGV2ZWwoYnVzLCBwaXJxKSk7CisgICAg fQorfQorCitzdGF0aWMgdm9pZCBwaWl4M193cml0ZV9jb25maWcoUENJRGV2aWNlICpkZXYsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3Qg dmFsLCBpbnQgbGVuKQoreworICAgIHBjaV9kZWZhdWx0X3dyaXRlX2NvbmZpZyhkZXYsIGFkZHJl c3MsIHZhbCwgbGVuKTsKKyAgICBpZiAocmFuZ2VzX292ZXJsYXAoYWRkcmVzcywgbGVuLCBQSUlY X1BJUlFDQSwgNCkpIHsKKyAgICAgICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBQSUlYM19QQ0lfREVW SUNFKGRldik7CisgICAgICAgIGludCBwaWNfaXJxOworCisgICAgICAgIHBjaV9idXNfZmlyZV9p bnR4X3JvdXRpbmdfbm90aWZpZXIocGNpX2dldF9idXMoJnBpaXgzLT5kZXYpKTsKKyAgICAgICAg cGlpeDNfdXBkYXRlX2lycV9sZXZlbHMocGlpeDMpOworICAgICAgICBmb3IgKHBpY19pcnEgPSAw OyBwaWNfaXJxIDwgUElJWF9OVU1fUElDX0lSUVM7IHBpY19pcnErKykgeworICAgICAgICAgICAg cGlpeDNfc2V0X2lycV9waWMocGlpeDMsIHBpY19pcnEpOworICAgICAgICB9CisgICAgfQorfQor CitzdGF0aWMgdm9pZCBwaWl4M193cml0ZV9jb25maWdfeGVuKFBDSURldmljZSAqZGV2LAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJf dCB2YWwsIGludCBsZW4pCit7CisgICAgeGVuX3BpaXhfcGNpX3dyaXRlX2NvbmZpZ19jbGllbnQo YWRkcmVzcywgdmFsLCBsZW4pOworICAgIHBpaXgzX3dyaXRlX2NvbmZpZyhkZXYsIGFkZHJlc3Ms IHZhbCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcGlpeDNfcmVzZXQodm9pZCAqb3BhcXVlKQor eworICAgIFBJSVgzU3RhdGUgKmQgPSBvcGFxdWU7CisgICAgdWludDhfdCAqcGNpX2NvbmYgPSBk LT5kZXYuY29uZmlnOworCisgICAgcGNpX2NvbmZbMHgwNF0gPSAweDA3OyAvKiBtYXN0ZXIsIG1l bW9yeSBhbmQgSS9PICovCisgICAgcGNpX2NvbmZbMHgwNV0gPSAweDAwOworICAgIHBjaV9jb25m WzB4MDZdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweDA3XSA9IDB4MDI7IC8qIFBDSV9zdGF0dXNf ZGV2c2VsX21lZGl1bSAqLworICAgIHBjaV9jb25mWzB4NGNdID0gMHg0ZDsKKyAgICBwY2lfY29u ZlsweDRlXSA9IDB4MDM7CisgICAgcGNpX2NvbmZbMHg0Zl0gPSAweDAwOworICAgIHBjaV9jb25m WzB4NjBdID0gMHg4MDsKKyAgICBwY2lfY29uZlsweDYxXSA9IDB4ODA7CisgICAgcGNpX2NvbmZb MHg2Ml0gPSAweDgwOworICAgIHBjaV9jb25mWzB4NjNdID0gMHg4MDsKKyAgICBwY2lfY29uZlsw eDY5XSA9IDB4MDI7CisgICAgcGNpX2NvbmZbMHg3MF0gPSAweDgwOworICAgIHBjaV9jb25mWzB4 NzZdID0gMHgwYzsKKyAgICBwY2lfY29uZlsweDc3XSA9IDB4MGM7CisgICAgcGNpX2NvbmZbMHg3 OF0gPSAweDAyOworICAgIHBjaV9jb25mWzB4NzldID0gMHgwMDsKKyAgICBwY2lfY29uZlsweDgw XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHg4Ml0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTBd ID0gMHgwODsKKyAgICBwY2lfY29uZlsweGEyXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhM10g PSAweDAwOworICAgIHBjaV9jb25mWzB4YTRdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGE1XSA9 IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhNl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTddID0g MHgwMDsKKyAgICBwY2lfY29uZlsweGE4XSA9IDB4MGY7CisgICAgcGNpX2NvbmZbMHhhYV0gPSAw eDAwOworICAgIHBjaV9jb25mWzB4YWJdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGFjXSA9IDB4 MDA7CisgICAgcGNpX2NvbmZbMHhhZV0gPSAweDAwOworCisgICAgZC0+cGljX2xldmVscyA9IDA7 CisgICAgZC0+cmNyID0gMDsKK30KKworc3RhdGljIGludCBwaWl4M19wb3N0X2xvYWQodm9pZCAq b3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBQSUlYM1N0YXRlICpwaWl4MyA9IG9wYXF1 ZTsKKyAgICBpbnQgcGlycTsKKworICAgIC8qCisgICAgICogQmVjYXVzZSB0aGUgaTgyNTkgaGFz IG5vdCBiZWVuIGRlc2VyaWFsaXplZCB5ZXQsIHFlbXVfaXJxX3JhaXNlCisgICAgICogbWlnaHQg YnJpbmcgdGhlIHN5c3RlbSB0byBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIHRoZSBzYXZlZCBvbmU7 CisgICAgICogZm9yIGV4YW1wbGUsIHRoZSBpbnRlcnJ1cHQgY291bGQgYmUgbWFza2VkIGJ1dCB0 aGUgaTgyNTkgd291bGQKKyAgICAgKiBub3Qga25vdyB0aGF0IHlldCBhbmQgd291bGQgdHJpZ2dl ciBhbiBpbnRlcnJ1cHQgaW4gdGhlIENQVS4KKyAgICAgKgorICAgICAqIEhlcmUsIHdlIHVwZGF0 ZSBpcnEgbGV2ZWxzIHdpdGhvdXQgcmFpc2luZyB0aGUgaW50ZXJydXB0LgorICAgICAqIEludGVy cnVwdCBzdGF0ZSB3aWxsIGJlIGRlc2VyaWFsaXplZCBzZXBhcmF0ZWx5IHRocm91Z2ggdGhlIGk4 MjU5LgorICAgICAqLworICAgIHBpaXgzLT5waWNfbGV2ZWxzID0gMDsKKyAgICBmb3IgKHBpcnEg PSAwOyBwaXJxIDwgUElJWF9OVU1fUElSUVM7IHBpcnErKykgeworICAgICAgICBwaWl4M19zZXRf aXJxX2xldmVsX2ludGVybmFsKHBpaXgzLCBwaXJxLAorICAgICAgICAgICAgcGNpX2J1c19nZXRf aXJxX2xldmVsKHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KSwgcGlycSkpOworICAgIH0KKyAgICBy ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaWl4M19wcmVfc2F2ZSh2b2lkICpvcGFxdWUpCit7 CisgICAgaW50IGk7CisgICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBvcGFxdWU7CisKKyAgICBmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShwaWl4My0+cGNpX2lycV9sZXZlbHNfdm1zdGF0ZSk7IGkr KykgeworICAgICAgICBwaWl4My0+cGNpX2lycV9sZXZlbHNfdm1zdGF0ZVtpXSA9CisgICAgICAg ICAgICBwY2lfYnVzX2dldF9pcnFfbGV2ZWwocGNpX2dldF9idXMoJnBpaXgzLT5kZXYpLCBpKTsK KyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgcGlpeDNfcmNyX25lZWRl ZCh2b2lkICpvcGFxdWUpCit7CisgICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBvcGFxdWU7CisKKyAg ICByZXR1cm4gKHBpaXgzLT5yY3IgIT0gMCk7Cit9CisKK3N0YXRpYyBjb25zdCBWTVN0YXRlRGVz Y3JpcHRpb24gdm1zdGF0ZV9waWl4M19yY3IgPSB7CisgICAgLm5hbWUgPSAiUElJWDMvcmNyIiwK KyAgICAudmVyc2lvbl9pZCA9IDEsCisgICAgLm1pbmltdW1fdmVyc2lvbl9pZCA9IDEsCisgICAg Lm5lZWRlZCA9IHBpaXgzX3Jjcl9uZWVkZWQsCisgICAgLmZpZWxkcyA9IChWTVN0YXRlRmllbGRb XSkgeworICAgICAgICBWTVNUQVRFX1VJTlQ4KHJjciwgUElJWDNTdGF0ZSksCisgICAgICAgIFZN U1RBVEVfRU5EX09GX0xJU1QoKQorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBWTVN0YXRlRGVz Y3JpcHRpb24gdm1zdGF0ZV9waWl4MyA9IHsKKyAgICAubmFtZSA9ICJQSUlYMyIsCisgICAgLnZl cnNpb25faWQgPSAzLAorICAgIC5taW5pbXVtX3ZlcnNpb25faWQgPSAyLAorICAgIC5wb3N0X2xv YWQgPSBwaWl4M19wb3N0X2xvYWQsCisgICAgLnByZV9zYXZlID0gcGlpeDNfcHJlX3NhdmUsCisg ICAgLmZpZWxkcyA9IChWTVN0YXRlRmllbGRbXSkgeworICAgICAgICBWTVNUQVRFX1BDSV9ERVZJ Q0UoZGV2LCBQSUlYM1N0YXRlKSwKKyAgICAgICAgVk1TVEFURV9JTlQzMl9BUlJBWV9WKHBjaV9p cnFfbGV2ZWxzX3Ztc3RhdGUsIFBJSVgzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBQSUlYX05VTV9QSVJRUywgMyksCisgICAgICAgIFZNU1RBVEVfRU5EX09GX0xJU1QoKQor ICAgIH0sCisgICAgLnN1YnNlY3Rpb25zID0gKGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbipbXSkg eworICAgICAgICAmdm1zdGF0ZV9waWl4M19yY3IsCisgICAgICAgIE5VTEwKKyAgICB9Cit9Owor CisKK3N0YXRpYyB2b2lkIHJjcl93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50 NjRfdCB2YWwsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBQSUlYM1N0YXRlICpkID0gb3BhcXVlOwor CisgICAgaWYgKHZhbCAmIDQpIHsKKyAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdChT SFVURE9XTl9DQVVTRV9HVUVTVF9SRVNFVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg ZC0+cmNyID0gdmFsICYgMjsgLyoga2VlcCBTeXN0ZW0gUmVzZXQgdHlwZSBvbmx5ICovCit9CisK K3N0YXRpYyB1aW50NjRfdCByY3JfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1bnNp Z25lZCBsZW4pCit7CisgICAgUElJWDNTdGF0ZSAqZCA9IG9wYXF1ZTsKKworICAgIHJldHVybiBk LT5yY3I7Cit9CisKK3N0YXRpYyBjb25zdCBNZW1vcnlSZWdpb25PcHMgcmNyX29wcyA9IHsKKyAg ICAucmVhZCA9IHJjcl9yZWFkLAorICAgIC53cml0ZSA9IHJjcl93cml0ZSwKKyAgICAuZW5kaWFu bmVzcyA9IERFVklDRV9MSVRUTEVfRU5ESUFOCit9OworCitzdGF0aWMgdm9pZCBwaWl4M19yZWFs aXplKFBDSURldmljZSAqZGV2LCBFcnJvciAqKmVycnApCit7CisgICAgUElJWDNTdGF0ZSAqZCA9 IFBJSVgzX1BDSV9ERVZJQ0UoZGV2KTsKKworICAgIGlmICghaXNhX2J1c19uZXcoREVWSUNFKGQp LCBnZXRfc3lzdGVtX21lbW9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgcGNpX2FkZHJlc3Nf c3BhY2VfaW8oZGV2KSwgZXJycCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1l bW9yeV9yZWdpb25faW5pdF9pbygmZC0+cmNyX21lbSwgT0JKRUNUKGRldiksICZyY3Jfb3BzLCBk LAorICAgICAgICAgICAgICAgICAgICAgICAgICAicGlpeDMtcmVzZXQtY29udHJvbCIsIDEpOwor ICAgIG1lbW9yeV9yZWdpb25fYWRkX3N1YnJlZ2lvbl9vdmVybGFwKHBjaV9hZGRyZXNzX3NwYWNl X2lvKGRldiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElJWF9S Q1JfSU9QT1JULCAmZC0+cmNyX21lbSwgMSk7CisKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KHBp aXgzX3Jlc2V0LCBkKTsKK30KKworc3RhdGljIHZvaWQgcGNpX3BpaXgzX2NsYXNzX2luaXQoT2Jq ZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQoreworICAgIERldmljZUNsYXNzICpkYyA9IERF VklDRV9DTEFTUyhrbGFzcyk7CisgICAgUENJRGV2aWNlQ2xhc3MgKmsgPSBQQ0lfREVWSUNFX0NM QVNTKGtsYXNzKTsKKworICAgIGRjLT5kZXNjICAgICAgICA9ICJJU0EgYnJpZGdlIjsKKyAgICBk Yy0+dm1zZCAgICAgICAgPSAmdm1zdGF0ZV9waWl4MzsKKyAgICBkYy0+aG90cGx1Z2dhYmxlICAg PSBmYWxzZTsKKyAgICBrLT5yZWFsaXplICAgICAgPSBwaWl4M19yZWFsaXplOworICAgIGstPnZl bmRvcl9pZCAgICA9IFBDSV9WRU5ET1JfSURfSU5URUw7CisgICAgLyogODIzNzFTQiBQSUlYMyBQ Q0ktdG8tSVNBIGJyaWRnZSAoU3RlcCBBMSkgKi8KKyAgICBrLT5kZXZpY2VfaWQgICAgPSBQQ0lf REVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMDsKKyAgICBrLT5jbGFzc19pZCAgICAgPSBQQ0lfQ0xB U1NfQlJJREdFX0lTQTsKKyAgICAvKgorICAgICAqIFJlYXNvbjogcGFydCBvZiBQSUlYMyBzb3V0 aGJyaWRnZSwgbmVlZHMgdG8gYmUgd2lyZWQgdXAgYnkKKyAgICAgKiBwY19waWl4LmMncyBwY19p bml0MSgpCisgICAgICovCisgICAgZGMtPnVzZXJfY3JlYXRhYmxlID0gZmFsc2U7Cit9CisKK3N0 YXRpYyBjb25zdCBUeXBlSW5mbyBwaWl4M19wY2lfdHlwZV9pbmZvID0geworICAgIC5uYW1lID0g VFlQRV9QSUlYM19QQ0lfREVWSUNFLAorICAgIC5wYXJlbnQgPSBUWVBFX1BDSV9ERVZJQ0UsCisg ICAgLmluc3RhbmNlX3NpemUgPSBzaXplb2YoUElJWDNTdGF0ZSksCisgICAgLmFic3RyYWN0ID0g dHJ1ZSwKKyAgICAuY2xhc3NfaW5pdCA9IHBjaV9waWl4M19jbGFzc19pbml0LAorICAgIC5pbnRl cmZhY2VzID0gKEludGVyZmFjZUluZm9bXSkgeworICAgICAgICB7IElOVEVSRkFDRV9DT05WRU5U SU9OQUxfUENJX0RFVklDRSB9LAorICAgICAgICB7IH0sCisgICAgfSwKK307CisKK3N0YXRpYyB2 b2lkIHBpaXgzX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQorewor ICAgIFBDSURldmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7CisKKyAgICBr LT5jb25maWdfd3JpdGUgPSBwaWl4M193cml0ZV9jb25maWc7Cit9CisKK3N0YXRpYyBjb25zdCBU eXBlSW5mbyBwaWl4M19pbmZvID0geworICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9QSUlYM19E RVZJQ0UsCisgICAgLnBhcmVudCAgICAgICAgPSBUWVBFX1BJSVgzX1BDSV9ERVZJQ0UsCisgICAg LmNsYXNzX2luaXQgICAgPSBwaWl4M19jbGFzc19pbml0LAorfTsKKworc3RhdGljIHZvaWQgcGlp eDNfeGVuX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQoreworICAg IFBDSURldmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7CisKKyAgICBrLT5j b25maWdfd3JpdGUgPSBwaWl4M193cml0ZV9jb25maWdfeGVuOworfTsKKworc3RhdGljIGNvbnN0 IFR5cGVJbmZvIHBpaXgzX3hlbl9pbmZvID0geworICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9Q SUlYM19YRU5fREVWSUNFLAorICAgIC5wYXJlbnQgICAgICAgID0gVFlQRV9QSUlYM19QQ0lfREVW SUNFLAorICAgIC5jbGFzc19pbml0ICAgID0gcGlpeDNfeGVuX2NsYXNzX2luaXQsCit9OworCitz dGF0aWMgdm9pZCBwaWl4M19yZWdpc3Rlcl90eXBlcyh2b2lkKQoreworICAgIHR5cGVfcmVnaXN0 ZXJfc3RhdGljKCZwaWl4M19wY2lfdHlwZV9pbmZvKTsKKyAgICB0eXBlX3JlZ2lzdGVyX3N0YXRp YygmcGlpeDNfaW5mbyk7CisgICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJnBpaXgzX3hlbl9pbmZv KTsKK30KKwordHlwZV9pbml0KHBpaXgzX3JlZ2lzdGVyX3R5cGVzKQorCisvKgorICogUmV0dXJu IHRoZSBnbG9iYWwgaXJxIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZGV2aWNlIGly cQorICogcGluLiBXZSBjb3VsZCBhbHNvIHVzZSB0aGUgYnVzIG51bWJlciB0byBoYXZlIGEgbW9y ZSBwcmVjaXNlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgcGNpX3Nsb3RfZ2V0X3BpcnEoUENJ RGV2aWNlICpwY2lfZGV2LCBpbnQgcGNpX2ludHgpCit7CisgICAgaW50IHNsb3RfYWRkZW5kOwor ICAgIHNsb3RfYWRkZW5kID0gKHBjaV9kZXYtPmRldmZuID4+IDMpIC0gMTsKKyAgICByZXR1cm4g KHBjaV9pbnR4ICsgc2xvdF9hZGRlbmQpICYgMzsKK30KKworUElJWDNTdGF0ZSAqcGlpeDNfY3Jl YXRlKFBDSUJ1cyAqcGNpX2J1cywgSVNBQnVzICoqaXNhX2J1cykKK3sKKyAgICBQSUlYM1N0YXRl ICpwaWl4MzsKKyAgICBQQ0lEZXZpY2UgKnBjaV9kZXY7CisKKyAgICAvKgorICAgICAqIFhlbiBz dXBwb3J0cyBhZGRpdGlvbmFsIGludGVycnVwdCByb3V0ZXMgZnJvbSB0aGUgUENJIGRldmljZXMg dG8KKyAgICAgKiB0aGUgSU9BUElDOiB0aGUgZm91ciBwaW5zIG9mIGVhY2ggUENJIGRldmljZSBv biB0aGUgYnVzIGFyZSBhbHNvCisgICAgICogY29ubmVjdGVkIHRvIHRoZSBJT0FQSUMgZGlyZWN0 bHkuCisgICAgICogVGhlc2UgYWRkaXRpb25hbCByb3V0ZXMgY2FuIGJlIGRpc2NvdmVyZWQgdGhy b3VnaCBBQ1BJLgorICAgICAqLworICAgIGlmICh4ZW5fZW5hYmxlZCgpKSB7CisgICAgICAgIHBj aV9kZXYgPSBwY2lfY3JlYXRlX3NpbXBsZV9tdWx0aWZ1bmN0aW9uKHBjaV9idXMsIC0xLCB0cnVl LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBF X1BJSVgzX1hFTl9ERVZJQ0UpOworICAgICAgICBwaWl4MyA9IFBJSVgzX1BDSV9ERVZJQ0UocGNp X2Rldik7CisgICAgICAgIHBjaV9idXNfaXJxcyhwY2lfYnVzLCB4ZW5fcGlpeDNfc2V0X2lycSwg eGVuX3BjaV9zbG90X2dldF9waXJxLAorICAgICAgICAgICAgICAgICAgICAgcGlpeDMsIFhFTl9Q SUlYX05VTV9QSVJRUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGNpX2RldiA9IHBjaV9jcmVh dGVfc2ltcGxlX211bHRpZnVuY3Rpb24ocGNpX2J1cywgLTEsIHRydWUsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfUElJWDNfREVWSUNFKTsK KyAgICAgICAgcGlpeDMgPSBQSUlYM19QQ0lfREVWSUNFKHBjaV9kZXYpOworICAgICAgICBwY2lf YnVzX2lycXMocGNpX2J1cywgcGlpeDNfc2V0X2lycSwgcGNpX3Nsb3RfZ2V0X3BpcnEsCisgICAg ICAgICAgICAgICAgICAgICBwaWl4MywgUElJWF9OVU1fUElSUVMpOworICAgICAgICBwY2lfYnVz X3NldF9yb3V0ZV9pcnFfZm4ocGNpX2J1cywgcGlpeDNfcm91dGVfaW50eF9waW5fdG9faXJxKTsK KyAgICB9CisgICAgKmlzYV9idXMgPSBJU0FfQlVTKHFkZXZfZ2V0X2NoaWxkX2J1cyhERVZJQ0Uo cGlpeDMpLCAiaXNhLjAiKSk7CisKKyAgICByZXR1cm4gcGlpeDM7Cit9CmRpZmYgLS1naXQgYS9o dy9wY2ktaG9zdC9LY29uZmlnIGIvaHcvcGNpLWhvc3QvS2NvbmZpZwppbmRleCAxZWRjMWEzMWQ0 Li4zOTcwNDNiMjg5IDEwMDY0NAotLS0gYS9ody9wY2ktaG9zdC9LY29uZmlnCisrKyBiL2h3L3Bj aS1ob3N0L0tjb25maWcKQEAgLTMyLDcgKzMyLDYgQEAgY29uZmlnIFBDSV9QSUlYCiAgICAgYm9v bAogICAgIHNlbGVjdCBQQ0kKICAgICBzZWxlY3QgUEFNCi0gICAgc2VsZWN0IElTQV9CVVMKIAog Y29uZmlnIFBDSV9FWFBSRVNTX1EzNQogICAgIGJvb2wKZGlmZiAtLWdpdCBhL2h3L3BjaS1ob3N0 L3BpaXguYyBiL2h3L3BjaS1ob3N0L3BpaXguYwppbmRleCAxNTQ0YzQ3MjZiLi43OWVjZDU4YTJi IDEwMDY0NAotLS0gYS9ody9wY2ktaG9zdC9waWl4LmMKKysrIGIvaHcvcGNpLWhvc3QvcGlpeC5j CkBAIC0yNCwyMiArMjQsMTUgQEAKIAogI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKICNpbmNsdWRl ICJody9pMzg2L3BjLmgiCi0jaW5jbHVkZSAiaHcvaXJxLmgiCiAjaW5jbHVkZSAiaHcvcGNpL3Bj aS5oIgogI2luY2x1ZGUgImh3L3BjaS9wY2lfaG9zdC5oIgogI2luY2x1ZGUgImh3L3BjaS1ob3N0 L2k0NDBmeC5oIgogI2luY2x1ZGUgImh3L3NvdXRoYnJpZGdlL3BpaXguaCIKICNpbmNsdWRlICJo dy9xZGV2LXByb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJody9pc2EvaXNhLmgiCiAjaW5jbHVkZSAi aHcvc3lzYnVzLmgiCiAjaW5jbHVkZSAicWFwaS9lcnJvci5oIgotI2luY2x1ZGUgInFlbXUvcmFu Z2UuaCIKLSNpbmNsdWRlICJody94ZW4veGVuLmgiCiAjaW5jbHVkZSAibWlncmF0aW9uL3Ztc3Rh dGUuaCIKICNpbmNsdWRlICJody9wY2ktaG9zdC9wYW0uaCIKLSNpbmNsdWRlICJzeXNlbXUvcmVz ZXQuaCIKLSNpbmNsdWRlICJzeXNlbXUvcnVuc3RhdGUuaCIKLSNpbmNsdWRlICJody9pMzg2L2lv YXBpYy5oIgogI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgogI2luY2x1ZGUgInFlbXUvZXJyb3It cmVwb3J0LmgiCiAKQEAgLTU5LDQ5ICs1Miw5IEBAIHR5cGVkZWYgc3RydWN0IEk0NDBGWFN0YXRl IHsKICAgICB1aW50MzJfdCBzaG9ydF9yb290X2J1czsKIH0gSTQ0MEZYU3RhdGU7CiAKLSNkZWZp bmUgUElJWF9OVU1fUElDX0lSUVMgICAgICAgMTYgICAgICAvKiBpODI1OSAqIDIgKi8KLSNkZWZp bmUgUElJWF9OVU1fUElSUVMgICAgICAgICAgNFVMTCAgICAvKiBQSVJRW0EtRF0gKi8KLSNkZWZp bmUgWEVOX1BJSVhfTlVNX1BJUlFTICAgICAgMTI4VUxMCi0KLXR5cGVkZWYgc3RydWN0IFBJSVgz U3RhdGUgewotICAgIFBDSURldmljZSBkZXY7Ci0KLSAgICAvKgotICAgICAqIGJpdG1hcCB0byB0 cmFjayBwaWMgbGV2ZWxzLgotICAgICAqIFRoZSBwaWMgbGV2ZWwgaXMgdGhlIGxvZ2ljYWwgT1Ig b2YgYWxsIHRoZSBQQ0kgaXJxcyBtYXBwZWQgdG8gaXQKLSAgICAgKiBTbyBvbmUgUElDIGxldmVs IGlzIHRyYWNrZWQgYnkgUElJWF9OVU1fUElSUVMgYml0cy4KLSAgICAgKgotICAgICAqIFBJUlEg aXMgbWFwcGVkIHRvIFBJQyBwaW5zLCB3ZSB0cmFjayBpdCBieQotICAgICAqIFBJSVhfTlVNX1BJ UlFTICogUElJWF9OVU1fUElDX0lSUVMgPSA2NCBiaXRzIHdpdGgKLSAgICAgKiBwaWNfaXJxICog UElJWF9OVU1fUElSUVMgKyBwaXJxCi0gICAgICovCi0jaWYgUElJWF9OVU1fUElDX0lSUVMgKiBQ SUlYX05VTV9QSVJRUyA+IDY0Ci0jZXJyb3IgInVuYWJsZSB0byBlbmNvZGUgcGljIHN0YXRlIGlu IDY0Yml0IGluIHBpY19sZXZlbHMuIgotI2VuZGlmCi0gICAgdWludDY0X3QgcGljX2xldmVsczsK LQotICAgIHFlbXVfaXJxICpwaWM7Ci0KLSAgICAvKiBUaGlzIG1lbWJlciBpc24ndCB1c2VkLiBK dXN0IGZvciBzYXZlL2xvYWQgY29tcGF0aWJpbGl0eSAqLwotICAgIGludDMyX3QgcGNpX2lycV9s ZXZlbHNfdm1zdGF0ZVtQSUlYX05VTV9QSVJRU107Ci0KLSAgICAvKiBSZXNldCBDb250cm9sIFJl Z2lzdGVyIGNvbnRlbnRzICovCi0gICAgdWludDhfdCByY3I7Ci0KLSAgICAvKiBJTyBtZW1vcnkg cmVnaW9uIGZvciBSZXNldCBDb250cm9sIFJlZ2lzdGVyIChQSUlYX1JDUl9JT1BPUlQpICovCi0g ICAgTWVtb3J5UmVnaW9uIHJjcl9tZW07Ci19IFBJSVgzU3RhdGU7Ci0KLSNkZWZpbmUgVFlQRV9Q SUlYM19QQ0lfREVWSUNFICJwY2ktcGlpeDMiCi0jZGVmaW5lIFBJSVgzX1BDSV9ERVZJQ0Uob2Jq KSBcCi0gICAgT0JKRUNUX0NIRUNLKFBJSVgzU3RhdGUsIChvYmopLCBUWVBFX1BJSVgzX1BDSV9E RVZJQ0UpCi0KICNkZWZpbmUgSTQ0MEZYX1BDSV9ERVZJQ0Uob2JqKSBcCiAgICAgT0JKRUNUX0NI RUNLKFBDSUk0NDBGWFN0YXRlLCAob2JqKSwgVFlQRV9JNDQwRlhfUENJX0RFVklDRSkKIAotI2Rl ZmluZSBUWVBFX1BJSVgzX0RFVklDRSAiUElJWDMiCi0jZGVmaW5lIFRZUEVfUElJWDNfWEVOX0RF VklDRSAiUElJWDMteGVuIgotCiBzdHJ1Y3QgUENJSTQ0MEZYU3RhdGUgewogICAgIC8qPCBwcml2 YXRlID4qLwogICAgIFBDSURldmljZSBwYXJlbnRfb2JqOwpAQCAtMTI4LDIyICs4MSw2IEBAIHN0 cnVjdCBQQ0lJNDQwRlhTdGF0ZSB7CiAgKi8KICNkZWZpbmUgSTQ0MEZYX0NPUkVCT09UX1JBTV9T SVpFIDB4NTcKIAotc3RhdGljIHZvaWQgcGlpeDNfc2V0X2lycSh2b2lkICpvcGFxdWUsIGludCBw aXJxLCBpbnQgbGV2ZWwpOwotc3RhdGljIFBDSUlOVHhSb3V0ZSBwaWl4M19yb3V0ZV9pbnR4X3Bp bl90b19pcnEodm9pZCAqb3BhcXVlLCBpbnQgcGNpX2ludHgpOwotc3RhdGljIHZvaWQgcGlpeDNf d3JpdGVfY29uZmlnX3hlbihQQ0lEZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWwsIGludCBsZW4pOwotCi0vKgot ICogUmV0dXJuIHRoZSBnbG9iYWwgaXJxIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4g ZGV2aWNlIGlycQotICogcGluLiBXZSBjb3VsZCBhbHNvIHVzZSB0aGUgYnVzIG51bWJlciB0byBo YXZlIGEgbW9yZSBwcmVjaXNlIG1hcHBpbmcuCi0gKi8KLXN0YXRpYyBpbnQgcGNpX3Nsb3RfZ2V0 X3BpcnEoUENJRGV2aWNlICpwY2lfZGV2LCBpbnQgcGNpX2ludHgpCi17Ci0gICAgaW50IHNsb3Rf YWRkZW5kOwotICAgIHNsb3RfYWRkZW5kID0gKHBjaV9kZXYtPmRldmZuID4+IDMpIC0gMTsKLSAg ICByZXR1cm4gKHBjaV9pbnR4ICsgc2xvdF9hZGRlbmQpICYgMzsKLX0KLQogc3RhdGljIHZvaWQg aTQ0MGZ4X3VwZGF0ZV9tZW1vcnlfbWFwcGluZ3MoUENJSTQ0MEZYU3RhdGUgKmQpCiB7CiAgICAg aW50IGk7CkBAIC0zMzMsMzYgKzI3MCw2IEBAIHN0YXRpYyB2b2lkIGk0NDBmeF9yZWFsaXplKFBD SURldmljZSAqZGV2LCBFcnJvciAqKmVycnApCiAgICAgfQogfQogCi1zdGF0aWMgUElJWDNTdGF0 ZSAqcGlpeDNfY3JlYXRlKFBDSUJ1cyAqcGNpX2J1cywgSVNBQnVzICoqaXNhX2J1cykKLXsKLSAg ICBQSUlYM1N0YXRlICpwaWl4MzsKLSAgICBQQ0lEZXZpY2UgKnBjaV9kZXY7Ci0KLSAgICAvKgot ICAgICAqIFhlbiBzdXBwb3J0cyBhZGRpdGlvbmFsIGludGVycnVwdCByb3V0ZXMgZnJvbSB0aGUg UENJIGRldmljZXMgdG8KLSAgICAgKiB0aGUgSU9BUElDOiB0aGUgZm91ciBwaW5zIG9mIGVhY2gg UENJIGRldmljZSBvbiB0aGUgYnVzIGFyZSBhbHNvCi0gICAgICogY29ubmVjdGVkIHRvIHRoZSBJ T0FQSUMgZGlyZWN0bHkuCi0gICAgICogVGhlc2UgYWRkaXRpb25hbCByb3V0ZXMgY2FuIGJlIGRp c2NvdmVyZWQgdGhyb3VnaCBBQ1BJLgotICAgICAqLwotICAgIGlmICh4ZW5fZW5hYmxlZCgpKSB7 Ci0gICAgICAgIHBjaV9kZXYgPSBwY2lfY3JlYXRlX3NpbXBsZV9tdWx0aWZ1bmN0aW9uKHBjaV9i dXMsIC0xLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBUWVBFX1BJSVgzX1hFTl9ERVZJQ0UpOwotICAgICAgICBwaWl4MyA9IFBJSVgzX1BD SV9ERVZJQ0UocGNpX2Rldik7Ci0gICAgICAgIHBjaV9idXNfaXJxcyhwY2lfYnVzLCB4ZW5fcGlp eDNfc2V0X2lycSwgeGVuX3BjaV9zbG90X2dldF9waXJxLAotICAgICAgICAgICAgICAgICAgICAg cGlpeDMsIFhFTl9QSUlYX05VTV9QSVJRUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGNpX2Rl diA9IHBjaV9jcmVhdGVfc2ltcGxlX211bHRpZnVuY3Rpb24ocGNpX2J1cywgLTEsIHRydWUsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfUElJ WDNfREVWSUNFKTsKLSAgICAgICAgcGlpeDMgPSBQSUlYM19QQ0lfREVWSUNFKHBjaV9kZXYpOwot ICAgICAgICBwY2lfYnVzX2lycXMocGNpX2J1cywgcGlpeDNfc2V0X2lycSwgcGNpX3Nsb3RfZ2V0 X3BpcnEsCi0gICAgICAgICAgICAgICAgICAgICBwaWl4MywgUElJWF9OVU1fUElSUVMpOwotICAg ICAgICBwY2lfYnVzX3NldF9yb3V0ZV9pcnFfZm4ocGNpX2J1cywgcGlpeDNfcm91dGVfaW50eF9w aW5fdG9faXJxKTsKLSAgICB9Ci0gICAgKmlzYV9idXMgPSBJU0FfQlVTKHFkZXZfZ2V0X2NoaWxk X2J1cyhERVZJQ0UocGlpeDMpLCAiaXNhLjAiKSk7Ci0KLSAgICByZXR1cm4gcGlpeDM7Ci19Ci0K IFBDSUJ1cyAqaTQ0MGZ4X2luaXQoY29uc3QgY2hhciAqaG9zdF90eXBlLCBjb25zdCBjaGFyICpw Y2lfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgUENJSTQ0MEZYU3RhdGUgKipwaTQ0MGZ4X3N0 YXRlLAogICAgICAgICAgICAgICAgICAgICBpbnQgKnBpaXgzX2RldmZuLApAQCAtNDU1LDMxMiAr MzYyLDYgQEAgUENJQnVzICpmaW5kX2k0NDBmeCh2b2lkKQogICAgIHJldHVybiBzID8gcy0+YnVz IDogTlVMTDsKIH0KIAotLyogUElJWDMgUENJIHRvIElTQSBicmlkZ2UgKi8KLXN0YXRpYyB2b2lk IHBpaXgzX3NldF9pcnFfcGljKFBJSVgzU3RhdGUgKnBpaXgzLCBpbnQgcGljX2lycSkKLXsKLSAg ICBxZW11X3NldF9pcnEocGlpeDMtPnBpY1twaWNfaXJxXSwKLSAgICAgICAgICAgICAgICAgISEo cGlpeDMtPnBpY19sZXZlbHMgJgotICAgICAgICAgICAgICAgICAgICAoKCgxVUxMIDw8IFBJSVhf TlVNX1BJUlFTKSAtIDEpIDw8Ci0gICAgICAgICAgICAgICAgICAgICAocGljX2lycSAqIFBJSVhf TlVNX1BJUlFTKSkpKTsKLX0KLQotc3RhdGljIHZvaWQgcGlpeDNfc2V0X2lycV9sZXZlbF9pbnRl cm5hbChQSUlYM1N0YXRlICpwaWl4MywgaW50IHBpcnEsIGludCBsZXZlbCkKLXsKLSAgICBpbnQg cGljX2lycTsKLSAgICB1aW50NjRfdCBtYXNrOwotCi0gICAgcGljX2lycSA9IHBpaXgzLT5kZXYu Y29uZmlnW1BJSVhfUElSUUNBICsgcGlycV07Ci0gICAgaWYgKHBpY19pcnEgPj0gUElJWF9OVU1f UElDX0lSUVMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1hc2sgPSAxVUxMIDw8 ICgocGljX2lycSAqIFBJSVhfTlVNX1BJUlFTKSArIHBpcnEpOwotICAgIHBpaXgzLT5waWNfbGV2 ZWxzICY9IH5tYXNrOwotICAgIHBpaXgzLT5waWNfbGV2ZWxzIHw9IG1hc2sgKiAhIWxldmVsOwot fQotCi1zdGF0aWMgdm9pZCBwaWl4M19zZXRfaXJxX2xldmVsKFBJSVgzU3RhdGUgKnBpaXgzLCBp bnQgcGlycSwgaW50IGxldmVsKQotewotICAgIGludCBwaWNfaXJxOwotCi0gICAgcGljX2lycSA9 IHBpaXgzLT5kZXYuY29uZmlnW1BJSVhfUElSUUNBICsgcGlycV07Ci0gICAgaWYgKHBpY19pcnEg Pj0gUElJWF9OVU1fUElDX0lSUVMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBp aXgzX3NldF9pcnFfbGV2ZWxfaW50ZXJuYWwocGlpeDMsIHBpcnEsIGxldmVsKTsKLQotICAgIHBp aXgzX3NldF9pcnFfcGljKHBpaXgzLCBwaWNfaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgcGlpeDNf c2V0X2lycSh2b2lkICpvcGFxdWUsIGludCBwaXJxLCBpbnQgbGV2ZWwpCi17Ci0gICAgUElJWDNT dGF0ZSAqcGlpeDMgPSBvcGFxdWU7Ci0gICAgcGlpeDNfc2V0X2lycV9sZXZlbChwaWl4MywgcGly cSwgbGV2ZWwpOwotfQotCi1zdGF0aWMgUENJSU5UeFJvdXRlIHBpaXgzX3JvdXRlX2ludHhfcGlu X3RvX2lycSh2b2lkICpvcGFxdWUsIGludCBwaW4pCi17Ci0gICAgUElJWDNTdGF0ZSAqcGlpeDMg PSBvcGFxdWU7Ci0gICAgaW50IGlycSA9IHBpaXgzLT5kZXYuY29uZmlnW1BJSVhfUElSUUNBICsg cGluXTsKLSAgICBQQ0lJTlR4Um91dGUgcm91dGU7Ci0KLSAgICBpZiAoaXJxIDwgUElJWF9OVU1f UElDX0lSUVMpIHsKLSAgICAgICAgcm91dGUubW9kZSA9IFBDSV9JTlRYX0VOQUJMRUQ7Ci0gICAg ICAgIHJvdXRlLmlycSA9IGlycTsKLSAgICB9IGVsc2UgewotICAgICAgICByb3V0ZS5tb2RlID0g UENJX0lOVFhfRElTQUJMRUQ7Ci0gICAgICAgIHJvdXRlLmlycSA9IC0xOwotICAgIH0KLSAgICBy ZXR1cm4gcm91dGU7Ci19Ci0KLS8qIGlycSByb3V0aW5nIGlzIGNoYW5nZWQuIHNvIHJlYnVpbGQg Yml0bWFwICovCi1zdGF0aWMgdm9pZCBwaWl4M191cGRhdGVfaXJxX2xldmVscyhQSUlYM1N0YXRl ICpwaWl4MykKLXsKLSAgICBQQ0lCdXMgKmJ1cyA9IHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KTsK LSAgICBpbnQgcGlycTsKLQotICAgIHBpaXgzLT5waWNfbGV2ZWxzID0gMDsKLSAgICBmb3IgKHBp cnEgPSAwOyBwaXJxIDwgUElJWF9OVU1fUElSUVM7IHBpcnErKykgewotICAgICAgICBwaWl4M19z ZXRfaXJxX2xldmVsKHBpaXgzLCBwaXJxLCBwY2lfYnVzX2dldF9pcnFfbGV2ZWwoYnVzLCBwaXJx KSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBwaWl4M193cml0ZV9jb25maWcoUENJRGV2aWNl ICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcywg dWludDMyX3QgdmFsLCBpbnQgbGVuKQotewotICAgIHBjaV9kZWZhdWx0X3dyaXRlX2NvbmZpZyhk ZXYsIGFkZHJlc3MsIHZhbCwgbGVuKTsKLSAgICBpZiAocmFuZ2VzX292ZXJsYXAoYWRkcmVzcywg bGVuLCBQSUlYX1BJUlFDQSwgNCkpIHsKLSAgICAgICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBQSUlY M19QQ0lfREVWSUNFKGRldik7Ci0gICAgICAgIGludCBwaWNfaXJxOwotCi0gICAgICAgIHBjaV9i dXNfZmlyZV9pbnR4X3JvdXRpbmdfbm90aWZpZXIocGNpX2dldF9idXMoJnBpaXgzLT5kZXYpKTsK LSAgICAgICAgcGlpeDNfdXBkYXRlX2lycV9sZXZlbHMocGlpeDMpOwotICAgICAgICBmb3IgKHBp Y19pcnEgPSAwOyBwaWNfaXJxIDwgUElJWF9OVU1fUElDX0lSUVM7IHBpY19pcnErKykgewotICAg ICAgICAgICAgcGlpeDNfc2V0X2lycV9waWMocGlpeDMsIHBpY19pcnEpOwotICAgICAgICB9Ci0g ICAgfQotfQotCi1zdGF0aWMgdm9pZCBwaWl4M193cml0ZV9jb25maWdfeGVuKFBDSURldmljZSAq ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3MsIHVp bnQzMl90IHZhbCwgaW50IGxlbikKLXsKLSAgICB4ZW5fcGlpeF9wY2lfd3JpdGVfY29uZmlnX2Ns aWVudChhZGRyZXNzLCB2YWwsIGxlbik7Ci0gICAgcGlpeDNfd3JpdGVfY29uZmlnKGRldiwgYWRk cmVzcywgdmFsLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBwaWl4M19yZXNldCh2b2lkICpvcGFx dWUpCi17Ci0gICAgUElJWDNTdGF0ZSAqZCA9IG9wYXF1ZTsKLSAgICB1aW50OF90ICpwY2lfY29u ZiA9IGQtPmRldi5jb25maWc7Ci0KLSAgICBwY2lfY29uZlsweDA0XSA9IDB4MDc7IC8qIG1hc3Rl ciwgbWVtb3J5IGFuZCBJL08gKi8KLSAgICBwY2lfY29uZlsweDA1XSA9IDB4MDA7Ci0gICAgcGNp X2NvbmZbMHgwNl0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4MDddID0gMHgwMjsgLyogUENJX3N0 YXR1c19kZXZzZWxfbWVkaXVtICovCi0gICAgcGNpX2NvbmZbMHg0Y10gPSAweDRkOwotICAgIHBj aV9jb25mWzB4NGVdID0gMHgwMzsKLSAgICBwY2lfY29uZlsweDRmXSA9IDB4MDA7Ci0gICAgcGNp X2NvbmZbMHg2MF0gPSAweDgwOwotICAgIHBjaV9jb25mWzB4NjFdID0gMHg4MDsKLSAgICBwY2lf Y29uZlsweDYyXSA9IDB4ODA7Ci0gICAgcGNpX2NvbmZbMHg2M10gPSAweDgwOwotICAgIHBjaV9j b25mWzB4NjldID0gMHgwMjsKLSAgICBwY2lfY29uZlsweDcwXSA9IDB4ODA7Ci0gICAgcGNpX2Nv bmZbMHg3Nl0gPSAweDBjOwotICAgIHBjaV9jb25mWzB4NzddID0gMHgwYzsKLSAgICBwY2lfY29u ZlsweDc4XSA9IDB4MDI7Ci0gICAgcGNpX2NvbmZbMHg3OV0gPSAweDAwOwotICAgIHBjaV9jb25m WzB4ODBdID0gMHgwMDsKLSAgICBwY2lfY29uZlsweDgyXSA9IDB4MDA7Ci0gICAgcGNpX2NvbmZb MHhhMF0gPSAweDA4OwotICAgIHBjaV9jb25mWzB4YTJdID0gMHgwMDsKLSAgICBwY2lfY29uZlsw eGEzXSA9IDB4MDA7Ci0gICAgcGNpX2NvbmZbMHhhNF0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4 YTVdID0gMHgwMDsKLSAgICBwY2lfY29uZlsweGE2XSA9IDB4MDA7Ci0gICAgcGNpX2NvbmZbMHhh N10gPSAweDAwOwotICAgIHBjaV9jb25mWzB4YThdID0gMHgwZjsKLSAgICBwY2lfY29uZlsweGFh XSA9IDB4MDA7Ci0gICAgcGNpX2NvbmZbMHhhYl0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4YWNd ID0gMHgwMDsKLSAgICBwY2lfY29uZlsweGFlXSA9IDB4MDA7Ci0KLSAgICBkLT5waWNfbGV2ZWxz ID0gMDsKLSAgICBkLT5yY3IgPSAwOwotfQotCi1zdGF0aWMgaW50IHBpaXgzX3Bvc3RfbG9hZCh2 b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQotewotICAgIFBJSVgzU3RhdGUgKnBpaXgzID0g b3BhcXVlOwotICAgIGludCBwaXJxOwotCi0gICAgLyogQmVjYXVzZSB0aGUgaTgyNTkgaGFzIG5v dCBiZWVuIGRlc2VyaWFsaXplZCB5ZXQsIHFlbXVfaXJxX3JhaXNlCi0gICAgICogbWlnaHQgYnJp bmcgdGhlIHN5c3RlbSB0byBhIGRpZmZlcmVudCBzdGF0ZSB0aGFuIHRoZSBzYXZlZCBvbmU7Ci0g ICAgICogZm9yIGV4YW1wbGUsIHRoZSBpbnRlcnJ1cHQgY291bGQgYmUgbWFza2VkIGJ1dCB0aGUg aTgyNTkgd291bGQKLSAgICAgKiBub3Qga25vdyB0aGF0IHlldCBhbmQgd291bGQgdHJpZ2dlciBh biBpbnRlcnJ1cHQgaW4gdGhlIENQVS4KLSAgICAgKgotICAgICAqIEhlcmUsIHdlIHVwZGF0ZSBp cnEgbGV2ZWxzIHdpdGhvdXQgcmFpc2luZyB0aGUgaW50ZXJydXB0LgotICAgICAqIEludGVycnVw dCBzdGF0ZSB3aWxsIGJlIGRlc2VyaWFsaXplZCBzZXBhcmF0ZWx5IHRocm91Z2ggdGhlIGk4MjU5 LgotICAgICAqLwotICAgIHBpaXgzLT5waWNfbGV2ZWxzID0gMDsKLSAgICBmb3IgKHBpcnEgPSAw OyBwaXJxIDwgUElJWF9OVU1fUElSUVM7IHBpcnErKykgewotICAgICAgICBwaWl4M19zZXRfaXJx X2xldmVsX2ludGVybmFsKHBpaXgzLCBwaXJxLAotICAgICAgICAgICAgcGNpX2J1c19nZXRfaXJx X2xldmVsKHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KSwgcGlycSkpOwotICAgIH0KLSAgICByZXR1 cm4gMDsKLX0KLQotc3RhdGljIGludCBwaWl4M19wcmVfc2F2ZSh2b2lkICpvcGFxdWUpCi17Ci0g ICAgaW50IGk7Ci0gICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBvcGFxdWU7Ci0KLSAgICBmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShwaWl4My0+cGNpX2lycV9sZXZlbHNfdm1zdGF0ZSk7IGkrKykg ewotICAgICAgICBwaWl4My0+cGNpX2lycV9sZXZlbHNfdm1zdGF0ZVtpXSA9Ci0gICAgICAgICAg ICBwY2lfYnVzX2dldF9pcnFfbGV2ZWwocGNpX2dldF9idXMoJnBpaXgzLT5kZXYpLCBpKTsKLSAg ICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgcGlpeDNfcmNyX25lZWRlZCh2 b2lkICpvcGFxdWUpCi17Ci0gICAgUElJWDNTdGF0ZSAqcGlpeDMgPSBvcGFxdWU7Ci0KLSAgICBy ZXR1cm4gKHBpaXgzLT5yY3IgIT0gMCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3Jp cHRpb24gdm1zdGF0ZV9waWl4M19yY3IgPSB7Ci0gICAgLm5hbWUgPSAiUElJWDMvcmNyIiwKLSAg ICAudmVyc2lvbl9pZCA9IDEsCi0gICAgLm1pbmltdW1fdmVyc2lvbl9pZCA9IDEsCi0gICAgLm5l ZWRlZCA9IHBpaXgzX3Jjcl9uZWVkZWQsCi0gICAgLmZpZWxkcyA9IChWTVN0YXRlRmllbGRbXSkg ewotICAgICAgICBWTVNUQVRFX1VJTlQ4KHJjciwgUElJWDNTdGF0ZSksCi0gICAgICAgIFZNU1RB VEVfRU5EX09GX0xJU1QoKQotICAgIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBWTVN0YXRlRGVzY3Jp cHRpb24gdm1zdGF0ZV9waWl4MyA9IHsKLSAgICAubmFtZSA9ICJQSUlYMyIsCi0gICAgLnZlcnNp b25faWQgPSAzLAotICAgIC5taW5pbXVtX3ZlcnNpb25faWQgPSAyLAotICAgIC5wb3N0X2xvYWQg PSBwaWl4M19wb3N0X2xvYWQsCi0gICAgLnByZV9zYXZlID0gcGlpeDNfcHJlX3NhdmUsCi0gICAg LmZpZWxkcyA9IChWTVN0YXRlRmllbGRbXSkgewotICAgICAgICBWTVNUQVRFX1BDSV9ERVZJQ0Uo ZGV2LCBQSUlYM1N0YXRlKSwKLSAgICAgICAgVk1TVEFURV9JTlQzMl9BUlJBWV9WKHBjaV9pcnFf bGV2ZWxzX3Ztc3RhdGUsIFBJSVgzU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBQSUlYX05VTV9QSVJRUywgMyksCi0gICAgICAgIFZNU1RBVEVfRU5EX09GX0xJU1QoKQotICAg IH0sCi0gICAgLnN1YnNlY3Rpb25zID0gKGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbipbXSkgewot ICAgICAgICAmdm1zdGF0ZV9waWl4M19yY3IsCi0gICAgICAgIE5VTEwKLSAgICB9Ci19OwotCi0K LXN0YXRpYyB2b2lkIHJjcl93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50NjRf dCB2YWwsIHVuc2lnbmVkIGxlbikKLXsKLSAgICBQSUlYM1N0YXRlICpkID0gb3BhcXVlOwotCi0g ICAgaWYgKHZhbCAmIDQpIHsKLSAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdChTSFVU RE9XTl9DQVVTRV9HVUVTVF9SRVNFVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZC0+ cmNyID0gdmFsICYgMjsgLyoga2VlcCBTeXN0ZW0gUmVzZXQgdHlwZSBvbmx5ICovCi19Ci0KLXN0 YXRpYyB1aW50NjRfdCByY3JfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1bnNpZ25l ZCBsZW4pCi17Ci0gICAgUElJWDNTdGF0ZSAqZCA9IG9wYXF1ZTsKLQotICAgIHJldHVybiBkLT5y Y3I7Ci19Ci0KLXN0YXRpYyBjb25zdCBNZW1vcnlSZWdpb25PcHMgcmNyX29wcyA9IHsKLSAgICAu cmVhZCA9IHJjcl9yZWFkLAotICAgIC53cml0ZSA9IHJjcl93cml0ZSwKLSAgICAuZW5kaWFubmVz cyA9IERFVklDRV9MSVRUTEVfRU5ESUFOCi19OwotCi1zdGF0aWMgdm9pZCBwaWl4M19yZWFsaXpl KFBDSURldmljZSAqZGV2LCBFcnJvciAqKmVycnApCi17Ci0gICAgUElJWDNTdGF0ZSAqZCA9IFBJ SVgzX1BDSV9ERVZJQ0UoZGV2KTsKLQotICAgIGlmICghaXNhX2J1c19uZXcoREVWSUNFKGQpLCBn ZXRfc3lzdGVtX21lbW9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgcGNpX2FkZHJlc3Nfc3Bh Y2VfaW8oZGV2KSwgZXJycCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbW9y eV9yZWdpb25faW5pdF9pbygmZC0+cmNyX21lbSwgT0JKRUNUKGRldiksICZyY3Jfb3BzLCBkLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAicGlpeDMtcmVzZXQtY29udHJvbCIsIDEpOwotICAg IG1lbW9yeV9yZWdpb25fYWRkX3N1YnJlZ2lvbl9vdmVybGFwKHBjaV9hZGRyZXNzX3NwYWNlX2lv KGRldiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElJWF9SQ1Jf SU9QT1JULCAmZC0+cmNyX21lbSwgMSk7Ci0KLSAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KHBpaXgz X3Jlc2V0LCBkKTsKLX0KLQotc3RhdGljIHZvaWQgcGNpX3BpaXgzX2NsYXNzX2luaXQoT2JqZWN0 Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQotewotICAgIERldmljZUNsYXNzICpkYyA9IERFVklD RV9DTEFTUyhrbGFzcyk7Ci0gICAgUENJRGV2aWNlQ2xhc3MgKmsgPSBQQ0lfREVWSUNFX0NMQVNT KGtsYXNzKTsKLQotICAgIGRjLT5kZXNjICAgICAgICA9ICJJU0EgYnJpZGdlIjsKLSAgICBkYy0+ dm1zZCAgICAgICAgPSAmdm1zdGF0ZV9waWl4MzsKLSAgICBkYy0+aG90cGx1Z2dhYmxlICAgPSBm YWxzZTsKLSAgICBrLT5yZWFsaXplICAgICAgPSBwaWl4M19yZWFsaXplOwotICAgIGstPnZlbmRv cl9pZCAgICA9IFBDSV9WRU5ET1JfSURfSU5URUw7Ci0gICAgLyogODIzNzFTQiBQSUlYMyBQQ0kt dG8tSVNBIGJyaWRnZSAoU3RlcCBBMSkgKi8KLSAgICBrLT5kZXZpY2VfaWQgICAgPSBQQ0lfREVW SUNFX0lEX0lOVEVMXzgyMzcxU0JfMDsKLSAgICBrLT5jbGFzc19pZCAgICAgPSBQQ0lfQ0xBU1Nf QlJJREdFX0lTQTsKLSAgICAvKgotICAgICAqIFJlYXNvbjogcGFydCBvZiBQSUlYMyBzb3V0aGJy aWRnZSwgbmVlZHMgdG8gYmUgd2lyZWQgdXAgYnkKLSAgICAgKiBwY19waWl4LmMncyBwY19pbml0 MSgpCi0gICAgICovCi0gICAgZGMtPnVzZXJfY3JlYXRhYmxlID0gZmFsc2U7Ci19Ci0KLXN0YXRp YyBjb25zdCBUeXBlSW5mbyBwaWl4M19wY2lfdHlwZV9pbmZvID0gewotICAgIC5uYW1lID0gVFlQ RV9QSUlYM19QQ0lfREVWSUNFLAotICAgIC5wYXJlbnQgPSBUWVBFX1BDSV9ERVZJQ0UsCi0gICAg Lmluc3RhbmNlX3NpemUgPSBzaXplb2YoUElJWDNTdGF0ZSksCi0gICAgLmFic3RyYWN0ID0gdHJ1 ZSwKLSAgICAuY2xhc3NfaW5pdCA9IHBjaV9waWl4M19jbGFzc19pbml0LAotICAgIC5pbnRlcmZh Y2VzID0gKEludGVyZmFjZUluZm9bXSkgewotICAgICAgICB7IElOVEVSRkFDRV9DT05WRU5USU9O QUxfUENJX0RFVklDRSB9LAotICAgICAgICB7IH0sCi0gICAgfSwKLX07Ci0KLXN0YXRpYyB2b2lk IHBpaXgzX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQotewotICAg IFBDSURldmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7Ci0KLSAgICBrLT5j b25maWdfd3JpdGUgPSBwaWl4M193cml0ZV9jb25maWc7Ci19Ci0KLXN0YXRpYyBjb25zdCBUeXBl SW5mbyBwaWl4M19pbmZvID0gewotICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9QSUlYM19ERVZJ Q0UsCi0gICAgLnBhcmVudCAgICAgICAgPSBUWVBFX1BJSVgzX1BDSV9ERVZJQ0UsCi0gICAgLmNs YXNzX2luaXQgICAgPSBwaWl4M19jbGFzc19pbml0LAotfTsKLQotc3RhdGljIHZvaWQgcGlpeDNf eGVuX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQotewotICAgIFBD SURldmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7Ci0KLSAgICBrLT5jb25m aWdfd3JpdGUgPSBwaWl4M193cml0ZV9jb25maWdfeGVuOwotfTsKLQotc3RhdGljIGNvbnN0IFR5 cGVJbmZvIHBpaXgzX3hlbl9pbmZvID0gewotICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9QSUlY M19YRU5fREVWSUNFLAotICAgIC5wYXJlbnQgICAgICAgID0gVFlQRV9QSUlYM19QQ0lfREVWSUNF LAotICAgIC5jbGFzc19pbml0ICAgID0gcGlpeDNfeGVuX2NsYXNzX2luaXQsCi19OwotCiBzdGF0 aWMgdm9pZCBpNDQwZnhfY2xhc3NfaW5pdChPYmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKmRhdGEp CiB7CiAgICAgRGV2aWNlQ2xhc3MgKmRjID0gREVWSUNFX0NMQVNTKGtsYXNzKTsKQEAgLTkyMiw5 ICs1MjMsNiBAQCBzdGF0aWMgdm9pZCBpNDQwZnhfcmVnaXN0ZXJfdHlwZXModm9pZCkKIHsKICAg ICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmaTQ0MGZ4X2luZm8pOwogICAgIHR5cGVfcmVnaXN0ZXJf c3RhdGljKCZpZ2RfcGFzc3Rocm91Z2hfaTQ0MGZ4X2luZm8pOwotICAgIHR5cGVfcmVnaXN0ZXJf c3RhdGljKCZwaWl4M19wY2lfdHlwZV9pbmZvKTsKLSAgICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygm cGlpeDNfaW5mbyk7Ci0gICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJnBpaXgzX3hlbl9pbmZvKTsK ICAgICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmaTQ0MGZ4X3BjaWhvc3RfaW5mbyk7CiB9CiAKZGlm ZiAtLWdpdCBhL2luY2x1ZGUvaHcvc291dGhicmlkZ2UvcGlpeC5oIGIvaW5jbHVkZS9ody9zb3V0 aGJyaWRnZS9waWl4LmgKaW5kZXggMDk0NTA4YjkyOC4uMTUyNjI4YzZkOSAxMDA2NDQKLS0tIGEv aW5jbHVkZS9ody9zb3V0aGJyaWRnZS9waWl4LmgKKysrIGIvaW5jbHVkZS9ody9zb3V0aGJyaWRn ZS9waWl4LmgKQEAgLTEyLDYgKzEyLDggQEAKICNpZm5kZWYgSFdfU09VVEhCUklER0VfUElJWF9I CiAjZGVmaW5lIEhXX1NPVVRIQlJJREdFX1BJSVhfSAogCisjaW5jbHVkZSAiaHcvcGNpL3BjaS5o IgorCiAjZGVmaW5lIFRZUEVfUElJWDRfUE0gIlBJSVg0X1BNIgogCiBJMkNCdXMgKnBpaXg0X3Bt X2luaXQoUENJQnVzICpidXMsIGludCBkZXZmbiwgdWludDMyX3Qgc21iX2lvX2Jhc2UsCkBAIC0z MCw4ICszMiw0MiBAQCBJMkNCdXMgKnBpaXg0X3BtX2luaXQoUENJQnVzICpidXMsIGludCBkZXZm biwgdWludDMyX3Qgc21iX2lvX2Jhc2UsCiAgKi8KICNkZWZpbmUgUElJWF9SQ1JfSU9QT1JUIDB4 Y2Y5CiAKKyNkZWZpbmUgUElJWF9OVU1fUElDX0lSUVMgICAgICAgMTYgICAgICAvKiBpODI1OSAq IDIgKi8KKyNkZWZpbmUgUElJWF9OVU1fUElSUVMgICAgICAgICAgNFVMTCAgICAvKiBQSVJRW0Et RF0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgUElJWFN0YXRlIHsKKyAgICBQQ0lEZXZpY2UgZGV2Owor CisgICAgLyoKKyAgICAgKiBiaXRtYXAgdG8gdHJhY2sgcGljIGxldmVscy4KKyAgICAgKiBUaGUg cGljIGxldmVsIGlzIHRoZSBsb2dpY2FsIE9SIG9mIGFsbCB0aGUgUENJIGlycXMgbWFwcGVkIHRv IGl0CisgICAgICogU28gb25lIFBJQyBsZXZlbCBpcyB0cmFja2VkIGJ5IFBJSVhfTlVNX1BJUlFT IGJpdHMuCisgICAgICoKKyAgICAgKiBQSVJRIGlzIG1hcHBlZCB0byBQSUMgcGlucywgd2UgdHJh Y2sgaXQgYnkKKyAgICAgKiBQSUlYX05VTV9QSVJRUyAqIFBJSVhfTlVNX1BJQ19JUlFTID0gNjQg Yml0cyB3aXRoCisgICAgICogcGljX2lycSAqIFBJSVhfTlVNX1BJUlFTICsgcGlycQorICAgICAq LworI2lmIFBJSVhfTlVNX1BJQ19JUlFTICogUElJWF9OVU1fUElSUVMgPiA2NAorI2Vycm9yICJ1 bmFibGUgdG8gZW5jb2RlIHBpYyBzdGF0ZSBpbiA2NGJpdCBpbiBwaWNfbGV2ZWxzLiIKKyNlbmRp ZgorICAgIHVpbnQ2NF90IHBpY19sZXZlbHM7CisKKyAgICBxZW11X2lycSAqcGljOworCisgICAg LyogVGhpcyBtZW1iZXIgaXNuJ3QgdXNlZC4gSnVzdCBmb3Igc2F2ZS9sb2FkIGNvbXBhdGliaWxp dHkgKi8KKyAgICBpbnQzMl90IHBjaV9pcnFfbGV2ZWxzX3Ztc3RhdGVbUElJWF9OVU1fUElSUVNd OworCisgICAgLyogUmVzZXQgQ29udHJvbCBSZWdpc3RlciBjb250ZW50cyAqLworICAgIHVpbnQ4 X3QgcmNyOworCisgICAgLyogSU8gbWVtb3J5IHJlZ2lvbiBmb3IgUmVzZXQgQ29udHJvbCBSZWdp c3RlciAoUElJWF9SQ1JfSU9QT1JUKSAqLworICAgIE1lbW9yeVJlZ2lvbiByY3JfbWVtOworfSBQ SUlYM1N0YXRlOworCiBleHRlcm4gUENJRGV2aWNlICpwaWl4NF9kZXY7CiAKK1BJSVgzU3RhdGUg KnBpaXgzX2NyZWF0ZShQQ0lCdXMgKnBjaV9idXMsIElTQUJ1cyAqKmlzYV9idXMpOworCiBEZXZp Y2VTdGF0ZSAqcGlpeDRfY3JlYXRlKFBDSUJ1cyAqcGNpX2J1cywgSVNBQnVzICoqaXNhX2J1cywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDQnVzICoqc21idXMsIHNpemVfdCBpZGVfYnVz ZXMpOwogCi0tIAoyLjIxLjAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9q ZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVu LWRldmVs 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 X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD38FCA9EA1 for ; Fri, 18 Oct 2019 14:04:29 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 A4ED021925 for ; Fri, 18 Oct 2019 14:04:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A4ED021925 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:40534 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iLSrk-00046Z-6e for qemu-devel@archiver.kernel.org; Fri, 18 Oct 2019 10:04:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:55409) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iLSfA-0006w9-TB for qemu-devel@nongnu.org; Fri, 18 Oct 2019 09:51:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iLSf7-00072Z-9W for qemu-devel@nongnu.org; Fri, 18 Oct 2019 09:51:28 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59490) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iLSf6-00071a-Pi for qemu-devel@nongnu.org; Fri, 18 Oct 2019 09:51:25 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24C753090FEE; Fri, 18 Oct 2019 13:51:23 +0000 (UTC) Received: from x1w.redhat.com (unknown [10.40.205.74]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 434FB60BF1; Fri, 18 Oct 2019 13:51:11 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v2 18/20] hw/pci-host/piix: Extract PIIX3 functions to hw/isa/piix3.c Date: Fri, 18 Oct 2019 15:47:52 +0200 Message-Id: <20191018134754.16362-19-philmd@redhat.com> In-Reply-To: <20191018134754.16362-1-philmd@redhat.com> References: <20191018134754.16362-1-philmd@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Fri, 18 Oct 2019 13:51:23 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , "Michael S. Tsirkin" , Paul Durrant , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Paolo Bonzini , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , Aleksandar Markovic , Igor Mammedov , Anthony Perard , xen-devel@lists.xenproject.org, Aleksandar Rikalo , Richard Henderson , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , Eduardo Habkost Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Philippe Mathieu-Daud=C3=A9 Move all the PIIX3 functions to a new file: hw/isa/piix3.c. Reviewed-by: Aleksandar Markovic Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- Checkpatch warning: ERROR: spaces required around that '*' (ctx:VxV) #312: FILE: hw/isa/piix3.c:248: + .subsections =3D (const VMStateDescription*[]) { ^ --- MAINTAINERS | 1 + hw/i386/Kconfig | 1 + hw/isa/Kconfig | 4 + hw/isa/Makefile.objs | 1 + hw/isa/piix3.c | 399 +++++++++++++++++++++++++++++++++ hw/pci-host/Kconfig | 1 - hw/pci-host/piix.c | 402 ---------------------------------- include/hw/southbridge/piix.h | 36 +++ 8 files changed, 442 insertions(+), 403 deletions(-) create mode 100644 hw/isa/piix3.c diff --git a/MAINTAINERS b/MAINTAINERS index adf059a164..4845f47d93 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1231,6 +1231,7 @@ F: hw/pci-host/pam.c F: include/hw/pci-host/i440fx.h F: include/hw/pci-host/q35.h F: include/hw/pci-host/pam.h +F: hw/isa/piix3.c F: hw/isa/lpc_ich9.c F: hw/i2c/smbus_ich9.c F: hw/acpi/piix4.c diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig index c5c9d4900e..589d75e26a 100644 --- a/hw/i386/Kconfig +++ b/hw/i386/Kconfig @@ -61,6 +61,7 @@ config I440FX select PC_ACPI select ACPI_SMBUS select PCI_PIIX + select PIIX3 select IDE_PIIX select DIMM select SMBIOS diff --git a/hw/isa/Kconfig b/hw/isa/Kconfig index 98a289957e..8a38813cc1 100644 --- a/hw/isa/Kconfig +++ b/hw/isa/Kconfig @@ -29,6 +29,10 @@ config PC87312 select FDC select IDE_ISA =20 +config PIIX3 + bool + select ISA_BUS + config PIIX4 bool # For historical reasons, SuperIO devices are created in the board diff --git a/hw/isa/Makefile.objs b/hw/isa/Makefile.objs index ff97485504..8e73960a75 100644 --- a/hw/isa/Makefile.objs +++ b/hw/isa/Makefile.objs @@ -3,6 +3,7 @@ common-obj-$(CONFIG_ISA_SUPERIO) +=3D isa-superio.o common-obj-$(CONFIG_APM) +=3D apm.o common-obj-$(CONFIG_I82378) +=3D i82378.o common-obj-$(CONFIG_PC87312) +=3D pc87312.o +common-obj-$(CONFIG_PIIX3) +=3D piix3.o common-obj-$(CONFIG_PIIX4) +=3D piix4.o common-obj-$(CONFIG_VT82C686) +=3D vt82c686.o common-obj-$(CONFIG_SMC37C669) +=3D smc37c669-superio.o diff --git a/hw/isa/piix3.c b/hw/isa/piix3.c new file mode 100644 index 0000000000..fd1c78879f --- /dev/null +++ b/hw/isa/piix3.c @@ -0,0 +1,399 @@ +/* + * QEMU PIIX PCI ISA Bridge Emulation + * + * Copyright (c) 2006 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining= a copy + * of this software and associated documentation files (the "Software"),= to deal + * in the Software without restriction, including without limitation the= rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or = sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be includ= ed in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRE= SS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILI= TY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHA= LL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR = OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISI= NG FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING= S IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" +#include "qemu/range.h" +#include "hw/southbridge/piix.h" +#include "hw/irq.h" +#include "hw/isa/isa.h" +#include "hw/xen/xen.h" +#include "sysemu/sysemu.h" +#include "sysemu/reset.h" +#include "sysemu/runstate.h" +#include "migration/vmstate.h" + +#define XEN_PIIX_NUM_PIRQS 128ULL + +#define TYPE_PIIX3_PCI_DEVICE "pci-piix3" +#define PIIX3_PCI_DEVICE(obj) \ + OBJECT_CHECK(PIIX3State, (obj), TYPE_PIIX3_PCI_DEVICE) + +#define TYPE_PIIX3_DEVICE "PIIX3" +#define TYPE_PIIX3_XEN_DEVICE "PIIX3-xen" + +static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq) +{ + qemu_set_irq(piix3->pic[pic_irq], + !!(piix3->pic_levels & + (((1ULL << PIIX_NUM_PIRQS) - 1) << + (pic_irq * PIIX_NUM_PIRQS)))); +} + +static void piix3_set_irq_level_internal(PIIX3State *piix3, int pirq, in= t level) +{ + int pic_irq; + uint64_t mask; + + pic_irq =3D piix3->dev.config[PIIX_PIRQCA + pirq]; + if (pic_irq >=3D PIIX_NUM_PIC_IRQS) { + return; + } + + mask =3D 1ULL << ((pic_irq * PIIX_NUM_PIRQS) + pirq); + piix3->pic_levels &=3D ~mask; + piix3->pic_levels |=3D mask * !!level; +} + +static void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level) +{ + int pic_irq; + + pic_irq =3D piix3->dev.config[PIIX_PIRQCA + pirq]; + if (pic_irq >=3D PIIX_NUM_PIC_IRQS) { + return; + } + + piix3_set_irq_level_internal(piix3, pirq, level); + + piix3_set_irq_pic(piix3, pic_irq); +} + +static void piix3_set_irq(void *opaque, int pirq, int level) +{ + PIIX3State *piix3 =3D opaque; + piix3_set_irq_level(piix3, pirq, level); +} + +static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin) +{ + PIIX3State *piix3 =3D opaque; + int irq =3D piix3->dev.config[PIIX_PIRQCA + pin]; + PCIINTxRoute route; + + if (irq < PIIX_NUM_PIC_IRQS) { + route.mode =3D PCI_INTX_ENABLED; + route.irq =3D irq; + } else { + route.mode =3D PCI_INTX_DISABLED; + route.irq =3D -1; + } + return route; +} + +/* irq routing is changed. so rebuild bitmap */ +static void piix3_update_irq_levels(PIIX3State *piix3) +{ + PCIBus *bus =3D pci_get_bus(&piix3->dev); + int pirq; + + piix3->pic_levels =3D 0; + for (pirq =3D 0; pirq < PIIX_NUM_PIRQS; pirq++) { + piix3_set_irq_level(piix3, pirq, pci_bus_get_irq_level(bus, pirq= )); + } +} + +static void piix3_write_config(PCIDevice *dev, + uint32_t address, uint32_t val, int len) +{ + pci_default_write_config(dev, address, val, len); + if (ranges_overlap(address, len, PIIX_PIRQCA, 4)) { + PIIX3State *piix3 =3D PIIX3_PCI_DEVICE(dev); + int pic_irq; + + pci_bus_fire_intx_routing_notifier(pci_get_bus(&piix3->dev)); + piix3_update_irq_levels(piix3); + for (pic_irq =3D 0; pic_irq < PIIX_NUM_PIC_IRQS; pic_irq++) { + piix3_set_irq_pic(piix3, pic_irq); + } + } +} + +static void piix3_write_config_xen(PCIDevice *dev, + uint32_t address, uint32_t val, int l= en) +{ + xen_piix_pci_write_config_client(address, val, len); + piix3_write_config(dev, address, val, len); +} + +static void piix3_reset(void *opaque) +{ + PIIX3State *d =3D opaque; + uint8_t *pci_conf =3D d->dev.config; + + pci_conf[0x04] =3D 0x07; /* master, memory and I/O */ + pci_conf[0x05] =3D 0x00; + pci_conf[0x06] =3D 0x00; + pci_conf[0x07] =3D 0x02; /* PCI_status_devsel_medium */ + pci_conf[0x4c] =3D 0x4d; + pci_conf[0x4e] =3D 0x03; + pci_conf[0x4f] =3D 0x00; + pci_conf[0x60] =3D 0x80; + pci_conf[0x61] =3D 0x80; + pci_conf[0x62] =3D 0x80; + pci_conf[0x63] =3D 0x80; + pci_conf[0x69] =3D 0x02; + pci_conf[0x70] =3D 0x80; + pci_conf[0x76] =3D 0x0c; + pci_conf[0x77] =3D 0x0c; + pci_conf[0x78] =3D 0x02; + pci_conf[0x79] =3D 0x00; + pci_conf[0x80] =3D 0x00; + pci_conf[0x82] =3D 0x00; + pci_conf[0xa0] =3D 0x08; + pci_conf[0xa2] =3D 0x00; + pci_conf[0xa3] =3D 0x00; + pci_conf[0xa4] =3D 0x00; + pci_conf[0xa5] =3D 0x00; + pci_conf[0xa6] =3D 0x00; + pci_conf[0xa7] =3D 0x00; + pci_conf[0xa8] =3D 0x0f; + pci_conf[0xaa] =3D 0x00; + pci_conf[0xab] =3D 0x00; + pci_conf[0xac] =3D 0x00; + pci_conf[0xae] =3D 0x00; + + d->pic_levels =3D 0; + d->rcr =3D 0; +} + +static int piix3_post_load(void *opaque, int version_id) +{ + PIIX3State *piix3 =3D opaque; + int pirq; + + /* + * Because the i8259 has not been deserialized yet, qemu_irq_raise + * might bring the system to a different state than the saved one; + * for example, the interrupt could be masked but the i8259 would + * not know that yet and would trigger an interrupt in the CPU. + * + * Here, we update irq levels without raising the interrupt. + * Interrupt state will be deserialized separately through the i8259= . + */ + piix3->pic_levels =3D 0; + for (pirq =3D 0; pirq < PIIX_NUM_PIRQS; pirq++) { + piix3_set_irq_level_internal(piix3, pirq, + pci_bus_get_irq_level(pci_get_bus(&piix3->dev), pirq)); + } + return 0; +} + +static int piix3_pre_save(void *opaque) +{ + int i; + PIIX3State *piix3 =3D opaque; + + for (i =3D 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) { + piix3->pci_irq_levels_vmstate[i] =3D + pci_bus_get_irq_level(pci_get_bus(&piix3->dev), i); + } + + return 0; +} + +static bool piix3_rcr_needed(void *opaque) +{ + PIIX3State *piix3 =3D opaque; + + return (piix3->rcr !=3D 0); +} + +static const VMStateDescription vmstate_piix3_rcr =3D { + .name =3D "PIIX3/rcr", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D piix3_rcr_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT8(rcr, PIIX3State), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_piix3 =3D { + .name =3D "PIIX3", + .version_id =3D 3, + .minimum_version_id =3D 2, + .post_load =3D piix3_post_load, + .pre_save =3D piix3_pre_save, + .fields =3D (VMStateField[]) { + VMSTATE_PCI_DEVICE(dev, PIIX3State), + VMSTATE_INT32_ARRAY_V(pci_irq_levels_vmstate, PIIX3State, + PIIX_NUM_PIRQS, 3), + VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription*[]) { + &vmstate_piix3_rcr, + NULL + } +}; + + +static void rcr_write(void *opaque, hwaddr addr, uint64_t val, unsigned = len) +{ + PIIX3State *d =3D opaque; + + if (val & 4) { + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + return; + } + d->rcr =3D val & 2; /* keep System Reset type only */ +} + +static uint64_t rcr_read(void *opaque, hwaddr addr, unsigned len) +{ + PIIX3State *d =3D opaque; + + return d->rcr; +} + +static const MemoryRegionOps rcr_ops =3D { + .read =3D rcr_read, + .write =3D rcr_write, + .endianness =3D DEVICE_LITTLE_ENDIAN +}; + +static void piix3_realize(PCIDevice *dev, Error **errp) +{ + PIIX3State *d =3D PIIX3_PCI_DEVICE(dev); + + if (!isa_bus_new(DEVICE(d), get_system_memory(), + pci_address_space_io(dev), errp)) { + return; + } + + memory_region_init_io(&d->rcr_mem, OBJECT(dev), &rcr_ops, d, + "piix3-reset-control", 1); + memory_region_add_subregion_overlap(pci_address_space_io(dev), + PIIX_RCR_IOPORT, &d->rcr_mem, 1)= ; + + qemu_register_reset(piix3_reset, d); +} + +static void pci_piix3_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + + dc->desc =3D "ISA bridge"; + dc->vmsd =3D &vmstate_piix3; + dc->hotpluggable =3D false; + k->realize =3D piix3_realize; + k->vendor_id =3D PCI_VENDOR_ID_INTEL; + /* 82371SB PIIX3 PCI-to-ISA bridge (Step A1) */ + k->device_id =3D PCI_DEVICE_ID_INTEL_82371SB_0; + k->class_id =3D PCI_CLASS_BRIDGE_ISA; + /* + * Reason: part of PIIX3 southbridge, needs to be wired up by + * pc_piix.c's pc_init1() + */ + dc->user_creatable =3D false; +} + +static const TypeInfo piix3_pci_type_info =3D { + .name =3D TYPE_PIIX3_PCI_DEVICE, + .parent =3D TYPE_PCI_DEVICE, + .instance_size =3D sizeof(PIIX3State), + .abstract =3D true, + .class_init =3D pci_piix3_class_init, + .interfaces =3D (InterfaceInfo[]) { + { INTERFACE_CONVENTIONAL_PCI_DEVICE }, + { }, + }, +}; + +static void piix3_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + + k->config_write =3D piix3_write_config; +} + +static const TypeInfo piix3_info =3D { + .name =3D TYPE_PIIX3_DEVICE, + .parent =3D TYPE_PIIX3_PCI_DEVICE, + .class_init =3D piix3_class_init, +}; + +static void piix3_xen_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); + + k->config_write =3D piix3_write_config_xen; +}; + +static const TypeInfo piix3_xen_info =3D { + .name =3D TYPE_PIIX3_XEN_DEVICE, + .parent =3D TYPE_PIIX3_PCI_DEVICE, + .class_init =3D piix3_xen_class_init, +}; + +static void piix3_register_types(void) +{ + type_register_static(&piix3_pci_type_info); + type_register_static(&piix3_info); + type_register_static(&piix3_xen_info); +} + +type_init(piix3_register_types) + +/* + * Return the global irq number corresponding to a given device irq + * pin. We could also use the bus number to have a more precise mapping. + */ +static int pci_slot_get_pirq(PCIDevice *pci_dev, int pci_intx) +{ + int slot_addend; + slot_addend =3D (pci_dev->devfn >> 3) - 1; + return (pci_intx + slot_addend) & 3; +} + +PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus) +{ + PIIX3State *piix3; + PCIDevice *pci_dev; + + /* + * Xen supports additional interrupt routes from the PCI devices to + * the IOAPIC: the four pins of each PCI device on the bus are also + * connected to the IOAPIC directly. + * These additional routes can be discovered through ACPI. + */ + if (xen_enabled()) { + pci_dev =3D pci_create_simple_multifunction(pci_bus, -1, true, + TYPE_PIIX3_XEN_DEVICE)= ; + piix3 =3D PIIX3_PCI_DEVICE(pci_dev); + pci_bus_irqs(pci_bus, xen_piix3_set_irq, xen_pci_slot_get_pirq, + piix3, XEN_PIIX_NUM_PIRQS); + } else { + pci_dev =3D pci_create_simple_multifunction(pci_bus, -1, true, + TYPE_PIIX3_DEVICE); + piix3 =3D PIIX3_PCI_DEVICE(pci_dev); + pci_bus_irqs(pci_bus, piix3_set_irq, pci_slot_get_pirq, + piix3, PIIX_NUM_PIRQS); + pci_bus_set_route_irq_fn(pci_bus, piix3_route_intx_pin_to_irq); + } + *isa_bus =3D ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0")); + + return piix3; +} diff --git a/hw/pci-host/Kconfig b/hw/pci-host/Kconfig index 1edc1a31d4..397043b289 100644 --- a/hw/pci-host/Kconfig +++ b/hw/pci-host/Kconfig @@ -32,7 +32,6 @@ config PCI_PIIX bool select PCI select PAM - select ISA_BUS =20 config PCI_EXPRESS_Q35 bool diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index 1544c4726b..79ecd58a2b 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -24,22 +24,15 @@ =20 #include "qemu/osdep.h" #include "hw/i386/pc.h" -#include "hw/irq.h" #include "hw/pci/pci.h" #include "hw/pci/pci_host.h" #include "hw/pci-host/i440fx.h" #include "hw/southbridge/piix.h" #include "hw/qdev-properties.h" -#include "hw/isa/isa.h" #include "hw/sysbus.h" #include "qapi/error.h" -#include "qemu/range.h" -#include "hw/xen/xen.h" #include "migration/vmstate.h" #include "hw/pci-host/pam.h" -#include "sysemu/reset.h" -#include "sysemu/runstate.h" -#include "hw/i386/ioapic.h" #include "qapi/visitor.h" #include "qemu/error-report.h" =20 @@ -59,49 +52,9 @@ typedef struct I440FXState { uint32_t short_root_bus; } I440FXState; =20 -#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */ -#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */ -#define XEN_PIIX_NUM_PIRQS 128ULL - -typedef struct PIIX3State { - PCIDevice dev; - - /* - * bitmap to track pic levels. - * The pic level is the logical OR of all the PCI irqs mapped to it - * So one PIC level is tracked by PIIX_NUM_PIRQS bits. - * - * PIRQ is mapped to PIC pins, we track it by - * PIIX_NUM_PIRQS * PIIX_NUM_PIC_IRQS =3D 64 bits with - * pic_irq * PIIX_NUM_PIRQS + pirq - */ -#if PIIX_NUM_PIC_IRQS * PIIX_NUM_PIRQS > 64 -#error "unable to encode pic state in 64bit in pic_levels." -#endif - uint64_t pic_levels; - - qemu_irq *pic; - - /* This member isn't used. Just for save/load compatibility */ - int32_t pci_irq_levels_vmstate[PIIX_NUM_PIRQS]; - - /* Reset Control Register contents */ - uint8_t rcr; - - /* IO memory region for Reset Control Register (PIIX_RCR_IOPORT) */ - MemoryRegion rcr_mem; -} PIIX3State; - -#define TYPE_PIIX3_PCI_DEVICE "pci-piix3" -#define PIIX3_PCI_DEVICE(obj) \ - OBJECT_CHECK(PIIX3State, (obj), TYPE_PIIX3_PCI_DEVICE) - #define I440FX_PCI_DEVICE(obj) \ OBJECT_CHECK(PCII440FXState, (obj), TYPE_I440FX_PCI_DEVICE) =20 -#define TYPE_PIIX3_DEVICE "PIIX3" -#define TYPE_PIIX3_XEN_DEVICE "PIIX3-xen" - struct PCII440FXState { /*< private >*/ PCIDevice parent_obj; @@ -128,22 +81,6 @@ struct PCII440FXState { */ #define I440FX_COREBOOT_RAM_SIZE 0x57 =20 -static void piix3_set_irq(void *opaque, int pirq, int level); -static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pci_in= tx); -static void piix3_write_config_xen(PCIDevice *dev, - uint32_t address, uint32_t val, int len); - -/* - * Return the global irq number corresponding to a given device irq - * pin. We could also use the bus number to have a more precise mapping. - */ -static int pci_slot_get_pirq(PCIDevice *pci_dev, int pci_intx) -{ - int slot_addend; - slot_addend =3D (pci_dev->devfn >> 3) - 1; - return (pci_intx + slot_addend) & 3; -} - static void i440fx_update_memory_mappings(PCII440FXState *d) { int i; @@ -333,36 +270,6 @@ static void i440fx_realize(PCIDevice *dev, Error **e= rrp) } } =20 -static PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus) -{ - PIIX3State *piix3; - PCIDevice *pci_dev; - - /* - * Xen supports additional interrupt routes from the PCI devices to - * the IOAPIC: the four pins of each PCI device on the bus are also - * connected to the IOAPIC directly. - * These additional routes can be discovered through ACPI. - */ - if (xen_enabled()) { - pci_dev =3D pci_create_simple_multifunction(pci_bus, -1, true, - TYPE_PIIX3_XEN_DEVICE)= ; - piix3 =3D PIIX3_PCI_DEVICE(pci_dev); - pci_bus_irqs(pci_bus, xen_piix3_set_irq, xen_pci_slot_get_pirq, - piix3, XEN_PIIX_NUM_PIRQS); - } else { - pci_dev =3D pci_create_simple_multifunction(pci_bus, -1, true, - TYPE_PIIX3_DEVICE); - piix3 =3D PIIX3_PCI_DEVICE(pci_dev); - pci_bus_irqs(pci_bus, piix3_set_irq, pci_slot_get_pirq, - piix3, PIIX_NUM_PIRQS); - pci_bus_set_route_irq_fn(pci_bus, piix3_route_intx_pin_to_irq); - } - *isa_bus =3D ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0")); - - return piix3; -} - PCIBus *i440fx_init(const char *host_type, const char *pci_type, PCII440FXState **pi440fx_state, int *piix3_devfn, @@ -455,312 +362,6 @@ PCIBus *find_i440fx(void) return s ? s->bus : NULL; } =20 -/* PIIX3 PCI to ISA bridge */ -static void piix3_set_irq_pic(PIIX3State *piix3, int pic_irq) -{ - qemu_set_irq(piix3->pic[pic_irq], - !!(piix3->pic_levels & - (((1ULL << PIIX_NUM_PIRQS) - 1) << - (pic_irq * PIIX_NUM_PIRQS)))); -} - -static void piix3_set_irq_level_internal(PIIX3State *piix3, int pirq, in= t level) -{ - int pic_irq; - uint64_t mask; - - pic_irq =3D piix3->dev.config[PIIX_PIRQCA + pirq]; - if (pic_irq >=3D PIIX_NUM_PIC_IRQS) { - return; - } - - mask =3D 1ULL << ((pic_irq * PIIX_NUM_PIRQS) + pirq); - piix3->pic_levels &=3D ~mask; - piix3->pic_levels |=3D mask * !!level; -} - -static void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level) -{ - int pic_irq; - - pic_irq =3D piix3->dev.config[PIIX_PIRQCA + pirq]; - if (pic_irq >=3D PIIX_NUM_PIC_IRQS) { - return; - } - - piix3_set_irq_level_internal(piix3, pirq, level); - - piix3_set_irq_pic(piix3, pic_irq); -} - -static void piix3_set_irq(void *opaque, int pirq, int level) -{ - PIIX3State *piix3 =3D opaque; - piix3_set_irq_level(piix3, pirq, level); -} - -static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin) -{ - PIIX3State *piix3 =3D opaque; - int irq =3D piix3->dev.config[PIIX_PIRQCA + pin]; - PCIINTxRoute route; - - if (irq < PIIX_NUM_PIC_IRQS) { - route.mode =3D PCI_INTX_ENABLED; - route.irq =3D irq; - } else { - route.mode =3D PCI_INTX_DISABLED; - route.irq =3D -1; - } - return route; -} - -/* irq routing is changed. so rebuild bitmap */ -static void piix3_update_irq_levels(PIIX3State *piix3) -{ - PCIBus *bus =3D pci_get_bus(&piix3->dev); - int pirq; - - piix3->pic_levels =3D 0; - for (pirq =3D 0; pirq < PIIX_NUM_PIRQS; pirq++) { - piix3_set_irq_level(piix3, pirq, pci_bus_get_irq_level(bus, pirq= )); - } -} - -static void piix3_write_config(PCIDevice *dev, - uint32_t address, uint32_t val, int len) -{ - pci_default_write_config(dev, address, val, len); - if (ranges_overlap(address, len, PIIX_PIRQCA, 4)) { - PIIX3State *piix3 =3D PIIX3_PCI_DEVICE(dev); - int pic_irq; - - pci_bus_fire_intx_routing_notifier(pci_get_bus(&piix3->dev)); - piix3_update_irq_levels(piix3); - for (pic_irq =3D 0; pic_irq < PIIX_NUM_PIC_IRQS; pic_irq++) { - piix3_set_irq_pic(piix3, pic_irq); - } - } -} - -static void piix3_write_config_xen(PCIDevice *dev, - uint32_t address, uint32_t val, int len) -{ - xen_piix_pci_write_config_client(address, val, len); - piix3_write_config(dev, address, val, len); -} - -static void piix3_reset(void *opaque) -{ - PIIX3State *d =3D opaque; - uint8_t *pci_conf =3D d->dev.config; - - pci_conf[0x04] =3D 0x07; /* master, memory and I/O */ - pci_conf[0x05] =3D 0x00; - pci_conf[0x06] =3D 0x00; - pci_conf[0x07] =3D 0x02; /* PCI_status_devsel_medium */ - pci_conf[0x4c] =3D 0x4d; - pci_conf[0x4e] =3D 0x03; - pci_conf[0x4f] =3D 0x00; - pci_conf[0x60] =3D 0x80; - pci_conf[0x61] =3D 0x80; - pci_conf[0x62] =3D 0x80; - pci_conf[0x63] =3D 0x80; - pci_conf[0x69] =3D 0x02; - pci_conf[0x70] =3D 0x80; - pci_conf[0x76] =3D 0x0c; - pci_conf[0x77] =3D 0x0c; - pci_conf[0x78] =3D 0x02; - pci_conf[0x79] =3D 0x00; - pci_conf[0x80] =3D 0x00; - pci_conf[0x82] =3D 0x00; - pci_conf[0xa0] =3D 0x08; - pci_conf[0xa2] =3D 0x00; - pci_conf[0xa3] =3D 0x00; - pci_conf[0xa4] =3D 0x00; - pci_conf[0xa5] =3D 0x00; - pci_conf[0xa6] =3D 0x00; - pci_conf[0xa7] =3D 0x00; - pci_conf[0xa8] =3D 0x0f; - pci_conf[0xaa] =3D 0x00; - pci_conf[0xab] =3D 0x00; - pci_conf[0xac] =3D 0x00; - pci_conf[0xae] =3D 0x00; - - d->pic_levels =3D 0; - d->rcr =3D 0; -} - -static int piix3_post_load(void *opaque, int version_id) -{ - PIIX3State *piix3 =3D opaque; - int pirq; - - /* Because the i8259 has not been deserialized yet, qemu_irq_raise - * might bring the system to a different state than the saved one; - * for example, the interrupt could be masked but the i8259 would - * not know that yet and would trigger an interrupt in the CPU. - * - * Here, we update irq levels without raising the interrupt. - * Interrupt state will be deserialized separately through the i8259= . - */ - piix3->pic_levels =3D 0; - for (pirq =3D 0; pirq < PIIX_NUM_PIRQS; pirq++) { - piix3_set_irq_level_internal(piix3, pirq, - pci_bus_get_irq_level(pci_get_bus(&piix3->dev), pirq)); - } - return 0; -} - -static int piix3_pre_save(void *opaque) -{ - int i; - PIIX3State *piix3 =3D opaque; - - for (i =3D 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) { - piix3->pci_irq_levels_vmstate[i] =3D - pci_bus_get_irq_level(pci_get_bus(&piix3->dev), i); - } - - return 0; -} - -static bool piix3_rcr_needed(void *opaque) -{ - PIIX3State *piix3 =3D opaque; - - return (piix3->rcr !=3D 0); -} - -static const VMStateDescription vmstate_piix3_rcr =3D { - .name =3D "PIIX3/rcr", - .version_id =3D 1, - .minimum_version_id =3D 1, - .needed =3D piix3_rcr_needed, - .fields =3D (VMStateField[]) { - VMSTATE_UINT8(rcr, PIIX3State), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_piix3 =3D { - .name =3D "PIIX3", - .version_id =3D 3, - .minimum_version_id =3D 2, - .post_load =3D piix3_post_load, - .pre_save =3D piix3_pre_save, - .fields =3D (VMStateField[]) { - VMSTATE_PCI_DEVICE(dev, PIIX3State), - VMSTATE_INT32_ARRAY_V(pci_irq_levels_vmstate, PIIX3State, - PIIX_NUM_PIRQS, 3), - VMSTATE_END_OF_LIST() - }, - .subsections =3D (const VMStateDescription*[]) { - &vmstate_piix3_rcr, - NULL - } -}; - - -static void rcr_write(void *opaque, hwaddr addr, uint64_t val, unsigned = len) -{ - PIIX3State *d =3D opaque; - - if (val & 4) { - qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); - return; - } - d->rcr =3D val & 2; /* keep System Reset type only */ -} - -static uint64_t rcr_read(void *opaque, hwaddr addr, unsigned len) -{ - PIIX3State *d =3D opaque; - - return d->rcr; -} - -static const MemoryRegionOps rcr_ops =3D { - .read =3D rcr_read, - .write =3D rcr_write, - .endianness =3D DEVICE_LITTLE_ENDIAN -}; - -static void piix3_realize(PCIDevice *dev, Error **errp) -{ - PIIX3State *d =3D PIIX3_PCI_DEVICE(dev); - - if (!isa_bus_new(DEVICE(d), get_system_memory(), - pci_address_space_io(dev), errp)) { - return; - } - - memory_region_init_io(&d->rcr_mem, OBJECT(dev), &rcr_ops, d, - "piix3-reset-control", 1); - memory_region_add_subregion_overlap(pci_address_space_io(dev), - PIIX_RCR_IOPORT, &d->rcr_mem, 1)= ; - - qemu_register_reset(piix3_reset, d); -} - -static void pci_piix3_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc =3D DEVICE_CLASS(klass); - PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); - - dc->desc =3D "ISA bridge"; - dc->vmsd =3D &vmstate_piix3; - dc->hotpluggable =3D false; - k->realize =3D piix3_realize; - k->vendor_id =3D PCI_VENDOR_ID_INTEL; - /* 82371SB PIIX3 PCI-to-ISA bridge (Step A1) */ - k->device_id =3D PCI_DEVICE_ID_INTEL_82371SB_0; - k->class_id =3D PCI_CLASS_BRIDGE_ISA; - /* - * Reason: part of PIIX3 southbridge, needs to be wired up by - * pc_piix.c's pc_init1() - */ - dc->user_creatable =3D false; -} - -static const TypeInfo piix3_pci_type_info =3D { - .name =3D TYPE_PIIX3_PCI_DEVICE, - .parent =3D TYPE_PCI_DEVICE, - .instance_size =3D sizeof(PIIX3State), - .abstract =3D true, - .class_init =3D pci_piix3_class_init, - .interfaces =3D (InterfaceInfo[]) { - { INTERFACE_CONVENTIONAL_PCI_DEVICE }, - { }, - }, -}; - -static void piix3_class_init(ObjectClass *klass, void *data) -{ - PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); - - k->config_write =3D piix3_write_config; -} - -static const TypeInfo piix3_info =3D { - .name =3D TYPE_PIIX3_DEVICE, - .parent =3D TYPE_PIIX3_PCI_DEVICE, - .class_init =3D piix3_class_init, -}; - -static void piix3_xen_class_init(ObjectClass *klass, void *data) -{ - PCIDeviceClass *k =3D PCI_DEVICE_CLASS(klass); - - k->config_write =3D piix3_write_config_xen; -}; - -static const TypeInfo piix3_xen_info =3D { - .name =3D TYPE_PIIX3_XEN_DEVICE, - .parent =3D TYPE_PIIX3_PCI_DEVICE, - .class_init =3D piix3_xen_class_init, -}; - static void i440fx_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -922,9 +523,6 @@ static void i440fx_register_types(void) { type_register_static(&i440fx_info); type_register_static(&igd_passthrough_i440fx_info); - type_register_static(&piix3_pci_type_info); - type_register_static(&piix3_info); - type_register_static(&piix3_xen_info); type_register_static(&i440fx_pcihost_info); } =20 diff --git a/include/hw/southbridge/piix.h b/include/hw/southbridge/piix.= h index 094508b928..152628c6d9 100644 --- a/include/hw/southbridge/piix.h +++ b/include/hw/southbridge/piix.h @@ -12,6 +12,8 @@ #ifndef HW_SOUTHBRIDGE_PIIX_H #define HW_SOUTHBRIDGE_PIIX_H =20 +#include "hw/pci/pci.h" + #define TYPE_PIIX4_PM "PIIX4_PM" =20 I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, @@ -30,8 +32,42 @@ I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t= smb_io_base, */ #define PIIX_RCR_IOPORT 0xcf9 =20 +#define PIIX_NUM_PIC_IRQS 16 /* i8259 * 2 */ +#define PIIX_NUM_PIRQS 4ULL /* PIRQ[A-D] */ + +typedef struct PIIXState { + PCIDevice dev; + + /* + * bitmap to track pic levels. + * The pic level is the logical OR of all the PCI irqs mapped to it + * So one PIC level is tracked by PIIX_NUM_PIRQS bits. + * + * PIRQ is mapped to PIC pins, we track it by + * PIIX_NUM_PIRQS * PIIX_NUM_PIC_IRQS =3D 64 bits with + * pic_irq * PIIX_NUM_PIRQS + pirq + */ +#if PIIX_NUM_PIC_IRQS * PIIX_NUM_PIRQS > 64 +#error "unable to encode pic state in 64bit in pic_levels." +#endif + uint64_t pic_levels; + + qemu_irq *pic; + + /* This member isn't used. Just for save/load compatibility */ + int32_t pci_irq_levels_vmstate[PIIX_NUM_PIRQS]; + + /* Reset Control Register contents */ + uint8_t rcr; + + /* IO memory region for Reset Control Register (PIIX_RCR_IOPORT) */ + MemoryRegion rcr_mem; +} PIIX3State; + extern PCIDevice *piix4_dev; =20 +PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus); + DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus, size_t ide_buses); =20 --=20 2.21.0