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=-15.0 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MIME_BASE64_TEXT,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 2A187C433EF for ; Mon, 13 Sep 2021 12:42:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0638D60FBF for ; Mon, 13 Sep 2021 12:42:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239037AbhIMMnW (ORCPT ); Mon, 13 Sep 2021 08:43:22 -0400 Received: from mga12.intel.com ([192.55.52.136]:45539 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236180AbhIMMnV (ORCPT ); Mon, 13 Sep 2021 08:43:21 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10105"; a="201170535" X-IronPort-AV: E=Sophos;i="5.85,288,1624345200"; d="scan'208";a="201170535" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2021 05:42:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,288,1624345200"; d="scan'208";a="698724483" Received: from unknown (HELO coxu-arch-shz.sh.intel.com) ([10.239.160.21]) by fmsmga005.fm.intel.com with ESMTP; 13 Sep 2021 05:42:00 -0700 From: Colin Xu To: alex.williamson@redhat.com Cc: kvm@vger.kernel.org, colin.xu@intel.com, zhenyuw@linux.intel.com, hang.yuan@linux.intel.com, swee.yee.fonn@intel.com, fred.gao@intel.com Subject: [PATCH v4] vfio/pci: Add OpRegion 2.0+ Extended VBT support. Date: Mon, 13 Sep 2021 20:41:58 +0800 Message-Id: <20210913124158.68775-1-colin.xu@intel.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <8a444890-63ba-e96a-63ab-7e6993ea1b4b@outlook.office365.com> References: <8a444890-63ba-e96a-63ab-7e6993ea1b4b@outlook.office365.com> MIME-Version: 1.0 Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org RHVlIHRvIGhpc3RvcmljYWwgcmVhc29uLCBzb21lIGxlZ2FjeSBzaGlwcGVkIHN5c3RlbSBkb2Vz bid0IGZvbGxvdwpPcFJlZ2lvbiAyLjEgc3BlYyBidXQgc3RpbGwgc3RpY2sgdG8gT3BSZWdpb24g Mi4wLCBpbiB3aGljaCB0aGUgZXh0ZW5kZWQKVkJUIGlzIG5vdCBjb250aWd1b3VzIGFmdGVyIE9w UmVnaW9uIGluIHBoeXNpY2FsIGFkZHJlc3MsIGJ1dCBhbnkKbG9jYXRpb24gcG9pbnRlZCBieSBS VkRBIHZpYSBhYnNvbHV0ZSBhZGRyZXNzLiBBbHNvIGFsdGhvdWdoIGN1cnJlbnQKT3BSZWdpb24g Mi4xKyBzeXN0ZW1zIGFwcGVhcnMgdGhhdCB0aGUgZXh0ZW5kZWQgVkJUIGZvbGxvd3MgT3BSZWdp b24sClJWREEgaXMgdGhlIHJlbGF0aXZlIGFkZHJlc3MgdG8gT3BSZWdpb24gaGVhZCwgdGhlIGV4 dGVuZGVkIFZCVCBsb2NhdGlvbgptYXkgY2hhbmdlIHRvIG5vbi1jb250aWd1b3VzIHRvIE9wUmVn aW9uLiBJbiBib3RoIGNhc2VzLCBpdCdzIGltcG9zc2libGUKdG8gbWFwIGEgY29udGlndW91cyBy YW5nZSB0byBob2xkIGJvdGggT3BSZWdpb24gYW5kIHRoZSBleHRlbmRlZCBWQlQgYW5kCmV4cG9z ZSB2aWEgb25lIHZmaW8gcmVnaW9uLgoKVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIE9wUmVn aW9uIDIuMCBhbmQgMi4xIGlzIHdoZXJlIGV4dGVuZGVkClZCVCBpcyBzdG9yZWQ6IEZvciAyLjAs IFJWREEgaXMgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgZXh0ZW5kZWQgVkJUCndoaWxlIGZvciAy LjEsIFJWREEgaXMgdGhlIHJlbGF0aXZlIGFkZHJlc3Mgb2YgZXh0ZW5kZWQgVkJUIHRvIE9wUmVn aW9uCmJhZXMsIGFuZCB0aGVyZSBpcyBubyBvdGhlciBkaWZmZXJlbmNlIGJldHdlZW4gT3BSZWdp b24gMi4wIGFuZCAyLjEuClRvIHN1cHBvcnQgdGhlIG5vbi1jb250aWd1b3VzIHJlZ2lvbiBjYXNl IGFzIGRlc2NyaWJlZCwgdGhlIHVwZGF0ZWQgcmVhZApvcCB3aWxsIHBhdGNoIE9wUmVnaW9uIHZl cnNpb24gYW5kIFJWREEgb24tdGhlLWZseSBhY2NvcmRpbmdseS4gU28gdGhhdApmcm9tIHZmaW8g aWdkIE9wUmVnaW9uIHZpZXcsIG9ubHkgMi4xKyB3aXRoIGNvbnRpZ3VvdXMgZXh0ZW5kZWQgVkJU CmFmdGVyIE9wUmVnaW9uIGlzIGV4cG9zZWQsIHJlZ2FyZGxlc3MgdGhlIHVuZGVybmVhdGggaG9z dCBPcFJlZ2lvbiBpcwoyLjAgb3IgMi4xKy4gVGhlIG1lY2hhbmlzbSBtYWtlcyBpdCBwb3NzaWJs ZSB0byBzdXBwb3J0IGxlZ2FjeSBPcFJlZ2lvbgoyLjAgZXh0ZW5kZWQgVkJUIHN5c3RlbXMgd2l0 aCBvbiB0aGUgbWFya2V0LCBhbmQgc3VwcG9ydCBPcFJlZ2lvbiAyLjErCndoZXJlIHRoZSBleHRl bmRlZCBWQlQgaXNuJ3QgY29udGlndW91cyBhZnRlciBPcFJlZ2lvbi4KQWxzbyBzcGxpdCB0aGUg d3JpdGUgb3Agd2l0aCByZWFkIG9wcyB0byBsZWF2ZSBmbGV4aWJpbGl0eSBmb3IgT3BSZWdpb24K d3JpdGUgb3Agc3VwcG9ydCBpbiBmdXR1cmUuCgpWMjoKVmFsaWRhdGUgUlZEQSBmb3IgMi4xKyBi ZWZvcmUgaW5jcmVhc2luZyB0b3RhbCBzaXplLiAoQWxleCkKClYzOiAoQWxleCkKU3BsaXQgcmVh ZCBhbmQgd3JpdGUgb3BzLgpPbi10aGUtZmx5IG1vZGlmeSBPcFJlZ2lvbiB2ZXJzaW9uIGFuZCBS VkRBLgpGaXggc3BhcnNlIGVycm9yIG9uIGFzc2lnbiB2YWx1ZSB0byBjYXN0ZWQgcG9pbnRlci4K ClY0OiAoQWxleCkKTm8gbmVlZCBzdXBwb3J0IHdyaXRlIG9wLgpEaXJlY3QgY29weSB0byB1c2Vy IGJ1ZmZlciB3aXRoIHNldmVyYWwgc2hpZnQgaW5zdGVhZCBvZiBzaGFkb3cuCkNvcHkgaGVscGVy IHRvIGNvcHkgdG8gdXNlciBidWZmZXIgYW5kIHNoaWZ0IG9mZnNldC4KCkNjOiBaaGVueXUgV2Fu ZyA8emhlbnl1d0BsaW51eC5pbnRlbC5jb20+CkNjOiBIYW5nIFl1YW4gPGhhbmcueXVhbkBsaW51 eC5pbnRlbC5jb20+CkNjOiBTd2VlIFllZSBGb25uIDxzd2VlLnllZS5mb25uQGludGVsLmNvbT4K Q2M6IEZyZWQgR2FvIDxmcmVkLmdhb0BpbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IENvbGluIFh1 IDxjb2xpbi54dUBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pZ2Qu YyB8IDIyOSArKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQs IDE3NCBpbnNlcnRpb25zKCspLCA1NSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJz L3ZmaW8vcGNpL3ZmaW9fcGNpX2lnZC5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pZ2Qu YwppbmRleCAyMjhkZjU2NWU5YmMuLjE0ZTk1ODg5M2JlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92 ZmlvL3BjaS92ZmlvX3BjaV9pZ2QuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ln ZC5jCkBAIC0yNSwyMCArMjUsMTE5IEBACiAjZGVmaW5lIE9QUkVHSU9OX1JWRFMJCTB4M2MyCiAj ZGVmaW5lIE9QUkVHSU9OX1ZFUlNJT04JMHgxNgogCitzdHJ1Y3QgaWdkX29wcmVnaW9uX3ZidCB7 CisJdm9pZCAqb3ByZWdpb247CisJdm9pZCAqdmJ0X2V4OworCV9fbGUxNiB2ZXJzaW9uOworCV9f bGU2NCBydmRhOworfTsKKworLyoqCisgKiBpZ2Rfb3ByZWdpb25fc2hpZnRfY29weSgpIC0gQ29w eSBPcFJlZ2lvbiB0byB1c2VyIGJ1ZmZlciBhbmQgc2hpZnQgcG9zaXRpb24uCisgKiBAZHN0OiBV c2VyIGJ1ZmZlciBwdHIgdG8gY29weSB0by4KKyAqIEBvZmY6IE9mZnNldCB0byB1c2VyIGJ1ZmZl ciBwdHIuIEluY3JlYXNlZCBieSBieXRlc19hZHYgb24gcmV0dXJuLgorICogQHNyYzogU291cmNl IGJ1ZmZlciB0byBjb3B5IGZyb20uCisgKiBAcG9zOiBJbmNyZWFzZWQgYnkgYnl0ZXNfYWR2IG9u IHJldHVybi4KKyAqIEByZW1haW5pbmc6IERlY3JlYXNlZCBieSBieXRlc19hZHYgb24gcmV0dXJu LgorICogQGJ5dGVzX2NwOiBCeXRlcyB0byBjb3B5LgorICogQGJ5dGVzX2FkdjogQnl0ZXMgdG8g YWRqdXN0IG9mZiwgcG9zIGFuZCByZW1haW5pbmcuCisgKgorICogQ29weSBPcFJlZ2lvbiB0byBv ZmZzZXQgZnJvbSBzcGVjaWZpYyBzb3VyY2UgcHRyIGFuZCBzaGlmdCB0aGUgb2Zmc2V0LgorICoK KyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUZBVUxUIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0 YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpZ2Rfb3ByZWdpb25fc2hpZnRfY29weShjaGFyIF9f dXNlciAqZHN0LAorCQkJCQkJICAgIGxvZmZfdCAqb2ZmLAorCQkJCQkJICAgIHZvaWQgKnNyYywK KwkJCQkJCSAgICBsb2ZmX3QgKnBvcywKKwkJCQkJCSAgICBsb2ZmX3QgKnJlbWFpbmluZywKKwkJ CQkJCSAgICBsb2ZmX3QgYnl0ZXNfY3AsCisJCQkJCQkgICAgbG9mZl90IGJ5dGVzX2FkdikKK3sK KwlpZiAoY29weV90b191c2VyKGRzdCArICgqb2ZmKSwgc3JjLCBieXRlc19jcCkpCisJCXJldHVy biAtRUZBVUxUOworCisJKm9mZiArPSBieXRlc19hZHY7CisJKnBvcyArPSBieXRlc19hZHY7CisJ KnJlbWFpbmluZyAtPSBieXRlc19hZHY7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNpemVf dCB2ZmlvX3BjaV9pZ2Rfcncoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgY2hhciBfX3Vz ZXIgKmJ1ZiwKIAkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zLCBib29sIGlzd3Jp dGUpCiB7CiAJdW5zaWduZWQgaW50IGkgPSBWRklPX1BDSV9PRkZTRVRfVE9fSU5ERVgoKnBwb3Mp IC0gVkZJT19QQ0lfTlVNX1JFR0lPTlM7Ci0Jdm9pZCAqYmFzZSA9IHZkZXYtPnJlZ2lvbltpXS5k YXRhOworCXN0cnVjdCBpZ2Rfb3ByZWdpb25fdmJ0ICpvcHJlZ2lvbnZidCA9IHZkZXYtPnJlZ2lv bltpXS5kYXRhOwogCWxvZmZfdCBwb3MgPSAqcHBvcyAmIFZGSU9fUENJX09GRlNFVF9NQVNLOwor CWxvZmZfdCByZW1haW5pbmcgPSBjb3VudDsKKwlsb2ZmX3Qgb2ZmID0gMDsKIAogCWlmIChwb3Mg Pj0gdmRldi0+cmVnaW9uW2ldLnNpemUgfHwgaXN3cml0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAK IAljb3VudCA9IG1pbihjb3VudCwgKHNpemVfdCkodmRldi0+cmVnaW9uW2ldLnNpemUgLSBwb3Mp KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBiYXNlICsgcG9zLCBjb3VudCkpCi0JCXJldHVy biAtRUZBVUxUOworCS8qIENvcHkgdW50aWwgT3BSZWdpb24gdmVyc2lvbiAqLworCWlmIChyZW1h aW5pbmcgJiYgcG9zIDwgT1BSRUdJT05fVkVSU0lPTikgeworCQlsb2ZmX3QgYnl0ZXMgPSBtaW4o cmVtYWluaW5nLCBPUFJFR0lPTl9WRVJTSU9OIC0gcG9zKTsKKworCQlpZiAoaWdkX29wcmVnaW9u X3NoaWZ0X2NvcHkoYnVmLCAmb2ZmLAorCQkJCQkgICAgb3ByZWdpb252YnQtPm9wcmVnaW9uICsg cG9zLCAmcG9zLAorCQkJCQkgICAgJnJlbWFpbmluZywgYnl0ZXMsIGJ5dGVzKSkKKwkJCXJldHVy biAtRUZBVUxUOworCX0KKworCS8qIENvcHkgcGF0Y2hlZCAoaWYgbmVjZXNzYXJ5KSBPcFJlZ2lv biB2ZXJzaW9uICovCisJaWYgKHJlbWFpbmluZyAmJiBwb3MgPCBPUFJFR0lPTl9WRVJTSU9OICsg c2l6ZW9mKF9fbGUxNikpIHsKKwkJbG9mZl90IGJ5dGVzID0gbWluKHJlbWFpbmluZywKKwkJCQkg ICBPUFJFR0lPTl9WRVJTSU9OICsgKGxvZmZfdClzaXplb2YoX19sZTE2KSAtIHBvcyk7CisKKwkJ aWYgKGlnZF9vcHJlZ2lvbl9zaGlmdF9jb3B5KGJ1ZiwgJm9mZiwKKwkJCQkJICAgICZvcHJlZ2lv bnZidC0+dmVyc2lvbiwgJnBvcywKKwkJCQkJICAgICZyZW1haW5pbmcsIGJ5dGVzLCBieXRlcykp CisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBDb3B5IHVudGlsIFJWREEgKi8KKwlpZiAo cmVtYWluaW5nICYmIHBvcyA8IE9QUkVHSU9OX1JWREEpIHsKKwkJbG9mZl90IGJ5dGVzID0gbWlu KChsb2ZmX3QpcmVtYWluaW5nLCBPUFJFR0lPTl9SVkRBIC0gcG9zKTsKKworCQlpZiAoaWdkX29w cmVnaW9uX3NoaWZ0X2NvcHkoYnVmLCAmb2ZmLAorCQkJCQkgICAgb3ByZWdpb252YnQtPm9wcmVn aW9uICsgcG9zLCAmcG9zLAorCQkJCQkgICAgJnJlbWFpbmluZywgYnl0ZXMsIGJ5dGVzKSkKKwkJ CXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIENvcHkgbW9kaWZpZWQgKGlmIG5lY2Vzc2FyeSkg UlZEQSAqLworCWlmIChyZW1haW5pbmcgJiYgcG9zIDwgT1BSRUdJT05fUlZEQSArIHNpemVvZihf X2xlNjQpKSB7CisJCWxvZmZfdCBieXRlcyA9IG1pbihyZW1haW5pbmcsIE9QUkVHSU9OX1JWREEg KworCQkJCQkgICAgICAobG9mZl90KXNpemVvZihfX2xlNjQpIC0gcG9zKTsKKworCQlpZiAoaWdk X29wcmVnaW9uX3NoaWZ0X2NvcHkoYnVmLCAmb2ZmLAorCQkJCQkgICAgJm9wcmVnaW9udmJ0LT5y dmRhLCAmcG9zLAorCQkJCQkgICAgJnJlbWFpbmluZywgYnl0ZXMsIGJ5dGVzKSkKKwkJCXJldHVy biAtRUZBVUxUOworCX0KKworCS8qIENvcHkgdGhlIHJlc3Qgb2YgT3BSZWdpb24gKi8KKwlpZiAo cmVtYWluaW5nICYmIHBvcyA8IE9QUkVHSU9OX1NJWkUpIHsKKwkJbG9mZl90IGJ5dGVzID0gbWlu KHJlbWFpbmluZywgT1BSRUdJT05fU0laRSAtIHBvcyk7CisKKwkJaWYgKGlnZF9vcHJlZ2lvbl9z aGlmdF9jb3B5KGJ1ZiwgJm9mZiwKKwkJCQkJICAgIG9wcmVnaW9udmJ0LT5vcHJlZ2lvbiArIHBv cywgJnBvcywKKwkJCQkJICAgICZyZW1haW5pbmcsIGJ5dGVzLCBieXRlcykpCisJCQlyZXR1cm4g LUVGQVVMVDsKKwl9CisKKwkvKiBDb3B5IGV4dGVuZGVkIFZCVCBpZiBleGlzdHMgKi8KKwlpZiAo cmVtYWluaW5nKSB7CisJCWlmIChpZ2Rfb3ByZWdpb25fc2hpZnRfY29weShidWYsICZvZmYsCisJ CQkJCSAgICBvcHJlZ2lvbnZidC0+dmJ0X2V4LCAmcG9zLAorCQkJCQkgICAgJnJlbWFpbmluZywg cmVtYWluaW5nLCAwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KIAogCSpwcG9zICs9IGNvdW50 OwogCkBAIC00OCw3ICsxNDcsMTMgQEAgc3RhdGljIHNpemVfdCB2ZmlvX3BjaV9pZ2Rfcncoc3Ry dWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgY2hhciBfX3VzZXIgKmJ1ZiwKIHN0YXRpYyB2b2lk IHZmaW9fcGNpX2lnZF9yZWxlYXNlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsCiAJCQkJ IHN0cnVjdCB2ZmlvX3BjaV9yZWdpb24gKnJlZ2lvbikKIHsKLQltZW11bm1hcChyZWdpb24tPmRh dGEpOworCXN0cnVjdCBpZ2Rfb3ByZWdpb25fdmJ0ICpvcHJlZ2lvbnZidCA9IHJlZ2lvbi0+ZGF0 YTsKKworCWlmIChvcHJlZ2lvbnZidC0+dmJ0X2V4KQorCQltZW11bm1hcChvcHJlZ2lvbnZidC0+ dmJ0X2V4KTsKKworCW1lbXVubWFwKG9wcmVnaW9udmJ0LT5vcHJlZ2lvbik7CisJa2ZyZWUob3By ZWdpb252YnQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZmaW9fcGNpX3JlZ29wcyB2Zmlv X3BjaV9pZ2RfcmVnb3BzID0gewpAQCAtNjAsNyArMTY1LDcgQEAgc3RhdGljIGludCB2ZmlvX3Bj aV9pZ2Rfb3ByZWdpb25faW5pdChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQogewogCV9f bGUzMiAqZHdvcmRwID0gKF9fbGUzMiAqKSh2ZGV2LT52Y29uZmlnICsgT1BSRUdJT05fUENJX0FE RFIpOwogCXUzMiBhZGRyLCBzaXplOwotCXZvaWQgKmJhc2U7CisJc3RydWN0IGlnZF9vcHJlZ2lv bl92YnQgKm9wcmVnaW9udmJ0OwogCWludCByZXQ7CiAJdTE2IHZlcnNpb247CiAKQEAgLTcxLDg0 ICsxNzYsOTggQEAgc3RhdGljIGludCB2ZmlvX3BjaV9pZ2Rfb3ByZWdpb25faW5pdChzdHJ1Y3Qg dmZpb19wY2lfZGV2aWNlICp2ZGV2KQogCWlmICghYWRkciB8fCAhKH5hZGRyKSkKIAkJcmV0dXJu IC1FTk9ERVY7CiAKLQliYXNlID0gbWVtcmVtYXAoYWRkciwgT1BSRUdJT05fU0laRSwgTUVNUkVN QVBfV0IpOwotCWlmICghYmFzZSkKKwlvcHJlZ2lvbnZidCA9IGt6YWxsb2Moc2l6ZW9mKCpvcHJl Z2lvbnZidCksIEdGUF9LRVJORUwpOworCWlmICghb3ByZWdpb252YnQpCisJCXJldHVybiAtRU5P TUVNOworCisJb3ByZWdpb252YnQtPm9wcmVnaW9uID0gbWVtcmVtYXAoYWRkciwgT1BSRUdJT05f U0laRSwgTUVNUkVNQVBfV0IpOworCWlmICghb3ByZWdpb252YnQtPm9wcmVnaW9uKSB7CisJCWtm cmVlKG9wcmVnaW9udmJ0KTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JaWYgKG1lbWNtcChi YXNlLCBPUFJFR0lPTl9TSUdOQVRVUkUsIDE2KSkgewotCQltZW11bm1hcChiYXNlKTsKKwlpZiAo bWVtY21wKG9wcmVnaW9udmJ0LT5vcHJlZ2lvbiwgT1BSRUdJT05fU0lHTkFUVVJFLCAxNikpIHsK KwkJbWVtdW5tYXAob3ByZWdpb252YnQtPm9wcmVnaW9uKTsKKwkJa2ZyZWUob3ByZWdpb252YnQp OwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzaXplID0gbGUzMl90b19jcHUoKihfX2xlMzIg KikoYmFzZSArIDE2KSk7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKG9wcmVnaW9u dmJ0LT5vcHJlZ2lvbiArIDE2KSk7CiAJaWYgKCFzaXplKSB7Ci0JCW1lbXVubWFwKGJhc2UpOwor CQltZW11bm1hcChvcHJlZ2lvbnZidC0+b3ByZWdpb24pOworCQlrZnJlZShvcHJlZ2lvbnZidCk7 CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNpemUgKj0gMTAyNDsgLyogSW4gS0IgKi8KIAog CS8qCi0JICogU3VwcG9ydCBvcHJlZ2lvbiB2Mi4xKwotCSAqIFdoZW4gVkJUIGRhdGEgZXhjZWVk cyA2S0Igc2l6ZSBhbmQgY2Fubm90IGJlIHdpdGhpbiBtYWlsYm94ICM0LCB0aGVuCi0JICogdGhl IEV4dGVuZGVkIFZCVCByZWdpb24gbmV4dCB0byBvcHJlZ2lvbiBpcyB1c2VkIHRvIGhvbGQgdGhl IFZCVCBkYXRhLgotCSAqIFJWREEgKFJlbGF0aXZlIEFkZHJlc3Mgb2YgVkJUIERhdGEgZnJvbSBP cHJlZ2lvbiBCYXNlKSBhbmQgUlZEUwotCSAqIChSYXcgVkJUIERhdGEgU2l6ZSkgZnJvbSBvcHJl Z2lvbiBzdHJ1Y3R1cmUgbWVtYmVyIGFyZSB1c2VkIHRvIGhvbGQgdGhlCi0JICogYWRkcmVzcyBm cm9tIHJlZ2lvbiBiYXNlIGFuZCBzaXplIG9mIFZCVCBkYXRhLiBSVkRBL1JWRFMgYXJlIG5vdAot CSAqIGRlZmluZWQgYmVmb3JlIG9wcmVnaW9uIDIuMC4KLQkgKgotCSAqIG9wcmVnaW9uIDIuMSs6 IFJWREEgaXMgdW5zaWduZWQsIHJlbGF0aXZlIG9mZnNldCBmcm9tCi0JICogb3ByZWdpb24gYmFz ZSwgYW5kIHNob3VsZCBwb2ludCB0byB0aGUgZW5kIG9mIG9wcmVnaW9uLgotCSAqIG90aGVyd2lz ZSwgZXhwb3NpbmcgdG8gdXNlcnNwYWNlIHRvIGFsbG93IHJlYWQgYWNjZXNzIHRvIGV2ZXJ5dGhp bmcgYmV0d2VlbgotCSAqIHRoZSBPcFJlZ2lvbiBhbmQgVkJUIGlzIG5vdCBzYWZlLgotCSAqIFJW RFMgaXMgZGVmaW5lZCBhcyBzaXplIGluIGJ5dGVzLgorCSAqIE9wUmVnaW9uIGFuZCBWQlQ6CisJ ICogV2hlbiBWQlQgZGF0YSBkb2Vzbid0IGV4Y2VlZCA2S0IsIGl0J3Mgc3RvcmVkIGluIE1haWxi b3ggIzQuCisJICogV2hlbiBWQlQgZGF0YSBleGNlZWRzIDZLQiBzaXplLCBNYWlsYm94ICM0IGlz IG5vIGxvbmdlciBsYXJnZSBlbm91Z2gKKwkgKiB0byBob2xkIHRoZSBWQlQgZGF0YSwgdGhlIEV4 dGVuZGVkIFZCVCByZWdpb24gaXMgaW50cm9kdWNlZCBzaW5jZQorCSAqIE9wUmVnaW9uIDIuMCB0 byBob2xkIHRoZSBWQlQgZGF0YS4gU2luY2UgT3BSZWdpb24gMi4wLCBSVkRBL1JWRFMgYXJlCisJ ICogaW50cm9kdWNlZCB0byBkZWZpbmUgdGhlIGV4dGVuZGVkIFZCVCBkYXRhIGxvY2F0aW9uIGFu ZCBzaXplLgorCSAqIE9wUmVnaW9uIDIuMDogUlZEQSBkZWZpbmVzIHRoZSBhYnNvbHV0ZSBwaHlz aWNhbCBhZGRyZXNzIG9mIHRoZQorCSAqICAgZXh0ZW5kZWQgVkJUIGRhdGEsIFJWRFMgZGVmaW5l cyB0aGUgVkJUIGRhdGEgc2l6ZS4KKwkgKiBPcFJlZ2lvbiAyLjEgYW5kIGFib3ZlOiBSVkRBIGRl ZmluZXMgdGhlIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlCisJICogICBleHRlbmRlZCBWQlQgZGF0 YSB0byBPcFJlZ2lvbiBiYXNlLCBSVkRTIGRlZmluZXMgdGhlIFZCVCBkYXRhIHNpemUuCiAJICoK LQkgKiBvcHJlZ2lvbiAyLjA6IHJ2ZGEgaXMgdGhlIHBoeXNpY2FsIFZCVCBhZGRyZXNzLgotCSAq IFNpbmNlIHJ2ZGEgaXMgSFBBIGl0IGNhbm5vdCBiZSBkaXJlY3RseSB1c2VkIGluIGd1ZXN0Lgot CSAqIEFuZCBpdCBzaG91bGQgbm90IGJlIHByYWN0aWNhbGx5IGF2YWlsYWJsZSBmb3IgZW5kIHVz ZXIsc28gaXQgaXMgbm90IHN1cHBvcnRlZC4KKwkgKiBEdWUgdG8gdGhlIFJWREEgZGlmZmVyZW5j ZSBpbiBPcFJlZ2lvbiBWQlQgKGFsc28gdGhlIG9ubHkgZGlmZiBiZXR3ZWVuCisJICogMi4wIGFu ZCAyLjEpLCBleHBvc2UgT3BSZWdpb24gYW5kIFZCVCBhcyBhIGNvbnRpZ3VvdXMgcmFuZ2UgZm9y CisJICogT3BSZWdpb24gMi4wIGFuZCBhYm92ZSBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdXBwb3J0 IHRoZSBub24tY29udGlndW91cworCSAqIFZCVCB2aWEgYSBzaW5nbGUgdmZpbyByZWdpb24uIEZy b20gci93IG9wcyB2aWV3LCBvbmx5IGNvbnRpZ3VvdXMgVkJUCisJICogYWZ0ZXIgT3BSZWdpb24g d2l0aCB2ZXJzaW9uIDIuMSsgaXMgZXhwb3NlZCByZWdhcmRsZXNzIHRoZSB1bmRlcm5lYXRoCisJ ICogaG9zdCBpcyAyLjAgb3Igbm9uLWNvbnRpZ3VvdXMgMi4xKy4gVGhlIHIvdyBvcHMgd2lsbCBv bi10aGUtZmx5IHNoaWZ0CisJICogdGhlIGFjdHVyYWwgb2Zmc2V0IGludG8gVkJUIHNvIHRoYXQg ZGF0YSBhdCBjb3JyZWN0IHBvc2l0aW9uIGNhbiBiZQorCSAqIHJldHVybmVkIHRvIHRoZSByZXF1 ZXN0ZXIuCiAJICovCi0JdmVyc2lvbiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGJhc2UgKyBP UFJFR0lPTl9WRVJTSU9OKSk7CisJb3ByZWdpb252YnQtPnZlcnNpb24gPSAqKF9fbGUxNiAqKShv cHJlZ2lvbnZidC0+b3ByZWdpb24gKworCQkJCQkgICBPUFJFR0lPTl9WRVJTSU9OKTsKKwl2ZXJz aW9uID0gbGUxNl90b19jcHUob3ByZWdpb252YnQtPnZlcnNpb24pOworCiAJaWYgKHZlcnNpb24g Pj0gMHgwMjAwKSB7Ci0JCXU2NCBydmRhOwotCQl1MzIgcnZkczsKKwkJdTY0IHJ2ZGEgPSBsZTY0 X3RvX2NwdSgqKF9fbGU2NCAqKShvcHJlZ2lvbnZidC0+b3ByZWdpb24gKworCQkJCQkJICAgT1BS RUdJT05fUlZEQSkpOworCQl1MzIgcnZkcyA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKG9wcmVn aW9udmJ0LT5vcHJlZ2lvbiArCisJCQkJCQkgICBPUFJFR0lPTl9SVkRTKSk7CiAKLQkJcnZkYSA9 IGxlNjRfdG9fY3B1KCooX19sZTY0ICopKGJhc2UgKyBPUFJFR0lPTl9SVkRBKSk7Ci0JCXJ2ZHMg PSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShiYXNlICsgT1BSRUdJT05fUlZEUykpOworCQkvKiBU aGUgZXh0ZW5kZWQgVkJUIGlzIHZhbGlkIG9ubHkgd2hlbiBSVkRBL1JWRFMgYXJlIG5vbi16ZXJv ICovCiAJCWlmIChydmRhICYmIHJ2ZHMpIHsKLQkJCS8qIG5vIHN1cHBvcnQgZm9yIG9wcmVnaW9u IHYyLjAgd2l0aCBwaHlzaWNhbCBWQlQgYWRkcmVzcyAqLworCQkJc2l6ZSArPSBydmRzOworCiAJ CQlpZiAodmVyc2lvbiA9PSAweDAyMDApIHsKLQkJCQltZW11bm1hcChiYXNlKTsKLQkJCQlwY2lf ZXJyKHZkZXYtPnBkZXYsCi0JCQkJCSJJR0QgYXNzaWdubWVudCBkb2VzIG5vdCBzdXBwb3J0IG9w cmVnaW9uIHYyLjAgd2l0aCBhbiBleHRlbmRlZCBWQlQgcmVnaW9uXG4iKTsKLQkJCQlyZXR1cm4g LUVJTlZBTDsKKwkJCQkvKiBQYXRjaCB0byB2ZXJzaW9uIDIuMCBpbiByZWFkIG9wcyAqLworCQkJ CW9wcmVnaW9udmJ0LT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoMHgwMjAxKTsKKwkJCQkvKiBBYnNv bHV0ZSBwaHlzaWNhbCBhZGRyIGZvciAyLjAgKi8KKwkJCQlhZGRyID0gcnZkYTsKKwkJCX0gZWxz ZSB7CisJCQkJLyogUmVsYXRpdmUgYWRkciB0byBPcFJlZ2lvbiBoZWFkZXIgZm9yIDIuMSsgKi8K KwkJCQlhZGRyICs9IHJ2ZGE7CiAJCQl9CiAKLQkJCWlmIChydmRhICE9IHNpemUpIHsKLQkJCQlt ZW11bm1hcChiYXNlKTsKLQkJCQlwY2lfZXJyKHZkZXYtPnBkZXYsCi0JCQkJCSJFeHRlbmRlZCBW QlQgZG9lcyBub3QgZm9sbG93IG9wcmVnaW9uIG9uIHZlcnNpb24gMHglMDR4XG4iLAotCQkJCQl2 ZXJzaW9uKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW9wcmVnaW9udmJ0LT52YnRfZXggPSBt ZW1yZW1hcChhZGRyLCBydmRzLCBNRU1SRU1BUF9XQik7CisJCQlpZiAoIW9wcmVnaW9udmJ0LT52 YnRfZXgpIHsKKwkJCQltZW11bm1hcChvcHJlZ2lvbnZidC0+b3ByZWdpb24pOworCQkJCWtmcmVl KG9wcmVnaW9udmJ0KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAotCQkJLyogcmVnaW9u IHNpemUgZm9yIG9wcmVnaW9uIHYyLjArOiBvcHJlZ2lvbiBhbmQgVkJUIHNpemUuICovCi0JCQlz aXplICs9IHJ2ZHM7CisJCQkvKiBBbHdheXMgc2V0IFJWREEgdG8gbWFrZSBleFZCVCBmb2xsb3dz IE9wUmVnaW9uICovCisJCQlvcHJlZ2lvbnZidC0+cnZkYSA9IGNwdV90b19sZTY0KE9QUkVHSU9O X1NJWkUpOwogCQl9CiAJfQogCi0JaWYgKHNpemUgIT0gT1BSRUdJT05fU0laRSkgewotCQltZW11 bm1hcChiYXNlKTsKLQkJYmFzZSA9IG1lbXJlbWFwKGFkZHIsIHNpemUsIE1FTVJFTUFQX1dCKTsK LQkJaWYgKCFiYXNlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJcmV0ID0gdmZpb19wY2lf cmVnaXN0ZXJfZGV2X3JlZ2lvbih2ZGV2LAogCQlQQ0lfVkVORE9SX0lEX0lOVEVMIHwgVkZJT19S RUdJT05fVFlQRV9QQ0lfVkVORE9SX1RZUEUsCi0JCVZGSU9fUkVHSU9OX1NVQlRZUEVfSU5URUxf SUdEX09QUkVHSU9OLAotCQkmdmZpb19wY2lfaWdkX3JlZ29wcywgc2l6ZSwgVkZJT19SRUdJT05f SU5GT19GTEFHX1JFQUQsIGJhc2UpOworCQlWRklPX1JFR0lPTl9TVUJUWVBFX0lOVEVMX0lHRF9P UFJFR0lPTiwgJnZmaW9fcGNpX2lnZF9yZWdvcHMsCisJCXNpemUsIFZGSU9fUkVHSU9OX0lORk9f RkxBR19SRUFELCBvcHJlZ2lvbnZidCk7CiAJaWYgKHJldCkgewotCQltZW11bm1hcChiYXNlKTsK KwkJaWYgKG9wcmVnaW9udmJ0LT52YnRfZXgpCisJCQltZW11bm1hcChvcHJlZ2lvbnZidC0+dmJ0 X2V4KTsKKworCQltZW11bm1hcChvcHJlZ2lvbnZidC0+b3ByZWdpb24pOworCQlrZnJlZShvcHJl Z2lvbnZidCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0tIAoyLjMzLjAKCg==