From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933169AbcHNU4a (ORCPT ); Sun, 14 Aug 2016 16:56:30 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:46317 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932453AbcHNUnz (ORCPT ); Sun, 14 Aug 2016 16:43:55 -0400 From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Toshi Kani , Thomas Gleixner , Andrew Morton , Andy Lutomirski , Borislav Petkov , Borislav Petkov , Brian Gerst , Denys Vlasenko , "H. Peter Anvin" , Juergen Gross , Linus Torvalds , "Luis R. Rodriguez" , Peter Zijlstra , Toshi Kani , elliott@hpe.com, konrad.wilk@oracle.com, paul.gortmaker@windriver.com, xen-devel@lists.xenproject.org, Ingo Molnar Subject: [PATCH 4.6 26/56] x86/mtrr: Fix Xorg crashes in Qemu sessions Date: Sun, 14 Aug 2016 22:37:30 +0200 Message-Id: <20160814202505.999281071@linuxfoundation.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20160814202504.908694181@linuxfoundation.org> References: <20160814202504.908694181@linuxfoundation.org> User-Agent: quilt/0.64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.6-stable review patch. If anyone has any objections, please let me know. ------------------ From: Toshi Kani commit edfe63ec97ed8d4496225f7ba54c9ce4207c5431 upstream. A Xorg failure on qemu32 was reported as a regression [1] caused by commit 9cd25aac1f44 ("x86/mm/pat: Emulate PAT when it is disabled"). This patch fixes the Xorg crash. Negative effects of this regression were the following two failures [2] in Xorg on QEMU with QEMU CPU model "qemu32" (-cpu qemu32), which were triggered by the fact that its virtual CPU does not support MTRRs. #1. copy_process() failed in the check in reserve_pfn_range() copy_process copy_mm dup_mm dup_mmap copy_page_range track_pfn_copy reserve_pfn_range A WC map request was tracked as WC in memtype, which set a PTE as UC (pgprot) per __cachemode2pte_tbl[]. This led to this error in reserve_pfn_range() called from track_pfn_copy(), which obtained a pgprot from a PTE. It converts pgprot to page_cache_mode, which does not necessarily result in the original page_cache_mode since __cachemode2pte_tbl[] redirects multiple types to UC. #2. error path in copy_process() then hit WARN_ON_ONCE in untrack_pfn(). x86/PAT: Xorg:509 map pfn expected mapping type uncached- minus for [mem 0xfd000000-0xfdffffff], got write-combining Call Trace: dump_stack warn_slowpath_common ? untrack_pfn ? untrack_pfn warn_slowpath_null untrack_pfn ? __kunmap_atomic unmap_single_vma ? pagevec_move_tail_fn unmap_vmas exit_mmap mmput copy_process.part.47 _do_fork SyS_clone do_syscall_32_irqs_on entry_INT80_32 These negative effects are caused by two separate bugs, but they can be addressed in separate patches. Fixing the pat_init() issue described below addresses the root cause, and avoids Xorg to hit these cases. When the CPU does not support MTRRs, MTRR does not call pat_init(), which leaves PAT enabled without initializing PAT. This pat_init() issue is a long-standing issue, but manifested as issue #1 (and then hit issue #2) with the above-mentioned commit because the memtype now tracks cache attribute with 'page_cache_mode'. This pat_init() issue existed before the commit, but we used pgprot in memtype. Hence, we did not have issue #1 before. But WC request resulted in WT in effect because WC pgrot is actually WT when PAT is not initialized. This is not how it was designed to work. When PAT is set to disable properly, WC is converted to UC. The use of WT can result in a system crash if the target range does not support WT. Fortunately, nobody ran into such issue before. To fix this pat_init() issue, PAT code has been enhanced to provide pat_disable() interface. Call this interface when MTRRs are disabled. By setting PAT to disable properly, PAT bypasses the memtype check, and avoids issue #1. [1]: https://lkml.org/lkml/2016/3/3/828 [2]: https://lkml.org/lkml/2016/3/4/775 Signed-off-by: Toshi Kani Reviewed-by: Thomas Gleixner Cc: Andrew Morton Cc: Andy Lutomirski Cc: Borislav Petkov Cc: Borislav Petkov Cc: Brian Gerst Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Juergen Gross Cc: Linus Torvalds Cc: Luis R. Rodriguez Cc: Peter Zijlstra Cc: Toshi Kani Cc: elliott@hpe.com Cc: konrad.wilk@oracle.com Cc: paul.gortmaker@windriver.com Cc: xen-devel@lists.xenproject.org Link: http://lkml.kernel.org/r/1458769323-24491-5-git-send-email-toshi.kani@hpe.com Signed-off-by: Ingo Molnar Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/mtrr.h | 6 +++++- arch/x86/kernel/cpu/mtrr/main.c | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) --- a/arch/x86/include/asm/mtrr.h +++ b/arch/x86/include/asm/mtrr.h @@ -24,6 +24,7 @@ #define _ASM_X86_MTRR_H #include +#include /* @@ -83,9 +84,12 @@ static inline int mtrr_trim_uncached_mem static inline void mtrr_centaur_report_mcr(int mcr, u32 lo, u32 hi) { } +static inline void mtrr_bp_init(void) +{ + pat_disable("MTRRs disabled, skipping PAT initialization too."); +} #define mtrr_ap_init() do {} while (0) -#define mtrr_bp_init() do {} while (0) #define set_mtrr_aps_delayed_init() do {} while (0) #define mtrr_aps_init() do {} while (0) #define mtrr_bp_restore() do {} while (0) --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c @@ -759,8 +759,16 @@ void __init mtrr_bp_init(void) } } - if (!mtrr_enabled()) + if (!mtrr_enabled()) { pr_info("MTRR: Disabled\n"); + + /* + * PAT initialization relies on MTRR's rendezvous handler. + * Skip PAT init until the handler can initialize both + * features independently. + */ + pat_disable("MTRRs disabled, skipping PAT initialization too."); + } } void mtrr_ap_init(void) From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg Kroah-Hartman Subject: [PATCH 4.6 26/56] x86/mtrr: Fix Xorg crashes in Qemu sessions Date: Sun, 14 Aug 2016 22:37:30 +0200 Message-ID: <20160814202505.999281071@linuxfoundation.org> References: <20160814202504.908694181@linuxfoundation.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bZ2G8-0008HI-If for xen-devel@lists.xenproject.org; Sun, 14 Aug 2016 20:43:52 +0000 In-Reply-To: <20160814202504.908694181@linuxfoundation.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: linux-kernel@vger.kernel.org Cc: Juergen Gross , Denys Vlasenko , xen-devel@lists.xenproject.org, Toshi Kani , Peter Zijlstra , Greg Kroah-Hartman , "Luis R. Rodriguez" , "H. Peter Anvin" , stable@vger.kernel.org, Andy Lutomirski , paul.gortmaker@windriver.com, Ingo Molnar , Borislav Petkov , Brian Gerst , Toshi Kani , Andrew Morton , Borislav Petkov , Linus Torvalds , Thomas Gleixner , elliott@hpe.com List-Id: xen-devel@lists.xenproject.org NC42LXN0YWJsZSByZXZpZXcgcGF0Y2guICBJZiBhbnlvbmUgaGFzIGFueSBvYmplY3Rpb25zLCBw bGVhc2UgbGV0IG1lIGtub3cuCgotLS0tLS0tLS0tLS0tLS0tLS0KCkZyb206IFRvc2hpIEthbmkg PHRvc2hpLmthbmlAaHBlLmNvbT4KCmNvbW1pdCBlZGZlNjNlYzk3ZWQ4ZDQ0OTYyMjVmN2JhNTRj OWNlNDIwN2M1NDMxIHVwc3RyZWFtLgoKQSBYb3JnIGZhaWx1cmUgb24gcWVtdTMyIHdhcyByZXBv cnRlZCBhcyBhIHJlZ3Jlc3Npb24gWzFdIGNhdXNlZCBieQpjb21taXQgOWNkMjVhYWMxZjQ0ICgi eDg2L21tL3BhdDogRW11bGF0ZSBQQVQgd2hlbiBpdCBpcyBkaXNhYmxlZCIpLgoKVGhpcyBwYXRj aCBmaXhlcyB0aGUgWG9yZyBjcmFzaC4KCk5lZ2F0aXZlIGVmZmVjdHMgb2YgdGhpcyByZWdyZXNz aW9uIHdlcmUgdGhlIGZvbGxvd2luZyB0d28gZmFpbHVyZXMgWzJdCmluIFhvcmcgb24gUUVNVSB3 aXRoIFFFTVUgQ1BVIG1vZGVsICJxZW11MzIiICgtY3B1IHFlbXUzMiksIHdoaWNoIHdlcmUKdHJp Z2dlcmVkIGJ5IHRoZSBmYWN0IHRoYXQgaXRzIHZpcnR1YWwgQ1BVIGRvZXMgbm90IHN1cHBvcnQg TVRSUnMuCgogIzEuIGNvcHlfcHJvY2VzcygpIGZhaWxlZCBpbiB0aGUgY2hlY2sgaW4gcmVzZXJ2 ZV9wZm5fcmFuZ2UoKQoKICAgIGNvcHlfcHJvY2VzcwogICAgIGNvcHlfbW0KICAgICAgZHVwX21t CiAgICAgICBkdXBfbW1hcAogICAgICAgIGNvcHlfcGFnZV9yYW5nZQogICAgICAgICB0cmFja19w Zm5fY29weQogICAgICAgICAgcmVzZXJ2ZV9wZm5fcmFuZ2UKCiBBIFdDIG1hcCByZXF1ZXN0IHdh cyB0cmFja2VkIGFzIFdDIGluIG1lbXR5cGUsIHdoaWNoIHNldCBhIFBURSBhcwogVUMgKHBncHJv dCkgcGVyIF9fY2FjaGVtb2RlMnB0ZV90YmxbXS4gIFRoaXMgbGVkIHRvIHRoaXMgZXJyb3IgaW4K IHJlc2VydmVfcGZuX3JhbmdlKCkgY2FsbGVkIGZyb20gdHJhY2tfcGZuX2NvcHkoKSwgd2hpY2gg b2J0YWluZWQKIGEgcGdwcm90IGZyb20gYSBQVEUuICBJdCBjb252ZXJ0cyBwZ3Byb3QgdG8gcGFn ZV9jYWNoZV9tb2RlLCB3aGljaAogZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVzdWx0IGluIHRoZSBv cmlnaW5hbCBwYWdlX2NhY2hlX21vZGUgc2luY2UKIF9fY2FjaGVtb2RlMnB0ZV90YmxbXSByZWRp cmVjdHMgbXVsdGlwbGUgdHlwZXMgdG8gVUMuCgogIzIuIGVycm9yIHBhdGggaW4gY29weV9wcm9j ZXNzKCkgdGhlbiBoaXQgV0FSTl9PTl9PTkNFIGluCiAgICAgdW50cmFja19wZm4oKS4KCiAgICAg eDg2L1BBVDogWG9yZzo1MDkgbWFwIHBmbiBleHBlY3RlZCBtYXBwaW5nIHR5cGUgdW5jYWNoZWQt CiAgICAgbWludXMgZm9yIFttZW0gMHhmZDAwMDAwMC0weGZkZmZmZmZmXSwgZ290IHdyaXRlLWNv bWJpbmluZwogICAgICBDYWxsIFRyYWNlOgogICAgIGR1bXBfc3RhY2sKICAgICB3YXJuX3Nsb3dw YXRoX2NvbW1vbgogICAgID8gdW50cmFja19wZm4KICAgICA/IHVudHJhY2tfcGZuCiAgICAgd2Fy bl9zbG93cGF0aF9udWxsCiAgICAgdW50cmFja19wZm4KICAgICA/IF9fa3VubWFwX2F0b21pYwog ICAgIHVubWFwX3NpbmdsZV92bWEKICAgICA/IHBhZ2V2ZWNfbW92ZV90YWlsX2ZuCiAgICAgdW5t YXBfdm1hcwogICAgIGV4aXRfbW1hcAogICAgIG1tcHV0CiAgICAgY29weV9wcm9jZXNzLnBhcnQu NDcKICAgICBfZG9fZm9yawogICAgIFN5U19jbG9uZQogICAgIGRvX3N5c2NhbGxfMzJfaXJxc19v bgogICAgIGVudHJ5X0lOVDgwXzMyCgpUaGVzZSBuZWdhdGl2ZSBlZmZlY3RzIGFyZSBjYXVzZWQg YnkgdHdvIHNlcGFyYXRlIGJ1Z3MsIGJ1dCB0aGV5CmNhbiBiZSBhZGRyZXNzZWQgaW4gc2VwYXJh dGUgcGF0Y2hlcy4gIEZpeGluZyB0aGUgcGF0X2luaXQoKSBpc3N1ZQpkZXNjcmliZWQgYmVsb3cg YWRkcmVzc2VzIHRoZSByb290IGNhdXNlLCBhbmQgYXZvaWRzIFhvcmcgdG8gaGl0CnRoZXNlIGNh c2VzLgoKV2hlbiB0aGUgQ1BVIGRvZXMgbm90IHN1cHBvcnQgTVRSUnMsIE1UUlIgZG9lcyBub3Qg Y2FsbCBwYXRfaW5pdCgpLAp3aGljaCBsZWF2ZXMgUEFUIGVuYWJsZWQgd2l0aG91dCBpbml0aWFs aXppbmcgUEFULiAgVGhpcyBwYXRfaW5pdCgpCmlzc3VlIGlzIGEgbG9uZy1zdGFuZGluZyBpc3N1 ZSwgYnV0IG1hbmlmZXN0ZWQgYXMgaXNzdWUgIzEgKGFuZCB0aGVuCmhpdCBpc3N1ZSAjMikgd2l0 aCB0aGUgYWJvdmUtbWVudGlvbmVkIGNvbW1pdCBiZWNhdXNlIHRoZSBtZW10eXBlCm5vdyB0cmFj a3MgY2FjaGUgYXR0cmlidXRlIHdpdGggJ3BhZ2VfY2FjaGVfbW9kZScuCgpUaGlzIHBhdF9pbml0 KCkgaXNzdWUgZXhpc3RlZCBiZWZvcmUgdGhlIGNvbW1pdCwgYnV0IHdlIHVzZWQgcGdwcm90Cmlu IG1lbXR5cGUuICBIZW5jZSwgd2UgZGlkIG5vdCBoYXZlIGlzc3VlICMxIGJlZm9yZS4gIEJ1dCBX QyByZXF1ZXN0CnJlc3VsdGVkIGluIFdUIGluIGVmZmVjdCBiZWNhdXNlIFdDIHBncm90IGlzIGFj dHVhbGx5IFdUIHdoZW4gUEFUCmlzIG5vdCBpbml0aWFsaXplZC4gIFRoaXMgaXMgbm90IGhvdyBp dCB3YXMgZGVzaWduZWQgdG8gd29yay4gIFdoZW4KUEFUIGlzIHNldCB0byBkaXNhYmxlIHByb3Bl cmx5LCBXQyBpcyBjb252ZXJ0ZWQgdG8gVUMuICBUaGUgdXNlIG9mCldUIGNhbiByZXN1bHQgaW4g YSBzeXN0ZW0gY3Jhc2ggaWYgdGhlIHRhcmdldCByYW5nZSBkb2VzIG5vdCBzdXBwb3J0CldULiAg Rm9ydHVuYXRlbHksIG5vYm9keSByYW4gaW50byBzdWNoIGlzc3VlIGJlZm9yZS4KClRvIGZpeCB0 aGlzIHBhdF9pbml0KCkgaXNzdWUsIFBBVCBjb2RlIGhhcyBiZWVuIGVuaGFuY2VkIHRvIHByb3Zp ZGUKcGF0X2Rpc2FibGUoKSBpbnRlcmZhY2UuICBDYWxsIHRoaXMgaW50ZXJmYWNlIHdoZW4gTVRS UnMgYXJlIGRpc2FibGVkLgpCeSBzZXR0aW5nIFBBVCB0byBkaXNhYmxlIHByb3Blcmx5LCBQQVQg YnlwYXNzZXMgdGhlIG1lbXR5cGUgY2hlY2ssCmFuZCBhdm9pZHMgaXNzdWUgIzEuCgogIFsxXTog aHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTYvMy8zLzgyOAogIFsyXTogaHR0cHM6Ly9sa21sLm9y Zy9sa21sLzIwMTYvMy80Lzc3NQoKU2lnbmVkLW9mZi1ieTogVG9zaGkgS2FuaSA8dG9zaGkua2Fu aUBocGUuY29tPgpSZXZpZXdlZC1ieTogVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXgu ZGU+CkNjOiBBbmRyZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnPgpDYzogQW5k eSBMdXRvbWlyc2tpIDxsdXRvQGFtYWNhcGl0YWwubmV0PgpDYzogQm9yaXNsYXYgUGV0a292IDxi cEBhbGllbjguZGU+CkNjOiBCb3Jpc2xhdiBQZXRrb3YgPGJwQHN1c2UuZGU+CkNjOiBCcmlhbiBH ZXJzdCA8YnJnZXJzdEBnbWFpbC5jb20+CkNjOiBEZW55cyBWbGFzZW5rbyA8ZHZsYXNlbmtAcmVk aGF0LmNvbT4KQ2M6IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgpDYzogSnVlcmdlbiBH cm9zcyA8amdyb3NzQHN1c2UuY29tPgpDYzogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQGxpbnV4 LWZvdW5kYXRpb24ub3JnPgpDYzogTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBzdXNlLmNvbT4K Q2M6IFBldGVyIFppamxzdHJhIDxwZXRlcnpAaW5mcmFkZWFkLm9yZz4KQ2M6IFRvc2hpIEthbmkg PHRvc2hpLmthbmlAaHAuY29tPgpDYzogZWxsaW90dEBocGUuY29tCkNjOiBrb25yYWQud2lsa0Bv cmFjbGUuY29tCkNjOiBwYXVsLmdvcnRtYWtlckB3aW5kcml2ZXIuY29tCkNjOiB4ZW4tZGV2ZWxA bGlzdHMueGVucHJvamVjdC5vcmcKTGluazogaHR0cDovL2xrbWwua2VybmVsLm9yZy9yLzE0NTg3 NjkzMjMtMjQ0OTEtNS1naXQtc2VuZC1lbWFpbC10b3NoaS5rYW5pQGhwZS5jb20KU2lnbmVkLW9m Zi1ieTogSW5nbyBNb2xuYXIgPG1pbmdvQGtlcm5lbC5vcmc+ClNpZ25lZC1vZmYtYnk6IEdyZWcg S3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+CgotLS0KIGFyY2gveDg2 L2luY2x1ZGUvYXNtL210cnIuaCAgICAgfCAgICA2ICsrKysrLQogYXJjaC94ODYva2VybmVsL2Nw dS9tdHJyL21haW4uYyB8ICAgMTAgKysrKysrKysrLQogMiBmaWxlcyBjaGFuZ2VkLCAxNCBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXRy ci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL210cnIuaApAQCAtMjQsNiArMjQsNyBAQAog I2RlZmluZSBfQVNNX1g4Nl9NVFJSX0gKIAogI2luY2x1ZGUgPHVhcGkvYXNtL210cnIuaD4KKyNp bmNsdWRlIDxhc20vcGF0Lmg+CiAKIAogLyoKQEAgLTgzLDkgKzg0LDEyIEBAIHN0YXRpYyBpbmxp bmUgaW50IG10cnJfdHJpbV91bmNhY2hlZF9tZW0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtdHJyX2Nl bnRhdXJfcmVwb3J0X21jcihpbnQgbWNyLCB1MzIgbG8sIHUzMiBoaSkKIHsKIH0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtdHJyX2JwX2luaXQodm9pZCkKK3sKKwlwYXRfZGlzYWJsZSgiTVRSUnMgZGlz YWJsZWQsIHNraXBwaW5nIFBBVCBpbml0aWFsaXphdGlvbiB0b28uIik7Cit9CiAKICNkZWZpbmUg bXRycl9hcF9pbml0KCkgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIG10cnJfYnBfaW5pdCgpIGRv IHt9IHdoaWxlICgwKQogI2RlZmluZSBzZXRfbXRycl9hcHNfZGVsYXllZF9pbml0KCkgZG8ge30g d2hpbGUgKDApCiAjZGVmaW5lIG10cnJfYXBzX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKICNkZWZp bmUgbXRycl9icF9yZXN0b3JlKCkgZG8ge30gd2hpbGUgKDApCi0tLSBhL2FyY2gveDg2L2tlcm5l bC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpA QCAtNzU5LDggKzc1OSwxNiBAQCB2b2lkIF9faW5pdCBtdHJyX2JwX2luaXQodm9pZCkKIAkJfQog CX0KIAotCWlmICghbXRycl9lbmFibGVkKCkpCisJaWYgKCFtdHJyX2VuYWJsZWQoKSkgewogCQlw cl9pbmZvKCJNVFJSOiBEaXNhYmxlZFxuIik7CisKKwkJLyoKKwkJICogUEFUIGluaXRpYWxpemF0 aW9uIHJlbGllcyBvbiBNVFJSJ3MgcmVuZGV6dm91cyBoYW5kbGVyLgorCQkgKiBTa2lwIFBBVCBp bml0IHVudGlsIHRoZSBoYW5kbGVyIGNhbiBpbml0aWFsaXplIGJvdGgKKwkJICogZmVhdHVyZXMg aW5kZXBlbmRlbnRseS4KKwkJICovCisJCXBhdF9kaXNhYmxlKCJNVFJScyBkaXNhYmxlZCwgc2tp cHBpbmcgUEFUIGluaXRpYWxpemF0aW9uIHRvby4iKTsKKwl9CiB9CiAKIHZvaWQgbXRycl9hcF9p bml0KHZvaWQpCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cHM6 Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=