From mboxrd@z Thu Jan 1 00:00:00 1970 From: Qian Cai Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers Date: Wed, 26 Feb 2020 09:12:20 -0500 Message-ID: <1582726340.7365.124.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <1582726182.7365.123.camel@lca.pw> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+glpr-linux-riscv=m.gmane-mx.org@lists.infradead.org To: Anshuman Khandual , linux-mm@kvack.org Cc: Catalin Marinas , Heiko Carstens , Paul Mackerras , "H. Peter Anvin" , linux-riscv@lists.infradead.org, Will Deacon , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, Michael Ellerman , x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , Benjamin Herrenschmidt , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Christophe Leroy , Vineet Gupta , linux-kernel@vger.kernel.org, Palmer List-Id: linux-arch.vger.kernel.org On Wed, 2020-02-26 at 09:09 -0500, Qian Cai wrote: > On Mon, 2020-02-17 at 08:47 +0530, Anshuman Khandual wrote: > > This adds tests which will validate architecture page table helpers and > > other accessors in their compliance with expected generic MM semantics. > > This will help various architectures in validating changes to existing > > page table helpers or addition of new ones. > > > > This test covers basic page table entry transformations including but not > > limited to old, young, dirty, clean, write, write protect etc at various > > level along with populating intermediate entries with next page table page > > and validating them. > > > > Test page table pages are allocated from system memory with required size > > and alignments. The mapped pfns at page table levels are derived from a > > real pfn representing a valid kernel text symbol. This test gets called > > inside kernel_init() right after async_synchronize_full(). > > > > This test gets built and run when CONFIG_DEBUG_VM_PGTABLE is selected. Any > > architecture, which is willing to subscribe this test will need to select > > ARCH_HAS_DEBUG_VM_PGTABLE. For now this is limited to arc, arm64, x86, s390 > > and ppc32 platforms where the test is known to build and run successfully. > > Going forward, other architectures too can subscribe the test after fixing > > any build or runtime problems with their page table helpers. Meanwhile for > > better platform coverage, the test can also be enabled with CONFIG_EXPERT > > even without ARCH_HAS_DEBUG_VM_PGTABLE. > > > > Folks interested in making sure that a given platform's page table helpers > > conform to expected generic MM semantics should enable the above config > > which will just trigger this test during boot. Any non conformity here will > > be reported as an warning which would need to be fixed. This test will help > > catch any changes to the agreed upon semantics expected from generic MM and > > enable platforms to accommodate it thereafter. > > How useful is this that straightly crash the powerpc? And then generate warnings on arm64, [  146.634626][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating architecture page table helpers [  146.643995][    T1] ------------[ cut here ]------------ [  146.649350][    T1] virt_to_phys used for non-linear address: (____ptrval____) (start_kernel+0x0/0x580) [  146.658840][    T1] WARNING: CPU: 165 PID: 1 at arch/arm64/mm/physaddr.c:15 __virt_to_phys+0x98/0xe0 [  146.667976][    T1] Modules linked in: [  146.671741][    T1] CPU: 165 PID: 1 Comm: swapper/0 Tainted: G             L    5.6.0-rc3-next-20200226 #1 [  146.681397][    T1] Hardware name: HPE Apollo 70             /C01_APACHE_MB         , BIOS L50_5.13_1.11 06/18/2019 [  146.691840][    T1] pstate: 60400009 (nZCv daif +PAN -UAO) [  146.697334][    T1] pc : __virt_to_phys+0x98/0xe0 [  146.702045][    T1] lr : __virt_to_phys+0x98/0xe0 [  146.706753][    T1] sp : 18ff00082b7afe10 [  146.710766][    T1] x29: 18ff00082b7afe30 x28: 0000000000000000  [  146.716782][    T1] x27: 0000000000000000 x26: 0000000000000000  [  146.722798][    T1] x25: 0000000000000000 x24: 0000000000000000  [  146.728813][    T1] x23: 0000000000000000 x22: 0000000000000000  [  146.734827][    T1] x21: 0000000000000000 x20: ffff9000135b4000  [  146.740842][    T1] x19: ffff900011200858 x18: 0000000000000000  [  146.746857][    T1] x17: 0000000000000000 x16: 0000000000000000  [  146.752872][    T1] x15: 0000000000000000 x14: 3078302b6c656e72  [  146.758887][    T1] x13: 656b5f7472617473 x12: ffff90001369ea90  [  146.764901][    T1] x11: 00000000000000c9 x10: ffff800082b76c0e  [  146.770917][    T1] x9 : 9d6a2e2260401300 x8 : 9d6a2e2260401300  [  146.776932][    T1] x7 : aaaaaaaaaaaaaaaa x6 : 0000000000000000  [  146.782946][    T1] x5 : 0000000000000080 x4 : 0000000000000000  [  146.788960][    T1] x3 : 0000000000000010 x2 : 0000000000000008  [  146.794975][    T1] x1 : 0000000000000006 x0 : 0000000000000053  [  146.800990][    T1] Call trace: [  146.804140][    T1]  __virt_to_phys+0x98/0xe0 [  146.808512][    T1]  debug_vm_pgtable+0x74/0x3fc [  146.813140][    T1]  kernel_init+0x1c/0x208 [  146.817334][    T1]  ret_from_fork+0x10/0x18 [  146.821608][    T1] irq event stamp: 19843388 [  146.825978][    T1] hardirqs last  enabled at (19843387): [] console_unlock+0x8d0/0x970 [  146.835553][    T1] hardirqs last disabled at (19843388): [] do_debug_exception+0x58/0x2cc [  146.845387][    T1] softirqs last  enabled at (19843384): [] __do_softirq+0x864/0x900 [  146.854796][    T1] softirqs last disabled at (19843377): [] irq_exit+0x1c8/0x238 [  146.863845][    T1] ---[ end trace 31678d9e845dff89 ]--- > > [   23.263425][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating > architecture page table helpers > [   23.263625][    T1] ------------[ cut here ]------------ > [   23.263649][    T1] kernel BUG at arch/powerpc/mm/pgtable.c:274! > [   23.263675][    T1] Oops: Exception in kernel mode, sig: 5 [#1] > [   23.263698][    T1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=256 > DEBUG_PAGEALLOC NUMA PowerNV > [   23.263731][    T1] Modules linked in: > [   23.263752][    T1] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc3-next- > 20200226 #1 > [   23.263776][    T1] NIP:  c00000000007308c LR: c00000000103dbd8 CTR: > 0000000000000000 > [   23.263810][    T1] REGS: c00000003ddaf9c0 TRAP: 0700   Not tainted  (5.6.0- > rc3-next-20200226) > [   23.263846][    T1] MSR:  9000000000029033   CR: > 22000228  XER: 00000000 > [   23.263888][    T1] CFAR: c000000000073030 IRQMASK: 0  > [   23.263888][    T1] GPR00: c00000000103dbd8 c00000003ddafc50 c000000001656f00 > c000001d7b4ca080  > [   23.263888][    T1] GPR04: 0000000000000000 0000000000000009 c00000003ddafc04 > 0000000000000000  > [   23.263888][    T1] GPR08: f0ffffffffffffff 0000000000000001 c0000000016279d0 > 00000000000a0000  > [   23.263888][    T1] GPR12: 0000000000000000 c000001fffffae00 c000000000010e84 > 0000000000000000  > [   23.263888][    T1] GPR16: 0000000000000000 8000000000000105 0000000000000100 > c000000001689a18  > [   23.263888][    T1] GPR20: c00020032c660000 c00020032c620000 c000000001716030 > c00020032c600000  > [   23.263888][    T1] GPR24: 000000000000000d c000000001716030 c000001d7b4ca080 > c000000001716040  > [   23.263888][    T1] GPR28: c000000001716038 0000000000000000 0000000000000000 > 0000000000000000  > [   23.264122][    T1] NIP [c00000000007308c] assert_pte_locked+0x11c/0x320 > [   23.264154][    T1] LR [c00000000103dbd8] debug_vm_pgtable+0x770/0xb7c > [   23.264186][    T1] Call Trace: > [   23.264206][    T1] [c00000003ddafc50] [c000000000999760] > _raw_spin_unlock+0x30/0x70 (unreliable) > [   23.264244][    T1] [c00000003ddafcd0] [c00000000103d924] > debug_vm_pgtable+0x4bc/0xb7c > [   23.264279][    T1] [c00000003ddafdb0] [c000000000010eac] > kernel_init+0x30/0x194 > [   23.264315][    T1] [c00000003ddafe20] [c00000000000b748] > ret_from_kernel_thread+0x5c/0x74 > [   23.264349][    T1] Instruction dump: > [   23.264368][    T1] 60000000 3be00001 7fbef436 eafa0040 7fffc030 3bffffff > 7fff07b4 7ffff038  > [   23.264409][    T1] 7bff1f24 7d37f82a 7d290074 7929d182 <0b090000> ebdb0000 > e93c0000 7fde4a14  > [   23.264460][    T1] ---[ end trace 72d2931022e9ab24 ]--- > [   23.627311][    T1]  > [   24.627407][    T1] Kernel panic - not syncing: Fatal exception > [   26.5 > > > > > Cc: Andrew Morton > > Cc: Mike Rapoport > > Cc: Vineet Gupta > > Cc: Catalin Marinas > > Cc: Will Deacon > > Cc: Benjamin Herrenschmidt > > Cc: Paul Mackerras > > Cc: Michael Ellerman > > Cc: Heiko Carstens > > Cc: Vasily Gorbik > > Cc: Christian Borntraeger > > Cc: Thomas Gleixner > > Cc: Ingo Molnar > > Cc: Borislav Petkov > > Cc: "H. Peter Anvin" > > Cc: Kirill A. Shutemov > > Cc: Paul Walmsley > > Cc: Palmer Dabbelt > > Cc: linux-snps-arc@lists.infradead.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linuxppc-dev@lists.ozlabs.org > > Cc: linux-s390@vger.kernel.org > > Cc: linux-riscv@lists.infradead.org > > Cc: x86@kernel.org > > Cc: linux-arch@vger.kernel.org > > Cc: linux-kernel@vger.kernel.org > > > > Suggested-by: Catalin Marinas > > Reviewed-by: Ingo Molnar > > Tested-by: Gerald Schaefer # s390 > > Tested-by: Christophe Leroy # ppc32 > > Signed-off-by: Andrew Morton > > Signed-off-by: Christophe Leroy > > Signed-off-by: Anshuman Khandual > > --- > > This adds a test validation for architecture exported page table helpers. > > Patch adds basic transformation tests at various levels of the page table. > > > > This test was originally suggested by Catalin during arm64 THP migration > > RFC discussion earlier. Going forward it can include more specific tests > > with respect to various generic MM functions like THP, HugeTLB etc and > > platform specific tests. > > > > https://lore.kernel.org/linux-mm/20190628102003.GA56463@arrakis.emea.arm.com/ > > > > Needs to be applied on linux V5.6-rc2 > > > > Changes in V14: > > > > - Disabled DEBUG_VM_PGFLAGS for IA64 and ARM (32 Bit) per Andrew and Christophe > > - Updated DEBUG_VM_PGFLAGS documentation wrt EXPERT and disabled platforms > > - Updated RANDOM_[OR|NZ]VALUE open encodings with GENMASK() per Catalin > > - Updated s390 constraint bits from 12 to 4 (S390_MASK_BITS) per Gerald > > - Updated in-code documentation for RANDOM_ORVALUE per Gerald > > - Updated pxx_basic_tests() to use invert functions first per Catalin > > - Dropped ARCH_HAS_4LEVEL_HACK check from pud_basic_tests() > > - Replaced __ARCH_HAS_[4|5]LEVEL_HACK with __PAGETABLE_[PUD|P4D]_FOLDED per Catalin > > - Trimmed the CC list on the commit message per Catalin > > > > Changes in V13: (https://patchwork.kernel.org/project/linux-mm/list/?series=237125) > > > > - Subscribed s390 platform and updated debug-vm-pgtable/arch-support.txt per Gerald > > - Dropped keyword 'extern' from debug_vm_pgtable() declaration per Christophe > > - Moved debug_vm_pgtable() declarations to per Christophe > > - Moved debug_vm_pgtable() call site into kernel_init() per Christophe > > - Changed CONFIG_DEBUG_VM_PGTABLE rules per Christophe > > - Updated commit to include new supported platforms and changed config selection > > > > Changes in V12: (https://patchwork.kernel.org/project/linux-mm/list/?series=233905) > > > > - Replaced __mmdrop() with mmdrop() > > - Enable ARCH_HAS_DEBUG_VM_PGTABLE on X86 for non CONFIG_X86_PAE platforms as the > > test procedure interfere with pre-allocated PMDs attached to the PGD resulting > > in runtime failures with VM_BUG_ON() > > > > Changes in V11: (https://patchwork.kernel.org/project/linux-mm/list/?series=221135) > > > > - Rebased the patch on V5.4 > > > > Changes in V10: (https://patchwork.kernel.org/project/linux-mm/list/?series=205529) > > > > - Always enable DEBUG_VM_PGTABLE when DEBUG_VM is enabled per Ingo > > - Added tags from Ingo > > > > Changes in V9: (https://patchwork.kernel.org/project/linux-mm/list/?series=201429) > > > > - Changed feature support enumeration for powerpc platforms per Christophe > > - Changed config wrapper for basic_[pmd|pud]_tests() to enable ARC platform > > - Enabled the test on ARC platform > > > > Changes in V8: (https://patchwork.kernel.org/project/linux-mm/list/?series=194297) > > > > - Enabled ARCH_HAS_DEBUG_VM_PGTABLE on PPC32 platform per Christophe > > - Updated feature documentation as DEBUG_VM_PGTABLE is now enabled on PPC32 platform > > - Moved ARCH_HAS_DEBUG_VM_PGTABLE earlier to indent it with DEBUG_VM per Christophe > > - Added an information message in debug_vm_pgtable() per Christophe > > - Dropped random_vaddr boundary condition checks per Christophe and Qian > > - Replaced virt_addr_valid() check with pfn_valid() check in debug_vm_pgtable() > > - Slightly changed pr_fmt(fmt) information > > > > Changes in V7: (https://patchwork.kernel.org/project/linux-mm/list/?series=193051) > > > > - Memory allocation and free routines for mapped pages have been droped > > - Mapped pfns are derived from standard kernel text symbol per Matthew > > - Moved debug_vm_pgtaable() after page_alloc_init_late() per Michal and Qian > > - Updated the commit message per Michal > > - Updated W=1 GCC warning problem on x86 per Qian Cai > > - Addition of new alloc_contig_pages() helper has been submitted separately > > > > Changes in V6: (https://patchwork.kernel.org/project/linux-mm/list/?series=187589) > > > > - Moved alloc_gigantic_page_order() into mm/page_alloc.c per Michal > > - Moved alloc_gigantic_page_order() within CONFIG_CONTIG_ALLOC in the test > > - Folded Andrew's include/asm-generic/pgtable.h fix into the test patch 2/2 > > > > Changes in V5: (https://patchwork.kernel.org/project/linux-mm/list/?series=185991) > > > > - Redefined and moved X86 mm_p4d_folded() into a different header per Kirill/Ingo > > - Updated the config option comment per Ingo and dropped 'kernel module' reference > > - Updated the commit message and dropped 'kernel module' reference > > - Changed DEBUG_ARCH_PGTABLE_TEST into DEBUG_VM_PGTABLE per Ingo > > - Moved config option from mm/Kconfig.debug into lib/Kconfig.debug > > - Renamed core test function arch_pgtable_tests() as debug_vm_pgtable() > > - Renamed mm/arch_pgtable_test.c as mm/debug_vm_pgtable.c > > - debug_vm_pgtable() gets called from kernel_init_freeable() after init_mm_internals() > > - Added an entry in Documentation/features/debug/ per Ingo > > - Enabled the test on arm64 and x86 platforms for now > > > > Changes in V4: (https://patchwork.kernel.org/project/linux-mm/list/?series=183465) > > > > - Disable DEBUG_ARCH_PGTABLE_TEST for ARM and IA64 platforms > > > > Changes in V3: (https://lore.kernel.org/patchwork/project/lkml/list/?series=411216) > > > > - Changed test trigger from module format into late_initcall() > > - Marked all functions with __init to be freed after completion > > - Changed all __PGTABLE_PXX_FOLDED checks as mm_pxx_folded() > > - Folded in PPC32 fixes from Christophe > > > > Changes in V2: > > > > https://lore.kernel.org/linux-mm/1568268173-31302-1-git-send-email-anshuman.khandual@arm.com/T/#t > > > > - Fixed small typo error in MODULE_DESCRIPTION() > > - Fixed m64k build problems for lvalue concerns in pmd_xxx_tests() > > - Fixed dynamic page table level folding problems on x86 as per Kirril > > - Fixed second pointers during pxx_populate_tests() per Kirill and Gerald > > - Allocate and free pte table with pte_alloc_one/pte_free per Kirill > > - Modified pxx_clear_tests() to accommodate s390 lower 12 bits situation > > - Changed RANDOM_NZVALUE value from 0xbe to 0xff > > - Changed allocation, usage, free sequence for saved_ptep > > - Renamed VMA_FLAGS as VMFLAGS > > - Implemented a new method for random vaddr generation > > - Implemented some other cleanups > > - Dropped extern reference to mm_alloc() > > - Created and exported new alloc_gigantic_page_order() > > - Dropped the custom allocator and used new alloc_gigantic_page_order() > > > > Changes in V1: > > > > https://lore.kernel.org/linux-mm/1567497706-8649-1-git-send-email-anshuman.khandual@arm.com/ > > > > - Added fallback mechanism for PMD aligned memory allocation failure > > > > Changes in RFC V2: > > > > https://lore.kernel.org/linux-mm/1565335998-22553-1-git-send-email-anshuman.khandual@arm.com/T/#u > > > > - Moved test module and it's config from lib/ to mm/ > > - Renamed config TEST_ARCH_PGTABLE as DEBUG_ARCH_PGTABLE_TEST > > - Renamed file from test_arch_pgtable.c to arch_pgtable_test.c > > - Added relevant MODULE_DESCRIPTION() and MODULE_AUTHOR() details > > - Dropped loadable module config option > > - Basic tests now use memory blocks with required size and alignment > > - PUD aligned memory block gets allocated with alloc_contig_range() > > - If PUD aligned memory could not be allocated it falls back on PMD aligned > > memory block from page allocator and pud_* tests are skipped > > - Clear and populate tests now operate on real in memory page table entries > > - Dummy mm_struct gets allocated with mm_alloc() > > - Dummy page table entries get allocated with [pud|pmd|pte]_alloc_[map]() > > - Simplified [p4d|pgd]_basic_tests(), now has random values in the entries > > > > Original RFC V1: > > > > https://lore.kernel.org/linux-mm/1564037723-26676-1-git-send-email-anshuman.khandual@arm.com/ > > > > > > .../debug/debug-vm-pgtable/arch-support.txt | 35 ++ > > arch/arc/Kconfig | 1 + > > arch/arm64/Kconfig | 1 + > > arch/powerpc/Kconfig | 1 + > > arch/s390/Kconfig | 1 + > > arch/x86/Kconfig | 1 + > > arch/x86/include/asm/pgtable_64.h | 6 + > > include/linux/mmdebug.h | 5 + > > init/main.c | 2 + > > lib/Kconfig.debug | 26 ++ > > mm/Makefile | 1 + > > mm/debug_vm_pgtable.c | 389 ++++++++++++++++++ > > 12 files changed, 469 insertions(+) > > create mode 100644 Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > create mode 100644 mm/debug_vm_pgtable.c > > > > diff --git a/Documentation/features/debug/debug-vm-pgtable/arch-support.txt b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > new file mode 100644 > > index 000000000000..64d0f9b15c49 > > --- /dev/null > > +++ b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > @@ -0,0 +1,35 @@ > > +# > > +# Feature name: debug-vm-pgtable > > +# Kconfig: ARCH_HAS_DEBUG_VM_PGTABLE > > +# description: arch supports pgtable tests for semantics compliance > > +# > > + ----------------------- > > + | arch |status| > > + ----------------------- > > + | alpha: | TODO | > > + | arc: | ok | > > + | arm: | TODO | > > + | arm64: | ok | > > + | c6x: | TODO | > > + | csky: | TODO | > > + | h8300: | TODO | > > + | hexagon: | TODO | > > + | ia64: | TODO | > > + | m68k: | TODO | > > + | microblaze: | TODO | > > + | mips: | TODO | > > + | nds32: | TODO | > > + | nios2: | TODO | > > + | openrisc: | TODO | > > + | parisc: | TODO | > > + | powerpc/32: | ok | > > + | powerpc/64: | TODO | > > + | riscv: | TODO | > > + | s390: | ok | > > + | sh: | TODO | > > + | sparc: | TODO | > > + | um: | TODO | > > + | unicore32: | TODO | > > + | x86: | ok | > > + | xtensa: | TODO | > > + ----------------------- > > diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig > > index ff2a393b635c..3e72e6cf0e42 100644 > > --- a/arch/arc/Kconfig > > +++ b/arch/arc/Kconfig > > @@ -6,6 +6,7 @@ > > config ARC > > def_bool y > > select ARC_TIMERS > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_SETUP_DMA_OPS > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > > index 0b30e884e088..aaf8ba415145 100644 > > --- a/arch/arm64/Kconfig > > +++ b/arch/arm64/Kconfig > > @@ -11,6 +11,7 @@ config ARM64 > > select ACPI_PPTT if ACPI > > select ARCH_CLOCKSOURCE_DATA > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 497b7d0b2d7e..8d5ae14c5d4c 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -116,6 +116,7 @@ config PPC > > # > > select ARCH_32BIT_OFF_T if PPC32 > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if PPC32 > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig > > index 8abe77536d9d..af284dbb07e7 100644 > > --- a/arch/s390/Kconfig > > +++ b/arch/s390/Kconfig > > @@ -59,6 +59,7 @@ config KASAN_SHADOW_OFFSET > > config S390 > > def_bool y > > select ARCH_BINFMT_ELF_STATE > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > > index beea77046f9b..df8a19e52e82 100644 > > --- a/arch/x86/Kconfig > > +++ b/arch/x86/Kconfig > > @@ -61,6 +61,7 @@ config X86 > > select ARCH_CLOCKSOURCE_INIT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FAST_MULTIPLIER > > diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h > > index 0b6c4042942a..fb0e76d254b3 100644 > > --- a/arch/x86/include/asm/pgtable_64.h > > +++ b/arch/x86/include/asm/pgtable_64.h > > @@ -53,6 +53,12 @@ static inline void sync_initial_page_table(void) { } > > > > struct mm_struct; > > > > +#define mm_p4d_folded mm_p4d_folded > > +static inline bool mm_p4d_folded(struct mm_struct *mm) > > +{ > > + return !pgtable_l5_enabled(); > > +} > > + > > void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); > > void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); > > > > diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h > > index 2ad72d2c8cc5..5339aa14b749 100644 > > --- a/include/linux/mmdebug.h > > +++ b/include/linux/mmdebug.h > > @@ -64,4 +64,9 @@ void dump_mm(const struct mm_struct *mm); > > #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) > > #endif > > > > +#ifdef CONFIG_DEBUG_VM_PGTABLE > > +void debug_vm_pgtable(void); > > +#else > > +static inline void debug_vm_pgtable(void) { } > > +#endif > > #endif > > diff --git a/init/main.c b/init/main.c > > index cc0ee4873419..adf37e8b1d69 100644 > > --- a/init/main.c > > +++ b/init/main.c > > @@ -94,6 +94,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -1323,6 +1324,7 @@ static int __ref kernel_init(void *unused) > > kernel_init_freeable(); > > /* need to finish all async __init code before freeing the memory */ > > async_synchronize_full(); > > + debug_vm_pgtable(); > > ftrace_free_init_mem(); > > free_initmem(); > > mark_readonly(); > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 69def4a9df00..1b5bd9f7c967 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -653,6 +653,12 @@ config SCHED_STACK_END_CHECK > > data corruption or a sporadic crash at a later stage once the region > > is examined. The runtime overhead introduced is minimal. > > > > +config ARCH_HAS_DEBUG_VM_PGTABLE > > + bool > > + help > > + An architecture should select this when it can successfully > > + build and run DEBUG_VM_PGTABLE. > > + > > config DEBUG_VM > > bool "Debug VM" > > depends on DEBUG_KERNEL > > @@ -688,6 +694,26 @@ config DEBUG_VM_PGFLAGS > > > > If unsure, say N. > > > > +config DEBUG_VM_PGTABLE > > + bool "Debug arch page table for semantics compliance" > > + depends on MMU > > + depends on !IA64 && !ARM > > + depends on ARCH_HAS_DEBUG_VM_PGTABLE || EXPERT > > + default n if !ARCH_HAS_DEBUG_VM_PGTABLE > > + default y if DEBUG_VM > > + help > > + This option provides a debug method which can be used to test > > + architecture page table helper functions on various platforms in > > + verifying if they comply with expected generic MM semantics. This > > + will help architecture code in making sure that any changes or > > + new additions of these helpers still conform to expected > > + semantics of the generic MM. Platforms will have to opt in for > > + this through ARCH_HAS_DEBUG_VM_PGTABLE. Although it can also be > > + enabled through EXPERT without requiring code change. This test > > + is disabled on IA64 and ARM platforms where it fails to build. > > + > > + If unsure, say N. > > + > > config ARCH_HAS_DEBUG_VIRTUAL > > bool > > > > diff --git a/mm/Makefile b/mm/Makefile > > index 272e66039e70..b0692e6a4b58 100644 > > --- a/mm/Makefile > > +++ b/mm/Makefile > > @@ -87,6 +87,7 @@ obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o > > obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o > > obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o > > obj-$(CONFIG_DEBUG_RODATA_TEST) += rodata_test.o > > +obj-$(CONFIG_DEBUG_VM_PGTABLE) += debug_vm_pgtable.o > > obj-$(CONFIG_PAGE_OWNER) += page_owner.o > > obj-$(CONFIG_CLEANCACHE) += cleancache.o > > obj-$(CONFIG_MEMORY_ISOLATION) += page_isolation.o > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > > new file mode 100644 > > index 000000000000..70bf8ed8fd51 > > --- /dev/null > > +++ b/mm/debug_vm_pgtable.c > > @@ -0,0 +1,389 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * This kernel test validates architecture page table helpers and > > + * accessors and helps in verifying their continued compliance with > > + * expected generic MM semantics. > > + * > > + * Copyright (C) 2019 ARM Ltd. > > + * > > + * Author: Anshuman Khandual > > + */ > > +#define pr_fmt(fmt) "debug_vm_pgtable: %s: " fmt, __func__ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* > > + * Basic operations > > + * > > + * mkold(entry) = An old and not a young entry > > + * mkyoung(entry) = A young and not an old entry > > + * mkdirty(entry) = A dirty and not a clean entry > > + * mkclean(entry) = A clean and not a dirty entry > > + * mkwrite(entry) = A write and not a write protected entry > > + * wrprotect(entry) = A write protected and not a write entry > > + * pxx_bad(entry) = A mapped and non-table entry > > + * pxx_same(entry1, entry2) = Both entries hold the exact same value > > + */ > > +#define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > + > > +/* > > + * On s390 platform, the lower 4 bits are used to identify given page table > > + * entry type. But these bits might affect the ability to clear entries with > > + * pxx_clear() because of how dynamic page table folding works on s390. So > > + * while loading up the entries do not change the lower 4 bits. It does not > > + * have affect any other platform. > > + */ > > +#define S390_MASK_BITS 4 > > +#define RANDOM_ORVALUE GENMASK(BITS_PER_LONG - 1, S390_MASK_BITS) > > +#define RANDOM_NZVALUE GENMASK(7, 0) > > + > > +static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pte_t pte = pfn_pte(pfn, prot); > > + > > + WARN_ON(!pte_same(pte, pte)); > > + WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte)))); > > + WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte)))); > > + WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte)))); > > + WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte)))); > > + WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte)))); > > + WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > > +} > > + > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pmd_t pmd = pfn_pmd(pfn, prot); > > + > > + WARN_ON(!pmd_same(pmd, pmd)); > > + WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd)))); > > + WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd)))); > > + WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd)))); > > + WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd)))); > > + WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd)))); > > + WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd)))); > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pmd_bad(). > > + */ > > + WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > > +} > > + > > +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pud_t pud = pfn_pud(pfn, prot); > > + > > + WARN_ON(!pud_same(pud, pud)); > > + WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud)))); > > + WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud)))); > > + WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud)))); > > + WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud)))); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pud_bad(). > > + */ > > + WARN_ON(!pud_bad(pud_mkhuge(pud))); > > +} > > +#else > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > +#else > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > + > > +static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + p4d_t p4d; > > + > > + memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t)); > > + WARN_ON(!p4d_same(p4d, p4d)); > > +} > > + > > +static void __init pgd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pgd_t pgd; > > + > > + memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t)); > > + WARN_ON(!pgd_same(pgd, pgd)); > > +} > > + > > +#ifndef __PAGETABLE_PUD_FOLDED > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) > > +{ > > + pud_t pud = READ_ONCE(*pudp); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + pud = __pud(pud_val(pud) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pudp, pud); > > + pud_clear(pudp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(!pud_none(pud)); > > +} > > + > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > + pud_t pud; > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pud_bad(). > > + */ > > + pmd_clear(pmdp); > > + pud_clear(pudp); > > + pud_populate(mm, pudp, pmdp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(pud_bad(pud)); > > +} > > +#else > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) { } > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > +} > > +#endif > > + > > +#ifndef __PAGETABLE_P4D_FOLDED > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) > > +{ > > + p4d_t p4d = READ_ONCE(*p4dp); > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + p4d = __p4d(p4d_val(p4d) | RANDOM_ORVALUE); > > + WRITE_ONCE(*p4dp, p4d); > > + p4d_clear(p4dp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(!p4d_none(p4d)); > > +} > > + > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > + p4d_t p4d; > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as p4d_bad(). > > + */ > > + pud_clear(pudp); > > + p4d_clear(p4dp); > > + p4d_populate(mm, p4dp, pudp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(p4d_bad(p4d)); > > +} > > + > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) > > +{ > > + pgd_t pgd = READ_ONCE(*pgdp); > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + pgd = __pgd(pgd_val(pgd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pgdp, pgd); > > + pgd_clear(pgdp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(!pgd_none(pgd)); > > +} > > + > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > + pgd_t pgd; > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pgd_bad(). > > + */ > > + p4d_clear(p4dp); > > + pgd_clear(pgdp); > > + pgd_populate(mm, pgdp, p4dp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(pgd_bad(pgd)); > > +} > > +#else > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) { } > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) { } > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > +} > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > +} > > +#endif > > + > > +static void __init pte_clear_tests(struct mm_struct *mm, pte_t *ptep) > > +{ > > + pte_t pte = READ_ONCE(*ptep); > > + > > + pte = __pte(pte_val(pte) | RANDOM_ORVALUE); > > + WRITE_ONCE(*ptep, pte); > > + pte_clear(mm, 0, ptep); > > + pte = READ_ONCE(*ptep); > > + WARN_ON(!pte_none(pte)); > > +} > > + > > +static void __init pmd_clear_tests(struct mm_struct *mm, pmd_t *pmdp) > > +{ > > + pmd_t pmd = READ_ONCE(*pmdp); > > + > > + pmd = __pmd(pmd_val(pmd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pmdp, pmd); > > + pmd_clear(pmdp); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(!pmd_none(pmd)); > > +} > > + > > +static void __init pmd_populate_tests(struct mm_struct *mm, pmd_t *pmdp, > > + pgtable_t pgtable) > > +{ > > + pmd_t pmd; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pmd_bad(). > > + */ > > + pmd_clear(pmdp); > > + pmd_populate(mm, pmdp, pgtable); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(pmd_bad(pmd)); > > +} > > + > > +static unsigned long __init get_random_vaddr(void) > > +{ > > + unsigned long random_vaddr, random_pages, total_user_pages; > > + > > + total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE; > > + > > + random_pages = get_random_long() % total_user_pages; > > + random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE; > > + > > + return random_vaddr; > > +} > > + > > +void __init debug_vm_pgtable(void) > > +{ > > + struct mm_struct *mm; > > + pgd_t *pgdp; > > + p4d_t *p4dp, *saved_p4dp; > > + pud_t *pudp, *saved_pudp; > > + pmd_t *pmdp, *saved_pmdp, pmd; > > + pte_t *ptep; > > + pgtable_t saved_ptep; > > + pgprot_t prot; > > + phys_addr_t paddr; > > + unsigned long vaddr, pte_aligned, pmd_aligned; > > + unsigned long pud_aligned, p4d_aligned, pgd_aligned; > > + > > + pr_info("Validating architecture page table helpers\n"); > > + prot = vm_get_page_prot(VMFLAGS); > > + vaddr = get_random_vaddr(); > > + mm = mm_alloc(); > > + if (!mm) { > > + pr_err("mm_struct allocation failed\n"); > > + return; > > + } > > + > > + /* > > + * PFN for mapping at PTE level is determined from a standard kernel > > + * text symbol. But pfns for higher page table levels are derived by > > + * masking lower bits of this real pfn. These derived pfns might not > > + * exist on the platform but that does not really matter as pfn_pxx() > > + * helpers will still create appropriate entries for the test. This > > + * helps avoid large memory block allocations to be used for mapping > > + * at higher page table levels. > > + */ > > + paddr = __pa(&start_kernel); > > + > > + pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT; > > + pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT; > > + pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT; > > + p4d_aligned = (paddr & P4D_MASK) >> PAGE_SHIFT; > > + pgd_aligned = (paddr & PGDIR_MASK) >> PAGE_SHIFT; > > + WARN_ON(!pfn_valid(pte_aligned)); > > + > > + pgdp = pgd_offset(mm, vaddr); > > + p4dp = p4d_alloc(mm, pgdp, vaddr); > > + pudp = pud_alloc(mm, p4dp, vaddr); > > + pmdp = pmd_alloc(mm, pudp, vaddr); > > + ptep = pte_alloc_map(mm, pmdp, vaddr); > > + > > + /* > > + * Save all the page table page addresses as the page table > > + * entries will be used for testing with random or garbage > > + * values. These saved addresses will be used for freeing > > + * page table pages. > > + */ > > + pmd = READ_ONCE(*pmdp); > > + saved_p4dp = p4d_offset(pgdp, 0UL); > > + saved_pudp = pud_offset(p4dp, 0UL); > > + saved_pmdp = pmd_offset(pudp, 0UL); > > + saved_ptep = pmd_pgtable(pmd); > > + > > + pte_basic_tests(pte_aligned, prot); > > + pmd_basic_tests(pmd_aligned, prot); > > + pud_basic_tests(pud_aligned, prot); > > + p4d_basic_tests(p4d_aligned, prot); > > + pgd_basic_tests(pgd_aligned, prot); > > + > > + pte_clear_tests(mm, ptep); > > + pmd_clear_tests(mm, pmdp); > > + pud_clear_tests(mm, pudp); > > + p4d_clear_tests(mm, p4dp); > > + pgd_clear_tests(mm, pgdp); > > + > > + pte_unmap(ptep); > > + > > + pmd_populate_tests(mm, pmdp, saved_ptep); > > + pud_populate_tests(mm, pudp, saved_pmdp); > > + p4d_populate_tests(mm, p4dp, saved_pudp); > > + pgd_populate_tests(mm, pgdp, saved_p4dp); > > + > > + p4d_free(mm, saved_p4dp); > > + pud_free(mm, saved_pudp); > > + pmd_free(mm, saved_pmdp); > > + pte_free(mm, saved_ptep); > > + > > + mm_dec_nr_puds(mm); > > + mm_dec_nr_pmds(mm); > > + mm_dec_nr_ptes(mm); > > + mmdrop(mm); > > +} From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <1582726340.7365.124.camel@lca.pw> Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers From: Qian Cai Date: Wed, 26 Feb 2020 09:12:20 -0500 In-Reply-To: <1582726182.7365.123.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 8bit List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+rppt=linux.ibm.com@lists.infradead.org To: Anshuman Khandual , linux-mm@kvack.org Cc: Catalin Marinas , Heiko Carstens , Paul Mackerras , "H. Peter Anvin" , linux-riscv@lists.infradead.org, Will Deacon , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, Michael Ellerman , x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , Benjamin Herrenschmidt , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Christophe Leroy , Vineet Gupta , linux-kernel@vger.kernel.org, Palmer Dabbelt , Andrew Morton , linuxppc-dev@lists.ozlabs.org List-ID: Message-ID: <20200226141220.WGxKniIrC42k9opnnhbIsZsjAxaNaegKmJKzbkEH7tc@z> On Wed, 2020-02-26 at 09:09 -0500, Qian Cai wrote: > On Mon, 2020-02-17 at 08:47 +0530, Anshuman Khandual wrote: > > This adds tests which will validate architecture page table helpers and > > other accessors in their compliance with expected generic MM semantics. > > This will help various architectures in validating changes to existing > > page table helpers or addition of new ones. > > > > This test covers basic page table entry transformations including but not > > limited to old, young, dirty, clean, write, write protect etc at various > > level along with populating intermediate entries with next page table page > > and validating them. > > > > Test page table pages are allocated from system memory with required size > > and alignments. The mapped pfns at page table levels are derived from a > > real pfn representing a valid kernel text symbol. This test gets called > > inside kernel_init() right after async_synchronize_full(). > > > > This test gets built and run when CONFIG_DEBUG_VM_PGTABLE is selected. Any > > architecture, which is willing to subscribe this test will need to select > > ARCH_HAS_DEBUG_VM_PGTABLE. For now this is limited to arc, arm64, x86, s390 > > and ppc32 platforms where the test is known to build and run successfully. > > Going forward, other architectures too can subscribe the test after fixing > > any build or runtime problems with their page table helpers. Meanwhile for > > better platform coverage, the test can also be enabled with CONFIG_EXPERT > > even without ARCH_HAS_DEBUG_VM_PGTABLE. > > > > Folks interested in making sure that a given platform's page table helpers > > conform to expected generic MM semantics should enable the above config > > which will just trigger this test during boot. Any non conformity here will > > be reported as an warning which would need to be fixed. This test will help > > catch any changes to the agreed upon semantics expected from generic MM and > > enable platforms to accommodate it thereafter. > > How useful is this that straightly crash the powerpc? And then generate warnings on arm64, [  146.634626][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating architecture page table helpers [  146.643995][    T1] ------------[ cut here ]------------ [  146.649350][    T1] virt_to_phys used for non-linear address: (____ptrval____) (start_kernel+0x0/0x580) [  146.658840][    T1] WARNING: CPU: 165 PID: 1 at arch/arm64/mm/physaddr.c:15 __virt_to_phys+0x98/0xe0 [  146.667976][    T1] Modules linked in: [  146.671741][    T1] CPU: 165 PID: 1 Comm: swapper/0 Tainted: G             L    5.6.0-rc3-next-20200226 #1 [  146.681397][    T1] Hardware name: HPE Apollo 70             /C01_APACHE_MB         , BIOS L50_5.13_1.11 06/18/2019 [  146.691840][    T1] pstate: 60400009 (nZCv daif +PAN -UAO) [  146.697334][    T1] pc : __virt_to_phys+0x98/0xe0 [  146.702045][    T1] lr : __virt_to_phys+0x98/0xe0 [  146.706753][    T1] sp : 18ff00082b7afe10 [  146.710766][    T1] x29: 18ff00082b7afe30 x28: 0000000000000000  [  146.716782][    T1] x27: 0000000000000000 x26: 0000000000000000  [  146.722798][    T1] x25: 0000000000000000 x24: 0000000000000000  [  146.728813][    T1] x23: 0000000000000000 x22: 0000000000000000  [  146.734827][    T1] x21: 0000000000000000 x20: ffff9000135b4000  [  146.740842][    T1] x19: ffff900011200858 x18: 0000000000000000  [  146.746857][    T1] x17: 0000000000000000 x16: 0000000000000000  [  146.752872][    T1] x15: 0000000000000000 x14: 3078302b6c656e72  [  146.758887][    T1] x13: 656b5f7472617473 x12: ffff90001369ea90  [  146.764901][    T1] x11: 00000000000000c9 x10: ffff800082b76c0e  [  146.770917][    T1] x9 : 9d6a2e2260401300 x8 : 9d6a2e2260401300  [  146.776932][    T1] x7 : aaaaaaaaaaaaaaaa x6 : 0000000000000000  [  146.782946][    T1] x5 : 0000000000000080 x4 : 0000000000000000  [  146.788960][    T1] x3 : 0000000000000010 x2 : 0000000000000008  [  146.794975][    T1] x1 : 0000000000000006 x0 : 0000000000000053  [  146.800990][    T1] Call trace: [  146.804140][    T1]  __virt_to_phys+0x98/0xe0 [  146.808512][    T1]  debug_vm_pgtable+0x74/0x3fc [  146.813140][    T1]  kernel_init+0x1c/0x208 [  146.817334][    T1]  ret_from_fork+0x10/0x18 [  146.821608][    T1] irq event stamp: 19843388 [  146.825978][    T1] hardirqs last  enabled at (19843387): [] console_unlock+0x8d0/0x970 [  146.835553][    T1] hardirqs last disabled at (19843388): [] do_debug_exception+0x58/0x2cc [  146.845387][    T1] softirqs last  enabled at (19843384): [] __do_softirq+0x864/0x900 [  146.854796][    T1] softirqs last disabled at (19843377): [] irq_exit+0x1c8/0x238 [  146.863845][    T1] ---[ end trace 31678d9e845dff89 ]--- > > [   23.263425][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating > architecture page table helpers > [   23.263625][    T1] ------------[ cut here ]------------ > [   23.263649][    T1] kernel BUG at arch/powerpc/mm/pgtable.c:274! > [   23.263675][    T1] Oops: Exception in kernel mode, sig: 5 [#1] > [   23.263698][    T1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=256 > DEBUG_PAGEALLOC NUMA PowerNV > [   23.263731][    T1] Modules linked in: > [   23.263752][    T1] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc3-next- > 20200226 #1 > [   23.263776][    T1] NIP:  c00000000007308c LR: c00000000103dbd8 CTR: > 0000000000000000 > [   23.263810][    T1] REGS: c00000003ddaf9c0 TRAP: 0700   Not tainted  (5.6.0- > rc3-next-20200226) > [   23.263846][    T1] MSR:  9000000000029033   CR: > 22000228  XER: 00000000 > [   23.263888][    T1] CFAR: c000000000073030 IRQMASK: 0  > [   23.263888][    T1] GPR00: c00000000103dbd8 c00000003ddafc50 c000000001656f00 > c000001d7b4ca080  > [   23.263888][    T1] GPR04: 0000000000000000 0000000000000009 c00000003ddafc04 > 0000000000000000  > [   23.263888][    T1] GPR08: f0ffffffffffffff 0000000000000001 c0000000016279d0 > 00000000000a0000  > [   23.263888][    T1] GPR12: 0000000000000000 c000001fffffae00 c000000000010e84 > 0000000000000000  > [   23.263888][    T1] GPR16: 0000000000000000 8000000000000105 0000000000000100 > c000000001689a18  > [   23.263888][    T1] GPR20: c00020032c660000 c00020032c620000 c000000001716030 > c00020032c600000  > [   23.263888][    T1] GPR24: 000000000000000d c000000001716030 c000001d7b4ca080 > c000000001716040  > [   23.263888][    T1] GPR28: c000000001716038 0000000000000000 0000000000000000 > 0000000000000000  > [   23.264122][    T1] NIP [c00000000007308c] assert_pte_locked+0x11c/0x320 > [   23.264154][    T1] LR [c00000000103dbd8] debug_vm_pgtable+0x770/0xb7c > [   23.264186][    T1] Call Trace: > [   23.264206][    T1] [c00000003ddafc50] [c000000000999760] > _raw_spin_unlock+0x30/0x70 (unreliable) > [   23.264244][    T1] [c00000003ddafcd0] [c00000000103d924] > debug_vm_pgtable+0x4bc/0xb7c > [   23.264279][    T1] [c00000003ddafdb0] [c000000000010eac] > kernel_init+0x30/0x194 > [   23.264315][    T1] [c00000003ddafe20] [c00000000000b748] > ret_from_kernel_thread+0x5c/0x74 > [   23.264349][    T1] Instruction dump: > [   23.264368][    T1] 60000000 3be00001 7fbef436 eafa0040 7fffc030 3bffffff > 7fff07b4 7ffff038  > [   23.264409][    T1] 7bff1f24 7d37f82a 7d290074 7929d182 <0b090000> ebdb0000 > e93c0000 7fde4a14  > [   23.264460][    T1] ---[ end trace 72d2931022e9ab24 ]--- > [   23.627311][    T1]  > [   24.627407][    T1] Kernel panic - not syncing: Fatal exception > [   26.5 > > > > > Cc: Andrew Morton > > Cc: Mike Rapoport > > Cc: Vineet Gupta > > Cc: Catalin Marinas > > Cc: Will Deacon > > Cc: Benjamin Herrenschmidt > > Cc: Paul Mackerras > > Cc: Michael Ellerman > > Cc: Heiko Carstens > > Cc: Vasily Gorbik > > Cc: Christian Borntraeger > > Cc: Thomas Gleixner > > Cc: Ingo Molnar > > Cc: Borislav Petkov > > Cc: "H. Peter Anvin" > > Cc: Kirill A. Shutemov > > Cc: Paul Walmsley > > Cc: Palmer Dabbelt > > Cc: linux-snps-arc@lists.infradead.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linuxppc-dev@lists.ozlabs.org > > Cc: linux-s390@vger.kernel.org > > Cc: linux-riscv@lists.infradead.org > > Cc: x86@kernel.org > > Cc: linux-arch@vger.kernel.org > > Cc: linux-kernel@vger.kernel.org > > > > Suggested-by: Catalin Marinas > > Reviewed-by: Ingo Molnar > > Tested-by: Gerald Schaefer # s390 > > Tested-by: Christophe Leroy # ppc32 > > Signed-off-by: Andrew Morton > > Signed-off-by: Christophe Leroy > > Signed-off-by: Anshuman Khandual > > --- > > This adds a test validation for architecture exported page table helpers. > > Patch adds basic transformation tests at various levels of the page table. > > > > This test was originally suggested by Catalin during arm64 THP migration > > RFC discussion earlier. Going forward it can include more specific tests > > with respect to various generic MM functions like THP, HugeTLB etc and > > platform specific tests. > > > > https://lore.kernel.org/linux-mm/20190628102003.GA56463@arrakis.emea.arm.com/ > > > > Needs to be applied on linux V5.6-rc2 > > > > Changes in V14: > > > > - Disabled DEBUG_VM_PGFLAGS for IA64 and ARM (32 Bit) per Andrew and Christophe > > - Updated DEBUG_VM_PGFLAGS documentation wrt EXPERT and disabled platforms > > - Updated RANDOM_[OR|NZ]VALUE open encodings with GENMASK() per Catalin > > - Updated s390 constraint bits from 12 to 4 (S390_MASK_BITS) per Gerald > > - Updated in-code documentation for RANDOM_ORVALUE per Gerald > > - Updated pxx_basic_tests() to use invert functions first per Catalin > > - Dropped ARCH_HAS_4LEVEL_HACK check from pud_basic_tests() > > - Replaced __ARCH_HAS_[4|5]LEVEL_HACK with __PAGETABLE_[PUD|P4D]_FOLDED per Catalin > > - Trimmed the CC list on the commit message per Catalin > > > > Changes in V13: (https://patchwork.kernel.org/project/linux-mm/list/?series=237125) > > > > - Subscribed s390 platform and updated debug-vm-pgtable/arch-support.txt per Gerald > > - Dropped keyword 'extern' from debug_vm_pgtable() declaration per Christophe > > - Moved debug_vm_pgtable() declarations to per Christophe > > - Moved debug_vm_pgtable() call site into kernel_init() per Christophe > > - Changed CONFIG_DEBUG_VM_PGTABLE rules per Christophe > > - Updated commit to include new supported platforms and changed config selection > > > > Changes in V12: (https://patchwork.kernel.org/project/linux-mm/list/?series=233905) > > > > - Replaced __mmdrop() with mmdrop() > > - Enable ARCH_HAS_DEBUG_VM_PGTABLE on X86 for non CONFIG_X86_PAE platforms as the > > test procedure interfere with pre-allocated PMDs attached to the PGD resulting > > in runtime failures with VM_BUG_ON() > > > > Changes in V11: (https://patchwork.kernel.org/project/linux-mm/list/?series=221135) > > > > - Rebased the patch on V5.4 > > > > Changes in V10: (https://patchwork.kernel.org/project/linux-mm/list/?series=205529) > > > > - Always enable DEBUG_VM_PGTABLE when DEBUG_VM is enabled per Ingo > > - Added tags from Ingo > > > > Changes in V9: (https://patchwork.kernel.org/project/linux-mm/list/?series=201429) > > > > - Changed feature support enumeration for powerpc platforms per Christophe > > - Changed config wrapper for basic_[pmd|pud]_tests() to enable ARC platform > > - Enabled the test on ARC platform > > > > Changes in V8: (https://patchwork.kernel.org/project/linux-mm/list/?series=194297) > > > > - Enabled ARCH_HAS_DEBUG_VM_PGTABLE on PPC32 platform per Christophe > > - Updated feature documentation as DEBUG_VM_PGTABLE is now enabled on PPC32 platform > > - Moved ARCH_HAS_DEBUG_VM_PGTABLE earlier to indent it with DEBUG_VM per Christophe > > - Added an information message in debug_vm_pgtable() per Christophe > > - Dropped random_vaddr boundary condition checks per Christophe and Qian > > - Replaced virt_addr_valid() check with pfn_valid() check in debug_vm_pgtable() > > - Slightly changed pr_fmt(fmt) information > > > > Changes in V7: (https://patchwork.kernel.org/project/linux-mm/list/?series=193051) > > > > - Memory allocation and free routines for mapped pages have been droped > > - Mapped pfns are derived from standard kernel text symbol per Matthew > > - Moved debug_vm_pgtaable() after page_alloc_init_late() per Michal and Qian > > - Updated the commit message per Michal > > - Updated W=1 GCC warning problem on x86 per Qian Cai > > - Addition of new alloc_contig_pages() helper has been submitted separately > > > > Changes in V6: (https://patchwork.kernel.org/project/linux-mm/list/?series=187589) > > > > - Moved alloc_gigantic_page_order() into mm/page_alloc.c per Michal > > - Moved alloc_gigantic_page_order() within CONFIG_CONTIG_ALLOC in the test > > - Folded Andrew's include/asm-generic/pgtable.h fix into the test patch 2/2 > > > > Changes in V5: (https://patchwork.kernel.org/project/linux-mm/list/?series=185991) > > > > - Redefined and moved X86 mm_p4d_folded() into a different header per Kirill/Ingo > > - Updated the config option comment per Ingo and dropped 'kernel module' reference > > - Updated the commit message and dropped 'kernel module' reference > > - Changed DEBUG_ARCH_PGTABLE_TEST into DEBUG_VM_PGTABLE per Ingo > > - Moved config option from mm/Kconfig.debug into lib/Kconfig.debug > > - Renamed core test function arch_pgtable_tests() as debug_vm_pgtable() > > - Renamed mm/arch_pgtable_test.c as mm/debug_vm_pgtable.c > > - debug_vm_pgtable() gets called from kernel_init_freeable() after init_mm_internals() > > - Added an entry in Documentation/features/debug/ per Ingo > > - Enabled the test on arm64 and x86 platforms for now > > > > Changes in V4: (https://patchwork.kernel.org/project/linux-mm/list/?series=183465) > > > > - Disable DEBUG_ARCH_PGTABLE_TEST for ARM and IA64 platforms > > > > Changes in V3: (https://lore.kernel.org/patchwork/project/lkml/list/?series=411216) > > > > - Changed test trigger from module format into late_initcall() > > - Marked all functions with __init to be freed after completion > > - Changed all __PGTABLE_PXX_FOLDED checks as mm_pxx_folded() > > - Folded in PPC32 fixes from Christophe > > > > Changes in V2: > > > > https://lore.kernel.org/linux-mm/1568268173-31302-1-git-send-email-anshuman.khandual@arm.com/T/#t > > > > - Fixed small typo error in MODULE_DESCRIPTION() > > - Fixed m64k build problems for lvalue concerns in pmd_xxx_tests() > > - Fixed dynamic page table level folding problems on x86 as per Kirril > > - Fixed second pointers during pxx_populate_tests() per Kirill and Gerald > > - Allocate and free pte table with pte_alloc_one/pte_free per Kirill > > - Modified pxx_clear_tests() to accommodate s390 lower 12 bits situation > > - Changed RANDOM_NZVALUE value from 0xbe to 0xff > > - Changed allocation, usage, free sequence for saved_ptep > > - Renamed VMA_FLAGS as VMFLAGS > > - Implemented a new method for random vaddr generation > > - Implemented some other cleanups > > - Dropped extern reference to mm_alloc() > > - Created and exported new alloc_gigantic_page_order() > > - Dropped the custom allocator and used new alloc_gigantic_page_order() > > > > Changes in V1: > > > > https://lore.kernel.org/linux-mm/1567497706-8649-1-git-send-email-anshuman.khandual@arm.com/ > > > > - Added fallback mechanism for PMD aligned memory allocation failure > > > > Changes in RFC V2: > > > > https://lore.kernel.org/linux-mm/1565335998-22553-1-git-send-email-anshuman.khandual@arm.com/T/#u > > > > - Moved test module and it's config from lib/ to mm/ > > - Renamed config TEST_ARCH_PGTABLE as DEBUG_ARCH_PGTABLE_TEST > > - Renamed file from test_arch_pgtable.c to arch_pgtable_test.c > > - Added relevant MODULE_DESCRIPTION() and MODULE_AUTHOR() details > > - Dropped loadable module config option > > - Basic tests now use memory blocks with required size and alignment > > - PUD aligned memory block gets allocated with alloc_contig_range() > > - If PUD aligned memory could not be allocated it falls back on PMD aligned > > memory block from page allocator and pud_* tests are skipped > > - Clear and populate tests now operate on real in memory page table entries > > - Dummy mm_struct gets allocated with mm_alloc() > > - Dummy page table entries get allocated with [pud|pmd|pte]_alloc_[map]() > > - Simplified [p4d|pgd]_basic_tests(), now has random values in the entries > > > > Original RFC V1: > > > > https://lore.kernel.org/linux-mm/1564037723-26676-1-git-send-email-anshuman.khandual@arm.com/ > > > > > > .../debug/debug-vm-pgtable/arch-support.txt | 35 ++ > > arch/arc/Kconfig | 1 + > > arch/arm64/Kconfig | 1 + > > arch/powerpc/Kconfig | 1 + > > arch/s390/Kconfig | 1 + > > arch/x86/Kconfig | 1 + > > arch/x86/include/asm/pgtable_64.h | 6 + > > include/linux/mmdebug.h | 5 + > > init/main.c | 2 + > > lib/Kconfig.debug | 26 ++ > > mm/Makefile | 1 + > > mm/debug_vm_pgtable.c | 389 ++++++++++++++++++ > > 12 files changed, 469 insertions(+) > > create mode 100644 Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > create mode 100644 mm/debug_vm_pgtable.c > > > > diff --git a/Documentation/features/debug/debug-vm-pgtable/arch-support.txt b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > new file mode 100644 > > index 000000000000..64d0f9b15c49 > > --- /dev/null > > +++ b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > @@ -0,0 +1,35 @@ > > +# > > +# Feature name: debug-vm-pgtable > > +# Kconfig: ARCH_HAS_DEBUG_VM_PGTABLE > > +# description: arch supports pgtable tests for semantics compliance > > +# > > + ----------------------- > > + | arch |status| > > + ----------------------- > > + | alpha: | TODO | > > + | arc: | ok | > > + | arm: | TODO | > > + | arm64: | ok | > > + | c6x: | TODO | > > + | csky: | TODO | > > + | h8300: | TODO | > > + | hexagon: | TODO | > > + | ia64: | TODO | > > + | m68k: | TODO | > > + | microblaze: | TODO | > > + | mips: | TODO | > > + | nds32: | TODO | > > + | nios2: | TODO | > > + | openrisc: | TODO | > > + | parisc: | TODO | > > + | powerpc/32: | ok | > > + | powerpc/64: | TODO | > > + | riscv: | TODO | > > + | s390: | ok | > > + | sh: | TODO | > > + | sparc: | TODO | > > + | um: | TODO | > > + | unicore32: | TODO | > > + | x86: | ok | > > + | xtensa: | TODO | > > + ----------------------- > > diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig > > index ff2a393b635c..3e72e6cf0e42 100644 > > --- a/arch/arc/Kconfig > > +++ b/arch/arc/Kconfig > > @@ -6,6 +6,7 @@ > > config ARC > > def_bool y > > select ARC_TIMERS > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_SETUP_DMA_OPS > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > > index 0b30e884e088..aaf8ba415145 100644 > > --- a/arch/arm64/Kconfig > > +++ b/arch/arm64/Kconfig > > @@ -11,6 +11,7 @@ config ARM64 > > select ACPI_PPTT if ACPI > > select ARCH_CLOCKSOURCE_DATA > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 497b7d0b2d7e..8d5ae14c5d4c 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -116,6 +116,7 @@ config PPC > > # > > select ARCH_32BIT_OFF_T if PPC32 > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if PPC32 > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig > > index 8abe77536d9d..af284dbb07e7 100644 > > --- a/arch/s390/Kconfig > > +++ b/arch/s390/Kconfig > > @@ -59,6 +59,7 @@ config KASAN_SHADOW_OFFSET > > config S390 > > def_bool y > > select ARCH_BINFMT_ELF_STATE > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > > index beea77046f9b..df8a19e52e82 100644 > > --- a/arch/x86/Kconfig > > +++ b/arch/x86/Kconfig > > @@ -61,6 +61,7 @@ config X86 > > select ARCH_CLOCKSOURCE_INIT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FAST_MULTIPLIER > > diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h > > index 0b6c4042942a..fb0e76d254b3 100644 > > --- a/arch/x86/include/asm/pgtable_64.h > > +++ b/arch/x86/include/asm/pgtable_64.h > > @@ -53,6 +53,12 @@ static inline void sync_initial_page_table(void) { } > > > > struct mm_struct; > > > > +#define mm_p4d_folded mm_p4d_folded > > +static inline bool mm_p4d_folded(struct mm_struct *mm) > > +{ > > + return !pgtable_l5_enabled(); > > +} > > + > > void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); > > void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); > > > > diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h > > index 2ad72d2c8cc5..5339aa14b749 100644 > > --- a/include/linux/mmdebug.h > > +++ b/include/linux/mmdebug.h > > @@ -64,4 +64,9 @@ void dump_mm(const struct mm_struct *mm); > > #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) > > #endif > > > > +#ifdef CONFIG_DEBUG_VM_PGTABLE > > +void debug_vm_pgtable(void); > > +#else > > +static inline void debug_vm_pgtable(void) { } > > +#endif > > #endif > > diff --git a/init/main.c b/init/main.c > > index cc0ee4873419..adf37e8b1d69 100644 > > --- a/init/main.c > > +++ b/init/main.c > > @@ -94,6 +94,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -1323,6 +1324,7 @@ static int __ref kernel_init(void *unused) > > kernel_init_freeable(); > > /* need to finish all async __init code before freeing the memory */ > > async_synchronize_full(); > > + debug_vm_pgtable(); > > ftrace_free_init_mem(); > > free_initmem(); > > mark_readonly(); > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 69def4a9df00..1b5bd9f7c967 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -653,6 +653,12 @@ config SCHED_STACK_END_CHECK > > data corruption or a sporadic crash at a later stage once the region > > is examined. The runtime overhead introduced is minimal. > > > > +config ARCH_HAS_DEBUG_VM_PGTABLE > > + bool > > + help > > + An architecture should select this when it can successfully > > + build and run DEBUG_VM_PGTABLE. > > + > > config DEBUG_VM > > bool "Debug VM" > > depends on DEBUG_KERNEL > > @@ -688,6 +694,26 @@ config DEBUG_VM_PGFLAGS > > > > If unsure, say N. > > > > +config DEBUG_VM_PGTABLE > > + bool "Debug arch page table for semantics compliance" > > + depends on MMU > > + depends on !IA64 && !ARM > > + depends on ARCH_HAS_DEBUG_VM_PGTABLE || EXPERT > > + default n if !ARCH_HAS_DEBUG_VM_PGTABLE > > + default y if DEBUG_VM > > + help > > + This option provides a debug method which can be used to test > > + architecture page table helper functions on various platforms in > > + verifying if they comply with expected generic MM semantics. This > > + will help architecture code in making sure that any changes or > > + new additions of these helpers still conform to expected > > + semantics of the generic MM. Platforms will have to opt in for > > + this through ARCH_HAS_DEBUG_VM_PGTABLE. Although it can also be > > + enabled through EXPERT without requiring code change. This test > > + is disabled on IA64 and ARM platforms where it fails to build. > > + > > + If unsure, say N. > > + > > config ARCH_HAS_DEBUG_VIRTUAL > > bool > > > > diff --git a/mm/Makefile b/mm/Makefile > > index 272e66039e70..b0692e6a4b58 100644 > > --- a/mm/Makefile > > +++ b/mm/Makefile > > @@ -87,6 +87,7 @@ obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o > > obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o > > obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o > > obj-$(CONFIG_DEBUG_RODATA_TEST) += rodata_test.o > > +obj-$(CONFIG_DEBUG_VM_PGTABLE) += debug_vm_pgtable.o > > obj-$(CONFIG_PAGE_OWNER) += page_owner.o > > obj-$(CONFIG_CLEANCACHE) += cleancache.o > > obj-$(CONFIG_MEMORY_ISOLATION) += page_isolation.o > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > > new file mode 100644 > > index 000000000000..70bf8ed8fd51 > > --- /dev/null > > +++ b/mm/debug_vm_pgtable.c > > @@ -0,0 +1,389 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * This kernel test validates architecture page table helpers and > > + * accessors and helps in verifying their continued compliance with > > + * expected generic MM semantics. > > + * > > + * Copyright (C) 2019 ARM Ltd. > > + * > > + * Author: Anshuman Khandual > > + */ > > +#define pr_fmt(fmt) "debug_vm_pgtable: %s: " fmt, __func__ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* > > + * Basic operations > > + * > > + * mkold(entry) = An old and not a young entry > > + * mkyoung(entry) = A young and not an old entry > > + * mkdirty(entry) = A dirty and not a clean entry > > + * mkclean(entry) = A clean and not a dirty entry > > + * mkwrite(entry) = A write and not a write protected entry > > + * wrprotect(entry) = A write protected and not a write entry > > + * pxx_bad(entry) = A mapped and non-table entry > > + * pxx_same(entry1, entry2) = Both entries hold the exact same value > > + */ > > +#define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > + > > +/* > > + * On s390 platform, the lower 4 bits are used to identify given page table > > + * entry type. But these bits might affect the ability to clear entries with > > + * pxx_clear() because of how dynamic page table folding works on s390. So > > + * while loading up the entries do not change the lower 4 bits. It does not > > + * have affect any other platform. > > + */ > > +#define S390_MASK_BITS 4 > > +#define RANDOM_ORVALUE GENMASK(BITS_PER_LONG - 1, S390_MASK_BITS) > > +#define RANDOM_NZVALUE GENMASK(7, 0) > > + > > +static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pte_t pte = pfn_pte(pfn, prot); > > + > > + WARN_ON(!pte_same(pte, pte)); > > + WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte)))); > > + WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte)))); > > + WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte)))); > > + WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte)))); > > + WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte)))); > > + WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > > +} > > + > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pmd_t pmd = pfn_pmd(pfn, prot); > > + > > + WARN_ON(!pmd_same(pmd, pmd)); > > + WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd)))); > > + WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd)))); > > + WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd)))); > > + WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd)))); > > + WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd)))); > > + WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd)))); > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pmd_bad(). > > + */ > > + WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > > +} > > + > > +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pud_t pud = pfn_pud(pfn, prot); > > + > > + WARN_ON(!pud_same(pud, pud)); > > + WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud)))); > > + WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud)))); > > + WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud)))); > > + WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud)))); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pud_bad(). > > + */ > > + WARN_ON(!pud_bad(pud_mkhuge(pud))); > > +} > > +#else > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > +#else > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > + > > +static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + p4d_t p4d; > > + > > + memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t)); > > + WARN_ON(!p4d_same(p4d, p4d)); > > +} > > + > > +static void __init pgd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pgd_t pgd; > > + > > + memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t)); > > + WARN_ON(!pgd_same(pgd, pgd)); > > +} > > + > > +#ifndef __PAGETABLE_PUD_FOLDED > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) > > +{ > > + pud_t pud = READ_ONCE(*pudp); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + pud = __pud(pud_val(pud) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pudp, pud); > > + pud_clear(pudp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(!pud_none(pud)); > > +} > > + > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > + pud_t pud; > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pud_bad(). > > + */ > > + pmd_clear(pmdp); > > + pud_clear(pudp); > > + pud_populate(mm, pudp, pmdp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(pud_bad(pud)); > > +} > > +#else > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) { } > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > +} > > +#endif > > + > > +#ifndef __PAGETABLE_P4D_FOLDED > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) > > +{ > > + p4d_t p4d = READ_ONCE(*p4dp); > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + p4d = __p4d(p4d_val(p4d) | RANDOM_ORVALUE); > > + WRITE_ONCE(*p4dp, p4d); > > + p4d_clear(p4dp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(!p4d_none(p4d)); > > +} > > + > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > + p4d_t p4d; > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as p4d_bad(). > > + */ > > + pud_clear(pudp); > > + p4d_clear(p4dp); > > + p4d_populate(mm, p4dp, pudp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(p4d_bad(p4d)); > > +} > > + > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) > > +{ > > + pgd_t pgd = READ_ONCE(*pgdp); > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + pgd = __pgd(pgd_val(pgd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pgdp, pgd); > > + pgd_clear(pgdp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(!pgd_none(pgd)); > > +} > > + > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > + pgd_t pgd; > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pgd_bad(). > > + */ > > + p4d_clear(p4dp); > > + pgd_clear(pgdp); > > + pgd_populate(mm, pgdp, p4dp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(pgd_bad(pgd)); > > +} > > +#else > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) { } > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) { } > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > +} > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > +} > > +#endif > > + > > +static void __init pte_clear_tests(struct mm_struct *mm, pte_t *ptep) > > +{ > > + pte_t pte = READ_ONCE(*ptep); > > + > > + pte = __pte(pte_val(pte) | RANDOM_ORVALUE); > > + WRITE_ONCE(*ptep, pte); > > + pte_clear(mm, 0, ptep); > > + pte = READ_ONCE(*ptep); > > + WARN_ON(!pte_none(pte)); > > +} > > + > > +static void __init pmd_clear_tests(struct mm_struct *mm, pmd_t *pmdp) > > +{ > > + pmd_t pmd = READ_ONCE(*pmdp); > > + > > + pmd = __pmd(pmd_val(pmd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pmdp, pmd); > > + pmd_clear(pmdp); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(!pmd_none(pmd)); > > +} > > + > > +static void __init pmd_populate_tests(struct mm_struct *mm, pmd_t *pmdp, > > + pgtable_t pgtable) > > +{ > > + pmd_t pmd; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pmd_bad(). > > + */ > > + pmd_clear(pmdp); > > + pmd_populate(mm, pmdp, pgtable); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(pmd_bad(pmd)); > > +} > > + > > +static unsigned long __init get_random_vaddr(void) > > +{ > > + unsigned long random_vaddr, random_pages, total_user_pages; > > + > > + total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE; > > + > > + random_pages = get_random_long() % total_user_pages; > > + random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE; > > + > > + return random_vaddr; > > +} > > + > > +void __init debug_vm_pgtable(void) > > +{ > > + struct mm_struct *mm; > > + pgd_t *pgdp; > > + p4d_t *p4dp, *saved_p4dp; > > + pud_t *pudp, *saved_pudp; > > + pmd_t *pmdp, *saved_pmdp, pmd; > > + pte_t *ptep; > > + pgtable_t saved_ptep; > > + pgprot_t prot; > > + phys_addr_t paddr; > > + unsigned long vaddr, pte_aligned, pmd_aligned; > > + unsigned long pud_aligned, p4d_aligned, pgd_aligned; > > + > > + pr_info("Validating architecture page table helpers\n"); > > + prot = vm_get_page_prot(VMFLAGS); > > + vaddr = get_random_vaddr(); > > + mm = mm_alloc(); > > + if (!mm) { > > + pr_err("mm_struct allocation failed\n"); > > + return; > > + } > > + > > + /* > > + * PFN for mapping at PTE level is determined from a standard kernel > > + * text symbol. But pfns for higher page table levels are derived by > > + * masking lower bits of this real pfn. These derived pfns might not > > + * exist on the platform but that does not really matter as pfn_pxx() > > + * helpers will still create appropriate entries for the test. This > > + * helps avoid large memory block allocations to be used for mapping > > + * at higher page table levels. > > + */ > > + paddr = __pa(&start_kernel); > > + > > + pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT; > > + pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT; > > + pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT; > > + p4d_aligned = (paddr & P4D_MASK) >> PAGE_SHIFT; > > + pgd_aligned = (paddr & PGDIR_MASK) >> PAGE_SHIFT; > > + WARN_ON(!pfn_valid(pte_aligned)); > > + > > + pgdp = pgd_offset(mm, vaddr); > > + p4dp = p4d_alloc(mm, pgdp, vaddr); > > + pudp = pud_alloc(mm, p4dp, vaddr); > > + pmdp = pmd_alloc(mm, pudp, vaddr); > > + ptep = pte_alloc_map(mm, pmdp, vaddr); > > + > > + /* > > + * Save all the page table page addresses as the page table > > + * entries will be used for testing with random or garbage > > + * values. These saved addresses will be used for freeing > > + * page table pages. > > + */ > > + pmd = READ_ONCE(*pmdp); > > + saved_p4dp = p4d_offset(pgdp, 0UL); > > + saved_pudp = pud_offset(p4dp, 0UL); > > + saved_pmdp = pmd_offset(pudp, 0UL); > > + saved_ptep = pmd_pgtable(pmd); > > + > > + pte_basic_tests(pte_aligned, prot); > > + pmd_basic_tests(pmd_aligned, prot); > > + pud_basic_tests(pud_aligned, prot); > > + p4d_basic_tests(p4d_aligned, prot); > > + pgd_basic_tests(pgd_aligned, prot); > > + > > + pte_clear_tests(mm, ptep); > > + pmd_clear_tests(mm, pmdp); > > + pud_clear_tests(mm, pudp); > > + p4d_clear_tests(mm, p4dp); > > + pgd_clear_tests(mm, pgdp); > > + > > + pte_unmap(ptep); > > + > > + pmd_populate_tests(mm, pmdp, saved_ptep); > > + pud_populate_tests(mm, pudp, saved_pmdp); > > + p4d_populate_tests(mm, p4dp, saved_pudp); > > + pgd_populate_tests(mm, pgdp, saved_p4dp); > > + > > + p4d_free(mm, saved_p4dp); > > + pud_free(mm, saved_pudp); > > + pmd_free(mm, saved_pmdp); > > + pte_free(mm, saved_ptep); > > + > > + mm_dec_nr_puds(mm); > > + mm_dec_nr_pmds(mm); > > + mm_dec_nr_ptes(mm); > > + mmdrop(mm); > > +} From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-f193.google.com ([209.85.160.193]:35682 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726561AbgBZOMZ (ORCPT ); Wed, 26 Feb 2020 09:12:25 -0500 Received: by mail-qt1-f193.google.com with SMTP id 88so1497082qtc.2 for ; Wed, 26 Feb 2020 06:12:23 -0800 (PST) Message-ID: <1582726340.7365.124.camel@lca.pw> Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers From: Qian Cai Date: Wed, 26 Feb 2020 09:12:20 -0500 In-Reply-To: <1582726182.7365.123.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> Content-Type: text/plain; charset="utf-8" Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-s390-owner@vger.kernel.org List-ID: To: Anshuman Khandual , linux-mm@kvack.org Cc: Andrew Morton , Mike Rapoport , Vineet Gupta , Catalin Marinas , Will Deacon , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , "Kirill A . Shutemov" , Paul Walmsley , Palmer Dabbelt , linux-snps-arc@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-riscv@lists.infradead.org, x86@kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, Christophe Leroy On Wed, 2020-02-26 at 09:09 -0500, Qian Cai wrote: > On Mon, 2020-02-17 at 08:47 +0530, Anshuman Khandual wrote: > > This adds tests which will validate architecture page table helpers and > > other accessors in their compliance with expected generic MM semantics. > > This will help various architectures in validating changes to existing > > page table helpers or addition of new ones. > > > > This test covers basic page table entry transformations including but not > > limited to old, young, dirty, clean, write, write protect etc at various > > level along with populating intermediate entries with next page table page > > and validating them. > > > > Test page table pages are allocated from system memory with required size > > and alignments. The mapped pfns at page table levels are derived from a > > real pfn representing a valid kernel text symbol. This test gets called > > inside kernel_init() right after async_synchronize_full(). > > > > This test gets built and run when CONFIG_DEBUG_VM_PGTABLE is selected. Any > > architecture, which is willing to subscribe this test will need to select > > ARCH_HAS_DEBUG_VM_PGTABLE. For now this is limited to arc, arm64, x86, s390 > > and ppc32 platforms where the test is known to build and run successfully. > > Going forward, other architectures too can subscribe the test after fixing > > any build or runtime problems with their page table helpers. Meanwhile for > > better platform coverage, the test can also be enabled with CONFIG_EXPERT > > even without ARCH_HAS_DEBUG_VM_PGTABLE. > > > > Folks interested in making sure that a given platform's page table helpers > > conform to expected generic MM semantics should enable the above config > > which will just trigger this test during boot. Any non conformity here will > > be reported as an warning which would need to be fixed. This test will help > > catch any changes to the agreed upon semantics expected from generic MM and > > enable platforms to accommodate it thereafter. > > How useful is this that straightly crash the powerpc? And then generate warnings on arm64, [  146.634626][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating architecture page table helpers [  146.643995][    T1] ------------[ cut here ]------------ [  146.649350][    T1] virt_to_phys used for non-linear address: (____ptrval____) (start_kernel+0x0/0x580) [  146.658840][    T1] WARNING: CPU: 165 PID: 1 at arch/arm64/mm/physaddr.c:15 __virt_to_phys+0x98/0xe0 [  146.667976][    T1] Modules linked in: [  146.671741][    T1] CPU: 165 PID: 1 Comm: swapper/0 Tainted: G             L    5.6.0-rc3-next-20200226 #1 [  146.681397][    T1] Hardware name: HPE Apollo 70             /C01_APACHE_MB         , BIOS L50_5.13_1.11 06/18/2019 [  146.691840][    T1] pstate: 60400009 (nZCv daif +PAN -UAO) [  146.697334][    T1] pc : __virt_to_phys+0x98/0xe0 [  146.702045][    T1] lr : __virt_to_phys+0x98/0xe0 [  146.706753][    T1] sp : 18ff00082b7afe10 [  146.710766][    T1] x29: 18ff00082b7afe30 x28: 0000000000000000  [  146.716782][    T1] x27: 0000000000000000 x26: 0000000000000000  [  146.722798][    T1] x25: 0000000000000000 x24: 0000000000000000  [  146.728813][    T1] x23: 0000000000000000 x22: 0000000000000000  [  146.734827][    T1] x21: 0000000000000000 x20: ffff9000135b4000  [  146.740842][    T1] x19: ffff900011200858 x18: 0000000000000000  [  146.746857][    T1] x17: 0000000000000000 x16: 0000000000000000  [  146.752872][    T1] x15: 0000000000000000 x14: 3078302b6c656e72  [  146.758887][    T1] x13: 656b5f7472617473 x12: ffff90001369ea90  [  146.764901][    T1] x11: 00000000000000c9 x10: ffff800082b76c0e  [  146.770917][    T1] x9 : 9d6a2e2260401300 x8 : 9d6a2e2260401300  [  146.776932][    T1] x7 : aaaaaaaaaaaaaaaa x6 : 0000000000000000  [  146.782946][    T1] x5 : 0000000000000080 x4 : 0000000000000000  [  146.788960][    T1] x3 : 0000000000000010 x2 : 0000000000000008  [  146.794975][    T1] x1 : 0000000000000006 x0 : 0000000000000053  [  146.800990][    T1] Call trace: [  146.804140][    T1]  __virt_to_phys+0x98/0xe0 [  146.808512][    T1]  debug_vm_pgtable+0x74/0x3fc [  146.813140][    T1]  kernel_init+0x1c/0x208 [  146.817334][    T1]  ret_from_fork+0x10/0x18 [  146.821608][    T1] irq event stamp: 19843388 [  146.825978][    T1] hardirqs last  enabled at (19843387): [] console_unlock+0x8d0/0x970 [  146.835553][    T1] hardirqs last disabled at (19843388): [] do_debug_exception+0x58/0x2cc [  146.845387][    T1] softirqs last  enabled at (19843384): [] __do_softirq+0x864/0x900 [  146.854796][    T1] softirqs last disabled at (19843377): [] irq_exit+0x1c8/0x238 [  146.863845][    T1] ---[ end trace 31678d9e845dff89 ]--- > > [   23.263425][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating > architecture page table helpers > [   23.263625][    T1] ------------[ cut here ]------------ > [   23.263649][    T1] kernel BUG at arch/powerpc/mm/pgtable.c:274! > [   23.263675][    T1] Oops: Exception in kernel mode, sig: 5 [#1] > [   23.263698][    T1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=256 > DEBUG_PAGEALLOC NUMA PowerNV > [   23.263731][    T1] Modules linked in: > [   23.263752][    T1] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc3-next- > 20200226 #1 > [   23.263776][    T1] NIP:  c00000000007308c LR: c00000000103dbd8 CTR: > 0000000000000000 > [   23.263810][    T1] REGS: c00000003ddaf9c0 TRAP: 0700   Not tainted  (5.6.0- > rc3-next-20200226) > [   23.263846][    T1] MSR:  9000000000029033   CR: > 22000228  XER: 00000000 > [   23.263888][    T1] CFAR: c000000000073030 IRQMASK: 0  > [   23.263888][    T1] GPR00: c00000000103dbd8 c00000003ddafc50 c000000001656f00 > c000001d7b4ca080  > [   23.263888][    T1] GPR04: 0000000000000000 0000000000000009 c00000003ddafc04 > 0000000000000000  > [   23.263888][    T1] GPR08: f0ffffffffffffff 0000000000000001 c0000000016279d0 > 00000000000a0000  > [   23.263888][    T1] GPR12: 0000000000000000 c000001fffffae00 c000000000010e84 > 0000000000000000  > [   23.263888][    T1] GPR16: 0000000000000000 8000000000000105 0000000000000100 > c000000001689a18  > [   23.263888][    T1] GPR20: c00020032c660000 c00020032c620000 c000000001716030 > c00020032c600000  > [   23.263888][    T1] GPR24: 000000000000000d c000000001716030 c000001d7b4ca080 > c000000001716040  > [   23.263888][    T1] GPR28: c000000001716038 0000000000000000 0000000000000000 > 0000000000000000  > [   23.264122][    T1] NIP [c00000000007308c] assert_pte_locked+0x11c/0x320 > [   23.264154][    T1] LR [c00000000103dbd8] debug_vm_pgtable+0x770/0xb7c > [   23.264186][    T1] Call Trace: > [   23.264206][    T1] [c00000003ddafc50] [c000000000999760] > _raw_spin_unlock+0x30/0x70 (unreliable) > [   23.264244][    T1] [c00000003ddafcd0] [c00000000103d924] > debug_vm_pgtable+0x4bc/0xb7c > [   23.264279][    T1] [c00000003ddafdb0] [c000000000010eac] > kernel_init+0x30/0x194 > [   23.264315][    T1] [c00000003ddafe20] [c00000000000b748] > ret_from_kernel_thread+0x5c/0x74 > [   23.264349][    T1] Instruction dump: > [   23.264368][    T1] 60000000 3be00001 7fbef436 eafa0040 7fffc030 3bffffff > 7fff07b4 7ffff038  > [   23.264409][    T1] 7bff1f24 7d37f82a 7d290074 7929d182 <0b090000> ebdb0000 > e93c0000 7fde4a14  > [   23.264460][    T1] ---[ end trace 72d2931022e9ab24 ]--- > [   23.627311][    T1]  > [   24.627407][    T1] Kernel panic - not syncing: Fatal exception > [   26.5 > > > > > Cc: Andrew Morton > > Cc: Mike Rapoport > > Cc: Vineet Gupta > > Cc: Catalin Marinas > > Cc: Will Deacon > > Cc: Benjamin Herrenschmidt > > Cc: Paul Mackerras > > Cc: Michael Ellerman > > Cc: Heiko Carstens > > Cc: Vasily Gorbik > > Cc: Christian Borntraeger > > Cc: Thomas Gleixner > > Cc: Ingo Molnar > > Cc: Borislav Petkov > > Cc: "H. Peter Anvin" > > Cc: Kirill A. Shutemov > > Cc: Paul Walmsley > > Cc: Palmer Dabbelt > > Cc: linux-snps-arc@lists.infradead.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linuxppc-dev@lists.ozlabs.org > > Cc: linux-s390@vger.kernel.org > > Cc: linux-riscv@lists.infradead.org > > Cc: x86@kernel.org > > Cc: linux-arch@vger.kernel.org > > Cc: linux-kernel@vger.kernel.org > > > > Suggested-by: Catalin Marinas > > Reviewed-by: Ingo Molnar > > Tested-by: Gerald Schaefer # s390 > > Tested-by: Christophe Leroy # ppc32 > > Signed-off-by: Andrew Morton > > Signed-off-by: Christophe Leroy > > Signed-off-by: Anshuman Khandual > > --- > > This adds a test validation for architecture exported page table helpers. > > Patch adds basic transformation tests at various levels of the page table. > > > > This test was originally suggested by Catalin during arm64 THP migration > > RFC discussion earlier. Going forward it can include more specific tests > > with respect to various generic MM functions like THP, HugeTLB etc and > > platform specific tests. > > > > https://lore.kernel.org/linux-mm/20190628102003.GA56463@arrakis.emea.arm.com/ > > > > Needs to be applied on linux V5.6-rc2 > > > > Changes in V14: > > > > - Disabled DEBUG_VM_PGFLAGS for IA64 and ARM (32 Bit) per Andrew and Christophe > > - Updated DEBUG_VM_PGFLAGS documentation wrt EXPERT and disabled platforms > > - Updated RANDOM_[OR|NZ]VALUE open encodings with GENMASK() per Catalin > > - Updated s390 constraint bits from 12 to 4 (S390_MASK_BITS) per Gerald > > - Updated in-code documentation for RANDOM_ORVALUE per Gerald > > - Updated pxx_basic_tests() to use invert functions first per Catalin > > - Dropped ARCH_HAS_4LEVEL_HACK check from pud_basic_tests() > > - Replaced __ARCH_HAS_[4|5]LEVEL_HACK with __PAGETABLE_[PUD|P4D]_FOLDED per Catalin > > - Trimmed the CC list on the commit message per Catalin > > > > Changes in V13: (https://patchwork.kernel.org/project/linux-mm/list/?series=237125) > > > > - Subscribed s390 platform and updated debug-vm-pgtable/arch-support.txt per Gerald > > - Dropped keyword 'extern' from debug_vm_pgtable() declaration per Christophe > > - Moved debug_vm_pgtable() declarations to per Christophe > > - Moved debug_vm_pgtable() call site into kernel_init() per Christophe > > - Changed CONFIG_DEBUG_VM_PGTABLE rules per Christophe > > - Updated commit to include new supported platforms and changed config selection > > > > Changes in V12: (https://patchwork.kernel.org/project/linux-mm/list/?series=233905) > > > > - Replaced __mmdrop() with mmdrop() > > - Enable ARCH_HAS_DEBUG_VM_PGTABLE on X86 for non CONFIG_X86_PAE platforms as the > > test procedure interfere with pre-allocated PMDs attached to the PGD resulting > > in runtime failures with VM_BUG_ON() > > > > Changes in V11: (https://patchwork.kernel.org/project/linux-mm/list/?series=221135) > > > > - Rebased the patch on V5.4 > > > > Changes in V10: (https://patchwork.kernel.org/project/linux-mm/list/?series=205529) > > > > - Always enable DEBUG_VM_PGTABLE when DEBUG_VM is enabled per Ingo > > - Added tags from Ingo > > > > Changes in V9: (https://patchwork.kernel.org/project/linux-mm/list/?series=201429) > > > > - Changed feature support enumeration for powerpc platforms per Christophe > > - Changed config wrapper for basic_[pmd|pud]_tests() to enable ARC platform > > - Enabled the test on ARC platform > > > > Changes in V8: (https://patchwork.kernel.org/project/linux-mm/list/?series=194297) > > > > - Enabled ARCH_HAS_DEBUG_VM_PGTABLE on PPC32 platform per Christophe > > - Updated feature documentation as DEBUG_VM_PGTABLE is now enabled on PPC32 platform > > - Moved ARCH_HAS_DEBUG_VM_PGTABLE earlier to indent it with DEBUG_VM per Christophe > > - Added an information message in debug_vm_pgtable() per Christophe > > - Dropped random_vaddr boundary condition checks per Christophe and Qian > > - Replaced virt_addr_valid() check with pfn_valid() check in debug_vm_pgtable() > > - Slightly changed pr_fmt(fmt) information > > > > Changes in V7: (https://patchwork.kernel.org/project/linux-mm/list/?series=193051) > > > > - Memory allocation and free routines for mapped pages have been droped > > - Mapped pfns are derived from standard kernel text symbol per Matthew > > - Moved debug_vm_pgtaable() after page_alloc_init_late() per Michal and Qian > > - Updated the commit message per Michal > > - Updated W=1 GCC warning problem on x86 per Qian Cai > > - Addition of new alloc_contig_pages() helper has been submitted separately > > > > Changes in V6: (https://patchwork.kernel.org/project/linux-mm/list/?series=187589) > > > > - Moved alloc_gigantic_page_order() into mm/page_alloc.c per Michal > > - Moved alloc_gigantic_page_order() within CONFIG_CONTIG_ALLOC in the test > > - Folded Andrew's include/asm-generic/pgtable.h fix into the test patch 2/2 > > > > Changes in V5: (https://patchwork.kernel.org/project/linux-mm/list/?series=185991) > > > > - Redefined and moved X86 mm_p4d_folded() into a different header per Kirill/Ingo > > - Updated the config option comment per Ingo and dropped 'kernel module' reference > > - Updated the commit message and dropped 'kernel module' reference > > - Changed DEBUG_ARCH_PGTABLE_TEST into DEBUG_VM_PGTABLE per Ingo > > - Moved config option from mm/Kconfig.debug into lib/Kconfig.debug > > - Renamed core test function arch_pgtable_tests() as debug_vm_pgtable() > > - Renamed mm/arch_pgtable_test.c as mm/debug_vm_pgtable.c > > - debug_vm_pgtable() gets called from kernel_init_freeable() after init_mm_internals() > > - Added an entry in Documentation/features/debug/ per Ingo > > - Enabled the test on arm64 and x86 platforms for now > > > > Changes in V4: (https://patchwork.kernel.org/project/linux-mm/list/?series=183465) > > > > - Disable DEBUG_ARCH_PGTABLE_TEST for ARM and IA64 platforms > > > > Changes in V3: (https://lore.kernel.org/patchwork/project/lkml/list/?series=411216) > > > > - Changed test trigger from module format into late_initcall() > > - Marked all functions with __init to be freed after completion > > - Changed all __PGTABLE_PXX_FOLDED checks as mm_pxx_folded() > > - Folded in PPC32 fixes from Christophe > > > > Changes in V2: > > > > https://lore.kernel.org/linux-mm/1568268173-31302-1-git-send-email-anshuman.khandual@arm.com/T/#t > > > > - Fixed small typo error in MODULE_DESCRIPTION() > > - Fixed m64k build problems for lvalue concerns in pmd_xxx_tests() > > - Fixed dynamic page table level folding problems on x86 as per Kirril > > - Fixed second pointers during pxx_populate_tests() per Kirill and Gerald > > - Allocate and free pte table with pte_alloc_one/pte_free per Kirill > > - Modified pxx_clear_tests() to accommodate s390 lower 12 bits situation > > - Changed RANDOM_NZVALUE value from 0xbe to 0xff > > - Changed allocation, usage, free sequence for saved_ptep > > - Renamed VMA_FLAGS as VMFLAGS > > - Implemented a new method for random vaddr generation > > - Implemented some other cleanups > > - Dropped extern reference to mm_alloc() > > - Created and exported new alloc_gigantic_page_order() > > - Dropped the custom allocator and used new alloc_gigantic_page_order() > > > > Changes in V1: > > > > https://lore.kernel.org/linux-mm/1567497706-8649-1-git-send-email-anshuman.khandual@arm.com/ > > > > - Added fallback mechanism for PMD aligned memory allocation failure > > > > Changes in RFC V2: > > > > https://lore.kernel.org/linux-mm/1565335998-22553-1-git-send-email-anshuman.khandual@arm.com/T/#u > > > > - Moved test module and it's config from lib/ to mm/ > > - Renamed config TEST_ARCH_PGTABLE as DEBUG_ARCH_PGTABLE_TEST > > - Renamed file from test_arch_pgtable.c to arch_pgtable_test.c > > - Added relevant MODULE_DESCRIPTION() and MODULE_AUTHOR() details > > - Dropped loadable module config option > > - Basic tests now use memory blocks with required size and alignment > > - PUD aligned memory block gets allocated with alloc_contig_range() > > - If PUD aligned memory could not be allocated it falls back on PMD aligned > > memory block from page allocator and pud_* tests are skipped > > - Clear and populate tests now operate on real in memory page table entries > > - Dummy mm_struct gets allocated with mm_alloc() > > - Dummy page table entries get allocated with [pud|pmd|pte]_alloc_[map]() > > - Simplified [p4d|pgd]_basic_tests(), now has random values in the entries > > > > Original RFC V1: > > > > https://lore.kernel.org/linux-mm/1564037723-26676-1-git-send-email-anshuman.khandual@arm.com/ > > > > > > .../debug/debug-vm-pgtable/arch-support.txt | 35 ++ > > arch/arc/Kconfig | 1 + > > arch/arm64/Kconfig | 1 + > > arch/powerpc/Kconfig | 1 + > > arch/s390/Kconfig | 1 + > > arch/x86/Kconfig | 1 + > > arch/x86/include/asm/pgtable_64.h | 6 + > > include/linux/mmdebug.h | 5 + > > init/main.c | 2 + > > lib/Kconfig.debug | 26 ++ > > mm/Makefile | 1 + > > mm/debug_vm_pgtable.c | 389 ++++++++++++++++++ > > 12 files changed, 469 insertions(+) > > create mode 100644 Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > create mode 100644 mm/debug_vm_pgtable.c > > > > diff --git a/Documentation/features/debug/debug-vm-pgtable/arch-support.txt b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > new file mode 100644 > > index 000000000000..64d0f9b15c49 > > --- /dev/null > > +++ b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > @@ -0,0 +1,35 @@ > > +# > > +# Feature name: debug-vm-pgtable > > +# Kconfig: ARCH_HAS_DEBUG_VM_PGTABLE > > +# description: arch supports pgtable tests for semantics compliance > > +# > > + ----------------------- > > + | arch |status| > > + ----------------------- > > + | alpha: | TODO | > > + | arc: | ok | > > + | arm: | TODO | > > + | arm64: | ok | > > + | c6x: | TODO | > > + | csky: | TODO | > > + | h8300: | TODO | > > + | hexagon: | TODO | > > + | ia64: | TODO | > > + | m68k: | TODO | > > + | microblaze: | TODO | > > + | mips: | TODO | > > + | nds32: | TODO | > > + | nios2: | TODO | > > + | openrisc: | TODO | > > + | parisc: | TODO | > > + | powerpc/32: | ok | > > + | powerpc/64: | TODO | > > + | riscv: | TODO | > > + | s390: | ok | > > + | sh: | TODO | > > + | sparc: | TODO | > > + | um: | TODO | > > + | unicore32: | TODO | > > + | x86: | ok | > > + | xtensa: | TODO | > > + ----------------------- > > diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig > > index ff2a393b635c..3e72e6cf0e42 100644 > > --- a/arch/arc/Kconfig > > +++ b/arch/arc/Kconfig > > @@ -6,6 +6,7 @@ > > config ARC > > def_bool y > > select ARC_TIMERS > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_SETUP_DMA_OPS > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > > index 0b30e884e088..aaf8ba415145 100644 > > --- a/arch/arm64/Kconfig > > +++ b/arch/arm64/Kconfig > > @@ -11,6 +11,7 @@ config ARM64 > > select ACPI_PPTT if ACPI > > select ARCH_CLOCKSOURCE_DATA > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 497b7d0b2d7e..8d5ae14c5d4c 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -116,6 +116,7 @@ config PPC > > # > > select ARCH_32BIT_OFF_T if PPC32 > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if PPC32 > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig > > index 8abe77536d9d..af284dbb07e7 100644 > > --- a/arch/s390/Kconfig > > +++ b/arch/s390/Kconfig > > @@ -59,6 +59,7 @@ config KASAN_SHADOW_OFFSET > > config S390 > > def_bool y > > select ARCH_BINFMT_ELF_STATE > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > > index beea77046f9b..df8a19e52e82 100644 > > --- a/arch/x86/Kconfig > > +++ b/arch/x86/Kconfig > > @@ -61,6 +61,7 @@ config X86 > > select ARCH_CLOCKSOURCE_INIT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FAST_MULTIPLIER > > diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h > > index 0b6c4042942a..fb0e76d254b3 100644 > > --- a/arch/x86/include/asm/pgtable_64.h > > +++ b/arch/x86/include/asm/pgtable_64.h > > @@ -53,6 +53,12 @@ static inline void sync_initial_page_table(void) { } > > > > struct mm_struct; > > > > +#define mm_p4d_folded mm_p4d_folded > > +static inline bool mm_p4d_folded(struct mm_struct *mm) > > +{ > > + return !pgtable_l5_enabled(); > > +} > > + > > void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); > > void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); > > > > diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h > > index 2ad72d2c8cc5..5339aa14b749 100644 > > --- a/include/linux/mmdebug.h > > +++ b/include/linux/mmdebug.h > > @@ -64,4 +64,9 @@ void dump_mm(const struct mm_struct *mm); > > #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) > > #endif > > > > +#ifdef CONFIG_DEBUG_VM_PGTABLE > > +void debug_vm_pgtable(void); > > +#else > > +static inline void debug_vm_pgtable(void) { } > > +#endif > > #endif > > diff --git a/init/main.c b/init/main.c > > index cc0ee4873419..adf37e8b1d69 100644 > > --- a/init/main.c > > +++ b/init/main.c > > @@ -94,6 +94,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -1323,6 +1324,7 @@ static int __ref kernel_init(void *unused) > > kernel_init_freeable(); > > /* need to finish all async __init code before freeing the memory */ > > async_synchronize_full(); > > + debug_vm_pgtable(); > > ftrace_free_init_mem(); > > free_initmem(); > > mark_readonly(); > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 69def4a9df00..1b5bd9f7c967 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -653,6 +653,12 @@ config SCHED_STACK_END_CHECK > > data corruption or a sporadic crash at a later stage once the region > > is examined. The runtime overhead introduced is minimal. > > > > +config ARCH_HAS_DEBUG_VM_PGTABLE > > + bool > > + help > > + An architecture should select this when it can successfully > > + build and run DEBUG_VM_PGTABLE. > > + > > config DEBUG_VM > > bool "Debug VM" > > depends on DEBUG_KERNEL > > @@ -688,6 +694,26 @@ config DEBUG_VM_PGFLAGS > > > > If unsure, say N. > > > > +config DEBUG_VM_PGTABLE > > + bool "Debug arch page table for semantics compliance" > > + depends on MMU > > + depends on !IA64 && !ARM > > + depends on ARCH_HAS_DEBUG_VM_PGTABLE || EXPERT > > + default n if !ARCH_HAS_DEBUG_VM_PGTABLE > > + default y if DEBUG_VM > > + help > > + This option provides a debug method which can be used to test > > + architecture page table helper functions on various platforms in > > + verifying if they comply with expected generic MM semantics. This > > + will help architecture code in making sure that any changes or > > + new additions of these helpers still conform to expected > > + semantics of the generic MM. Platforms will have to opt in for > > + this through ARCH_HAS_DEBUG_VM_PGTABLE. Although it can also be > > + enabled through EXPERT without requiring code change. This test > > + is disabled on IA64 and ARM platforms where it fails to build. > > + > > + If unsure, say N. > > + > > config ARCH_HAS_DEBUG_VIRTUAL > > bool > > > > diff --git a/mm/Makefile b/mm/Makefile > > index 272e66039e70..b0692e6a4b58 100644 > > --- a/mm/Makefile > > +++ b/mm/Makefile > > @@ -87,6 +87,7 @@ obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o > > obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o > > obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o > > obj-$(CONFIG_DEBUG_RODATA_TEST) += rodata_test.o > > +obj-$(CONFIG_DEBUG_VM_PGTABLE) += debug_vm_pgtable.o > > obj-$(CONFIG_PAGE_OWNER) += page_owner.o > > obj-$(CONFIG_CLEANCACHE) += cleancache.o > > obj-$(CONFIG_MEMORY_ISOLATION) += page_isolation.o > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > > new file mode 100644 > > index 000000000000..70bf8ed8fd51 > > --- /dev/null > > +++ b/mm/debug_vm_pgtable.c > > @@ -0,0 +1,389 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * This kernel test validates architecture page table helpers and > > + * accessors and helps in verifying their continued compliance with > > + * expected generic MM semantics. > > + * > > + * Copyright (C) 2019 ARM Ltd. > > + * > > + * Author: Anshuman Khandual > > + */ > > +#define pr_fmt(fmt) "debug_vm_pgtable: %s: " fmt, __func__ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* > > + * Basic operations > > + * > > + * mkold(entry) = An old and not a young entry > > + * mkyoung(entry) = A young and not an old entry > > + * mkdirty(entry) = A dirty and not a clean entry > > + * mkclean(entry) = A clean and not a dirty entry > > + * mkwrite(entry) = A write and not a write protected entry > > + * wrprotect(entry) = A write protected and not a write entry > > + * pxx_bad(entry) = A mapped and non-table entry > > + * pxx_same(entry1, entry2) = Both entries hold the exact same value > > + */ > > +#define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > + > > +/* > > + * On s390 platform, the lower 4 bits are used to identify given page table > > + * entry type. But these bits might affect the ability to clear entries with > > + * pxx_clear() because of how dynamic page table folding works on s390. So > > + * while loading up the entries do not change the lower 4 bits. It does not > > + * have affect any other platform. > > + */ > > +#define S390_MASK_BITS 4 > > +#define RANDOM_ORVALUE GENMASK(BITS_PER_LONG - 1, S390_MASK_BITS) > > +#define RANDOM_NZVALUE GENMASK(7, 0) > > + > > +static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pte_t pte = pfn_pte(pfn, prot); > > + > > + WARN_ON(!pte_same(pte, pte)); > > + WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte)))); > > + WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte)))); > > + WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte)))); > > + WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte)))); > > + WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte)))); > > + WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > > +} > > + > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pmd_t pmd = pfn_pmd(pfn, prot); > > + > > + WARN_ON(!pmd_same(pmd, pmd)); > > + WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd)))); > > + WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd)))); > > + WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd)))); > > + WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd)))); > > + WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd)))); > > + WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd)))); > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pmd_bad(). > > + */ > > + WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > > +} > > + > > +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pud_t pud = pfn_pud(pfn, prot); > > + > > + WARN_ON(!pud_same(pud, pud)); > > + WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud)))); > > + WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud)))); > > + WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud)))); > > + WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud)))); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pud_bad(). > > + */ > > + WARN_ON(!pud_bad(pud_mkhuge(pud))); > > +} > > +#else > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > +#else > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > + > > +static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + p4d_t p4d; > > + > > + memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t)); > > + WARN_ON(!p4d_same(p4d, p4d)); > > +} > > + > > +static void __init pgd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pgd_t pgd; > > + > > + memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t)); > > + WARN_ON(!pgd_same(pgd, pgd)); > > +} > > + > > +#ifndef __PAGETABLE_PUD_FOLDED > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) > > +{ > > + pud_t pud = READ_ONCE(*pudp); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + pud = __pud(pud_val(pud) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pudp, pud); > > + pud_clear(pudp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(!pud_none(pud)); > > +} > > + > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > + pud_t pud; > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pud_bad(). > > + */ > > + pmd_clear(pmdp); > > + pud_clear(pudp); > > + pud_populate(mm, pudp, pmdp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(pud_bad(pud)); > > +} > > +#else > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) { } > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > +} > > +#endif > > + > > +#ifndef __PAGETABLE_P4D_FOLDED > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) > > +{ > > + p4d_t p4d = READ_ONCE(*p4dp); > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + p4d = __p4d(p4d_val(p4d) | RANDOM_ORVALUE); > > + WRITE_ONCE(*p4dp, p4d); > > + p4d_clear(p4dp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(!p4d_none(p4d)); > > +} > > + > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > + p4d_t p4d; > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as p4d_bad(). > > + */ > > + pud_clear(pudp); > > + p4d_clear(p4dp); > > + p4d_populate(mm, p4dp, pudp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(p4d_bad(p4d)); > > +} > > + > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) > > +{ > > + pgd_t pgd = READ_ONCE(*pgdp); > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + pgd = __pgd(pgd_val(pgd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pgdp, pgd); > > + pgd_clear(pgdp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(!pgd_none(pgd)); > > +} > > + > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > + pgd_t pgd; > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pgd_bad(). > > + */ > > + p4d_clear(p4dp); > > + pgd_clear(pgdp); > > + pgd_populate(mm, pgdp, p4dp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(pgd_bad(pgd)); > > +} > > +#else > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) { } > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) { } > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > +} > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > +} > > +#endif > > + > > +static void __init pte_clear_tests(struct mm_struct *mm, pte_t *ptep) > > +{ > > + pte_t pte = READ_ONCE(*ptep); > > + > > + pte = __pte(pte_val(pte) | RANDOM_ORVALUE); > > + WRITE_ONCE(*ptep, pte); > > + pte_clear(mm, 0, ptep); > > + pte = READ_ONCE(*ptep); > > + WARN_ON(!pte_none(pte)); > > +} > > + > > +static void __init pmd_clear_tests(struct mm_struct *mm, pmd_t *pmdp) > > +{ > > + pmd_t pmd = READ_ONCE(*pmdp); > > + > > + pmd = __pmd(pmd_val(pmd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pmdp, pmd); > > + pmd_clear(pmdp); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(!pmd_none(pmd)); > > +} > > + > > +static void __init pmd_populate_tests(struct mm_struct *mm, pmd_t *pmdp, > > + pgtable_t pgtable) > > +{ > > + pmd_t pmd; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pmd_bad(). > > + */ > > + pmd_clear(pmdp); > > + pmd_populate(mm, pmdp, pgtable); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(pmd_bad(pmd)); > > +} > > + > > +static unsigned long __init get_random_vaddr(void) > > +{ > > + unsigned long random_vaddr, random_pages, total_user_pages; > > + > > + total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE; > > + > > + random_pages = get_random_long() % total_user_pages; > > + random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE; > > + > > + return random_vaddr; > > +} > > + > > +void __init debug_vm_pgtable(void) > > +{ > > + struct mm_struct *mm; > > + pgd_t *pgdp; > > + p4d_t *p4dp, *saved_p4dp; > > + pud_t *pudp, *saved_pudp; > > + pmd_t *pmdp, *saved_pmdp, pmd; > > + pte_t *ptep; > > + pgtable_t saved_ptep; > > + pgprot_t prot; > > + phys_addr_t paddr; > > + unsigned long vaddr, pte_aligned, pmd_aligned; > > + unsigned long pud_aligned, p4d_aligned, pgd_aligned; > > + > > + pr_info("Validating architecture page table helpers\n"); > > + prot = vm_get_page_prot(VMFLAGS); > > + vaddr = get_random_vaddr(); > > + mm = mm_alloc(); > > + if (!mm) { > > + pr_err("mm_struct allocation failed\n"); > > + return; > > + } > > + > > + /* > > + * PFN for mapping at PTE level is determined from a standard kernel > > + * text symbol. But pfns for higher page table levels are derived by > > + * masking lower bits of this real pfn. These derived pfns might not > > + * exist on the platform but that does not really matter as pfn_pxx() > > + * helpers will still create appropriate entries for the test. This > > + * helps avoid large memory block allocations to be used for mapping > > + * at higher page table levels. > > + */ > > + paddr = __pa(&start_kernel); > > + > > + pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT; > > + pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT; > > + pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT; > > + p4d_aligned = (paddr & P4D_MASK) >> PAGE_SHIFT; > > + pgd_aligned = (paddr & PGDIR_MASK) >> PAGE_SHIFT; > > + WARN_ON(!pfn_valid(pte_aligned)); > > + > > + pgdp = pgd_offset(mm, vaddr); > > + p4dp = p4d_alloc(mm, pgdp, vaddr); > > + pudp = pud_alloc(mm, p4dp, vaddr); > > + pmdp = pmd_alloc(mm, pudp, vaddr); > > + ptep = pte_alloc_map(mm, pmdp, vaddr); > > + > > + /* > > + * Save all the page table page addresses as the page table > > + * entries will be used for testing with random or garbage > > + * values. These saved addresses will be used for freeing > > + * page table pages. > > + */ > > + pmd = READ_ONCE(*pmdp); > > + saved_p4dp = p4d_offset(pgdp, 0UL); > > + saved_pudp = pud_offset(p4dp, 0UL); > > + saved_pmdp = pmd_offset(pudp, 0UL); > > + saved_ptep = pmd_pgtable(pmd); > > + > > + pte_basic_tests(pte_aligned, prot); > > + pmd_basic_tests(pmd_aligned, prot); > > + pud_basic_tests(pud_aligned, prot); > > + p4d_basic_tests(p4d_aligned, prot); > > + pgd_basic_tests(pgd_aligned, prot); > > + > > + pte_clear_tests(mm, ptep); > > + pmd_clear_tests(mm, pmdp); > > + pud_clear_tests(mm, pudp); > > + p4d_clear_tests(mm, p4dp); > > + pgd_clear_tests(mm, pgdp); > > + > > + pte_unmap(ptep); > > + > > + pmd_populate_tests(mm, pmdp, saved_ptep); > > + pud_populate_tests(mm, pudp, saved_pmdp); > > + p4d_populate_tests(mm, p4dp, saved_pudp); > > + pgd_populate_tests(mm, pgdp, saved_p4dp); > > + > > + p4d_free(mm, saved_p4dp); > > + pud_free(mm, saved_pudp); > > + pmd_free(mm, saved_pmdp); > > + pte_free(mm, saved_ptep); > > + > > + mm_dec_nr_puds(mm); > > + mm_dec_nr_pmds(mm); > > + mm_dec_nr_ptes(mm); > > + mmdrop(mm); > > +} 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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 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 63207C4BA13 for ; Wed, 26 Feb 2020 14:12:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 2EE012467B for ; Wed, 26 Feb 2020 14:12:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="EnY6VW8u"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=lca.pw header.i=@lca.pw header.b="rWcvB3Ch" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2EE012467B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lca.pw Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-snps-arc-bounces+linux-snps-arc=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.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: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=8p/TrVZxtv/LIe/5kewQyxIqE3XOrkrcsIe0LCjL0Z4=; b=EnY6VW8ugiwwDT FO0TKz2XOseM6rxYaKcMvP3iEnQHD0+X/SuqFGekLeb8bX83/9+tLhM3pOrVTrYz9+8I5XKNGGJj1 aqA6U1YS5z0/Xf//AO1uBXUaBKFFvngWWlOsK8kaEG1lcnn9XOPCuv47BMVHV1clZrewvfUNUX5ea 6Ma/nUgIU2IJMXimTKfJznDwuunlfoGLgPMcV0F/3PLHYnUpqJ3EdFoq3dH/czpK28sUsO16o9eJW jmQcwRu0uzKkjlJktMF9FLxSZFhVYe7RHzU6EB0br20zUUlTJo/p7n60A7BDh0aX9imZhXVDL0N+D bwh1D/JwBmhEBqscKYTg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j6xQM-0004dl-9Y; Wed, 26 Feb 2020 14:12:30 +0000 Received: from mail-qt1-x844.google.com ([2607:f8b0:4864:20::844]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1j6xQG-0004cJ-56 for linux-snps-arc@lists.infradead.org; Wed, 26 Feb 2020 14:12:28 +0000 Received: by mail-qt1-x844.google.com with SMTP id t13so2323151qto.3 for ; Wed, 26 Feb 2020 06:12:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=message-id:subject:from:to:cc:date:in-reply-to:references :mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=rWcvB3ChbzzCxhjsRkXwIGu/GTo7njlFvzRCsSW8lMMm97sOvJCBB8yGBE5JoeWJ31 XEFJUxPrzL+8aubEOKhgodlo5lvUk4fWW8CCvChfOo4kAFbQ+jjF5tB6xxx3hI9W4rX3 Id85+OHj79KSqLDnOcgGivnSurvGmHY5Y0wDax4W1DeOv/NGKM2lJPfpBpsaueixcQVu YsMmSBdDql8ep92UT7qNnV5Ujsc5Z4kCk04YWC5r/orXob32oWrMScXUu1R/FK8Mtjks 2xHX0Dfy4GY1Z24Vgd9PfEyO+qFVaVr6ea2Tvk1G0ZGeeAk6DAHzYWPqBrUZjf+bsJil BIxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=S/T1W8TVJGS0Y0LRQUlnFftGMk+5rM24HoNRV/ew9x5o0F43MUD4SvPfktAl3W5dy+ zFxAb9bWOwX2WeoHIitHr9Qh0Ef9H08epBbUVu3EuoVZXeGQchsQyAGBBf2GWrduX607 xDA4lXXAzKjR6VLeYBzLu73lcxOZP7huuQg8CN8TQxh2JcapqNyU49OdL9y4zyrCKofG rYVmxekSBrCBK55dSq+Py5gkYxghGn9ZKZls0dBu8XsIKtUbko5va3OESXl28PWJAD4n 4DZw4tJZc4mu4jcG9So8irQQttwOv3nkxlIMcbb19PCvTM14/FJdGlkT0LAF4J1GLM5Z jIGQ== X-Gm-Message-State: APjAAAXWqToc4dGYnyvqRb3EeJSRZnMQZ2s8AnQbdqoRVB28Ep4YdzAi 0a6IQ46YGjaOx+KXrrkcHN07Bw== X-Google-Smtp-Source: APXvYqw9aMSIfTjqPLvpJ3bOyXHHZNQ6U+9bhlBH8v5g0ienQKqHKc/G1KSbjjFvDpjZB3+MOQWimg== X-Received: by 2002:aed:256f:: with SMTP id w44mr5262478qtc.331.1582726342954; Wed, 26 Feb 2020 06:12:22 -0800 (PST) Received: from dhcp-41-57.bos.redhat.com (nat-pool-bos-t.redhat.com. [66.187.233.206]) by smtp.gmail.com with ESMTPSA id w9sm1196529qka.71.2020.02.26.06.12.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 Feb 2020 06:12:22 -0800 (PST) Message-ID: <1582726340.7365.124.camel@lca.pw> Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers From: Qian Cai To: Anshuman Khandual , linux-mm@kvack.org Date: Wed, 26 Feb 2020 09:12:20 -0500 In-Reply-To: <1582726182.7365.123.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> X-Mailer: Evolution 3.22.6 (3.22.6-10.el7) Mime-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200226_061224_332830_A7F70026 X-CRM114-Status: GOOD ( 23.15 ) X-BeenThere: linux-snps-arc@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on Synopsys ARC Processors List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Catalin Marinas , Heiko Carstens , Paul Mackerras , "H. Peter Anvin" , linux-riscv@lists.infradead.org, Will Deacon , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, Michael Ellerman , x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , Benjamin Herrenschmidt , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Christophe Leroy , Vineet Gupta , linux-kernel@vger.kernel.org, Palmer Dabbelt , Andrew Morton , linuxppc-dev@lists.ozlabs.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-snps-arc" Errors-To: linux-snps-arc-bounces+linux-snps-arc=archiver.kernel.org@lists.infradead.org T24gV2VkLCAyMDIwLTAyLTI2IGF0IDA5OjA5IC0wNTAwLCBRaWFuIENhaSB3cm90ZToKPiBPbiBN b24sIDIwMjAtMDItMTcgYXQgMDg6NDcgKzA1MzAsIEFuc2h1bWFuIEtoYW5kdWFsIHdyb3RlOgo+ ID4gVGhpcyBhZGRzIHRlc3RzIHdoaWNoIHdpbGwgdmFsaWRhdGUgYXJjaGl0ZWN0dXJlIHBhZ2Ug dGFibGUgaGVscGVycyBhbmQKPiA+IG90aGVyIGFjY2Vzc29ycyBpbiB0aGVpciBjb21wbGlhbmNl IHdpdGggZXhwZWN0ZWQgZ2VuZXJpYyBNTSBzZW1hbnRpY3MuCj4gPiBUaGlzIHdpbGwgaGVscCB2 YXJpb3VzIGFyY2hpdGVjdHVyZXMgaW4gdmFsaWRhdGluZyBjaGFuZ2VzIHRvIGV4aXN0aW5nCj4g PiBwYWdlIHRhYmxlIGhlbHBlcnMgb3IgYWRkaXRpb24gb2YgbmV3IG9uZXMuCj4gPiAKPiA+IFRo aXMgdGVzdCBjb3ZlcnMgYmFzaWMgcGFnZSB0YWJsZSBlbnRyeSB0cmFuc2Zvcm1hdGlvbnMgaW5j bHVkaW5nIGJ1dCBub3QKPiA+IGxpbWl0ZWQgdG8gb2xkLCB5b3VuZywgZGlydHksIGNsZWFuLCB3 cml0ZSwgd3JpdGUgcHJvdGVjdCBldGMgYXQgdmFyaW91cwo+ID4gbGV2ZWwgYWxvbmcgd2l0aCBw b3B1bGF0aW5nIGludGVybWVkaWF0ZSBlbnRyaWVzIHdpdGggbmV4dCBwYWdlIHRhYmxlIHBhZ2UK PiA+IGFuZCB2YWxpZGF0aW5nIHRoZW0uCj4gPiAKPiA+IFRlc3QgcGFnZSB0YWJsZSBwYWdlcyBh cmUgYWxsb2NhdGVkIGZyb20gc3lzdGVtIG1lbW9yeSB3aXRoIHJlcXVpcmVkIHNpemUKPiA+IGFu ZCBhbGlnbm1lbnRzLiBUaGUgbWFwcGVkIHBmbnMgYXQgcGFnZSB0YWJsZSBsZXZlbHMgYXJlIGRl cml2ZWQgZnJvbSBhCj4gPiByZWFsIHBmbiByZXByZXNlbnRpbmcgYSB2YWxpZCBrZXJuZWwgdGV4 dCBzeW1ib2wuIFRoaXMgdGVzdCBnZXRzIGNhbGxlZAo+ID4gaW5zaWRlIGtlcm5lbF9pbml0KCkg cmlnaHQgYWZ0ZXIgYXN5bmNfc3luY2hyb25pemVfZnVsbCgpLgo+ID4gCj4gPiBUaGlzIHRlc3Qg Z2V0cyBidWlsdCBhbmQgcnVuIHdoZW4gQ09ORklHX0RFQlVHX1ZNX1BHVEFCTEUgaXMgc2VsZWN0 ZWQuIEFueQo+ID4gYXJjaGl0ZWN0dXJlLCB3aGljaCBpcyB3aWxsaW5nIHRvIHN1YnNjcmliZSB0 aGlzIHRlc3Qgd2lsbCBuZWVkIHRvIHNlbGVjdAo+ID4gQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJM RS4gRm9yIG5vdyB0aGlzIGlzIGxpbWl0ZWQgdG8gYXJjLCBhcm02NCwgeDg2LCBzMzkwCj4gPiBh bmQgcHBjMzIgcGxhdGZvcm1zIHdoZXJlIHRoZSB0ZXN0IGlzIGtub3duIHRvIGJ1aWxkIGFuZCBy dW4gc3VjY2Vzc2Z1bGx5Lgo+ID4gR29pbmcgZm9yd2FyZCwgb3RoZXIgYXJjaGl0ZWN0dXJlcyB0 b28gY2FuIHN1YnNjcmliZSB0aGUgdGVzdCBhZnRlciBmaXhpbmcKPiA+IGFueSBidWlsZCBvciBy dW50aW1lIHByb2JsZW1zIHdpdGggdGhlaXIgcGFnZSB0YWJsZSBoZWxwZXJzLiBNZWFud2hpbGUg Zm9yCj4gPiBiZXR0ZXIgcGxhdGZvcm0gY292ZXJhZ2UsIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIGVu YWJsZWQgd2l0aCBDT05GSUdfRVhQRVJUCj4gPiBldmVuIHdpdGhvdXQgQVJDSF9IQVNfREVCVUdf Vk1fUEdUQUJMRS4KPiA+IAo+ID4gRm9sa3MgaW50ZXJlc3RlZCBpbiBtYWtpbmcgc3VyZSB0aGF0 IGEgZ2l2ZW4gcGxhdGZvcm0ncyBwYWdlIHRhYmxlIGhlbHBlcnMKPiA+IGNvbmZvcm0gdG8gZXhw ZWN0ZWQgZ2VuZXJpYyBNTSBzZW1hbnRpY3Mgc2hvdWxkIGVuYWJsZSB0aGUgYWJvdmUgY29uZmln Cj4gPiB3aGljaCB3aWxsIGp1c3QgdHJpZ2dlciB0aGlzIHRlc3QgZHVyaW5nIGJvb3QuIEFueSBu b24gY29uZm9ybWl0eSBoZXJlIHdpbGwKPiA+IGJlIHJlcG9ydGVkIGFzIGFuIHdhcm5pbmcgd2hp Y2ggd291bGQgbmVlZCB0byBiZSBmaXhlZC4gVGhpcyB0ZXN0IHdpbGwgaGVscAo+ID4gY2F0Y2gg YW55IGNoYW5nZXMgdG8gdGhlIGFncmVlZCB1cG9uIHNlbWFudGljcyBleHBlY3RlZCBmcm9tIGdl bmVyaWMgTU0gYW5kCj4gPiBlbmFibGUgcGxhdGZvcm1zIHRvIGFjY29tbW9kYXRlIGl0IHRoZXJl YWZ0ZXIuCj4gCj4gSG93IHVzZWZ1bCBpcyB0aGlzIHRoYXQgc3RyYWlnaHRseSBjcmFzaCB0aGUg cG93ZXJwYz8KCkFuZCB0aGVuIGdlbmVyYXRlIHdhcm5pbmdzIG9uIGFybTY0LAoKW8KgwqAxNDYu NjM0NjI2XVvCoMKgwqDCoFQxXSBkZWJ1Z192bV9wZ3RhYmxlOiBkZWJ1Z192bV9wZ3RhYmxlOiBW YWxpZGF0aW5nCmFyY2hpdGVjdHVyZSBwYWdlIHRhYmxlIGhlbHBlcnMKW8KgwqAxNDYuNjQzOTk1 XVvCoMKgwqDCoFQxXSAtLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS0KW8KgwqAx NDYuNjQ5MzUwXVvCoMKgwqDCoFQxXSB2aXJ0X3RvX3BoeXMgdXNlZCBmb3Igbm9uLWxpbmVhciBh ZGRyZXNzOgooX19fX3B0cnZhbF9fX18pIChzdGFydF9rZXJuZWwrMHgwLzB4NTgwKQpbwqDCoDE0 Ni42NTg4NDBdW8KgwqDCoMKgVDFdIFdBUk5JTkc6IENQVTogMTY1IFBJRDogMSBhdCBhcmNoL2Fy bTY0L21tL3BoeXNhZGRyLmM6MTUKX192aXJ0X3RvX3BoeXMrMHg5OC8weGUwClvCoMKgMTQ2LjY2 Nzk3Nl1bwqDCoMKgwqBUMV0gTW9kdWxlcyBsaW5rZWQgaW46ClvCoMKgMTQ2LjY3MTc0MV1bwqDC oMKgwqBUMV0gQ1BVOiAxNjUgUElEOiAxIENvbW06IHN3YXBwZXIvMCBUYWludGVkOgpHwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBMwqDCoMKgwqA1LjYuMC1yYzMtbmV4dC0yMDIwMDIyNiAjMQpb wqDCoDE0Ni42ODEzOTddW8KgwqDCoMKgVDFdIEhhcmR3YXJlIG5hbWU6IEhQRSBBcG9sbG8KNzDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC9DMDFfQVBBQ0hFX01CwqDCoMKgwqDCoMKgwqDCoMKg LCBCSU9TIEw1MF81LjEzXzEuMTEgMDYvMTgvMjAxOQpbwqDCoDE0Ni42OTE4NDBdW8KgwqDCoMKg VDFdIHBzdGF0ZTogNjA0MDAwMDkgKG5aQ3YgZGFpZiArUEFOIC1VQU8pClvCoMKgMTQ2LjY5NzMz NF1bwqDCoMKgwqBUMV0gcGMgOiBfX3ZpcnRfdG9fcGh5cysweDk4LzB4ZTAKW8KgwqAxNDYuNzAy MDQ1XVvCoMKgwqDCoFQxXSBsciA6IF9fdmlydF90b19waHlzKzB4OTgvMHhlMApbwqDCoDE0Ni43 MDY3NTNdW8KgwqDCoMKgVDFdIHNwIDogMThmZjAwMDgyYjdhZmUxMApbwqDCoDE0Ni43MTA3NjZd W8KgwqDCoMKgVDFdIHgyOTogMThmZjAwMDgyYjdhZmUzMCB4Mjg6IDAwMDAwMDAwMDAwMDAwMDDC oApbwqDCoDE0Ni43MTY3ODJdW8KgwqDCoMKgVDFdIHgyNzogMDAwMDAwMDAwMDAwMDAwMCB4MjY6 IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43MjI3OThdW8KgwqDCoMKgVDFdIHgyNTogMDAw MDAwMDAwMDAwMDAwMCB4MjQ6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43Mjg4MTNdW8Kg wqDCoMKgVDFdIHgyMzogMDAwMDAwMDAwMDAwMDAwMCB4MjI6IDAwMDAwMDAwMDAwMDAwMDDCoApb wqDCoDE0Ni43MzQ4MjddW8KgwqDCoMKgVDFdIHgyMTogMDAwMDAwMDAwMDAwMDAwMCB4MjA6IGZm ZmY5MDAwMTM1YjQwMDDCoApbwqDCoDE0Ni43NDA4NDJdW8KgwqDCoMKgVDFdIHgxOTogZmZmZjkw MDAxMTIwMDg1OCB4MTg6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43NDY4NTddW8KgwqDC oMKgVDFdIHgxNzogMDAwMDAwMDAwMDAwMDAwMCB4MTY6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDC oDE0Ni43NTI4NzJdW8KgwqDCoMKgVDFdIHgxNTogMDAwMDAwMDAwMDAwMDAwMCB4MTQ6IDMwNzgz MDJiNmM2NTZlNzLCoApbwqDCoDE0Ni43NTg4ODddW8KgwqDCoMKgVDFdIHgxMzogNjU2YjVmNzQ3 MjYxNzQ3MyB4MTI6IGZmZmY5MDAwMTM2OWVhOTDCoApbwqDCoDE0Ni43NjQ5MDFdW8KgwqDCoMKg VDFdIHgxMTogMDAwMDAwMDAwMDAwMDBjOSB4MTA6IGZmZmY4MDAwODJiNzZjMGXCoApbwqDCoDE0 Ni43NzA5MTddW8KgwqDCoMKgVDFdIHg5IDogOWQ2YTJlMjI2MDQwMTMwMCB4OCA6IDlkNmEyZTIy NjA0MDEzMDDCoApbwqDCoDE0Ni43NzY5MzJdW8KgwqDCoMKgVDFdIHg3IDogYWFhYWFhYWFhYWFh YWFhYSB4NiA6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43ODI5NDZdW8KgwqDCoMKgVDFd IHg1IDogMDAwMDAwMDAwMDAwMDA4MCB4NCA6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43 ODg5NjBdW8KgwqDCoMKgVDFdIHgzIDogMDAwMDAwMDAwMDAwMDAxMCB4MiA6IDAwMDAwMDAwMDAw MDAwMDjCoApbwqDCoDE0Ni43OTQ5NzVdW8KgwqDCoMKgVDFdIHgxIDogMDAwMDAwMDAwMDAwMDAw NiB4MCA6IDAwMDAwMDAwMDAwMDAwNTPCoApbwqDCoDE0Ni44MDA5OTBdW8KgwqDCoMKgVDFdIENh bGwgdHJhY2U6ClvCoMKgMTQ2LjgwNDE0MF1bwqDCoMKgwqBUMV3CoMKgX192aXJ0X3RvX3BoeXMr MHg5OC8weGUwClvCoMKgMTQ2LjgwODUxMl1bwqDCoMKgwqBUMV3CoMKgZGVidWdfdm1fcGd0YWJs ZSsweDc0LzB4M2ZjClvCoMKgMTQ2LjgxMzE0MF1bwqDCoMKgwqBUMV3CoMKga2VybmVsX2luaXQr MHgxYy8weDIwOApbwqDCoDE0Ni44MTczMzRdW8KgwqDCoMKgVDFdwqDCoHJldF9mcm9tX2Zvcmsr MHgxMC8weDE4ClvCoMKgMTQ2LjgyMTYwOF1bwqDCoMKgwqBUMV0gaXJxIGV2ZW50IHN0YW1wOiAx OTg0MzM4OApbwqDCoDE0Ni44MjU5NzhdW8KgwqDCoMKgVDFdIGhhcmRpcnFzIGxhc3TCoMKgZW5h YmxlZCBhdCAoMTk4NDMzODcpOgpbPGZmZmY5MDAwMTAxZDk1OWM+XSBjb25zb2xlX3VubG9jaysw eDhkMC8weDk3MApbwqDCoDE0Ni44MzU1NTNdW8KgwqDCoMKgVDFdIGhhcmRpcnFzIGxhc3QgZGlz YWJsZWQgYXQgKDE5ODQzMzg4KToKWzxmZmZmOTAwMDEwMGFkMGUwPl0gZG9fZGVidWdfZXhjZXB0 aW9uKzB4NTgvMHgyY2MKW8KgwqAxNDYuODQ1Mzg3XVvCoMKgwqDCoFQxXSBzb2Z0aXJxcyBsYXN0 wqDCoGVuYWJsZWQgYXQgKDE5ODQzMzg0KToKWzxmZmZmOTAwMDEwMDgxYjhjPl0gX19kb19zb2Z0 aXJxKzB4ODY0LzB4OTAwClvCoMKgMTQ2Ljg1NDc5Nl1bwqDCoMKgwqBUMV0gc29mdGlycXMgbGFz dCBkaXNhYmxlZCBhdCAoMTk4NDMzNzcpOgpbPGZmZmY5MDAwMTAxMjBiNzA+XSBpcnFfZXhpdCsw eDFjOC8weDIzOApbwqDCoDE0Ni44NjM4NDVdW8KgwqDCoMKgVDFdIC0tLVsgZW5kIHRyYWNlIDMx Njc4ZDllODQ1ZGZmODkgXS0tLQoKPiAKPiBbwqDCoMKgMjMuMjYzNDI1XVvCoMKgwqDCoFQxXSBk ZWJ1Z192bV9wZ3RhYmxlOiBkZWJ1Z192bV9wZ3RhYmxlOiBWYWxpZGF0aW5nCj4gYXJjaGl0ZWN0 dXJlIHBhZ2UgdGFibGUgaGVscGVycwo+IFvCoMKgwqAyMy4yNjM2MjVdW8KgwqDCoMKgVDFdIC0t LS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLQo+IFvCoMKgwqAyMy4yNjM2NDldW8Kg wqDCoMKgVDFdIGtlcm5lbCBCVUcgYXQgYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYzoyNzQhCj4g W8KgwqDCoDIzLjI2MzY3NV1bwqDCoMKgwqBUMV0gT29wczogRXhjZXB0aW9uIGluIGtlcm5lbCBt b2RlLCBzaWc6IDUgWyMxXQo+IFvCoMKgwqAyMy4yNjM2OThdW8KgwqDCoMKgVDFdIExFIFBBR0Vf U0laRT02NEsgTU1VPVJhZGl4IFNNUCBOUl9DUFVTPTI1Ngo+IERFQlVHX1BBR0VBTExPQyBOVU1B IFBvd2VyTlYKPiBbwqDCoMKgMjMuMjYzNzMxXVvCoMKgwqDCoFQxXSBNb2R1bGVzIGxpbmtlZCBp bjoKPiBbwqDCoMKgMjMuMjYzNzUyXVvCoMKgwqDCoFQxXSBDUFU6IDQgUElEOiAxIENvbW06IHN3 YXBwZXIvMCBOb3QgdGFpbnRlZCA1LjYuMC1yYzMtbmV4dC0KPiAyMDIwMDIyNiAjMQo+IFvCoMKg wqAyMy4yNjM3NzZdW8KgwqDCoMKgVDFdIE5JUDrCoMKgYzAwMDAwMDAwMDA3MzA4YyBMUjogYzAw MDAwMDAwMTAzZGJkOCBDVFI6Cj4gMDAwMDAwMDAwMDAwMDAwMAo+IFvCoMKgwqAyMy4yNjM4MTBd W8KgwqDCoMKgVDFdIFJFR1M6IGMwMDAwMDAwM2RkYWY5YzAgVFJBUDogMDcwMMKgwqDCoE5vdCB0 YWludGVkwqDCoCg1LjYuMC0KPiByYzMtbmV4dC0yMDIwMDIyNikKPiBbwqDCoMKgMjMuMjYzODQ2 XVvCoMKgwqDCoFQxXSBNU1I6wqDCoDkwMDAwMDAwMDAwMjkwMzMgPFNGLEhWLEVFLE1FLElSLERS LFJJLExFPsKgwqBDUjoKPiAyMjAwMDIyOMKgwqBYRVI6IDAwMDAwMDAwCj4gW8KgwqDCoDIzLjI2 Mzg4OF1bwqDCoMKgwqBUMV0gQ0ZBUjogYzAwMDAwMDAwMDA3MzAzMCBJUlFNQVNLOiAwwqAKPiBb wqDCoMKgMjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwMDogYzAwMDAwMDAwMTAzZGJkOCBjMDAw MDAwMDNkZGFmYzUwIGMwMDAwMDAwMDE2NTZmMDAKPiBjMDAwMDAxZDdiNGNhMDgwwqAKPiBbwqDC oMKgMjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwNDogMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAw MDAwMDAwMDA5IGMwMDAwMDAwM2RkYWZjMDQKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKg MjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwODogZjBmZmZmZmZmZmZmZmZmZiAwMDAwMDAwMDAw MDAwMDAxIGMwMDAwMDAwMDE2Mjc5ZDAKPiAwMDAwMDAwMDAwMGEwMDAwwqAKPiBbwqDCoMKgMjMu MjYzODg4XVvCoMKgwqDCoFQxXSBHUFIxMjogMDAwMDAwMDAwMDAwMDAwMCBjMDAwMDAxZmZmZmZh ZTAwIGMwMDAwMDAwMDAwMTBlODQKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKgMjMuMjYz ODg4XVvCoMKgwqDCoFQxXSBHUFIxNjogMDAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMTA1 IDAwMDAwMDAwMDAwMDAxMDAKPiBjMDAwMDAwMDAxNjg5YTE4wqAKPiBbwqDCoMKgMjMuMjYzODg4 XVvCoMKgwqDCoFQxXSBHUFIyMDogYzAwMDIwMDMyYzY2MDAwMCBjMDAwMjAwMzJjNjIwMDAwIGMw MDAwMDAwMDE3MTYwMzAKPiBjMDAwMjAwMzJjNjAwMDAwwqAKPiBbwqDCoMKgMjMuMjYzODg4XVvC oMKgwqDCoFQxXSBHUFIyNDogMDAwMDAwMDAwMDAwMDAwZCBjMDAwMDAwMDAxNzE2MDMwIGMwMDAw MDFkN2I0Y2EwODAKPiBjMDAwMDAwMDAxNzE2MDQwwqAKPiBbwqDCoMKgMjMuMjYzODg4XVvCoMKg wqDCoFQxXSBHUFIyODogYzAwMDAwMDAwMTcxNjAzOCAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAw MDAwMDAwMDAKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKgMjMuMjY0MTIyXVvCoMKgwqDC oFQxXSBOSVAgW2MwMDAwMDAwMDAwNzMwOGNdIGFzc2VydF9wdGVfbG9ja2VkKzB4MTFjLzB4MzIw Cj4gW8KgwqDCoDIzLjI2NDE1NF1bwqDCoMKgwqBUMV0gTFIgW2MwMDAwMDAwMDEwM2RiZDhdIGRl YnVnX3ZtX3BndGFibGUrMHg3NzAvMHhiN2MKPiBbwqDCoMKgMjMuMjY0MTg2XVvCoMKgwqDCoFQx XSBDYWxsIFRyYWNlOgo+IFvCoMKgwqAyMy4yNjQyMDZdW8KgwqDCoMKgVDFdIFtjMDAwMDAwMDNk ZGFmYzUwXSBbYzAwMDAwMDAwMDk5OTc2MF0KPiBfcmF3X3NwaW5fdW5sb2NrKzB4MzAvMHg3MCAo dW5yZWxpYWJsZSkKPiBbwqDCoMKgMjMuMjY0MjQ0XVvCoMKgwqDCoFQxXSBbYzAwMDAwMDAzZGRh ZmNkMF0gW2MwMDAwMDAwMDEwM2Q5MjRdCj4gZGVidWdfdm1fcGd0YWJsZSsweDRiYy8weGI3Ywo+ IFvCoMKgwqAyMy4yNjQyNzldW8KgwqDCoMKgVDFdIFtjMDAwMDAwMDNkZGFmZGIwXSBbYzAwMDAw MDAwMDAxMGVhY10KPiBrZXJuZWxfaW5pdCsweDMwLzB4MTk0Cj4gW8KgwqDCoDIzLjI2NDMxNV1b wqDCoMKgwqBUMV0gW2MwMDAwMDAwM2RkYWZlMjBdIFtjMDAwMDAwMDAwMDBiNzQ4XQo+IHJldF9m cm9tX2tlcm5lbF90aHJlYWQrMHg1Yy8weDc0Cj4gW8KgwqDCoDIzLjI2NDM0OV1bwqDCoMKgwqBU MV0gSW5zdHJ1Y3Rpb24gZHVtcDoKPiBbwqDCoMKgMjMuMjY0MzY4XVvCoMKgwqDCoFQxXSA2MDAw MDAwMCAzYmUwMDAwMSA3ZmJlZjQzNiBlYWZhMDA0MCA3ZmZmYzAzMCAzYmZmZmZmZgo+IDdmZmYw N2I0IDdmZmZmMDM4wqAKPiBbwqDCoMKgMjMuMjY0NDA5XVvCoMKgwqDCoFQxXSA3YmZmMWYyNCA3 ZDM3ZjgyYSA3ZDI5MDA3NCA3OTI5ZDE4MiA8MGIwOTAwMDA+IGViZGIwMDAwCj4gZTkzYzAwMDAg N2ZkZTRhMTTCoAo+IFvCoMKgwqAyMy4yNjQ0NjBdW8KgwqDCoMKgVDFdIC0tLVsgZW5kIHRyYWNl IDcyZDI5MzEwMjJlOWFiMjQgXS0tLQo+IFvCoMKgwqAyMy42MjczMTFdW8KgwqDCoMKgVDFdwqAK PiBbwqDCoMKgMjQuNjI3NDA3XVvCoMKgwqDCoFQxXSBLZXJuZWwgcGFuaWMgLSBub3Qgc3luY2lu ZzogRmF0YWwgZXhjZXB0aW9uCj4gW8KgwqDCoDI2LjUKPiAKPiA+IAo+ID4gQ2M6IEFuZHJldyBN b3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5vcmc+Cj4gPiBDYzogTWlrZSBSYXBvcG9ydCA8 cnBwdEBsaW51eC5pYm0uY29tPgo+ID4gQ2M6IFZpbmVldCBHdXB0YSA8dmd1cHRhQHN5bm9wc3lz LmNvbT4KPiA+IENjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tPgo+ ID4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsQGtlcm5lbC5vcmc+Cj4gPiBDYzogQmVuamFtaW4gSGVy cmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgo+ID4gQ2M6IFBhdWwgTWFja2Vy cmFzIDxwYXVsdXNAc2FtYmEub3JnPgo+ID4gQ2M6IE1pY2hhZWwgRWxsZXJtYW4gPG1wZUBlbGxl cm1hbi5pZC5hdT4KPiA+IENjOiBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJt LmNvbT4KPiA+IENjOiBWYXNpbHkgR29yYmlrIDxnb3JAbGludXguaWJtLmNvbT4KPiA+IENjOiBD aHJpc3RpYW4gQm9ybnRyYWVnZXIgPGJvcm50cmFlZ2VyQGRlLmlibS5jb20+Cj4gPiBDYzogVGhv bWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+Cj4gPiBDYzogSW5nbyBNb2xuYXIgPG1p bmdvQHJlZGhhdC5jb20+Cj4gPiBDYzogQm9yaXNsYXYgUGV0a292IDxicEBhbGllbjguZGU+Cj4g PiBDYzogIkguIFBldGVyIEFudmluIiA8aHBhQHp5dG9yLmNvbT4KPiA+IENjOiBLaXJpbGwgQS4g U2h1dGVtb3YgPGtpcmlsbEBzaHV0ZW1vdi5uYW1lPgo+ID4gQ2M6IFBhdWwgV2FsbXNsZXkgPHBh dWwud2FsbXNsZXlAc2lmaXZlLmNvbT4KPiA+IENjOiBQYWxtZXIgRGFiYmVsdCA8cGFsbWVyQGRh YmJlbHQuY29tPgo+ID4gQ2M6IGxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+ IENjOiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+IENjOiBsaW51eHBw Yy1kZXZAbGlzdHMub3psYWJzLm9yZwo+ID4gQ2M6IGxpbnV4LXMzOTBAdmdlci5rZXJuZWwub3Jn Cj4gPiBDYzogbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwo+ID4gQ2M6IHg4NkBrZXJu ZWwub3JnCj4gPiBDYzogbGludXgtYXJjaEB2Z2VyLmtlcm5lbC5vcmcKPiA+IENjOiBsaW51eC1r ZXJuZWxAdmdlci5rZXJuZWwub3JnCj4gPiAKPiA+IFN1Z2dlc3RlZC1ieTogQ2F0YWxpbiBNYXJp bmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNvbT4KPiA+IFJldmlld2VkLWJ5OiBJbmdvIE1vbG5h ciA8bWluZ29Aa2VybmVsLm9yZz4KPiA+IFRlc3RlZC1ieTogR2VyYWxkIFNjaGFlZmVyIDxnZXJh bGQuc2NoYWVmZXJAZGUuaWJtLmNvbT4JIyBzMzkwCj4gPiBUZXN0ZWQtYnk6IENocmlzdG9waGUg TGVyb3kgPGNocmlzdG9waGUubGVyb3lAYy1zLmZyPgkjIHBwYzMyCj4gPiBTaWduZWQtb2ZmLWJ5 OiBBbmRyZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnPgo+ID4gU2lnbmVkLW9m Zi1ieTogQ2hyaXN0b3BoZSBMZXJveSA8Y2hyaXN0b3BoZS5sZXJveUBjLXMuZnI+Cj4gPiBTaWdu ZWQtb2ZmLWJ5OiBBbnNodW1hbiBLaGFuZHVhbCA8YW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbT4K PiA+IC0tLQo+ID4gVGhpcyBhZGRzIGEgdGVzdCB2YWxpZGF0aW9uIGZvciBhcmNoaXRlY3R1cmUg ZXhwb3J0ZWQgcGFnZSB0YWJsZSBoZWxwZXJzLgo+ID4gUGF0Y2ggYWRkcyBiYXNpYyB0cmFuc2Zv cm1hdGlvbiB0ZXN0cyBhdCB2YXJpb3VzIGxldmVscyBvZiB0aGUgcGFnZSB0YWJsZS4KPiA+IAo+ ID4gVGhpcyB0ZXN0IHdhcyBvcmlnaW5hbGx5IHN1Z2dlc3RlZCBieSBDYXRhbGluIGR1cmluZyBh cm02NCBUSFAgbWlncmF0aW9uCj4gPiBSRkMgZGlzY3Vzc2lvbiBlYXJsaWVyLiBHb2luZyBmb3J3 YXJkIGl0IGNhbiBpbmNsdWRlIG1vcmUgc3BlY2lmaWMgdGVzdHMKPiA+IHdpdGggcmVzcGVjdCB0 byB2YXJpb3VzIGdlbmVyaWMgTU0gZnVuY3Rpb25zIGxpa2UgVEhQLCBIdWdlVExCIGV0YyBhbmQK PiA+IHBsYXRmb3JtIHNwZWNpZmljIHRlc3RzLgo+ID4gCj4gPiBodHRwczovL2xvcmUua2VybmVs Lm9yZy9saW51eC1tbS8yMDE5MDYyODEwMjAwMy5HQTU2NDYzQGFycmFraXMuZW1lYS5hcm0uY29t Lwo+ID4gCj4gPiBOZWVkcyB0byBiZSBhcHBsaWVkIG9uIGxpbnV4IFY1LjYtcmMyCj4gPiAKPiA+ IENoYW5nZXMgaW4gVjE0Ogo+ID4gCj4gPiAtIERpc2FibGVkIERFQlVHX1ZNX1BHRkxBR1MgZm9y IElBNjQgYW5kIEFSTSAoMzIgQml0KSBwZXIgQW5kcmV3IGFuZCBDaHJpc3RvcGhlCj4gPiAtIFVw ZGF0ZWQgREVCVUdfVk1fUEdGTEFHUyBkb2N1bWVudGF0aW9uIHdydCBFWFBFUlQgYW5kIGRpc2Fi bGVkIHBsYXRmb3Jtcwo+ID4gLSBVcGRhdGVkIFJBTkRPTV9bT1J8TlpdVkFMVUUgb3BlbiBlbmNv ZGluZ3Mgd2l0aCBHRU5NQVNLKCkgcGVyIENhdGFsaW4KPiA+IC0gVXBkYXRlZCBzMzkwIGNvbnN0 cmFpbnQgYml0cyBmcm9tIDEyIHRvIDQgKFMzOTBfTUFTS19CSVRTKSBwZXIgR2VyYWxkCj4gPiAt IFVwZGF0ZWQgaW4tY29kZSBkb2N1bWVudGF0aW9uIGZvciBSQU5ET01fT1JWQUxVRSBwZXIgR2Vy YWxkCj4gPiAtIFVwZGF0ZWQgcHh4X2Jhc2ljX3Rlc3RzKCkgdG8gdXNlIGludmVydCBmdW5jdGlv bnMgZmlyc3QgcGVyIENhdGFsaW4KPiA+IC0gRHJvcHBlZCBBUkNIX0hBU180TEVWRUxfSEFDSyBj aGVjayBmcm9tIHB1ZF9iYXNpY190ZXN0cygpCj4gPiAtIFJlcGxhY2VkIF9fQVJDSF9IQVNfWzR8 NV1MRVZFTF9IQUNLIHdpdGggX19QQUdFVEFCTEVfW1BVRHxQNERdX0ZPTERFRCBwZXIgQ2F0YWxp bgo+ID4gLSBUcmltbWVkIHRoZSBDQyBsaXN0IG9uIHRoZSBjb21taXQgbWVzc2FnZSBwZXIgQ2F0 YWxpbgo+ID4gCj4gPiBDaGFuZ2VzIGluIFYxMzogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MjM3MTI1KQo+ID4gCj4gPiAtIFN1YnNj cmliZWQgczM5MCBwbGF0Zm9ybSBhbmQgdXBkYXRlZCBkZWJ1Zy12bS1wZ3RhYmxlL2FyY2gtc3Vw cG9ydC50eHQgcGVyIEdlcmFsZAo+ID4gLSBEcm9wcGVkIGtleXdvcmQgJ2V4dGVybicgZnJvbSBk ZWJ1Z192bV9wZ3RhYmxlKCkgZGVjbGFyYXRpb24gcGVyIENocmlzdG9waGUKPiA+IC0gTW92ZWQg ZGVidWdfdm1fcGd0YWJsZSgpIGRlY2xhcmF0aW9ucyB0byA8bGludXgvbW1kZWJ1Zy5oPiBwZXIg Q2hyaXN0b3BoZQo+ID4gLSBNb3ZlZCBkZWJ1Z192bV9wZ3RhYmxlKCkgY2FsbCBzaXRlIGludG8g a2VybmVsX2luaXQoKSBwZXIgQ2hyaXN0b3BoZQo+ID4gLSBDaGFuZ2VkIENPTkZJR19ERUJVR19W TV9QR1RBQkxFIHJ1bGVzIHBlciBDaHJpc3RvcGhlCj4gPiAtIFVwZGF0ZWQgY29tbWl0IHRvIGlu Y2x1ZGUgbmV3IHN1cHBvcnRlZCBwbGF0Zm9ybXMgYW5kIGNoYW5nZWQgY29uZmlnIHNlbGVjdGlv bgo+ID4gCj4gPiBDaGFuZ2VzIGluIFYxMjogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcv cHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MjMzOTA1KQo+ID4gCj4gPiAtIFJlcGxhY2Vk IF9fbW1kcm9wKCkgd2l0aCBtbWRyb3AoKQo+ID4gLSBFbmFibGUgQVJDSF9IQVNfREVCVUdfVk1f UEdUQUJMRSBvbiBYODYgZm9yIG5vbiBDT05GSUdfWDg2X1BBRSBwbGF0Zm9ybXMgYXMgdGhlCj4g PiAgIHRlc3QgcHJvY2VkdXJlIGludGVyZmVyZSB3aXRoIHByZS1hbGxvY2F0ZWQgUE1EcyBhdHRh Y2hlZCB0byB0aGUgUEdEIHJlc3VsdGluZwo+ID4gICBpbiBydW50aW1lIGZhaWx1cmVzIHdpdGgg Vk1fQlVHX09OKCkKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMTE6IChodHRwczovL3BhdGNod29yay5r ZXJuZWwub3JnL3Byb2plY3QvbGludXgtbW0vbGlzdC8/c2VyaWVzPTIyMTEzNSkKPiA+IAo+ID4g LSBSZWJhc2VkIHRoZSBwYXRjaCBvbiBWNS40Cj4gPiAKPiA+IENoYW5nZXMgaW4gVjEwOiAoaHR0 cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0y MDU1MjkpCj4gPiAKPiA+IC0gQWx3YXlzIGVuYWJsZSBERUJVR19WTV9QR1RBQkxFIHdoZW4gREVC VUdfVk0gaXMgZW5hYmxlZCBwZXIgSW5nbwo+ID4gLSBBZGRlZCB0YWdzIGZyb20gSW5nbwo+ID4g Cj4gPiBDaGFuZ2VzIGluIFY5OiAoaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0 L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0yMDE0MjkpCj4gPiAKPiA+IC0gQ2hhbmdlZCBmZWF0dXJl IHN1cHBvcnQgZW51bWVyYXRpb24gZm9yIHBvd2VycGMgcGxhdGZvcm1zIHBlciBDaHJpc3RvcGhl Cj4gPiAtIENoYW5nZWQgY29uZmlnIHdyYXBwZXIgZm9yIGJhc2ljX1twbWR8cHVkXV90ZXN0cygp IHRvIGVuYWJsZSBBUkMgcGxhdGZvcm0KPiA+IC0gRW5hYmxlZCB0aGUgdGVzdCBvbiBBUkMgcGxh dGZvcm0KPiA+IAo+ID4gQ2hhbmdlcyBpbiBWODogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTk0Mjk3KQo+ID4gCj4gPiAtIEVuYWJs ZWQgQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRSBvbiBQUEMzMiBwbGF0Zm9ybSBwZXIgQ2hyaXN0 b3BoZQo+ID4gLSBVcGRhdGVkIGZlYXR1cmUgZG9jdW1lbnRhdGlvbiBhcyBERUJVR19WTV9QR1RB QkxFIGlzIG5vdyBlbmFibGVkIG9uIFBQQzMyIHBsYXRmb3JtCj4gPiAtIE1vdmVkIEFSQ0hfSEFT X0RFQlVHX1ZNX1BHVEFCTEUgZWFybGllciB0byBpbmRlbnQgaXQgd2l0aCBERUJVR19WTSBwZXIg Q2hyaXN0b3BoZQo+ID4gLSBBZGRlZCBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGluIGRlYnVnX3Zt X3BndGFibGUoKSBwZXIgQ2hyaXN0b3BoZQo+ID4gLSBEcm9wcGVkIHJhbmRvbV92YWRkciBib3Vu ZGFyeSBjb25kaXRpb24gY2hlY2tzIHBlciBDaHJpc3RvcGhlIGFuZCBRaWFuCj4gPiAtIFJlcGxh Y2VkIHZpcnRfYWRkcl92YWxpZCgpIGNoZWNrIHdpdGggcGZuX3ZhbGlkKCkgY2hlY2sgaW4gZGVi dWdfdm1fcGd0YWJsZSgpCj4gPiAtIFNsaWdodGx5IGNoYW5nZWQgcHJfZm10KGZtdCkgaW5mb3Jt YXRpb24KPiA+IAo+ID4gQ2hhbmdlcyBpbiBWNzogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTkzMDUxKQo+ID4gCj4gPiAtIE1lbW9y eSBhbGxvY2F0aW9uIGFuZCBmcmVlIHJvdXRpbmVzIGZvciBtYXBwZWQgcGFnZXMgaGF2ZSBiZWVu IGRyb3BlZAo+ID4gLSBNYXBwZWQgcGZucyBhcmUgZGVyaXZlZCBmcm9tIHN0YW5kYXJkIGtlcm5l bCB0ZXh0IHN5bWJvbCBwZXIgTWF0dGhldwo+ID4gLSBNb3ZlZCBkZWJ1Z192bV9wZ3RhYWJsZSgp IGFmdGVyIHBhZ2VfYWxsb2NfaW5pdF9sYXRlKCkgcGVyIE1pY2hhbCBhbmQgUWlhbiAKPiA+IC0g VXBkYXRlZCB0aGUgY29tbWl0IG1lc3NhZ2UgcGVyIE1pY2hhbAo+ID4gLSBVcGRhdGVkIFc9MSBH Q0Mgd2FybmluZyBwcm9ibGVtIG9uIHg4NiBwZXIgUWlhbiBDYWkKPiA+IC0gQWRkaXRpb24gb2Yg bmV3IGFsbG9jX2NvbnRpZ19wYWdlcygpIGhlbHBlciBoYXMgYmVlbiBzdWJtaXR0ZWQgc2VwYXJh dGVseQo+ID4gCj4gPiBDaGFuZ2VzIGluIFY2OiAoaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9y Zy9wcm9qZWN0L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0xODc1ODkpCj4gPiAKPiA+IC0gTW92ZWQg YWxsb2NfZ2lnYW50aWNfcGFnZV9vcmRlcigpIGludG8gbW0vcGFnZV9hbGxvYy5jIHBlciBNaWNo YWwKPiA+IC0gTW92ZWQgYWxsb2NfZ2lnYW50aWNfcGFnZV9vcmRlcigpIHdpdGhpbiBDT05GSUdf Q09OVElHX0FMTE9DIGluIHRoZSB0ZXN0Cj4gPiAtIEZvbGRlZCBBbmRyZXcncyBpbmNsdWRlL2Fz bS1nZW5lcmljL3BndGFibGUuaCBmaXggaW50byB0aGUgdGVzdCBwYXRjaCAyLzIKPiA+IAo+ID4g Q2hhbmdlcyBpbiBWNTogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51 eC1tbS9saXN0Lz9zZXJpZXM9MTg1OTkxKQo+ID4gCj4gPiAtIFJlZGVmaW5lZCBhbmQgbW92ZWQg WDg2IG1tX3A0ZF9mb2xkZWQoKSBpbnRvIGEgZGlmZmVyZW50IGhlYWRlciBwZXIgS2lyaWxsL0lu Z28KPiA+IC0gVXBkYXRlZCB0aGUgY29uZmlnIG9wdGlvbiBjb21tZW50IHBlciBJbmdvIGFuZCBk cm9wcGVkICdrZXJuZWwgbW9kdWxlJyByZWZlcmVuY2UKPiA+IC0gVXBkYXRlZCB0aGUgY29tbWl0 IG1lc3NhZ2UgYW5kIGRyb3BwZWQgJ2tlcm5lbCBtb2R1bGUnIHJlZmVyZW5jZQo+ID4gLSBDaGFu Z2VkIERFQlVHX0FSQ0hfUEdUQUJMRV9URVNUIGludG8gREVCVUdfVk1fUEdUQUJMRSBwZXIgSW5n bwo+ID4gLSBNb3ZlZCBjb25maWcgb3B0aW9uIGZyb20gbW0vS2NvbmZpZy5kZWJ1ZyBpbnRvIGxp Yi9LY29uZmlnLmRlYnVnCj4gPiAtIFJlbmFtZWQgY29yZSB0ZXN0IGZ1bmN0aW9uIGFyY2hfcGd0 YWJsZV90ZXN0cygpIGFzIGRlYnVnX3ZtX3BndGFibGUoKQo+ID4gLSBSZW5hbWVkIG1tL2FyY2hf cGd0YWJsZV90ZXN0LmMgYXMgbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gPiAtIGRlYnVnX3ZtX3Bn dGFibGUoKSBnZXRzIGNhbGxlZCBmcm9tIGtlcm5lbF9pbml0X2ZyZWVhYmxlKCkgYWZ0ZXIgaW5p dF9tbV9pbnRlcm5hbHMoKQo+ID4gLSBBZGRlZCBhbiBlbnRyeSBpbiBEb2N1bWVudGF0aW9uL2Zl YXR1cmVzL2RlYnVnLyBwZXIgSW5nbwo+ID4gLSBFbmFibGVkIHRoZSB0ZXN0IG9uIGFybTY0IGFu ZCB4ODYgcGxhdGZvcm1zIGZvciBub3cKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWNDogKGh0dHBzOi8v cGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTgzNDY1 KQo+ID4gCj4gPiAtIERpc2FibGUgREVCVUdfQVJDSF9QR1RBQkxFX1RFU1QgZm9yIEFSTSBhbmQg SUE2NCBwbGF0Zm9ybXMKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMzogKGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL3BhdGNod29yay9wcm9qZWN0L2xrbWwvbGlzdC8/c2VyaWVzPTQxMTIxNikKPiA+IAo+ ID4gLSBDaGFuZ2VkIHRlc3QgdHJpZ2dlciBmcm9tIG1vZHVsZSBmb3JtYXQgaW50byBsYXRlX2lu aXRjYWxsKCkKPiA+IC0gTWFya2VkIGFsbCBmdW5jdGlvbnMgd2l0aCBfX2luaXQgdG8gYmUgZnJl ZWQgYWZ0ZXIgY29tcGxldGlvbgo+ID4gLSBDaGFuZ2VkIGFsbCBfX1BHVEFCTEVfUFhYX0ZPTERF RCBjaGVja3MgYXMgbW1fcHh4X2ZvbGRlZCgpCj4gPiAtIEZvbGRlZCBpbiBQUEMzMiBmaXhlcyBm cm9tIENocmlzdG9waGUKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMjoKPiA+IAo+ID4gaHR0cHM6Ly9s b3JlLmtlcm5lbC5vcmcvbGludXgtbW0vMTU2ODI2ODE3My0zMTMwMi0xLWdpdC1zZW5kLWVtYWls LWFuc2h1bWFuLmtoYW5kdWFsQGFybS5jb20vVC8jdAo+ID4gCj4gPiAtIEZpeGVkIHNtYWxsIHR5 cG8gZXJyb3IgaW4gTU9EVUxFX0RFU0NSSVBUSU9OKCkKPiA+IC0gRml4ZWQgbTY0ayBidWlsZCBw cm9ibGVtcyBmb3IgbHZhbHVlIGNvbmNlcm5zIGluIHBtZF94eHhfdGVzdHMoKQo+ID4gLSBGaXhl ZCBkeW5hbWljIHBhZ2UgdGFibGUgbGV2ZWwgZm9sZGluZyBwcm9ibGVtcyBvbiB4ODYgYXMgcGVy IEtpcnJpbAo+ID4gLSBGaXhlZCBzZWNvbmQgcG9pbnRlcnMgZHVyaW5nIHB4eF9wb3B1bGF0ZV90 ZXN0cygpIHBlciBLaXJpbGwgYW5kIEdlcmFsZAo+ID4gLSBBbGxvY2F0ZSBhbmQgZnJlZSBwdGUg dGFibGUgd2l0aCBwdGVfYWxsb2Nfb25lL3B0ZV9mcmVlIHBlciBLaXJpbGwKPiA+IC0gTW9kaWZp ZWQgcHh4X2NsZWFyX3Rlc3RzKCkgdG8gYWNjb21tb2RhdGUgczM5MCBsb3dlciAxMiBiaXRzIHNp dHVhdGlvbgo+ID4gLSBDaGFuZ2VkIFJBTkRPTV9OWlZBTFVFIHZhbHVlIGZyb20gMHhiZSB0byAw eGZmCj4gPiAtIENoYW5nZWQgYWxsb2NhdGlvbiwgdXNhZ2UsIGZyZWUgc2VxdWVuY2UgZm9yIHNh dmVkX3B0ZXAKPiA+IC0gUmVuYW1lZCBWTUFfRkxBR1MgYXMgVk1GTEFHUwo+ID4gLSBJbXBsZW1l bnRlZCBhIG5ldyBtZXRob2QgZm9yIHJhbmRvbSB2YWRkciBnZW5lcmF0aW9uCj4gPiAtIEltcGxl bWVudGVkIHNvbWUgb3RoZXIgY2xlYW51cHMKPiA+IC0gRHJvcHBlZCBleHRlcm4gcmVmZXJlbmNl IHRvIG1tX2FsbG9jKCkKPiA+IC0gQ3JlYXRlZCBhbmQgZXhwb3J0ZWQgbmV3IGFsbG9jX2dpZ2Fu dGljX3BhZ2Vfb3JkZXIoKQo+ID4gLSBEcm9wcGVkIHRoZSBjdXN0b20gYWxsb2NhdG9yIGFuZCB1 c2VkIG5ldyBhbGxvY19naWdhbnRpY19wYWdlX29yZGVyKCkKPiA+IAo+ID4gQ2hhbmdlcyBpbiBW MToKPiA+IAo+ID4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtbW0vMTU2NzQ5NzcwNi04 NjQ5LTEtZ2l0LXNlbmQtZW1haWwtYW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbS8KPiA+IAo+ID4g LSBBZGRlZCBmYWxsYmFjayBtZWNoYW5pc20gZm9yIFBNRCBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0 aW9uIGZhaWx1cmUKPiA+IAo+ID4gQ2hhbmdlcyBpbiBSRkMgVjI6Cj4gPiAKPiA+IGh0dHBzOi8v bG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tLzE1NjUzMzU5OTgtMjI1NTMtMS1naXQtc2VuZC1lbWFp bC1hbnNodW1hbi5raGFuZHVhbEBhcm0uY29tL1QvI3UKPiA+IAo+ID4gLSBNb3ZlZCB0ZXN0IG1v ZHVsZSBhbmQgaXQncyBjb25maWcgZnJvbSBsaWIvIHRvIG1tLwo+ID4gLSBSZW5hbWVkIGNvbmZp ZyBURVNUX0FSQ0hfUEdUQUJMRSBhcyBERUJVR19BUkNIX1BHVEFCTEVfVEVTVAo+ID4gLSBSZW5h bWVkIGZpbGUgZnJvbSB0ZXN0X2FyY2hfcGd0YWJsZS5jIHRvIGFyY2hfcGd0YWJsZV90ZXN0LmMK PiA+IC0gQWRkZWQgcmVsZXZhbnQgTU9EVUxFX0RFU0NSSVBUSU9OKCkgYW5kIE1PRFVMRV9BVVRI T1IoKSBkZXRhaWxzCj4gPiAtIERyb3BwZWQgbG9hZGFibGUgbW9kdWxlIGNvbmZpZyBvcHRpb24K PiA+IC0gQmFzaWMgdGVzdHMgbm93IHVzZSBtZW1vcnkgYmxvY2tzIHdpdGggcmVxdWlyZWQgc2l6 ZSBhbmQgYWxpZ25tZW50Cj4gPiAtIFBVRCBhbGlnbmVkIG1lbW9yeSBibG9jayBnZXRzIGFsbG9j YXRlZCB3aXRoIGFsbG9jX2NvbnRpZ19yYW5nZSgpCj4gPiAtIElmIFBVRCBhbGlnbmVkIG1lbW9y eSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGl0IGZhbGxzIGJhY2sgb24gUE1EIGFsaWduZWQKPiA+ ICAgbWVtb3J5IGJsb2NrIGZyb20gcGFnZSBhbGxvY2F0b3IgYW5kIHB1ZF8qIHRlc3RzIGFyZSBz a2lwcGVkCj4gPiAtIENsZWFyIGFuZCBwb3B1bGF0ZSB0ZXN0cyBub3cgb3BlcmF0ZSBvbiByZWFs IGluIG1lbW9yeSBwYWdlIHRhYmxlIGVudHJpZXMKPiA+IC0gRHVtbXkgbW1fc3RydWN0IGdldHMg YWxsb2NhdGVkIHdpdGggbW1fYWxsb2MoKQo+ID4gLSBEdW1teSBwYWdlIHRhYmxlIGVudHJpZXMg Z2V0IGFsbG9jYXRlZCB3aXRoIFtwdWR8cG1kfHB0ZV1fYWxsb2NfW21hcF0oKQo+ID4gLSBTaW1w bGlmaWVkIFtwNGR8cGdkXV9iYXNpY190ZXN0cygpLCBub3cgaGFzIHJhbmRvbSB2YWx1ZXMgaW4g dGhlIGVudHJpZXMKPiA+IAo+ID4gT3JpZ2luYWwgUkZDIFYxOgo+ID4gCj4gPiBodHRwczovL2xv cmUua2VybmVsLm9yZy9saW51eC1tbS8xNTY0MDM3NzIzLTI2Njc2LTEtZ2l0LXNlbmQtZW1haWwt YW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbS8KPiA+IAo+ID4gCj4gPiAgLi4uL2RlYnVnL2RlYnVn LXZtLXBndGFibGUvYXJjaC1zdXBwb3J0LnR4dCAgIHwgIDM1ICsrCj4gPiAgYXJjaC9hcmMvS2Nv bmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICBhcmNoL2FybTY0 L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gIGFyY2gvcG93 ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gPiAgYXJjaC9z MzkwL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICBhcmNo L3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gIGFy Y2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaCAgICAgICAgICAgICB8ICAgNiArCj4gPiAg aW5jbHVkZS9saW51eC9tbWRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgIHwgICA1ICsKPiA+ ICBpbml0L21haW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKwo+ ID4gIGxpYi9LY29uZmlnLmRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyNiAr Kwo+ID4gIG1tL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MSArCj4gPiAgbW0vZGVidWdfdm1fcGd0YWJsZS5jICAgICAgICAgICAgICAgICAgICAgICAgIHwg Mzg5ICsrKysrKysrKysrKysrKysrKwo+ID4gIDEyIGZpbGVzIGNoYW5nZWQsIDQ2OSBpbnNlcnRp b25zKCspCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vZmVhdHVyZXMvZGVi dWcvZGVidWctdm0tcGd0YWJsZS9hcmNoLXN1cHBvcnQudHh0Cj4gPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IG1tL2RlYnVnX3ZtX3BndGFibGUuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRh dGlvbi9mZWF0dXJlcy9kZWJ1Zy9kZWJ1Zy12bS1wZ3RhYmxlL2FyY2gtc3VwcG9ydC50eHQgYi9E b2N1bWVudGF0aW9uL2ZlYXR1cmVzL2RlYnVnL2RlYnVnLXZtLXBndGFibGUvYXJjaC1zdXBwb3J0 LnR4dAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uNjRk MGY5YjE1YzQ5Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1 cmVzL2RlYnVnL2RlYnVnLXZtLXBndGFibGUvYXJjaC1zdXBwb3J0LnR4dAo+ID4gQEAgLTAsMCAr MSwzNSBAQAo+ID4gKyMKPiA+ICsjIEZlYXR1cmUgbmFtZTogICAgICAgICAgZGVidWctdm0tcGd0 YWJsZQo+ID4gKyMgICAgICAgICBLY29uZmlnOiAgICAgICBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCj4gPiArIyAgICAgICAgIGRlc2NyaXB0aW9uOiAgIGFyY2ggc3VwcG9ydHMgcGd0YWJsZSB0 ZXN0cyBmb3Igc2VtYW50aWNzIGNvbXBsaWFuY2UKPiA+ICsjCj4gPiArICAgIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCj4gPiArICAgIHwgICAgICAgICBhcmNoIHxzdGF0dXN8Cj4gPiArICAgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiArICAgIHwgICAgICAgYWxwaGE6IHwgVE9ETyB8Cj4g PiArICAgIHwgICAgICAgICBhcmM6IHwgIG9rICB8Cj4gPiArICAgIHwgICAgICAgICBhcm06IHwg VE9ETyB8Cj4gPiArICAgIHwgICAgICAgYXJtNjQ6IHwgIG9rICB8Cj4gPiArICAgIHwgICAgICAg ICBjNng6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIGNza3k6IHwgVE9ETyB8Cj4gPiArICAg IHwgICAgICAgaDgzMDA6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgIGhleGFnb246IHwgVE9ETyB8 Cj4gPiArICAgIHwgICAgICAgIGlhNjQ6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIG02OGs6 IHwgVE9ETyB8Cj4gPiArICAgIHwgIG1pY3JvYmxhemU6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAg ICAgIG1pcHM6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgbmRzMzI6IHwgVE9ETyB8Cj4gPiAr ICAgIHwgICAgICAgbmlvczI6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgb3BlbnJpc2M6IHwgVE9E TyB8Cj4gPiArICAgIHwgICAgICBwYXJpc2M6IHwgVE9ETyB8Cj4gPiArICAgIHwgIHBvd2VycGMv MzI6IHwgIG9rICB8Cj4gPiArICAgIHwgIHBvd2VycGMvNjQ6IHwgVE9ETyB8Cj4gPiArICAgIHwg ICAgICAgcmlzY3Y6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIHMzOTA6IHwgIG9rICB8Cj4g PiArICAgIHwgICAgICAgICAgc2g6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgc3BhcmM6IHwg VE9ETyB8Cj4gPiArICAgIHwgICAgICAgICAgdW06IHwgVE9ETyB8Cj4gPiArICAgIHwgICB1bmlj b3JlMzI6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgICB4ODY6IHwgIG9rICB8Cj4gPiArICAg IHwgICAgICB4dGVuc2E6IHwgVE9ETyB8Cj4gPiArICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvS2NvbmZpZyBiL2FyY2gvYXJjL0tjb25maWcKPiA+ IGluZGV4IGZmMmEzOTNiNjM1Yy4uM2U3MmU2Y2YwZTQyIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9h cmMvS2NvbmZpZwo+ID4gKysrIGIvYXJjaC9hcmMvS2NvbmZpZwo+ID4gQEAgLTYsNiArNiw3IEBA Cj4gPiAgY29uZmlnIEFSQwo+ID4gIAlkZWZfYm9vbCB5Cj4gPiAgCXNlbGVjdCBBUkNfVElNRVJT Cj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RBQkxFCj4gPiAgCXNlbGVjdCBBUkNI X0hBU19ETUFfUFJFUF9DT0hFUkVOVAo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfUFRFX1NQRUNJQUwK PiA+ICAJc2VsZWN0IEFSQ0hfSEFTX1NFVFVQX0RNQV9PUFMKPiA+IGRpZmYgLS1naXQgYS9hcmNo L2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKPiA+IGluZGV4IDBiMzBlODg0ZTA4 OC4uYWFmOGJhNDE1MTQ1IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCj4gPiAr KysgYi9hcmNoL2FybTY0L0tjb25maWcKPiA+IEBAIC0xMSw2ICsxMSw3IEBAIGNvbmZpZyBBUk02 NAo+ID4gIAlzZWxlY3QgQUNQSV9QUFRUIGlmIEFDUEkKPiA+ICAJc2VsZWN0IEFSQ0hfQ0xPQ0tT T1VSQ0VfREFUQQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVCVUdfVklSVFVBTAo+ID4gKwlzZWxl Y3QgQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVN X0lTX0FMTE9XRUQKPiA+ICAJc2VsZWN0IEFSQ0hfSEFTX0RNQV9QUkVQX0NPSEVSRU5UCj4gPiAg CXNlbGVjdCBBUkNIX0hBU19BQ1BJX1RBQkxFX1VQR1JBREUgaWYgQUNQSQo+ID4gZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKPiA+IGluZGV4 IDQ5N2I3ZDBiMmQ3ZS4uOGQ1YWUxNGM1ZDRjIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9wb3dlcnBj L0tjb25maWcKPiA+ICsrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCj4gPiBAQCAtMTE2LDYgKzEx Niw3IEBAIGNvbmZpZyBQUEMKPiA+ICAJIwo+ID4gIAlzZWxlY3QgQVJDSF8zMkJJVF9PRkZfVCBp ZiBQUEMzMgo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVCVUdfVklSVFVBTAo+ID4gKwlzZWxlY3Qg QVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRSBpZiBQUEMzMgo+ID4gIAlzZWxlY3QgQVJDSF9IQVNf REVWTUVNX0lTX0FMTE9XRUQKPiA+ICAJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKPiA+ ICAJc2VsZWN0IEFSQ0hfSEFTX0ZPUlRJRllfU09VUkNFCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9z MzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwo+ID4gaW5kZXggOGFiZTc3NTM2ZDlkLi5h ZjI4NGRiYjA3ZTcgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3MzOTAvS2NvbmZpZwo+ID4gKysrIGIv YXJjaC9zMzkwL0tjb25maWcKPiA+IEBAIC01OSw2ICs1OSw3IEBAIGNvbmZpZyBLQVNBTl9TSEFE T1dfT0ZGU0VUCj4gPiAgY29uZmlnIFMzOTAKPiA+ICAJZGVmX2Jvb2wgeQo+ID4gIAlzZWxlY3Qg QVJDSF9CSU5GTVRfRUxGX1NUQVRFCj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCj4gPiAgCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAo+ID4gIAlzZWxlY3Qg QVJDSF9IQVNfRUxGX1JBTkRPTUlaRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfRk9SVElGWV9TT1VS Q0UKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwo+ ID4gaW5kZXggYmVlYTc3MDQ2ZjliLi5kZjhhMTllNTJlODIgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNo L3g4Ni9LY29uZmlnCj4gPiArKysgYi9hcmNoL3g4Ni9LY29uZmlnCj4gPiBAQCAtNjEsNiArNjEs NyBAQCBjb25maWcgWDg2Cj4gPiAgCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0lOSVQKPiA+ICAJ c2VsZWN0IEFSQ0hfSEFTX0FDUElfVEFCTEVfVVBHUkFERQlpZiBBQ1BJCj4gPiAgCXNlbGVjdCBB UkNIX0hBU19ERUJVR19WSVJUVUFMCj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCWlmICFYODZfUEFFCj4gPiAgCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAo+ ID4gIAlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNf RkFTVF9NVUxUSVBMSUVSCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0 YWJsZV82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCj4gPiBpbmRleCAw YjZjNDA0Mjk0MmEuLmZiMGU3NmQyNTRiMyAxMDA2NDQKPiA+IC0tLSBhL2FyY2gveDg2L2luY2x1 ZGUvYXNtL3BndGFibGVfNjQuaAo+ID4gKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJs ZV82NC5oCj4gPiBAQCAtNTMsNiArNTMsMTIgQEAgc3RhdGljIGlubGluZSB2b2lkIHN5bmNfaW5p dGlhbF9wYWdlX3RhYmxlKHZvaWQpIHsgfQo+ID4gIAo+ID4gIHN0cnVjdCBtbV9zdHJ1Y3Q7Cj4g PiAgCj4gPiArI2RlZmluZSBtbV9wNGRfZm9sZGVkIG1tX3A0ZF9mb2xkZWQKPiA+ICtzdGF0aWMg aW5saW5lIGJvb2wgbW1fcDRkX2ZvbGRlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKPiA+ICt7Cj4g PiArCXJldHVybiAhcGd0YWJsZV9sNV9lbmFibGVkKCk7Cj4gPiArfQo+ID4gKwo+ID4gIHZvaWQg c2V0X3B0ZV92YWRkcl9wNGQocDRkX3QgKnA0ZF9wYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyLCBw dGVfdCBuZXdfcHRlKTsKPiA+ICB2b2lkIHNldF9wdGVfdmFkZHJfcHVkKHB1ZF90ICpwdWRfcGFn ZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgcHRlX3QgbmV3X3B0ZSk7Cj4gPiAgCj4gPiBkaWZmIC0t Z2l0IGEvaW5jbHVkZS9saW51eC9tbWRlYnVnLmggYi9pbmNsdWRlL2xpbnV4L21tZGVidWcuaAo+ ID4gaW5kZXggMmFkNzJkMmM4Y2M1Li41MzM5YWExNGI3NDkgMTAwNjQ0Cj4gPiAtLS0gYS9pbmNs dWRlL2xpbnV4L21tZGVidWcuaAo+ID4gKysrIGIvaW5jbHVkZS9saW51eC9tbWRlYnVnLmgKPiA+ IEBAIC02NCw0ICs2NCw5IEBAIHZvaWQgZHVtcF9tbShjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICpt bSk7Cj4gPiAgI2RlZmluZSBWTV9CVUdfT05fUEdGTEFHUyhjb25kLCBwYWdlKSBCVUlMRF9CVUdf T05fSU5WQUxJRChjb25kKQo+ID4gICNlbmRpZgo+ID4gIAo+ID4gKyNpZmRlZiBDT05GSUdfREVC VUdfVk1fUEdUQUJMRQo+ID4gK3ZvaWQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKTsKPiA+ICsjZWxz ZQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQpIHsgfQo+ID4g KyNlbmRpZgo+ID4gICNlbmRpZgo+ID4gZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9t YWluLmMKPiA+IGluZGV4IGNjMGVlNDg3MzQxOS4uYWRmMzdlOGIxZDY5IDEwMDY0NAo+ID4gLS0t IGEvaW5pdC9tYWluLmMKPiA+ICsrKyBiL2luaXQvbWFpbi5jCj4gPiBAQCAtOTQsNiArOTQsNyBA QAo+ID4gICNpbmNsdWRlIDxsaW51eC9yb2RhdGFfdGVzdC5oPgo+ID4gICNpbmNsdWRlIDxsaW51 eC9qdW1wX2xhYmVsLmg+Cj4gPiAgI2luY2x1ZGUgPGxpbnV4L21lbV9lbmNyeXB0Lmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L21tZGVidWcuaD4KPiA+ICAKPiA+ICAjaW5jbHVkZSA8YXNtL2lvLmg+ Cj4gPiAgI2luY2x1ZGUgPGFzbS9idWdzLmg+Cj4gPiBAQCAtMTMyMyw2ICsxMzI0LDcgQEAgc3Rh dGljIGludCBfX3JlZiBrZXJuZWxfaW5pdCh2b2lkICp1bnVzZWQpCj4gPiAgCWtlcm5lbF9pbml0 X2ZyZWVhYmxlKCk7Cj4gPiAgCS8qIG5lZWQgdG8gZmluaXNoIGFsbCBhc3luYyBfX2luaXQgY29k ZSBiZWZvcmUgZnJlZWluZyB0aGUgbWVtb3J5ICovCj4gPiAgCWFzeW5jX3N5bmNocm9uaXplX2Z1 bGwoKTsKPiA+ICsJZGVidWdfdm1fcGd0YWJsZSgpOwo+ID4gIAlmdHJhY2VfZnJlZV9pbml0X21l bSgpOwo+ID4gIAlmcmVlX2luaXRtZW0oKTsKPiA+ICAJbWFya19yZWFkb25seSgpOwo+ID4gZGlm ZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKPiA+IGluZGV4 IDY5ZGVmNGE5ZGYwMC4uMWI1YmQ5ZjdjOTY3IDEwMDY0NAo+ID4gLS0tIGEvbGliL0tjb25maWcu ZGVidWcKPiA+ICsrKyBiL2xpYi9LY29uZmlnLmRlYnVnCj4gPiBAQCAtNjUzLDYgKzY1MywxMiBA QCBjb25maWcgU0NIRURfU1RBQ0tfRU5EX0NIRUNLCj4gPiAgCSAgZGF0YSBjb3JydXB0aW9uIG9y IGEgc3BvcmFkaWMgY3Jhc2ggYXQgYSBsYXRlciBzdGFnZSBvbmNlIHRoZSByZWdpb24KPiA+ICAJ ICBpcyBleGFtaW5lZC4gVGhlIHJ1bnRpbWUgb3ZlcmhlYWQgaW50cm9kdWNlZCBpcyBtaW5pbWFs Lgo+ID4gIAo+ID4gK2NvbmZpZyBBUkNIX0hBU19ERUJVR19WTV9QR1RBQkxFCj4gPiArCWJvb2wK PiA+ICsJaGVscAo+ID4gKwkgIEFuIGFyY2hpdGVjdHVyZSBzaG91bGQgc2VsZWN0IHRoaXMgd2hl biBpdCBjYW4gc3VjY2Vzc2Z1bGx5Cj4gPiArCSAgYnVpbGQgYW5kIHJ1biBERUJVR19WTV9QR1RB QkxFLgo+ID4gKwo+ID4gIGNvbmZpZyBERUJVR19WTQo+ID4gIAlib29sICJEZWJ1ZyBWTSIKPiA+ ICAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKPiA+IEBAIC02ODgsNiArNjk0LDI2IEBAIGNvbmZp ZyBERUJVR19WTV9QR0ZMQUdTCj4gPiAgCj4gPiAgCSAgSWYgdW5zdXJlLCBzYXkgTi4KPiA+ICAK PiA+ICtjb25maWcgREVCVUdfVk1fUEdUQUJMRQo+ID4gKwlib29sICJEZWJ1ZyBhcmNoIHBhZ2Ug dGFibGUgZm9yIHNlbWFudGljcyBjb21wbGlhbmNlIgo+ID4gKwlkZXBlbmRzIG9uIE1NVQo+ID4g KwlkZXBlbmRzIG9uICFJQTY0ICYmICFBUk0KPiA+ICsJZGVwZW5kcyBvbiBBUkNIX0hBU19ERUJV R19WTV9QR1RBQkxFIHx8IEVYUEVSVAo+ID4gKwlkZWZhdWx0IG4gaWYgIUFSQ0hfSEFTX0RFQlVH X1ZNX1BHVEFCTEUKPiA+ICsJZGVmYXVsdCB5IGlmIERFQlVHX1ZNCj4gPiArCWhlbHAKPiA+ICsJ ICBUaGlzIG9wdGlvbiBwcm92aWRlcyBhIGRlYnVnIG1ldGhvZCB3aGljaCBjYW4gYmUgdXNlZCB0 byB0ZXN0Cj4gPiArCSAgYXJjaGl0ZWN0dXJlIHBhZ2UgdGFibGUgaGVscGVyIGZ1bmN0aW9ucyBv biB2YXJpb3VzIHBsYXRmb3JtcyBpbgo+ID4gKwkgIHZlcmlmeWluZyBpZiB0aGV5IGNvbXBseSB3 aXRoIGV4cGVjdGVkIGdlbmVyaWMgTU0gc2VtYW50aWNzLiBUaGlzCj4gPiArCSAgd2lsbCBoZWxw IGFyY2hpdGVjdHVyZSBjb2RlIGluIG1ha2luZyBzdXJlIHRoYXQgYW55IGNoYW5nZXMgb3IKPiA+ ICsJICBuZXcgYWRkaXRpb25zIG9mIHRoZXNlIGhlbHBlcnMgc3RpbGwgY29uZm9ybSB0byBleHBl Y3RlZAo+ID4gKwkgIHNlbWFudGljcyBvZiB0aGUgZ2VuZXJpYyBNTS4gUGxhdGZvcm1zIHdpbGwg aGF2ZSB0byBvcHQgaW4gZm9yCj4gPiArCSAgdGhpcyB0aHJvdWdoIEFSQ0hfSEFTX0RFQlVHX1ZN X1BHVEFCTEUuIEFsdGhvdWdoIGl0IGNhbiBhbHNvIGJlCj4gPiArCSAgZW5hYmxlZCB0aHJvdWdo IEVYUEVSVCB3aXRob3V0IHJlcXVpcmluZyBjb2RlIGNoYW5nZS4gVGhpcyB0ZXN0Cj4gPiArCSAg aXMgZGlzYWJsZWQgb24gSUE2NCBhbmQgQVJNIHBsYXRmb3JtcyB3aGVyZSBpdCBmYWlscyB0byBi dWlsZC4KPiA+ICsKPiA+ICsJICBJZiB1bnN1cmUsIHNheSBOLgo+ID4gKwo+ID4gIGNvbmZpZyBB UkNIX0hBU19ERUJVR19WSVJUVUFMCj4gPiAgCWJvb2wKPiA+ICAKPiA+IGRpZmYgLS1naXQgYS9t bS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCj4gPiBpbmRleCAyNzJlNjYwMzllNzAuLmIwNjkyZTZh NGI1OCAxMDA2NDQKPiA+IC0tLSBhL21tL01ha2VmaWxlCj4gPiArKysgYi9tbS9NYWtlZmlsZQo+ ID4gQEAgLTg3LDYgKzg3LDcgQEAgb2JqLSQoQ09ORklHX0hXUE9JU09OX0lOSkVDVCkgKz0gaHdw b2lzb24taW5qZWN0Lm8KPiA+ICBvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUspICs9IGttZW1s ZWFrLm8KPiA+ICBvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUtfVEVTVCkgKz0ga21lbWxlYWst dGVzdC5vCj4gPiAgb2JqLSQoQ09ORklHX0RFQlVHX1JPREFUQV9URVNUKSArPSByb2RhdGFfdGVz dC5vCj4gPiArb2JqLSQoQ09ORklHX0RFQlVHX1ZNX1BHVEFCTEUpICs9IGRlYnVnX3ZtX3BndGFi bGUubwo+ID4gIG9iai0kKENPTkZJR19QQUdFX09XTkVSKSArPSBwYWdlX293bmVyLm8KPiA+ICBv YmotJChDT05GSUdfQ0xFQU5DQUNIRSkgKz0gY2xlYW5jYWNoZS5vCj4gPiAgb2JqLSQoQ09ORklH X01FTU9SWV9JU09MQVRJT04pICs9IHBhZ2VfaXNvbGF0aW9uLm8KPiA+IGRpZmYgLS1naXQgYS9t bS9kZWJ1Z192bV9wZ3RhYmxlLmMgYi9tbS9kZWJ1Z192bV9wZ3RhYmxlLmMKPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjcwYmY4ZWQ4ZmQ1MQo+ID4gLS0t IC9kZXYvbnVsbAo+ID4gKysrIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gPiBAQCAtMCwwICsx LDM4OSBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiA+ ICsvKgo+ID4gKyAqIFRoaXMga2VybmVsIHRlc3QgdmFsaWRhdGVzIGFyY2hpdGVjdHVyZSBwYWdl IHRhYmxlIGhlbHBlcnMgYW5kCj4gPiArICogYWNjZXNzb3JzIGFuZCBoZWxwcyBpbiB2ZXJpZnlp bmcgdGhlaXIgY29udGludWVkIGNvbXBsaWFuY2Ugd2l0aAo+ID4gKyAqIGV4cGVjdGVkIGdlbmVy aWMgTU0gc2VtYW50aWNzLgo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChDKSAyMDE5IEFSTSBM dGQuCj4gPiArICoKPiA+ICsgKiBBdXRob3I6IEFuc2h1bWFuIEtoYW5kdWFsIDxhbnNodW1hbi5r aGFuZHVhbEBhcm0uY29tPgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgcHJfZm10KGZtdCkgImRlYnVn X3ZtX3BndGFibGU6ICVzOiAiIGZtdCwgX19mdW5jX18KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGlu dXgvZ2ZwLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvaHVnZXRsYi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiA+ICsjaW5j bHVkZSA8bGludXgva2NvbmZpZy5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tbS5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9tbWFuLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wZm5fdC5o Pgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcmFu ZG9tLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Cj4gPiArI2luY2x1ZGUgPGxp bnV4L3N3YXAuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgo+ID4gKyNpbmNsdWRl IDxsaW51eC9zdGFydF9rZXJuZWwuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc2NoZWQvbW0uaD4K PiA+ICsjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3BndGFibGUu aD4KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIEJhc2ljIG9wZXJhdGlvbnMKPiA+ICsgKgo+ID4gKyAq IG1rb2xkKGVudHJ5KQkJCT0gQW4gb2xkIGFuZCBub3QgYSB5b3VuZyBlbnRyeQo+ID4gKyAqIG1r eW91bmcoZW50cnkpCQk9IEEgeW91bmcgYW5kIG5vdCBhbiBvbGQgZW50cnkKPiA+ICsgKiBta2Rp cnR5KGVudHJ5KQkJPSBBIGRpcnR5IGFuZCBub3QgYSBjbGVhbiBlbnRyeQo+ID4gKyAqIG1rY2xl YW4oZW50cnkpCQk9IEEgY2xlYW4gYW5kIG5vdCBhIGRpcnR5IGVudHJ5Cj4gPiArICogbWt3cml0 ZShlbnRyeSkJCT0gQSB3cml0ZSBhbmQgbm90IGEgd3JpdGUgcHJvdGVjdGVkIGVudHJ5Cj4gPiAr ICogd3Jwcm90ZWN0KGVudHJ5KQkJPSBBIHdyaXRlIHByb3RlY3RlZCBhbmQgbm90IGEgd3JpdGUg ZW50cnkKPiA+ICsgKiBweHhfYmFkKGVudHJ5KQkJPSBBIG1hcHBlZCBhbmQgbm9uLXRhYmxlIGVu dHJ5Cj4gPiArICogcHh4X3NhbWUoZW50cnkxLCBlbnRyeTIpCT0gQm90aCBlbnRyaWVzIGhvbGQg dGhlIGV4YWN0IHNhbWUgdmFsdWUKPiA+ICsgKi8KPiA+ICsjZGVmaW5lIFZNRkxBR1MJKFZNX1JF QUR8Vk1fV1JJVEV8Vk1fRVhFQykKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIE9uIHMzOTAgcGxhdGZv cm0sIHRoZSBsb3dlciA0IGJpdHMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgZ2l2ZW4gcGFnZSB0YWJs ZQo+ID4gKyAqIGVudHJ5IHR5cGUuIEJ1dCB0aGVzZSBiaXRzIG1pZ2h0IGFmZmVjdCB0aGUgYWJp bGl0eSB0byBjbGVhciBlbnRyaWVzIHdpdGgKPiA+ICsgKiBweHhfY2xlYXIoKSBiZWNhdXNlIG9m IGhvdyBkeW5hbWljIHBhZ2UgdGFibGUgZm9sZGluZyB3b3JrcyBvbiBzMzkwLiBTbwo+ID4gKyAq IHdoaWxlIGxvYWRpbmcgdXAgdGhlIGVudHJpZXMgZG8gbm90IGNoYW5nZSB0aGUgbG93ZXIgNCBi aXRzLiBJdCBkb2VzIG5vdAo+ID4gKyAqIGhhdmUgYWZmZWN0IGFueSBvdGhlciBwbGF0Zm9ybS4K PiA+ICsgKi8KPiA+ICsjZGVmaW5lIFMzOTBfTUFTS19CSVRTCTQKPiA+ICsjZGVmaW5lIFJBTkRP TV9PUlZBTFVFCUdFTk1BU0soQklUU19QRVJfTE9ORyAtIDEsIFMzOTBfTUFTS19CSVRTKQo+ID4g KyNkZWZpbmUgUkFORE9NX05aVkFMVUUJR0VOTUFTSyg3LCAwKQo+ID4gKwo+ID4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwdGVfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCj4gPiArewo+ID4gKwlwdGVfdCBwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gPiArCj4g PiArCVdBUk5fT04oIXB0ZV9zYW1lKHB0ZSwgcHRlKSk7Cj4gPiArCVdBUk5fT04oIXB0ZV95b3Vu ZyhwdGVfbWt5b3VuZyhwdGVfbWtvbGQocHRlKSkpKTsKPiA+ICsJV0FSTl9PTighcHRlX2RpcnR5 KHB0ZV9ta2RpcnR5KHB0ZV9ta2NsZWFuKHB0ZSkpKSk7Cj4gPiArCVdBUk5fT04oIXB0ZV93cml0 ZShwdGVfbWt3cml0ZShwdGVfd3Jwcm90ZWN0KHB0ZSkpKSk7Cj4gPiArCVdBUk5fT04ocHRlX3lv dW5nKHB0ZV9ta29sZChwdGVfbWt5b3VuZyhwdGUpKSkpOwo+ID4gKwlXQVJOX09OKHB0ZV9kaXJ0 eShwdGVfbWtjbGVhbihwdGVfbWtkaXJ0eShwdGUpKSkpOwo+ID4gKwlXQVJOX09OKHB0ZV93cml0 ZShwdGVfd3Jwcm90ZWN0KHB0ZV9ta3dyaXRlKHB0ZSkpKSk7Cj4gPiArfQo+ID4gKwo+ID4gKyNp ZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ID4gK3sK PiA+ICsJcG1kX3QgcG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ID4gKwo+ID4gKwlXQVJOX09O KCFwbWRfc2FtZShwbWQsIHBtZCkpOwo+ID4gKwlXQVJOX09OKCFwbWRfeW91bmcocG1kX21reW91 bmcocG1kX21rb2xkKHBtZCkpKSk7Cj4gPiArCVdBUk5fT04oIXBtZF9kaXJ0eShwbWRfbWtkaXJ0 eShwbWRfbWtjbGVhbihwbWQpKSkpOwo+ID4gKwlXQVJOX09OKCFwbWRfd3JpdGUocG1kX21rd3Jp dGUocG1kX3dycHJvdGVjdChwbWQpKSkpOwo+ID4gKwlXQVJOX09OKHBtZF95b3VuZyhwbWRfbWtv bGQocG1kX21reW91bmcocG1kKSkpKTsKPiA+ICsJV0FSTl9PTihwbWRfZGlydHkocG1kX21rY2xl YW4ocG1kX21rZGlydHkocG1kKSkpKTsKPiA+ICsJV0FSTl9PTihwbWRfd3JpdGUocG1kX3dycHJv dGVjdChwbWRfbWt3cml0ZShwbWQpKSkpOwo+ID4gKwkvKgo+ID4gKwkgKiBBIGh1Z2UgcGFnZSBk b2VzIG5vdCBwb2ludCB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUKPiA+ICsJICogZW50cnkuIEhl bmNlIHRoaXMgbXVzdCBxdWFsaWZ5IGFzIHBtZF9iYWQoKS4KPiA+ICsJICovCj4gPiArCVdBUk5f T04oIXBtZF9iYWQocG1kX21raHVnZShwbWQpKSk7Cj4gPiArfQo+ID4gKwo+ID4gKyNpZmRlZiBD T05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRAo+ID4gK3N0YXRpYyB2b2lk IF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3Qp Cj4gPiArewo+ID4gKwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gPiArCj4gPiAr CVdBUk5fT04oIXB1ZF9zYW1lKHB1ZCwgcHVkKSk7Cj4gPiArCVdBUk5fT04oIXB1ZF95b3VuZyhw dWRfbWt5b3VuZyhwdWRfbWtvbGQocHVkKSkpKTsKPiA+ICsJV0FSTl9PTighcHVkX3dyaXRlKHB1 ZF9ta3dyaXRlKHB1ZF93cnByb3RlY3QocHVkKSkpKTsKPiA+ICsJV0FSTl9PTihwdWRfd3JpdGUo cHVkX3dycHJvdGVjdChwdWRfbWt3cml0ZShwdWQpKSkpOwo+ID4gKwlXQVJOX09OKHB1ZF95b3Vu ZyhwdWRfbWtvbGQocHVkX21reW91bmcocHVkKSkpKTsKPiA+ICsKPiA+ICsJaWYgKG1tX3BtZF9m b2xkZWQobW0pKQo+ID4gKwkJcmV0dXJuOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBBIGh1Z2Ug cGFnZSBkb2VzIG5vdCBwb2ludCB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUKPiA+ICsJICogZW50 cnkuIEhlbmNlIHRoaXMgbXVzdCBxdWFsaWZ5IGFzIHB1ZF9iYWQoKS4KPiA+ICsJICovCj4gPiAr CVdBUk5fT04oIXB1ZF9iYWQocHVkX21raHVnZShwdWQpKSk7Cj4gPiArfQo+ID4gKyNlbHNlCj4g PiArc3RhdGljIHZvaWQgX19pbml0IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwg cGdwcm90X3QgcHJvdCkgeyB9Cj4gPiArI2VuZGlmCj4gPiArI2Vsc2UKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90 KSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxv bmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBfX2luaXQgcDRkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KQo+ID4gK3sKPiA+ICsJcDRkX3QgcDRkOwo+ID4gKwo+ID4gKwltZW1zZXQoJnA0ZCwgUkFO RE9NX05aVkFMVUUsIHNpemVvZihwNGRfdCkpOwo+ID4gKwlXQVJOX09OKCFwNGRfc2FtZShwNGQs IHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcGdkX2Jhc2ljX3Rl c3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ID4gK3sKPiA+ICsJcGdkX3Qg cGdkOwo+ID4gKwo+ID4gKwltZW1zZXQoJnBnZCwgUkFORE9NX05aVkFMVUUsIHNpemVvZihwZ2Rf dCkpOwo+ID4gKwlXQVJOX09OKCFwZ2Rfc2FtZShwZ2QsIHBnZCkpOwo+ID4gK30KPiA+ICsKPiA+ ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BVRF9GT0xERUQKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cHVkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkcCkKPiA+ICt7 Cj4gPiArCXB1ZF90IHB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gPiArCj4gPiArCWlmIChtbV9w bWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcHVkID0gX19wdWQocHVk X3ZhbChwdWQpIHwgUkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpwdWRwLCBwdWQp Owo+ID4gKwlwdWRfY2xlYXIocHVkcCk7Cj4gPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4g PiArCVdBUk5fT04oIXB1ZF9ub25lKHB1ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcHVkX3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAq cHVkcCwKPiA+ICsJCQkJICAgICAgcG1kX3QgKnBtZHApCj4gPiArewo+ID4gKwlwdWRfdCBwdWQ7 Cj4gPiArCj4gPiArCWlmIChtbV9wbWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsJ LyoKPiA+ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZlbCBwYWdlIHRhYmxlIHBh Z2UuCj4gPiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBhcyBwdWRfYmFkKCkuCj4g PiArCSAqLwo+ID4gKwlwbWRfY2xlYXIocG1kcCk7Cj4gPiArCXB1ZF9jbGVhcihwdWRwKTsKPiA+ ICsJcHVkX3BvcHVsYXRlKG1tLCBwdWRwLCBwbWRwKTsKPiA+ICsJcHVkID0gUkVBRF9PTkNFKCpw dWRwKTsKPiA+ICsJV0FSTl9PTihwdWRfYmFkKHB1ZCkpOwo+ID4gK30KPiA+ICsjZWxzZQo+ID4g K3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfY2xlYXJfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0s IHB1ZF90ICpwdWRwKSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX3BvcHVsYXRlX3Rl c3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkcCwKPiA+ICsJCQkJICAgICAgcG1k X3QgKnBtZHApCj4gPiArewo+ID4gK30KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICsjaWZuZGVmIF9f UEFHRVRBQkxFX1A0RF9GT0xERUQKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcDRkX2NsZWFyX3Rl c3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwNGRfdCAqcDRkcCkKPiA+ICt7Cj4gPiArCXA0ZF90 IHA0ZCA9IFJFQURfT05DRSgqcDRkcCk7Cj4gPiArCj4gPiArCWlmIChtbV9wdWRfZm9sZGVkKG1t KSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcDRkID0gX19wNGQocDRkX3ZhbChwNGQpIHwg UkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpwNGRwLCBwNGQpOwo+ID4gKwlwNGRf Y2xlYXIocDRkcCk7Cj4gPiArCXA0ZCA9IFJFQURfT05DRSgqcDRkcCk7Cj4gPiArCVdBUk5fT04o IXA0ZF9ub25lKHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcDRk X3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwNGRfdCAqcDRkcCwKPiA+ICsJ CQkJICAgICAgcHVkX3QgKnB1ZHApCj4gPiArewo+ID4gKwlwNGRfdCBwNGQ7Cj4gPiArCj4gPiAr CWlmIChtbV9wdWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJLyoKPiA+ ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZlbCBwYWdlIHRhYmxlIHBhZ2UuCj4g PiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBhcyBwNGRfYmFkKCkuCj4gPiArCSAq Lwo+ID4gKwlwdWRfY2xlYXIocHVkcCk7Cj4gPiArCXA0ZF9jbGVhcihwNGRwKTsKPiA+ICsJcDRk X3BvcHVsYXRlKG1tLCBwNGRwLCBwdWRwKTsKPiA+ICsJcDRkID0gUkVBRF9PTkNFKCpwNGRwKTsK PiA+ICsJV0FSTl9PTihwNGRfYmFkKHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcGdkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdk cCkKPiA+ICt7Cj4gPiArCXBnZF90IHBnZCA9IFJFQURfT05DRSgqcGdkcCk7Cj4gPiArCj4gPiAr CWlmIChtbV9wNGRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcGdkID0g X19wZ2QocGdkX3ZhbChwZ2QpIHwgUkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpw Z2RwLCBwZ2QpOwo+ID4gKwlwZ2RfY2xlYXIocGdkcCk7Cj4gPiArCXBnZCA9IFJFQURfT05DRSgq cGdkcCk7Cj4gPiArCVdBUk5fT04oIXBnZF9ub25lKHBnZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBfX2luaXQgcGdkX3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t LCBwZ2RfdCAqcGdkcCwKPiA+ICsJCQkJICAgICAgcDRkX3QgKnA0ZHApCj4gPiArewo+ID4gKwlw Z2RfdCBwZ2Q7Cj4gPiArCj4gPiArCWlmIChtbV9wNGRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVy bjsKPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZl bCBwYWdlIHRhYmxlIHBhZ2UuCj4gPiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBh cyBwZ2RfYmFkKCkuCj4gPiArCSAqLwo+ID4gKwlwNGRfY2xlYXIocDRkcCk7Cj4gPiArCXBnZF9j bGVhcihwZ2RwKTsKPiA+ICsJcGdkX3BvcHVsYXRlKG1tLCBwZ2RwLCBwNGRwKTsKPiA+ICsJcGdk ID0gUkVBRF9PTkNFKCpwZ2RwKTsKPiA+ICsJV0FSTl9PTihwZ2RfYmFkKHBnZCkpOwo+ID4gK30K PiA+ICsjZWxzZQo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBwNGRfY2xlYXJfdGVzdHMoc3RydWN0 IG1tX3N0cnVjdCAqbW0sIHA0ZF90ICpwNGRwKSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cGdkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkcCkgeyB9Cj4g PiArc3RhdGljIHZvaWQgX19pbml0IHA0ZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwgcDRkX3QgKnA0ZHAsCj4gPiArCQkJCSAgICAgIHB1ZF90ICpwdWRwKQo+ID4gK3sKPiA+ ICt9Cj4gPiArc3RhdGljIHZvaWQgX19pbml0IHBnZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1Y3QgbW1f c3RydWN0ICptbSwgcGdkX3QgKnBnZHAsCj4gPiArCQkJCSAgICAgIHA0ZF90ICpwNGRwKQo+ID4g K3sKPiA+ICt9Cj4gPiArI2VuZGlmCj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19pbml0IHB0ZV9j bGVhcl90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZXApCj4gPiArewo+ID4g KwlwdGVfdCBwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwo+ID4gKwo+ID4gKwlwdGUgPSBfX3B0ZShw dGVfdmFsKHB0ZSkgfCBSQU5ET01fT1JWQUxVRSk7Cj4gPiArCVdSSVRFX09OQ0UoKnB0ZXAsIHB0 ZSk7Cj4gPiArCXB0ZV9jbGVhcihtbSwgMCwgcHRlcCk7Cj4gPiArCXB0ZSA9IFJFQURfT05DRSgq cHRlcCk7Cj4gPiArCVdBUk5fT04oIXB0ZV9ub25lKHB0ZSkpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBfX2luaXQgcG1kX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBw bWRfdCAqcG1kcCkKPiA+ICt7Cj4gPiArCXBtZF90IHBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4g PiArCj4gPiArCXBtZCA9IF9fcG1kKHBtZF92YWwocG1kKSB8IFJBTkRPTV9PUlZBTFVFKTsKPiA+ ICsJV1JJVEVfT05DRSgqcG1kcCwgcG1kKTsKPiA+ICsJcG1kX2NsZWFyKHBtZHApOwo+ID4gKwlw bWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ID4gKwlXQVJOX09OKCFwbWRfbm9uZShwbWQpKTsKPiA+ ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsCj4gPiArCQkJCSAgICAgIHBndGFibGVfdCBw Z3RhYmxlKQo+ID4gK3sKPiA+ICsJcG1kX3QgcG1kOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBU aGlzIGVudHJ5IHBvaW50cyB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUgcGFnZS4KPiA+ICsJICog SGVuY2UgdGhpcyBtdXN0IG5vdCBxdWFsaWZ5IGFzIHBtZF9iYWQoKS4KPiA+ICsJICovCj4gPiAr CXBtZF9jbGVhcihwbWRwKTsKPiA+ICsJcG1kX3BvcHVsYXRlKG1tLCBwbWRwLCBwZ3RhYmxlKTsK PiA+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiA+ICsJV0FSTl9PTihwbWRfYmFkKHBtZCkp Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZ2V0X3JhbmRv bV92YWRkcih2b2lkKQo+ID4gK3sKPiA+ICsJdW5zaWduZWQgbG9uZyByYW5kb21fdmFkZHIsIHJh bmRvbV9wYWdlcywgdG90YWxfdXNlcl9wYWdlczsKPiA+ICsKPiA+ICsJdG90YWxfdXNlcl9wYWdl cyA9IChUQVNLX1NJWkUgLSBGSVJTVF9VU0VSX0FERFJFU1MpIC8gUEFHRV9TSVpFOwo+ID4gKwo+ ID4gKwlyYW5kb21fcGFnZXMgPSBnZXRfcmFuZG9tX2xvbmcoKSAlIHRvdGFsX3VzZXJfcGFnZXM7 Cj4gPiArCXJhbmRvbV92YWRkciA9IEZJUlNUX1VTRVJfQUREUkVTUyArIHJhbmRvbV9wYWdlcyAq IFBBR0VfU0laRTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJhbmRvbV92YWRkcjsKPiA+ICt9Cj4gPiAr Cj4gPiArdm9pZCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ID4gK3sKPiA+ICsJc3Ry dWN0IG1tX3N0cnVjdCAqbW07Cj4gPiArCXBnZF90ICpwZ2RwOwo+ID4gKwlwNGRfdCAqcDRkcCwg KnNhdmVkX3A0ZHA7Cj4gPiArCXB1ZF90ICpwdWRwLCAqc2F2ZWRfcHVkcDsKPiA+ICsJcG1kX3Qg KnBtZHAsICpzYXZlZF9wbWRwLCBwbWQ7Cj4gPiArCXB0ZV90ICpwdGVwOwo+ID4gKwlwZ3RhYmxl X3Qgc2F2ZWRfcHRlcDsKPiA+ICsJcGdwcm90X3QgcHJvdDsKPiA+ICsJcGh5c19hZGRyX3QgcGFk ZHI7Cj4gPiArCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHB0ZV9hbGlnbmVkLCBwbWRfYWxpZ25lZDsK PiA+ICsJdW5zaWduZWQgbG9uZyBwdWRfYWxpZ25lZCwgcDRkX2FsaWduZWQsIHBnZF9hbGlnbmVk Owo+ID4gKwo+ID4gKwlwcl9pbmZvKCJWYWxpZGF0aW5nIGFyY2hpdGVjdHVyZSBwYWdlIHRhYmxl IGhlbHBlcnNcbiIpOwo+ID4gKwlwcm90ID0gdm1fZ2V0X3BhZ2VfcHJvdChWTUZMQUdTKTsKPiA+ ICsJdmFkZHIgPSBnZXRfcmFuZG9tX3ZhZGRyKCk7Cj4gPiArCW1tID0gbW1fYWxsb2MoKTsKPiA+ ICsJaWYgKCFtbSkgewo+ID4gKwkJcHJfZXJyKCJtbV9zdHJ1Y3QgYWxsb2NhdGlvbiBmYWlsZWRc biIpOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFBGTiBm b3IgbWFwcGluZyBhdCBQVEUgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBmcm9tIGEgc3RhbmRhcmQga2Vy bmVsCj4gPiArCSAqIHRleHQgc3ltYm9sLiBCdXQgcGZucyBmb3IgaGlnaGVyIHBhZ2UgdGFibGUg bGV2ZWxzIGFyZSBkZXJpdmVkIGJ5Cj4gPiArCSAqIG1hc2tpbmcgbG93ZXIgYml0cyBvZiB0aGlz IHJlYWwgcGZuLiBUaGVzZSBkZXJpdmVkIHBmbnMgbWlnaHQgbm90Cj4gPiArCSAqIGV4aXN0IG9u IHRoZSBwbGF0Zm9ybSBidXQgdGhhdCBkb2VzIG5vdCByZWFsbHkgbWF0dGVyIGFzIHBmbl9weHgo KQo+ID4gKwkgKiBoZWxwZXJzIHdpbGwgc3RpbGwgY3JlYXRlIGFwcHJvcHJpYXRlIGVudHJpZXMg Zm9yIHRoZSB0ZXN0LiBUaGlzCj4gPiArCSAqIGhlbHBzIGF2b2lkIGxhcmdlIG1lbW9yeSBibG9j ayBhbGxvY2F0aW9ucyB0byBiZSB1c2VkIGZvciBtYXBwaW5nCj4gPiArCSAqIGF0IGhpZ2hlciBw YWdlIHRhYmxlIGxldmVscy4KPiA+ICsJICovCj4gPiArCXBhZGRyID0gX19wYSgmc3RhcnRfa2Vy bmVsKTsKPiA+ICsKPiA+ICsJcHRlX2FsaWduZWQgPSAocGFkZHIgJiBQQUdFX01BU0spID4+IFBB R0VfU0hJRlQ7Cj4gPiArCXBtZF9hbGlnbmVkID0gKHBhZGRyICYgUE1EX01BU0spID4+IFBBR0Vf U0hJRlQ7Cj4gPiArCXB1ZF9hbGlnbmVkID0gKHBhZGRyICYgUFVEX01BU0spID4+IFBBR0VfU0hJ RlQ7Cj4gPiArCXA0ZF9hbGlnbmVkID0gKHBhZGRyICYgUDREX01BU0spID4+IFBBR0VfU0hJRlQ7 Cj4gPiArCXBnZF9hbGlnbmVkID0gKHBhZGRyICYgUEdESVJfTUFTSykgPj4gUEFHRV9TSElGVDsK PiA+ICsJV0FSTl9PTighcGZuX3ZhbGlkKHB0ZV9hbGlnbmVkKSk7Cj4gPiArCj4gPiArCXBnZHAg PSBwZ2Rfb2Zmc2V0KG1tLCB2YWRkcik7Cj4gPiArCXA0ZHAgPSBwNGRfYWxsb2MobW0sIHBnZHAs IHZhZGRyKTsKPiA+ICsJcHVkcCA9IHB1ZF9hbGxvYyhtbSwgcDRkcCwgdmFkZHIpOwo+ID4gKwlw bWRwID0gcG1kX2FsbG9jKG1tLCBwdWRwLCB2YWRkcik7Cj4gPiArCXB0ZXAgPSBwdGVfYWxsb2Nf bWFwKG1tLCBwbWRwLCB2YWRkcik7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFNhdmUgYWxsIHRo ZSBwYWdlIHRhYmxlIHBhZ2UgYWRkcmVzc2VzIGFzIHRoZSBwYWdlIHRhYmxlCj4gPiArCSAqIGVu dHJpZXMgd2lsbCBiZSB1c2VkIGZvciB0ZXN0aW5nIHdpdGggcmFuZG9tIG9yIGdhcmJhZ2UKPiA+ ICsJICogdmFsdWVzLiBUaGVzZSBzYXZlZCBhZGRyZXNzZXMgd2lsbCBiZSB1c2VkIGZvciBmcmVl aW5nCj4gPiArCSAqIHBhZ2UgdGFibGUgcGFnZXMuCj4gPiArCSAqLwo+ID4gKwlwbWQgPSBSRUFE X09OQ0UoKnBtZHApOwo+ID4gKwlzYXZlZF9wNGRwID0gcDRkX29mZnNldChwZ2RwLCAwVUwpOwo+ ID4gKwlzYXZlZF9wdWRwID0gcHVkX29mZnNldChwNGRwLCAwVUwpOwo+ID4gKwlzYXZlZF9wbWRw ID0gcG1kX29mZnNldChwdWRwLCAwVUwpOwo+ID4gKwlzYXZlZF9wdGVwID0gcG1kX3BndGFibGUo cG1kKTsKPiA+ICsKPiA+ICsJcHRlX2Jhc2ljX3Rlc3RzKHB0ZV9hbGlnbmVkLCBwcm90KTsKPiA+ ICsJcG1kX2Jhc2ljX3Rlc3RzKHBtZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsJcHVkX2Jhc2ljX3Rl c3RzKHB1ZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsJcDRkX2Jhc2ljX3Rlc3RzKHA0ZF9hbGlnbmVk LCBwcm90KTsKPiA+ICsJcGdkX2Jhc2ljX3Rlc3RzKHBnZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsK PiA+ICsJcHRlX2NsZWFyX3Rlc3RzKG1tLCBwdGVwKTsKPiA+ICsJcG1kX2NsZWFyX3Rlc3RzKG1t LCBwbWRwKTsKPiA+ICsJcHVkX2NsZWFyX3Rlc3RzKG1tLCBwdWRwKTsKPiA+ICsJcDRkX2NsZWFy X3Rlc3RzKG1tLCBwNGRwKTsKPiA+ICsJcGdkX2NsZWFyX3Rlc3RzKG1tLCBwZ2RwKTsKPiA+ICsK PiA+ICsJcHRlX3VubWFwKHB0ZXApOwo+ID4gKwo+ID4gKwlwbWRfcG9wdWxhdGVfdGVzdHMobW0s IHBtZHAsIHNhdmVkX3B0ZXApOwo+ID4gKwlwdWRfcG9wdWxhdGVfdGVzdHMobW0sIHB1ZHAsIHNh dmVkX3BtZHApOwo+ID4gKwlwNGRfcG9wdWxhdGVfdGVzdHMobW0sIHA0ZHAsIHNhdmVkX3B1ZHAp Owo+ID4gKwlwZ2RfcG9wdWxhdGVfdGVzdHMobW0sIHBnZHAsIHNhdmVkX3A0ZHApOwo+ID4gKwo+ ID4gKwlwNGRfZnJlZShtbSwgc2F2ZWRfcDRkcCk7Cj4gPiArCXB1ZF9mcmVlKG1tLCBzYXZlZF9w dWRwKTsKPiA+ICsJcG1kX2ZyZWUobW0sIHNhdmVkX3BtZHApOwo+ID4gKwlwdGVfZnJlZShtbSwg c2F2ZWRfcHRlcCk7Cj4gPiArCj4gPiArCW1tX2RlY19ucl9wdWRzKG1tKTsKPiA+ICsJbW1fZGVj X25yX3BtZHMobW0pOwo+ID4gKwltbV9kZWNfbnJfcHRlcyhtbSk7Cj4gPiArCW1tZHJvcChtbSk7 Cj4gPiArfQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtc25wcy1hcmMgbWFpbGluZyBsaXN0CmxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1z bnBzLWFyYwo= 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=-8.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 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 01635C4BA10 for ; Wed, 26 Feb 2020 14:17:16 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (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 514EF2467B for ; Wed, 26 Feb 2020 14:17:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=lca.pw header.i=@lca.pw header.b="rWcvB3Ch" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 514EF2467B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lca.pw Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 48SHtc3LJQzDq9J for ; Thu, 27 Feb 2020 01:17:12 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lca.pw (client-ip=2607:f8b0:4864:20::841; helo=mail-qt1-x841.google.com; envelope-from=cai@lca.pw; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=lca.pw Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lca.pw header.i=@lca.pw header.a=rsa-sha256 header.s=google header.b=rWcvB3Ch; dkim-atps=neutral Received: from mail-qt1-x841.google.com (mail-qt1-x841.google.com [IPv6:2607:f8b0:4864:20::841]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 48SHn75jrWzDq9J for ; Thu, 27 Feb 2020 01:12:27 +1100 (AEDT) Received: by mail-qt1-x841.google.com with SMTP id i14so2272432qtv.13 for ; Wed, 26 Feb 2020 06:12:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=message-id:subject:from:to:cc:date:in-reply-to:references :mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=rWcvB3ChbzzCxhjsRkXwIGu/GTo7njlFvzRCsSW8lMMm97sOvJCBB8yGBE5JoeWJ31 XEFJUxPrzL+8aubEOKhgodlo5lvUk4fWW8CCvChfOo4kAFbQ+jjF5tB6xxx3hI9W4rX3 Id85+OHj79KSqLDnOcgGivnSurvGmHY5Y0wDax4W1DeOv/NGKM2lJPfpBpsaueixcQVu YsMmSBdDql8ep92UT7qNnV5Ujsc5Z4kCk04YWC5r/orXob32oWrMScXUu1R/FK8Mtjks 2xHX0Dfy4GY1Z24Vgd9PfEyO+qFVaVr6ea2Tvk1G0ZGeeAk6DAHzYWPqBrUZjf+bsJil BIxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=p7Ih4BFNK7t/yyocJLmcBJC/jy9vfKyKkdFBxIizSZrjbba3OlqHA81IxdezX/r7bC b8Yl0B1bqO0olGDFLF/cD4AR9fwiTEDsrWDt5UMYsSg2a2YRP07HOkn/fwpRarW38oJU Vvzlmc6FqOlO+us1sr45Rpm/ZBDB9lfmgCAsKwI574QcV74ts/a43vrENcnMG0M+YmPN f2AyVQgojm8/uIBY+1865CWe62xWuhPG1YDV5PQhIr8y1RRY4iZveP8G/s6fSpgJ6gXu Ume83e1d0H+MhgpVJDVoPPANxM/8DHZ0GBimQfJRcq2azJkOrD1qO9F2aiWhfXS4V0DI 8/Gg== X-Gm-Message-State: APjAAAUNTCRlxOeEs8C5XqCo7LXxYsLxEhl3v8Y0peINrYMiH9hZWcNQ MJ3QO1FR4dlWV5HA/feLMEkMHg== X-Google-Smtp-Source: APXvYqw9aMSIfTjqPLvpJ3bOyXHHZNQ6U+9bhlBH8v5g0ienQKqHKc/G1KSbjjFvDpjZB3+MOQWimg== X-Received: by 2002:aed:256f:: with SMTP id w44mr5262478qtc.331.1582726342954; Wed, 26 Feb 2020 06:12:22 -0800 (PST) Received: from dhcp-41-57.bos.redhat.com (nat-pool-bos-t.redhat.com. [66.187.233.206]) by smtp.gmail.com with ESMTPSA id w9sm1196529qka.71.2020.02.26.06.12.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 Feb 2020 06:12:22 -0800 (PST) Message-ID: <1582726340.7365.124.camel@lca.pw> Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers From: Qian Cai To: Anshuman Khandual , linux-mm@kvack.org Date: Wed, 26 Feb 2020 09:12:20 -0500 In-Reply-To: <1582726182.7365.123.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.22.6 (3.22.6-10.el7) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Catalin Marinas , Heiko Carstens , Paul Mackerras , "H. Peter Anvin" , linux-riscv@lists.infradead.org, Will Deacon , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Vineet Gupta , linux-kernel@vger.kernel.org, Palmer Dabbelt , Andrew Morton , linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On Wed, 2020-02-26 at 09:09 -0500, Qian Cai wrote: > On Mon, 2020-02-17 at 08:47 +0530, Anshuman Khandual wrote: > > This adds tests which will validate architecture page table helpers and > > other accessors in their compliance with expected generic MM semantics. > > This will help various architectures in validating changes to existing > > page table helpers or addition of new ones. > > > > This test covers basic page table entry transformations including but not > > limited to old, young, dirty, clean, write, write protect etc at various > > level along with populating intermediate entries with next page table page > > and validating them. > > > > Test page table pages are allocated from system memory with required size > > and alignments. The mapped pfns at page table levels are derived from a > > real pfn representing a valid kernel text symbol. This test gets called > > inside kernel_init() right after async_synchronize_full(). > > > > This test gets built and run when CONFIG_DEBUG_VM_PGTABLE is selected. Any > > architecture, which is willing to subscribe this test will need to select > > ARCH_HAS_DEBUG_VM_PGTABLE. For now this is limited to arc, arm64, x86, s390 > > and ppc32 platforms where the test is known to build and run successfully. > > Going forward, other architectures too can subscribe the test after fixing > > any build or runtime problems with their page table helpers. Meanwhile for > > better platform coverage, the test can also be enabled with CONFIG_EXPERT > > even without ARCH_HAS_DEBUG_VM_PGTABLE. > > > > Folks interested in making sure that a given platform's page table helpers > > conform to expected generic MM semantics should enable the above config > > which will just trigger this test during boot. Any non conformity here will > > be reported as an warning which would need to be fixed. This test will help > > catch any changes to the agreed upon semantics expected from generic MM and > > enable platforms to accommodate it thereafter. > > How useful is this that straightly crash the powerpc? And then generate warnings on arm64, [  146.634626][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating architecture page table helpers [  146.643995][    T1] ------------[ cut here ]------------ [  146.649350][    T1] virt_to_phys used for non-linear address: (____ptrval____) (start_kernel+0x0/0x580) [  146.658840][    T1] WARNING: CPU: 165 PID: 1 at arch/arm64/mm/physaddr.c:15 __virt_to_phys+0x98/0xe0 [  146.667976][    T1] Modules linked in: [  146.671741][    T1] CPU: 165 PID: 1 Comm: swapper/0 Tainted: G             L    5.6.0-rc3-next-20200226 #1 [  146.681397][    T1] Hardware name: HPE Apollo 70             /C01_APACHE_MB         , BIOS L50_5.13_1.11 06/18/2019 [  146.691840][    T1] pstate: 60400009 (nZCv daif +PAN -UAO) [  146.697334][    T1] pc : __virt_to_phys+0x98/0xe0 [  146.702045][    T1] lr : __virt_to_phys+0x98/0xe0 [  146.706753][    T1] sp : 18ff00082b7afe10 [  146.710766][    T1] x29: 18ff00082b7afe30 x28: 0000000000000000  [  146.716782][    T1] x27: 0000000000000000 x26: 0000000000000000  [  146.722798][    T1] x25: 0000000000000000 x24: 0000000000000000  [  146.728813][    T1] x23: 0000000000000000 x22: 0000000000000000  [  146.734827][    T1] x21: 0000000000000000 x20: ffff9000135b4000  [  146.740842][    T1] x19: ffff900011200858 x18: 0000000000000000  [  146.746857][    T1] x17: 0000000000000000 x16: 0000000000000000  [  146.752872][    T1] x15: 0000000000000000 x14: 3078302b6c656e72  [  146.758887][    T1] x13: 656b5f7472617473 x12: ffff90001369ea90  [  146.764901][    T1] x11: 00000000000000c9 x10: ffff800082b76c0e  [  146.770917][    T1] x9 : 9d6a2e2260401300 x8 : 9d6a2e2260401300  [  146.776932][    T1] x7 : aaaaaaaaaaaaaaaa x6 : 0000000000000000  [  146.782946][    T1] x5 : 0000000000000080 x4 : 0000000000000000  [  146.788960][    T1] x3 : 0000000000000010 x2 : 0000000000000008  [  146.794975][    T1] x1 : 0000000000000006 x0 : 0000000000000053  [  146.800990][    T1] Call trace: [  146.804140][    T1]  __virt_to_phys+0x98/0xe0 [  146.808512][    T1]  debug_vm_pgtable+0x74/0x3fc [  146.813140][    T1]  kernel_init+0x1c/0x208 [  146.817334][    T1]  ret_from_fork+0x10/0x18 [  146.821608][    T1] irq event stamp: 19843388 [  146.825978][    T1] hardirqs last  enabled at (19843387): [] console_unlock+0x8d0/0x970 [  146.835553][    T1] hardirqs last disabled at (19843388): [] do_debug_exception+0x58/0x2cc [  146.845387][    T1] softirqs last  enabled at (19843384): [] __do_softirq+0x864/0x900 [  146.854796][    T1] softirqs last disabled at (19843377): [] irq_exit+0x1c8/0x238 [  146.863845][    T1] ---[ end trace 31678d9e845dff89 ]--- > > [   23.263425][    T1] debug_vm_pgtable: debug_vm_pgtable: Validating > architecture page table helpers > [   23.263625][    T1] ------------[ cut here ]------------ > [   23.263649][    T1] kernel BUG at arch/powerpc/mm/pgtable.c:274! > [   23.263675][    T1] Oops: Exception in kernel mode, sig: 5 [#1] > [   23.263698][    T1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=256 > DEBUG_PAGEALLOC NUMA PowerNV > [   23.263731][    T1] Modules linked in: > [   23.263752][    T1] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc3-next- > 20200226 #1 > [   23.263776][    T1] NIP:  c00000000007308c LR: c00000000103dbd8 CTR: > 0000000000000000 > [   23.263810][    T1] REGS: c00000003ddaf9c0 TRAP: 0700   Not tainted  (5.6.0- > rc3-next-20200226) > [   23.263846][    T1] MSR:  9000000000029033   CR: > 22000228  XER: 00000000 > [   23.263888][    T1] CFAR: c000000000073030 IRQMASK: 0  > [   23.263888][    T1] GPR00: c00000000103dbd8 c00000003ddafc50 c000000001656f00 > c000001d7b4ca080  > [   23.263888][    T1] GPR04: 0000000000000000 0000000000000009 c00000003ddafc04 > 0000000000000000  > [   23.263888][    T1] GPR08: f0ffffffffffffff 0000000000000001 c0000000016279d0 > 00000000000a0000  > [   23.263888][    T1] GPR12: 0000000000000000 c000001fffffae00 c000000000010e84 > 0000000000000000  > [   23.263888][    T1] GPR16: 0000000000000000 8000000000000105 0000000000000100 > c000000001689a18  > [   23.263888][    T1] GPR20: c00020032c660000 c00020032c620000 c000000001716030 > c00020032c600000  > [   23.263888][    T1] GPR24: 000000000000000d c000000001716030 c000001d7b4ca080 > c000000001716040  > [   23.263888][    T1] GPR28: c000000001716038 0000000000000000 0000000000000000 > 0000000000000000  > [   23.264122][    T1] NIP [c00000000007308c] assert_pte_locked+0x11c/0x320 > [   23.264154][    T1] LR [c00000000103dbd8] debug_vm_pgtable+0x770/0xb7c > [   23.264186][    T1] Call Trace: > [   23.264206][    T1] [c00000003ddafc50] [c000000000999760] > _raw_spin_unlock+0x30/0x70 (unreliable) > [   23.264244][    T1] [c00000003ddafcd0] [c00000000103d924] > debug_vm_pgtable+0x4bc/0xb7c > [   23.264279][    T1] [c00000003ddafdb0] [c000000000010eac] > kernel_init+0x30/0x194 > [   23.264315][    T1] [c00000003ddafe20] [c00000000000b748] > ret_from_kernel_thread+0x5c/0x74 > [   23.264349][    T1] Instruction dump: > [   23.264368][    T1] 60000000 3be00001 7fbef436 eafa0040 7fffc030 3bffffff > 7fff07b4 7ffff038  > [   23.264409][    T1] 7bff1f24 7d37f82a 7d290074 7929d182 <0b090000> ebdb0000 > e93c0000 7fde4a14  > [   23.264460][    T1] ---[ end trace 72d2931022e9ab24 ]--- > [   23.627311][    T1]  > [   24.627407][    T1] Kernel panic - not syncing: Fatal exception > [   26.5 > > > > > Cc: Andrew Morton > > Cc: Mike Rapoport > > Cc: Vineet Gupta > > Cc: Catalin Marinas > > Cc: Will Deacon > > Cc: Benjamin Herrenschmidt > > Cc: Paul Mackerras > > Cc: Michael Ellerman > > Cc: Heiko Carstens > > Cc: Vasily Gorbik > > Cc: Christian Borntraeger > > Cc: Thomas Gleixner > > Cc: Ingo Molnar > > Cc: Borislav Petkov > > Cc: "H. Peter Anvin" > > Cc: Kirill A. Shutemov > > Cc: Paul Walmsley > > Cc: Palmer Dabbelt > > Cc: linux-snps-arc@lists.infradead.org > > Cc: linux-arm-kernel@lists.infradead.org > > Cc: linuxppc-dev@lists.ozlabs.org > > Cc: linux-s390@vger.kernel.org > > Cc: linux-riscv@lists.infradead.org > > Cc: x86@kernel.org > > Cc: linux-arch@vger.kernel.org > > Cc: linux-kernel@vger.kernel.org > > > > Suggested-by: Catalin Marinas > > Reviewed-by: Ingo Molnar > > Tested-by: Gerald Schaefer # s390 > > Tested-by: Christophe Leroy # ppc32 > > Signed-off-by: Andrew Morton > > Signed-off-by: Christophe Leroy > > Signed-off-by: Anshuman Khandual > > --- > > This adds a test validation for architecture exported page table helpers. > > Patch adds basic transformation tests at various levels of the page table. > > > > This test was originally suggested by Catalin during arm64 THP migration > > RFC discussion earlier. Going forward it can include more specific tests > > with respect to various generic MM functions like THP, HugeTLB etc and > > platform specific tests. > > > > https://lore.kernel.org/linux-mm/20190628102003.GA56463@arrakis.emea.arm.com/ > > > > Needs to be applied on linux V5.6-rc2 > > > > Changes in V14: > > > > - Disabled DEBUG_VM_PGFLAGS for IA64 and ARM (32 Bit) per Andrew and Christophe > > - Updated DEBUG_VM_PGFLAGS documentation wrt EXPERT and disabled platforms > > - Updated RANDOM_[OR|NZ]VALUE open encodings with GENMASK() per Catalin > > - Updated s390 constraint bits from 12 to 4 (S390_MASK_BITS) per Gerald > > - Updated in-code documentation for RANDOM_ORVALUE per Gerald > > - Updated pxx_basic_tests() to use invert functions first per Catalin > > - Dropped ARCH_HAS_4LEVEL_HACK check from pud_basic_tests() > > - Replaced __ARCH_HAS_[4|5]LEVEL_HACK with __PAGETABLE_[PUD|P4D]_FOLDED per Catalin > > - Trimmed the CC list on the commit message per Catalin > > > > Changes in V13: (https://patchwork.kernel.org/project/linux-mm/list/?series=237125) > > > > - Subscribed s390 platform and updated debug-vm-pgtable/arch-support.txt per Gerald > > - Dropped keyword 'extern' from debug_vm_pgtable() declaration per Christophe > > - Moved debug_vm_pgtable() declarations to per Christophe > > - Moved debug_vm_pgtable() call site into kernel_init() per Christophe > > - Changed CONFIG_DEBUG_VM_PGTABLE rules per Christophe > > - Updated commit to include new supported platforms and changed config selection > > > > Changes in V12: (https://patchwork.kernel.org/project/linux-mm/list/?series=233905) > > > > - Replaced __mmdrop() with mmdrop() > > - Enable ARCH_HAS_DEBUG_VM_PGTABLE on X86 for non CONFIG_X86_PAE platforms as the > > test procedure interfere with pre-allocated PMDs attached to the PGD resulting > > in runtime failures with VM_BUG_ON() > > > > Changes in V11: (https://patchwork.kernel.org/project/linux-mm/list/?series=221135) > > > > - Rebased the patch on V5.4 > > > > Changes in V10: (https://patchwork.kernel.org/project/linux-mm/list/?series=205529) > > > > - Always enable DEBUG_VM_PGTABLE when DEBUG_VM is enabled per Ingo > > - Added tags from Ingo > > > > Changes in V9: (https://patchwork.kernel.org/project/linux-mm/list/?series=201429) > > > > - Changed feature support enumeration for powerpc platforms per Christophe > > - Changed config wrapper for basic_[pmd|pud]_tests() to enable ARC platform > > - Enabled the test on ARC platform > > > > Changes in V8: (https://patchwork.kernel.org/project/linux-mm/list/?series=194297) > > > > - Enabled ARCH_HAS_DEBUG_VM_PGTABLE on PPC32 platform per Christophe > > - Updated feature documentation as DEBUG_VM_PGTABLE is now enabled on PPC32 platform > > - Moved ARCH_HAS_DEBUG_VM_PGTABLE earlier to indent it with DEBUG_VM per Christophe > > - Added an information message in debug_vm_pgtable() per Christophe > > - Dropped random_vaddr boundary condition checks per Christophe and Qian > > - Replaced virt_addr_valid() check with pfn_valid() check in debug_vm_pgtable() > > - Slightly changed pr_fmt(fmt) information > > > > Changes in V7: (https://patchwork.kernel.org/project/linux-mm/list/?series=193051) > > > > - Memory allocation and free routines for mapped pages have been droped > > - Mapped pfns are derived from standard kernel text symbol per Matthew > > - Moved debug_vm_pgtaable() after page_alloc_init_late() per Michal and Qian > > - Updated the commit message per Michal > > - Updated W=1 GCC warning problem on x86 per Qian Cai > > - Addition of new alloc_contig_pages() helper has been submitted separately > > > > Changes in V6: (https://patchwork.kernel.org/project/linux-mm/list/?series=187589) > > > > - Moved alloc_gigantic_page_order() into mm/page_alloc.c per Michal > > - Moved alloc_gigantic_page_order() within CONFIG_CONTIG_ALLOC in the test > > - Folded Andrew's include/asm-generic/pgtable.h fix into the test patch 2/2 > > > > Changes in V5: (https://patchwork.kernel.org/project/linux-mm/list/?series=185991) > > > > - Redefined and moved X86 mm_p4d_folded() into a different header per Kirill/Ingo > > - Updated the config option comment per Ingo and dropped 'kernel module' reference > > - Updated the commit message and dropped 'kernel module' reference > > - Changed DEBUG_ARCH_PGTABLE_TEST into DEBUG_VM_PGTABLE per Ingo > > - Moved config option from mm/Kconfig.debug into lib/Kconfig.debug > > - Renamed core test function arch_pgtable_tests() as debug_vm_pgtable() > > - Renamed mm/arch_pgtable_test.c as mm/debug_vm_pgtable.c > > - debug_vm_pgtable() gets called from kernel_init_freeable() after init_mm_internals() > > - Added an entry in Documentation/features/debug/ per Ingo > > - Enabled the test on arm64 and x86 platforms for now > > > > Changes in V4: (https://patchwork.kernel.org/project/linux-mm/list/?series=183465) > > > > - Disable DEBUG_ARCH_PGTABLE_TEST for ARM and IA64 platforms > > > > Changes in V3: (https://lore.kernel.org/patchwork/project/lkml/list/?series=411216) > > > > - Changed test trigger from module format into late_initcall() > > - Marked all functions with __init to be freed after completion > > - Changed all __PGTABLE_PXX_FOLDED checks as mm_pxx_folded() > > - Folded in PPC32 fixes from Christophe > > > > Changes in V2: > > > > https://lore.kernel.org/linux-mm/1568268173-31302-1-git-send-email-anshuman.khandual@arm.com/T/#t > > > > - Fixed small typo error in MODULE_DESCRIPTION() > > - Fixed m64k build problems for lvalue concerns in pmd_xxx_tests() > > - Fixed dynamic page table level folding problems on x86 as per Kirril > > - Fixed second pointers during pxx_populate_tests() per Kirill and Gerald > > - Allocate and free pte table with pte_alloc_one/pte_free per Kirill > > - Modified pxx_clear_tests() to accommodate s390 lower 12 bits situation > > - Changed RANDOM_NZVALUE value from 0xbe to 0xff > > - Changed allocation, usage, free sequence for saved_ptep > > - Renamed VMA_FLAGS as VMFLAGS > > - Implemented a new method for random vaddr generation > > - Implemented some other cleanups > > - Dropped extern reference to mm_alloc() > > - Created and exported new alloc_gigantic_page_order() > > - Dropped the custom allocator and used new alloc_gigantic_page_order() > > > > Changes in V1: > > > > https://lore.kernel.org/linux-mm/1567497706-8649-1-git-send-email-anshuman.khandual@arm.com/ > > > > - Added fallback mechanism for PMD aligned memory allocation failure > > > > Changes in RFC V2: > > > > https://lore.kernel.org/linux-mm/1565335998-22553-1-git-send-email-anshuman.khandual@arm.com/T/#u > > > > - Moved test module and it's config from lib/ to mm/ > > - Renamed config TEST_ARCH_PGTABLE as DEBUG_ARCH_PGTABLE_TEST > > - Renamed file from test_arch_pgtable.c to arch_pgtable_test.c > > - Added relevant MODULE_DESCRIPTION() and MODULE_AUTHOR() details > > - Dropped loadable module config option > > - Basic tests now use memory blocks with required size and alignment > > - PUD aligned memory block gets allocated with alloc_contig_range() > > - If PUD aligned memory could not be allocated it falls back on PMD aligned > > memory block from page allocator and pud_* tests are skipped > > - Clear and populate tests now operate on real in memory page table entries > > - Dummy mm_struct gets allocated with mm_alloc() > > - Dummy page table entries get allocated with [pud|pmd|pte]_alloc_[map]() > > - Simplified [p4d|pgd]_basic_tests(), now has random values in the entries > > > > Original RFC V1: > > > > https://lore.kernel.org/linux-mm/1564037723-26676-1-git-send-email-anshuman.khandual@arm.com/ > > > > > > .../debug/debug-vm-pgtable/arch-support.txt | 35 ++ > > arch/arc/Kconfig | 1 + > > arch/arm64/Kconfig | 1 + > > arch/powerpc/Kconfig | 1 + > > arch/s390/Kconfig | 1 + > > arch/x86/Kconfig | 1 + > > arch/x86/include/asm/pgtable_64.h | 6 + > > include/linux/mmdebug.h | 5 + > > init/main.c | 2 + > > lib/Kconfig.debug | 26 ++ > > mm/Makefile | 1 + > > mm/debug_vm_pgtable.c | 389 ++++++++++++++++++ > > 12 files changed, 469 insertions(+) > > create mode 100644 Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > create mode 100644 mm/debug_vm_pgtable.c > > > > diff --git a/Documentation/features/debug/debug-vm-pgtable/arch-support.txt b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > new file mode 100644 > > index 000000000000..64d0f9b15c49 > > --- /dev/null > > +++ b/Documentation/features/debug/debug-vm-pgtable/arch-support.txt > > @@ -0,0 +1,35 @@ > > +# > > +# Feature name: debug-vm-pgtable > > +# Kconfig: ARCH_HAS_DEBUG_VM_PGTABLE > > +# description: arch supports pgtable tests for semantics compliance > > +# > > + ----------------------- > > + | arch |status| > > + ----------------------- > > + | alpha: | TODO | > > + | arc: | ok | > > + | arm: | TODO | > > + | arm64: | ok | > > + | c6x: | TODO | > > + | csky: | TODO | > > + | h8300: | TODO | > > + | hexagon: | TODO | > > + | ia64: | TODO | > > + | m68k: | TODO | > > + | microblaze: | TODO | > > + | mips: | TODO | > > + | nds32: | TODO | > > + | nios2: | TODO | > > + | openrisc: | TODO | > > + | parisc: | TODO | > > + | powerpc/32: | ok | > > + | powerpc/64: | TODO | > > + | riscv: | TODO | > > + | s390: | ok | > > + | sh: | TODO | > > + | sparc: | TODO | > > + | um: | TODO | > > + | unicore32: | TODO | > > + | x86: | ok | > > + | xtensa: | TODO | > > + ----------------------- > > diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig > > index ff2a393b635c..3e72e6cf0e42 100644 > > --- a/arch/arc/Kconfig > > +++ b/arch/arc/Kconfig > > @@ -6,6 +6,7 @@ > > config ARC > > def_bool y > > select ARC_TIMERS > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_SETUP_DMA_OPS > > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig > > index 0b30e884e088..aaf8ba415145 100644 > > --- a/arch/arm64/Kconfig > > +++ b/arch/arm64/Kconfig > > @@ -11,6 +11,7 @@ config ARM64 > > select ACPI_PPTT if ACPI > > select ARCH_CLOCKSOURCE_DATA > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_DMA_PREP_COHERENT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > > index 497b7d0b2d7e..8d5ae14c5d4c 100644 > > --- a/arch/powerpc/Kconfig > > +++ b/arch/powerpc/Kconfig > > @@ -116,6 +116,7 @@ config PPC > > # > > select ARCH_32BIT_OFF_T if PPC32 > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if PPC32 > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig > > index 8abe77536d9d..af284dbb07e7 100644 > > --- a/arch/s390/Kconfig > > +++ b/arch/s390/Kconfig > > @@ -59,6 +59,7 @@ config KASAN_SHADOW_OFFSET > > config S390 > > def_bool y > > select ARCH_BINFMT_ELF_STATE > > + select ARCH_HAS_DEBUG_VM_PGTABLE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FORTIFY_SOURCE > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > > index beea77046f9b..df8a19e52e82 100644 > > --- a/arch/x86/Kconfig > > +++ b/arch/x86/Kconfig > > @@ -61,6 +61,7 @@ config X86 > > select ARCH_CLOCKSOURCE_INIT > > select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI > > select ARCH_HAS_DEBUG_VIRTUAL > > + select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE > > select ARCH_HAS_DEVMEM_IS_ALLOWED > > select ARCH_HAS_ELF_RANDOMIZE > > select ARCH_HAS_FAST_MULTIPLIER > > diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h > > index 0b6c4042942a..fb0e76d254b3 100644 > > --- a/arch/x86/include/asm/pgtable_64.h > > +++ b/arch/x86/include/asm/pgtable_64.h > > @@ -53,6 +53,12 @@ static inline void sync_initial_page_table(void) { } > > > > struct mm_struct; > > > > +#define mm_p4d_folded mm_p4d_folded > > +static inline bool mm_p4d_folded(struct mm_struct *mm) > > +{ > > + return !pgtable_l5_enabled(); > > +} > > + > > void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte); > > void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); > > > > diff --git a/include/linux/mmdebug.h b/include/linux/mmdebug.h > > index 2ad72d2c8cc5..5339aa14b749 100644 > > --- a/include/linux/mmdebug.h > > +++ b/include/linux/mmdebug.h > > @@ -64,4 +64,9 @@ void dump_mm(const struct mm_struct *mm); > > #define VM_BUG_ON_PGFLAGS(cond, page) BUILD_BUG_ON_INVALID(cond) > > #endif > > > > +#ifdef CONFIG_DEBUG_VM_PGTABLE > > +void debug_vm_pgtable(void); > > +#else > > +static inline void debug_vm_pgtable(void) { } > > +#endif > > #endif > > diff --git a/init/main.c b/init/main.c > > index cc0ee4873419..adf37e8b1d69 100644 > > --- a/init/main.c > > +++ b/init/main.c > > @@ -94,6 +94,7 @@ > > #include > > #include > > #include > > +#include > > > > #include > > #include > > @@ -1323,6 +1324,7 @@ static int __ref kernel_init(void *unused) > > kernel_init_freeable(); > > /* need to finish all async __init code before freeing the memory */ > > async_synchronize_full(); > > + debug_vm_pgtable(); > > ftrace_free_init_mem(); > > free_initmem(); > > mark_readonly(); > > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > > index 69def4a9df00..1b5bd9f7c967 100644 > > --- a/lib/Kconfig.debug > > +++ b/lib/Kconfig.debug > > @@ -653,6 +653,12 @@ config SCHED_STACK_END_CHECK > > data corruption or a sporadic crash at a later stage once the region > > is examined. The runtime overhead introduced is minimal. > > > > +config ARCH_HAS_DEBUG_VM_PGTABLE > > + bool > > + help > > + An architecture should select this when it can successfully > > + build and run DEBUG_VM_PGTABLE. > > + > > config DEBUG_VM > > bool "Debug VM" > > depends on DEBUG_KERNEL > > @@ -688,6 +694,26 @@ config DEBUG_VM_PGFLAGS > > > > If unsure, say N. > > > > +config DEBUG_VM_PGTABLE > > + bool "Debug arch page table for semantics compliance" > > + depends on MMU > > + depends on !IA64 && !ARM > > + depends on ARCH_HAS_DEBUG_VM_PGTABLE || EXPERT > > + default n if !ARCH_HAS_DEBUG_VM_PGTABLE > > + default y if DEBUG_VM > > + help > > + This option provides a debug method which can be used to test > > + architecture page table helper functions on various platforms in > > + verifying if they comply with expected generic MM semantics. This > > + will help architecture code in making sure that any changes or > > + new additions of these helpers still conform to expected > > + semantics of the generic MM. Platforms will have to opt in for > > + this through ARCH_HAS_DEBUG_VM_PGTABLE. Although it can also be > > + enabled through EXPERT without requiring code change. This test > > + is disabled on IA64 and ARM platforms where it fails to build. > > + > > + If unsure, say N. > > + > > config ARCH_HAS_DEBUG_VIRTUAL > > bool > > > > diff --git a/mm/Makefile b/mm/Makefile > > index 272e66039e70..b0692e6a4b58 100644 > > --- a/mm/Makefile > > +++ b/mm/Makefile > > @@ -87,6 +87,7 @@ obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o > > obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o > > obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o > > obj-$(CONFIG_DEBUG_RODATA_TEST) += rodata_test.o > > +obj-$(CONFIG_DEBUG_VM_PGTABLE) += debug_vm_pgtable.o > > obj-$(CONFIG_PAGE_OWNER) += page_owner.o > > obj-$(CONFIG_CLEANCACHE) += cleancache.o > > obj-$(CONFIG_MEMORY_ISOLATION) += page_isolation.o > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > > new file mode 100644 > > index 000000000000..70bf8ed8fd51 > > --- /dev/null > > +++ b/mm/debug_vm_pgtable.c > > @@ -0,0 +1,389 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * This kernel test validates architecture page table helpers and > > + * accessors and helps in verifying their continued compliance with > > + * expected generic MM semantics. > > + * > > + * Copyright (C) 2019 ARM Ltd. > > + * > > + * Author: Anshuman Khandual > > + */ > > +#define pr_fmt(fmt) "debug_vm_pgtable: %s: " fmt, __func__ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +/* > > + * Basic operations > > + * > > + * mkold(entry) = An old and not a young entry > > + * mkyoung(entry) = A young and not an old entry > > + * mkdirty(entry) = A dirty and not a clean entry > > + * mkclean(entry) = A clean and not a dirty entry > > + * mkwrite(entry) = A write and not a write protected entry > > + * wrprotect(entry) = A write protected and not a write entry > > + * pxx_bad(entry) = A mapped and non-table entry > > + * pxx_same(entry1, entry2) = Both entries hold the exact same value > > + */ > > +#define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > + > > +/* > > + * On s390 platform, the lower 4 bits are used to identify given page table > > + * entry type. But these bits might affect the ability to clear entries with > > + * pxx_clear() because of how dynamic page table folding works on s390. So > > + * while loading up the entries do not change the lower 4 bits. It does not > > + * have affect any other platform. > > + */ > > +#define S390_MASK_BITS 4 > > +#define RANDOM_ORVALUE GENMASK(BITS_PER_LONG - 1, S390_MASK_BITS) > > +#define RANDOM_NZVALUE GENMASK(7, 0) > > + > > +static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pte_t pte = pfn_pte(pfn, prot); > > + > > + WARN_ON(!pte_same(pte, pte)); > > + WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte)))); > > + WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte)))); > > + WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte)))); > > + WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte)))); > > + WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte)))); > > + WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > > +} > > + > > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pmd_t pmd = pfn_pmd(pfn, prot); > > + > > + WARN_ON(!pmd_same(pmd, pmd)); > > + WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd)))); > > + WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd)))); > > + WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd)))); > > + WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd)))); > > + WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd)))); > > + WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd)))); > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pmd_bad(). > > + */ > > + WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > > +} > > + > > +#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pud_t pud = pfn_pud(pfn, prot); > > + > > + WARN_ON(!pud_same(pud, pud)); > > + WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud)))); > > + WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud)))); > > + WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud)))); > > + WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud)))); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + /* > > + * A huge page does not point to next level page table > > + * entry. Hence this must qualify as pud_bad(). > > + */ > > + WARN_ON(!pud_bad(pud_mkhuge(pud))); > > +} > > +#else > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > +#else > > +static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > > +#endif > > + > > +static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + p4d_t p4d; > > + > > + memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t)); > > + WARN_ON(!p4d_same(p4d, p4d)); > > +} > > + > > +static void __init pgd_basic_tests(unsigned long pfn, pgprot_t prot) > > +{ > > + pgd_t pgd; > > + > > + memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t)); > > + WARN_ON(!pgd_same(pgd, pgd)); > > +} > > + > > +#ifndef __PAGETABLE_PUD_FOLDED > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) > > +{ > > + pud_t pud = READ_ONCE(*pudp); > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + > > + pud = __pud(pud_val(pud) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pudp, pud); > > + pud_clear(pudp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(!pud_none(pud)); > > +} > > + > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > + pud_t pud; > > + > > + if (mm_pmd_folded(mm)) > > + return; > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pud_bad(). > > + */ > > + pmd_clear(pmdp); > > + pud_clear(pudp); > > + pud_populate(mm, pudp, pmdp); > > + pud = READ_ONCE(*pudp); > > + WARN_ON(pud_bad(pud)); > > +} > > +#else > > +static void __init pud_clear_tests(struct mm_struct *mm, pud_t *pudp) { } > > +static void __init pud_populate_tests(struct mm_struct *mm, pud_t *pudp, > > + pmd_t *pmdp) > > +{ > > +} > > +#endif > > + > > +#ifndef __PAGETABLE_P4D_FOLDED > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) > > +{ > > + p4d_t p4d = READ_ONCE(*p4dp); > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + p4d = __p4d(p4d_val(p4d) | RANDOM_ORVALUE); > > + WRITE_ONCE(*p4dp, p4d); > > + p4d_clear(p4dp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(!p4d_none(p4d)); > > +} > > + > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > + p4d_t p4d; > > + > > + if (mm_pud_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as p4d_bad(). > > + */ > > + pud_clear(pudp); > > + p4d_clear(p4dp); > > + p4d_populate(mm, p4dp, pudp); > > + p4d = READ_ONCE(*p4dp); > > + WARN_ON(p4d_bad(p4d)); > > +} > > + > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) > > +{ > > + pgd_t pgd = READ_ONCE(*pgdp); > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + pgd = __pgd(pgd_val(pgd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pgdp, pgd); > > + pgd_clear(pgdp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(!pgd_none(pgd)); > > +} > > + > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > + pgd_t pgd; > > + > > + if (mm_p4d_folded(mm)) > > + return; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pgd_bad(). > > + */ > > + p4d_clear(p4dp); > > + pgd_clear(pgdp); > > + pgd_populate(mm, pgdp, p4dp); > > + pgd = READ_ONCE(*pgdp); > > + WARN_ON(pgd_bad(pgd)); > > +} > > +#else > > +static void __init p4d_clear_tests(struct mm_struct *mm, p4d_t *p4dp) { } > > +static void __init pgd_clear_tests(struct mm_struct *mm, pgd_t *pgdp) { } > > +static void __init p4d_populate_tests(struct mm_struct *mm, p4d_t *p4dp, > > + pud_t *pudp) > > +{ > > +} > > +static void __init pgd_populate_tests(struct mm_struct *mm, pgd_t *pgdp, > > + p4d_t *p4dp) > > +{ > > +} > > +#endif > > + > > +static void __init pte_clear_tests(struct mm_struct *mm, pte_t *ptep) > > +{ > > + pte_t pte = READ_ONCE(*ptep); > > + > > + pte = __pte(pte_val(pte) | RANDOM_ORVALUE); > > + WRITE_ONCE(*ptep, pte); > > + pte_clear(mm, 0, ptep); > > + pte = READ_ONCE(*ptep); > > + WARN_ON(!pte_none(pte)); > > +} > > + > > +static void __init pmd_clear_tests(struct mm_struct *mm, pmd_t *pmdp) > > +{ > > + pmd_t pmd = READ_ONCE(*pmdp); > > + > > + pmd = __pmd(pmd_val(pmd) | RANDOM_ORVALUE); > > + WRITE_ONCE(*pmdp, pmd); > > + pmd_clear(pmdp); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(!pmd_none(pmd)); > > +} > > + > > +static void __init pmd_populate_tests(struct mm_struct *mm, pmd_t *pmdp, > > + pgtable_t pgtable) > > +{ > > + pmd_t pmd; > > + > > + /* > > + * This entry points to next level page table page. > > + * Hence this must not qualify as pmd_bad(). > > + */ > > + pmd_clear(pmdp); > > + pmd_populate(mm, pmdp, pgtable); > > + pmd = READ_ONCE(*pmdp); > > + WARN_ON(pmd_bad(pmd)); > > +} > > + > > +static unsigned long __init get_random_vaddr(void) > > +{ > > + unsigned long random_vaddr, random_pages, total_user_pages; > > + > > + total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE; > > + > > + random_pages = get_random_long() % total_user_pages; > > + random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE; > > + > > + return random_vaddr; > > +} > > + > > +void __init debug_vm_pgtable(void) > > +{ > > + struct mm_struct *mm; > > + pgd_t *pgdp; > > + p4d_t *p4dp, *saved_p4dp; > > + pud_t *pudp, *saved_pudp; > > + pmd_t *pmdp, *saved_pmdp, pmd; > > + pte_t *ptep; > > + pgtable_t saved_ptep; > > + pgprot_t prot; > > + phys_addr_t paddr; > > + unsigned long vaddr, pte_aligned, pmd_aligned; > > + unsigned long pud_aligned, p4d_aligned, pgd_aligned; > > + > > + pr_info("Validating architecture page table helpers\n"); > > + prot = vm_get_page_prot(VMFLAGS); > > + vaddr = get_random_vaddr(); > > + mm = mm_alloc(); > > + if (!mm) { > > + pr_err("mm_struct allocation failed\n"); > > + return; > > + } > > + > > + /* > > + * PFN for mapping at PTE level is determined from a standard kernel > > + * text symbol. But pfns for higher page table levels are derived by > > + * masking lower bits of this real pfn. These derived pfns might not > > + * exist on the platform but that does not really matter as pfn_pxx() > > + * helpers will still create appropriate entries for the test. This > > + * helps avoid large memory block allocations to be used for mapping > > + * at higher page table levels. > > + */ > > + paddr = __pa(&start_kernel); > > + > > + pte_aligned = (paddr & PAGE_MASK) >> PAGE_SHIFT; > > + pmd_aligned = (paddr & PMD_MASK) >> PAGE_SHIFT; > > + pud_aligned = (paddr & PUD_MASK) >> PAGE_SHIFT; > > + p4d_aligned = (paddr & P4D_MASK) >> PAGE_SHIFT; > > + pgd_aligned = (paddr & PGDIR_MASK) >> PAGE_SHIFT; > > + WARN_ON(!pfn_valid(pte_aligned)); > > + > > + pgdp = pgd_offset(mm, vaddr); > > + p4dp = p4d_alloc(mm, pgdp, vaddr); > > + pudp = pud_alloc(mm, p4dp, vaddr); > > + pmdp = pmd_alloc(mm, pudp, vaddr); > > + ptep = pte_alloc_map(mm, pmdp, vaddr); > > + > > + /* > > + * Save all the page table page addresses as the page table > > + * entries will be used for testing with random or garbage > > + * values. These saved addresses will be used for freeing > > + * page table pages. > > + */ > > + pmd = READ_ONCE(*pmdp); > > + saved_p4dp = p4d_offset(pgdp, 0UL); > > + saved_pudp = pud_offset(p4dp, 0UL); > > + saved_pmdp = pmd_offset(pudp, 0UL); > > + saved_ptep = pmd_pgtable(pmd); > > + > > + pte_basic_tests(pte_aligned, prot); > > + pmd_basic_tests(pmd_aligned, prot); > > + pud_basic_tests(pud_aligned, prot); > > + p4d_basic_tests(p4d_aligned, prot); > > + pgd_basic_tests(pgd_aligned, prot); > > + > > + pte_clear_tests(mm, ptep); > > + pmd_clear_tests(mm, pmdp); > > + pud_clear_tests(mm, pudp); > > + p4d_clear_tests(mm, p4dp); > > + pgd_clear_tests(mm, pgdp); > > + > > + pte_unmap(ptep); > > + > > + pmd_populate_tests(mm, pmdp, saved_ptep); > > + pud_populate_tests(mm, pudp, saved_pmdp); > > + p4d_populate_tests(mm, p4dp, saved_pudp); > > + pgd_populate_tests(mm, pgdp, saved_p4dp); > > + > > + p4d_free(mm, saved_p4dp); > > + pud_free(mm, saved_pudp); > > + pmd_free(mm, saved_pmdp); > > + pte_free(mm, saved_ptep); > > + > > + mm_dec_nr_puds(mm); > > + mm_dec_nr_pmds(mm); > > + mm_dec_nr_ptes(mm); > > + mmdrop(mm); > > +} 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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_2 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 D9E69C4BA10 for ; Wed, 26 Feb 2020 14:12:41 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 9E3322467B for ; Wed, 26 Feb 2020 14:12:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="hMlPodWu"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=lca.pw header.i=@lca.pw header.b="rWcvB3Ch" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9E3322467B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lca.pw Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-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=bombadil.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: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=IPmjhkDeOMCg4pjhHYb6ckiVWwOICRxcgKYtDADdbZs=; b=hMlPodWumm0kUT 1SdVpfEQPKqVL7bASCuccA7vvjI57Iv+casM2uEpPBOY0oN5ReRNKVFS8gS8Y3HXICiKpaZf7saQ1 ihzBPRy6T9812qOOp+4FiVMmQHXsw5VyHZddV9X85lw+0VI1pYzlS8SjVYnNb2lbKcNyqh3d7t+XU adBW2XS4wKyneCplMrbyYcoFjQxTPh15eVEpRkYOpxEL4jjf6QmoaLapcm7W1CDQFi4mw8GAB0fBN 4kq5w0TWVlldrdqeVWCIreI1VMk+M0+0Kjrm1dQDzmKyOiLNHYEkCb+mUuq4CE1/vJVcSsUqQlU1B OxCQfh+PAXoz9ATOyX9g==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j6xQP-0004gc-RY; Wed, 26 Feb 2020 14:12:33 +0000 Received: from mail-qt1-x843.google.com ([2607:f8b0:4864:20::843]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1j6xQG-0004cK-Cw for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2020 14:12:32 +0000 Received: by mail-qt1-x843.google.com with SMTP id d9so2281483qte.12 for ; Wed, 26 Feb 2020 06:12:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=message-id:subject:from:to:cc:date:in-reply-to:references :mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=rWcvB3ChbzzCxhjsRkXwIGu/GTo7njlFvzRCsSW8lMMm97sOvJCBB8yGBE5JoeWJ31 XEFJUxPrzL+8aubEOKhgodlo5lvUk4fWW8CCvChfOo4kAFbQ+jjF5tB6xxx3hI9W4rX3 Id85+OHj79KSqLDnOcgGivnSurvGmHY5Y0wDax4W1DeOv/NGKM2lJPfpBpsaueixcQVu YsMmSBdDql8ep92UT7qNnV5Ujsc5Z4kCk04YWC5r/orXob32oWrMScXUu1R/FK8Mtjks 2xHX0Dfy4GY1Z24Vgd9PfEyO+qFVaVr6ea2Tvk1G0ZGeeAk6DAHzYWPqBrUZjf+bsJil BIxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:mime-version:content-transfer-encoding; bh=62DaU7w8Jzwvi2LcYDfrb5ELoqeQggQVLyZoZzdYIF0=; b=tCVO5dbPxy5Y52ZanA34eEIIkxN4UeXiRaHXYdoa47b64uCF2QUxqPX2if4g65z+Tv +J9vwA4X16EpAqxz6V/1MX/Ytrc7IF1cIj6A2uIw4/Y9j6BC2Nr0RVztP+V+pWxp9KoA 7HjvA4RERwZJhcnc+JWtUDZIOQDBXexseEHutz/uexSZQgUeBgbtWqtl2IrUSFNnwE4Y d6a4BnnSIpH9vdxye6OJC/U9OFbIskfd6nr3X6c30dd/dTu8/NN2aUAJgxN3GfpEEx6R KU4kTfBkHkl6a/OohBS/JP+tWiId41i+yZUhIgWUzV0/dIcjV0iXTIRHPdj4ZYRKD0nq vBuw== X-Gm-Message-State: APjAAAV5z0AwDQed1SER6YfsfLDTB9GY9EKM9/OhOEQwQbkRIVbwGxiy 5gkmmu9dEmcj/BFNKQ4N6UJytA== X-Google-Smtp-Source: APXvYqw9aMSIfTjqPLvpJ3bOyXHHZNQ6U+9bhlBH8v5g0ienQKqHKc/G1KSbjjFvDpjZB3+MOQWimg== X-Received: by 2002:aed:256f:: with SMTP id w44mr5262478qtc.331.1582726342954; Wed, 26 Feb 2020 06:12:22 -0800 (PST) Received: from dhcp-41-57.bos.redhat.com (nat-pool-bos-t.redhat.com. [66.187.233.206]) by smtp.gmail.com with ESMTPSA id w9sm1196529qka.71.2020.02.26.06.12.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 Feb 2020 06:12:22 -0800 (PST) Message-ID: <1582726340.7365.124.camel@lca.pw> Subject: Re: [PATCH V14] mm/debug: Add tests validating architecture page table helpers From: Qian Cai To: Anshuman Khandual , linux-mm@kvack.org Date: Wed, 26 Feb 2020 09:12:20 -0500 In-Reply-To: <1582726182.7365.123.camel@lca.pw> References: <1581909460-19148-1-git-send-email-anshuman.khandual@arm.com> <1582726182.7365.123.camel@lca.pw> X-Mailer: Evolution 3.22.6 (3.22.6-10.el7) Mime-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200226_061224_451082_A15ECF73 X-CRM114-Status: GOOD ( 24.62 ) 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: Catalin Marinas , Heiko Carstens , Paul Mackerras , "H. Peter Anvin" , linux-riscv@lists.infradead.org, Will Deacon , linux-arch@vger.kernel.org, linux-s390@vger.kernel.org, Michael Ellerman , x86@kernel.org, Mike Rapoport , Christian Borntraeger , Ingo Molnar , Benjamin Herrenschmidt , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, Christophe Leroy , Vineet Gupta , linux-kernel@vger.kernel.org, Palmer Dabbelt , Andrew Morton , linuxppc-dev@lists.ozlabs.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCAyMDIwLTAyLTI2IGF0IDA5OjA5IC0wNTAwLCBRaWFuIENhaSB3cm90ZToKPiBPbiBN b24sIDIwMjAtMDItMTcgYXQgMDg6NDcgKzA1MzAsIEFuc2h1bWFuIEtoYW5kdWFsIHdyb3RlOgo+ ID4gVGhpcyBhZGRzIHRlc3RzIHdoaWNoIHdpbGwgdmFsaWRhdGUgYXJjaGl0ZWN0dXJlIHBhZ2Ug dGFibGUgaGVscGVycyBhbmQKPiA+IG90aGVyIGFjY2Vzc29ycyBpbiB0aGVpciBjb21wbGlhbmNl IHdpdGggZXhwZWN0ZWQgZ2VuZXJpYyBNTSBzZW1hbnRpY3MuCj4gPiBUaGlzIHdpbGwgaGVscCB2 YXJpb3VzIGFyY2hpdGVjdHVyZXMgaW4gdmFsaWRhdGluZyBjaGFuZ2VzIHRvIGV4aXN0aW5nCj4g PiBwYWdlIHRhYmxlIGhlbHBlcnMgb3IgYWRkaXRpb24gb2YgbmV3IG9uZXMuCj4gPiAKPiA+IFRo aXMgdGVzdCBjb3ZlcnMgYmFzaWMgcGFnZSB0YWJsZSBlbnRyeSB0cmFuc2Zvcm1hdGlvbnMgaW5j bHVkaW5nIGJ1dCBub3QKPiA+IGxpbWl0ZWQgdG8gb2xkLCB5b3VuZywgZGlydHksIGNsZWFuLCB3 cml0ZSwgd3JpdGUgcHJvdGVjdCBldGMgYXQgdmFyaW91cwo+ID4gbGV2ZWwgYWxvbmcgd2l0aCBw b3B1bGF0aW5nIGludGVybWVkaWF0ZSBlbnRyaWVzIHdpdGggbmV4dCBwYWdlIHRhYmxlIHBhZ2UK PiA+IGFuZCB2YWxpZGF0aW5nIHRoZW0uCj4gPiAKPiA+IFRlc3QgcGFnZSB0YWJsZSBwYWdlcyBh cmUgYWxsb2NhdGVkIGZyb20gc3lzdGVtIG1lbW9yeSB3aXRoIHJlcXVpcmVkIHNpemUKPiA+IGFu ZCBhbGlnbm1lbnRzLiBUaGUgbWFwcGVkIHBmbnMgYXQgcGFnZSB0YWJsZSBsZXZlbHMgYXJlIGRl cml2ZWQgZnJvbSBhCj4gPiByZWFsIHBmbiByZXByZXNlbnRpbmcgYSB2YWxpZCBrZXJuZWwgdGV4 dCBzeW1ib2wuIFRoaXMgdGVzdCBnZXRzIGNhbGxlZAo+ID4gaW5zaWRlIGtlcm5lbF9pbml0KCkg cmlnaHQgYWZ0ZXIgYXN5bmNfc3luY2hyb25pemVfZnVsbCgpLgo+ID4gCj4gPiBUaGlzIHRlc3Qg Z2V0cyBidWlsdCBhbmQgcnVuIHdoZW4gQ09ORklHX0RFQlVHX1ZNX1BHVEFCTEUgaXMgc2VsZWN0 ZWQuIEFueQo+ID4gYXJjaGl0ZWN0dXJlLCB3aGljaCBpcyB3aWxsaW5nIHRvIHN1YnNjcmliZSB0 aGlzIHRlc3Qgd2lsbCBuZWVkIHRvIHNlbGVjdAo+ID4gQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJM RS4gRm9yIG5vdyB0aGlzIGlzIGxpbWl0ZWQgdG8gYXJjLCBhcm02NCwgeDg2LCBzMzkwCj4gPiBh bmQgcHBjMzIgcGxhdGZvcm1zIHdoZXJlIHRoZSB0ZXN0IGlzIGtub3duIHRvIGJ1aWxkIGFuZCBy dW4gc3VjY2Vzc2Z1bGx5Lgo+ID4gR29pbmcgZm9yd2FyZCwgb3RoZXIgYXJjaGl0ZWN0dXJlcyB0 b28gY2FuIHN1YnNjcmliZSB0aGUgdGVzdCBhZnRlciBmaXhpbmcKPiA+IGFueSBidWlsZCBvciBy dW50aW1lIHByb2JsZW1zIHdpdGggdGhlaXIgcGFnZSB0YWJsZSBoZWxwZXJzLiBNZWFud2hpbGUg Zm9yCj4gPiBiZXR0ZXIgcGxhdGZvcm0gY292ZXJhZ2UsIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIGVu YWJsZWQgd2l0aCBDT05GSUdfRVhQRVJUCj4gPiBldmVuIHdpdGhvdXQgQVJDSF9IQVNfREVCVUdf Vk1fUEdUQUJMRS4KPiA+IAo+ID4gRm9sa3MgaW50ZXJlc3RlZCBpbiBtYWtpbmcgc3VyZSB0aGF0 IGEgZ2l2ZW4gcGxhdGZvcm0ncyBwYWdlIHRhYmxlIGhlbHBlcnMKPiA+IGNvbmZvcm0gdG8gZXhw ZWN0ZWQgZ2VuZXJpYyBNTSBzZW1hbnRpY3Mgc2hvdWxkIGVuYWJsZSB0aGUgYWJvdmUgY29uZmln Cj4gPiB3aGljaCB3aWxsIGp1c3QgdHJpZ2dlciB0aGlzIHRlc3QgZHVyaW5nIGJvb3QuIEFueSBu b24gY29uZm9ybWl0eSBoZXJlIHdpbGwKPiA+IGJlIHJlcG9ydGVkIGFzIGFuIHdhcm5pbmcgd2hp Y2ggd291bGQgbmVlZCB0byBiZSBmaXhlZC4gVGhpcyB0ZXN0IHdpbGwgaGVscAo+ID4gY2F0Y2gg YW55IGNoYW5nZXMgdG8gdGhlIGFncmVlZCB1cG9uIHNlbWFudGljcyBleHBlY3RlZCBmcm9tIGdl bmVyaWMgTU0gYW5kCj4gPiBlbmFibGUgcGxhdGZvcm1zIHRvIGFjY29tbW9kYXRlIGl0IHRoZXJl YWZ0ZXIuCj4gCj4gSG93IHVzZWZ1bCBpcyB0aGlzIHRoYXQgc3RyYWlnaHRseSBjcmFzaCB0aGUg cG93ZXJwYz8KCkFuZCB0aGVuIGdlbmVyYXRlIHdhcm5pbmdzIG9uIGFybTY0LAoKW8KgwqAxNDYu NjM0NjI2XVvCoMKgwqDCoFQxXSBkZWJ1Z192bV9wZ3RhYmxlOiBkZWJ1Z192bV9wZ3RhYmxlOiBW YWxpZGF0aW5nCmFyY2hpdGVjdHVyZSBwYWdlIHRhYmxlIGhlbHBlcnMKW8KgwqAxNDYuNjQzOTk1 XVvCoMKgwqDCoFQxXSAtLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS0KW8KgwqAx NDYuNjQ5MzUwXVvCoMKgwqDCoFQxXSB2aXJ0X3RvX3BoeXMgdXNlZCBmb3Igbm9uLWxpbmVhciBh ZGRyZXNzOgooX19fX3B0cnZhbF9fX18pIChzdGFydF9rZXJuZWwrMHgwLzB4NTgwKQpbwqDCoDE0 Ni42NTg4NDBdW8KgwqDCoMKgVDFdIFdBUk5JTkc6IENQVTogMTY1IFBJRDogMSBhdCBhcmNoL2Fy bTY0L21tL3BoeXNhZGRyLmM6MTUKX192aXJ0X3RvX3BoeXMrMHg5OC8weGUwClvCoMKgMTQ2LjY2 Nzk3Nl1bwqDCoMKgwqBUMV0gTW9kdWxlcyBsaW5rZWQgaW46ClvCoMKgMTQ2LjY3MTc0MV1bwqDC oMKgwqBUMV0gQ1BVOiAxNjUgUElEOiAxIENvbW06IHN3YXBwZXIvMCBUYWludGVkOgpHwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBMwqDCoMKgwqA1LjYuMC1yYzMtbmV4dC0yMDIwMDIyNiAjMQpb wqDCoDE0Ni42ODEzOTddW8KgwqDCoMKgVDFdIEhhcmR3YXJlIG5hbWU6IEhQRSBBcG9sbG8KNzDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC9DMDFfQVBBQ0hFX01CwqDCoMKgwqDCoMKgwqDCoMKg LCBCSU9TIEw1MF81LjEzXzEuMTEgMDYvMTgvMjAxOQpbwqDCoDE0Ni42OTE4NDBdW8KgwqDCoMKg VDFdIHBzdGF0ZTogNjA0MDAwMDkgKG5aQ3YgZGFpZiArUEFOIC1VQU8pClvCoMKgMTQ2LjY5NzMz NF1bwqDCoMKgwqBUMV0gcGMgOiBfX3ZpcnRfdG9fcGh5cysweDk4LzB4ZTAKW8KgwqAxNDYuNzAy MDQ1XVvCoMKgwqDCoFQxXSBsciA6IF9fdmlydF90b19waHlzKzB4OTgvMHhlMApbwqDCoDE0Ni43 MDY3NTNdW8KgwqDCoMKgVDFdIHNwIDogMThmZjAwMDgyYjdhZmUxMApbwqDCoDE0Ni43MTA3NjZd W8KgwqDCoMKgVDFdIHgyOTogMThmZjAwMDgyYjdhZmUzMCB4Mjg6IDAwMDAwMDAwMDAwMDAwMDDC oApbwqDCoDE0Ni43MTY3ODJdW8KgwqDCoMKgVDFdIHgyNzogMDAwMDAwMDAwMDAwMDAwMCB4MjY6 IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43MjI3OThdW8KgwqDCoMKgVDFdIHgyNTogMDAw MDAwMDAwMDAwMDAwMCB4MjQ6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43Mjg4MTNdW8Kg wqDCoMKgVDFdIHgyMzogMDAwMDAwMDAwMDAwMDAwMCB4MjI6IDAwMDAwMDAwMDAwMDAwMDDCoApb wqDCoDE0Ni43MzQ4MjddW8KgwqDCoMKgVDFdIHgyMTogMDAwMDAwMDAwMDAwMDAwMCB4MjA6IGZm ZmY5MDAwMTM1YjQwMDDCoApbwqDCoDE0Ni43NDA4NDJdW8KgwqDCoMKgVDFdIHgxOTogZmZmZjkw MDAxMTIwMDg1OCB4MTg6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43NDY4NTddW8KgwqDC oMKgVDFdIHgxNzogMDAwMDAwMDAwMDAwMDAwMCB4MTY6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDC oDE0Ni43NTI4NzJdW8KgwqDCoMKgVDFdIHgxNTogMDAwMDAwMDAwMDAwMDAwMCB4MTQ6IDMwNzgz MDJiNmM2NTZlNzLCoApbwqDCoDE0Ni43NTg4ODddW8KgwqDCoMKgVDFdIHgxMzogNjU2YjVmNzQ3 MjYxNzQ3MyB4MTI6IGZmZmY5MDAwMTM2OWVhOTDCoApbwqDCoDE0Ni43NjQ5MDFdW8KgwqDCoMKg VDFdIHgxMTogMDAwMDAwMDAwMDAwMDBjOSB4MTA6IGZmZmY4MDAwODJiNzZjMGXCoApbwqDCoDE0 Ni43NzA5MTddW8KgwqDCoMKgVDFdIHg5IDogOWQ2YTJlMjI2MDQwMTMwMCB4OCA6IDlkNmEyZTIy NjA0MDEzMDDCoApbwqDCoDE0Ni43NzY5MzJdW8KgwqDCoMKgVDFdIHg3IDogYWFhYWFhYWFhYWFh YWFhYSB4NiA6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43ODI5NDZdW8KgwqDCoMKgVDFd IHg1IDogMDAwMDAwMDAwMDAwMDA4MCB4NCA6IDAwMDAwMDAwMDAwMDAwMDDCoApbwqDCoDE0Ni43 ODg5NjBdW8KgwqDCoMKgVDFdIHgzIDogMDAwMDAwMDAwMDAwMDAxMCB4MiA6IDAwMDAwMDAwMDAw MDAwMDjCoApbwqDCoDE0Ni43OTQ5NzVdW8KgwqDCoMKgVDFdIHgxIDogMDAwMDAwMDAwMDAwMDAw NiB4MCA6IDAwMDAwMDAwMDAwMDAwNTPCoApbwqDCoDE0Ni44MDA5OTBdW8KgwqDCoMKgVDFdIENh bGwgdHJhY2U6ClvCoMKgMTQ2LjgwNDE0MF1bwqDCoMKgwqBUMV3CoMKgX192aXJ0X3RvX3BoeXMr MHg5OC8weGUwClvCoMKgMTQ2LjgwODUxMl1bwqDCoMKgwqBUMV3CoMKgZGVidWdfdm1fcGd0YWJs ZSsweDc0LzB4M2ZjClvCoMKgMTQ2LjgxMzE0MF1bwqDCoMKgwqBUMV3CoMKga2VybmVsX2luaXQr MHgxYy8weDIwOApbwqDCoDE0Ni44MTczMzRdW8KgwqDCoMKgVDFdwqDCoHJldF9mcm9tX2Zvcmsr MHgxMC8weDE4ClvCoMKgMTQ2LjgyMTYwOF1bwqDCoMKgwqBUMV0gaXJxIGV2ZW50IHN0YW1wOiAx OTg0MzM4OApbwqDCoDE0Ni44MjU5NzhdW8KgwqDCoMKgVDFdIGhhcmRpcnFzIGxhc3TCoMKgZW5h YmxlZCBhdCAoMTk4NDMzODcpOgpbPGZmZmY5MDAwMTAxZDk1OWM+XSBjb25zb2xlX3VubG9jaysw eDhkMC8weDk3MApbwqDCoDE0Ni44MzU1NTNdW8KgwqDCoMKgVDFdIGhhcmRpcnFzIGxhc3QgZGlz YWJsZWQgYXQgKDE5ODQzMzg4KToKWzxmZmZmOTAwMDEwMGFkMGUwPl0gZG9fZGVidWdfZXhjZXB0 aW9uKzB4NTgvMHgyY2MKW8KgwqAxNDYuODQ1Mzg3XVvCoMKgwqDCoFQxXSBzb2Z0aXJxcyBsYXN0 wqDCoGVuYWJsZWQgYXQgKDE5ODQzMzg0KToKWzxmZmZmOTAwMDEwMDgxYjhjPl0gX19kb19zb2Z0 aXJxKzB4ODY0LzB4OTAwClvCoMKgMTQ2Ljg1NDc5Nl1bwqDCoMKgwqBUMV0gc29mdGlycXMgbGFz dCBkaXNhYmxlZCBhdCAoMTk4NDMzNzcpOgpbPGZmZmY5MDAwMTAxMjBiNzA+XSBpcnFfZXhpdCsw eDFjOC8weDIzOApbwqDCoDE0Ni44NjM4NDVdW8KgwqDCoMKgVDFdIC0tLVsgZW5kIHRyYWNlIDMx Njc4ZDllODQ1ZGZmODkgXS0tLQoKPiAKPiBbwqDCoMKgMjMuMjYzNDI1XVvCoMKgwqDCoFQxXSBk ZWJ1Z192bV9wZ3RhYmxlOiBkZWJ1Z192bV9wZ3RhYmxlOiBWYWxpZGF0aW5nCj4gYXJjaGl0ZWN0 dXJlIHBhZ2UgdGFibGUgaGVscGVycwo+IFvCoMKgwqAyMy4yNjM2MjVdW8KgwqDCoMKgVDFdIC0t LS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLQo+IFvCoMKgwqAyMy4yNjM2NDldW8Kg wqDCoMKgVDFdIGtlcm5lbCBCVUcgYXQgYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYzoyNzQhCj4g W8KgwqDCoDIzLjI2MzY3NV1bwqDCoMKgwqBUMV0gT29wczogRXhjZXB0aW9uIGluIGtlcm5lbCBt b2RlLCBzaWc6IDUgWyMxXQo+IFvCoMKgwqAyMy4yNjM2OThdW8KgwqDCoMKgVDFdIExFIFBBR0Vf U0laRT02NEsgTU1VPVJhZGl4IFNNUCBOUl9DUFVTPTI1Ngo+IERFQlVHX1BBR0VBTExPQyBOVU1B IFBvd2VyTlYKPiBbwqDCoMKgMjMuMjYzNzMxXVvCoMKgwqDCoFQxXSBNb2R1bGVzIGxpbmtlZCBp bjoKPiBbwqDCoMKgMjMuMjYzNzUyXVvCoMKgwqDCoFQxXSBDUFU6IDQgUElEOiAxIENvbW06IHN3 YXBwZXIvMCBOb3QgdGFpbnRlZCA1LjYuMC1yYzMtbmV4dC0KPiAyMDIwMDIyNiAjMQo+IFvCoMKg wqAyMy4yNjM3NzZdW8KgwqDCoMKgVDFdIE5JUDrCoMKgYzAwMDAwMDAwMDA3MzA4YyBMUjogYzAw MDAwMDAwMTAzZGJkOCBDVFI6Cj4gMDAwMDAwMDAwMDAwMDAwMAo+IFvCoMKgwqAyMy4yNjM4MTBd W8KgwqDCoMKgVDFdIFJFR1M6IGMwMDAwMDAwM2RkYWY5YzAgVFJBUDogMDcwMMKgwqDCoE5vdCB0 YWludGVkwqDCoCg1LjYuMC0KPiByYzMtbmV4dC0yMDIwMDIyNikKPiBbwqDCoMKgMjMuMjYzODQ2 XVvCoMKgwqDCoFQxXSBNU1I6wqDCoDkwMDAwMDAwMDAwMjkwMzMgPFNGLEhWLEVFLE1FLElSLERS LFJJLExFPsKgwqBDUjoKPiAyMjAwMDIyOMKgwqBYRVI6IDAwMDAwMDAwCj4gW8KgwqDCoDIzLjI2 Mzg4OF1bwqDCoMKgwqBUMV0gQ0ZBUjogYzAwMDAwMDAwMDA3MzAzMCBJUlFNQVNLOiAwwqAKPiBb wqDCoMKgMjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwMDogYzAwMDAwMDAwMTAzZGJkOCBjMDAw MDAwMDNkZGFmYzUwIGMwMDAwMDAwMDE2NTZmMDAKPiBjMDAwMDAxZDdiNGNhMDgwwqAKPiBbwqDC oMKgMjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwNDogMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAw MDAwMDAwMDA5IGMwMDAwMDAwM2RkYWZjMDQKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKg MjMuMjYzODg4XVvCoMKgwqDCoFQxXSBHUFIwODogZjBmZmZmZmZmZmZmZmZmZiAwMDAwMDAwMDAw MDAwMDAxIGMwMDAwMDAwMDE2Mjc5ZDAKPiAwMDAwMDAwMDAwMGEwMDAwwqAKPiBbwqDCoMKgMjMu MjYzODg4XVvCoMKgwqDCoFQxXSBHUFIxMjogMDAwMDAwMDAwMDAwMDAwMCBjMDAwMDAxZmZmZmZh ZTAwIGMwMDAwMDAwMDAwMTBlODQKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKgMjMuMjYz ODg4XVvCoMKgwqDCoFQxXSBHUFIxNjogMDAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMTA1 IDAwMDAwMDAwMDAwMDAxMDAKPiBjMDAwMDAwMDAxNjg5YTE4wqAKPiBbwqDCoMKgMjMuMjYzODg4 XVvCoMKgwqDCoFQxXSBHUFIyMDogYzAwMDIwMDMyYzY2MDAwMCBjMDAwMjAwMzJjNjIwMDAwIGMw MDAwMDAwMDE3MTYwMzAKPiBjMDAwMjAwMzJjNjAwMDAwwqAKPiBbwqDCoMKgMjMuMjYzODg4XVvC oMKgwqDCoFQxXSBHUFIyNDogMDAwMDAwMDAwMDAwMDAwZCBjMDAwMDAwMDAxNzE2MDMwIGMwMDAw MDFkN2I0Y2EwODAKPiBjMDAwMDAwMDAxNzE2MDQwwqAKPiBbwqDCoMKgMjMuMjYzODg4XVvCoMKg wqDCoFQxXSBHUFIyODogYzAwMDAwMDAwMTcxNjAzOCAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAw MDAwMDAwMDAKPiAwMDAwMDAwMDAwMDAwMDAwwqAKPiBbwqDCoMKgMjMuMjY0MTIyXVvCoMKgwqDC oFQxXSBOSVAgW2MwMDAwMDAwMDAwNzMwOGNdIGFzc2VydF9wdGVfbG9ja2VkKzB4MTFjLzB4MzIw Cj4gW8KgwqDCoDIzLjI2NDE1NF1bwqDCoMKgwqBUMV0gTFIgW2MwMDAwMDAwMDEwM2RiZDhdIGRl YnVnX3ZtX3BndGFibGUrMHg3NzAvMHhiN2MKPiBbwqDCoMKgMjMuMjY0MTg2XVvCoMKgwqDCoFQx XSBDYWxsIFRyYWNlOgo+IFvCoMKgwqAyMy4yNjQyMDZdW8KgwqDCoMKgVDFdIFtjMDAwMDAwMDNk ZGFmYzUwXSBbYzAwMDAwMDAwMDk5OTc2MF0KPiBfcmF3X3NwaW5fdW5sb2NrKzB4MzAvMHg3MCAo dW5yZWxpYWJsZSkKPiBbwqDCoMKgMjMuMjY0MjQ0XVvCoMKgwqDCoFQxXSBbYzAwMDAwMDAzZGRh ZmNkMF0gW2MwMDAwMDAwMDEwM2Q5MjRdCj4gZGVidWdfdm1fcGd0YWJsZSsweDRiYy8weGI3Ywo+ IFvCoMKgwqAyMy4yNjQyNzldW8KgwqDCoMKgVDFdIFtjMDAwMDAwMDNkZGFmZGIwXSBbYzAwMDAw MDAwMDAxMGVhY10KPiBrZXJuZWxfaW5pdCsweDMwLzB4MTk0Cj4gW8KgwqDCoDIzLjI2NDMxNV1b wqDCoMKgwqBUMV0gW2MwMDAwMDAwM2RkYWZlMjBdIFtjMDAwMDAwMDAwMDBiNzQ4XQo+IHJldF9m cm9tX2tlcm5lbF90aHJlYWQrMHg1Yy8weDc0Cj4gW8KgwqDCoDIzLjI2NDM0OV1bwqDCoMKgwqBU MV0gSW5zdHJ1Y3Rpb24gZHVtcDoKPiBbwqDCoMKgMjMuMjY0MzY4XVvCoMKgwqDCoFQxXSA2MDAw MDAwMCAzYmUwMDAwMSA3ZmJlZjQzNiBlYWZhMDA0MCA3ZmZmYzAzMCAzYmZmZmZmZgo+IDdmZmYw N2I0IDdmZmZmMDM4wqAKPiBbwqDCoMKgMjMuMjY0NDA5XVvCoMKgwqDCoFQxXSA3YmZmMWYyNCA3 ZDM3ZjgyYSA3ZDI5MDA3NCA3OTI5ZDE4MiA8MGIwOTAwMDA+IGViZGIwMDAwCj4gZTkzYzAwMDAg N2ZkZTRhMTTCoAo+IFvCoMKgwqAyMy4yNjQ0NjBdW8KgwqDCoMKgVDFdIC0tLVsgZW5kIHRyYWNl IDcyZDI5MzEwMjJlOWFiMjQgXS0tLQo+IFvCoMKgwqAyMy42MjczMTFdW8KgwqDCoMKgVDFdwqAK PiBbwqDCoMKgMjQuNjI3NDA3XVvCoMKgwqDCoFQxXSBLZXJuZWwgcGFuaWMgLSBub3Qgc3luY2lu ZzogRmF0YWwgZXhjZXB0aW9uCj4gW8KgwqDCoDI2LjUKPiAKPiA+IAo+ID4gQ2M6IEFuZHJldyBN b3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5vcmc+Cj4gPiBDYzogTWlrZSBSYXBvcG9ydCA8 cnBwdEBsaW51eC5pYm0uY29tPgo+ID4gQ2M6IFZpbmVldCBHdXB0YSA8dmd1cHRhQHN5bm9wc3lz LmNvbT4KPiA+IENjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tPgo+ ID4gQ2M6IFdpbGwgRGVhY29uIDx3aWxsQGtlcm5lbC5vcmc+Cj4gPiBDYzogQmVuamFtaW4gSGVy cmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgo+ID4gQ2M6IFBhdWwgTWFja2Vy cmFzIDxwYXVsdXNAc2FtYmEub3JnPgo+ID4gQ2M6IE1pY2hhZWwgRWxsZXJtYW4gPG1wZUBlbGxl cm1hbi5pZC5hdT4KPiA+IENjOiBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJt LmNvbT4KPiA+IENjOiBWYXNpbHkgR29yYmlrIDxnb3JAbGludXguaWJtLmNvbT4KPiA+IENjOiBD aHJpc3RpYW4gQm9ybnRyYWVnZXIgPGJvcm50cmFlZ2VyQGRlLmlibS5jb20+Cj4gPiBDYzogVGhv bWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+Cj4gPiBDYzogSW5nbyBNb2xuYXIgPG1p bmdvQHJlZGhhdC5jb20+Cj4gPiBDYzogQm9yaXNsYXYgUGV0a292IDxicEBhbGllbjguZGU+Cj4g PiBDYzogIkguIFBldGVyIEFudmluIiA8aHBhQHp5dG9yLmNvbT4KPiA+IENjOiBLaXJpbGwgQS4g U2h1dGVtb3YgPGtpcmlsbEBzaHV0ZW1vdi5uYW1lPgo+ID4gQ2M6IFBhdWwgV2FsbXNsZXkgPHBh dWwud2FsbXNsZXlAc2lmaXZlLmNvbT4KPiA+IENjOiBQYWxtZXIgRGFiYmVsdCA8cGFsbWVyQGRh YmJlbHQuY29tPgo+ID4gQ2M6IGxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+ IENjOiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiA+IENjOiBsaW51eHBw Yy1kZXZAbGlzdHMub3psYWJzLm9yZwo+ID4gQ2M6IGxpbnV4LXMzOTBAdmdlci5rZXJuZWwub3Jn Cj4gPiBDYzogbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwo+ID4gQ2M6IHg4NkBrZXJu ZWwub3JnCj4gPiBDYzogbGludXgtYXJjaEB2Z2VyLmtlcm5lbC5vcmcKPiA+IENjOiBsaW51eC1r ZXJuZWxAdmdlci5rZXJuZWwub3JnCj4gPiAKPiA+IFN1Z2dlc3RlZC1ieTogQ2F0YWxpbiBNYXJp bmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNvbT4KPiA+IFJldmlld2VkLWJ5OiBJbmdvIE1vbG5h ciA8bWluZ29Aa2VybmVsLm9yZz4KPiA+IFRlc3RlZC1ieTogR2VyYWxkIFNjaGFlZmVyIDxnZXJh bGQuc2NoYWVmZXJAZGUuaWJtLmNvbT4JIyBzMzkwCj4gPiBUZXN0ZWQtYnk6IENocmlzdG9waGUg TGVyb3kgPGNocmlzdG9waGUubGVyb3lAYy1zLmZyPgkjIHBwYzMyCj4gPiBTaWduZWQtb2ZmLWJ5 OiBBbmRyZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnPgo+ID4gU2lnbmVkLW9m Zi1ieTogQ2hyaXN0b3BoZSBMZXJveSA8Y2hyaXN0b3BoZS5sZXJveUBjLXMuZnI+Cj4gPiBTaWdu ZWQtb2ZmLWJ5OiBBbnNodW1hbiBLaGFuZHVhbCA8YW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbT4K PiA+IC0tLQo+ID4gVGhpcyBhZGRzIGEgdGVzdCB2YWxpZGF0aW9uIGZvciBhcmNoaXRlY3R1cmUg ZXhwb3J0ZWQgcGFnZSB0YWJsZSBoZWxwZXJzLgo+ID4gUGF0Y2ggYWRkcyBiYXNpYyB0cmFuc2Zv cm1hdGlvbiB0ZXN0cyBhdCB2YXJpb3VzIGxldmVscyBvZiB0aGUgcGFnZSB0YWJsZS4KPiA+IAo+ ID4gVGhpcyB0ZXN0IHdhcyBvcmlnaW5hbGx5IHN1Z2dlc3RlZCBieSBDYXRhbGluIGR1cmluZyBh cm02NCBUSFAgbWlncmF0aW9uCj4gPiBSRkMgZGlzY3Vzc2lvbiBlYXJsaWVyLiBHb2luZyBmb3J3 YXJkIGl0IGNhbiBpbmNsdWRlIG1vcmUgc3BlY2lmaWMgdGVzdHMKPiA+IHdpdGggcmVzcGVjdCB0 byB2YXJpb3VzIGdlbmVyaWMgTU0gZnVuY3Rpb25zIGxpa2UgVEhQLCBIdWdlVExCIGV0YyBhbmQK PiA+IHBsYXRmb3JtIHNwZWNpZmljIHRlc3RzLgo+ID4gCj4gPiBodHRwczovL2xvcmUua2VybmVs Lm9yZy9saW51eC1tbS8yMDE5MDYyODEwMjAwMy5HQTU2NDYzQGFycmFraXMuZW1lYS5hcm0uY29t Lwo+ID4gCj4gPiBOZWVkcyB0byBiZSBhcHBsaWVkIG9uIGxpbnV4IFY1LjYtcmMyCj4gPiAKPiA+ IENoYW5nZXMgaW4gVjE0Ogo+ID4gCj4gPiAtIERpc2FibGVkIERFQlVHX1ZNX1BHRkxBR1MgZm9y IElBNjQgYW5kIEFSTSAoMzIgQml0KSBwZXIgQW5kcmV3IGFuZCBDaHJpc3RvcGhlCj4gPiAtIFVw ZGF0ZWQgREVCVUdfVk1fUEdGTEFHUyBkb2N1bWVudGF0aW9uIHdydCBFWFBFUlQgYW5kIGRpc2Fi bGVkIHBsYXRmb3Jtcwo+ID4gLSBVcGRhdGVkIFJBTkRPTV9bT1J8TlpdVkFMVUUgb3BlbiBlbmNv ZGluZ3Mgd2l0aCBHRU5NQVNLKCkgcGVyIENhdGFsaW4KPiA+IC0gVXBkYXRlZCBzMzkwIGNvbnN0 cmFpbnQgYml0cyBmcm9tIDEyIHRvIDQgKFMzOTBfTUFTS19CSVRTKSBwZXIgR2VyYWxkCj4gPiAt IFVwZGF0ZWQgaW4tY29kZSBkb2N1bWVudGF0aW9uIGZvciBSQU5ET01fT1JWQUxVRSBwZXIgR2Vy YWxkCj4gPiAtIFVwZGF0ZWQgcHh4X2Jhc2ljX3Rlc3RzKCkgdG8gdXNlIGludmVydCBmdW5jdGlv bnMgZmlyc3QgcGVyIENhdGFsaW4KPiA+IC0gRHJvcHBlZCBBUkNIX0hBU180TEVWRUxfSEFDSyBj aGVjayBmcm9tIHB1ZF9iYXNpY190ZXN0cygpCj4gPiAtIFJlcGxhY2VkIF9fQVJDSF9IQVNfWzR8 NV1MRVZFTF9IQUNLIHdpdGggX19QQUdFVEFCTEVfW1BVRHxQNERdX0ZPTERFRCBwZXIgQ2F0YWxp bgo+ID4gLSBUcmltbWVkIHRoZSBDQyBsaXN0IG9uIHRoZSBjb21taXQgbWVzc2FnZSBwZXIgQ2F0 YWxpbgo+ID4gCj4gPiBDaGFuZ2VzIGluIFYxMzogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MjM3MTI1KQo+ID4gCj4gPiAtIFN1YnNj cmliZWQgczM5MCBwbGF0Zm9ybSBhbmQgdXBkYXRlZCBkZWJ1Zy12bS1wZ3RhYmxlL2FyY2gtc3Vw cG9ydC50eHQgcGVyIEdlcmFsZAo+ID4gLSBEcm9wcGVkIGtleXdvcmQgJ2V4dGVybicgZnJvbSBk ZWJ1Z192bV9wZ3RhYmxlKCkgZGVjbGFyYXRpb24gcGVyIENocmlzdG9waGUKPiA+IC0gTW92ZWQg ZGVidWdfdm1fcGd0YWJsZSgpIGRlY2xhcmF0aW9ucyB0byA8bGludXgvbW1kZWJ1Zy5oPiBwZXIg Q2hyaXN0b3BoZQo+ID4gLSBNb3ZlZCBkZWJ1Z192bV9wZ3RhYmxlKCkgY2FsbCBzaXRlIGludG8g a2VybmVsX2luaXQoKSBwZXIgQ2hyaXN0b3BoZQo+ID4gLSBDaGFuZ2VkIENPTkZJR19ERUJVR19W TV9QR1RBQkxFIHJ1bGVzIHBlciBDaHJpc3RvcGhlCj4gPiAtIFVwZGF0ZWQgY29tbWl0IHRvIGlu Y2x1ZGUgbmV3IHN1cHBvcnRlZCBwbGF0Zm9ybXMgYW5kIGNoYW5nZWQgY29uZmlnIHNlbGVjdGlv bgo+ID4gCj4gPiBDaGFuZ2VzIGluIFYxMjogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcv cHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MjMzOTA1KQo+ID4gCj4gPiAtIFJlcGxhY2Vk IF9fbW1kcm9wKCkgd2l0aCBtbWRyb3AoKQo+ID4gLSBFbmFibGUgQVJDSF9IQVNfREVCVUdfVk1f UEdUQUJMRSBvbiBYODYgZm9yIG5vbiBDT05GSUdfWDg2X1BBRSBwbGF0Zm9ybXMgYXMgdGhlCj4g PiAgIHRlc3QgcHJvY2VkdXJlIGludGVyZmVyZSB3aXRoIHByZS1hbGxvY2F0ZWQgUE1EcyBhdHRh Y2hlZCB0byB0aGUgUEdEIHJlc3VsdGluZwo+ID4gICBpbiBydW50aW1lIGZhaWx1cmVzIHdpdGgg Vk1fQlVHX09OKCkKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMTE6IChodHRwczovL3BhdGNod29yay5r ZXJuZWwub3JnL3Byb2plY3QvbGludXgtbW0vbGlzdC8/c2VyaWVzPTIyMTEzNSkKPiA+IAo+ID4g LSBSZWJhc2VkIHRoZSBwYXRjaCBvbiBWNS40Cj4gPiAKPiA+IENoYW5nZXMgaW4gVjEwOiAoaHR0 cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0y MDU1MjkpCj4gPiAKPiA+IC0gQWx3YXlzIGVuYWJsZSBERUJVR19WTV9QR1RBQkxFIHdoZW4gREVC VUdfVk0gaXMgZW5hYmxlZCBwZXIgSW5nbwo+ID4gLSBBZGRlZCB0YWdzIGZyb20gSW5nbwo+ID4g Cj4gPiBDaGFuZ2VzIGluIFY5OiAoaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0 L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0yMDE0MjkpCj4gPiAKPiA+IC0gQ2hhbmdlZCBmZWF0dXJl IHN1cHBvcnQgZW51bWVyYXRpb24gZm9yIHBvd2VycGMgcGxhdGZvcm1zIHBlciBDaHJpc3RvcGhl Cj4gPiAtIENoYW5nZWQgY29uZmlnIHdyYXBwZXIgZm9yIGJhc2ljX1twbWR8cHVkXV90ZXN0cygp IHRvIGVuYWJsZSBBUkMgcGxhdGZvcm0KPiA+IC0gRW5hYmxlZCB0aGUgdGVzdCBvbiBBUkMgcGxh dGZvcm0KPiA+IAo+ID4gQ2hhbmdlcyBpbiBWODogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTk0Mjk3KQo+ID4gCj4gPiAtIEVuYWJs ZWQgQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRSBvbiBQUEMzMiBwbGF0Zm9ybSBwZXIgQ2hyaXN0 b3BoZQo+ID4gLSBVcGRhdGVkIGZlYXR1cmUgZG9jdW1lbnRhdGlvbiBhcyBERUJVR19WTV9QR1RB QkxFIGlzIG5vdyBlbmFibGVkIG9uIFBQQzMyIHBsYXRmb3JtCj4gPiAtIE1vdmVkIEFSQ0hfSEFT X0RFQlVHX1ZNX1BHVEFCTEUgZWFybGllciB0byBpbmRlbnQgaXQgd2l0aCBERUJVR19WTSBwZXIg Q2hyaXN0b3BoZQo+ID4gLSBBZGRlZCBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGluIGRlYnVnX3Zt X3BndGFibGUoKSBwZXIgQ2hyaXN0b3BoZQo+ID4gLSBEcm9wcGVkIHJhbmRvbV92YWRkciBib3Vu ZGFyeSBjb25kaXRpb24gY2hlY2tzIHBlciBDaHJpc3RvcGhlIGFuZCBRaWFuCj4gPiAtIFJlcGxh Y2VkIHZpcnRfYWRkcl92YWxpZCgpIGNoZWNrIHdpdGggcGZuX3ZhbGlkKCkgY2hlY2sgaW4gZGVi dWdfdm1fcGd0YWJsZSgpCj4gPiAtIFNsaWdodGx5IGNoYW5nZWQgcHJfZm10KGZtdCkgaW5mb3Jt YXRpb24KPiA+IAo+ID4gQ2hhbmdlcyBpbiBWNzogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5v cmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTkzMDUxKQo+ID4gCj4gPiAtIE1lbW9y eSBhbGxvY2F0aW9uIGFuZCBmcmVlIHJvdXRpbmVzIGZvciBtYXBwZWQgcGFnZXMgaGF2ZSBiZWVu IGRyb3BlZAo+ID4gLSBNYXBwZWQgcGZucyBhcmUgZGVyaXZlZCBmcm9tIHN0YW5kYXJkIGtlcm5l bCB0ZXh0IHN5bWJvbCBwZXIgTWF0dGhldwo+ID4gLSBNb3ZlZCBkZWJ1Z192bV9wZ3RhYWJsZSgp IGFmdGVyIHBhZ2VfYWxsb2NfaW5pdF9sYXRlKCkgcGVyIE1pY2hhbCBhbmQgUWlhbiAKPiA+IC0g VXBkYXRlZCB0aGUgY29tbWl0IG1lc3NhZ2UgcGVyIE1pY2hhbAo+ID4gLSBVcGRhdGVkIFc9MSBH Q0Mgd2FybmluZyBwcm9ibGVtIG9uIHg4NiBwZXIgUWlhbiBDYWkKPiA+IC0gQWRkaXRpb24gb2Yg bmV3IGFsbG9jX2NvbnRpZ19wYWdlcygpIGhlbHBlciBoYXMgYmVlbiBzdWJtaXR0ZWQgc2VwYXJh dGVseQo+ID4gCj4gPiBDaGFuZ2VzIGluIFY2OiAoaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9y Zy9wcm9qZWN0L2xpbnV4LW1tL2xpc3QvP3Nlcmllcz0xODc1ODkpCj4gPiAKPiA+IC0gTW92ZWQg YWxsb2NfZ2lnYW50aWNfcGFnZV9vcmRlcigpIGludG8gbW0vcGFnZV9hbGxvYy5jIHBlciBNaWNo YWwKPiA+IC0gTW92ZWQgYWxsb2NfZ2lnYW50aWNfcGFnZV9vcmRlcigpIHdpdGhpbiBDT05GSUdf Q09OVElHX0FMTE9DIGluIHRoZSB0ZXN0Cj4gPiAtIEZvbGRlZCBBbmRyZXcncyBpbmNsdWRlL2Fz bS1nZW5lcmljL3BndGFibGUuaCBmaXggaW50byB0aGUgdGVzdCBwYXRjaCAyLzIKPiA+IAo+ID4g Q2hhbmdlcyBpbiBWNTogKGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51 eC1tbS9saXN0Lz9zZXJpZXM9MTg1OTkxKQo+ID4gCj4gPiAtIFJlZGVmaW5lZCBhbmQgbW92ZWQg WDg2IG1tX3A0ZF9mb2xkZWQoKSBpbnRvIGEgZGlmZmVyZW50IGhlYWRlciBwZXIgS2lyaWxsL0lu Z28KPiA+IC0gVXBkYXRlZCB0aGUgY29uZmlnIG9wdGlvbiBjb21tZW50IHBlciBJbmdvIGFuZCBk cm9wcGVkICdrZXJuZWwgbW9kdWxlJyByZWZlcmVuY2UKPiA+IC0gVXBkYXRlZCB0aGUgY29tbWl0 IG1lc3NhZ2UgYW5kIGRyb3BwZWQgJ2tlcm5lbCBtb2R1bGUnIHJlZmVyZW5jZQo+ID4gLSBDaGFu Z2VkIERFQlVHX0FSQ0hfUEdUQUJMRV9URVNUIGludG8gREVCVUdfVk1fUEdUQUJMRSBwZXIgSW5n bwo+ID4gLSBNb3ZlZCBjb25maWcgb3B0aW9uIGZyb20gbW0vS2NvbmZpZy5kZWJ1ZyBpbnRvIGxp Yi9LY29uZmlnLmRlYnVnCj4gPiAtIFJlbmFtZWQgY29yZSB0ZXN0IGZ1bmN0aW9uIGFyY2hfcGd0 YWJsZV90ZXN0cygpIGFzIGRlYnVnX3ZtX3BndGFibGUoKQo+ID4gLSBSZW5hbWVkIG1tL2FyY2hf cGd0YWJsZV90ZXN0LmMgYXMgbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gPiAtIGRlYnVnX3ZtX3Bn dGFibGUoKSBnZXRzIGNhbGxlZCBmcm9tIGtlcm5lbF9pbml0X2ZyZWVhYmxlKCkgYWZ0ZXIgaW5p dF9tbV9pbnRlcm5hbHMoKQo+ID4gLSBBZGRlZCBhbiBlbnRyeSBpbiBEb2N1bWVudGF0aW9uL2Zl YXR1cmVzL2RlYnVnLyBwZXIgSW5nbwo+ID4gLSBFbmFibGVkIHRoZSB0ZXN0IG9uIGFybTY0IGFu ZCB4ODYgcGxhdGZvcm1zIGZvciBub3cKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWNDogKGh0dHBzOi8v cGF0Y2h3b3JrLmtlcm5lbC5vcmcvcHJvamVjdC9saW51eC1tbS9saXN0Lz9zZXJpZXM9MTgzNDY1 KQo+ID4gCj4gPiAtIERpc2FibGUgREVCVUdfQVJDSF9QR1RBQkxFX1RFU1QgZm9yIEFSTSBhbmQg SUE2NCBwbGF0Zm9ybXMKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMzogKGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL3BhdGNod29yay9wcm9qZWN0L2xrbWwvbGlzdC8/c2VyaWVzPTQxMTIxNikKPiA+IAo+ ID4gLSBDaGFuZ2VkIHRlc3QgdHJpZ2dlciBmcm9tIG1vZHVsZSBmb3JtYXQgaW50byBsYXRlX2lu aXRjYWxsKCkKPiA+IC0gTWFya2VkIGFsbCBmdW5jdGlvbnMgd2l0aCBfX2luaXQgdG8gYmUgZnJl ZWQgYWZ0ZXIgY29tcGxldGlvbgo+ID4gLSBDaGFuZ2VkIGFsbCBfX1BHVEFCTEVfUFhYX0ZPTERF RCBjaGVja3MgYXMgbW1fcHh4X2ZvbGRlZCgpCj4gPiAtIEZvbGRlZCBpbiBQUEMzMiBmaXhlcyBm cm9tIENocmlzdG9waGUKPiA+IAo+ID4gQ2hhbmdlcyBpbiBWMjoKPiA+IAo+ID4gaHR0cHM6Ly9s b3JlLmtlcm5lbC5vcmcvbGludXgtbW0vMTU2ODI2ODE3My0zMTMwMi0xLWdpdC1zZW5kLWVtYWls LWFuc2h1bWFuLmtoYW5kdWFsQGFybS5jb20vVC8jdAo+ID4gCj4gPiAtIEZpeGVkIHNtYWxsIHR5 cG8gZXJyb3IgaW4gTU9EVUxFX0RFU0NSSVBUSU9OKCkKPiA+IC0gRml4ZWQgbTY0ayBidWlsZCBw cm9ibGVtcyBmb3IgbHZhbHVlIGNvbmNlcm5zIGluIHBtZF94eHhfdGVzdHMoKQo+ID4gLSBGaXhl ZCBkeW5hbWljIHBhZ2UgdGFibGUgbGV2ZWwgZm9sZGluZyBwcm9ibGVtcyBvbiB4ODYgYXMgcGVy IEtpcnJpbAo+ID4gLSBGaXhlZCBzZWNvbmQgcG9pbnRlcnMgZHVyaW5nIHB4eF9wb3B1bGF0ZV90 ZXN0cygpIHBlciBLaXJpbGwgYW5kIEdlcmFsZAo+ID4gLSBBbGxvY2F0ZSBhbmQgZnJlZSBwdGUg dGFibGUgd2l0aCBwdGVfYWxsb2Nfb25lL3B0ZV9mcmVlIHBlciBLaXJpbGwKPiA+IC0gTW9kaWZp ZWQgcHh4X2NsZWFyX3Rlc3RzKCkgdG8gYWNjb21tb2RhdGUgczM5MCBsb3dlciAxMiBiaXRzIHNp dHVhdGlvbgo+ID4gLSBDaGFuZ2VkIFJBTkRPTV9OWlZBTFVFIHZhbHVlIGZyb20gMHhiZSB0byAw eGZmCj4gPiAtIENoYW5nZWQgYWxsb2NhdGlvbiwgdXNhZ2UsIGZyZWUgc2VxdWVuY2UgZm9yIHNh dmVkX3B0ZXAKPiA+IC0gUmVuYW1lZCBWTUFfRkxBR1MgYXMgVk1GTEFHUwo+ID4gLSBJbXBsZW1l bnRlZCBhIG5ldyBtZXRob2QgZm9yIHJhbmRvbSB2YWRkciBnZW5lcmF0aW9uCj4gPiAtIEltcGxl bWVudGVkIHNvbWUgb3RoZXIgY2xlYW51cHMKPiA+IC0gRHJvcHBlZCBleHRlcm4gcmVmZXJlbmNl IHRvIG1tX2FsbG9jKCkKPiA+IC0gQ3JlYXRlZCBhbmQgZXhwb3J0ZWQgbmV3IGFsbG9jX2dpZ2Fu dGljX3BhZ2Vfb3JkZXIoKQo+ID4gLSBEcm9wcGVkIHRoZSBjdXN0b20gYWxsb2NhdG9yIGFuZCB1 c2VkIG5ldyBhbGxvY19naWdhbnRpY19wYWdlX29yZGVyKCkKPiA+IAo+ID4gQ2hhbmdlcyBpbiBW MToKPiA+IAo+ID4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtbW0vMTU2NzQ5NzcwNi04 NjQ5LTEtZ2l0LXNlbmQtZW1haWwtYW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbS8KPiA+IAo+ID4g LSBBZGRlZCBmYWxsYmFjayBtZWNoYW5pc20gZm9yIFBNRCBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0 aW9uIGZhaWx1cmUKPiA+IAo+ID4gQ2hhbmdlcyBpbiBSRkMgVjI6Cj4gPiAKPiA+IGh0dHBzOi8v bG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tLzE1NjUzMzU5OTgtMjI1NTMtMS1naXQtc2VuZC1lbWFp bC1hbnNodW1hbi5raGFuZHVhbEBhcm0uY29tL1QvI3UKPiA+IAo+ID4gLSBNb3ZlZCB0ZXN0IG1v ZHVsZSBhbmQgaXQncyBjb25maWcgZnJvbSBsaWIvIHRvIG1tLwo+ID4gLSBSZW5hbWVkIGNvbmZp ZyBURVNUX0FSQ0hfUEdUQUJMRSBhcyBERUJVR19BUkNIX1BHVEFCTEVfVEVTVAo+ID4gLSBSZW5h bWVkIGZpbGUgZnJvbSB0ZXN0X2FyY2hfcGd0YWJsZS5jIHRvIGFyY2hfcGd0YWJsZV90ZXN0LmMK PiA+IC0gQWRkZWQgcmVsZXZhbnQgTU9EVUxFX0RFU0NSSVBUSU9OKCkgYW5kIE1PRFVMRV9BVVRI T1IoKSBkZXRhaWxzCj4gPiAtIERyb3BwZWQgbG9hZGFibGUgbW9kdWxlIGNvbmZpZyBvcHRpb24K PiA+IC0gQmFzaWMgdGVzdHMgbm93IHVzZSBtZW1vcnkgYmxvY2tzIHdpdGggcmVxdWlyZWQgc2l6 ZSBhbmQgYWxpZ25tZW50Cj4gPiAtIFBVRCBhbGlnbmVkIG1lbW9yeSBibG9jayBnZXRzIGFsbG9j YXRlZCB3aXRoIGFsbG9jX2NvbnRpZ19yYW5nZSgpCj4gPiAtIElmIFBVRCBhbGlnbmVkIG1lbW9y eSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGl0IGZhbGxzIGJhY2sgb24gUE1EIGFsaWduZWQKPiA+ ICAgbWVtb3J5IGJsb2NrIGZyb20gcGFnZSBhbGxvY2F0b3IgYW5kIHB1ZF8qIHRlc3RzIGFyZSBz a2lwcGVkCj4gPiAtIENsZWFyIGFuZCBwb3B1bGF0ZSB0ZXN0cyBub3cgb3BlcmF0ZSBvbiByZWFs IGluIG1lbW9yeSBwYWdlIHRhYmxlIGVudHJpZXMKPiA+IC0gRHVtbXkgbW1fc3RydWN0IGdldHMg YWxsb2NhdGVkIHdpdGggbW1fYWxsb2MoKQo+ID4gLSBEdW1teSBwYWdlIHRhYmxlIGVudHJpZXMg Z2V0IGFsbG9jYXRlZCB3aXRoIFtwdWR8cG1kfHB0ZV1fYWxsb2NfW21hcF0oKQo+ID4gLSBTaW1w bGlmaWVkIFtwNGR8cGdkXV9iYXNpY190ZXN0cygpLCBub3cgaGFzIHJhbmRvbSB2YWx1ZXMgaW4g dGhlIGVudHJpZXMKPiA+IAo+ID4gT3JpZ2luYWwgUkZDIFYxOgo+ID4gCj4gPiBodHRwczovL2xv cmUua2VybmVsLm9yZy9saW51eC1tbS8xNTY0MDM3NzIzLTI2Njc2LTEtZ2l0LXNlbmQtZW1haWwt YW5zaHVtYW4ua2hhbmR1YWxAYXJtLmNvbS8KPiA+IAo+ID4gCj4gPiAgLi4uL2RlYnVnL2RlYnVn LXZtLXBndGFibGUvYXJjaC1zdXBwb3J0LnR4dCAgIHwgIDM1ICsrCj4gPiAgYXJjaC9hcmMvS2Nv bmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICBhcmNoL2FybTY0 L0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gIGFyY2gvcG93 ZXJwYy9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCj4gPiAgYXJjaC9z MzkwL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICBhcmNo L3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwo+ID4gIGFy Y2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaCAgICAgICAgICAgICB8ICAgNiArCj4gPiAg aW5jbHVkZS9saW51eC9tbWRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgIHwgICA1ICsKPiA+ ICBpbml0L21haW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKwo+ ID4gIGxpYi9LY29uZmlnLmRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyNiAr Kwo+ID4gIG1tL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAg MSArCj4gPiAgbW0vZGVidWdfdm1fcGd0YWJsZS5jICAgICAgICAgICAgICAgICAgICAgICAgIHwg Mzg5ICsrKysrKysrKysrKysrKysrKwo+ID4gIDEyIGZpbGVzIGNoYW5nZWQsIDQ2OSBpbnNlcnRp b25zKCspCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vZmVhdHVyZXMvZGVi dWcvZGVidWctdm0tcGd0YWJsZS9hcmNoLXN1cHBvcnQudHh0Cj4gPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IG1tL2RlYnVnX3ZtX3BndGFibGUuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvRG9jdW1lbnRh dGlvbi9mZWF0dXJlcy9kZWJ1Zy9kZWJ1Zy12bS1wZ3RhYmxlL2FyY2gtc3VwcG9ydC50eHQgYi9E b2N1bWVudGF0aW9uL2ZlYXR1cmVzL2RlYnVnL2RlYnVnLXZtLXBndGFibGUvYXJjaC1zdXBwb3J0 LnR4dAo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uNjRk MGY5YjE1YzQ5Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1 cmVzL2RlYnVnL2RlYnVnLXZtLXBndGFibGUvYXJjaC1zdXBwb3J0LnR4dAo+ID4gQEAgLTAsMCAr MSwzNSBAQAo+ID4gKyMKPiA+ICsjIEZlYXR1cmUgbmFtZTogICAgICAgICAgZGVidWctdm0tcGd0 YWJsZQo+ID4gKyMgICAgICAgICBLY29uZmlnOiAgICAgICBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCj4gPiArIyAgICAgICAgIGRlc2NyaXB0aW9uOiAgIGFyY2ggc3VwcG9ydHMgcGd0YWJsZSB0 ZXN0cyBmb3Igc2VtYW50aWNzIGNvbXBsaWFuY2UKPiA+ICsjCj4gPiArICAgIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCj4gPiArICAgIHwgICAgICAgICBhcmNoIHxzdGF0dXN8Cj4gPiArICAgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiArICAgIHwgICAgICAgYWxwaGE6IHwgVE9ETyB8Cj4g PiArICAgIHwgICAgICAgICBhcmM6IHwgIG9rICB8Cj4gPiArICAgIHwgICAgICAgICBhcm06IHwg VE9ETyB8Cj4gPiArICAgIHwgICAgICAgYXJtNjQ6IHwgIG9rICB8Cj4gPiArICAgIHwgICAgICAg ICBjNng6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIGNza3k6IHwgVE9ETyB8Cj4gPiArICAg IHwgICAgICAgaDgzMDA6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgIGhleGFnb246IHwgVE9ETyB8 Cj4gPiArICAgIHwgICAgICAgIGlhNjQ6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIG02OGs6 IHwgVE9ETyB8Cj4gPiArICAgIHwgIG1pY3JvYmxhemU6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAg ICAgIG1pcHM6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgbmRzMzI6IHwgVE9ETyB8Cj4gPiAr ICAgIHwgICAgICAgbmlvczI6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgb3BlbnJpc2M6IHwgVE9E TyB8Cj4gPiArICAgIHwgICAgICBwYXJpc2M6IHwgVE9ETyB8Cj4gPiArICAgIHwgIHBvd2VycGMv MzI6IHwgIG9rICB8Cj4gPiArICAgIHwgIHBvd2VycGMvNjQ6IHwgVE9ETyB8Cj4gPiArICAgIHwg ICAgICAgcmlzY3Y6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgIHMzOTA6IHwgIG9rICB8Cj4g PiArICAgIHwgICAgICAgICAgc2g6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgc3BhcmM6IHwg VE9ETyB8Cj4gPiArICAgIHwgICAgICAgICAgdW06IHwgVE9ETyB8Cj4gPiArICAgIHwgICB1bmlj b3JlMzI6IHwgVE9ETyB8Cj4gPiArICAgIHwgICAgICAgICB4ODY6IHwgIG9rICB8Cj4gPiArICAg IHwgICAgICB4dGVuc2E6IHwgVE9ETyB8Cj4gPiArICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvS2NvbmZpZyBiL2FyY2gvYXJjL0tjb25maWcKPiA+ IGluZGV4IGZmMmEzOTNiNjM1Yy4uM2U3MmU2Y2YwZTQyIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9h cmMvS2NvbmZpZwo+ID4gKysrIGIvYXJjaC9hcmMvS2NvbmZpZwo+ID4gQEAgLTYsNiArNiw3IEBA Cj4gPiAgY29uZmlnIEFSQwo+ID4gIAlkZWZfYm9vbCB5Cj4gPiAgCXNlbGVjdCBBUkNfVElNRVJT Cj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RBQkxFCj4gPiAgCXNlbGVjdCBBUkNI X0hBU19ETUFfUFJFUF9DT0hFUkVOVAo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfUFRFX1NQRUNJQUwK PiA+ICAJc2VsZWN0IEFSQ0hfSEFTX1NFVFVQX0RNQV9PUFMKPiA+IGRpZmYgLS1naXQgYS9hcmNo L2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKPiA+IGluZGV4IDBiMzBlODg0ZTA4 OC4uYWFmOGJhNDE1MTQ1IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCj4gPiAr KysgYi9hcmNoL2FybTY0L0tjb25maWcKPiA+IEBAIC0xMSw2ICsxMSw3IEBAIGNvbmZpZyBBUk02 NAo+ID4gIAlzZWxlY3QgQUNQSV9QUFRUIGlmIEFDUEkKPiA+ICAJc2VsZWN0IEFSQ0hfQ0xPQ0tT T1VSQ0VfREFUQQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVCVUdfVklSVFVBTAo+ID4gKwlzZWxl Y3QgQVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVN X0lTX0FMTE9XRUQKPiA+ICAJc2VsZWN0IEFSQ0hfSEFTX0RNQV9QUkVQX0NPSEVSRU5UCj4gPiAg CXNlbGVjdCBBUkNIX0hBU19BQ1BJX1RBQkxFX1VQR1JBREUgaWYgQUNQSQo+ID4gZGlmZiAtLWdp dCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKPiA+IGluZGV4 IDQ5N2I3ZDBiMmQ3ZS4uOGQ1YWUxNGM1ZDRjIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9wb3dlcnBj L0tjb25maWcKPiA+ICsrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCj4gPiBAQCAtMTE2LDYgKzEx Niw3IEBAIGNvbmZpZyBQUEMKPiA+ICAJIwo+ID4gIAlzZWxlY3QgQVJDSF8zMkJJVF9PRkZfVCBp ZiBQUEMzMgo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfREVCVUdfVklSVFVBTAo+ID4gKwlzZWxlY3Qg QVJDSF9IQVNfREVCVUdfVk1fUEdUQUJMRSBpZiBQUEMzMgo+ID4gIAlzZWxlY3QgQVJDSF9IQVNf REVWTUVNX0lTX0FMTE9XRUQKPiA+ICAJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKPiA+ ICAJc2VsZWN0IEFSQ0hfSEFTX0ZPUlRJRllfU09VUkNFCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9z MzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwo+ID4gaW5kZXggOGFiZTc3NTM2ZDlkLi5h ZjI4NGRiYjA3ZTcgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3MzOTAvS2NvbmZpZwo+ID4gKysrIGIv YXJjaC9zMzkwL0tjb25maWcKPiA+IEBAIC01OSw2ICs1OSw3IEBAIGNvbmZpZyBLQVNBTl9TSEFE T1dfT0ZGU0VUCj4gPiAgY29uZmlnIFMzOTAKPiA+ICAJZGVmX2Jvb2wgeQo+ID4gIAlzZWxlY3Qg QVJDSF9CSU5GTVRfRUxGX1NUQVRFCj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCj4gPiAgCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAo+ID4gIAlzZWxlY3Qg QVJDSF9IQVNfRUxGX1JBTkRPTUlaRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNfRk9SVElGWV9TT1VS Q0UKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwo+ ID4gaW5kZXggYmVlYTc3MDQ2ZjliLi5kZjhhMTllNTJlODIgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNo L3g4Ni9LY29uZmlnCj4gPiArKysgYi9hcmNoL3g4Ni9LY29uZmlnCj4gPiBAQCAtNjEsNiArNjEs NyBAQCBjb25maWcgWDg2Cj4gPiAgCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0lOSVQKPiA+ICAJ c2VsZWN0IEFSQ0hfSEFTX0FDUElfVEFCTEVfVVBHUkFERQlpZiBBQ1BJCj4gPiAgCXNlbGVjdCBB UkNIX0hBU19ERUJVR19WSVJUVUFMCj4gPiArCXNlbGVjdCBBUkNIX0hBU19ERUJVR19WTV9QR1RB QkxFCWlmICFYODZfUEFFCj4gPiAgCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAo+ ID4gIAlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQo+ID4gIAlzZWxlY3QgQVJDSF9IQVNf RkFTVF9NVUxUSVBMSUVSCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0 YWJsZV82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCj4gPiBpbmRleCAw YjZjNDA0Mjk0MmEuLmZiMGU3NmQyNTRiMyAxMDA2NDQKPiA+IC0tLSBhL2FyY2gveDg2L2luY2x1 ZGUvYXNtL3BndGFibGVfNjQuaAo+ID4gKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJs ZV82NC5oCj4gPiBAQCAtNTMsNiArNTMsMTIgQEAgc3RhdGljIGlubGluZSB2b2lkIHN5bmNfaW5p dGlhbF9wYWdlX3RhYmxlKHZvaWQpIHsgfQo+ID4gIAo+ID4gIHN0cnVjdCBtbV9zdHJ1Y3Q7Cj4g PiAgCj4gPiArI2RlZmluZSBtbV9wNGRfZm9sZGVkIG1tX3A0ZF9mb2xkZWQKPiA+ICtzdGF0aWMg aW5saW5lIGJvb2wgbW1fcDRkX2ZvbGRlZChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKPiA+ICt7Cj4g PiArCXJldHVybiAhcGd0YWJsZV9sNV9lbmFibGVkKCk7Cj4gPiArfQo+ID4gKwo+ID4gIHZvaWQg c2V0X3B0ZV92YWRkcl9wNGQocDRkX3QgKnA0ZF9wYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyLCBw dGVfdCBuZXdfcHRlKTsKPiA+ICB2b2lkIHNldF9wdGVfdmFkZHJfcHVkKHB1ZF90ICpwdWRfcGFn ZSwgdW5zaWduZWQgbG9uZyB2YWRkciwgcHRlX3QgbmV3X3B0ZSk7Cj4gPiAgCj4gPiBkaWZmIC0t Z2l0IGEvaW5jbHVkZS9saW51eC9tbWRlYnVnLmggYi9pbmNsdWRlL2xpbnV4L21tZGVidWcuaAo+ ID4gaW5kZXggMmFkNzJkMmM4Y2M1Li41MzM5YWExNGI3NDkgMTAwNjQ0Cj4gPiAtLS0gYS9pbmNs dWRlL2xpbnV4L21tZGVidWcuaAo+ID4gKysrIGIvaW5jbHVkZS9saW51eC9tbWRlYnVnLmgKPiA+ IEBAIC02NCw0ICs2NCw5IEBAIHZvaWQgZHVtcF9tbShjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICpt bSk7Cj4gPiAgI2RlZmluZSBWTV9CVUdfT05fUEdGTEFHUyhjb25kLCBwYWdlKSBCVUlMRF9CVUdf T05fSU5WQUxJRChjb25kKQo+ID4gICNlbmRpZgo+ID4gIAo+ID4gKyNpZmRlZiBDT05GSUdfREVC VUdfVk1fUEdUQUJMRQo+ID4gK3ZvaWQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKTsKPiA+ICsjZWxz ZQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQpIHsgfQo+ID4g KyNlbmRpZgo+ID4gICNlbmRpZgo+ID4gZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9t YWluLmMKPiA+IGluZGV4IGNjMGVlNDg3MzQxOS4uYWRmMzdlOGIxZDY5IDEwMDY0NAo+ID4gLS0t IGEvaW5pdC9tYWluLmMKPiA+ICsrKyBiL2luaXQvbWFpbi5jCj4gPiBAQCAtOTQsNiArOTQsNyBA QAo+ID4gICNpbmNsdWRlIDxsaW51eC9yb2RhdGFfdGVzdC5oPgo+ID4gICNpbmNsdWRlIDxsaW51 eC9qdW1wX2xhYmVsLmg+Cj4gPiAgI2luY2x1ZGUgPGxpbnV4L21lbV9lbmNyeXB0Lmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L21tZGVidWcuaD4KPiA+ICAKPiA+ICAjaW5jbHVkZSA8YXNtL2lvLmg+ Cj4gPiAgI2luY2x1ZGUgPGFzbS9idWdzLmg+Cj4gPiBAQCAtMTMyMyw2ICsxMzI0LDcgQEAgc3Rh dGljIGludCBfX3JlZiBrZXJuZWxfaW5pdCh2b2lkICp1bnVzZWQpCj4gPiAgCWtlcm5lbF9pbml0 X2ZyZWVhYmxlKCk7Cj4gPiAgCS8qIG5lZWQgdG8gZmluaXNoIGFsbCBhc3luYyBfX2luaXQgY29k ZSBiZWZvcmUgZnJlZWluZyB0aGUgbWVtb3J5ICovCj4gPiAgCWFzeW5jX3N5bmNocm9uaXplX2Z1 bGwoKTsKPiA+ICsJZGVidWdfdm1fcGd0YWJsZSgpOwo+ID4gIAlmdHJhY2VfZnJlZV9pbml0X21l bSgpOwo+ID4gIAlmcmVlX2luaXRtZW0oKTsKPiA+ICAJbWFya19yZWFkb25seSgpOwo+ID4gZGlm ZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKPiA+IGluZGV4 IDY5ZGVmNGE5ZGYwMC4uMWI1YmQ5ZjdjOTY3IDEwMDY0NAo+ID4gLS0tIGEvbGliL0tjb25maWcu ZGVidWcKPiA+ICsrKyBiL2xpYi9LY29uZmlnLmRlYnVnCj4gPiBAQCAtNjUzLDYgKzY1MywxMiBA QCBjb25maWcgU0NIRURfU1RBQ0tfRU5EX0NIRUNLCj4gPiAgCSAgZGF0YSBjb3JydXB0aW9uIG9y IGEgc3BvcmFkaWMgY3Jhc2ggYXQgYSBsYXRlciBzdGFnZSBvbmNlIHRoZSByZWdpb24KPiA+ICAJ ICBpcyBleGFtaW5lZC4gVGhlIHJ1bnRpbWUgb3ZlcmhlYWQgaW50cm9kdWNlZCBpcyBtaW5pbWFs Lgo+ID4gIAo+ID4gK2NvbmZpZyBBUkNIX0hBU19ERUJVR19WTV9QR1RBQkxFCj4gPiArCWJvb2wK PiA+ICsJaGVscAo+ID4gKwkgIEFuIGFyY2hpdGVjdHVyZSBzaG91bGQgc2VsZWN0IHRoaXMgd2hl biBpdCBjYW4gc3VjY2Vzc2Z1bGx5Cj4gPiArCSAgYnVpbGQgYW5kIHJ1biBERUJVR19WTV9QR1RB QkxFLgo+ID4gKwo+ID4gIGNvbmZpZyBERUJVR19WTQo+ID4gIAlib29sICJEZWJ1ZyBWTSIKPiA+ ICAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKPiA+IEBAIC02ODgsNiArNjk0LDI2IEBAIGNvbmZp ZyBERUJVR19WTV9QR0ZMQUdTCj4gPiAgCj4gPiAgCSAgSWYgdW5zdXJlLCBzYXkgTi4KPiA+ICAK PiA+ICtjb25maWcgREVCVUdfVk1fUEdUQUJMRQo+ID4gKwlib29sICJEZWJ1ZyBhcmNoIHBhZ2Ug dGFibGUgZm9yIHNlbWFudGljcyBjb21wbGlhbmNlIgo+ID4gKwlkZXBlbmRzIG9uIE1NVQo+ID4g KwlkZXBlbmRzIG9uICFJQTY0ICYmICFBUk0KPiA+ICsJZGVwZW5kcyBvbiBBUkNIX0hBU19ERUJV R19WTV9QR1RBQkxFIHx8IEVYUEVSVAo+ID4gKwlkZWZhdWx0IG4gaWYgIUFSQ0hfSEFTX0RFQlVH X1ZNX1BHVEFCTEUKPiA+ICsJZGVmYXVsdCB5IGlmIERFQlVHX1ZNCj4gPiArCWhlbHAKPiA+ICsJ ICBUaGlzIG9wdGlvbiBwcm92aWRlcyBhIGRlYnVnIG1ldGhvZCB3aGljaCBjYW4gYmUgdXNlZCB0 byB0ZXN0Cj4gPiArCSAgYXJjaGl0ZWN0dXJlIHBhZ2UgdGFibGUgaGVscGVyIGZ1bmN0aW9ucyBv biB2YXJpb3VzIHBsYXRmb3JtcyBpbgo+ID4gKwkgIHZlcmlmeWluZyBpZiB0aGV5IGNvbXBseSB3 aXRoIGV4cGVjdGVkIGdlbmVyaWMgTU0gc2VtYW50aWNzLiBUaGlzCj4gPiArCSAgd2lsbCBoZWxw IGFyY2hpdGVjdHVyZSBjb2RlIGluIG1ha2luZyBzdXJlIHRoYXQgYW55IGNoYW5nZXMgb3IKPiA+ ICsJICBuZXcgYWRkaXRpb25zIG9mIHRoZXNlIGhlbHBlcnMgc3RpbGwgY29uZm9ybSB0byBleHBl Y3RlZAo+ID4gKwkgIHNlbWFudGljcyBvZiB0aGUgZ2VuZXJpYyBNTS4gUGxhdGZvcm1zIHdpbGwg aGF2ZSB0byBvcHQgaW4gZm9yCj4gPiArCSAgdGhpcyB0aHJvdWdoIEFSQ0hfSEFTX0RFQlVHX1ZN X1BHVEFCTEUuIEFsdGhvdWdoIGl0IGNhbiBhbHNvIGJlCj4gPiArCSAgZW5hYmxlZCB0aHJvdWdo IEVYUEVSVCB3aXRob3V0IHJlcXVpcmluZyBjb2RlIGNoYW5nZS4gVGhpcyB0ZXN0Cj4gPiArCSAg aXMgZGlzYWJsZWQgb24gSUE2NCBhbmQgQVJNIHBsYXRmb3JtcyB3aGVyZSBpdCBmYWlscyB0byBi dWlsZC4KPiA+ICsKPiA+ICsJICBJZiB1bnN1cmUsIHNheSBOLgo+ID4gKwo+ID4gIGNvbmZpZyBB UkNIX0hBU19ERUJVR19WSVJUVUFMCj4gPiAgCWJvb2wKPiA+ICAKPiA+IGRpZmYgLS1naXQgYS9t bS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCj4gPiBpbmRleCAyNzJlNjYwMzllNzAuLmIwNjkyZTZh NGI1OCAxMDA2NDQKPiA+IC0tLSBhL21tL01ha2VmaWxlCj4gPiArKysgYi9tbS9NYWtlZmlsZQo+ ID4gQEAgLTg3LDYgKzg3LDcgQEAgb2JqLSQoQ09ORklHX0hXUE9JU09OX0lOSkVDVCkgKz0gaHdw b2lzb24taW5qZWN0Lm8KPiA+ICBvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUspICs9IGttZW1s ZWFrLm8KPiA+ICBvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUtfVEVTVCkgKz0ga21lbWxlYWst dGVzdC5vCj4gPiAgb2JqLSQoQ09ORklHX0RFQlVHX1JPREFUQV9URVNUKSArPSByb2RhdGFfdGVz dC5vCj4gPiArb2JqLSQoQ09ORklHX0RFQlVHX1ZNX1BHVEFCTEUpICs9IGRlYnVnX3ZtX3BndGFi bGUubwo+ID4gIG9iai0kKENPTkZJR19QQUdFX09XTkVSKSArPSBwYWdlX293bmVyLm8KPiA+ICBv YmotJChDT05GSUdfQ0xFQU5DQUNIRSkgKz0gY2xlYW5jYWNoZS5vCj4gPiAgb2JqLSQoQ09ORklH X01FTU9SWV9JU09MQVRJT04pICs9IHBhZ2VfaXNvbGF0aW9uLm8KPiA+IGRpZmYgLS1naXQgYS9t bS9kZWJ1Z192bV9wZ3RhYmxlLmMgYi9tbS9kZWJ1Z192bV9wZ3RhYmxlLmMKPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAuLjcwYmY4ZWQ4ZmQ1MQo+ID4gLS0t IC9kZXYvbnVsbAo+ID4gKysrIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gPiBAQCAtMCwwICsx LDM4OSBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKPiA+ ICsvKgo+ID4gKyAqIFRoaXMga2VybmVsIHRlc3QgdmFsaWRhdGVzIGFyY2hpdGVjdHVyZSBwYWdl IHRhYmxlIGhlbHBlcnMgYW5kCj4gPiArICogYWNjZXNzb3JzIGFuZCBoZWxwcyBpbiB2ZXJpZnlp bmcgdGhlaXIgY29udGludWVkIGNvbXBsaWFuY2Ugd2l0aAo+ID4gKyAqIGV4cGVjdGVkIGdlbmVy aWMgTU0gc2VtYW50aWNzLgo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChDKSAyMDE5IEFSTSBM dGQuCj4gPiArICoKPiA+ICsgKiBBdXRob3I6IEFuc2h1bWFuIEtoYW5kdWFsIDxhbnNodW1hbi5r aGFuZHVhbEBhcm0uY29tPgo+ID4gKyAqLwo+ID4gKyNkZWZpbmUgcHJfZm10KGZtdCkgImRlYnVn X3ZtX3BndGFibGU6ICVzOiAiIGZtdCwgX19mdW5jX18KPiA+ICsKPiA+ICsjaW5jbHVkZSA8bGlu dXgvZ2ZwLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvaHVnZXRsYi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiA+ICsjaW5j bHVkZSA8bGludXgva2NvbmZpZy5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9tbS5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9tbWFuLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wZm5fdC5o Pgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcmFu ZG9tLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Cj4gPiArI2luY2x1ZGUgPGxp bnV4L3N3YXAuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgo+ID4gKyNpbmNsdWRl IDxsaW51eC9zdGFydF9rZXJuZWwuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc2NoZWQvbW0uaD4K PiA+ICsjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3BndGFibGUu aD4KPiA+ICsKPiA+ICsvKgo+ID4gKyAqIEJhc2ljIG9wZXJhdGlvbnMKPiA+ICsgKgo+ID4gKyAq IG1rb2xkKGVudHJ5KQkJCT0gQW4gb2xkIGFuZCBub3QgYSB5b3VuZyBlbnRyeQo+ID4gKyAqIG1r eW91bmcoZW50cnkpCQk9IEEgeW91bmcgYW5kIG5vdCBhbiBvbGQgZW50cnkKPiA+ICsgKiBta2Rp cnR5KGVudHJ5KQkJPSBBIGRpcnR5IGFuZCBub3QgYSBjbGVhbiBlbnRyeQo+ID4gKyAqIG1rY2xl YW4oZW50cnkpCQk9IEEgY2xlYW4gYW5kIG5vdCBhIGRpcnR5IGVudHJ5Cj4gPiArICogbWt3cml0 ZShlbnRyeSkJCT0gQSB3cml0ZSBhbmQgbm90IGEgd3JpdGUgcHJvdGVjdGVkIGVudHJ5Cj4gPiAr ICogd3Jwcm90ZWN0KGVudHJ5KQkJPSBBIHdyaXRlIHByb3RlY3RlZCBhbmQgbm90IGEgd3JpdGUg ZW50cnkKPiA+ICsgKiBweHhfYmFkKGVudHJ5KQkJPSBBIG1hcHBlZCBhbmQgbm9uLXRhYmxlIGVu dHJ5Cj4gPiArICogcHh4X3NhbWUoZW50cnkxLCBlbnRyeTIpCT0gQm90aCBlbnRyaWVzIGhvbGQg dGhlIGV4YWN0IHNhbWUgdmFsdWUKPiA+ICsgKi8KPiA+ICsjZGVmaW5lIFZNRkxBR1MJKFZNX1JF QUR8Vk1fV1JJVEV8Vk1fRVhFQykKPiA+ICsKPiA+ICsvKgo+ID4gKyAqIE9uIHMzOTAgcGxhdGZv cm0sIHRoZSBsb3dlciA0IGJpdHMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgZ2l2ZW4gcGFnZSB0YWJs ZQo+ID4gKyAqIGVudHJ5IHR5cGUuIEJ1dCB0aGVzZSBiaXRzIG1pZ2h0IGFmZmVjdCB0aGUgYWJp bGl0eSB0byBjbGVhciBlbnRyaWVzIHdpdGgKPiA+ICsgKiBweHhfY2xlYXIoKSBiZWNhdXNlIG9m IGhvdyBkeW5hbWljIHBhZ2UgdGFibGUgZm9sZGluZyB3b3JrcyBvbiBzMzkwLiBTbwo+ID4gKyAq IHdoaWxlIGxvYWRpbmcgdXAgdGhlIGVudHJpZXMgZG8gbm90IGNoYW5nZSB0aGUgbG93ZXIgNCBi aXRzLiBJdCBkb2VzIG5vdAo+ID4gKyAqIGhhdmUgYWZmZWN0IGFueSBvdGhlciBwbGF0Zm9ybS4K PiA+ICsgKi8KPiA+ICsjZGVmaW5lIFMzOTBfTUFTS19CSVRTCTQKPiA+ICsjZGVmaW5lIFJBTkRP TV9PUlZBTFVFCUdFTk1BU0soQklUU19QRVJfTE9ORyAtIDEsIFMzOTBfTUFTS19CSVRTKQo+ID4g KyNkZWZpbmUgUkFORE9NX05aVkFMVUUJR0VOTUFTSyg3LCAwKQo+ID4gKwo+ID4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwdGVfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCj4gPiArewo+ID4gKwlwdGVfdCBwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gPiArCj4g PiArCVdBUk5fT04oIXB0ZV9zYW1lKHB0ZSwgcHRlKSk7Cj4gPiArCVdBUk5fT04oIXB0ZV95b3Vu ZyhwdGVfbWt5b3VuZyhwdGVfbWtvbGQocHRlKSkpKTsKPiA+ICsJV0FSTl9PTighcHRlX2RpcnR5 KHB0ZV9ta2RpcnR5KHB0ZV9ta2NsZWFuKHB0ZSkpKSk7Cj4gPiArCVdBUk5fT04oIXB0ZV93cml0 ZShwdGVfbWt3cml0ZShwdGVfd3Jwcm90ZWN0KHB0ZSkpKSk7Cj4gPiArCVdBUk5fT04ocHRlX3lv dW5nKHB0ZV9ta29sZChwdGVfbWt5b3VuZyhwdGUpKSkpOwo+ID4gKwlXQVJOX09OKHB0ZV9kaXJ0 eShwdGVfbWtjbGVhbihwdGVfbWtkaXJ0eShwdGUpKSkpOwo+ID4gKwlXQVJOX09OKHB0ZV93cml0 ZShwdGVfd3Jwcm90ZWN0KHB0ZV9ta3dyaXRlKHB0ZSkpKSk7Cj4gPiArfQo+ID4gKwo+ID4gKyNp ZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ID4gK3sK PiA+ICsJcG1kX3QgcG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ID4gKwo+ID4gKwlXQVJOX09O KCFwbWRfc2FtZShwbWQsIHBtZCkpOwo+ID4gKwlXQVJOX09OKCFwbWRfeW91bmcocG1kX21reW91 bmcocG1kX21rb2xkKHBtZCkpKSk7Cj4gPiArCVdBUk5fT04oIXBtZF9kaXJ0eShwbWRfbWtkaXJ0 eShwbWRfbWtjbGVhbihwbWQpKSkpOwo+ID4gKwlXQVJOX09OKCFwbWRfd3JpdGUocG1kX21rd3Jp dGUocG1kX3dycHJvdGVjdChwbWQpKSkpOwo+ID4gKwlXQVJOX09OKHBtZF95b3VuZyhwbWRfbWtv bGQocG1kX21reW91bmcocG1kKSkpKTsKPiA+ICsJV0FSTl9PTihwbWRfZGlydHkocG1kX21rY2xl YW4ocG1kX21rZGlydHkocG1kKSkpKTsKPiA+ICsJV0FSTl9PTihwbWRfd3JpdGUocG1kX3dycHJv dGVjdChwbWRfbWt3cml0ZShwbWQpKSkpOwo+ID4gKwkvKgo+ID4gKwkgKiBBIGh1Z2UgcGFnZSBk b2VzIG5vdCBwb2ludCB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUKPiA+ICsJICogZW50cnkuIEhl bmNlIHRoaXMgbXVzdCBxdWFsaWZ5IGFzIHBtZF9iYWQoKS4KPiA+ICsJICovCj4gPiArCVdBUk5f T04oIXBtZF9iYWQocG1kX21raHVnZShwbWQpKSk7Cj4gPiArfQo+ID4gKwo+ID4gKyNpZmRlZiBD T05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BVRAo+ID4gK3N0YXRpYyB2b2lk IF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3Qp Cj4gPiArewo+ID4gKwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gPiArCj4gPiAr CVdBUk5fT04oIXB1ZF9zYW1lKHB1ZCwgcHVkKSk7Cj4gPiArCVdBUk5fT04oIXB1ZF95b3VuZyhw dWRfbWt5b3VuZyhwdWRfbWtvbGQocHVkKSkpKTsKPiA+ICsJV0FSTl9PTighcHVkX3dyaXRlKHB1 ZF9ta3dyaXRlKHB1ZF93cnByb3RlY3QocHVkKSkpKTsKPiA+ICsJV0FSTl9PTihwdWRfd3JpdGUo cHVkX3dycHJvdGVjdChwdWRfbWt3cml0ZShwdWQpKSkpOwo+ID4gKwlXQVJOX09OKHB1ZF95b3Vu ZyhwdWRfbWtvbGQocHVkX21reW91bmcocHVkKSkpKTsKPiA+ICsKPiA+ICsJaWYgKG1tX3BtZF9m b2xkZWQobW0pKQo+ID4gKwkJcmV0dXJuOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBBIGh1Z2Ug cGFnZSBkb2VzIG5vdCBwb2ludCB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUKPiA+ICsJICogZW50 cnkuIEhlbmNlIHRoaXMgbXVzdCBxdWFsaWZ5IGFzIHB1ZF9iYWQoKS4KPiA+ICsJICovCj4gPiAr CVdBUk5fT04oIXB1ZF9iYWQocHVkX21raHVnZShwdWQpKSk7Cj4gPiArfQo+ID4gKyNlbHNlCj4g PiArc3RhdGljIHZvaWQgX19pbml0IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwg cGdwcm90X3QgcHJvdCkgeyB9Cj4gPiArI2VuZGlmCj4gPiArI2Vsc2UKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90 KSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxv bmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICtzdGF0aWMg dm9pZCBfX2luaXQgcDRkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KQo+ID4gK3sKPiA+ICsJcDRkX3QgcDRkOwo+ID4gKwo+ID4gKwltZW1zZXQoJnA0ZCwgUkFO RE9NX05aVkFMVUUsIHNpemVvZihwNGRfdCkpOwo+ID4gKwlXQVJOX09OKCFwNGRfc2FtZShwNGQs IHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcGdkX2Jhc2ljX3Rl c3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ID4gK3sKPiA+ICsJcGdkX3Qg cGdkOwo+ID4gKwo+ID4gKwltZW1zZXQoJnBnZCwgUkFORE9NX05aVkFMVUUsIHNpemVvZihwZ2Rf dCkpOwo+ID4gKwlXQVJOX09OKCFwZ2Rfc2FtZShwZ2QsIHBnZCkpOwo+ID4gK30KPiA+ICsKPiA+ ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BVRF9GT0xERUQKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cHVkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkcCkKPiA+ICt7 Cj4gPiArCXB1ZF90IHB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gPiArCj4gPiArCWlmIChtbV9w bWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcHVkID0gX19wdWQocHVk X3ZhbChwdWQpIHwgUkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpwdWRwLCBwdWQp Owo+ID4gKwlwdWRfY2xlYXIocHVkcCk7Cj4gPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4g PiArCVdBUk5fT04oIXB1ZF9ub25lKHB1ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcHVkX3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAq cHVkcCwKPiA+ICsJCQkJICAgICAgcG1kX3QgKnBtZHApCj4gPiArewo+ID4gKwlwdWRfdCBwdWQ7 Cj4gPiArCj4gPiArCWlmIChtbV9wbWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsJ LyoKPiA+ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZlbCBwYWdlIHRhYmxlIHBh Z2UuCj4gPiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBhcyBwdWRfYmFkKCkuCj4g PiArCSAqLwo+ID4gKwlwbWRfY2xlYXIocG1kcCk7Cj4gPiArCXB1ZF9jbGVhcihwdWRwKTsKPiA+ ICsJcHVkX3BvcHVsYXRlKG1tLCBwdWRwLCBwbWRwKTsKPiA+ICsJcHVkID0gUkVBRF9PTkNFKCpw dWRwKTsKPiA+ICsJV0FSTl9PTihwdWRfYmFkKHB1ZCkpOwo+ID4gK30KPiA+ICsjZWxzZQo+ID4g K3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfY2xlYXJfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0s IHB1ZF90ICpwdWRwKSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX3BvcHVsYXRlX3Rl c3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkcCwKPiA+ICsJCQkJICAgICAgcG1k X3QgKnBtZHApCj4gPiArewo+ID4gK30KPiA+ICsjZW5kaWYKPiA+ICsKPiA+ICsjaWZuZGVmIF9f UEFHRVRBQkxFX1A0RF9GT0xERUQKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcDRkX2NsZWFyX3Rl c3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwNGRfdCAqcDRkcCkKPiA+ICt7Cj4gPiArCXA0ZF90 IHA0ZCA9IFJFQURfT05DRSgqcDRkcCk7Cj4gPiArCj4gPiArCWlmIChtbV9wdWRfZm9sZGVkKG1t KSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcDRkID0gX19wNGQocDRkX3ZhbChwNGQpIHwg UkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpwNGRwLCBwNGQpOwo+ID4gKwlwNGRf Y2xlYXIocDRkcCk7Cj4gPiArCXA0ZCA9IFJFQURfT05DRSgqcDRkcCk7Cj4gPiArCVdBUk5fT04o IXA0ZF9ub25lKHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcDRk X3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwNGRfdCAqcDRkcCwKPiA+ICsJ CQkJICAgICAgcHVkX3QgKnB1ZHApCj4gPiArewo+ID4gKwlwNGRfdCBwNGQ7Cj4gPiArCj4gPiAr CWlmIChtbV9wdWRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJLyoKPiA+ ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZlbCBwYWdlIHRhYmxlIHBhZ2UuCj4g PiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBhcyBwNGRfYmFkKCkuCj4gPiArCSAq Lwo+ID4gKwlwdWRfY2xlYXIocHVkcCk7Cj4gPiArCXA0ZF9jbGVhcihwNGRwKTsKPiA+ICsJcDRk X3BvcHVsYXRlKG1tLCBwNGRwLCBwdWRwKTsKPiA+ICsJcDRkID0gUkVBRF9PTkNFKCpwNGRwKTsK PiA+ICsJV0FSTl9PTihwNGRfYmFkKHA0ZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBfX2luaXQgcGdkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdk cCkKPiA+ICt7Cj4gPiArCXBnZF90IHBnZCA9IFJFQURfT05DRSgqcGdkcCk7Cj4gPiArCj4gPiAr CWlmIChtbV9wNGRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVybjsKPiA+ICsKPiA+ICsJcGdkID0g X19wZ2QocGdkX3ZhbChwZ2QpIHwgUkFORE9NX09SVkFMVUUpOwo+ID4gKwlXUklURV9PTkNFKCpw Z2RwLCBwZ2QpOwo+ID4gKwlwZ2RfY2xlYXIocGdkcCk7Cj4gPiArCXBnZCA9IFJFQURfT05DRSgq cGdkcCk7Cj4gPiArCVdBUk5fT04oIXBnZF9ub25lKHBnZCkpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBfX2luaXQgcGdkX3BvcHVsYXRlX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t LCBwZ2RfdCAqcGdkcCwKPiA+ICsJCQkJICAgICAgcDRkX3QgKnA0ZHApCj4gPiArewo+ID4gKwlw Z2RfdCBwZ2Q7Cj4gPiArCj4gPiArCWlmIChtbV9wNGRfZm9sZGVkKG1tKSkKPiA+ICsJCXJldHVy bjsKPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogVGhpcyBlbnRyeSBwb2ludHMgdG8gbmV4dCBsZXZl bCBwYWdlIHRhYmxlIHBhZ2UuCj4gPiArCSAqIEhlbmNlIHRoaXMgbXVzdCBub3QgcXVhbGlmeSBh cyBwZ2RfYmFkKCkuCj4gPiArCSAqLwo+ID4gKwlwNGRfY2xlYXIocDRkcCk7Cj4gPiArCXBnZF9j bGVhcihwZ2RwKTsKPiA+ICsJcGdkX3BvcHVsYXRlKG1tLCBwZ2RwLCBwNGRwKTsKPiA+ICsJcGdk ID0gUkVBRF9PTkNFKCpwZ2RwKTsKPiA+ICsJV0FSTl9PTihwZ2RfYmFkKHBnZCkpOwo+ID4gK30K PiA+ICsjZWxzZQo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBwNGRfY2xlYXJfdGVzdHMoc3RydWN0 IG1tX3N0cnVjdCAqbW0sIHA0ZF90ICpwNGRwKSB7IH0KPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQg cGdkX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkcCkgeyB9Cj4g PiArc3RhdGljIHZvaWQgX19pbml0IHA0ZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwgcDRkX3QgKnA0ZHAsCj4gPiArCQkJCSAgICAgIHB1ZF90ICpwdWRwKQo+ID4gK3sKPiA+ ICt9Cj4gPiArc3RhdGljIHZvaWQgX19pbml0IHBnZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1Y3QgbW1f c3RydWN0ICptbSwgcGdkX3QgKnBnZHAsCj4gPiArCQkJCSAgICAgIHA0ZF90ICpwNGRwKQo+ID4g K3sKPiA+ICt9Cj4gPiArI2VuZGlmCj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19pbml0IHB0ZV9j bGVhcl90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZXApCj4gPiArewo+ID4g KwlwdGVfdCBwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwo+ID4gKwo+ID4gKwlwdGUgPSBfX3B0ZShw dGVfdmFsKHB0ZSkgfCBSQU5ET01fT1JWQUxVRSk7Cj4gPiArCVdSSVRFX09OQ0UoKnB0ZXAsIHB0 ZSk7Cj4gPiArCXB0ZV9jbGVhcihtbSwgMCwgcHRlcCk7Cj4gPiArCXB0ZSA9IFJFQURfT05DRSgq cHRlcCk7Cj4gPiArCVdBUk5fT04oIXB0ZV9ub25lKHB0ZSkpOwo+ID4gK30KPiA+ICsKPiA+ICtz dGF0aWMgdm9pZCBfX2luaXQgcG1kX2NsZWFyX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBw bWRfdCAqcG1kcCkKPiA+ICt7Cj4gPiArCXBtZF90IHBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4g PiArCj4gPiArCXBtZCA9IF9fcG1kKHBtZF92YWwocG1kKSB8IFJBTkRPTV9PUlZBTFVFKTsKPiA+ ICsJV1JJVEVfT05DRSgqcG1kcCwgcG1kKTsKPiA+ICsJcG1kX2NsZWFyKHBtZHApOwo+ID4gKwlw bWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ID4gKwlXQVJOX09OKCFwbWRfbm9uZShwbWQpKTsKPiA+ ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9wb3B1bGF0ZV90ZXN0cyhzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsCj4gPiArCQkJCSAgICAgIHBndGFibGVfdCBw Z3RhYmxlKQo+ID4gK3sKPiA+ICsJcG1kX3QgcG1kOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwkgKiBU aGlzIGVudHJ5IHBvaW50cyB0byBuZXh0IGxldmVsIHBhZ2UgdGFibGUgcGFnZS4KPiA+ICsJICog SGVuY2UgdGhpcyBtdXN0IG5vdCBxdWFsaWZ5IGFzIHBtZF9iYWQoKS4KPiA+ICsJICovCj4gPiAr CXBtZF9jbGVhcihwbWRwKTsKPiA+ICsJcG1kX3BvcHVsYXRlKG1tLCBwbWRwLCBwZ3RhYmxlKTsK PiA+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiA+ICsJV0FSTl9PTihwbWRfYmFkKHBtZCkp Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZ2V0X3JhbmRv bV92YWRkcih2b2lkKQo+ID4gK3sKPiA+ICsJdW5zaWduZWQgbG9uZyByYW5kb21fdmFkZHIsIHJh bmRvbV9wYWdlcywgdG90YWxfdXNlcl9wYWdlczsKPiA+ICsKPiA+ICsJdG90YWxfdXNlcl9wYWdl cyA9IChUQVNLX1NJWkUgLSBGSVJTVF9VU0VSX0FERFJFU1MpIC8gUEFHRV9TSVpFOwo+ID4gKwo+ ID4gKwlyYW5kb21fcGFnZXMgPSBnZXRfcmFuZG9tX2xvbmcoKSAlIHRvdGFsX3VzZXJfcGFnZXM7 Cj4gPiArCXJhbmRvbV92YWRkciA9IEZJUlNUX1VTRVJfQUREUkVTUyArIHJhbmRvbV9wYWdlcyAq IFBBR0VfU0laRTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJhbmRvbV92YWRkcjsKPiA+ICt9Cj4gPiAr Cj4gPiArdm9pZCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ID4gK3sKPiA+ICsJc3Ry dWN0IG1tX3N0cnVjdCAqbW07Cj4gPiArCXBnZF90ICpwZ2RwOwo+ID4gKwlwNGRfdCAqcDRkcCwg KnNhdmVkX3A0ZHA7Cj4gPiArCXB1ZF90ICpwdWRwLCAqc2F2ZWRfcHVkcDsKPiA+ICsJcG1kX3Qg KnBtZHAsICpzYXZlZF9wbWRwLCBwbWQ7Cj4gPiArCXB0ZV90ICpwdGVwOwo+ID4gKwlwZ3RhYmxl X3Qgc2F2ZWRfcHRlcDsKPiA+ICsJcGdwcm90X3QgcHJvdDsKPiA+ICsJcGh5c19hZGRyX3QgcGFk ZHI7Cj4gPiArCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHB0ZV9hbGlnbmVkLCBwbWRfYWxpZ25lZDsK PiA+ICsJdW5zaWduZWQgbG9uZyBwdWRfYWxpZ25lZCwgcDRkX2FsaWduZWQsIHBnZF9hbGlnbmVk Owo+ID4gKwo+ID4gKwlwcl9pbmZvKCJWYWxpZGF0aW5nIGFyY2hpdGVjdHVyZSBwYWdlIHRhYmxl IGhlbHBlcnNcbiIpOwo+ID4gKwlwcm90ID0gdm1fZ2V0X3BhZ2VfcHJvdChWTUZMQUdTKTsKPiA+ ICsJdmFkZHIgPSBnZXRfcmFuZG9tX3ZhZGRyKCk7Cj4gPiArCW1tID0gbW1fYWxsb2MoKTsKPiA+ ICsJaWYgKCFtbSkgewo+ID4gKwkJcHJfZXJyKCJtbV9zdHJ1Y3QgYWxsb2NhdGlvbiBmYWlsZWRc biIpOwo+ID4gKwkJcmV0dXJuOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFBGTiBm b3IgbWFwcGluZyBhdCBQVEUgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBmcm9tIGEgc3RhbmRhcmQga2Vy bmVsCj4gPiArCSAqIHRleHQgc3ltYm9sLiBCdXQgcGZucyBmb3IgaGlnaGVyIHBhZ2UgdGFibGUg bGV2ZWxzIGFyZSBkZXJpdmVkIGJ5Cj4gPiArCSAqIG1hc2tpbmcgbG93ZXIgYml0cyBvZiB0aGlz IHJlYWwgcGZuLiBUaGVzZSBkZXJpdmVkIHBmbnMgbWlnaHQgbm90Cj4gPiArCSAqIGV4aXN0IG9u IHRoZSBwbGF0Zm9ybSBidXQgdGhhdCBkb2VzIG5vdCByZWFsbHkgbWF0dGVyIGFzIHBmbl9weHgo KQo+ID4gKwkgKiBoZWxwZXJzIHdpbGwgc3RpbGwgY3JlYXRlIGFwcHJvcHJpYXRlIGVudHJpZXMg Zm9yIHRoZSB0ZXN0LiBUaGlzCj4gPiArCSAqIGhlbHBzIGF2b2lkIGxhcmdlIG1lbW9yeSBibG9j ayBhbGxvY2F0aW9ucyB0byBiZSB1c2VkIGZvciBtYXBwaW5nCj4gPiArCSAqIGF0IGhpZ2hlciBw YWdlIHRhYmxlIGxldmVscy4KPiA+ICsJICovCj4gPiArCXBhZGRyID0gX19wYSgmc3RhcnRfa2Vy bmVsKTsKPiA+ICsKPiA+ICsJcHRlX2FsaWduZWQgPSAocGFkZHIgJiBQQUdFX01BU0spID4+IFBB R0VfU0hJRlQ7Cj4gPiArCXBtZF9hbGlnbmVkID0gKHBhZGRyICYgUE1EX01BU0spID4+IFBBR0Vf U0hJRlQ7Cj4gPiArCXB1ZF9hbGlnbmVkID0gKHBhZGRyICYgUFVEX01BU0spID4+IFBBR0VfU0hJ RlQ7Cj4gPiArCXA0ZF9hbGlnbmVkID0gKHBhZGRyICYgUDREX01BU0spID4+IFBBR0VfU0hJRlQ7 Cj4gPiArCXBnZF9hbGlnbmVkID0gKHBhZGRyICYgUEdESVJfTUFTSykgPj4gUEFHRV9TSElGVDsK PiA+ICsJV0FSTl9PTighcGZuX3ZhbGlkKHB0ZV9hbGlnbmVkKSk7Cj4gPiArCj4gPiArCXBnZHAg PSBwZ2Rfb2Zmc2V0KG1tLCB2YWRkcik7Cj4gPiArCXA0ZHAgPSBwNGRfYWxsb2MobW0sIHBnZHAs IHZhZGRyKTsKPiA+ICsJcHVkcCA9IHB1ZF9hbGxvYyhtbSwgcDRkcCwgdmFkZHIpOwo+ID4gKwlw bWRwID0gcG1kX2FsbG9jKG1tLCBwdWRwLCB2YWRkcik7Cj4gPiArCXB0ZXAgPSBwdGVfYWxsb2Nf bWFwKG1tLCBwbWRwLCB2YWRkcik7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFNhdmUgYWxsIHRo ZSBwYWdlIHRhYmxlIHBhZ2UgYWRkcmVzc2VzIGFzIHRoZSBwYWdlIHRhYmxlCj4gPiArCSAqIGVu dHJpZXMgd2lsbCBiZSB1c2VkIGZvciB0ZXN0aW5nIHdpdGggcmFuZG9tIG9yIGdhcmJhZ2UKPiA+ ICsJICogdmFsdWVzLiBUaGVzZSBzYXZlZCBhZGRyZXNzZXMgd2lsbCBiZSB1c2VkIGZvciBmcmVl aW5nCj4gPiArCSAqIHBhZ2UgdGFibGUgcGFnZXMuCj4gPiArCSAqLwo+ID4gKwlwbWQgPSBSRUFE X09OQ0UoKnBtZHApOwo+ID4gKwlzYXZlZF9wNGRwID0gcDRkX29mZnNldChwZ2RwLCAwVUwpOwo+ ID4gKwlzYXZlZF9wdWRwID0gcHVkX29mZnNldChwNGRwLCAwVUwpOwo+ID4gKwlzYXZlZF9wbWRw ID0gcG1kX29mZnNldChwdWRwLCAwVUwpOwo+ID4gKwlzYXZlZF9wdGVwID0gcG1kX3BndGFibGUo cG1kKTsKPiA+ICsKPiA+ICsJcHRlX2Jhc2ljX3Rlc3RzKHB0ZV9hbGlnbmVkLCBwcm90KTsKPiA+ ICsJcG1kX2Jhc2ljX3Rlc3RzKHBtZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsJcHVkX2Jhc2ljX3Rl c3RzKHB1ZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsJcDRkX2Jhc2ljX3Rlc3RzKHA0ZF9hbGlnbmVk LCBwcm90KTsKPiA+ICsJcGdkX2Jhc2ljX3Rlc3RzKHBnZF9hbGlnbmVkLCBwcm90KTsKPiA+ICsK PiA+ICsJcHRlX2NsZWFyX3Rlc3RzKG1tLCBwdGVwKTsKPiA+ICsJcG1kX2NsZWFyX3Rlc3RzKG1t LCBwbWRwKTsKPiA+ICsJcHVkX2NsZWFyX3Rlc3RzKG1tLCBwdWRwKTsKPiA+ICsJcDRkX2NsZWFy X3Rlc3RzKG1tLCBwNGRwKTsKPiA+ICsJcGdkX2NsZWFyX3Rlc3RzKG1tLCBwZ2RwKTsKPiA+ICsK PiA+ICsJcHRlX3VubWFwKHB0ZXApOwo+ID4gKwo+ID4gKwlwbWRfcG9wdWxhdGVfdGVzdHMobW0s IHBtZHAsIHNhdmVkX3B0ZXApOwo+ID4gKwlwdWRfcG9wdWxhdGVfdGVzdHMobW0sIHB1ZHAsIHNh dmVkX3BtZHApOwo+ID4gKwlwNGRfcG9wdWxhdGVfdGVzdHMobW0sIHA0ZHAsIHNhdmVkX3B1ZHAp Owo+ID4gKwlwZ2RfcG9wdWxhdGVfdGVzdHMobW0sIHBnZHAsIHNhdmVkX3A0ZHApOwo+ID4gKwo+ ID4gKwlwNGRfZnJlZShtbSwgc2F2ZWRfcDRkcCk7Cj4gPiArCXB1ZF9mcmVlKG1tLCBzYXZlZF9w dWRwKTsKPiA+ICsJcG1kX2ZyZWUobW0sIHNhdmVkX3BtZHApOwo+ID4gKwlwdGVfZnJlZShtbSwg c2F2ZWRfcHRlcCk7Cj4gPiArCj4gPiArCW1tX2RlY19ucl9wdWRzKG1tKTsKPiA+ICsJbW1fZGVj X25yX3BtZHMobW0pOwo+ID4gKwltbV9kZWNfbnJfcHRlcyhtbSk7Cj4gPiArCW1tZHJvcChtbSk7 Cj4gPiArfQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtYXJtLWtlcm5lbAo=