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.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 C9492C433DF for ; Sat, 27 Jun 2020 07:27:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A1D942081A for ; Sat, 27 Jun 2020 07:27:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726037AbgF0H10 (ORCPT ); Sat, 27 Jun 2020 03:27:26 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:27838 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725885AbgF0H10 (ORCPT ); Sat, 27 Jun 2020 03:27:26 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v50y2n7Lz9tyWd; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id pXgL3pLy5jWH; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v50y1hbJz9tyWZ; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 6F5AE8B772; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id A0nwexkhePdw; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3D7FC8B75B; Sat, 27 Jun 2020 09:26:57 +0200 (CEST) Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers To: Anshuman Khandual , linux-mm@kvack.org Cc: ziy@nvidia.com, gerald.schaefer@de.ibm.com, 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 References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> From: Christophe Leroy Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> Date: Sat, 27 Jun 2020 09:26:55 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 15/06/2020 à 05:37, Anshuman Khandual a écrit : > This adds new tests validating for these following arch advanced page table > helpers. These tests create and test specific mapping types at various page > table levels. > > 1. pxxp_set_wrprotect() > 2. pxxp_get_and_clear() > 3. pxxp_set_access_flags() > 4. pxxp_get_and_clear_full() > 5. pxxp_test_and_clear_young() > 6. pxx_leaf() > 7. pxx_set_huge() > 8. pxx_(clear|mk)_savedwrite() > 9. huge_pxxp_xxx() > > 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-mm@kvack.org > Cc: linux-arch@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Suggested-by: Catalin Marinas > Signed-off-by: Anshuman Khandual > --- > mm/debug_vm_pgtable.c | 306 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 306 insertions(+) > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > index ffa163d4c63c..e3f9f8317a98 100644 > --- a/mm/debug_vm_pgtable.c > +++ b/mm/debug_vm_pgtable.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -28,6 +29,7 @@ > #include > #include > #include > +#include > > #define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > @@ -55,6 +57,54 @@ static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > } > > +static void __init pte_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pte_t *ptep, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly. > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_set_wrprotect(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_write(pte)); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pfn_pte(pfn, prot); > + pte = pte_wrprotect(pte); > + pte = pte_mkclean(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + pte = pte_mkwrite(pte); > + pte = pte_mkdirty(pte); > + ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!(pte_write(pte) && pte_dirty(pte))); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear_full(mm, vaddr, ptep, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pte_mkyoung(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_test_and_clear_young(vma, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_young(pte)); > +} > + > +static void __init pte_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + WARN_ON(!pte_savedwrite(pte_mk_savedwrite(pte_clear_savedwrite(pte)))); > + WARN_ON(pte_savedwrite(pte_clear_savedwrite(pte_mk_savedwrite(pte)))); > +} > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -77,6 +127,89 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > } > > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PMD_SIZE */ > + vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_set_wrprotect(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_write(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + pmd = pmd_wrprotect(pmd); > + pmd = pmd_mkclean(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmd = pmd_mkwrite(pmd); > + pmd = pmd_mkdirty(pmd); > + pmdp_set_access_flags(vma, vaddr, pmdp, pmd, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd))); > + > + pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear_full(vma, vaddr, pmdp, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pmd_mkyoung(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_test_and_clear_young(vma, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_young(pmd)); > +} > + > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + /* > + * PMD based THP is a leaf entry. > + */ > + pmd = pmd_mkhuge(pmd); > + WARN_ON(!pmd_leaf(pmd)); > +} > + > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pmd_set_huge() verifies that the given > + * PMD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pmdp, __pmd(0)); > + WARN_ON(!pmd_set_huge(pmdp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pmd_clear_huge(pmdp)); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > +} > + > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + WARN_ON(!pmd_savedwrite(pmd_mk_savedwrite(pmd_clear_savedwrite(pmd)))); > + WARN_ON(pmd_savedwrite(pmd_clear_savedwrite(pmd_mk_savedwrite(pmd)))); > +} > + > #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -100,12 +233,115 @@ static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > */ > WARN_ON(!pud_bad(pud_mkhuge(pud))); > } > + > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PUD_SIZE */ > + vaddr = (vaddr & HPAGE_PUD_MASK) + HPAGE_PUD_SIZE; > + > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_set_wrprotect(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_write(pud)); > + > +#ifndef __PAGETABLE_PMD_FOLDED > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > + > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear_full(mm, vaddr, pudp, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +#endif /* __PAGETABLE_PMD_FOLDED */ > + pud = pfn_pud(pfn, prot); > + pud = pud_wrprotect(pud); > + pud = pud_mkclean(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pud = pud_mkwrite(pud); > + pud = pud_mkdirty(pud); > + pudp_set_access_flags(vma, vaddr, pudp, pud, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!(pud_write(pud) && pud_dirty(pud))); > + > + pud = pud_mkyoung(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_test_and_clear_young(vma, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_young(pud)); > +} > + > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + /* > + * PUD based THP is a leaf entry. > + */ > + pud = pud_mkhuge(pud); > + WARN_ON(!pud_leaf(pud)); > +} > + > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pud_set_huge() verifies that the given > + * PUD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pudp, __pud(0)); > + WARN_ON(!pud_set_huge(pudp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pud_clear_huge(pudp)); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +} > #else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > #else /* !CONFIG_TRANSPARENT_HUGEPAGE */ > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) { } > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > @@ -495,8 +731,56 @@ static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pte_huge(pte_mkhuge(pte))); > #endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */ > } > + > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > + struct page *page = pfn_to_page(pfn); > + pte_t pte = READ_ONCE(*ptep); > + unsigned long paddr = (__pfn_to_phys(pfn) | RANDOM_ORVALUE) & PMD_MASK; > + > + pte = pte_mkhuge(mk_pte(pfn_to_page(PHYS_PFN(paddr)), prot)); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + WARN_ON(!pte_same(pte, huge_ptep_get(ptep))); > + huge_pte_clear(mm, vaddr, ptep, PMD_SIZE); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_set_wrprotect(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(huge_pte_write(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_get_and_clear(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + pte = huge_pte_wrprotect(pte); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + pte = huge_pte_mkwrite(pte); > + pte = huge_pte_mkdirty(pte); > + huge_ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = huge_ptep_get(ptep); > + WARN_ON(!(huge_pte_write(pte) && huge_pte_dirty(pte))); > +} > #else /* !CONFIG_HUGETLB_PAGE */ > static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HUGETLB_PAGE */ > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > @@ -568,6 +852,7 @@ static unsigned long __init get_random_vaddr(void) > > static int __init debug_vm_pgtable(void) > { > + struct vm_area_struct *vma; > struct mm_struct *mm; > pgd_t *pgdp; > p4d_t *p4dp, *saved_p4dp; > @@ -596,6 +881,12 @@ static int __init debug_vm_pgtable(void) > */ > protnone = __P000; > > + vma = vm_area_alloc(mm); > + if (!vma) { > + pr_err("vma allocation failed\n"); > + return 1; > + } > + > /* > * PFN for mapping at PTE level is determined from a standard kernel > * text symbol. But pfns for higher page table levels are derived by > @@ -644,6 +935,20 @@ static int __init debug_vm_pgtable(void) > p4d_clear_tests(mm, p4dp); > pgd_clear_tests(mm, pgdp); > > + pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); > + pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); > + hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + > + pmd_leaf_tests(pmd_aligned, prot); > + pud_leaf_tests(pud_aligned, prot); > + > + pmd_huge_tests(pmdp, pmd_aligned, prot); > + pud_huge_tests(pudp, pud_aligned, prot); > + > + pte_savedwrite_tests(pte_aligned, prot); > + pmd_savedwrite_tests(pmd_aligned, prot); > + > pte_unmap_unlock(ptep, ptl); > > pmd_populate_tests(mm, pmdp, saved_ptep); > @@ -678,6 +983,7 @@ static int __init debug_vm_pgtable(void) > pmd_free(mm, saved_pmdp); > pte_free(mm, saved_ptep); > > + vm_area_free(vma); > mm_dec_nr_puds(mm); > mm_dec_nr_pmds(mm); > mm_dec_nr_ptes(mm); > Christophe From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christophe Leroy Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers Date: Sat, 27 Jun 2020 09:26:55 +0200 Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Language: fr List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane-mx.org@lists.ozlabs.org Sender: "Linuxppc-dev" To: Anshuman Khandual , linux-mm@kvack.org Cc: 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 , gerald.schaefer@de.ibm.com, ziy@nvidia.com, Catalin Marinas , 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@list List-Id: linux-arch.vger.kernel.org Le 15/06/2020 à 05:37, Anshuman Khandual a écrit : > This adds new tests validating for these following arch advanced page table > helpers. These tests create and test specific mapping types at various page > table levels. > > 1. pxxp_set_wrprotect() > 2. pxxp_get_and_clear() > 3. pxxp_set_access_flags() > 4. pxxp_get_and_clear_full() > 5. pxxp_test_and_clear_young() > 6. pxx_leaf() > 7. pxx_set_huge() > 8. pxx_(clear|mk)_savedwrite() > 9. huge_pxxp_xxx() > > 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-mm@kvack.org > Cc: linux-arch@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Suggested-by: Catalin Marinas > Signed-off-by: Anshuman Khandual > --- > mm/debug_vm_pgtable.c | 306 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 306 insertions(+) > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > index ffa163d4c63c..e3f9f8317a98 100644 > --- a/mm/debug_vm_pgtable.c > +++ b/mm/debug_vm_pgtable.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -28,6 +29,7 @@ > #include > #include > #include > +#include > > #define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > @@ -55,6 +57,54 @@ static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > } > > +static void __init pte_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pte_t *ptep, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly. > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_set_wrprotect(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_write(pte)); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pfn_pte(pfn, prot); > + pte = pte_wrprotect(pte); > + pte = pte_mkclean(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + pte = pte_mkwrite(pte); > + pte = pte_mkdirty(pte); > + ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!(pte_write(pte) && pte_dirty(pte))); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear_full(mm, vaddr, ptep, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pte_mkyoung(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_test_and_clear_young(vma, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_young(pte)); > +} > + > +static void __init pte_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + WARN_ON(!pte_savedwrite(pte_mk_savedwrite(pte_clear_savedwrite(pte)))); > + WARN_ON(pte_savedwrite(pte_clear_savedwrite(pte_mk_savedwrite(pte)))); > +} > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -77,6 +127,89 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > } > > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PMD_SIZE */ > + vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_set_wrprotect(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_write(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + pmd = pmd_wrprotect(pmd); > + pmd = pmd_mkclean(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmd = pmd_mkwrite(pmd); > + pmd = pmd_mkdirty(pmd); > + pmdp_set_access_flags(vma, vaddr, pmdp, pmd, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd))); > + > + pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear_full(vma, vaddr, pmdp, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pmd_mkyoung(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_test_and_clear_young(vma, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_young(pmd)); > +} > + > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + /* > + * PMD based THP is a leaf entry. > + */ > + pmd = pmd_mkhuge(pmd); > + WARN_ON(!pmd_leaf(pmd)); > +} > + > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pmd_set_huge() verifies that the given > + * PMD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pmdp, __pmd(0)); > + WARN_ON(!pmd_set_huge(pmdp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pmd_clear_huge(pmdp)); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > +} > + > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + WARN_ON(!pmd_savedwrite(pmd_mk_savedwrite(pmd_clear_savedwrite(pmd)))); > + WARN_ON(pmd_savedwrite(pmd_clear_savedwrite(pmd_mk_savedwrite(pmd)))); > +} > + > #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -100,12 +233,115 @@ static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > */ > WARN_ON(!pud_bad(pud_mkhuge(pud))); > } > + > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PUD_SIZE */ > + vaddr = (vaddr & HPAGE_PUD_MASK) + HPAGE_PUD_SIZE; > + > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_set_wrprotect(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_write(pud)); > + > +#ifndef __PAGETABLE_PMD_FOLDED > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > + > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear_full(mm, vaddr, pudp, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +#endif /* __PAGETABLE_PMD_FOLDED */ > + pud = pfn_pud(pfn, prot); > + pud = pud_wrprotect(pud); > + pud = pud_mkclean(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pud = pud_mkwrite(pud); > + pud = pud_mkdirty(pud); > + pudp_set_access_flags(vma, vaddr, pudp, pud, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!(pud_write(pud) && pud_dirty(pud))); > + > + pud = pud_mkyoung(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_test_and_clear_young(vma, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_young(pud)); > +} > + > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + /* > + * PUD based THP is a leaf entry. > + */ > + pud = pud_mkhuge(pud); > + WARN_ON(!pud_leaf(pud)); > +} > + > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pud_set_huge() verifies that the given > + * PUD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pudp, __pud(0)); > + WARN_ON(!pud_set_huge(pudp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pud_clear_huge(pudp)); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +} > #else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > #else /* !CONFIG_TRANSPARENT_HUGEPAGE */ > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) { } > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > @@ -495,8 +731,56 @@ static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pte_huge(pte_mkhuge(pte))); > #endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */ > } > + > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > + struct page *page = pfn_to_page(pfn); > + pte_t pte = READ_ONCE(*ptep); > + unsigned long paddr = (__pfn_to_phys(pfn) | RANDOM_ORVALUE) & PMD_MASK; > + > + pte = pte_mkhuge(mk_pte(pfn_to_page(PHYS_PFN(paddr)), prot)); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + WARN_ON(!pte_same(pte, huge_ptep_get(ptep))); > + huge_pte_clear(mm, vaddr, ptep, PMD_SIZE); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_set_wrprotect(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(huge_pte_write(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_get_and_clear(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + pte = huge_pte_wrprotect(pte); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + pte = huge_pte_mkwrite(pte); > + pte = huge_pte_mkdirty(pte); > + huge_ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = huge_ptep_get(ptep); > + WARN_ON(!(huge_pte_write(pte) && huge_pte_dirty(pte))); > +} > #else /* !CONFIG_HUGETLB_PAGE */ > static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HUGETLB_PAGE */ > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > @@ -568,6 +852,7 @@ static unsigned long __init get_random_vaddr(void) > > static int __init debug_vm_pgtable(void) > { > + struct vm_area_struct *vma; > struct mm_struct *mm; > pgd_t *pgdp; > p4d_t *p4dp, *saved_p4dp; > @@ -596,6 +881,12 @@ static int __init debug_vm_pgtable(void) > */ > protnone = __P000; > > + vma = vm_area_alloc(mm); > + if (!vma) { > + pr_err("vma allocation failed\n"); > + return 1; > + } > + > /* > * PFN for mapping at PTE level is determined from a standard kernel > * text symbol. But pfns for higher page table levels are derived by > @@ -644,6 +935,20 @@ static int __init debug_vm_pgtable(void) > p4d_clear_tests(mm, p4dp); > pgd_clear_tests(mm, pgdp); > > + pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); > + pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); > + hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + > + pmd_leaf_tests(pmd_aligned, prot); > + pud_leaf_tests(pud_aligned, prot); > + > + pmd_huge_tests(pmdp, pmd_aligned, prot); > + pud_huge_tests(pudp, pud_aligned, prot); > + > + pte_savedwrite_tests(pte_aligned, prot); > + pmd_savedwrite_tests(pmd_aligned, prot); > + > pte_unmap_unlock(ptep, ptl); > > pmd_populate_tests(mm, pmdp, saved_ptep); > @@ -678,6 +983,7 @@ static int __init debug_vm_pgtable(void) > pmd_free(mm, saved_pmdp); > pte_free(mm, saved_ptep); > > + vm_area_free(vma); > mm_dec_nr_puds(mm); > mm_dec_nr_pmds(mm); > mm_dec_nr_ptes(mm); > Christophe 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.5 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,URIBL_BLOCKED,USER_AGENT_SANE_1 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 544EDC433E0 for ; Sat, 27 Jun 2020 07:27:21 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 10E1D2088E for ; Sat, 27 Jun 2020 07:27:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="H86A1HxG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 10E1D2088E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=HfrntQdJPFQ0CpbTT9pTiJ2l1wVliRBFJ6t0M7C8Zec=; b=H86A1HxGZuL7ILulSkqjNHrkP 9b5RH14/5KNQzbNaZVCjey1HxUuti+eX7RFyVLHz6kyRsKNX2sc8wJ39FADJpsxxQMMqWxopmAJud iktZUJGui8QtcRKtTHO2LWx3AXXWM14hGH2JGuWgJOZNpOCmUhp9hOQaST1VWgx0oKI/QisQJ+EOx Qlrc3RH99FAr0tG0ioDcAEzW1IxImKFAY9aHnzPDX89HXnGEW4kAZuPQYrK+DYvdadCCcFaQpslTH 29Ckei53FoJJV0MVNqNSuwFzBq+bJEOvVCADuBzqU7s/CWyzvVHp4sLwOHrXh7m3+kFdNMYNwCmyH u/d6iA6Vg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5F3-0000c1-08; Sat, 27 Jun 2020 07:27:13 +0000 Received: from pegase1.c-s.fr ([93.17.236.30]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5Ex-0000bD-Pp; Sat, 27 Jun 2020 07:27:09 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v50y2n7Lz9tyWd; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id pXgL3pLy5jWH; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v50y1hbJz9tyWZ; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 6F5AE8B772; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id A0nwexkhePdw; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3D7FC8B75B; Sat, 27 Jun 2020 09:26:57 +0200 (CEST) Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers To: Anshuman Khandual , linux-mm@kvack.org References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> From: Christophe Leroy Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> Date: Sat, 27 Jun 2020 09:26:55 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Language: fr X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Benjamin Herrenschmidt , 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 , gerald.schaefer@de.ibm.com, ziy@nvidia.com, Catalin Marinas , 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 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org CgpMZSAxNS8wNi8yMDIwIMOgIDA1OjM3LCBBbnNodW1hbiBLaGFuZHVhbCBhIMOpY3JpdMKgOgo+ IFRoaXMgYWRkcyBuZXcgdGVzdHMgdmFsaWRhdGluZyBmb3IgdGhlc2UgZm9sbG93aW5nIGFyY2gg YWR2YW5jZWQgcGFnZSB0YWJsZQo+IGhlbHBlcnMuIFRoZXNlIHRlc3RzIGNyZWF0ZSBhbmQgdGVz dCBzcGVjaWZpYyBtYXBwaW5nIHR5cGVzIGF0IHZhcmlvdXMgcGFnZQo+IHRhYmxlIGxldmVscy4K PiAKPiAxLiBweHhwX3NldF93cnByb3RlY3QoKQo+IDIuIHB4eHBfZ2V0X2FuZF9jbGVhcigpCj4g My4gcHh4cF9zZXRfYWNjZXNzX2ZsYWdzKCkKPiA0LiBweHhwX2dldF9hbmRfY2xlYXJfZnVsbCgp Cj4gNS4gcHh4cF90ZXN0X2FuZF9jbGVhcl95b3VuZygpCj4gNi4gcHh4X2xlYWYoKQo+IDcuIHB4 eF9zZXRfaHVnZSgpCj4gOC4gcHh4XyhjbGVhcnxtaylfc2F2ZWR3cml0ZSgpCj4gOS4gaHVnZV9w eHhwX3h4eCgpCj4gCj4gQ2M6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5v cmc+Cj4gQ2M6IE1pa2UgUmFwb3BvcnQgPHJwcHRAbGludXguaWJtLmNvbT4KPiBDYzogVmluZWV0 IEd1cHRhIDx2Z3VwdGFAc3lub3BzeXMuY29tPgo+IENjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFs aW4ubWFyaW5hc0Bhcm0uY29tPgo+IENjOiBXaWxsIERlYWNvbiA8d2lsbEBrZXJuZWwub3JnPgo+ IENjOiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Cj4g Q2M6IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgo+IENjOiBNaWNoYWVsIEVsbGVy bWFuIDxtcGVAZWxsZXJtYW4uaWQuYXU+Cj4gQ2M6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJz dGVuc0BkZS5pYm0uY29tPgo+IENjOiBWYXNpbHkgR29yYmlrIDxnb3JAbGludXguaWJtLmNvbT4K PiBDYzogQ2hyaXN0aWFuIEJvcm50cmFlZ2VyIDxib3JudHJhZWdlckBkZS5pYm0uY29tPgo+IENj OiBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KPiBDYzogSW5nbyBNb2xuYXIg PG1pbmdvQHJlZGhhdC5jb20+Cj4gQ2M6IEJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgo+ IENjOiAiSC4gUGV0ZXIgQW52aW4iIDxocGFAenl0b3IuY29tPgo+IENjOiBLaXJpbGwgQS4gU2h1 dGVtb3YgPGtpcmlsbEBzaHV0ZW1vdi5uYW1lPgo+IENjOiBQYXVsIFdhbG1zbGV5IDxwYXVsLndh bG1zbGV5QHNpZml2ZS5jb20+Cj4gQ2M6IFBhbG1lciBEYWJiZWx0IDxwYWxtZXJAZGFiYmVsdC5j b20+Cj4gQ2M6IGxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4gQ2M6IGxpbnV4cHBjLWRldkBsaXN0cy5v emxhYnMub3JnCj4gQ2M6IGxpbnV4LXMzOTBAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogeDg2QGtlcm5lbC5vcmcKPiBDYzogbGludXgt bW1Aa3ZhY2sub3JnCj4gQ2M6IGxpbnV4LWFyY2hAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4 LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKPiBTdWdnZXN0ZWQtYnk6IENhdGFsaW4gTWFyaW5hcyA8 Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQW5zaHVtYW4gS2hhbmR1 YWwgPGFuc2h1bWFuLmtoYW5kdWFsQGFybS5jb20+Cj4gLS0tCj4gICBtbS9kZWJ1Z192bV9wZ3Rh YmxlLmMgfCAzMDYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g ICAxIGZpbGUgY2hhbmdlZCwgMzA2IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvbW0v ZGVidWdfdm1fcGd0YWJsZS5jIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gaW5kZXggZmZhMTYz ZDRjNjNjLi5lM2Y5ZjgzMTdhOTggMTAwNjQ0Cj4gLS0tIGEvbW0vZGVidWdfdm1fcGd0YWJsZS5j Cj4gKysrIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gQEAgLTIxLDYgKzIxLDcgQEAKPiAgICNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9wZm5fdC5oPgo+ICAg I2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGd0YWJsZS5oPgo+ ICAgI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgo+IEBAIC0yOCw2ICsyOSw3IEBACj4gICAj aW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc2NoZWQv bW0uaD4KPiAgICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgo+ICsjaW5jbHVkZSA8YXNtL3RsYmZs dXNoLmg+Cj4gICAKPiAgICNkZWZpbmUgVk1GTEFHUwkoVk1fUkVBRHxWTV9XUklURXxWTV9FWEVD KQo+ICAgCj4gQEAgLTU1LDYgKzU3LDU0IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwdGVfYmFzaWNf dGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gICAJV0FSTl9PTihwdGVf d3JpdGUocHRlX3dycHJvdGVjdChwdGVfbWt3cml0ZShwdGUpKSkpOwo+ICAgfQo+ICAgCj4gK3N0 YXRpYyB2b2lkIF9faW5pdCBwdGVfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0s Cj4gKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCAqcHRlcCwKPiArCQkJdW5z aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGln biBhcmdzIHByb3Blcmx5LgoKPiArewo+ICsJcHRlX3QgcHRlID0gcGZuX3B0ZShwZm4sIHByb3Qp Owo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZh ZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcHRlcCk7 Cj4gKwlwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwo+ICsJV0FSTl9PTihwdGVfd3JpdGUocHRlKSk7 Cj4gKwo+ICsJcHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsK PiArCXB0ZSA9IFJFQURfT05DRSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsK PiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0 KHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRl X21rZGlydHkocHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVw LCBwdGUsIDEpOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04oIShwdGVf d3JpdGUocHRlKSAmJiBwdGVfZGlydHkocHRlKSkpOwo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZu LCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9n ZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRyLCBwdGVwLCAxKTsKPiArCXB0ZSA9IFJFQURfT05D RSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBwdGVf bWt5b3VuZyhwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlw dGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVB RF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsK PiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9Cj4gICAjaWZkZWYg Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcG1kX2Jh c2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgewo+IEBAIC03 Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25l ZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRfYmFkKHBtZF9ta2h1 Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfYWR2YW5jZWRf dGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHZh ZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICsJcG1kX3Qg cG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50X2h1 Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdydCBI UEFHRV9QTURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QTURfTUFTSykgKyBI UEFHRV9QTURfU0laRTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlzZXRf cG1kX2F0KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04ocG1k X3dyaXRlKHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9w bWRfYXQobW0sIHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXIo bW0sIHZhZGRyLCBwbWRwKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlw bWQgPSBwbWRfd3Jwcm90ZWN0KHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWtjbGVhbihwbWQpOwo+ICsJ c2V0X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWt3cml0ZShw bWQpOwo+ICsJcG1kID0gcG1kX21rZGlydHkocG1kKTsKPiArCXBtZHBfc2V0X2FjY2Vzc19mbGFn cyh2bWEsIHZhZGRyLCBwbWRwLCBwbWQsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsK PiArCVdBUk5fT04oIShwbWRfd3JpdGUocG1kKSAmJiBwbWRfZGlydHkocG1kKSkpOwo+ICsKPiAr CXBtZCA9IHBtZF9ta2h1Z2UocGZuX3BtZChwZm4sIHByb3QpKTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXJfZnVsbCh2bWEs IHZhZGRyLCBwbWRwLCAxKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwbWRfbWt5b3VuZyhwbWQpOwo+ICsJc2V0 X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX3Rlc3RfYW5kX2NsZWFyX3lv dW5nKHZtYSwgdmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdB Uk5fT04ocG1kX3lvdW5nKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1k X2xlYWZfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBt ZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCj4gKwkvKgo+ICsJICogUE1EIGJhc2Vk IFRIUCBpcyBhIGxlYWYgZW50cnkuCj4gKwkgKi8KPiArCXBtZCA9IHBtZF9ta2h1Z2UocG1kKTsK PiArCVdBUk5fT04oIXBtZF9sZWFmKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcG1kX2h1Z2VfdGVzdHMocG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQ7Cj4gKwo+ICsJaWYgKCFJU19FTkFCTEVEKENPTkZJ R19IQVZFX0FSQ0hfSFVHRV9WTUFQKSkKPiArCQlyZXR1cm47Cj4gKwkvKgo+ICsJICogWDg2IGRl ZmluZWQgcG1kX3NldF9odWdlKCkgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KPiArCSAqIFBNRCBp cyBub3QgYSBwb3B1bGF0ZWQgbm9uLWxlYWYgZW50cnkuCj4gKwkgKi8KPiArCVdSSVRFX09OQ0Uo KnBtZHAsIF9fcG1kKDApKTsKPiArCVdBUk5fT04oIXBtZF9zZXRfaHVnZShwbWRwLCBfX3Bmbl90 b19waHlzKHBmbiksIHByb3QpKTsKPiArCVdBUk5fT04oIXBtZF9jbGVhcl9odWdlKHBtZHApKTsK PiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09OKCFwbWRfbm9uZShwbWQpKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2ln bmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5fcG1k KHBmbiwgcHJvdCk7Cj4gKwo+ICsJV0FSTl9PTighcG1kX3NhdmVkd3JpdGUocG1kX21rX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kKSkpKTsKPiArCVdBUk5fT04ocG1kX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kX21rX3NhdmVkd3JpdGUocG1kKSkpKTsKPiAr fQo+ICsKPiAgICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BV RAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiAgIHsKPiBAQCAtMTAwLDEyICsyMzMsMTE1IEBAIHN0YXRpYyB2 b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCj4gICAJICovCj4gICAJV0FSTl9PTighcHVkX2JhZChwdWRfbWtodWdlKHB1ZCkpKTsKPiAg IH0KPiArCj4gK3N0YXRpYyB2b2lkIHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gKwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJv dCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkKPiArCQlyZXR1cm47 Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BVRF9TSVpFICovCj4gKwl2 YWRkciA9ICh2YWRkciAmIEhQQUdFX1BVRF9NQVNLKSArIEhQQUdFX1BVRF9TSVpFOwo+ICsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF9zZXRfd3Jwcm90ZWN0 KG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9P TihwdWRfd3JpdGUocHVkKSk7Cj4gKwo+ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQK PiArCXB1ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXNldF9wdWRfYXQobW0sIHZhZGRyLCBw dWRwLCBwdWQpOwo+ICsJcHVkcF9odWdlX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdWRwKTsK PiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRfbm9uZShwdWQpKTsK PiArCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRk ciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRy LCBwdWRwLCAxKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRf bm9uZShwdWQpKTsKPiArI2VuZGlmIC8qIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQgKi8KPiArCXB1 ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXB1ZCA9IHB1ZF93cnByb3RlY3QocHVkKTsKPiAr CXB1ZCA9IHB1ZF9ta2NsZWFuKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwg cHVkKTsKPiArCXB1ZCA9IHB1ZF9ta3dyaXRlKHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtkaXJ0eShw dWQpOwo+ICsJcHVkcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB1ZHAsIHB1ZCwgMSk7 Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighKHB1ZF93cml0ZShwdWQp ICYmIHB1ZF9kaXJ0eShwdWQpKSk7Cj4gKwo+ICsJcHVkID0gcHVkX21reW91bmcocHVkKTsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF90ZXN0X2FuZF9jbGVh cl95b3VuZyh2bWEsIHZhZGRyLCBwdWRwKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4g KwlXQVJOX09OKHB1ZF95b3VuZyhwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4g KwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwo+ICsJLyoKPiArCSAqIFBVRCBi YXNlZCBUSFAgaXMgYSBsZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlwdWQgPSBwdWRfbWtodWdlKHB1 ZCk7Cj4gKwlXQVJOX09OKCFwdWRfbGVhZihwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg X19pbml0IHB1ZF9odWdlX3Rlc3RzKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkOwo+ICsKPiArCWlmICghSVNfRU5BQkxFRChD T05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCkpCj4gKwkJcmV0dXJuOwo+ICsJLyoKPiArCSAqIFg4 NiBkZWZpbmVkIHB1ZF9zZXRfaHVnZSgpIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCj4gKwkgKiBQ VUQgaXMgbm90IGEgcG9wdWxhdGVkIG5vbi1sZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlXUklURV9P TkNFKCpwdWRwLCBfX3B1ZCgwKSk7Cj4gKwlXQVJOX09OKCFwdWRfc2V0X2h1Z2UocHVkcCwgX19w Zm5fdG9fcGh5cyhwZm4pLCBwcm90KSk7Cj4gKwlXQVJOX09OKCFwdWRfY2xlYXJfaHVnZShwdWRw KSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVk KSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdF UEFHRV9QVUQgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBwdWRfYWR2YW5j ZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEsIHB1ZF90ICpwdWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25n IHZhZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICt9Cj4g K3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRf dCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICAg I2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4g ICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGljIHZv aWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxv bmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9hZHZh bmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxv bmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30K PiArc3RhdGljIHZvaWQgX19pbml0IHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9s ZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGlj IHZvaWQgX19pbml0IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9odWdlX3Rlc3RzKHBtZF90ICpwbWRw LCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVk d3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgCj4gICBzdGF0aWMgdm9p ZCBfX2luaXQgcDRkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90 KQo+IEBAIC00OTUsOCArNzMxLDU2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2lj X3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgCVdBUk5fT04oIXB0 ZV9odWdlKHB0ZV9ta2h1Z2UocHRlKSkpOwo+ICAgI2VuZGlmIC8qIENPTkZJR19BUkNIX1dBTlRf R0VORVJBTF9IVUdFVExCICovCj4gICB9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRs Yl9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcg cGZuLAo+ICsJCQkJCSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ ICsJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwo+ICsJcHRlX3QgcHRlID0g UkVBRF9PTkNFKCpwdGVwKTsKPiArCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAoX19wZm5fdG9fcGh5 cyhwZm4pIHwgUkFORE9NX09SVkFMVUUpICYgUE1EX01BU0s7Cj4gKwo+ICsJcHRlID0gcHRlX21r aHVnZShta19wdGUocGZuX3RvX3BhZ2UoUEhZU19QRk4ocGFkZHIpKSwgcHJvdCkpOwo+ICsJc2V0 X2h1Z2VfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCVdB Uk5fT04oIXB0ZV9zYW1lKHB0ZSwgaHVnZV9wdGVwX2dldChwdGVwKSkpOwo+ICsJaHVnZV9wdGVf Y2xlYXIobW0sIHZhZGRyLCBwdGVwLCBQTURfU0laRSk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0 KHB0ZXApOwo+ICsJV0FSTl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBt a19odWdlX3B0ZShwYWdlLCBwcm90KTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0 ZXAsIHB0ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlodWdlX3B0ZXBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04o aHVnZV9wdGVfd3JpdGUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJv dCk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmll cigpOwo+ICsJaHVnZV9wdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0 ZSA9IGh1Z2VfcHRlcF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKCFodWdlX3B0ZV9ub25lKHB0ZSkp Owo+ICsKPiArCXB0ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJcHRlID0gaHVnZV9w dGVfd3Jwcm90ZWN0KHB0ZSk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBw dGUpOwo+ICsJYmFycmllcigpOwo+ICsJcHRlID0gaHVnZV9wdGVfbWt3cml0ZShwdGUpOwo+ICsJ cHRlID0gaHVnZV9wdGVfbWtkaXJ0eShwdGUpOwo+ICsJaHVnZV9wdGVwX3NldF9hY2Nlc3NfZmxh Z3Modm1hLCB2YWRkciwgcHRlcCwgcHRlLCAxKTsKPiArCXB0ZSA9IGh1Z2VfcHRlcF9nZXQocHRl cCk7Cj4gKwlXQVJOX09OKCEoaHVnZV9wdGVfd3JpdGUocHRlKSAmJiBodWdlX3B0ZV9kaXJ0eShw dGUpKSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgc3Rh dGljIHZvaWQgX19pbml0IGh1Z2V0bGJfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBn cHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRsYl9hZHZhbmNlZF90 ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLAo+ICsJCQkJ CSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gICAjZW5k aWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgCj4gICAjaWZkZWYgQ09ORklHX1RSQU5T UEFSRU5UX0hVR0VQQUdFCj4gQEAgLTU2OCw2ICs4NTIsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9u ZyBfX2luaXQgZ2V0X3JhbmRvbV92YWRkcih2b2lkKQo+ICAgCj4gICBzdGF0aWMgaW50IF9faW5p dCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQpCj4gICB7Cj4gKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qg KnZtYTsKPiAgIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKPiAgIAlwZ2RfdCAqcGdkcDsKPiAgIAlw NGRfdCAqcDRkcCwgKnNhdmVkX3A0ZHA7Cj4gQEAgLTU5Niw2ICs4ODEsMTIgQEAgc3RhdGljIGlu dCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCSAqLwo+ICAgCXByb3Rub25lID0g X19QMDAwOwo+ICAgCj4gKwl2bWEgPSB2bV9hcmVhX2FsbG9jKG1tKTsKPiArCWlmICghdm1hKSB7 Cj4gKwkJcHJfZXJyKCJ2bWEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAxOwo+ ICsJfQo+ICsKPiAgIAkvKgo+ICAgCSAqIFBGTiBmb3IgbWFwcGluZyBhdCBQVEUgbGV2ZWwgaXMg ZGV0ZXJtaW5lZCBmcm9tIGEgc3RhbmRhcmQga2VybmVsCj4gICAJICogdGV4dCBzeW1ib2wuIEJ1 dCBwZm5zIGZvciBoaWdoZXIgcGFnZSB0YWJsZSBsZXZlbHMgYXJlIGRlcml2ZWQgYnkKPiBAQCAt NjQ0LDYgKzkzNSwyMCBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQp Cj4gICAJcDRkX2NsZWFyX3Rlc3RzKG1tLCBwNGRwKTsKPiAgIAlwZ2RfY2xlYXJfdGVzdHMobW0s IHBnZHApOwo+ICAgCj4gKwlwdGVfYWR2YW5jZWRfdGVzdHMobW0sIHZtYSwgcHRlcCwgcHRlX2Fs aWduZWQsIHZhZGRyLCBwcm90KTsKPiArCXBtZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwbWRw LCBwbWRfYWxpZ25lZCwgdmFkZHIsIHByb3QpOwo+ICsJcHVkX2FkdmFuY2VkX3Rlc3RzKG1tLCB2 bWEsIHB1ZHAsIHB1ZF9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlodWdldGxiX2FkdmFuY2Vk X3Rlc3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwo+ICsJ cG1kX2xlYWZfdGVzdHMocG1kX2FsaWduZWQsIHByb3QpOwo+ICsJcHVkX2xlYWZfdGVzdHMocHVk X2FsaWduZWQsIHByb3QpOwo+ICsKPiArCXBtZF9odWdlX3Rlc3RzKHBtZHAsIHBtZF9hbGlnbmVk LCBwcm90KTsKPiArCXB1ZF9odWdlX3Rlc3RzKHB1ZHAsIHB1ZF9hbGlnbmVkLCBwcm90KTsKPiAr Cj4gKwlwdGVfc2F2ZWR3cml0ZV90ZXN0cyhwdGVfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwbWRfc2F2 ZWR3cml0ZV90ZXN0cyhwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICAgCXB0ZV91bm1hcF91bmxv Y2socHRlcCwgcHRsKTsKPiAgIAo+ICAgCXBtZF9wb3B1bGF0ZV90ZXN0cyhtbSwgcG1kcCwgc2F2 ZWRfcHRlcCk7Cj4gQEAgLTY3OCw2ICs5ODMsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192 bV9wZ3RhYmxlKHZvaWQpCj4gICAJcG1kX2ZyZWUobW0sIHNhdmVkX3BtZHApOwo+ICAgCXB0ZV9m cmVlKG1tLCBzYXZlZF9wdGVwKTsKPiAgIAo+ICsJdm1fYXJlYV9mcmVlKHZtYSk7Cj4gICAJbW1f ZGVjX25yX3B1ZHMobW0pOwo+ICAgCW1tX2RlY19ucl9wbWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cHRlcyhtbSk7Cj4gCgpDaHJpc3RvcGhlCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2Cg== 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.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 5DFCFC433E0 for ; Sat, 27 Jun 2020 07:29:12 +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 DDA7C2081A for ; Sat, 27 Jun 2020 07:29:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DDA7C2081A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49v53T6FTBzDqd2 for ; Sat, 27 Jun 2020 17:29:09 +1000 (AEST) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=csgroup.eu (client-ip=93.17.236.30; helo=pegase1.c-s.fr; envelope-from=christophe.leroy@csgroup.eu; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Received: from pegase1.c-s.fr (pegase1.c-s.fr [93.17.236.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 49v5142bcwzDqNr for ; Sat, 27 Jun 2020 17:27:03 +1000 (AEST) Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v50y2n7Lz9tyWd; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id pXgL3pLy5jWH; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v50y1hbJz9tyWZ; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 6F5AE8B772; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id A0nwexkhePdw; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3D7FC8B75B; Sat, 27 Jun 2020 09:26:57 +0200 (CEST) Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers To: Anshuman Khandual , linux-mm@kvack.org References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> From: Christophe Leroy Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> Date: Sat, 27 Jun 2020 09:26:55 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr 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: 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 , gerald.schaefer@de.ibm.com, ziy@nvidia.com, Catalin Marinas , 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" Le 15/06/2020 à 05:37, Anshuman Khandual a écrit : > This adds new tests validating for these following arch advanced page table > helpers. These tests create and test specific mapping types at various page > table levels. > > 1. pxxp_set_wrprotect() > 2. pxxp_get_and_clear() > 3. pxxp_set_access_flags() > 4. pxxp_get_and_clear_full() > 5. pxxp_test_and_clear_young() > 6. pxx_leaf() > 7. pxx_set_huge() > 8. pxx_(clear|mk)_savedwrite() > 9. huge_pxxp_xxx() > > 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-mm@kvack.org > Cc: linux-arch@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Suggested-by: Catalin Marinas > Signed-off-by: Anshuman Khandual > --- > mm/debug_vm_pgtable.c | 306 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 306 insertions(+) > > diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c > index ffa163d4c63c..e3f9f8317a98 100644 > --- a/mm/debug_vm_pgtable.c > +++ b/mm/debug_vm_pgtable.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -28,6 +29,7 @@ > #include > #include > #include > +#include > > #define VMFLAGS (VM_READ|VM_WRITE|VM_EXEC) > > @@ -55,6 +57,54 @@ static void __init pte_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte)))); > } > > +static void __init pte_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pte_t *ptep, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly. > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_set_wrprotect(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_write(pte)); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear(mm, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pfn_pte(pfn, prot); > + pte = pte_wrprotect(pte); > + pte = pte_mkclean(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + pte = pte_mkwrite(pte); > + pte = pte_mkdirty(pte); > + ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!(pte_write(pte) && pte_dirty(pte))); > + > + pte = pfn_pte(pfn, prot); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_get_and_clear_full(mm, vaddr, ptep, 1); > + pte = READ_ONCE(*ptep); > + WARN_ON(!pte_none(pte)); > + > + pte = pte_mkyoung(pte); > + set_pte_at(mm, vaddr, ptep, pte); > + ptep_test_and_clear_young(vma, vaddr, ptep); > + pte = READ_ONCE(*ptep); > + WARN_ON(pte_young(pte)); > +} > + > +static void __init pte_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pte_t pte = pfn_pte(pfn, prot); > + > + WARN_ON(!pte_savedwrite(pte_mk_savedwrite(pte_clear_savedwrite(pte)))); > + WARN_ON(pte_savedwrite(pte_clear_savedwrite(pte_mk_savedwrite(pte)))); > +} > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -77,6 +127,89 @@ static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pmd_bad(pmd_mkhuge(pmd))); > } > > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PMD_SIZE */ > + vaddr = (vaddr & HPAGE_PMD_MASK) + HPAGE_PMD_SIZE; > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_set_wrprotect(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_write(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear(mm, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pfn_pmd(pfn, prot); > + pmd = pmd_wrprotect(pmd); > + pmd = pmd_mkclean(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmd = pmd_mkwrite(pmd); > + pmd = pmd_mkdirty(pmd); > + pmdp_set_access_flags(vma, vaddr, pmdp, pmd, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd))); > + > + pmd = pmd_mkhuge(pfn_pmd(pfn, prot)); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_huge_get_and_clear_full(vma, vaddr, pmdp, 1); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > + > + pmd = pmd_mkyoung(pmd); > + set_pmd_at(mm, vaddr, pmdp, pmd); > + pmdp_test_and_clear_young(vma, vaddr, pmdp); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(pmd_young(pmd)); > +} > + > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + /* > + * PMD based THP is a leaf entry. > + */ > + pmd = pmd_mkhuge(pmd); > + WARN_ON(!pmd_leaf(pmd)); > +} > + > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pmd_set_huge() verifies that the given > + * PMD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pmdp, __pmd(0)); > + WARN_ON(!pmd_set_huge(pmdp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pmd_clear_huge(pmdp)); > + pmd = READ_ONCE(*pmdp); > + WARN_ON(!pmd_none(pmd)); > +} > + > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) > +{ > + pmd_t pmd = pfn_pmd(pfn, prot); > + > + WARN_ON(!pmd_savedwrite(pmd_mk_savedwrite(pmd_clear_savedwrite(pmd)))); > + WARN_ON(pmd_savedwrite(pmd_clear_savedwrite(pmd_mk_savedwrite(pmd)))); > +} > + > #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > { > @@ -100,12 +233,115 @@ static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) > */ > WARN_ON(!pud_bad(pud_mkhuge(pud))); > } > + > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + if (!has_transparent_hugepage()) > + return; > + > + /* Align the address wrt HPAGE_PUD_SIZE */ > + vaddr = (vaddr & HPAGE_PUD_MASK) + HPAGE_PUD_SIZE; > + > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_set_wrprotect(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_write(pud)); > + > +#ifndef __PAGETABLE_PMD_FOLDED > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear(mm, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > + > + pud = pfn_pud(pfn, prot); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_huge_get_and_clear_full(mm, vaddr, pudp, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +#endif /* __PAGETABLE_PMD_FOLDED */ > + pud = pfn_pud(pfn, prot); > + pud = pud_wrprotect(pud); > + pud = pud_mkclean(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pud = pud_mkwrite(pud); > + pud = pud_mkdirty(pud); > + pudp_set_access_flags(vma, vaddr, pudp, pud, 1); > + pud = READ_ONCE(*pudp); > + WARN_ON(!(pud_write(pud) && pud_dirty(pud))); > + > + pud = pud_mkyoung(pud); > + set_pud_at(mm, vaddr, pudp, pud); > + pudp_test_and_clear_young(vma, vaddr, pudp); > + pud = READ_ONCE(*pudp); > + WARN_ON(pud_young(pud)); > +} > + > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud = pfn_pud(pfn, prot); > + > + /* > + * PUD based THP is a leaf entry. > + */ > + pud = pud_mkhuge(pud); > + WARN_ON(!pud_leaf(pud)); > +} > + > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > + pud_t pud; > + > + if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) > + return; > + /* > + * X86 defined pud_set_huge() verifies that the given > + * PUD is not a populated non-leaf entry. > + */ > + WRITE_ONCE(*pudp, __pud(0)); > + WARN_ON(!pud_set_huge(pudp, __pfn_to_phys(pfn), prot)); > + WARN_ON(!pud_clear_huge(pudp)); > + pud = READ_ONCE(*pudp); > + WARN_ON(!pud_none(pud)); > +} > #else /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ > #else /* !CONFIG_TRANSPARENT_HUGEPAGE */ > static void __init pmd_basic_tests(unsigned long pfn, pgprot_t prot) { } > static void __init pud_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pmd_t *pmdp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pud_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, pud_t *pudp, > + unsigned long pfn, unsigned long vaddr, pgprot_t prot) Align args properly > +{ > +} > +static void __init pmd_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pud_leaf_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init pmd_huge_tests(pmd_t *pmdp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pud_huge_tests(pud_t *pudp, unsigned long pfn, pgprot_t prot) > +{ > +} > +static void __init pmd_savedwrite_tests(unsigned long pfn, pgprot_t prot) { } > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > static void __init p4d_basic_tests(unsigned long pfn, pgprot_t prot) > @@ -495,8 +731,56 @@ static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) > WARN_ON(!pte_huge(pte_mkhuge(pte))); > #endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */ > } > + > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > + struct page *page = pfn_to_page(pfn); > + pte_t pte = READ_ONCE(*ptep); > + unsigned long paddr = (__pfn_to_phys(pfn) | RANDOM_ORVALUE) & PMD_MASK; > + > + pte = pte_mkhuge(mk_pte(pfn_to_page(PHYS_PFN(paddr)), prot)); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + WARN_ON(!pte_same(pte, huge_ptep_get(ptep))); > + huge_pte_clear(mm, vaddr, ptep, PMD_SIZE); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_set_wrprotect(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(huge_pte_write(pte)); > + > + pte = mk_huge_pte(page, prot); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + huge_ptep_get_and_clear(mm, vaddr, ptep); > + pte = huge_ptep_get(ptep); > + WARN_ON(!huge_pte_none(pte)); > + > + pte = mk_huge_pte(page, prot); > + pte = huge_pte_wrprotect(pte); > + set_huge_pte_at(mm, vaddr, ptep, pte); > + barrier(); > + pte = huge_pte_mkwrite(pte); > + pte = huge_pte_mkdirty(pte); > + huge_ptep_set_access_flags(vma, vaddr, ptep, pte, 1); > + pte = huge_ptep_get(ptep); > + WARN_ON(!(huge_pte_write(pte) && huge_pte_dirty(pte))); > +} > #else /* !CONFIG_HUGETLB_PAGE */ > static void __init hugetlb_basic_tests(unsigned long pfn, pgprot_t prot) { } > +static void __init hugetlb_advanced_tests(struct mm_struct *mm, > + struct vm_area_struct *vma, > + pte_t *ptep, unsigned long pfn, > + unsigned long vaddr, pgprot_t prot) > +{ > +} > #endif /* CONFIG_HUGETLB_PAGE */ > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > @@ -568,6 +852,7 @@ static unsigned long __init get_random_vaddr(void) > > static int __init debug_vm_pgtable(void) > { > + struct vm_area_struct *vma; > struct mm_struct *mm; > pgd_t *pgdp; > p4d_t *p4dp, *saved_p4dp; > @@ -596,6 +881,12 @@ static int __init debug_vm_pgtable(void) > */ > protnone = __P000; > > + vma = vm_area_alloc(mm); > + if (!vma) { > + pr_err("vma allocation failed\n"); > + return 1; > + } > + > /* > * PFN for mapping at PTE level is determined from a standard kernel > * text symbol. But pfns for higher page table levels are derived by > @@ -644,6 +935,20 @@ static int __init debug_vm_pgtable(void) > p4d_clear_tests(mm, p4dp); > pgd_clear_tests(mm, pgdp); > > + pte_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + pmd_advanced_tests(mm, vma, pmdp, pmd_aligned, vaddr, prot); > + pud_advanced_tests(mm, vma, pudp, pud_aligned, vaddr, prot); > + hugetlb_advanced_tests(mm, vma, ptep, pte_aligned, vaddr, prot); > + > + pmd_leaf_tests(pmd_aligned, prot); > + pud_leaf_tests(pud_aligned, prot); > + > + pmd_huge_tests(pmdp, pmd_aligned, prot); > + pud_huge_tests(pudp, pud_aligned, prot); > + > + pte_savedwrite_tests(pte_aligned, prot); > + pmd_savedwrite_tests(pmd_aligned, prot); > + > pte_unmap_unlock(ptep, ptl); > > pmd_populate_tests(mm, pmdp, saved_ptep); > @@ -678,6 +983,7 @@ static int __init debug_vm_pgtable(void) > pmd_free(mm, saved_pmdp); > pte_free(mm, saved_ptep); > > + vm_area_free(vma); > mm_dec_nr_puds(mm); > mm_dec_nr_pmds(mm); > mm_dec_nr_ptes(mm); > Christophe 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.5 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,URIBL_BLOCKED,USER_AGENT_SANE_1 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 B7E31C433DF for ; Sat, 27 Jun 2020 07:27:15 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 760352081A for ; Sat, 27 Jun 2020 07:27:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="iLvITafP" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 760352081A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=csgroup.eu 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=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=rq5j+fHSd9nfmd+QXtvmCXsfWF85TcdaetzDHBiDLuY=; b=iLvITafPpBHjDM1pFvM5mazmA hF5rWKR9qc386LMzymDRJgEgD1phCC7AmiAToLOSzXHXJEMN/C4K8JkGAD9rGieRS1XxVXsOvNBn/ XpwckOhGSyc5NT5rZGrRJTu1BspC/L1MCiV70YtFVnpgalGBGith8+whU4PsrtQEgdbNs7Pj3tX8v ICl/ZXhW47srmEIcwbtOyNM9lfJJv3gEfbV9r98l5DN0kWFeEcpYTL9Eho6OEQIzBpWzfTJBw694I +zfAwZToAIjSMtEv1tkKn22Kqcvd+gUKMPx8SAudNv8UZb8+XS8aKepwo3LwSxPcSUlokL3KkPt+h /FtGEA5+g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5F3-0000cG-Tz; Sat, 27 Jun 2020 07:27:14 +0000 Received: from pegase1.c-s.fr ([93.17.236.30]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5Ex-0000bD-Pp; Sat, 27 Jun 2020 07:27:09 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v50y2n7Lz9tyWd; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id pXgL3pLy5jWH; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v50y1hbJz9tyWZ; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 6F5AE8B772; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id A0nwexkhePdw; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3D7FC8B75B; Sat, 27 Jun 2020 09:26:57 +0200 (CEST) Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers To: Anshuman Khandual , linux-mm@kvack.org References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> From: Christophe Leroy Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> Date: Sat, 27 Jun 2020 09:26:55 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Language: fr 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: Benjamin Herrenschmidt , 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 , gerald.schaefer@de.ibm.com, ziy@nvidia.com, Catalin Marinas , 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 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-snps-arc" Errors-To: linux-snps-arc-bounces+linux-snps-arc=archiver.kernel.org@lists.infradead.org CgpMZSAxNS8wNi8yMDIwIMOgIDA1OjM3LCBBbnNodW1hbiBLaGFuZHVhbCBhIMOpY3JpdMKgOgo+ IFRoaXMgYWRkcyBuZXcgdGVzdHMgdmFsaWRhdGluZyBmb3IgdGhlc2UgZm9sbG93aW5nIGFyY2gg YWR2YW5jZWQgcGFnZSB0YWJsZQo+IGhlbHBlcnMuIFRoZXNlIHRlc3RzIGNyZWF0ZSBhbmQgdGVz dCBzcGVjaWZpYyBtYXBwaW5nIHR5cGVzIGF0IHZhcmlvdXMgcGFnZQo+IHRhYmxlIGxldmVscy4K PiAKPiAxLiBweHhwX3NldF93cnByb3RlY3QoKQo+IDIuIHB4eHBfZ2V0X2FuZF9jbGVhcigpCj4g My4gcHh4cF9zZXRfYWNjZXNzX2ZsYWdzKCkKPiA0LiBweHhwX2dldF9hbmRfY2xlYXJfZnVsbCgp Cj4gNS4gcHh4cF90ZXN0X2FuZF9jbGVhcl95b3VuZygpCj4gNi4gcHh4X2xlYWYoKQo+IDcuIHB4 eF9zZXRfaHVnZSgpCj4gOC4gcHh4XyhjbGVhcnxtaylfc2F2ZWR3cml0ZSgpCj4gOS4gaHVnZV9w eHhwX3h4eCgpCj4gCj4gQ2M6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5v cmc+Cj4gQ2M6IE1pa2UgUmFwb3BvcnQgPHJwcHRAbGludXguaWJtLmNvbT4KPiBDYzogVmluZWV0 IEd1cHRhIDx2Z3VwdGFAc3lub3BzeXMuY29tPgo+IENjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFs aW4ubWFyaW5hc0Bhcm0uY29tPgo+IENjOiBXaWxsIERlYWNvbiA8d2lsbEBrZXJuZWwub3JnPgo+ IENjOiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Cj4g Q2M6IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgo+IENjOiBNaWNoYWVsIEVsbGVy bWFuIDxtcGVAZWxsZXJtYW4uaWQuYXU+Cj4gQ2M6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJz dGVuc0BkZS5pYm0uY29tPgo+IENjOiBWYXNpbHkgR29yYmlrIDxnb3JAbGludXguaWJtLmNvbT4K PiBDYzogQ2hyaXN0aWFuIEJvcm50cmFlZ2VyIDxib3JudHJhZWdlckBkZS5pYm0uY29tPgo+IENj OiBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KPiBDYzogSW5nbyBNb2xuYXIg PG1pbmdvQHJlZGhhdC5jb20+Cj4gQ2M6IEJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgo+ IENjOiAiSC4gUGV0ZXIgQW52aW4iIDxocGFAenl0b3IuY29tPgo+IENjOiBLaXJpbGwgQS4gU2h1 dGVtb3YgPGtpcmlsbEBzaHV0ZW1vdi5uYW1lPgo+IENjOiBQYXVsIFdhbG1zbGV5IDxwYXVsLndh bG1zbGV5QHNpZml2ZS5jb20+Cj4gQ2M6IFBhbG1lciBEYWJiZWx0IDxwYWxtZXJAZGFiYmVsdC5j b20+Cj4gQ2M6IGxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4gQ2M6IGxpbnV4cHBjLWRldkBsaXN0cy5v emxhYnMub3JnCj4gQ2M6IGxpbnV4LXMzOTBAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogeDg2QGtlcm5lbC5vcmcKPiBDYzogbGludXgt bW1Aa3ZhY2sub3JnCj4gQ2M6IGxpbnV4LWFyY2hAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4 LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKPiBTdWdnZXN0ZWQtYnk6IENhdGFsaW4gTWFyaW5hcyA8 Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQW5zaHVtYW4gS2hhbmR1 YWwgPGFuc2h1bWFuLmtoYW5kdWFsQGFybS5jb20+Cj4gLS0tCj4gICBtbS9kZWJ1Z192bV9wZ3Rh YmxlLmMgfCAzMDYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g ICAxIGZpbGUgY2hhbmdlZCwgMzA2IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvbW0v ZGVidWdfdm1fcGd0YWJsZS5jIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gaW5kZXggZmZhMTYz ZDRjNjNjLi5lM2Y5ZjgzMTdhOTggMTAwNjQ0Cj4gLS0tIGEvbW0vZGVidWdfdm1fcGd0YWJsZS5j Cj4gKysrIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gQEAgLTIxLDYgKzIxLDcgQEAKPiAgICNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9wZm5fdC5oPgo+ICAg I2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGd0YWJsZS5oPgo+ ICAgI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgo+IEBAIC0yOCw2ICsyOSw3IEBACj4gICAj aW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc2NoZWQv bW0uaD4KPiAgICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgo+ICsjaW5jbHVkZSA8YXNtL3RsYmZs dXNoLmg+Cj4gICAKPiAgICNkZWZpbmUgVk1GTEFHUwkoVk1fUkVBRHxWTV9XUklURXxWTV9FWEVD KQo+ICAgCj4gQEAgLTU1LDYgKzU3LDU0IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwdGVfYmFzaWNf dGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gICAJV0FSTl9PTihwdGVf d3JpdGUocHRlX3dycHJvdGVjdChwdGVfbWt3cml0ZShwdGUpKSkpOwo+ICAgfQo+ICAgCj4gK3N0 YXRpYyB2b2lkIF9faW5pdCBwdGVfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0s Cj4gKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCAqcHRlcCwKPiArCQkJdW5z aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGln biBhcmdzIHByb3Blcmx5LgoKPiArewo+ICsJcHRlX3QgcHRlID0gcGZuX3B0ZShwZm4sIHByb3Qp Owo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZh ZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcHRlcCk7 Cj4gKwlwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwo+ICsJV0FSTl9PTihwdGVfd3JpdGUocHRlKSk7 Cj4gKwo+ICsJcHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsK PiArCXB0ZSA9IFJFQURfT05DRSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsK PiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0 KHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRl X21rZGlydHkocHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVw LCBwdGUsIDEpOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04oIShwdGVf d3JpdGUocHRlKSAmJiBwdGVfZGlydHkocHRlKSkpOwo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZu LCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9n ZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRyLCBwdGVwLCAxKTsKPiArCXB0ZSA9IFJFQURfT05D RSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBwdGVf bWt5b3VuZyhwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlw dGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVB RF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsK PiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9Cj4gICAjaWZkZWYg Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcG1kX2Jh c2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgewo+IEBAIC03 Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25l ZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRfYmFkKHBtZF9ta2h1 Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfYWR2YW5jZWRf dGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHZh ZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICsJcG1kX3Qg cG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50X2h1 Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdydCBI UEFHRV9QTURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QTURfTUFTSykgKyBI UEFHRV9QTURfU0laRTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlzZXRf cG1kX2F0KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04ocG1k X3dyaXRlKHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9w bWRfYXQobW0sIHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXIo bW0sIHZhZGRyLCBwbWRwKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlw bWQgPSBwbWRfd3Jwcm90ZWN0KHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWtjbGVhbihwbWQpOwo+ICsJ c2V0X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWt3cml0ZShw bWQpOwo+ICsJcG1kID0gcG1kX21rZGlydHkocG1kKTsKPiArCXBtZHBfc2V0X2FjY2Vzc19mbGFn cyh2bWEsIHZhZGRyLCBwbWRwLCBwbWQsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsK PiArCVdBUk5fT04oIShwbWRfd3JpdGUocG1kKSAmJiBwbWRfZGlydHkocG1kKSkpOwo+ICsKPiAr CXBtZCA9IHBtZF9ta2h1Z2UocGZuX3BtZChwZm4sIHByb3QpKTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXJfZnVsbCh2bWEs IHZhZGRyLCBwbWRwLCAxKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwbWRfbWt5b3VuZyhwbWQpOwo+ICsJc2V0 X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX3Rlc3RfYW5kX2NsZWFyX3lv dW5nKHZtYSwgdmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdB Uk5fT04ocG1kX3lvdW5nKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1k X2xlYWZfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBt ZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCj4gKwkvKgo+ICsJICogUE1EIGJhc2Vk IFRIUCBpcyBhIGxlYWYgZW50cnkuCj4gKwkgKi8KPiArCXBtZCA9IHBtZF9ta2h1Z2UocG1kKTsK PiArCVdBUk5fT04oIXBtZF9sZWFmKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcG1kX2h1Z2VfdGVzdHMocG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQ7Cj4gKwo+ICsJaWYgKCFJU19FTkFCTEVEKENPTkZJ R19IQVZFX0FSQ0hfSFVHRV9WTUFQKSkKPiArCQlyZXR1cm47Cj4gKwkvKgo+ICsJICogWDg2IGRl ZmluZWQgcG1kX3NldF9odWdlKCkgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KPiArCSAqIFBNRCBp cyBub3QgYSBwb3B1bGF0ZWQgbm9uLWxlYWYgZW50cnkuCj4gKwkgKi8KPiArCVdSSVRFX09OQ0Uo KnBtZHAsIF9fcG1kKDApKTsKPiArCVdBUk5fT04oIXBtZF9zZXRfaHVnZShwbWRwLCBfX3Bmbl90 b19waHlzKHBmbiksIHByb3QpKTsKPiArCVdBUk5fT04oIXBtZF9jbGVhcl9odWdlKHBtZHApKTsK PiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09OKCFwbWRfbm9uZShwbWQpKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2ln bmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5fcG1k KHBmbiwgcHJvdCk7Cj4gKwo+ICsJV0FSTl9PTighcG1kX3NhdmVkd3JpdGUocG1kX21rX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kKSkpKTsKPiArCVdBUk5fT04ocG1kX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kX21rX3NhdmVkd3JpdGUocG1kKSkpKTsKPiAr fQo+ICsKPiAgICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BV RAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiAgIHsKPiBAQCAtMTAwLDEyICsyMzMsMTE1IEBAIHN0YXRpYyB2 b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCj4gICAJICovCj4gICAJV0FSTl9PTighcHVkX2JhZChwdWRfbWtodWdlKHB1ZCkpKTsKPiAg IH0KPiArCj4gK3N0YXRpYyB2b2lkIHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gKwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJv dCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkKPiArCQlyZXR1cm47 Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BVRF9TSVpFICovCj4gKwl2 YWRkciA9ICh2YWRkciAmIEhQQUdFX1BVRF9NQVNLKSArIEhQQUdFX1BVRF9TSVpFOwo+ICsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF9zZXRfd3Jwcm90ZWN0 KG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9P TihwdWRfd3JpdGUocHVkKSk7Cj4gKwo+ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQK PiArCXB1ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXNldF9wdWRfYXQobW0sIHZhZGRyLCBw dWRwLCBwdWQpOwo+ICsJcHVkcF9odWdlX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdWRwKTsK PiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRfbm9uZShwdWQpKTsK PiArCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRk ciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRy LCBwdWRwLCAxKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRf bm9uZShwdWQpKTsKPiArI2VuZGlmIC8qIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQgKi8KPiArCXB1 ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXB1ZCA9IHB1ZF93cnByb3RlY3QocHVkKTsKPiAr CXB1ZCA9IHB1ZF9ta2NsZWFuKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwg cHVkKTsKPiArCXB1ZCA9IHB1ZF9ta3dyaXRlKHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtkaXJ0eShw dWQpOwo+ICsJcHVkcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB1ZHAsIHB1ZCwgMSk7 Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighKHB1ZF93cml0ZShwdWQp ICYmIHB1ZF9kaXJ0eShwdWQpKSk7Cj4gKwo+ICsJcHVkID0gcHVkX21reW91bmcocHVkKTsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF90ZXN0X2FuZF9jbGVh cl95b3VuZyh2bWEsIHZhZGRyLCBwdWRwKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4g KwlXQVJOX09OKHB1ZF95b3VuZyhwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4g KwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwo+ICsJLyoKPiArCSAqIFBVRCBi YXNlZCBUSFAgaXMgYSBsZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlwdWQgPSBwdWRfbWtodWdlKHB1 ZCk7Cj4gKwlXQVJOX09OKCFwdWRfbGVhZihwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg X19pbml0IHB1ZF9odWdlX3Rlc3RzKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkOwo+ICsKPiArCWlmICghSVNfRU5BQkxFRChD T05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCkpCj4gKwkJcmV0dXJuOwo+ICsJLyoKPiArCSAqIFg4 NiBkZWZpbmVkIHB1ZF9zZXRfaHVnZSgpIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCj4gKwkgKiBQ VUQgaXMgbm90IGEgcG9wdWxhdGVkIG5vbi1sZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlXUklURV9P TkNFKCpwdWRwLCBfX3B1ZCgwKSk7Cj4gKwlXQVJOX09OKCFwdWRfc2V0X2h1Z2UocHVkcCwgX19w Zm5fdG9fcGh5cyhwZm4pLCBwcm90KSk7Cj4gKwlXQVJOX09OKCFwdWRfY2xlYXJfaHVnZShwdWRw KSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVk KSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdF UEFHRV9QVUQgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBwdWRfYWR2YW5j ZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEsIHB1ZF90ICpwdWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25n IHZhZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICt9Cj4g K3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRf dCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICAg I2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4g ICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGljIHZv aWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxv bmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9hZHZh bmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxv bmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30K PiArc3RhdGljIHZvaWQgX19pbml0IHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9s ZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGlj IHZvaWQgX19pbml0IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9odWdlX3Rlc3RzKHBtZF90ICpwbWRw LCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVk d3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgCj4gICBzdGF0aWMgdm9p ZCBfX2luaXQgcDRkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90 KQo+IEBAIC00OTUsOCArNzMxLDU2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2lj X3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgCVdBUk5fT04oIXB0 ZV9odWdlKHB0ZV9ta2h1Z2UocHRlKSkpOwo+ICAgI2VuZGlmIC8qIENPTkZJR19BUkNIX1dBTlRf R0VORVJBTF9IVUdFVExCICovCj4gICB9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRs Yl9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcg cGZuLAo+ICsJCQkJCSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ ICsJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwo+ICsJcHRlX3QgcHRlID0g UkVBRF9PTkNFKCpwdGVwKTsKPiArCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAoX19wZm5fdG9fcGh5 cyhwZm4pIHwgUkFORE9NX09SVkFMVUUpICYgUE1EX01BU0s7Cj4gKwo+ICsJcHRlID0gcHRlX21r aHVnZShta19wdGUocGZuX3RvX3BhZ2UoUEhZU19QRk4ocGFkZHIpKSwgcHJvdCkpOwo+ICsJc2V0 X2h1Z2VfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCVdB Uk5fT04oIXB0ZV9zYW1lKHB0ZSwgaHVnZV9wdGVwX2dldChwdGVwKSkpOwo+ICsJaHVnZV9wdGVf Y2xlYXIobW0sIHZhZGRyLCBwdGVwLCBQTURfU0laRSk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0 KHB0ZXApOwo+ICsJV0FSTl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBt a19odWdlX3B0ZShwYWdlLCBwcm90KTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0 ZXAsIHB0ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlodWdlX3B0ZXBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04o aHVnZV9wdGVfd3JpdGUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJv dCk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmll cigpOwo+ICsJaHVnZV9wdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0 ZSA9IGh1Z2VfcHRlcF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKCFodWdlX3B0ZV9ub25lKHB0ZSkp Owo+ICsKPiArCXB0ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJcHRlID0gaHVnZV9w dGVfd3Jwcm90ZWN0KHB0ZSk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBw dGUpOwo+ICsJYmFycmllcigpOwo+ICsJcHRlID0gaHVnZV9wdGVfbWt3cml0ZShwdGUpOwo+ICsJ cHRlID0gaHVnZV9wdGVfbWtkaXJ0eShwdGUpOwo+ICsJaHVnZV9wdGVwX3NldF9hY2Nlc3NfZmxh Z3Modm1hLCB2YWRkciwgcHRlcCwgcHRlLCAxKTsKPiArCXB0ZSA9IGh1Z2VfcHRlcF9nZXQocHRl cCk7Cj4gKwlXQVJOX09OKCEoaHVnZV9wdGVfd3JpdGUocHRlKSAmJiBodWdlX3B0ZV9kaXJ0eShw dGUpKSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgc3Rh dGljIHZvaWQgX19pbml0IGh1Z2V0bGJfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBn cHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRsYl9hZHZhbmNlZF90 ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLAo+ICsJCQkJ CSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gICAjZW5k aWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgCj4gICAjaWZkZWYgQ09ORklHX1RSQU5T UEFSRU5UX0hVR0VQQUdFCj4gQEAgLTU2OCw2ICs4NTIsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9u ZyBfX2luaXQgZ2V0X3JhbmRvbV92YWRkcih2b2lkKQo+ICAgCj4gICBzdGF0aWMgaW50IF9faW5p dCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQpCj4gICB7Cj4gKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qg KnZtYTsKPiAgIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKPiAgIAlwZ2RfdCAqcGdkcDsKPiAgIAlw NGRfdCAqcDRkcCwgKnNhdmVkX3A0ZHA7Cj4gQEAgLTU5Niw2ICs4ODEsMTIgQEAgc3RhdGljIGlu dCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCSAqLwo+ICAgCXByb3Rub25lID0g X19QMDAwOwo+ICAgCj4gKwl2bWEgPSB2bV9hcmVhX2FsbG9jKG1tKTsKPiArCWlmICghdm1hKSB7 Cj4gKwkJcHJfZXJyKCJ2bWEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAxOwo+ ICsJfQo+ICsKPiAgIAkvKgo+ICAgCSAqIFBGTiBmb3IgbWFwcGluZyBhdCBQVEUgbGV2ZWwgaXMg ZGV0ZXJtaW5lZCBmcm9tIGEgc3RhbmRhcmQga2VybmVsCj4gICAJICogdGV4dCBzeW1ib2wuIEJ1 dCBwZm5zIGZvciBoaWdoZXIgcGFnZSB0YWJsZSBsZXZlbHMgYXJlIGRlcml2ZWQgYnkKPiBAQCAt NjQ0LDYgKzkzNSwyMCBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQp Cj4gICAJcDRkX2NsZWFyX3Rlc3RzKG1tLCBwNGRwKTsKPiAgIAlwZ2RfY2xlYXJfdGVzdHMobW0s IHBnZHApOwo+ICAgCj4gKwlwdGVfYWR2YW5jZWRfdGVzdHMobW0sIHZtYSwgcHRlcCwgcHRlX2Fs aWduZWQsIHZhZGRyLCBwcm90KTsKPiArCXBtZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwbWRw LCBwbWRfYWxpZ25lZCwgdmFkZHIsIHByb3QpOwo+ICsJcHVkX2FkdmFuY2VkX3Rlc3RzKG1tLCB2 bWEsIHB1ZHAsIHB1ZF9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlodWdldGxiX2FkdmFuY2Vk X3Rlc3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwo+ICsJ cG1kX2xlYWZfdGVzdHMocG1kX2FsaWduZWQsIHByb3QpOwo+ICsJcHVkX2xlYWZfdGVzdHMocHVk X2FsaWduZWQsIHByb3QpOwo+ICsKPiArCXBtZF9odWdlX3Rlc3RzKHBtZHAsIHBtZF9hbGlnbmVk LCBwcm90KTsKPiArCXB1ZF9odWdlX3Rlc3RzKHB1ZHAsIHB1ZF9hbGlnbmVkLCBwcm90KTsKPiAr Cj4gKwlwdGVfc2F2ZWR3cml0ZV90ZXN0cyhwdGVfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwbWRfc2F2 ZWR3cml0ZV90ZXN0cyhwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICAgCXB0ZV91bm1hcF91bmxv Y2socHRlcCwgcHRsKTsKPiAgIAo+ICAgCXBtZF9wb3B1bGF0ZV90ZXN0cyhtbSwgcG1kcCwgc2F2 ZWRfcHRlcCk7Cj4gQEAgLTY3OCw2ICs5ODMsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192 bV9wZ3RhYmxlKHZvaWQpCj4gICAJcG1kX2ZyZWUobW0sIHNhdmVkX3BtZHApOwo+ICAgCXB0ZV9m cmVlKG1tLCBzYXZlZF9wdGVwKTsKPiAgIAo+ICsJdm1fYXJlYV9mcmVlKHZtYSk7Cj4gICAJbW1f ZGVjX25yX3B1ZHMobW0pOwo+ICAgCW1tX2RlY19ucl9wbWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cHRlcyhtbSk7Cj4gCgpDaHJpc3RvcGhlCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1zbnBzLWFyYyBtYWlsaW5nIGxpc3QKbGludXgtc25wcy1h cmNAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LXNucHMtYXJjCg== 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.5 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,URIBL_BLOCKED,USER_AGENT_SANE_1 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 CEB9DC433DF for ; Sat, 27 Jun 2020 07:29:17 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 83B552081A for ; Sat, 27 Jun 2020 07:29:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="AZy4RZA/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 83B552081A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=6NtuNEqA4RwYqw0mOom+Z6H8hxS6dW5tdKSW62nB01o=; b=AZy4RZA/u2xppu6E3jU9/2zKE 3G3Sk5iI+wercbOOCbYO4rZjvOLwP636IZLzNHsW1IFUUSNmzRpLdOuQ4uy/LtQ1yNmfutf+SmXOt lWpGWuAQMNF1cHkQ1780pGk+aDTzD+dw6/jaZVImQMQMwQidbirRSw+rHbgubuKVs3kp7y2y3yq/i vk/WTZ3i2JZ+u3FIT6FpMB5ixb2knVKqPVXN9BkahLDf7uIX4YG4g1QOSOLjj0t41H+tvrX78N98r r/iWIMCwPWTYwJ+Tb29aS/FSRjwCQVl1Do2RWF++e8oR2/jiuWocjFZq88KcsNfjtMSm5C4YzrCK3 /LL/JzmQw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5F1-0000bj-JC; Sat, 27 Jun 2020 07:27:11 +0000 Received: from pegase1.c-s.fr ([93.17.236.30]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp5Ex-0000bD-Pp; Sat, 27 Jun 2020 07:27:09 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v50y2n7Lz9tyWd; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id pXgL3pLy5jWH; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v50y1hbJz9tyWZ; Sat, 27 Jun 2020 09:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 6F5AE8B772; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id A0nwexkhePdw; Sat, 27 Jun 2020 09:26:59 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 3D7FC8B75B; Sat, 27 Jun 2020 09:26:57 +0200 (CEST) Subject: Re: [PATCH V3 2/4] mm/debug_vm_pgtable: Add tests validating advanced arch page table helpers To: Anshuman Khandual , linux-mm@kvack.org References: <1592192277-8421-1-git-send-email-anshuman.khandual@arm.com> <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> From: Christophe Leroy Message-ID: <4da41eee-5ce0-2a5e-40eb-4424655b3489@csgroup.eu> Date: Sat, 27 Jun 2020 09:26:55 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Language: fr 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: Benjamin Herrenschmidt , 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 , gerald.schaefer@de.ibm.com, ziy@nvidia.com, Catalin Marinas , 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 Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpMZSAxNS8wNi8yMDIwIMOgIDA1OjM3LCBBbnNodW1hbiBLaGFuZHVhbCBhIMOpY3JpdMKgOgo+ IFRoaXMgYWRkcyBuZXcgdGVzdHMgdmFsaWRhdGluZyBmb3IgdGhlc2UgZm9sbG93aW5nIGFyY2gg YWR2YW5jZWQgcGFnZSB0YWJsZQo+IGhlbHBlcnMuIFRoZXNlIHRlc3RzIGNyZWF0ZSBhbmQgdGVz dCBzcGVjaWZpYyBtYXBwaW5nIHR5cGVzIGF0IHZhcmlvdXMgcGFnZQo+IHRhYmxlIGxldmVscy4K PiAKPiAxLiBweHhwX3NldF93cnByb3RlY3QoKQo+IDIuIHB4eHBfZ2V0X2FuZF9jbGVhcigpCj4g My4gcHh4cF9zZXRfYWNjZXNzX2ZsYWdzKCkKPiA0LiBweHhwX2dldF9hbmRfY2xlYXJfZnVsbCgp Cj4gNS4gcHh4cF90ZXN0X2FuZF9jbGVhcl95b3VuZygpCj4gNi4gcHh4X2xlYWYoKQo+IDcuIHB4 eF9zZXRfaHVnZSgpCj4gOC4gcHh4XyhjbGVhcnxtaylfc2F2ZWR3cml0ZSgpCj4gOS4gaHVnZV9w eHhwX3h4eCgpCj4gCj4gQ2M6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5v cmc+Cj4gQ2M6IE1pa2UgUmFwb3BvcnQgPHJwcHRAbGludXguaWJtLmNvbT4KPiBDYzogVmluZWV0 IEd1cHRhIDx2Z3VwdGFAc3lub3BzeXMuY29tPgo+IENjOiBDYXRhbGluIE1hcmluYXMgPGNhdGFs aW4ubWFyaW5hc0Bhcm0uY29tPgo+IENjOiBXaWxsIERlYWNvbiA8d2lsbEBrZXJuZWwub3JnPgo+ IENjOiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Cj4g Q2M6IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgo+IENjOiBNaWNoYWVsIEVsbGVy bWFuIDxtcGVAZWxsZXJtYW4uaWQuYXU+Cj4gQ2M6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJz dGVuc0BkZS5pYm0uY29tPgo+IENjOiBWYXNpbHkgR29yYmlrIDxnb3JAbGludXguaWJtLmNvbT4K PiBDYzogQ2hyaXN0aWFuIEJvcm50cmFlZ2VyIDxib3JudHJhZWdlckBkZS5pYm0uY29tPgo+IENj OiBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KPiBDYzogSW5nbyBNb2xuYXIg PG1pbmdvQHJlZGhhdC5jb20+Cj4gQ2M6IEJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgo+ IENjOiAiSC4gUGV0ZXIgQW52aW4iIDxocGFAenl0b3IuY29tPgo+IENjOiBLaXJpbGwgQS4gU2h1 dGVtb3YgPGtpcmlsbEBzaHV0ZW1vdi5uYW1lPgo+IENjOiBQYXVsIFdhbG1zbGV5IDxwYXVsLndh bG1zbGV5QHNpZml2ZS5jb20+Cj4gQ2M6IFBhbG1lciBEYWJiZWx0IDxwYWxtZXJAZGFiYmVsdC5j b20+Cj4gQ2M6IGxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4gQ2M6IGxpbnV4cHBjLWRldkBsaXN0cy5v emxhYnMub3JnCj4gQ2M6IGxpbnV4LXMzOTBAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogeDg2QGtlcm5lbC5vcmcKPiBDYzogbGludXgt bW1Aa3ZhY2sub3JnCj4gQ2M6IGxpbnV4LWFyY2hAdmdlci5rZXJuZWwub3JnCj4gQ2M6IGxpbnV4 LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKPiBTdWdnZXN0ZWQtYnk6IENhdGFsaW4gTWFyaW5hcyA8 Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+Cj4gU2lnbmVkLW9mZi1ieTogQW5zaHVtYW4gS2hhbmR1 YWwgPGFuc2h1bWFuLmtoYW5kdWFsQGFybS5jb20+Cj4gLS0tCj4gICBtbS9kZWJ1Z192bV9wZ3Rh YmxlLmMgfCAzMDYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g ICAxIGZpbGUgY2hhbmdlZCwgMzA2IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvbW0v ZGVidWdfdm1fcGd0YWJsZS5jIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gaW5kZXggZmZhMTYz ZDRjNjNjLi5lM2Y5ZjgzMTdhOTggMTAwNjQ0Cj4gLS0tIGEvbW0vZGVidWdfdm1fcGd0YWJsZS5j Cj4gKysrIGIvbW0vZGVidWdfdm1fcGd0YWJsZS5jCj4gQEAgLTIxLDYgKzIxLDcgQEAKPiAgICNp bmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiAgICNpbmNsdWRlIDxsaW51eC9wZm5fdC5oPgo+ICAg I2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGd0YWJsZS5oPgo+ ICAgI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgo+ICAgI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgo+IEBAIC0yOCw2ICsyOSw3IEBACj4gICAj aW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+Cj4gICAjaW5jbHVkZSA8bGludXgvc2NoZWQv bW0uaD4KPiAgICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgo+ICsjaW5jbHVkZSA8YXNtL3RsYmZs dXNoLmg+Cj4gICAKPiAgICNkZWZpbmUgVk1GTEFHUwkoVk1fUkVBRHxWTV9XUklURXxWTV9FWEVD KQo+ICAgCj4gQEAgLTU1LDYgKzU3LDU0IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBwdGVfYmFzaWNf dGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gICAJV0FSTl9PTihwdGVf d3JpdGUocHRlX3dycHJvdGVjdChwdGVfbWt3cml0ZShwdGUpKSkpOwo+ICAgfQo+ICAgCj4gK3N0 YXRpYyB2b2lkIF9faW5pdCBwdGVfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0s Cj4gKwkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdGVfdCAqcHRlcCwKPiArCQkJdW5z aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGln biBhcmdzIHByb3Blcmx5LgoKPiArewo+ICsJcHRlX3QgcHRlID0gcGZuX3B0ZShwZm4sIHByb3Qp Owo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZh ZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcHRlcCk7 Cj4gKwlwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwo+ICsJV0FSTl9PTihwdGVfd3JpdGUocHRlKSk7 Cj4gKwo+ICsJcHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsK PiArCXB0ZSA9IFJFQURfT05DRSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsK PiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0 KHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFk ZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRl X21rZGlydHkocHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVw LCBwdGUsIDEpOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04oIShwdGVf d3JpdGUocHRlKSAmJiBwdGVfZGlydHkocHRlKSkpOwo+ICsKPiArCXB0ZSA9IHBmbl9wdGUocGZu LCBwcm90KTsKPiArCXNldF9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJcHRlcF9n ZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRyLCBwdGVwLCAxKTsKPiArCXB0ZSA9IFJFQURfT05D RSgqcHRlcCk7Cj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBwdGVf bWt5b3VuZyhwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0ZSk7Cj4gKwlw dGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVB RF9PTkNFKCpwdGVwKTsKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsK PiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3cml0ZShwdGVfY2xl YXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9Cj4gICAjaWZkZWYg Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcG1kX2Jh c2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgewo+IEBAIC03 Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25l ZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRfYmFkKHBtZF9ta2h1 Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfYWR2YW5jZWRf dGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2 bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHZh ZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICsJcG1kX3Qg cG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50X2h1 Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdydCBI UEFHRV9QTURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QTURfTUFTSykgKyBI UEFHRV9QTURfU0laRTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlzZXRf cG1kX2F0KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04ocG1k X3dyaXRlKHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9w bWRfYXQobW0sIHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXIo bW0sIHZhZGRyLCBwbWRwKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwZm5fcG1kKHBmbiwgcHJvdCk7Cj4gKwlw bWQgPSBwbWRfd3Jwcm90ZWN0KHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWtjbGVhbihwbWQpOwo+ICsJ c2V0X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWQgPSBwbWRfbWt3cml0ZShw bWQpOwo+ICsJcG1kID0gcG1kX21rZGlydHkocG1kKTsKPiArCXBtZHBfc2V0X2FjY2Vzc19mbGFn cyh2bWEsIHZhZGRyLCBwbWRwLCBwbWQsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsK PiArCVdBUk5fT04oIShwbWRfd3JpdGUocG1kKSAmJiBwbWRfZGlydHkocG1kKSkpOwo+ICsKPiAr CXBtZCA9IHBtZF9ta2h1Z2UocGZuX3BtZChwZm4sIHByb3QpKTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9odWdlX2dldF9hbmRfY2xlYXJfZnVsbCh2bWEs IHZhZGRyLCBwbWRwLCAxKTsKPiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09O KCFwbWRfbm9uZShwbWQpKTsKPiArCj4gKwlwbWQgPSBwbWRfbWt5b3VuZyhwbWQpOwo+ICsJc2V0 X3BtZF9hdChtbSwgdmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX3Rlc3RfYW5kX2NsZWFyX3lv dW5nKHZtYSwgdmFkZHIsIHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdB Uk5fT04ocG1kX3lvdW5nKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1k X2xlYWZfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBt ZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCj4gKwkvKgo+ICsJICogUE1EIGJhc2Vk IFRIUCBpcyBhIGxlYWYgZW50cnkuCj4gKwkgKi8KPiArCXBtZCA9IHBtZF9ta2h1Z2UocG1kKTsK PiArCVdBUk5fT04oIXBtZF9sZWFmKHBtZCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcG1kX2h1Z2VfdGVzdHMocG1kX3QgKnBtZHAsIHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQ7Cj4gKwo+ICsJaWYgKCFJU19FTkFCTEVEKENPTkZJ R19IQVZFX0FSQ0hfSFVHRV9WTUFQKSkKPiArCQlyZXR1cm47Cj4gKwkvKgo+ICsJICogWDg2IGRl ZmluZWQgcG1kX3NldF9odWdlKCkgdmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4KPiArCSAqIFBNRCBp cyBub3QgYSBwb3B1bGF0ZWQgbm9uLWxlYWYgZW50cnkuCj4gKwkgKi8KPiArCVdSSVRFX09OQ0Uo KnBtZHAsIF9fcG1kKDApKTsKPiArCVdBUk5fT04oIXBtZF9zZXRfaHVnZShwbWRwLCBfX3Bmbl90 b19waHlzKHBmbiksIHByb3QpKTsKPiArCVdBUk5fT04oIXBtZF9jbGVhcl9odWdlKHBtZHApKTsK PiArCXBtZCA9IFJFQURfT05DRSgqcG1kcCk7Cj4gKwlXQVJOX09OKCFwbWRfbm9uZShwbWQpKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2ln bmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5fcG1k KHBmbiwgcHJvdCk7Cj4gKwo+ICsJV0FSTl9PTighcG1kX3NhdmVkd3JpdGUocG1kX21rX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kKSkpKTsKPiArCVdBUk5fT04ocG1kX3NhdmVk d3JpdGUocG1kX2NsZWFyX3NhdmVkd3JpdGUocG1kX21rX3NhdmVkd3JpdGUocG1kKSkpKTsKPiAr fQo+ICsKPiAgICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFX1BV RAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiAgIHsKPiBAQCAtMTAwLDEyICsyMzMsMTE1IEBAIHN0YXRpYyB2 b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCj4gICAJICovCj4gICAJV0FSTl9PTighcHVkX2JhZChwdWRfbWtodWdlKHB1ZCkpKTsKPiAg IH0KPiArCj4gK3N0YXRpYyB2b2lkIHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gKwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJv dCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkKPiArCQlyZXR1cm47 Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BVRF9TSVpFICovCj4gKwl2 YWRkciA9ICh2YWRkciAmIEhQQUdFX1BVRF9NQVNLKSArIEhQQUdFX1BVRF9TSVpFOwo+ICsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF9zZXRfd3Jwcm90ZWN0 KG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9P TihwdWRfd3JpdGUocHVkKSk7Cj4gKwo+ICsjaWZuZGVmIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQK PiArCXB1ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXNldF9wdWRfYXQobW0sIHZhZGRyLCBw dWRwLCBwdWQpOwo+ICsJcHVkcF9odWdlX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdWRwKTsK PiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRfbm9uZShwdWQpKTsK PiArCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRk ciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5kX2NsZWFyX2Z1bGwobW0sIHZhZGRy LCBwdWRwLCAxKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4gKwlXQVJOX09OKCFwdWRf bm9uZShwdWQpKTsKPiArI2VuZGlmIC8qIF9fUEFHRVRBQkxFX1BNRF9GT0xERUQgKi8KPiArCXB1 ZCA9IHBmbl9wdWQocGZuLCBwcm90KTsKPiArCXB1ZCA9IHB1ZF93cnByb3RlY3QocHVkKTsKPiAr CXB1ZCA9IHB1ZF9ta2NsZWFuKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwg cHVkKTsKPiArCXB1ZCA9IHB1ZF9ta3dyaXRlKHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtkaXJ0eShw dWQpOwo+ICsJcHVkcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB1ZHAsIHB1ZCwgMSk7 Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighKHB1ZF93cml0ZShwdWQp ICYmIHB1ZF9kaXJ0eShwdWQpKSk7Cj4gKwo+ICsJcHVkID0gcHVkX21reW91bmcocHVkKTsKPiAr CXNldF9wdWRfYXQobW0sIHZhZGRyLCBwdWRwLCBwdWQpOwo+ICsJcHVkcF90ZXN0X2FuZF9jbGVh cl95b3VuZyh2bWEsIHZhZGRyLCBwdWRwKTsKPiArCXB1ZCA9IFJFQURfT05DRSgqcHVkcCk7Cj4g KwlXQVJOX09OKHB1ZF95b3VuZyhwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4g KwlwdWRfdCBwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwo+ICsJLyoKPiArCSAqIFBVRCBi YXNlZCBUSFAgaXMgYSBsZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlwdWQgPSBwdWRfbWtodWdlKHB1 ZCk7Cj4gKwlXQVJOX09OKCFwdWRfbGVhZihwdWQpKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg X19pbml0IHB1ZF9odWdlX3Rlc3RzKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkOwo+ICsKPiArCWlmICghSVNfRU5BQkxFRChD T05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCkpCj4gKwkJcmV0dXJuOwo+ICsJLyoKPiArCSAqIFg4 NiBkZWZpbmVkIHB1ZF9zZXRfaHVnZSgpIHZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuCj4gKwkgKiBQ VUQgaXMgbm90IGEgcG9wdWxhdGVkIG5vbi1sZWFmIGVudHJ5Lgo+ICsJICovCj4gKwlXUklURV9P TkNFKCpwdWRwLCBfX3B1ZCgwKSk7Cj4gKwlXQVJOX09OKCFwdWRfc2V0X2h1Z2UocHVkcCwgX19w Zm5fdG9fcGh5cyhwZm4pLCBwcm90KSk7Cj4gKwlXQVJOX09OKCFwdWRfY2xlYXJfaHVnZShwdWRw KSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVk KSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdF UEFHRV9QVUQgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBwdWRfYmFzaWNfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBwdWRfYWR2YW5j ZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWEsIHB1ZF90ICpwdWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25n IHZhZGRyLCBwZ3Byb3RfdCBwcm90KQoKQWxpZ24gYXJncyBwcm9wZXJseQoKPiArewo+ICt9Cj4g K3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdw cm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRf dCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICAg I2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4g ICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGljIHZv aWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxv bmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9hZHZh bmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxv bmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpBbGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30K PiArc3RhdGljIHZvaWQgX19pbml0IHB1ZF9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0 ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZHAsCj4gKwkJ dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCgpB bGlnbiBhcmdzIHByb3Blcmx5Cgo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9s ZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGlj IHZvaWQgX19pbml0IHB1ZF9sZWFmX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9odWdlX3Rlc3RzKHBtZF90ICpwbWRw LCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4s IHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVk d3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpIHsgfQo+ICAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgCj4gICBzdGF0aWMgdm9p ZCBfX2luaXQgcDRkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90 KQo+IEBAIC00OTUsOCArNzMxLDU2IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2lj X3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICAgCVdBUk5fT04oIXB0 ZV9odWdlKHB0ZV9ta2h1Z2UocHRlKSkpOwo+ICAgI2VuZGlmIC8qIENPTkZJR19BUkNIX1dBTlRf R0VORVJBTF9IVUdFVExCICovCj4gICB9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRs Yl9hZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcg cGZuLAo+ICsJCQkJCSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ ICsJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwo+ICsJcHRlX3QgcHRlID0g UkVBRF9PTkNFKCpwdGVwKTsKPiArCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAoX19wZm5fdG9fcGh5 cyhwZm4pIHwgUkFORE9NX09SVkFMVUUpICYgUE1EX01BU0s7Cj4gKwo+ICsJcHRlID0gcHRlX21r aHVnZShta19wdGUocGZuX3RvX3BhZ2UoUEhZU19QRk4ocGFkZHIpKSwgcHJvdCkpOwo+ICsJc2V0 X2h1Z2VfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCVdB Uk5fT04oIXB0ZV9zYW1lKHB0ZSwgaHVnZV9wdGVwX2dldChwdGVwKSkpOwo+ICsJaHVnZV9wdGVf Y2xlYXIobW0sIHZhZGRyLCBwdGVwLCBQTURfU0laRSk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0 KHB0ZXApOwo+ICsJV0FSTl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBt a19odWdlX3B0ZShwYWdlLCBwcm90KTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0 ZXAsIHB0ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlodWdlX3B0ZXBfc2V0X3dycHJvdGVjdChtbSwg dmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04o aHVnZV9wdGVfd3JpdGUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJv dCk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmll cigpOwo+ICsJaHVnZV9wdGVwX2dldF9hbmRfY2xlYXIobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0 ZSA9IGh1Z2VfcHRlcF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKCFodWdlX3B0ZV9ub25lKHB0ZSkp Owo+ICsKPiArCXB0ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJcHRlID0gaHVnZV9w dGVfd3Jwcm90ZWN0KHB0ZSk7Cj4gKwlzZXRfaHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBw dGUpOwo+ICsJYmFycmllcigpOwo+ICsJcHRlID0gaHVnZV9wdGVfbWt3cml0ZShwdGUpOwo+ICsJ cHRlID0gaHVnZV9wdGVfbWtkaXJ0eShwdGUpOwo+ICsJaHVnZV9wdGVwX3NldF9hY2Nlc3NfZmxh Z3Modm1hLCB2YWRkciwgcHRlcCwgcHRlLCAxKTsKPiArCXB0ZSA9IGh1Z2VfcHRlcF9nZXQocHRl cCk7Cj4gKwlXQVJOX09OKCEoaHVnZV9wdGVfd3JpdGUocHRlKSAmJiBodWdlX3B0ZV9kaXJ0eShw dGUpKSk7Cj4gK30KPiAgICNlbHNlICAvKiAhQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgc3Rh dGljIHZvaWQgX19pbml0IGh1Z2V0bGJfYmFzaWNfdGVzdHModW5zaWduZWQgbG9uZyBwZm4sIHBn cHJvdF90IHByb3QpIHsgfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgaHVnZXRsYl9hZHZhbmNlZF90 ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQkJCQkgIHN0cnVjdCB2bV9hcmVhX3N0cnVj dCAqdm1hLAo+ICsJCQkJCSAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcGZuLAo+ICsJCQkJ CSAgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gICAjZW5k aWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwo+ICAgCj4gICAjaWZkZWYgQ09ORklHX1RSQU5T UEFSRU5UX0hVR0VQQUdFCj4gQEAgLTU2OCw2ICs4NTIsNyBAQCBzdGF0aWMgdW5zaWduZWQgbG9u ZyBfX2luaXQgZ2V0X3JhbmRvbV92YWRkcih2b2lkKQo+ICAgCj4gICBzdGF0aWMgaW50IF9faW5p dCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQpCj4gICB7Cj4gKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Qg KnZtYTsKPiAgIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKPiAgIAlwZ2RfdCAqcGdkcDsKPiAgIAlw NGRfdCAqcDRkcCwgKnNhdmVkX3A0ZHA7Cj4gQEAgLTU5Niw2ICs4ODEsMTIgQEAgc3RhdGljIGlu dCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCSAqLwo+ICAgCXByb3Rub25lID0g X19QMDAwOwo+ICAgCj4gKwl2bWEgPSB2bV9hcmVhX2FsbG9jKG1tKTsKPiArCWlmICghdm1hKSB7 Cj4gKwkJcHJfZXJyKCJ2bWEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwo+ICsJCXJldHVybiAxOwo+ ICsJfQo+ICsKPiAgIAkvKgo+ICAgCSAqIFBGTiBmb3IgbWFwcGluZyBhdCBQVEUgbGV2ZWwgaXMg ZGV0ZXJtaW5lZCBmcm9tIGEgc3RhbmRhcmQga2VybmVsCj4gICAJICogdGV4dCBzeW1ib2wuIEJ1 dCBwZm5zIGZvciBoaWdoZXIgcGFnZSB0YWJsZSBsZXZlbHMgYXJlIGRlcml2ZWQgYnkKPiBAQCAt NjQ0LDYgKzkzNSwyMCBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192bV9wZ3RhYmxlKHZvaWQp Cj4gICAJcDRkX2NsZWFyX3Rlc3RzKG1tLCBwNGRwKTsKPiAgIAlwZ2RfY2xlYXJfdGVzdHMobW0s IHBnZHApOwo+ICAgCj4gKwlwdGVfYWR2YW5jZWRfdGVzdHMobW0sIHZtYSwgcHRlcCwgcHRlX2Fs aWduZWQsIHZhZGRyLCBwcm90KTsKPiArCXBtZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwbWRw LCBwbWRfYWxpZ25lZCwgdmFkZHIsIHByb3QpOwo+ICsJcHVkX2FkdmFuY2VkX3Rlc3RzKG1tLCB2 bWEsIHB1ZHAsIHB1ZF9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlodWdldGxiX2FkdmFuY2Vk X3Rlc3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwo+ICsJ cG1kX2xlYWZfdGVzdHMocG1kX2FsaWduZWQsIHByb3QpOwo+ICsJcHVkX2xlYWZfdGVzdHMocHVk X2FsaWduZWQsIHByb3QpOwo+ICsKPiArCXBtZF9odWdlX3Rlc3RzKHBtZHAsIHBtZF9hbGlnbmVk LCBwcm90KTsKPiArCXB1ZF9odWdlX3Rlc3RzKHB1ZHAsIHB1ZF9hbGlnbmVkLCBwcm90KTsKPiAr Cj4gKwlwdGVfc2F2ZWR3cml0ZV90ZXN0cyhwdGVfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwbWRfc2F2 ZWR3cml0ZV90ZXN0cyhwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICAgCXB0ZV91bm1hcF91bmxv Y2socHRlcCwgcHRsKTsKPiAgIAo+ICAgCXBtZF9wb3B1bGF0ZV90ZXN0cyhtbSwgcG1kcCwgc2F2 ZWRfcHRlcCk7Cj4gQEAgLTY3OCw2ICs5ODMsNyBAQCBzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z192 bV9wZ3RhYmxlKHZvaWQpCj4gICAJcG1kX2ZyZWUobW0sIHNhdmVkX3BtZHApOwo+ICAgCXB0ZV9m cmVlKG1tLCBzYXZlZF9wdGVwKTsKPiAgIAo+ICsJdm1fYXJlYV9mcmVlKHZtYSk7Cj4gICAJbW1f ZGVjX25yX3B1ZHMobW0pOwo+ICAgCW1tX2RlY19ucl9wbWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cHRlcyhtbSk7Cj4gCgpDaHJpc3RvcGhlCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==