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=-13.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 21C27C433E0 for ; Fri, 31 Jul 2020 23:08:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E782320836 for ; Fri, 31 Jul 2020 23:08:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="IPdfxoRv" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727945AbgGaXIs (ORCPT ); Fri, 31 Jul 2020 19:08:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727867AbgGaXIp (ORCPT ); Fri, 31 Jul 2020 19:08:45 -0400 Received: from mail-pg1-x541.google.com (mail-pg1-x541.google.com [IPv6:2607:f8b0:4864:20::541]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 102C7C06179E for ; Fri, 31 Jul 2020 16:08:45 -0700 (PDT) Received: by mail-pg1-x541.google.com with SMTP id e8so16768324pgc.5 for ; Fri, 31 Jul 2020 16:08:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wsZ5gbKBfJpS0kEAhEgSsyY+vol7k0zdc2IVxjvZo+s=; b=IPdfxoRvS6R1x5paoBrA7xxYsYLtGQVxRFU7dvuKabenpplKg1IEjvbhFySTmU+Zh2 pNWc8NWMXSOA09JW8gD/0su2yMzSuM6k8hmeNUhvpGyiw2SmpiBLNR4PFrXPpgojBRMR hbzjAFfKzFOv7KayapCPYkLupuCPvPBt2/X9g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wsZ5gbKBfJpS0kEAhEgSsyY+vol7k0zdc2IVxjvZo+s=; b=f4Uo97wqyS+OV95iW2Cj/i0dfbITBxj070STgSRRpU8OMw5dcKv4VUlxcwmJQtWHaT 6WLe38v2zTovbWg+NHya7p6DSZ2du4f4p/i/05J6+Vb0R6Qyv1sxZsH8fMWqwQaHbydF PdxaPLjGJvS7TNwg+wLBn239qpT5tapJxm+RToOYDsxTGyDVvWP21JrtxH7SjsOwUlWq LoRXT1AGwmYUGEq8ooqy+OQepO9xCaRPLc6UWGu8RZW5JXqfCuF42NJ3We22LSigfDRE kI6dTCB+oNg1lt2Ya+3yAVicB+pry2zopmH7JjcW8SnPADsmzgIjYdE4JHZosbWpVmpz bR5Q== X-Gm-Message-State: AOAM5327arXFyHNecF7tUbB1NTTwTq/fGftUDXWM7hprafuHNOf6gcUv ejFa+fD6fy3cHRdOCa3qMn+s3w== X-Google-Smtp-Source: ABdhPJw+P56sPmrzKAh4KNkCFVEtBiUO7T0C8QAnvabXluMUkrjDoDQBKdjDkoM7tlMAV3f0yil7bg== X-Received: by 2002:a63:9246:: with SMTP id s6mr5522207pgn.22.1596236924597; Fri, 31 Jul 2020 16:08:44 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id x9sm10524734pgr.57.2020.07.31.16.08.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 16:08:39 -0700 (PDT) From: Kees Cook To: Thomas Gleixner , Will Deacon Cc: Kees Cook , Nick Desaulniers , Jian Cai , =?UTF-8?q?F=C4=81ng-ru=C3=AC=20S=C3=B2ng?= , Luis Lozano , Manoj Gupta , stable@vger.kernel.org, Catalin Marinas , Mark Rutland , Ard Biesheuvel , Peter Collingbourne , James Morse , Borislav Petkov , Ingo Molnar , Russell King , Masahiro Yamada , Arvind Sankar , Nathan Chancellor , Arnd Bergmann , x86@kernel.org, clang-built-linux@googlegroups.com, linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 13/36] vmlinux.lds.h: add PGO and AutoFDO input sections Date: Fri, 31 Jul 2020 16:07:57 -0700 Message-Id: <20200731230820.1742553-14-keescook@chromium.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200731230820.1742553-1-keescook@chromium.org> References: <20200731230820.1742553-1-keescook@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nick Desaulniers Basically, consider .text.{hot|unlikely|unknown}.* part of .text, too. When compiling with profiling information (collected via PGO instrumentations or AutoFDO sampling), Clang will separate code into .text.hot, .text.unlikely, or .text.unknown sections based on profiling information. After D79600 (clang-11), these sections will have a trailing `.` suffix, ie. .text.hot., .text.unlikely., .text.unknown.. When using -ffunction-sections together with profiling infomation, either explicitly (FGKASLR) or implicitly (LTO), code may be placed in sections following the convention: .text.hot., .text.unlikely., .text.unknown. where , , and are functions. (This produces one section per function; we generally try to merge these all back via linker script so that we don't have 50k sections). For the above cases, we need to teach our linker scripts that such sections might exist and that we'd explicitly like them grouped together, otherwise we can wind up with code outside of the _stext/_etext boundaries that might not be mapped properly for some architectures, resulting in boot failures. If the linker script is not told about possible input sections, then where the section is placed as output is a heuristic-laiden mess that's non-portable between linkers (ie. BFD and LLD), and has resulted in many hard to debug bugs. Kees Cook is working on cleaning this up by adding --orphan-handling=warn linker flag used in ARCH=powerpc to additional architectures. In the case of linker scripts, borrowing from the Zen of Python: explicit is better than implicit. Also, ld.bfd's internal linker script considers .text.hot AND .text.hot.* to be part of .text, as well as .text.unlikely and .text.unlikely.*. I didn't see support for .text.unknown.*, and didn't see Clang producing such code in our kernel builds, but I see code in LLVM that can produce such section names if profiling information is missing. That may point to a larger issue with generating or collecting profiles, but I would much rather be safe and explicit than have to debug yet another issue related to orphan section placement. Reported-by: Jian Cai Suggested-by: Fāng-ruì Sòng Tested-by: Luis Lozano Tested-by: Manoj Gupta Acked-by: Kees Cook Cc: stable@vger.kernel.org Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=add44f8d5c5c05e08b11e033127a744d61c26aee Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=1de778ed23ce7492c523d5850c6c6dbb34152655 Link: https://reviews.llvm.org/D79600 Link: https://bugs.chromium.org/p/chromium/issues/detail?id=1084760 Debugged-by: Luis Lozano Signed-off-by: Nick Desaulniers Signed-off-by: Kees Cook --- include/asm-generic/vmlinux.lds.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 2593957f6e8b..af5211ca857c 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -561,7 +561,10 @@ */ #define TEXT_TEXT \ ALIGN_FUNCTION(); \ - *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ + *(.text.hot .text.hot.*) \ + *(TEXT_MAIN .text.fixup) \ + *(.text.unlikely .text.unlikely.*) \ + *(.text.unknown .text.unknown.*) \ NOINSTR_TEXT \ *(.text..refcount) \ *(.ref.text) \ -- 2.25.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kees Cook Subject: [PATCH v5 13/36] vmlinux.lds.h: add PGO and AutoFDO input sections Date: Fri, 31 Jul 2020 16:07:57 -0700 Message-ID: <20200731230820.1742553-14-keescook@chromium.org> References: <20200731230820.1742553-1-keescook@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20200731230820.1742553-1-keescook@chromium.org> Sender: linux-kernel-owner@vger.kernel.org To: Thomas Gleixner , Will Deacon Cc: Kees Cook , Nick Desaulniers , Jian Cai , =?UTF-8?q?F=C4=81ng-ru=C3=AC=20S=C3=B2ng?= , Luis Lozano , Manoj Gupta , stable@vger.kernel.org, Catalin Marinas , Mark Rutland , Ard Biesheuvel , Peter Collingbourne , James Morse , Borislav Petkov , Ingo Molnar , Russell King , Masahiro Yamada , Arvind Sankar , Nathan Chancellor , Arnd Bergmann , x86@kernel.org, clang-built-linux@googlegroups. List-Id: linux-arch.vger.kernel.org From: Nick Desaulniers Basically, consider .text.{hot|unlikely|unknown}.* part of .text, too. When compiling with profiling information (collected via PGO instrumentations or AutoFDO sampling), Clang will separate code into .text.hot, .text.unlikely, or .text.unknown sections based on profiling information. After D79600 (clang-11), these sections will have a trailing `.` suffix, ie. .text.hot., .text.unlikely., .text.unknown.. When using -ffunction-sections together with profiling infomation, either explicitly (FGKASLR) or implicitly (LTO), code may be placed in sections following the convention: .text.hot., .text.unlikely., .text.unknown. where , , and are functions. (This produces one section per function; we generally try to merge these all back via linker script so that we don't have 50k sections). For the above cases, we need to teach our linker scripts that such sections might exist and that we'd explicitly like them grouped together, otherwise we can wind up with code outside of the _stext/_etext boundaries that might not be mapped properly for some architectures, resulting in boot failures. If the linker script is not told about possible input sections, then where the section is placed as output is a heuristic-laiden mess that's non-portable between linkers (ie. BFD and LLD), and has resulted in many hard to debug bugs. Kees Cook is working on cleaning this up by adding --orphan-handling=warn linker flag used in ARCH=powerpc to additional architectures. In the case of linker scripts, borrowing from the Zen of Python: explicit is better than implicit. Also, ld.bfd's internal linker script considers .text.hot AND .text.hot.* to be part of .text, as well as .text.unlikely and .text.unlikely.*. I didn't see support for .text.unknown.*, and didn't see Clang producing such code in our kernel builds, but I see code in LLVM that can produce such section names if profiling information is missing. That may point to a larger issue with generating or collecting profiles, but I would much rather be safe and explicit than have to debug yet another issue related to orphan section placement. Reported-by: Jian Cai Suggested-by: Fāng-ruì Sòng Tested-by: Luis Lozano Tested-by: Manoj Gupta Acked-by: Kees Cook Cc: stable@vger.kernel.org Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=add44f8d5c5c05e08b11e033127a744d61c26aee Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=1de778ed23ce7492c523d5850c6c6dbb34152655 Link: https://reviews.llvm.org/D79600 Link: https://bugs.chromium.org/p/chromium/issues/detail?id=1084760 Debugged-by: Luis Lozano Signed-off-by: Nick Desaulniers Signed-off-by: Kees Cook --- include/asm-generic/vmlinux.lds.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 2593957f6e8b..af5211ca857c 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -561,7 +561,10 @@ */ #define TEXT_TEXT \ ALIGN_FUNCTION(); \ - *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ + *(.text.hot .text.hot.*) \ + *(TEXT_MAIN .text.fixup) \ + *(.text.unlikely .text.unlikely.*) \ + *(.text.unknown .text.unknown.*) \ NOINSTR_TEXT \ *(.text..refcount) \ *(.ref.text) \ -- 2.25.1 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=-13.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,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 03457C433E1 for ; Fri, 31 Jul 2020 23:14:55 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 4E69C205CB for ; Fri, 31 Jul 2020 23:14:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="KgLgHHM4"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="IPdfxoRv" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4E69C205CB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=chromium.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=UGV+/NirDax2UQZeVCodPut1MACd0oYYZBtvgwVs0Gw=; b=KgLgHHM4GeVGYqcDs41KgiuBu ShusfEfo4g2CeTLcO8+gkYyLDc+LKJYajY+u4mISzeDxTUm9naoAfUuFxFEQpNN8+Pp8q3PxIGv4N V3/QX+EHJpeqs+225UNiCVqa/zMl8aotCBEBN2Jso8+oDpzmovrcwcbmQamPh/3UwaZeBxcp5sgkp dkYiVIy/wroLqZIJ0lXPBIV9sLnFVnFRV/N6vHsNH3++sRw5n4hQ0XaYniHiDdFxhyIaFPjUgwhsH sKaNK21uCFEtyZ2rt1S/7BmklYbT2KMO5uJUeO4fZNmHGH4XUIt2D7C5enU7VvqI/20Ocn4jACTN8 Ls7xK2Q2A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1k1eBw-0000xj-DA; Fri, 31 Jul 2020 23:11:56 +0000 Received: from mail-pf1-x442.google.com ([2607:f8b0:4864:20::442]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1k1e8t-0008An-H9 for linux-arm-kernel@lists.infradead.org; Fri, 31 Jul 2020 23:09:00 +0000 Received: by mail-pf1-x442.google.com with SMTP id j20so15179171pfe.5 for ; Fri, 31 Jul 2020 16:08:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wsZ5gbKBfJpS0kEAhEgSsyY+vol7k0zdc2IVxjvZo+s=; b=IPdfxoRvS6R1x5paoBrA7xxYsYLtGQVxRFU7dvuKabenpplKg1IEjvbhFySTmU+Zh2 pNWc8NWMXSOA09JW8gD/0su2yMzSuM6k8hmeNUhvpGyiw2SmpiBLNR4PFrXPpgojBRMR hbzjAFfKzFOv7KayapCPYkLupuCPvPBt2/X9g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wsZ5gbKBfJpS0kEAhEgSsyY+vol7k0zdc2IVxjvZo+s=; b=nIJtH7P97L8RaSE6xsyFRVy+T26UR+Adt9pI9atQetM3yBuiLmQ5E2NWFyTq0920n1 ckHLh+bqUDbCO0rmFCv0AZNBBqtc2+n6P5ekLssnvqKrZ/ISggWyiWRh1hhSLYzxZAFc cl3vVacG2853aCAT5N7ArrKFhIDU0oEg1cyOgABNRrGeAyAQrqVyQiX9mFMZzWJgRGHx GAMV00qhVJ7Q6EszgBYlzBg7kkAUyTkcDT34ogYyVFUPpJqOs66tjUBCb3uXZxL6Xj6Z V1yaUHoPYVSz9eu9xZkzK+UyHyzdWPS6rdCFl7e9bjX1pnFRLex+V3FXSR83Z69l8Imr cfYw== X-Gm-Message-State: AOAM531Y2+HDMtdhY7bhds+YNgi5jx1zKqGQoWma+kZ7MHvSpqRmKbYm wQR1WUeffbMXBToua7McfMUS1g== X-Google-Smtp-Source: ABdhPJw+P56sPmrzKAh4KNkCFVEtBiUO7T0C8QAnvabXluMUkrjDoDQBKdjDkoM7tlMAV3f0yil7bg== X-Received: by 2002:a63:9246:: with SMTP id s6mr5522207pgn.22.1596236924597; Fri, 31 Jul 2020 16:08:44 -0700 (PDT) Received: from www.outflux.net (smtp.outflux.net. [198.145.64.163]) by smtp.gmail.com with ESMTPSA id x9sm10524734pgr.57.2020.07.31.16.08.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2020 16:08:39 -0700 (PDT) From: Kees Cook To: Thomas Gleixner , Will Deacon Subject: [PATCH v5 13/36] vmlinux.lds.h: add PGO and AutoFDO input sections Date: Fri, 31 Jul 2020 16:07:57 -0700 Message-Id: <20200731230820.1742553-14-keescook@chromium.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200731230820.1742553-1-keescook@chromium.org> References: <20200731230820.1742553-1-keescook@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200731_190847_668510_7AD40598 X-CRM114-Status: GOOD ( 19.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , linux-efi@vger.kernel.org, Catalin Marinas , Arvind Sankar , Manoj Gupta , Ard Biesheuvel , linux-arch@vger.kernel.org, =?UTF-8?q?F=C4=81ng-ru=C3=AC=20S=C3=B2ng?= , Masahiro Yamada , x86@kernel.org, Russell King , clang-built-linux@googlegroups.com, Ingo Molnar , Luis Lozano , Borislav Petkov , Kees Cook , Arnd Bergmann , Jian Cai , Nathan Chancellor , Peter Collingbourne , linux-arm-kernel@lists.infradead.org, Nick Desaulniers , linux-kernel@vger.kernel.org, stable@vger.kernel.org, James Morse Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org RnJvbTogTmljayBEZXNhdWxuaWVycyA8bmRlc2F1bG5pZXJzQGdvb2dsZS5jb20+CgpCYXNpY2Fs bHksIGNvbnNpZGVyIC50ZXh0Lntob3R8dW5saWtlbHl8dW5rbm93bn0uKiBwYXJ0IG9mIC50ZXh0 LCB0b28uCgpXaGVuIGNvbXBpbGluZyB3aXRoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiAoY29sbGVj dGVkIHZpYSBQR08KaW5zdHJ1bWVudGF0aW9ucyBvciBBdXRvRkRPIHNhbXBsaW5nKSwgQ2xhbmcg d2lsbCBzZXBhcmF0ZSBjb2RlIGludG8KLnRleHQuaG90LCAudGV4dC51bmxpa2VseSwgb3IgLnRl eHQudW5rbm93biBzZWN0aW9ucyBiYXNlZCBvbiBwcm9maWxpbmcKaW5mb3JtYXRpb24uIEFmdGVy IEQ3OTYwMCAoY2xhbmctMTEpLCB0aGVzZSBzZWN0aW9ucyB3aWxsIGhhdmUgYQp0cmFpbGluZyBg LmAgc3VmZml4LCBpZS4gIC50ZXh0LmhvdC4sIC50ZXh0LnVubGlrZWx5LiwgLnRleHQudW5rbm93 bi4uCgpXaGVuIHVzaW5nIC1mZnVuY3Rpb24tc2VjdGlvbnMgdG9nZXRoZXIgd2l0aCBwcm9maWxp bmcgaW5mb21hdGlvbiwKZWl0aGVyIGV4cGxpY2l0bHkgKEZHS0FTTFIpIG9yIGltcGxpY2l0bHkg KExUTyksIGNvZGUgbWF5IGJlIHBsYWNlZCBpbgpzZWN0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbnZl bnRpb246Ci50ZXh0LmhvdC48Zm9vPiwgLnRleHQudW5saWtlbHkuPGJhcj4sIC50ZXh0LnVua25v d24uPGJhej4Kd2hlcmUgPGZvbz4sIDxiYXI+LCBhbmQgPGJhej4gYXJlIGZ1bmN0aW9ucy4gIChU aGlzIHByb2R1Y2VzIG9uZSBzZWN0aW9uCnBlciBmdW5jdGlvbjsgd2UgZ2VuZXJhbGx5IHRyeSB0 byBtZXJnZSB0aGVzZSBhbGwgYmFjayB2aWEgbGlua2VyIHNjcmlwdApzbyB0aGF0IHdlIGRvbid0 IGhhdmUgNTBrIHNlY3Rpb25zKS4KCkZvciB0aGUgYWJvdmUgY2FzZXMsIHdlIG5lZWQgdG8gdGVh Y2ggb3VyIGxpbmtlciBzY3JpcHRzIHRoYXQgc3VjaApzZWN0aW9ucyBtaWdodCBleGlzdCBhbmQg dGhhdCB3ZSdkIGV4cGxpY2l0bHkgbGlrZSB0aGVtIGdyb3VwZWQKdG9nZXRoZXIsIG90aGVyd2lz ZSB3ZSBjYW4gd2luZCB1cCB3aXRoIGNvZGUgb3V0c2lkZSBvZiB0aGUKX3N0ZXh0L19ldGV4dCBi b3VuZGFyaWVzIHRoYXQgbWlnaHQgbm90IGJlIG1hcHBlZCBwcm9wZXJseSBmb3Igc29tZQphcmNo aXRlY3R1cmVzLCByZXN1bHRpbmcgaW4gYm9vdCBmYWlsdXJlcy4KCklmIHRoZSBsaW5rZXIgc2Ny aXB0IGlzIG5vdCB0b2xkIGFib3V0IHBvc3NpYmxlIGlucHV0IHNlY3Rpb25zLCB0aGVuCndoZXJl IHRoZSBzZWN0aW9uIGlzIHBsYWNlZCBhcyBvdXRwdXQgaXMgYSBoZXVyaXN0aWMtbGFpZGVuIG1l c3MgdGhhdCdzCm5vbi1wb3J0YWJsZSBiZXR3ZWVuIGxpbmtlcnMgKGllLiBCRkQgYW5kIExMRCks IGFuZCBoYXMgcmVzdWx0ZWQgaW4gbWFueQpoYXJkIHRvIGRlYnVnIGJ1Z3MuICBLZWVzIENvb2sg aXMgd29ya2luZyBvbiBjbGVhbmluZyB0aGlzIHVwIGJ5IGFkZGluZwotLW9ycGhhbi1oYW5kbGlu Zz13YXJuIGxpbmtlciBmbGFnIHVzZWQgaW4gQVJDSD1wb3dlcnBjIHRvIGFkZGl0aW9uYWwKYXJj aGl0ZWN0dXJlcy4gSW4gdGhlIGNhc2Ugb2YgbGlua2VyIHNjcmlwdHMsIGJvcnJvd2luZyBmcm9t IHRoZSBaZW4gb2YKUHl0aG9uOiBleHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KCkFs c28sIGxkLmJmZCdzIGludGVybmFsIGxpbmtlciBzY3JpcHQgY29uc2lkZXJzIC50ZXh0LmhvdCBB TkQKLnRleHQuaG90LiogdG8gYmUgcGFydCBvZiAudGV4dCwgYXMgd2VsbCBhcyAudGV4dC51bmxp a2VseSBhbmQKLnRleHQudW5saWtlbHkuKi4gSSBkaWRuJ3Qgc2VlIHN1cHBvcnQgZm9yIC50ZXh0 LnVua25vd24uKiwgYW5kIGRpZG4ndApzZWUgQ2xhbmcgcHJvZHVjaW5nIHN1Y2ggY29kZSBpbiBv dXIga2VybmVsIGJ1aWxkcywgYnV0IEkgc2VlIGNvZGUgaW4KTExWTSB0aGF0IGNhbiBwcm9kdWNl IHN1Y2ggc2VjdGlvbiBuYW1lcyBpZiBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMKbWlzc2luZy4g VGhhdCBtYXkgcG9pbnQgdG8gYSBsYXJnZXIgaXNzdWUgd2l0aCBnZW5lcmF0aW5nIG9yIGNvbGxl Y3RpbmcKcHJvZmlsZXMsIGJ1dCBJIHdvdWxkIG11Y2ggcmF0aGVyIGJlIHNhZmUgYW5kIGV4cGxp Y2l0IHRoYW4gaGF2ZSB0bwpkZWJ1ZyB5ZXQgYW5vdGhlciBpc3N1ZSByZWxhdGVkIHRvIG9ycGhh biBzZWN0aW9uIHBsYWNlbWVudC4KClJlcG9ydGVkLWJ5OiBKaWFuIENhaSA8amlhbmNhaUBnb29n bGUuY29tPgpTdWdnZXN0ZWQtYnk6IEbEgW5nLXJ1w6wgU8OybmcgPG1hc2tyYXlAZ29vZ2xlLmNv bT4KVGVzdGVkLWJ5OiBMdWlzIExvemFubyA8bGxvemFub0Bnb29nbGUuY29tPgpUZXN0ZWQtYnk6 IE1hbm9qIEd1cHRhIDxtYW5vamd1cHRhQGdvb2dsZS5jb20+CkFja2VkLWJ5OiBLZWVzIENvb2sg PGtlZXNjb29rQGNocm9taXVtLm9yZz4KQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcKTGluazog aHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9naXQvP3A9YmludXRpbHMtZ2RiLmdpdDthPWNvbW1pdGRp ZmY7aD1hZGQ0NGY4ZDVjNWMwNWUwOGIxMWUwMzMxMjdhNzQ0ZDYxYzI2YWVlCkxpbms6IGh0dHBz Oi8vc291cmNld2FyZS5vcmcvZ2l0Lz9wPWJpbnV0aWxzLWdkYi5naXQ7YT1jb21taXRkaWZmO2g9 MWRlNzc4ZWQyM2NlNzQ5MmM1MjNkNTg1MGM2YzZkYmIzNDE1MjY1NQpMaW5rOiBodHRwczovL3Jl dmlld3MubGx2bS5vcmcvRDc5NjAwCkxpbms6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9j aHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwODQ3NjAKRGVidWdnZWQtYnk6IEx1aXMgTG96YW5v IDxsbG96YW5vQGdvb2dsZS5jb20+ClNpZ25lZC1vZmYtYnk6IE5pY2sgRGVzYXVsbmllcnMgPG5k ZXNhdWxuaWVyc0Bnb29nbGUuY29tPgpTaWduZWQtb2ZmLWJ5OiBLZWVzIENvb2sgPGtlZXNjb29r QGNocm9taXVtLm9yZz4KLS0tCiBpbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggfCA1 ICsrKystCiAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCgpk aWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9h c20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IDI1OTM5NTdmNmU4Yi4uYWY1MjExY2E4NTdj IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKKysrIGIvaW5j bHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCkBAIC01NjEsNyArNTYxLDEwIEBACiAgKi8K ICNkZWZpbmUgVEVYVF9URVhUCQkJCQkJCVwKIAkJQUxJR05fRlVOQ1RJT04oKTsJCQkJCVwKLQkJ KigudGV4dC5ob3QgVEVYVF9NQUlOIC50ZXh0LmZpeHVwIC50ZXh0LnVubGlrZWx5KQlcCisJCSoo LnRleHQuaG90IC50ZXh0LmhvdC4qKQkJCQlcCisJCSooVEVYVF9NQUlOIC50ZXh0LmZpeHVwKQkJ CQlcCisJCSooLnRleHQudW5saWtlbHkgLnRleHQudW5saWtlbHkuKikJCQlcCisJCSooLnRleHQu dW5rbm93biAudGV4dC51bmtub3duLiopCQkJXAogCQlOT0lOU1RSX1RFWFQJCQkJCQlcCiAJCSoo LnRleHQuLnJlZmNvdW50KQkJCQkJXAogCQkqKC5yZWYudGV4dCkJCQkJCQlcCi0tIAoyLjI1LjEK CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1h cm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0t a2VybmVsCg==