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 0A7D2ECE588 for ; Tue, 15 Oct 2019 16:33:31 +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 C634D2086A for ; Tue, 15 Oct 2019 16:33:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C634D2086A 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 1iKPl8-0006Gt-Hy; Tue, 15 Oct 2019 16:33:18 +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 1iKPl6-0006Fc-Dq for xen-devel@lists.xenproject.org; Tue, 15 Oct 2019 16:33:16 +0000 X-Inumbo-ID: 7cbcebaa-ef69-11e9-9397-12813bfff9fa Received: from mx1.redhat.com (unknown [209.132.183.28]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id 7cbcebaa-ef69-11e9-9397-12813bfff9fa; Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34CCFC0568FD; Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-35.brq.redhat.com [10.40.204.35]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2776A4518; Tue, 15 Oct 2019 16:33:05 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Date: Tue, 15 Oct 2019 18:27:03 +0200 Message-Id: <20191015162705.28087-31-philmd@redhat.com> In-Reply-To: <20191015162705.28087-1-philmd@redhat.com> References: <20191015162705.28087-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Subject: [Xen-devel] [PATCH 30/32] 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: Laurent Vivier , Thomas Huth , Stefano Stabellini , Eduardo Habkost , kvm@vger.kernel.org, Paul Durrant , "Michael S. Tsirkin" , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , Paolo Bonzini , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , Aleksandar Markovic , xen-devel@lists.xenproject.org, Anthony Perard , Igor Mammedov , Aleksandar Rikalo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , Richard Henderson Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" RnJvbTogUGhpbGlwcGUgTWF0aGlldS1EYXVkw6kgPGY0YnVnQGFtc2F0Lm9yZz4KCk1vdmUgYWxs IHRoZSBQSUlYMyBmdW5jdGlvbnMgdG8gYSBuZXcgZmlsZTogaHcvaXNhL3BpaXgzLmMuCgpTaWdu ZWQtb2ZmLWJ5OiBQaGlsaXBwZSBNYXRoaWV1LURhdWTDqSA8cGhpbG1kQHJlZGhhdC5jb20+Ci0t LQpDaGVja3BhdGNoIHdhcm5pbmc6CgogRVJST1I6IHNwYWNlcyByZXF1aXJlZCBhcm91bmQgdGhh dCAnKicgKGN0eDpWeFYpCiAjMzEyOiBGSUxFOiBody9pc2EvcGlpeDMuYzoyNDg6CiArICAgIC5z dWJzZWN0aW9ucyA9IChjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24qW10pIHsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLS0tCiBNQUlOVEFJTkVSUyAgICAg ICAgICAgICAgICAgICB8ICAgMSArCiBody9pMzg2L0tjb25maWcgICAgICAgICAgICAgICB8ICAg MSArCiBody9pc2EvS2NvbmZpZyAgICAgICAgICAgICAgICB8ICAgNCArCiBody9pc2EvTWFrZWZp bGUub2JqcyAgICAgICAgICB8ICAgMSArCiBody9pc2EvcGlpeDMuYyAgICAgICAgICAgICAgICB8 IDM5OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGh3L3BjaS1ob3N0L0tjb25m aWcgICAgICAgICAgIHwgICAxIC0KIGh3L3BjaS1ob3N0L3BpaXguYyAgICAgICAgICAgIHwgNDAy IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGluY2x1ZGUvaHcvc291dGhicmlk Z2UvcGlpeC5oIHwgIDM2ICsrKwogOCBmaWxlcyBjaGFuZ2VkLCA0NDIgaW5zZXJ0aW9ucygrKSwg NDAzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGh3L2lzYS9waWl4My5jCgpkaWZm IC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBhZGYwNTlhMTY0Li40ODQ1 ZjQ3ZDkzIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTIz MSw2ICsxMjMxLDcgQEAgRjogaHcvcGNpLWhvc3QvcGFtLmMKIEY6IGluY2x1ZGUvaHcvcGNpLWhv c3QvaTQ0MGZ4LmgKIEY6IGluY2x1ZGUvaHcvcGNpLWhvc3QvcTM1LmgKIEY6IGluY2x1ZGUvaHcv cGNpLWhvc3QvcGFtLmgKK0Y6IGh3L2lzYS9waWl4My5jCiBGOiBody9pc2EvbHBjX2ljaDkuYwog RjogaHcvaTJjL3NtYnVzX2ljaDkuYwogRjogaHcvYWNwaS9waWl4NC5jCmRpZmYgLS1naXQgYS9o dy9pMzg2L0tjb25maWcgYi9ody9pMzg2L0tjb25maWcKaW5kZXggYzVjOWQ0OTAwZS4uNTg5ZDc1 ZTI2YSAxMDA2NDQKLS0tIGEvaHcvaTM4Ni9LY29uZmlnCisrKyBiL2h3L2kzODYvS2NvbmZpZwpA QCAtNjEsNiArNjEsNyBAQCBjb25maWcgSTQ0MEZYCiAgICAgc2VsZWN0IFBDX0FDUEkKICAgICBz ZWxlY3QgQUNQSV9TTUJVUwogICAgIHNlbGVjdCBQQ0lfUElJWAorICAgIHNlbGVjdCBQSUlYMwog ICAgIHNlbGVjdCBJREVfUElJWAogICAgIHNlbGVjdCBESU1NCiAgICAgc2VsZWN0IFNNQklPUwpk aWZmIC0tZ2l0IGEvaHcvaXNhL0tjb25maWcgYi9ody9pc2EvS2NvbmZpZwppbmRleCA5OGEyODk5 NTdlLi44YTM4ODEzY2MxIDEwMDY0NAotLS0gYS9ody9pc2EvS2NvbmZpZworKysgYi9ody9pc2Ev S2NvbmZpZwpAQCAtMjksNiArMjksMTAgQEAgY29uZmlnIFBDODczMTIKICAgICBzZWxlY3QgRkRD CiAgICAgc2VsZWN0IElERV9JU0EKIAorY29uZmlnIFBJSVgzCisgICAgYm9vbAorICAgIHNlbGVj dCBJU0FfQlVTCisKIGNvbmZpZyBQSUlYNAogICAgIGJvb2wKICAgICAjIEZvciBoaXN0b3JpY2Fs IHJlYXNvbnMsIFN1cGVySU8gZGV2aWNlcyBhcmUgY3JlYXRlZCBpbiB0aGUgYm9hcmQKZGlmZiAt LWdpdCBhL2h3L2lzYS9NYWtlZmlsZS5vYmpzIGIvaHcvaXNhL01ha2VmaWxlLm9ianMKaW5kZXgg ZmY5NzQ4NTUwNC4uOGU3Mzk2MGE3NSAxMDA2NDQKLS0tIGEvaHcvaXNhL01ha2VmaWxlLm9ianMK KysrIGIvaHcvaXNhL01ha2VmaWxlLm9ianMKQEAgLTMsNiArMyw3IEBAIGNvbW1vbi1vYmotJChD T05GSUdfSVNBX1NVUEVSSU8pICs9IGlzYS1zdXBlcmlvLm8KIGNvbW1vbi1vYmotJChDT05GSUdf QVBNKSArPSBhcG0ubwogY29tbW9uLW9iai0kKENPTkZJR19JODIzNzgpICs9IGk4MjM3OC5vCiBj b21tb24tb2JqLSQoQ09ORklHX1BDODczMTIpICs9IHBjODczMTIubworY29tbW9uLW9iai0kKENP TkZJR19QSUlYMykgKz0gcGlpeDMubwogY29tbW9uLW9iai0kKENPTkZJR19QSUlYNCkgKz0gcGlp eDQubwogY29tbW9uLW9iai0kKENPTkZJR19WVDgyQzY4NikgKz0gdnQ4MmM2ODYubwogY29tbW9u LW9iai0kKENPTkZJR19TTUMzN0M2NjkpICs9IHNtYzM3YzY2OS1zdXBlcmlvLm8KZGlmZiAtLWdp dCBhL2h3L2lzYS9waWl4My5jIGIvaHcvaXNhL3BpaXgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMC4uMDUxNDY0NDdlZgotLS0gL2Rldi9udWxsCisrKyBiL2h3L2lzYS9w aWl4My5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogUUVNVSBQSUlYIFBDSSBJU0EgQnJpZGdl IEVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGYWJyaWNlIEJlbGxhcmQKKyAq CisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55 IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lh dGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4g dGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0 YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNo LCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBT b2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisg KiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25z OgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFs IHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklE RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICog SU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQg Tk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09Q WVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIK KyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Ig T1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRI IFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09G VFdBUkUuCisgKi8KKworI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKKyNpbmNsdWRlICJxZW11L3Jh bmdlLmgiCisjaW5jbHVkZSAiaHcvc291dGhicmlkZ2UvcGlpeC5oIgorI2luY2x1ZGUgImh3L2ly cS5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJody94ZW4veGVuLmgiCisj aW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgInN5c2VtdS9yZXNldC5oIgorI2lu Y2x1ZGUgInN5c2VtdS9ydW5zdGF0ZS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi92bXN0YXRlLmgi CisKKyNkZWZpbmUgWEVOX1BJSVhfTlVNX1BJUlFTICAgICAgMTI4VUxMCisKKyNkZWZpbmUgVFlQ RV9QSUlYM19QQ0lfREVWSUNFICJwY2ktcGlpeDMiCisjZGVmaW5lIFBJSVgzX1BDSV9ERVZJQ0Uo b2JqKSBcCisgICAgT0JKRUNUX0NIRUNLKFBJSVgzU3RhdGUsIChvYmopLCBUWVBFX1BJSVgzX1BD SV9ERVZJQ0UpCisKKyNkZWZpbmUgVFlQRV9QSUlYM19ERVZJQ0UgIlBJSVgzIgorI2RlZmluZSBU WVBFX1BJSVgzX1hFTl9ERVZJQ0UgIlBJSVgzLXhlbiIKKworc3RhdGljIHZvaWQgcGlpeDNfc2V0 X2lycV9waWMoUElJWDNTdGF0ZSAqcGlpeDMsIGludCBwaWNfaXJxKQoreworICAgIHFlbXVfc2V0 X2lycShwaWl4My0+cGljW3BpY19pcnFdLAorICAgICAgICAgICAgICAgICAhIShwaWl4My0+cGlj X2xldmVscyAmCisgICAgICAgICAgICAgICAgICAgICgoKDFVTEwgPDwgUElJWF9OVU1fUElSUVMp IC0gMSkgPDwKKyAgICAgICAgICAgICAgICAgICAgIChwaWNfaXJxICogUElJWF9OVU1fUElSUVMp KSkpOworfQorCitzdGF0aWMgdm9pZCBwaWl4M19zZXRfaXJxX2xldmVsX2ludGVybmFsKFBJSVgz U3RhdGUgKnBpaXgzLCBpbnQgcGlycSwgaW50IGxldmVsKQoreworICAgIGludCBwaWNfaXJxOwor ICAgIHVpbnQ2NF90IG1hc2s7CisKKyAgICBwaWNfaXJxID0gcGlpeDMtPmRldi5jb25maWdbUElJ WF9QSVJRQ0EgKyBwaXJxXTsKKyAgICBpZiAocGljX2lycSA+PSBQSUlYX05VTV9QSUNfSVJRUykg eworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWFzayA9IDFVTEwgPDwgKChwaWNfaXJx ICogUElJWF9OVU1fUElSUVMpICsgcGlycSk7CisgICAgcGlpeDMtPnBpY19sZXZlbHMgJj0gfm1h c2s7CisgICAgcGlpeDMtPnBpY19sZXZlbHMgfD0gbWFzayAqICEhbGV2ZWw7Cit9CisKK3N0YXRp YyB2b2lkIHBpaXgzX3NldF9pcnFfbGV2ZWwoUElJWDNTdGF0ZSAqcGlpeDMsIGludCBwaXJxLCBp bnQgbGV2ZWwpCit7CisgICAgaW50IHBpY19pcnE7CisKKyAgICBwaWNfaXJxID0gcGlpeDMtPmRl di5jb25maWdbUElJWF9QSVJRQ0EgKyBwaXJxXTsKKyAgICBpZiAocGljX2lycSA+PSBQSUlYX05V TV9QSUNfSVJRUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGlpeDNfc2V0X2ly cV9sZXZlbF9pbnRlcm5hbChwaWl4MywgcGlycSwgbGV2ZWwpOworCisgICAgcGlpeDNfc2V0X2ly cV9waWMocGlpeDMsIHBpY19pcnEpOworfQorCitzdGF0aWMgdm9pZCBwaWl4M19zZXRfaXJxKHZv aWQgKm9wYXF1ZSwgaW50IHBpcnEsIGludCBsZXZlbCkKK3sKKyAgICBQSUlYM1N0YXRlICpwaWl4 MyA9IG9wYXF1ZTsKKyAgICBwaWl4M19zZXRfaXJxX2xldmVsKHBpaXgzLCBwaXJxLCBsZXZlbCk7 Cit9CisKK3N0YXRpYyBQQ0lJTlR4Um91dGUgcGlpeDNfcm91dGVfaW50eF9waW5fdG9faXJxKHZv aWQgKm9wYXF1ZSwgaW50IHBpbikKK3sKKyAgICBQSUlYM1N0YXRlICpwaWl4MyA9IG9wYXF1ZTsK KyAgICBpbnQgaXJxID0gcGlpeDMtPmRldi5jb25maWdbUElJWF9QSVJRQ0EgKyBwaW5dOworICAg IFBDSUlOVHhSb3V0ZSByb3V0ZTsKKworICAgIGlmIChpcnEgPCBQSUlYX05VTV9QSUNfSVJRUykg eworICAgICAgICByb3V0ZS5tb2RlID0gUENJX0lOVFhfRU5BQkxFRDsKKyAgICAgICAgcm91dGUu aXJxID0gaXJxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvdXRlLm1vZGUgPSBQQ0lfSU5UWF9E SVNBQkxFRDsKKyAgICAgICAgcm91dGUuaXJxID0gLTE7CisgICAgfQorICAgIHJldHVybiByb3V0 ZTsKK30KKworLyogaXJxIHJvdXRpbmcgaXMgY2hhbmdlZC4gc28gcmVidWlsZCBiaXRtYXAgKi8K K3N0YXRpYyB2b2lkIHBpaXgzX3VwZGF0ZV9pcnFfbGV2ZWxzKFBJSVgzU3RhdGUgKnBpaXgzKQor eworICAgIFBDSUJ1cyAqYnVzID0gcGNpX2dldF9idXMoJnBpaXgzLT5kZXYpOworICAgIGludCBw aXJxOworCisgICAgcGlpeDMtPnBpY19sZXZlbHMgPSAwOworICAgIGZvciAocGlycSA9IDA7IHBp cnEgPCBQSUlYX05VTV9QSVJRUzsgcGlycSsrKSB7CisgICAgICAgIHBpaXgzX3NldF9pcnFfbGV2 ZWwocGlpeDMsIHBpcnEsIHBjaV9idXNfZ2V0X2lycV9sZXZlbChidXMsIHBpcnEpKTsKKyAgICB9 Cit9CisKK3N0YXRpYyB2b2lkIHBpaXgzX3dyaXRlX2NvbmZpZyhQQ0lEZXZpY2UgKmRldiwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCB2 YWwsIGludCBsZW4pCit7CisgICAgcGNpX2RlZmF1bHRfd3JpdGVfY29uZmlnKGRldiwgYWRkcmVz cywgdmFsLCBsZW4pOworICAgIGlmIChyYW5nZXNfb3ZlcmxhcChhZGRyZXNzLCBsZW4sIFBJSVhf UElSUUNBLCA0KSkgeworICAgICAgICBQSUlYM1N0YXRlICpwaWl4MyA9IFBJSVgzX1BDSV9ERVZJ Q0UoZGV2KTsKKyAgICAgICAgaW50IHBpY19pcnE7CisKKyAgICAgICAgcGNpX2J1c19maXJlX2lu dHhfcm91dGluZ19ub3RpZmllcihwY2lfZ2V0X2J1cygmcGlpeDMtPmRldikpOworICAgICAgICBw aWl4M191cGRhdGVfaXJxX2xldmVscyhwaWl4Myk7CisgICAgICAgIGZvciAocGljX2lycSA9IDA7 IHBpY19pcnEgPCBQSUlYX05VTV9QSUNfSVJRUzsgcGljX2lycSsrKSB7CisgICAgICAgICAgICBw aWl4M19zZXRfaXJxX3BpYyhwaWl4MywgcGljX2lycSk7CisgICAgICAgIH0KKyAgICB9Cit9CisK K3N0YXRpYyB2b2lkIHBpaXgzX3dyaXRlX2NvbmZpZ194ZW4oUENJRGV2aWNlICpkZXYsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90 IHZhbCwgaW50IGxlbikKK3sKKyAgICB4ZW5fcGlpeF9wY2lfd3JpdGVfY29uZmlnX2NsaWVudChh ZGRyZXNzLCB2YWwsIGxlbik7CisgICAgcGlpeDNfd3JpdGVfY29uZmlnKGRldiwgYWRkcmVzcywg dmFsLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBwaWl4M19yZXNldCh2b2lkICpvcGFxdWUpCit7 CisgICAgUElJWDNTdGF0ZSAqZCA9IG9wYXF1ZTsKKyAgICB1aW50OF90ICpwY2lfY29uZiA9IGQt PmRldi5jb25maWc7CisKKyAgICBwY2lfY29uZlsweDA0XSA9IDB4MDc7IC8qIG1hc3RlciwgbWVt b3J5IGFuZCBJL08gKi8KKyAgICBwY2lfY29uZlsweDA1XSA9IDB4MDA7CisgICAgcGNpX2NvbmZb MHgwNl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4MDddID0gMHgwMjsgLyogUENJX3N0YXR1c19k ZXZzZWxfbWVkaXVtICovCisgICAgcGNpX2NvbmZbMHg0Y10gPSAweDRkOworICAgIHBjaV9jb25m WzB4NGVdID0gMHgwMzsKKyAgICBwY2lfY29uZlsweDRmXSA9IDB4MDA7CisgICAgcGNpX2NvbmZb MHg2MF0gPSAweDgwOworICAgIHBjaV9jb25mWzB4NjFdID0gMHg4MDsKKyAgICBwY2lfY29uZlsw eDYyXSA9IDB4ODA7CisgICAgcGNpX2NvbmZbMHg2M10gPSAweDgwOworICAgIHBjaV9jb25mWzB4 NjldID0gMHgwMjsKKyAgICBwY2lfY29uZlsweDcwXSA9IDB4ODA7CisgICAgcGNpX2NvbmZbMHg3 Nl0gPSAweDBjOworICAgIHBjaV9jb25mWzB4NzddID0gMHgwYzsKKyAgICBwY2lfY29uZlsweDc4 XSA9IDB4MDI7CisgICAgcGNpX2NvbmZbMHg3OV0gPSAweDAwOworICAgIHBjaV9jb25mWzB4ODBd ID0gMHgwMDsKKyAgICBwY2lfY29uZlsweDgyXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhMF0g PSAweDA4OworICAgIHBjaV9jb25mWzB4YTJdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGEzXSA9 IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhNF0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTVdID0g MHgwMDsKKyAgICBwY2lfY29uZlsweGE2XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhN10gPSAw eDAwOworICAgIHBjaV9jb25mWzB4YThdID0gMHgwZjsKKyAgICBwY2lfY29uZlsweGFhXSA9IDB4 MDA7CisgICAgcGNpX2NvbmZbMHhhYl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YWNdID0gMHgw MDsKKyAgICBwY2lfY29uZlsweGFlXSA9IDB4MDA7CisKKyAgICBkLT5waWNfbGV2ZWxzID0gMDsK KyAgICBkLT5yY3IgPSAwOworfQorCitzdGF0aWMgaW50IHBpaXgzX3Bvc3RfbG9hZCh2b2lkICpv cGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFBJSVgzU3RhdGUgKnBpaXgzID0gb3BhcXVl OworICAgIGludCBwaXJxOworCisgICAgLyoKKyAgICAgKiBCZWNhdXNlIHRoZSBpODI1OSBoYXMg bm90IGJlZW4gZGVzZXJpYWxpemVkIHlldCwgcWVtdV9pcnFfcmFpc2UKKyAgICAgKiBtaWdodCBi cmluZyB0aGUgc3lzdGVtIHRvIGEgZGlmZmVyZW50IHN0YXRlIHRoYW4gdGhlIHNhdmVkIG9uZTsK KyAgICAgKiBmb3IgZXhhbXBsZSwgdGhlIGludGVycnVwdCBjb3VsZCBiZSBtYXNrZWQgYnV0IHRo ZSBpODI1OSB3b3VsZAorICAgICAqIG5vdCBrbm93IHRoYXQgeWV0IGFuZCB3b3VsZCB0cmlnZ2Vy IGFuIGludGVycnVwdCBpbiB0aGUgQ1BVLgorICAgICAqCisgICAgICogSGVyZSwgd2UgdXBkYXRl IGlycSBsZXZlbHMgd2l0aG91dCByYWlzaW5nIHRoZSBpbnRlcnJ1cHQuCisgICAgICogSW50ZXJy dXB0IHN0YXRlIHdpbGwgYmUgZGVzZXJpYWxpemVkIHNlcGFyYXRlbHkgdGhyb3VnaCB0aGUgaTgy NTkuCisgICAgICovCisgICAgcGlpeDMtPnBpY19sZXZlbHMgPSAwOworICAgIGZvciAocGlycSA9 IDA7IHBpcnEgPCBQSUlYX05VTV9QSVJRUzsgcGlycSsrKSB7CisgICAgICAgIHBpaXgzX3NldF9p cnFfbGV2ZWxfaW50ZXJuYWwocGlpeDMsIHBpcnEsCisgICAgICAgICAgICBwY2lfYnVzX2dldF9p cnFfbGV2ZWwocGNpX2dldF9idXMoJnBpaXgzLT5kZXYpLCBwaXJxKSk7CisgICAgfQorICAgIHJl dHVybiAwOworfQorCitzdGF0aWMgaW50IHBpaXgzX3ByZV9zYXZlKHZvaWQgKm9wYXF1ZSkKK3sK KyAgICBpbnQgaTsKKyAgICBQSUlYM1N0YXRlICpwaWl4MyA9IG9wYXF1ZTsKKworICAgIGZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpaXgzLT5wY2lfaXJxX2xldmVsc192bXN0YXRlKTsgaSsr KSB7CisgICAgICAgIHBpaXgzLT5wY2lfaXJxX2xldmVsc192bXN0YXRlW2ldID0KKyAgICAgICAg ICAgIHBjaV9idXNfZ2V0X2lycV9sZXZlbChwY2lfZ2V0X2J1cygmcGlpeDMtPmRldiksIGkpOwor ICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBwaWl4M19yY3JfbmVlZGVk KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQSUlYM1N0YXRlICpwaWl4MyA9IG9wYXF1ZTsKKworICAg IHJldHVybiAocGlpeDMtPnJjciAhPSAwKTsKK30KKworc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNj cmlwdGlvbiB2bXN0YXRlX3BpaXgzX3JjciA9IHsKKyAgICAubmFtZSA9ICJQSUlYMy9yY3IiLAor ICAgIC52ZXJzaW9uX2lkID0gMSwKKyAgICAubWluaW11bV92ZXJzaW9uX2lkID0gMSwKKyAgICAu bmVlZGVkID0gcGlpeDNfcmNyX25lZWRlZCwKKyAgICAuZmllbGRzID0gKFZNU3RhdGVGaWVsZFtd KSB7CisgICAgICAgIFZNU1RBVEVfVUlOVDgocmNyLCBQSUlYM1N0YXRlKSwKKyAgICAgICAgVk1T VEFURV9FTkRfT0ZfTElTVCgpCisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNj cmlwdGlvbiB2bXN0YXRlX3BpaXgzID0geworICAgIC5uYW1lID0gIlBJSVgzIiwKKyAgICAudmVy c2lvbl9pZCA9IDMsCisgICAgLm1pbmltdW1fdmVyc2lvbl9pZCA9IDIsCisgICAgLnBvc3RfbG9h ZCA9IHBpaXgzX3Bvc3RfbG9hZCwKKyAgICAucHJlX3NhdmUgPSBwaWl4M19wcmVfc2F2ZSwKKyAg ICAuZmllbGRzID0gKFZNU3RhdGVGaWVsZFtdKSB7CisgICAgICAgIFZNU1RBVEVfUENJX0RFVklD RShkZXYsIFBJSVgzU3RhdGUpLAorICAgICAgICBWTVNUQVRFX0lOVDMyX0FSUkFZX1YocGNpX2ly cV9sZXZlbHNfdm1zdGF0ZSwgUElJWDNTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFBJSVhfTlVNX1BJUlFTLCAzKSwKKyAgICAgICAgVk1TVEFURV9FTkRfT0ZfTElTVCgpCisg ICAgfSwKKyAgICAuc3Vic2VjdGlvbnMgPSAoY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uKltdKSB7 CisgICAgICAgICZ2bXN0YXRlX3BpaXgzX3JjciwKKyAgICAgICAgTlVMTAorICAgIH0KK307CisK Kworc3RhdGljIHZvaWQgcmNyX3dyaXRlKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQ2 NF90IHZhbCwgdW5zaWduZWQgbGVuKQoreworICAgIFBJSVgzU3RhdGUgKmQgPSBvcGFxdWU7CisK KyAgICBpZiAodmFsICYgNCkgeworICAgICAgICBxZW11X3N5c3RlbV9yZXNldF9yZXF1ZXN0KFNI VVRET1dOX0NBVVNFX0dVRVNUX1JFU0VUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBk LT5yY3IgPSB2YWwgJiAyOyAvKiBrZWVwIFN5c3RlbSBSZXNldCB0eXBlIG9ubHkgKi8KK30KKwor c3RhdGljIHVpbnQ2NF90IHJjcl9yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVuc2ln bmVkIGxlbikKK3sKKyAgICBQSUlYM1N0YXRlICpkID0gb3BhcXVlOworCisgICAgcmV0dXJuIGQt PnJjcjsKK30KKworc3RhdGljIGNvbnN0IE1lbW9yeVJlZ2lvbk9wcyByY3Jfb3BzID0geworICAg IC5yZWFkID0gcmNyX3JlYWQsCisgICAgLndyaXRlID0gcmNyX3dyaXRlLAorICAgIC5lbmRpYW5u ZXNzID0gREVWSUNFX0xJVFRMRV9FTkRJQU4KK307CisKK3N0YXRpYyB2b2lkIHBpaXgzX3JlYWxp emUoUENJRGV2aWNlICpkZXYsIEVycm9yICoqZXJycCkKK3sKKyAgICBQSUlYM1N0YXRlICpkID0g UElJWDNfUENJX0RFVklDRShkZXYpOworCisgICAgaWYgKCFpc2FfYnVzX25ldyhERVZJQ0UoZCks IGdldF9zeXN0ZW1fbWVtb3J5KCksCisgICAgICAgICAgICAgICAgICAgICBwY2lfYWRkcmVzc19z cGFjZV9pbyhkZXYpLCBlcnJwKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVt b3J5X3JlZ2lvbl9pbml0X2lvKCZkLT5yY3JfbWVtLCBPQkpFQ1QoZGV2KSwgJnJjcl9vcHMsIGQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWl4My1yZXNldC1jb250cm9sIiwgMSk7Cisg ICAgbWVtb3J5X3JlZ2lvbl9hZGRfc3VicmVnaW9uX292ZXJsYXAocGNpX2FkZHJlc3Nfc3BhY2Vf aW8oZGV2KSwgUkNSX0lPUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAmZC0+cmNyX21lbSwgMSk7CisKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KHBpaXgzX3Jl c2V0LCBkKTsKK30KKworc3RhdGljIHZvaWQgcGNpX3BpaXgzX2NsYXNzX2luaXQoT2JqZWN0Q2xh c3MgKmtsYXNzLCB2b2lkICpkYXRhKQoreworICAgIERldmljZUNsYXNzICpkYyA9IERFVklDRV9D TEFTUyhrbGFzcyk7CisgICAgUENJRGV2aWNlQ2xhc3MgKmsgPSBQQ0lfREVWSUNFX0NMQVNTKGts YXNzKTsKKworICAgIGRjLT5kZXNjICAgICAgICA9ICJJU0EgYnJpZGdlIjsKKyAgICBkYy0+dm1z ZCAgICAgICAgPSAmdm1zdGF0ZV9waWl4MzsKKyAgICBkYy0+aG90cGx1Z2dhYmxlICAgPSBmYWxz ZTsKKyAgICBrLT5yZWFsaXplICAgICAgPSBwaWl4M19yZWFsaXplOworICAgIGstPnZlbmRvcl9p ZCAgICA9IFBDSV9WRU5ET1JfSURfSU5URUw7CisgICAgLyogODIzNzFTQiBQSUlYMyBQQ0ktdG8t SVNBIGJyaWRnZSAoU3RlcCBBMSkgKi8KKyAgICBrLT5kZXZpY2VfaWQgICAgPSBQQ0lfREVWSUNF X0lEX0lOVEVMXzgyMzcxU0JfMDsKKyAgICBrLT5jbGFzc19pZCAgICAgPSBQQ0lfQ0xBU1NfQlJJ REdFX0lTQTsKKyAgICAvKgorICAgICAqIFJlYXNvbjogcGFydCBvZiBQSUlYMyBzb3V0aGJyaWRn ZSwgbmVlZHMgdG8gYmUgd2lyZWQgdXAgYnkKKyAgICAgKiBwY19waWl4LmMncyBwY19pbml0MSgp CisgICAgICovCisgICAgZGMtPnVzZXJfY3JlYXRhYmxlID0gZmFsc2U7Cit9CisKK3N0YXRpYyBj b25zdCBUeXBlSW5mbyBwaWl4M19wY2lfdHlwZV9pbmZvID0geworICAgIC5uYW1lID0gVFlQRV9Q SUlYM19QQ0lfREVWSUNFLAorICAgIC5wYXJlbnQgPSBUWVBFX1BDSV9ERVZJQ0UsCisgICAgLmlu c3RhbmNlX3NpemUgPSBzaXplb2YoUElJWDNTdGF0ZSksCisgICAgLmFic3RyYWN0ID0gdHJ1ZSwK KyAgICAuY2xhc3NfaW5pdCA9IHBjaV9waWl4M19jbGFzc19pbml0LAorICAgIC5pbnRlcmZhY2Vz ID0gKEludGVyZmFjZUluZm9bXSkgeworICAgICAgICB7IElOVEVSRkFDRV9DT05WRU5USU9OQUxf UENJX0RFVklDRSB9LAorICAgICAgICB7IH0sCisgICAgfSwKK307CisKK3N0YXRpYyB2b2lkIHBp aXgzX2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQoreworICAgIFBD SURldmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7CisKKyAgICBrLT5jb25m aWdfd3JpdGUgPSBwaWl4M193cml0ZV9jb25maWc7Cit9CisKK3N0YXRpYyBjb25zdCBUeXBlSW5m byBwaWl4M19pbmZvID0geworICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9QSUlYM19ERVZJQ0Us CisgICAgLnBhcmVudCAgICAgICAgPSBUWVBFX1BJSVgzX1BDSV9ERVZJQ0UsCisgICAgLmNsYXNz X2luaXQgICAgPSBwaWl4M19jbGFzc19pbml0LAorfTsKKworc3RhdGljIHZvaWQgcGlpeDNfeGVu X2NsYXNzX2luaXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKQoreworICAgIFBDSURl dmljZUNsYXNzICprID0gUENJX0RFVklDRV9DTEFTUyhrbGFzcyk7CisKKyAgICBrLT5jb25maWdf d3JpdGUgPSBwaWl4M193cml0ZV9jb25maWdfeGVuOworfTsKKworc3RhdGljIGNvbnN0IFR5cGVJ bmZvIHBpaXgzX3hlbl9pbmZvID0geworICAgIC5uYW1lICAgICAgICAgID0gVFlQRV9QSUlYM19Y RU5fREVWSUNFLAorICAgIC5wYXJlbnQgICAgICAgID0gVFlQRV9QSUlYM19QQ0lfREVWSUNFLAor ICAgIC5jbGFzc19pbml0ICAgID0gcGlpeDNfeGVuX2NsYXNzX2luaXQsCit9OworCitzdGF0aWMg dm9pZCBwaWl4M19yZWdpc3Rlcl90eXBlcyh2b2lkKQoreworICAgIHR5cGVfcmVnaXN0ZXJfc3Rh dGljKCZwaWl4M19wY2lfdHlwZV9pbmZvKTsKKyAgICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmcGlp eDNfaW5mbyk7CisgICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJnBpaXgzX3hlbl9pbmZvKTsKK30K KwordHlwZV9pbml0KHBpaXgzX3JlZ2lzdGVyX3R5cGVzKQorCisvKgorICogUmV0dXJuIHRoZSBn bG9iYWwgaXJxIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZGV2aWNlIGlycQorICog cGluLiBXZSBjb3VsZCBhbHNvIHVzZSB0aGUgYnVzIG51bWJlciB0byBoYXZlIGEgbW9yZSBwcmVj aXNlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgcGNpX3Nsb3RfZ2V0X3BpcnEoUENJRGV2aWNl ICpwY2lfZGV2LCBpbnQgcGNpX2ludHgpCit7CisgICAgaW50IHNsb3RfYWRkZW5kOworICAgIHNs b3RfYWRkZW5kID0gKHBjaV9kZXYtPmRldmZuID4+IDMpIC0gMTsKKyAgICByZXR1cm4gKHBjaV9p bnR4ICsgc2xvdF9hZGRlbmQpICYgMzsKK30KKworUElJWDNTdGF0ZSAqcGlpeDNfY3JlYXRlKFBD SUJ1cyAqcGNpX2J1cywgSVNBQnVzICoqaXNhX2J1cykKK3sKKyAgICBQSUlYM1N0YXRlICpwaWl4 MzsKKyAgICBQQ0lEZXZpY2UgKnBjaV9kZXY7CisKKyAgICAvKgorICAgICAqIFhlbiBzdXBwb3J0 cyBhZGRpdGlvbmFsIGludGVycnVwdCByb3V0ZXMgZnJvbSB0aGUgUENJIGRldmljZXMgdG8KKyAg ICAgKiB0aGUgSU9BUElDOiB0aGUgZm91ciBwaW5zIG9mIGVhY2ggUENJIGRldmljZSBvbiB0aGUg YnVzIGFyZSBhbHNvCisgICAgICogY29ubmVjdGVkIHRvIHRoZSBJT0FQSUMgZGlyZWN0bHkuCisg ICAgICogVGhlc2UgYWRkaXRpb25hbCByb3V0ZXMgY2FuIGJlIGRpc2NvdmVyZWQgdGhyb3VnaCBB Q1BJLgorICAgICAqLworICAgIGlmICh4ZW5fZW5hYmxlZCgpKSB7CisgICAgICAgIHBjaV9kZXYg PSBwY2lfY3JlYXRlX3NpbXBsZV9tdWx0aWZ1bmN0aW9uKHBjaV9idXMsIC0xLCB0cnVlLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1BJSVgz X1hFTl9ERVZJQ0UpOworICAgICAgICBwaWl4MyA9IFBJSVgzX1BDSV9ERVZJQ0UocGNpX2Rldik7 CisgICAgICAgIHBjaV9idXNfaXJxcyhwY2lfYnVzLCB4ZW5fcGlpeDNfc2V0X2lycSwgeGVuX3Bj aV9zbG90X2dldF9waXJxLAorICAgICAgICAgICAgICAgICAgICAgcGlpeDMsIFhFTl9QSUlYX05V TV9QSVJRUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGNpX2RldiA9IHBjaV9jcmVhdGVfc2lt cGxlX211bHRpZnVuY3Rpb24ocGNpX2J1cywgLTEsIHRydWUsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfUElJWDNfREVWSUNFKTsKKyAgICAg ICAgcGlpeDMgPSBQSUlYM19QQ0lfREVWSUNFKHBjaV9kZXYpOworICAgICAgICBwY2lfYnVzX2ly cXMocGNpX2J1cywgcGlpeDNfc2V0X2lycSwgcGNpX3Nsb3RfZ2V0X3BpcnEsCisgICAgICAgICAg ICAgICAgICAgICBwaWl4MywgUElJWF9OVU1fUElSUVMpOworICAgICAgICBwY2lfYnVzX3NldF9y b3V0ZV9pcnFfZm4ocGNpX2J1cywgcGlpeDNfcm91dGVfaW50eF9waW5fdG9faXJxKTsKKyAgICB9 CisgICAgKmlzYV9idXMgPSBJU0FfQlVTKHFkZXZfZ2V0X2NoaWxkX2J1cyhERVZJQ0UocGlpeDMp LCAiaXNhLjAiKSk7CisKKyAgICByZXR1cm4gcGlpeDM7Cit9CmRpZmYgLS1naXQgYS9ody9wY2kt aG9zdC9LY29uZmlnIGIvaHcvcGNpLWhvc3QvS2NvbmZpZwppbmRleCAxZWRjMWEzMWQ0Li4zOTcw NDNiMjg5IDEwMDY0NAotLS0gYS9ody9wY2ktaG9zdC9LY29uZmlnCisrKyBiL2h3L3BjaS1ob3N0 L0tjb25maWcKQEAgLTMyLDcgKzMyLDYgQEAgY29uZmlnIFBDSV9QSUlYCiAgICAgYm9vbAogICAg IHNlbGVjdCBQQ0kKICAgICBzZWxlY3QgUEFNCi0gICAgc2VsZWN0IElTQV9CVVMKIAogY29uZmln IFBDSV9FWFBSRVNTX1EzNQogICAgIGJvb2wKZGlmZiAtLWdpdCBhL2h3L3BjaS1ob3N0L3BpaXgu YyBiL2h3L3BjaS1ob3N0L3BpaXguYwppbmRleCA2MWY5MWZmNTYxLi43OWVjZDU4YTJiIDEwMDY0 NAotLS0gYS9ody9wY2ktaG9zdC9waWl4LmMKKysrIGIvaHcvcGNpLWhvc3QvcGlpeC5jCkBAIC0y NCwyMiArMjQsMTUgQEAKIAogI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKICNpbmNsdWRlICJody9p Mzg2L3BjLmgiCi0jaW5jbHVkZSAiaHcvaXJxLmgiCiAjaW5jbHVkZSAiaHcvcGNpL3BjaS5oIgog I2luY2x1ZGUgImh3L3BjaS9wY2lfaG9zdC5oIgogI2luY2x1ZGUgImh3L3BjaS1ob3N0L2k0NDBm eC5oIgogI2luY2x1ZGUgImh3L3NvdXRoYnJpZGdlL3BpaXguaCIKICNpbmNsdWRlICJody9xZGV2 LXByb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJody9pc2EvaXNhLmgiCiAjaW5jbHVkZSAiaHcvc3lz YnVzLmgiCiAjaW5jbHVkZSAicWFwaS9lcnJvci5oIgotI2luY2x1ZGUgInFlbXUvcmFuZ2UuaCIK LSNpbmNsdWRlICJody94ZW4veGVuLmgiCiAjaW5jbHVkZSAibWlncmF0aW9uL3Ztc3RhdGUuaCIK ICNpbmNsdWRlICJody9wY2ktaG9zdC9wYW0uaCIKLSNpbmNsdWRlICJzeXNlbXUvcmVzZXQuaCIK LSNpbmNsdWRlICJzeXNlbXUvcnVuc3RhdGUuaCIKLSNpbmNsdWRlICJody9pMzg2L2lvYXBpYy5o IgogI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgogI2luY2x1ZGUgInFlbXUvZXJyb3ItcmVwb3J0 LmgiCiAKQEAgLTU5LDQ5ICs1Miw5IEBAIHR5cGVkZWYgc3RydWN0IEk0NDBGWFN0YXRlIHsKICAg ICB1aW50MzJfdCBzaG9ydF9yb290X2J1czsKIH0gSTQ0MEZYU3RhdGU7CiAKLSNkZWZpbmUgUElJ WF9OVU1fUElDX0lSUVMgICAgICAgMTYgICAgICAvKiBpODI1OSAqIDIgKi8KLSNkZWZpbmUgUElJ WF9OVU1fUElSUVMgICAgICAgICAgNFVMTCAgICAvKiBQSVJRW0EtRF0gKi8KLSNkZWZpbmUgWEVO X1BJSVhfTlVNX1BJUlFTICAgICAgMTI4VUxMCi0KLXR5cGVkZWYgc3RydWN0IFBJSVgzU3RhdGUg ewotICAgIFBDSURldmljZSBkZXY7Ci0KLSAgICAvKgotICAgICAqIGJpdG1hcCB0byB0cmFjayBw aWMgbGV2ZWxzLgotICAgICAqIFRoZSBwaWMgbGV2ZWwgaXMgdGhlIGxvZ2ljYWwgT1Igb2YgYWxs IHRoZSBQQ0kgaXJxcyBtYXBwZWQgdG8gaXQKLSAgICAgKiBTbyBvbmUgUElDIGxldmVsIGlzIHRy YWNrZWQgYnkgUElJWF9OVU1fUElSUVMgYml0cy4KLSAgICAgKgotICAgICAqIFBJUlEgaXMgbWFw cGVkIHRvIFBJQyBwaW5zLCB3ZSB0cmFjayBpdCBieQotICAgICAqIFBJSVhfTlVNX1BJUlFTICog UElJWF9OVU1fUElDX0lSUVMgPSA2NCBiaXRzIHdpdGgKLSAgICAgKiBwaWNfaXJxICogUElJWF9O VU1fUElSUVMgKyBwaXJxCi0gICAgICovCi0jaWYgUElJWF9OVU1fUElDX0lSUVMgKiBQSUlYX05V TV9QSVJRUyA+IDY0Ci0jZXJyb3IgInVuYWJsZSB0byBlbmNvZGUgcGljIHN0YXRlIGluIDY0Yml0 IGluIHBpY19sZXZlbHMuIgotI2VuZGlmCi0gICAgdWludDY0X3QgcGljX2xldmVsczsKLQotICAg IHFlbXVfaXJxICpwaWM7Ci0KLSAgICAvKiBUaGlzIG1lbWJlciBpc24ndCB1c2VkLiBKdXN0IGZv ciBzYXZlL2xvYWQgY29tcGF0aWJpbGl0eSAqLwotICAgIGludDMyX3QgcGNpX2lycV9sZXZlbHNf dm1zdGF0ZVtQSUlYX05VTV9QSVJRU107Ci0KLSAgICAvKiBSZXNldCBDb250cm9sIFJlZ2lzdGVy IGNvbnRlbnRzICovCi0gICAgdWludDhfdCByY3I7Ci0KLSAgICAvKiBJTyBtZW1vcnkgcmVnaW9u IGZvciBSZXNldCBDb250cm9sIFJlZ2lzdGVyIChSQ1JfSU9QT1JUKSAqLwotICAgIE1lbW9yeVJl Z2lvbiByY3JfbWVtOwotfSBQSUlYM1N0YXRlOwotCi0jZGVmaW5lIFRZUEVfUElJWDNfUENJX0RF VklDRSAicGNpLXBpaXgzIgotI2RlZmluZSBQSUlYM19QQ0lfREVWSUNFKG9iaikgXAotICAgIE9C SkVDVF9DSEVDSyhQSUlYM1N0YXRlLCAob2JqKSwgVFlQRV9QSUlYM19QQ0lfREVWSUNFKQotCiAj ZGVmaW5lIEk0NDBGWF9QQ0lfREVWSUNFKG9iaikgXAogICAgIE9CSkVDVF9DSEVDSyhQQ0lJNDQw RlhTdGF0ZSwgKG9iaiksIFRZUEVfSTQ0MEZYX1BDSV9ERVZJQ0UpCiAKLSNkZWZpbmUgVFlQRV9Q SUlYM19ERVZJQ0UgIlBJSVgzIgotI2RlZmluZSBUWVBFX1BJSVgzX1hFTl9ERVZJQ0UgIlBJSVgz LXhlbiIKLQogc3RydWN0IFBDSUk0NDBGWFN0YXRlIHsKICAgICAvKjwgcHJpdmF0ZSA+Ki8KICAg ICBQQ0lEZXZpY2UgcGFyZW50X29iajsKQEAgLTEyOCwyMiArODEsNiBAQCBzdHJ1Y3QgUENJSTQ0 MEZYU3RhdGUgewogICovCiAjZGVmaW5lIEk0NDBGWF9DT1JFQk9PVF9SQU1fU0laRSAweDU3CiAK LXN0YXRpYyB2b2lkIHBpaXgzX3NldF9pcnEodm9pZCAqb3BhcXVlLCBpbnQgcGlycSwgaW50IGxl dmVsKTsKLXN0YXRpYyBQQ0lJTlR4Um91dGUgcGlpeDNfcm91dGVfaW50eF9waW5fdG9faXJxKHZv aWQgKm9wYXF1ZSwgaW50IHBjaV9pbnR4KTsKLXN0YXRpYyB2b2lkIHBpaXgzX3dyaXRlX2NvbmZp Z194ZW4oUENJRGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlu dDMyX3QgYWRkcmVzcywgdWludDMyX3QgdmFsLCBpbnQgbGVuKTsKLQotLyoKLSAqIFJldHVybiB0 aGUgZ2xvYmFsIGlycSBudW1iZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGRldmljZSBpcnEK LSAqIHBpbi4gV2UgY291bGQgYWxzbyB1c2UgdGhlIGJ1cyBudW1iZXIgdG8gaGF2ZSBhIG1vcmUg cHJlY2lzZSBtYXBwaW5nLgotICovCi1zdGF0aWMgaW50IHBjaV9zbG90X2dldF9waXJxKFBDSURl dmljZSAqcGNpX2RldiwgaW50IHBjaV9pbnR4KQotewotICAgIGludCBzbG90X2FkZGVuZDsKLSAg ICBzbG90X2FkZGVuZCA9IChwY2lfZGV2LT5kZXZmbiA+PiAzKSAtIDE7Ci0gICAgcmV0dXJuIChw Y2lfaW50eCArIHNsb3RfYWRkZW5kKSAmIDM7Ci19Ci0KIHN0YXRpYyB2b2lkIGk0NDBmeF91cGRh dGVfbWVtb3J5X21hcHBpbmdzKFBDSUk0NDBGWFN0YXRlICpkKQogewogICAgIGludCBpOwpAQCAt MzMzLDM2ICsyNzAsNiBAQCBzdGF0aWMgdm9pZCBpNDQwZnhfcmVhbGl6ZShQQ0lEZXZpY2UgKmRl diwgRXJyb3IgKiplcnJwKQogICAgIH0KIH0KIAotc3RhdGljIFBJSVgzU3RhdGUgKnBpaXgzX2Ny ZWF0ZShQQ0lCdXMgKnBjaV9idXMsIElTQUJ1cyAqKmlzYV9idXMpCi17Ci0gICAgUElJWDNTdGF0 ZSAqcGlpeDM7Ci0gICAgUENJRGV2aWNlICpwY2lfZGV2OwotCi0gICAgLyoKLSAgICAgKiBYZW4g c3VwcG9ydHMgYWRkaXRpb25hbCBpbnRlcnJ1cHQgcm91dGVzIGZyb20gdGhlIFBDSSBkZXZpY2Vz IHRvCi0gICAgICogdGhlIElPQVBJQzogdGhlIGZvdXIgcGlucyBvZiBlYWNoIFBDSSBkZXZpY2Ug b24gdGhlIGJ1cyBhcmUgYWxzbwotICAgICAqIGNvbm5lY3RlZCB0byB0aGUgSU9BUElDIGRpcmVj dGx5LgotICAgICAqIFRoZXNlIGFkZGl0aW9uYWwgcm91dGVzIGNhbiBiZSBkaXNjb3ZlcmVkIHRo cm91Z2ggQUNQSS4KLSAgICAgKi8KLSAgICBpZiAoeGVuX2VuYWJsZWQoKSkgewotICAgICAgICBw Y2lfZGV2ID0gcGNpX2NyZWF0ZV9zaW1wbGVfbXVsdGlmdW5jdGlvbihwY2lfYnVzLCAtMSwgdHJ1 ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQ RV9QSUlYM19YRU5fREVWSUNFKTsKLSAgICAgICAgcGlpeDMgPSBQSUlYM19QQ0lfREVWSUNFKHBj aV9kZXYpOwotICAgICAgICBwY2lfYnVzX2lycXMocGNpX2J1cywgeGVuX3BpaXgzX3NldF9pcnEs IHhlbl9wY2lfc2xvdF9nZXRfcGlycSwKLSAgICAgICAgICAgICAgICAgICAgIHBpaXgzLCBYRU5f UElJWF9OVU1fUElSUVMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBjaV9kZXYgPSBwY2lfY3Jl YXRlX3NpbXBsZV9tdWx0aWZ1bmN0aW9uKHBjaV9idXMsIC0xLCB0cnVlLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1BJSVgzX0RFVklDRSk7 Ci0gICAgICAgIHBpaXgzID0gUElJWDNfUENJX0RFVklDRShwY2lfZGV2KTsKLSAgICAgICAgcGNp X2J1c19pcnFzKHBjaV9idXMsIHBpaXgzX3NldF9pcnEsIHBjaV9zbG90X2dldF9waXJxLAotICAg ICAgICAgICAgICAgICAgICAgcGlpeDMsIFBJSVhfTlVNX1BJUlFTKTsKLSAgICAgICAgcGNpX2J1 c19zZXRfcm91dGVfaXJxX2ZuKHBjaV9idXMsIHBpaXgzX3JvdXRlX2ludHhfcGluX3RvX2lycSk7 Ci0gICAgfQotICAgICppc2FfYnVzID0gSVNBX0JVUyhxZGV2X2dldF9jaGlsZF9idXMoREVWSUNF KHBpaXgzKSwgImlzYS4wIikpOwotCi0gICAgcmV0dXJuIHBpaXgzOwotfQotCiBQQ0lCdXMgKmk0 NDBmeF9pbml0KGNvbnN0IGNoYXIgKmhvc3RfdHlwZSwgY29uc3QgY2hhciAqcGNpX3R5cGUsCiAg ICAgICAgICAgICAgICAgICAgIFBDSUk0NDBGWFN0YXRlICoqcGk0NDBmeF9zdGF0ZSwKICAgICAg ICAgICAgICAgICAgICAgaW50ICpwaWl4M19kZXZmbiwKQEAgLTQ1NSwzMTIgKzM2Miw2IEBAIFBD SUJ1cyAqZmluZF9pNDQwZngodm9pZCkKICAgICByZXR1cm4gcyA/IHMtPmJ1cyA6IE5VTEw7CiB9 CiAKLS8qIFBJSVgzIFBDSSB0byBJU0EgYnJpZGdlICovCi1zdGF0aWMgdm9pZCBwaWl4M19zZXRf aXJxX3BpYyhQSUlYM1N0YXRlICpwaWl4MywgaW50IHBpY19pcnEpCi17Ci0gICAgcWVtdV9zZXRf aXJxKHBpaXgzLT5waWNbcGljX2lycV0sCi0gICAgICAgICAgICAgICAgICEhKHBpaXgzLT5waWNf bGV2ZWxzICYKLSAgICAgICAgICAgICAgICAgICAgKCgoMVVMTCA8PCBQSUlYX05VTV9QSVJRUykg LSAxKSA8PAotICAgICAgICAgICAgICAgICAgICAgKHBpY19pcnEgKiBQSUlYX05VTV9QSVJRUykp KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpaXgzX3NldF9pcnFfbGV2ZWxfaW50ZXJuYWwoUElJWDNT dGF0ZSAqcGlpeDMsIGludCBwaXJxLCBpbnQgbGV2ZWwpCi17Ci0gICAgaW50IHBpY19pcnE7Ci0g ICAgdWludDY0X3QgbWFzazsKLQotICAgIHBpY19pcnEgPSBwaWl4My0+ZGV2LmNvbmZpZ1tQSUlY X1BJUlFDQSArIHBpcnFdOwotICAgIGlmIChwaWNfaXJxID49IFBJSVhfTlVNX1BJQ19JUlFTKSB7 Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtYXNrID0gMVVMTCA8PCAoKHBpY19pcnEg KiBQSUlYX05VTV9QSVJRUykgKyBwaXJxKTsKLSAgICBwaWl4My0+cGljX2xldmVscyAmPSB+bWFz azsKLSAgICBwaWl4My0+cGljX2xldmVscyB8PSBtYXNrICogISFsZXZlbDsKLX0KLQotc3RhdGlj IHZvaWQgcGlpeDNfc2V0X2lycV9sZXZlbChQSUlYM1N0YXRlICpwaWl4MywgaW50IHBpcnEsIGlu dCBsZXZlbCkKLXsKLSAgICBpbnQgcGljX2lycTsKLQotICAgIHBpY19pcnEgPSBwaWl4My0+ZGV2 LmNvbmZpZ1tQSUlYX1BJUlFDQSArIHBpcnFdOwotICAgIGlmIChwaWNfaXJxID49IFBJSVhfTlVN X1BJQ19JUlFTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwaWl4M19zZXRfaXJx X2xldmVsX2ludGVybmFsKHBpaXgzLCBwaXJxLCBsZXZlbCk7Ci0KLSAgICBwaWl4M19zZXRfaXJx X3BpYyhwaWl4MywgcGljX2lycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBpaXgzX3NldF9pcnEodm9p ZCAqb3BhcXVlLCBpbnQgcGlycSwgaW50IGxldmVsKQotewotICAgIFBJSVgzU3RhdGUgKnBpaXgz ID0gb3BhcXVlOwotICAgIHBpaXgzX3NldF9pcnFfbGV2ZWwocGlpeDMsIHBpcnEsIGxldmVsKTsK LX0KLQotc3RhdGljIFBDSUlOVHhSb3V0ZSBwaWl4M19yb3V0ZV9pbnR4X3Bpbl90b19pcnEodm9p ZCAqb3BhcXVlLCBpbnQgcGluKQotewotICAgIFBJSVgzU3RhdGUgKnBpaXgzID0gb3BhcXVlOwot ICAgIGludCBpcnEgPSBwaWl4My0+ZGV2LmNvbmZpZ1tQSUlYX1BJUlFDQSArIHBpbl07Ci0gICAg UENJSU5UeFJvdXRlIHJvdXRlOwotCi0gICAgaWYgKGlycSA8IFBJSVhfTlVNX1BJQ19JUlFTKSB7 Ci0gICAgICAgIHJvdXRlLm1vZGUgPSBQQ0lfSU5UWF9FTkFCTEVEOwotICAgICAgICByb3V0ZS5p cnEgPSBpcnE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcm91dGUubW9kZSA9IFBDSV9JTlRYX0RJ U0FCTEVEOwotICAgICAgICByb3V0ZS5pcnEgPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIHJvdXRl OwotfQotCi0vKiBpcnEgcm91dGluZyBpcyBjaGFuZ2VkLiBzbyByZWJ1aWxkIGJpdG1hcCAqLwot c3RhdGljIHZvaWQgcGlpeDNfdXBkYXRlX2lycV9sZXZlbHMoUElJWDNTdGF0ZSAqcGlpeDMpCi17 Ci0gICAgUENJQnVzICpidXMgPSBwY2lfZ2V0X2J1cygmcGlpeDMtPmRldik7Ci0gICAgaW50IHBp cnE7Ci0KLSAgICBwaWl4My0+cGljX2xldmVscyA9IDA7Ci0gICAgZm9yIChwaXJxID0gMDsgcGly cSA8IFBJSVhfTlVNX1BJUlFTOyBwaXJxKyspIHsKLSAgICAgICAgcGlpeDNfc2V0X2lycV9sZXZl bChwaWl4MywgcGlycSwgcGNpX2J1c19nZXRfaXJxX2xldmVsKGJ1cywgcGlycSkpOwotICAgIH0K LX0KLQotc3RhdGljIHZvaWQgcGlpeDNfd3JpdGVfY29uZmlnKFBDSURldmljZSAqZGV2LAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IHZh bCwgaW50IGxlbikKLXsKLSAgICBwY2lfZGVmYXVsdF93cml0ZV9jb25maWcoZGV2LCBhZGRyZXNz LCB2YWwsIGxlbik7Ci0gICAgaWYgKHJhbmdlc19vdmVybGFwKGFkZHJlc3MsIGxlbiwgUElJWF9Q SVJRQ0EsIDQpKSB7Ci0gICAgICAgIFBJSVgzU3RhdGUgKnBpaXgzID0gUElJWDNfUENJX0RFVklD RShkZXYpOwotICAgICAgICBpbnQgcGljX2lycTsKLQotICAgICAgICBwY2lfYnVzX2ZpcmVfaW50 eF9yb3V0aW5nX25vdGlmaWVyKHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KSk7Ci0gICAgICAgIHBp aXgzX3VwZGF0ZV9pcnFfbGV2ZWxzKHBpaXgzKTsKLSAgICAgICAgZm9yIChwaWNfaXJxID0gMDsg cGljX2lycSA8IFBJSVhfTlVNX1BJQ19JUlFTOyBwaWNfaXJxKyspIHsKLSAgICAgICAgICAgIHBp aXgzX3NldF9pcnFfcGljKHBpaXgzLCBwaWNfaXJxKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQot c3RhdGljIHZvaWQgcGlpeDNfd3JpdGVfY29uZmlnX3hlbihQQ0lEZXZpY2UgKmRldiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWws IGludCBsZW4pCi17Ci0gICAgeGVuX3BpaXhfcGNpX3dyaXRlX2NvbmZpZ19jbGllbnQoYWRkcmVz cywgdmFsLCBsZW4pOwotICAgIHBpaXgzX3dyaXRlX2NvbmZpZyhkZXYsIGFkZHJlc3MsIHZhbCwg bGVuKTsKLX0KLQotc3RhdGljIHZvaWQgcGlpeDNfcmVzZXQodm9pZCAqb3BhcXVlKQotewotICAg IFBJSVgzU3RhdGUgKmQgPSBvcGFxdWU7Ci0gICAgdWludDhfdCAqcGNpX2NvbmYgPSBkLT5kZXYu Y29uZmlnOwotCi0gICAgcGNpX2NvbmZbMHgwNF0gPSAweDA3OyAvKiBtYXN0ZXIsIG1lbW9yeSBh bmQgSS9PICovCi0gICAgcGNpX2NvbmZbMHgwNV0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4MDZd ID0gMHgwMDsKLSAgICBwY2lfY29uZlsweDA3XSA9IDB4MDI7IC8qIFBDSV9zdGF0dXNfZGV2c2Vs X21lZGl1bSAqLwotICAgIHBjaV9jb25mWzB4NGNdID0gMHg0ZDsKLSAgICBwY2lfY29uZlsweDRl XSA9IDB4MDM7Ci0gICAgcGNpX2NvbmZbMHg0Zl0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4NjBd ID0gMHg4MDsKLSAgICBwY2lfY29uZlsweDYxXSA9IDB4ODA7Ci0gICAgcGNpX2NvbmZbMHg2Ml0g PSAweDgwOwotICAgIHBjaV9jb25mWzB4NjNdID0gMHg4MDsKLSAgICBwY2lfY29uZlsweDY5XSA9 IDB4MDI7Ci0gICAgcGNpX2NvbmZbMHg3MF0gPSAweDgwOwotICAgIHBjaV9jb25mWzB4NzZdID0g MHgwYzsKLSAgICBwY2lfY29uZlsweDc3XSA9IDB4MGM7Ci0gICAgcGNpX2NvbmZbMHg3OF0gPSAw eDAyOwotICAgIHBjaV9jb25mWzB4NzldID0gMHgwMDsKLSAgICBwY2lfY29uZlsweDgwXSA9IDB4 MDA7Ci0gICAgcGNpX2NvbmZbMHg4Ml0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4YTBdID0gMHgw ODsKLSAgICBwY2lfY29uZlsweGEyXSA9IDB4MDA7Ci0gICAgcGNpX2NvbmZbMHhhM10gPSAweDAw OwotICAgIHBjaV9jb25mWzB4YTRdID0gMHgwMDsKLSAgICBwY2lfY29uZlsweGE1XSA9IDB4MDA7 Ci0gICAgcGNpX2NvbmZbMHhhNl0gPSAweDAwOwotICAgIHBjaV9jb25mWzB4YTddID0gMHgwMDsK LSAgICBwY2lfY29uZlsweGE4XSA9IDB4MGY7Ci0gICAgcGNpX2NvbmZbMHhhYV0gPSAweDAwOwot ICAgIHBjaV9jb25mWzB4YWJdID0gMHgwMDsKLSAgICBwY2lfY29uZlsweGFjXSA9IDB4MDA7Ci0g ICAgcGNpX2NvbmZbMHhhZV0gPSAweDAwOwotCi0gICAgZC0+cGljX2xldmVscyA9IDA7Ci0gICAg ZC0+cmNyID0gMDsKLX0KLQotc3RhdGljIGludCBwaWl4M19wb3N0X2xvYWQodm9pZCAqb3BhcXVl LCBpbnQgdmVyc2lvbl9pZCkKLXsKLSAgICBQSUlYM1N0YXRlICpwaWl4MyA9IG9wYXF1ZTsKLSAg ICBpbnQgcGlycTsKLQotICAgIC8qIEJlY2F1c2UgdGhlIGk4MjU5IGhhcyBub3QgYmVlbiBkZXNl cmlhbGl6ZWQgeWV0LCBxZW11X2lycV9yYWlzZQotICAgICAqIG1pZ2h0IGJyaW5nIHRoZSBzeXN0 ZW0gdG8gYSBkaWZmZXJlbnQgc3RhdGUgdGhhbiB0aGUgc2F2ZWQgb25lOwotICAgICAqIGZvciBl eGFtcGxlLCB0aGUgaW50ZXJydXB0IGNvdWxkIGJlIG1hc2tlZCBidXQgdGhlIGk4MjU5IHdvdWxk Ci0gICAgICogbm90IGtub3cgdGhhdCB5ZXQgYW5kIHdvdWxkIHRyaWdnZXIgYW4gaW50ZXJydXB0 IGluIHRoZSBDUFUuCi0gICAgICoKLSAgICAgKiBIZXJlLCB3ZSB1cGRhdGUgaXJxIGxldmVscyB3 aXRob3V0IHJhaXNpbmcgdGhlIGludGVycnVwdC4KLSAgICAgKiBJbnRlcnJ1cHQgc3RhdGUgd2ls bCBiZSBkZXNlcmlhbGl6ZWQgc2VwYXJhdGVseSB0aHJvdWdoIHRoZSBpODI1OS4KLSAgICAgKi8K LSAgICBwaWl4My0+cGljX2xldmVscyA9IDA7Ci0gICAgZm9yIChwaXJxID0gMDsgcGlycSA8IFBJ SVhfTlVNX1BJUlFTOyBwaXJxKyspIHsKLSAgICAgICAgcGlpeDNfc2V0X2lycV9sZXZlbF9pbnRl cm5hbChwaWl4MywgcGlycSwKLSAgICAgICAgICAgIHBjaV9idXNfZ2V0X2lycV9sZXZlbChwY2lf Z2V0X2J1cygmcGlpeDMtPmRldiksIHBpcnEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0K LXN0YXRpYyBpbnQgcGlpeDNfcHJlX3NhdmUodm9pZCAqb3BhcXVlKQotewotICAgIGludCBpOwot ICAgIFBJSVgzU3RhdGUgKnBpaXgzID0gb3BhcXVlOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUocGlpeDMtPnBjaV9pcnFfbGV2ZWxzX3Ztc3RhdGUpOyBpKyspIHsKLSAgICAgICAg cGlpeDMtPnBjaV9pcnFfbGV2ZWxzX3Ztc3RhdGVbaV0gPQotICAgICAgICAgICAgcGNpX2J1c19n ZXRfaXJxX2xldmVsKHBjaV9nZXRfYnVzKCZwaWl4My0+ZGV2KSwgaSk7Ci0gICAgfQotCi0gICAg cmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIHBpaXgzX3Jjcl9uZWVkZWQodm9pZCAqb3BhcXVl KQotewotICAgIFBJSVgzU3RhdGUgKnBpaXgzID0gb3BhcXVlOwotCi0gICAgcmV0dXJuIChwaWl4 My0+cmNyICE9IDApOwotfQotCi1zdGF0aWMgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uIHZtc3Rh dGVfcGlpeDNfcmNyID0gewotICAgIC5uYW1lID0gIlBJSVgzL3JjciIsCi0gICAgLnZlcnNpb25f aWQgPSAxLAotICAgIC5taW5pbXVtX3ZlcnNpb25faWQgPSAxLAotICAgIC5uZWVkZWQgPSBwaWl4 M19yY3JfbmVlZGVkLAotICAgIC5maWVsZHMgPSAoVk1TdGF0ZUZpZWxkW10pIHsKLSAgICAgICAg Vk1TVEFURV9VSU5UOChyY3IsIFBJSVgzU3RhdGUpLAotICAgICAgICBWTVNUQVRFX0VORF9PRl9M SVNUKCkKLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uIHZtc3Rh dGVfcGlpeDMgPSB7Ci0gICAgLm5hbWUgPSAiUElJWDMiLAotICAgIC52ZXJzaW9uX2lkID0gMywK LSAgICAubWluaW11bV92ZXJzaW9uX2lkID0gMiwKLSAgICAucG9zdF9sb2FkID0gcGlpeDNfcG9z dF9sb2FkLAotICAgIC5wcmVfc2F2ZSA9IHBpaXgzX3ByZV9zYXZlLAotICAgIC5maWVsZHMgPSAo Vk1TdGF0ZUZpZWxkW10pIHsKLSAgICAgICAgVk1TVEFURV9QQ0lfREVWSUNFKGRldiwgUElJWDNT dGF0ZSksCi0gICAgICAgIFZNU1RBVEVfSU5UMzJfQVJSQVlfVihwY2lfaXJxX2xldmVsc192bXN0 YXRlLCBQSUlYM1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElJWF9OVU1f UElSUVMsIDMpLAotICAgICAgICBWTVNUQVRFX0VORF9PRl9MSVNUKCkKLSAgICB9LAotICAgIC5z dWJzZWN0aW9ucyA9IChjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24qW10pIHsKLSAgICAgICAgJnZt c3RhdGVfcGlpeDNfcmNyLAotICAgICAgICBOVUxMCi0gICAgfQotfTsKLQotCi1zdGF0aWMgdm9p ZCByY3Jfd3JpdGUodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdWludDY0X3QgdmFsLCB1bnNp Z25lZCBsZW4pCi17Ci0gICAgUElJWDNTdGF0ZSAqZCA9IG9wYXF1ZTsKLQotICAgIGlmICh2YWwg JiA0KSB7Ci0gICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoU0hVVERPV05fQ0FVU0Vf R1VFU1RfUkVTRVQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGQtPnJjciA9IHZhbCAm IDI7IC8qIGtlZXAgU3lzdGVtIFJlc2V0IHR5cGUgb25seSAqLwotfQotCi1zdGF0aWMgdWludDY0 X3QgcmNyX3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdW5zaWduZWQgbGVuKQotewot ICAgIFBJSVgzU3RhdGUgKmQgPSBvcGFxdWU7Ci0KLSAgICByZXR1cm4gZC0+cmNyOwotfQotCi1z dGF0aWMgY29uc3QgTWVtb3J5UmVnaW9uT3BzIHJjcl9vcHMgPSB7Ci0gICAgLnJlYWQgPSByY3Jf cmVhZCwKLSAgICAud3JpdGUgPSByY3Jfd3JpdGUsCi0gICAgLmVuZGlhbm5lc3MgPSBERVZJQ0Vf TElUVExFX0VORElBTgotfTsKLQotc3RhdGljIHZvaWQgcGlpeDNfcmVhbGl6ZShQQ0lEZXZpY2Ug KmRldiwgRXJyb3IgKiplcnJwKQotewotICAgIFBJSVgzU3RhdGUgKmQgPSBQSUlYM19QQ0lfREVW SUNFKGRldik7Ci0KLSAgICBpZiAoIWlzYV9idXNfbmV3KERFVklDRShkKSwgZ2V0X3N5c3RlbV9t ZW1vcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgIHBjaV9hZGRyZXNzX3NwYWNlX2lvKGRldiks IGVycnApKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1vcnlfcmVnaW9uX2lu aXRfaW8oJmQtPnJjcl9tZW0sIE9CSkVDVChkZXYpLCAmcmNyX29wcywgZCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgInBpaXgzLXJlc2V0LWNvbnRyb2wiLCAxKTsKLSAgICBtZW1vcnlfcmVn aW9uX2FkZF9zdWJyZWdpb25fb3ZlcmxhcChwY2lfYWRkcmVzc19zcGFjZV9pbyhkZXYpLCBSQ1Jf SU9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLT5yY3Jf bWVtLCAxKTsKLQotICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQocGlpeDNfcmVzZXQsIGQpOwotfQot Ci1zdGF0aWMgdm9pZCBwY2lfcGlpeDNfY2xhc3NfaW5pdChPYmplY3RDbGFzcyAqa2xhc3MsIHZv aWQgKmRhdGEpCi17Ci0gICAgRGV2aWNlQ2xhc3MgKmRjID0gREVWSUNFX0NMQVNTKGtsYXNzKTsK LSAgICBQQ0lEZXZpY2VDbGFzcyAqayA9IFBDSV9ERVZJQ0VfQ0xBU1Moa2xhc3MpOwotCi0gICAg ZGMtPmRlc2MgICAgICAgID0gIklTQSBicmlkZ2UiOwotICAgIGRjLT52bXNkICAgICAgICA9ICZ2 bXN0YXRlX3BpaXgzOwotICAgIGRjLT5ob3RwbHVnZ2FibGUgICA9IGZhbHNlOwotICAgIGstPnJl YWxpemUgICAgICA9IHBpaXgzX3JlYWxpemU7Ci0gICAgay0+dmVuZG9yX2lkICAgID0gUENJX1ZF TkRPUl9JRF9JTlRFTDsKLSAgICAvKiA4MjM3MVNCIFBJSVgzIFBDSS10by1JU0EgYnJpZGdlIChT dGVwIEExKSAqLwotICAgIGstPmRldmljZV9pZCAgICA9IFBDSV9ERVZJQ0VfSURfSU5URUxfODIz NzFTQl8wOwotICAgIGstPmNsYXNzX2lkICAgICA9IFBDSV9DTEFTU19CUklER0VfSVNBOwotICAg IC8qCi0gICAgICogUmVhc29uOiBwYXJ0IG9mIFBJSVgzIHNvdXRoYnJpZGdlLCBuZWVkcyB0byBi ZSB3aXJlZCB1cCBieQotICAgICAqIHBjX3BpaXguYydzIHBjX2luaXQxKCkKLSAgICAgKi8KLSAg ICBkYy0+dXNlcl9jcmVhdGFibGUgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IFR5cGVJbmZv IHBpaXgzX3BjaV90eXBlX2luZm8gPSB7Ci0gICAgLm5hbWUgPSBUWVBFX1BJSVgzX1BDSV9ERVZJ Q0UsCi0gICAgLnBhcmVudCA9IFRZUEVfUENJX0RFVklDRSwKLSAgICAuaW5zdGFuY2Vfc2l6ZSA9 IHNpemVvZihQSUlYM1N0YXRlKSwKLSAgICAuYWJzdHJhY3QgPSB0cnVlLAotICAgIC5jbGFzc19p bml0ID0gcGNpX3BpaXgzX2NsYXNzX2luaXQsCi0gICAgLmludGVyZmFjZXMgPSAoSW50ZXJmYWNl SW5mb1tdKSB7Ci0gICAgICAgIHsgSU5URVJGQUNFX0NPTlZFTlRJT05BTF9QQ0lfREVWSUNFIH0s Ci0gICAgICAgIHsgfSwKLSAgICB9LAotfTsKLQotc3RhdGljIHZvaWQgcGlpeDNfY2xhc3NfaW5p dChPYmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKmRhdGEpCi17Ci0gICAgUENJRGV2aWNlQ2xhc3Mg KmsgPSBQQ0lfREVWSUNFX0NMQVNTKGtsYXNzKTsKLQotICAgIGstPmNvbmZpZ193cml0ZSA9IHBp aXgzX3dyaXRlX2NvbmZpZzsKLX0KLQotc3RhdGljIGNvbnN0IFR5cGVJbmZvIHBpaXgzX2luZm8g PSB7Ci0gICAgLm5hbWUgICAgICAgICAgPSBUWVBFX1BJSVgzX0RFVklDRSwKLSAgICAucGFyZW50 ICAgICAgICA9IFRZUEVfUElJWDNfUENJX0RFVklDRSwKLSAgICAuY2xhc3NfaW5pdCAgICA9IHBp aXgzX2NsYXNzX2luaXQsCi19OwotCi1zdGF0aWMgdm9pZCBwaWl4M194ZW5fY2xhc3NfaW5pdChP YmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKmRhdGEpCi17Ci0gICAgUENJRGV2aWNlQ2xhc3MgKmsg PSBQQ0lfREVWSUNFX0NMQVNTKGtsYXNzKTsKLQotICAgIGstPmNvbmZpZ193cml0ZSA9IHBpaXgz X3dyaXRlX2NvbmZpZ194ZW47Ci19OwotCi1zdGF0aWMgY29uc3QgVHlwZUluZm8gcGlpeDNfeGVu X2luZm8gPSB7Ci0gICAgLm5hbWUgICAgICAgICAgPSBUWVBFX1BJSVgzX1hFTl9ERVZJQ0UsCi0g ICAgLnBhcmVudCAgICAgICAgPSBUWVBFX1BJSVgzX1BDSV9ERVZJQ0UsCi0gICAgLmNsYXNzX2lu aXQgICAgPSBwaWl4M194ZW5fY2xhc3NfaW5pdCwKLX07Ci0KIHN0YXRpYyB2b2lkIGk0NDBmeF9j bGFzc19pbml0KE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqZGF0YSkKIHsKICAgICBEZXZpY2VD bGFzcyAqZGMgPSBERVZJQ0VfQ0xBU1Moa2xhc3MpOwpAQCAtOTIyLDkgKzUyMyw2IEBAIHN0YXRp YyB2b2lkIGk0NDBmeF9yZWdpc3Rlcl90eXBlcyh2b2lkKQogewogICAgIHR5cGVfcmVnaXN0ZXJf c3RhdGljKCZpNDQwZnhfaW5mbyk7CiAgICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJmlnZF9wYXNz dGhyb3VnaF9pNDQwZnhfaW5mbyk7Ci0gICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJnBpaXgzX3Bj aV90eXBlX2luZm8pOwotICAgIHR5cGVfcmVnaXN0ZXJfc3RhdGljKCZwaWl4M19pbmZvKTsKLSAg ICB0eXBlX3JlZ2lzdGVyX3N0YXRpYygmcGlpeDNfeGVuX2luZm8pOwogICAgIHR5cGVfcmVnaXN0 ZXJfc3RhdGljKCZpNDQwZnhfcGNpaG9zdF9pbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9ody9zb3V0aGJyaWRnZS9waWl4LmggYi9pbmNsdWRlL2h3L3NvdXRoYnJpZGdlL3BpaXguaApp bmRleCA5YzkyYzM3YTRkLi4zMjRhM2E5OWZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2h3L3NvdXRo YnJpZGdlL3BpaXguaAorKysgYi9pbmNsdWRlL2h3L3NvdXRoYnJpZGdlL3BpaXguaApAQCAtMTIs NiArMTIsOCBAQAogI2lmbmRlZiBIV19TT1VUSEJSSURHRV9QSUlYX0gKICNkZWZpbmUgSFdfU09V VEhCUklER0VfUElJWF9ICiAKKyNpbmNsdWRlICJody9wY2kvcGNpLmgiCisKICNkZWZpbmUgVFlQ RV9QSUlYNF9QTSAiUElJWDRfUE0iCiAKIEkyQ0J1cyAqcGlpeDRfcG1faW5pdChQQ0lCdXMgKmJ1 cywgaW50IGRldmZuLCB1aW50MzJfdCBzbWJfaW9fYmFzZSwKQEAgLTMwLDggKzMyLDQyIEBAIEky Q0J1cyAqcGlpeDRfcG1faW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuLCB1aW50MzJfdCBzbWJf aW9fYmFzZSwKICAqLwogI2RlZmluZSBSQ1JfSU9QT1JUIDB4Y2Y5CiAKKyNkZWZpbmUgUElJWF9O VU1fUElDX0lSUVMgICAgICAgMTYgICAgICAvKiBpODI1OSAqIDIgKi8KKyNkZWZpbmUgUElJWF9O VU1fUElSUVMgICAgICAgICAgNFVMTCAgICAvKiBQSVJRW0EtRF0gKi8KKwordHlwZWRlZiBzdHJ1 Y3QgUElJWFN0YXRlIHsKKyAgICBQQ0lEZXZpY2UgZGV2OworCisgICAgLyoKKyAgICAgKiBiaXRt YXAgdG8gdHJhY2sgcGljIGxldmVscy4KKyAgICAgKiBUaGUgcGljIGxldmVsIGlzIHRoZSBsb2dp Y2FsIE9SIG9mIGFsbCB0aGUgUENJIGlycXMgbWFwcGVkIHRvIGl0CisgICAgICogU28gb25lIFBJ QyBsZXZlbCBpcyB0cmFja2VkIGJ5IFBJSVhfTlVNX1BJUlFTIGJpdHMuCisgICAgICoKKyAgICAg KiBQSVJRIGlzIG1hcHBlZCB0byBQSUMgcGlucywgd2UgdHJhY2sgaXQgYnkKKyAgICAgKiBQSUlY X05VTV9QSVJRUyAqIFBJSVhfTlVNX1BJQ19JUlFTID0gNjQgYml0cyB3aXRoCisgICAgICogcGlj X2lycSAqIFBJSVhfTlVNX1BJUlFTICsgcGlycQorICAgICAqLworI2lmIFBJSVhfTlVNX1BJQ19J UlFTICogUElJWF9OVU1fUElSUVMgPiA2NAorI2Vycm9yICJ1bmFibGUgdG8gZW5jb2RlIHBpYyBz dGF0ZSBpbiA2NGJpdCBpbiBwaWNfbGV2ZWxzLiIKKyNlbmRpZgorICAgIHVpbnQ2NF90IHBpY19s ZXZlbHM7CisKKyAgICBxZW11X2lycSAqcGljOworCisgICAgLyogVGhpcyBtZW1iZXIgaXNuJ3Qg dXNlZC4gSnVzdCBmb3Igc2F2ZS9sb2FkIGNvbXBhdGliaWxpdHkgKi8KKyAgICBpbnQzMl90IHBj aV9pcnFfbGV2ZWxzX3Ztc3RhdGVbUElJWF9OVU1fUElSUVNdOworCisgICAgLyogUmVzZXQgQ29u dHJvbCBSZWdpc3RlciBjb250ZW50cyAqLworICAgIHVpbnQ4X3QgcmNyOworCisgICAgLyogSU8g bWVtb3J5IHJlZ2lvbiBmb3IgUmVzZXQgQ29udHJvbCBSZWdpc3RlciAoUkNSX0lPUE9SVCkgKi8K KyAgICBNZW1vcnlSZWdpb24gcmNyX21lbTsKK30gUElJWDNTdGF0ZTsKKwogZXh0ZXJuIFBDSURl dmljZSAqcGlpeDRfZGV2OwogCitQSUlYM1N0YXRlICpwaWl4M19jcmVhdGUoUENJQnVzICpwY2lf YnVzLCBJU0FCdXMgKippc2FfYnVzKTsKKwogRGV2aWNlU3RhdGUgKnBpaXg0X2NyZWF0ZShQQ0lC dXMgKnBjaV9idXMsIElTQUJ1cyAqKmlzYV9idXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAg IEkyQ0J1cyAqKnNtYnVzLCBzaXplX3QgaWRlX2J1c2VzKTsKIAotLSAKMi4yMS4wCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxp bmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5w cm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA== 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 77353C10F14 for ; Tue, 15 Oct 2019 16:33:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 393132168B for ; Tue, 15 Oct 2019 16:33:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388161AbfJOQdQ (ORCPT ); Tue, 15 Oct 2019 12:33:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45852 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388144AbfJOQdQ (ORCPT ); Tue, 15 Oct 2019 12:33:16 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34CCFC0568FD; Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-35.brq.redhat.com [10.40.204.35]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2776A4518; Tue, 15 Oct 2019 16:33:05 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: Aleksandar Markovic , Aurelien Jarno , Eduardo Habkost , Thomas Huth , Igor Mammedov , Anthony Perard , Stefano Stabellini , Paul Durrant , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , Aleksandar Rikalo , xen-devel@lists.xenproject.org, Laurent Vivier , "Michael S. Tsirkin" , Marcel Apfelbaum , Paolo Bonzini , Richard Henderson , kvm@vger.kernel.org, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH 30/32] hw/pci-host/piix: Extract PIIX3 functions to hw/isa/piix3.c Date: Tue, 15 Oct 2019 18:27:03 +0200 Message-Id: <20191015162705.28087-31-philmd@redhat.com> In-Reply-To: <20191015162705.28087-1-philmd@redhat.com> References: <20191015162705.28087-1-philmd@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Philippe Mathieu-Daudé Move all the PIIX3 functions to a new file: hw/isa/piix3.c. Signed-off-by: Philippe Mathieu-Daudé --- Checkpatch warning: ERROR: spaces required around that '*' (ctx:VxV) #312: FILE: hw/isa/piix3.c:248: + .subsections = (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 +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) += isa-superio.o common-obj-$(CONFIG_APM) += apm.o common-obj-$(CONFIG_I82378) += i82378.o common-obj-$(CONFIG_PC87312) += pc87312.o +common-obj-$(CONFIG_PIIX3) += piix3.o common-obj-$(CONFIG_PIIX4) += piix4.o common-obj-$(CONFIG_VT82C686) += vt82c686.o common-obj-$(CONFIG_SMC37C669) += smc37c669-superio.o diff --git a/hw/isa/piix3.c b/hw/isa/piix3.c new file mode 100644 index 0000000000..05146447ef --- /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 included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 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, int level) +{ + int pic_irq; + uint64_t mask; + + pic_irq = piix3->dev.config[PIIX_PIRQCA + pirq]; + if (pic_irq >= PIIX_NUM_PIC_IRQS) { + return; + } + + mask = 1ULL << ((pic_irq * PIIX_NUM_PIRQS) + pirq); + piix3->pic_levels &= ~mask; + piix3->pic_levels |= mask * !!level; +} + +static void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level) +{ + int pic_irq; + + pic_irq = piix3->dev.config[PIIX_PIRQCA + pirq]; + if (pic_irq >= 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 = opaque; + piix3_set_irq_level(piix3, pirq, level); +} + +static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin) +{ + PIIX3State *piix3 = opaque; + int irq = piix3->dev.config[PIIX_PIRQCA + pin]; + PCIINTxRoute route; + + if (irq < PIIX_NUM_PIC_IRQS) { + route.mode = PCI_INTX_ENABLED; + route.irq = irq; + } else { + route.mode = PCI_INTX_DISABLED; + route.irq = -1; + } + return route; +} + +/* irq routing is changed. so rebuild bitmap */ +static void piix3_update_irq_levels(PIIX3State *piix3) +{ + PCIBus *bus = pci_get_bus(&piix3->dev); + int pirq; + + piix3->pic_levels = 0; + for (pirq = 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 = 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 = 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 = opaque; + uint8_t *pci_conf = d->dev.config; + + pci_conf[0x04] = 0x07; /* master, memory and I/O */ + pci_conf[0x05] = 0x00; + pci_conf[0x06] = 0x00; + pci_conf[0x07] = 0x02; /* PCI_status_devsel_medium */ + pci_conf[0x4c] = 0x4d; + pci_conf[0x4e] = 0x03; + pci_conf[0x4f] = 0x00; + pci_conf[0x60] = 0x80; + pci_conf[0x61] = 0x80; + pci_conf[0x62] = 0x80; + pci_conf[0x63] = 0x80; + pci_conf[0x69] = 0x02; + pci_conf[0x70] = 0x80; + pci_conf[0x76] = 0x0c; + pci_conf[0x77] = 0x0c; + pci_conf[0x78] = 0x02; + pci_conf[0x79] = 0x00; + pci_conf[0x80] = 0x00; + pci_conf[0x82] = 0x00; + pci_conf[0xa0] = 0x08; + pci_conf[0xa2] = 0x00; + pci_conf[0xa3] = 0x00; + pci_conf[0xa4] = 0x00; + pci_conf[0xa5] = 0x00; + pci_conf[0xa6] = 0x00; + pci_conf[0xa7] = 0x00; + pci_conf[0xa8] = 0x0f; + pci_conf[0xaa] = 0x00; + pci_conf[0xab] = 0x00; + pci_conf[0xac] = 0x00; + pci_conf[0xae] = 0x00; + + d->pic_levels = 0; + d->rcr = 0; +} + +static int piix3_post_load(void *opaque, int version_id) +{ + PIIX3State *piix3 = 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 = 0; + for (pirq = 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 = opaque; + + for (i = 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) { + piix3->pci_irq_levels_vmstate[i] = + pci_bus_get_irq_level(pci_get_bus(&piix3->dev), i); + } + + return 0; +} + +static bool piix3_rcr_needed(void *opaque) +{ + PIIX3State *piix3 = opaque; + + return (piix3->rcr != 0); +} + +static const VMStateDescription vmstate_piix3_rcr = { + .name = "PIIX3/rcr", + .version_id = 1, + .minimum_version_id = 1, + .needed = piix3_rcr_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT8(rcr, PIIX3State), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_piix3 = { + .name = "PIIX3", + .version_id = 3, + .minimum_version_id = 2, + .post_load = piix3_post_load, + .pre_save = piix3_pre_save, + .fields = (VMStateField[]) { + VMSTATE_PCI_DEVICE(dev, PIIX3State), + VMSTATE_INT32_ARRAY_V(pci_irq_levels_vmstate, PIIX3State, + PIIX_NUM_PIRQS, 3), + VMSTATE_END_OF_LIST() + }, + .subsections = (const VMStateDescription*[]) { + &vmstate_piix3_rcr, + NULL + } +}; + + +static void rcr_write(void *opaque, hwaddr addr, uint64_t val, unsigned len) +{ + PIIX3State *d = opaque; + + if (val & 4) { + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + return; + } + d->rcr = val & 2; /* keep System Reset type only */ +} + +static uint64_t rcr_read(void *opaque, hwaddr addr, unsigned len) +{ + PIIX3State *d = opaque; + + return d->rcr; +} + +static const MemoryRegionOps rcr_ops = { + .read = rcr_read, + .write = rcr_write, + .endianness = DEVICE_LITTLE_ENDIAN +}; + +static void piix3_realize(PCIDevice *dev, Error **errp) +{ + PIIX3State *d = 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), RCR_IOPORT, + &d->rcr_mem, 1); + + qemu_register_reset(piix3_reset, d); +} + +static void pci_piix3_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + + dc->desc = "ISA bridge"; + dc->vmsd = &vmstate_piix3; + dc->hotpluggable = false; + k->realize = piix3_realize; + k->vendor_id = PCI_VENDOR_ID_INTEL; + /* 82371SB PIIX3 PCI-to-ISA bridge (Step A1) */ + k->device_id = PCI_DEVICE_ID_INTEL_82371SB_0; + k->class_id = PCI_CLASS_BRIDGE_ISA; + /* + * Reason: part of PIIX3 southbridge, needs to be wired up by + * pc_piix.c's pc_init1() + */ + dc->user_creatable = false; +} + +static const TypeInfo piix3_pci_type_info = { + .name = TYPE_PIIX3_PCI_DEVICE, + .parent = TYPE_PCI_DEVICE, + .instance_size = sizeof(PIIX3State), + .abstract = true, + .class_init = pci_piix3_class_init, + .interfaces = (InterfaceInfo[]) { + { INTERFACE_CONVENTIONAL_PCI_DEVICE }, + { }, + }, +}; + +static void piix3_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + + k->config_write = piix3_write_config; +} + +static const TypeInfo piix3_info = { + .name = TYPE_PIIX3_DEVICE, + .parent = TYPE_PIIX3_PCI_DEVICE, + .class_init = piix3_class_init, +}; + +static void piix3_xen_class_init(ObjectClass *klass, void *data) +{ + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + + k->config_write = piix3_write_config_xen; +}; + +static const TypeInfo piix3_xen_info = { + .name = TYPE_PIIX3_XEN_DEVICE, + .parent = TYPE_PIIX3_PCI_DEVICE, + .class_init = 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 = (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 = pci_create_simple_multifunction(pci_bus, -1, true, + TYPE_PIIX3_XEN_DEVICE); + piix3 = 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 = pci_create_simple_multifunction(pci_bus, -1, true, + TYPE_PIIX3_DEVICE); + piix3 = 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 = 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 config PCI_EXPRESS_Q35 bool diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index 61f91ff561..79ecd58a2b 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -24,22 +24,15 @@ #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" @@ -59,49 +52,9 @@ typedef struct I440FXState { uint32_t short_root_bus; } I440FXState; -#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 = 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 (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) -#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 -static void piix3_set_irq(void *opaque, int pirq, int level); -static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pci_intx); -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 = (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 **errp) } } -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 = pci_create_simple_multifunction(pci_bus, -1, true, - TYPE_PIIX3_XEN_DEVICE); - piix3 = 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 = pci_create_simple_multifunction(pci_bus, -1, true, - TYPE_PIIX3_DEVICE); - piix3 = 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 = 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; } -/* 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, int level) -{ - int pic_irq; - uint64_t mask; - - pic_irq = piix3->dev.config[PIIX_PIRQCA + pirq]; - if (pic_irq >= PIIX_NUM_PIC_IRQS) { - return; - } - - mask = 1ULL << ((pic_irq * PIIX_NUM_PIRQS) + pirq); - piix3->pic_levels &= ~mask; - piix3->pic_levels |= mask * !!level; -} - -static void piix3_set_irq_level(PIIX3State *piix3, int pirq, int level) -{ - int pic_irq; - - pic_irq = piix3->dev.config[PIIX_PIRQCA + pirq]; - if (pic_irq >= 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 = opaque; - piix3_set_irq_level(piix3, pirq, level); -} - -static PCIINTxRoute piix3_route_intx_pin_to_irq(void *opaque, int pin) -{ - PIIX3State *piix3 = opaque; - int irq = piix3->dev.config[PIIX_PIRQCA + pin]; - PCIINTxRoute route; - - if (irq < PIIX_NUM_PIC_IRQS) { - route.mode = PCI_INTX_ENABLED; - route.irq = irq; - } else { - route.mode = PCI_INTX_DISABLED; - route.irq = -1; - } - return route; -} - -/* irq routing is changed. so rebuild bitmap */ -static void piix3_update_irq_levels(PIIX3State *piix3) -{ - PCIBus *bus = pci_get_bus(&piix3->dev); - int pirq; - - piix3->pic_levels = 0; - for (pirq = 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 = 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 = 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 = opaque; - uint8_t *pci_conf = d->dev.config; - - pci_conf[0x04] = 0x07; /* master, memory and I/O */ - pci_conf[0x05] = 0x00; - pci_conf[0x06] = 0x00; - pci_conf[0x07] = 0x02; /* PCI_status_devsel_medium */ - pci_conf[0x4c] = 0x4d; - pci_conf[0x4e] = 0x03; - pci_conf[0x4f] = 0x00; - pci_conf[0x60] = 0x80; - pci_conf[0x61] = 0x80; - pci_conf[0x62] = 0x80; - pci_conf[0x63] = 0x80; - pci_conf[0x69] = 0x02; - pci_conf[0x70] = 0x80; - pci_conf[0x76] = 0x0c; - pci_conf[0x77] = 0x0c; - pci_conf[0x78] = 0x02; - pci_conf[0x79] = 0x00; - pci_conf[0x80] = 0x00; - pci_conf[0x82] = 0x00; - pci_conf[0xa0] = 0x08; - pci_conf[0xa2] = 0x00; - pci_conf[0xa3] = 0x00; - pci_conf[0xa4] = 0x00; - pci_conf[0xa5] = 0x00; - pci_conf[0xa6] = 0x00; - pci_conf[0xa7] = 0x00; - pci_conf[0xa8] = 0x0f; - pci_conf[0xaa] = 0x00; - pci_conf[0xab] = 0x00; - pci_conf[0xac] = 0x00; - pci_conf[0xae] = 0x00; - - d->pic_levels = 0; - d->rcr = 0; -} - -static int piix3_post_load(void *opaque, int version_id) -{ - PIIX3State *piix3 = 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 = 0; - for (pirq = 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 = opaque; - - for (i = 0; i < ARRAY_SIZE(piix3->pci_irq_levels_vmstate); i++) { - piix3->pci_irq_levels_vmstate[i] = - pci_bus_get_irq_level(pci_get_bus(&piix3->dev), i); - } - - return 0; -} - -static bool piix3_rcr_needed(void *opaque) -{ - PIIX3State *piix3 = opaque; - - return (piix3->rcr != 0); -} - -static const VMStateDescription vmstate_piix3_rcr = { - .name = "PIIX3/rcr", - .version_id = 1, - .minimum_version_id = 1, - .needed = piix3_rcr_needed, - .fields = (VMStateField[]) { - VMSTATE_UINT8(rcr, PIIX3State), - VMSTATE_END_OF_LIST() - } -}; - -static const VMStateDescription vmstate_piix3 = { - .name = "PIIX3", - .version_id = 3, - .minimum_version_id = 2, - .post_load = piix3_post_load, - .pre_save = piix3_pre_save, - .fields = (VMStateField[]) { - VMSTATE_PCI_DEVICE(dev, PIIX3State), - VMSTATE_INT32_ARRAY_V(pci_irq_levels_vmstate, PIIX3State, - PIIX_NUM_PIRQS, 3), - VMSTATE_END_OF_LIST() - }, - .subsections = (const VMStateDescription*[]) { - &vmstate_piix3_rcr, - NULL - } -}; - - -static void rcr_write(void *opaque, hwaddr addr, uint64_t val, unsigned len) -{ - PIIX3State *d = opaque; - - if (val & 4) { - qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); - return; - } - d->rcr = val & 2; /* keep System Reset type only */ -} - -static uint64_t rcr_read(void *opaque, hwaddr addr, unsigned len) -{ - PIIX3State *d = opaque; - - return d->rcr; -} - -static const MemoryRegionOps rcr_ops = { - .read = rcr_read, - .write = rcr_write, - .endianness = DEVICE_LITTLE_ENDIAN -}; - -static void piix3_realize(PCIDevice *dev, Error **errp) -{ - PIIX3State *d = 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), RCR_IOPORT, - &d->rcr_mem, 1); - - qemu_register_reset(piix3_reset, d); -} - -static void pci_piix3_class_init(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - dc->desc = "ISA bridge"; - dc->vmsd = &vmstate_piix3; - dc->hotpluggable = false; - k->realize = piix3_realize; - k->vendor_id = PCI_VENDOR_ID_INTEL; - /* 82371SB PIIX3 PCI-to-ISA bridge (Step A1) */ - k->device_id = PCI_DEVICE_ID_INTEL_82371SB_0; - k->class_id = PCI_CLASS_BRIDGE_ISA; - /* - * Reason: part of PIIX3 southbridge, needs to be wired up by - * pc_piix.c's pc_init1() - */ - dc->user_creatable = false; -} - -static const TypeInfo piix3_pci_type_info = { - .name = TYPE_PIIX3_PCI_DEVICE, - .parent = TYPE_PCI_DEVICE, - .instance_size = sizeof(PIIX3State), - .abstract = true, - .class_init = pci_piix3_class_init, - .interfaces = (InterfaceInfo[]) { - { INTERFACE_CONVENTIONAL_PCI_DEVICE }, - { }, - }, -}; - -static void piix3_class_init(ObjectClass *klass, void *data) -{ - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - k->config_write = piix3_write_config; -} - -static const TypeInfo piix3_info = { - .name = TYPE_PIIX3_DEVICE, - .parent = TYPE_PIIX3_PCI_DEVICE, - .class_init = piix3_class_init, -}; - -static void piix3_xen_class_init(ObjectClass *klass, void *data) -{ - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - k->config_write = piix3_write_config_xen; -}; - -static const TypeInfo piix3_xen_info = { - .name = TYPE_PIIX3_XEN_DEVICE, - .parent = TYPE_PIIX3_PCI_DEVICE, - .class_init = piix3_xen_class_init, -}; - static void i440fx_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = 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); } diff --git a/include/hw/southbridge/piix.h b/include/hw/southbridge/piix.h index 9c92c37a4d..324a3a99fc 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 +#include "hw/pci/pci.h" + #define TYPE_PIIX4_PM "PIIX4_PM" 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 RCR_IOPORT 0xcf9 +#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 = 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 (RCR_IOPORT) */ + MemoryRegion rcr_mem; +} PIIX3State; + extern PCIDevice *piix4_dev; +PIIX3State *piix3_create(PCIBus *pci_bus, ISABus **isa_bus); + DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus, size_t ide_buses); -- 2.21.0 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 68FE8C10F14 for ; Tue, 15 Oct 2019 16:52:51 +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 2A46D20873 for ; Tue, 15 Oct 2019 16:52:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2A46D20873 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]:53054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iKQ42-000594-4I for qemu-devel@archiver.kernel.org; Tue, 15 Oct 2019 12:52:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42165) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iKPlA-0005W9-OH for qemu-devel@nongnu.org; Tue, 15 Oct 2019 12:33:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iKPl6-0007YY-Ts for qemu-devel@nongnu.org; Tue, 15 Oct 2019 12:33:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38196) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iKPl6-0007Xt-KS for qemu-devel@nongnu.org; Tue, 15 Oct 2019 12:33:16 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34CCFC0568FD; Tue, 15 Oct 2019 16:33:15 +0000 (UTC) Received: from x1w.redhat.com (ovpn-204-35.brq.redhat.com [10.40.204.35]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2776A4518; Tue, 15 Oct 2019 16:33:05 +0000 (UTC) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH 30/32] hw/pci-host/piix: Extract PIIX3 functions to hw/isa/piix3.c Date: Tue, 15 Oct 2019 18:27:03 +0200 Message-Id: <20191015162705.28087-31-philmd@redhat.com> In-Reply-To: <20191015162705.28087-1-philmd@redhat.com> References: <20191015162705.28087-1-philmd@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 15 Oct 2019 16:33:15 +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: Laurent Vivier , Thomas Huth , Stefano Stabellini , Eduardo Habkost , kvm@vger.kernel.org, Paul Durrant , "Michael S. Tsirkin" , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Paolo Bonzini , =?UTF-8?q?Herv=C3=A9=20Poussineau?= , Aleksandar Markovic , xen-devel@lists.xenproject.org, Anthony Perard , Igor Mammedov , Aleksandar Rikalo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Aurelien Jarno , Richard Henderson 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. 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..05146447ef --- /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), RCR_I= OPORT, + &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 61f91ff561..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 (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), RCR_I= OPORT, - &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 9c92c37a4d..324a3a99fc 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 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 (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