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, 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 8DCC6C433DF for ; Sat, 27 Jun 2020 07:19:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 61E8C2080C for ; Sat, 27 Jun 2020 07:19:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726345AbgF0HTN (ORCPT ); Sat, 27 Jun 2020 03:19:13 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:59605 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725926AbgF0HTM (ORCPT ); Sat, 27 Jun 2020 03:19:12 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v4qS6JbBz9tyWF; Sat, 27 Jun 2020 09:18:44 +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 R0Xe0WEpH3V0; Sat, 27 Jun 2020 09:18:44 +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 49v4qS4vSnz9tyWD; Sat, 27 Jun 2020 09:18:44 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E336F8B772; Sat, 27 Jun 2020 09:18:45 +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 t5lVUH5_v1hK; Sat, 27 Jun 2020 09:18:45 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 483478B75B; Sat, 27 Jun 2020 09:18:43 +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: christophe.leroy@c-s.fr, 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: <6da177e6-9219-9ccf-a402-f4293c7564f7@csgroup.eu> Date: Sat, 27 Jun 2020 09:18:41 +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) > +{ > + 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); same > + 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); same > + 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); same > + 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); same > + 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); same > + 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) > +{ > + 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) > +{ > + 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) > +{ > +} > +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) > +{ > +} > +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) > +{ > +} > +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); Remplace with ptep_get() to avoid build failure on powerpc 8xx. > + 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:18:41 +0200 Message-ID: <6da177e6-9219-9ccf-a402-f4293c7564f7@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: Received: from pegase1.c-s.fr ([93.17.236.30]:59605 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725926AbgF0HTM (ORCPT ); Sat, 27 Jun 2020 03:19:12 -0400 In-Reply-To: <1592192277-8421-3-git-send-email-anshuman.khandual@arm.com> Content-Language: fr Sender: linux-arch-owner@vger.kernel.org List-ID: To: Anshuman Khandual , linux-mm@kvack.org Cc: christophe.leroy@c-s.fr, 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 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) > +{ > + 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); same > + 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); same > + 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); same > + 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); same > + 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); same > + 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) > +{ > + 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) > +{ > + 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) > +{ > +} > +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) > +{ > +} > +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) > +{ > +} > +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); Remplace with ptep_get() to avoid build failure on powerpc 8xx. > + 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 BE2F8C433E0 for ; Sat, 27 Jun 2020 07:19:04 +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 7CC472080C for ; Sat, 27 Jun 2020 07:19:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="FjuIAyOM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7CC472080C 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=GK/xsJO5CkKZMDJYHgqLUxM8qfe4EWMrVSzPNPg08JE=; b=FjuIAyOMX/Ym1jBJgBaFEXIDb l5xg2ewNXxqxElEUjm5JxBWJ8EXCh5p0RO0fyof7caTYMQmJmLZS7baMRuLjgTVCG6IkK/VJ/kWhc Mr6Kfgahv75+3+ZIr8/sBzsUd3op3L3mfPkPyMgF0g2NRrkQF1kXo3VrHAL9Vl75i3rlURvly/qLZ oF+sxW7VBzHGCkYUm7HRGdhjmqfcnqWyqqvtDziej/CiJDGcqAXsfhyT87YaCjWot+XaJPJrseXng La1/3HUcEYz24HvN3E8mVHwhxUmNs0UQuKsX9wghcQazaI+f74Te1/UEOx5bde3aAp102nONc+Ltb 5Q7NeXHmg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp572-0008TC-H0; Sat, 27 Jun 2020 07:18:56 +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 1jp56u-0008SM-9J; Sat, 27 Jun 2020 07:18:50 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v4qS6JbBz9tyWF; Sat, 27 Jun 2020 09:18:44 +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 R0Xe0WEpH3V0; Sat, 27 Jun 2020 09:18:44 +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 49v4qS4vSnz9tyWD; Sat, 27 Jun 2020 09:18:44 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E336F8B772; Sat, 27 Jun 2020 09:18:45 +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 t5lVUH5_v1hK; Sat, 27 Jun 2020 09:18:45 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 483478B75B; Sat, 27 Jun 2020 09:18:43 +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: <6da177e6-9219-9ccf-a402-f4293c7564f7@csgroup.eu> Date: Sat, 27 Jun 2020 09:18:41 +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 , linux-arm-kernel@lists.infradead.org, ziy@nvidia.com, Catalin Marinas , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , gerald.schaefer@de.ibm.com, christophe.leroy@c-s.fr, 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 aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sK PiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCj4gKwlwdGUgPSBwZm5fcHRl KHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0 ZXBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpw dGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKHB0ZV93cml0ZShwdGUpKTsKPiArCj4gKwlwdGUgPSBw Zm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9P TkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlw dGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0KHB0ZSk7Cj4g KwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAs IHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRlX21rZGlydHko cHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVwLCBwdGUsIDEp Owo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCEocHRlX3dy aXRlKHB0ZSkgJiYgcHRlX2RpcnR5KHB0ZSkpKTsKPiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwg cHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0ZXBfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHRlcCwgMSk7Cj4gKwlwdGUgPSBSRUFEX09OQ0Uo KnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04oIXB0ZV9ub25lKHB0ZSkpOwo+ICsKPiArCXB0ZSA9 IHB0ZV9ta3lvdW5nKHB0ZSk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUg PSBSRUFEX09OQ0UoKnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUo cGZuLCBwcm90KTsKPiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9 Cj4gICAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBf X2luaXQgcG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ ICAgewo+IEBAIC03Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190 ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRf YmFkKHBtZF9ta2h1Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBw bWRfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNp Z25lZCBsb25nIHZhZGRyLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5f cG1kKHBmbiwgcHJvdCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BNRF9T SVpFICovCj4gKwl2YWRkciA9ICh2YWRkciAmIEhQQUdFX1BNRF9NQVNLKSArIEhQQUdFX1BNRF9T SVpFOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcG1k cCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRfd3JpdGUocG1k KSk7Cj4gKwo+ICsJcG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsJc2V0X3BtZF9hdChtbSwg dmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIs IHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXBtZCA9IHBtZF93 cnByb3RlY3QocG1kKTsKPiArCXBtZCA9IHBtZF9ta2NsZWFuKHBtZCk7Cj4gKwlzZXRfcG1kX2F0 KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZCA9IHBtZF9ta3dyaXRlKHBtZCk7Cj4gKwlw bWQgPSBwbWRfbWtkaXJ0eShwbWQpOwo+ICsJcG1kcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFk ZHIsIHBtZHAsIHBtZCwgMSk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9P TighKHBtZF93cml0ZShwbWQpICYmIHBtZF9kaXJ0eShwbWQpKSk7Cj4gKwo+ICsJcG1kID0gcG1k X21raHVnZShwZm5fcG1kKHBmbiwgcHJvdCkpOwo+ICsJc2V0X3BtZF9hdChtbSwgdmFkZHIsIHBt ZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcl9mdWxsKHZtYSwgdmFkZHIsIHBt ZHAsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBtZF9ta3lvdW5nKHBtZCk7Cj4gKwlzZXRfcG1kX2F0KG1t LCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2 YWRkciwgcG1kcCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRf eW91bmcocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0 cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcG1kX3QgcG1kID0g cGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCS8qCj4gKwkgKiBQTUQgYmFzZWQgVEhQIGlzIGEg bGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJcG1kID0gcG1kX21raHVnZShwbWQpOwo+ICsJV0FSTl9P TighcG1kX2xlYWYocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVn ZV90ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4g K3sKPiArCXBtZF90IHBtZDsKPiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJD SF9IVUdFX1ZNQVApKQo+ICsJCXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwbWRf c2V0X2h1Z2UoKSB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUE1EIGlzIG5vdCBhIHBv cHVsYXRlZCBub24tbGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcG1kcCwgX19w bWQoMCkpOwo+ICsJV0FSTl9PTighcG1kX3NldF9odWdlKHBtZHAsIF9fcGZuX3RvX3BoeXMocGZu KSwgcHJvdCkpOwo+ICsJV0FSTl9PTighcG1kX2NsZWFyX2h1Z2UocG1kcCkpOwo+ICsJcG1kID0g UkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25lKHBtZCkpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBw Zm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBtZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90 KTsKPiArCj4gKwlXQVJOX09OKCFwbWRfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICsJV0FSTl9PTihwbWRfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICt9Cj4gKwo+ICAg I2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVECj4gICBzdGF0 aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICAgewo+IEBAIC0xMDAsMTIgKzIzMywxMTUgQEAgc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAkg Ki8KPiAgIAlXQVJOX09OKCFwdWRfYmFkKHB1ZF9ta2h1Z2UocHVkKSkpOwo+ICAgfQo+ICsKPiAr c3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJ CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBs b25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVk X3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50 X2h1Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdy dCBIUEFHRV9QVURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QVURfTUFTSykg KyBIUEFHRV9QVURfU0laRTsKPiArCj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB1ZHApOwo+ICsJcHVkID0gUkVB RF9PTkNFKCpwdWRwKTsKPiArCVdBUk5fT04ocHVkX3dyaXRlKHB1ZCkpOwo+ICsKPiArI2lmbmRl ZiBfX1BBR0VUQUJMRV9QTURfRk9MREVECj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4g KwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5k X2NsZWFyKG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJ V0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKwo+ICsJcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsJc2V0X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWRwX2h1Z2VfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHVkcCwgMSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0Uo KnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKyNlbmRpZiAvKiBfX1BBR0VU QUJMRV9QTURfRk9MREVEICovCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlwdWQg PSBwdWRfd3Jwcm90ZWN0KHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtjbGVhbihwdWQpOwo+ICsJc2V0 X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWt3cml0ZShwdWQp Owo+ICsJcHVkID0gcHVkX21rZGlydHkocHVkKTsKPiArCXB1ZHBfc2V0X2FjY2Vzc19mbGFncyh2 bWEsIHZhZGRyLCBwdWRwLCBwdWQsIDEpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsKPiAr CVdBUk5fT04oIShwdWRfd3JpdGUocHVkKSAmJiBwdWRfZGlydHkocHVkKSkpOwo+ICsKPiArCXB1 ZCA9IHB1ZF9ta3lvdW5nKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHVkcCk7Cj4gKwlw dWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTihwdWRfeW91bmcocHVkKSk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsKPiArCS8qCj4gKwkgKiBQVUQgYmFzZWQgVEhQIGlzIGEgbGVhZiBlbnRyeS4KPiArCSAq Lwo+ICsJcHVkID0gcHVkX21raHVnZShwdWQpOwo+ICsJV0FSTl9PTighcHVkX2xlYWYocHVkKSk7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVk cCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB1ZF90IHB1ZDsK PiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVApKQo+ICsJ CXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwdWRfc2V0X2h1Z2UoKSB2ZXJpZmll cyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUFVEIGlzIG5vdCBhIHBvcHVsYXRlZCBub24tbGVhZiBl bnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcHVkcCwgX19wdWQoMCkpOwo+ICsJV0FSTl9P TighcHVkX3NldF9odWdlKHB1ZHAsIF9fcGZuX3RvX3BoeXMocGZuKSwgcHJvdCkpOwo+ICsJV0FS Tl9PTighcHVkX2NsZWFyX2h1Z2UocHVkcCkpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsK PiArCVdBUk5fT04oIXB1ZF9ub25lKHB1ZCkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJR19I QVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4gICBzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0K PiArc3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ ICsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25l ZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9 Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwg cGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhw dWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ ICAgI2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICov Cj4gICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGlj IHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3Qg cHJvdCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVk IGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9h ZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVk IGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJCXN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBsb25nIHBmbiwg dW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25n IHBmbiwgcGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVnZV90 ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sK PiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2h1Z2VfdGVzdHMocHVkX3QgKnB1ZHAsIHVu c2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQg X19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiAgICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAg IAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHA0ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiBAQCAtNDk1LDggKzczMSw1NiBAQCBzdGF0aWMgdm9pZCBfX2lu aXQgaHVnZXRsYl9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkK PiAgIAlXQVJOX09OKCFwdGVfaHVnZShwdGVfbWtodWdlKHB0ZSkpKTsKPiAgICNlbmRpZiAvKiBD T05GSUdfQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQiAqLwo+ICAgfQo+ICsKPiArc3RhdGljIHZv aWQgX19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4g KwkJCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVw LCB1bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJv dF90IHByb3QpCj4gK3sKPiArCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsK PiArCXB0ZV90IHB0ZSA9IFJFQURfT05DRSgqcHRlcCk7CgpSZW1wbGFjZSB3aXRoIHB0ZXBfZ2V0 KCkgdG8gYXZvaWQgYnVpbGQgZmFpbHVyZSBvbiBwb3dlcnBjIDh4eC4KCj4gKwl1bnNpZ25lZCBs b25nIHBhZGRyID0gKF9fcGZuX3RvX3BoeXMocGZuKSB8IFJBTkRPTV9PUlZBTFVFKSAmIFBNRF9N QVNLOwo+ICsKPiArCXB0ZSA9IHB0ZV9ta2h1Z2UobWtfcHRlKHBmbl90b19wYWdlKFBIWVNfUEZO KHBhZGRyKSksIHByb3QpKTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0 ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlXQVJOX09OKCFwdGVfc2FtZShwdGUsIGh1Z2VfcHRlcF9n ZXQocHRlcCkpKTsKPiArCWh1Z2VfcHRlX2NsZWFyKG1tLCB2YWRkciwgcHRlcCwgUE1EX1NJWkUp Owo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04oIWh1Z2VfcHRlX25v bmUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJvdCk7Cj4gKwlzZXRf aHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmllcigpOwo+ICsJaHVn ZV9wdGVwX3NldF93cnByb3RlY3QobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0ZSA9IGh1Z2VfcHRl cF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKGh1Z2VfcHRlX3dyaXRlKHB0ZSkpOwo+ICsKPiArCXB0 ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJc2V0X2h1Z2VfcHRlX2F0KG1tLCB2YWRk ciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCWh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFy KG1tLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FS Tl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBta19odWdlX3B0ZShwYWdl LCBwcm90KTsKPiArCXB0ZSA9IGh1Z2VfcHRlX3dycHJvdGVjdChwdGUpOwo+ICsJc2V0X2h1Z2Vf cHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCXB0ZSA9IGh1 Z2VfcHRlX21rd3JpdGUocHRlKTsKPiArCXB0ZSA9IGh1Z2VfcHRlX21rZGlydHkocHRlKTsKPiAr CWh1Z2VfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB0ZXAsIHB0ZSwgMSk7Cj4g KwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FSTl9PTighKGh1Z2VfcHRlX3dyaXRl KHB0ZSkgJiYgaHVnZV9wdGVfZGlydHkocHRlKSkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJ R19IVUdFVExCX1BBR0UgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2ljX3Rl c3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQg X19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJ CQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVwLCB1 bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90 IHByb3QpCj4gK3sKPiArfQo+ICAgI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KPiAg IAo+ICAgI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQo+IEBAIC01NjgsNiArODUy LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGdldF9yYW5kb21fdmFkZHIodm9pZCkK PiAgIAo+ICAgc3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgewo+ ICsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Cj4gICAJc3RydWN0IG1tX3N0cnVjdCAqbW07 Cj4gICAJcGdkX3QgKnBnZHA7Cj4gICAJcDRkX3QgKnA0ZHAsICpzYXZlZF9wNGRwOwo+IEBAIC01 OTYsNiArODgxLDEyIEBAIHN0YXRpYyBpbnQgX19pbml0IGRlYnVnX3ZtX3BndGFibGUodm9pZCkK PiAgIAkgKi8KPiAgIAlwcm90bm9uZSA9IF9fUDAwMDsKPiAgIAo+ICsJdm1hID0gdm1fYXJlYV9h bGxvYyhtbSk7Cj4gKwlpZiAoIXZtYSkgewo+ICsJCXByX2Vycigidm1hIGFsbG9jYXRpb24gZmFp bGVkXG4iKTsKPiArCQlyZXR1cm4gMTsKPiArCX0KPiArCj4gICAJLyoKPiAgIAkgKiBQRk4gZm9y IG1hcHBpbmcgYXQgUFRFIGxldmVsIGlzIGRldGVybWluZWQgZnJvbSBhIHN0YW5kYXJkIGtlcm5l bAo+ICAgCSAqIHRleHQgc3ltYm9sLiBCdXQgcGZucyBmb3IgaGlnaGVyIHBhZ2UgdGFibGUgbGV2 ZWxzIGFyZSBkZXJpdmVkIGJ5Cj4gQEAgLTY0NCw2ICs5MzUsMjAgQEAgc3RhdGljIGludCBfX2lu aXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXA0ZF9jbGVhcl90ZXN0cyhtbSwgcDRkcCk7 Cj4gICAJcGdkX2NsZWFyX3Rlc3RzKG1tLCBwZ2RwKTsKPiAgIAo+ICsJcHRlX2FkdmFuY2VkX3Rl c3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlwbWRfYWR2 YW5jZWRfdGVzdHMobW0sIHZtYSwgcG1kcCwgcG1kX2FsaWduZWQsIHZhZGRyLCBwcm90KTsKPiAr CXB1ZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdWRwLCBwdWRfYWxpZ25lZCwgdmFkZHIsIHBy b3QpOwo+ICsJaHVnZXRsYl9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdGVwLCBwdGVfYWxpZ25l ZCwgdmFkZHIsIHByb3QpOwo+ICsKPiArCXBtZF9sZWFmX3Rlc3RzKHBtZF9hbGlnbmVkLCBwcm90 KTsKPiArCXB1ZF9sZWFmX3Rlc3RzKHB1ZF9hbGlnbmVkLCBwcm90KTsKPiArCj4gKwlwbWRfaHVn ZV90ZXN0cyhwbWRwLCBwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwdWRfaHVnZV90ZXN0cyhwdWRw LCBwdWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICsJcHRlX3NhdmVkd3JpdGVfdGVzdHMocHRlX2Fs aWduZWQsIHByb3QpOwo+ICsJcG1kX3NhdmVkd3JpdGVfdGVzdHMocG1kX2FsaWduZWQsIHByb3Qp Owo+ICsKPiAgIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Cj4gICAKPiAgIAlwbWRfcG9w dWxhdGVfdGVzdHMobW0sIHBtZHAsIHNhdmVkX3B0ZXApOwo+IEBAIC02NzgsNiArOTgzLDcgQEAg c3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXBtZF9mcmVlKG1t LCBzYXZlZF9wbWRwKTsKPiAgIAlwdGVfZnJlZShtbSwgc2F2ZWRfcHRlcCk7Cj4gICAKPiArCXZt X2FyZWFfZnJlZSh2bWEpOwo+ICAgCW1tX2RlY19ucl9wdWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cG1kcyhtbSk7Cj4gICAJbW1fZGVjX25yX3B0ZXMobW0pOwo+IAoKQ2hyaXN0b3BoZQoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFp bGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo= 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 21DA3C433DF for ; Sat, 27 Jun 2020 07:20:31 +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 6BA3920656 for ; Sat, 27 Jun 2020 07:20:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6BA3920656 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 49v4sR4MqwzDr5R for ; Sat, 27 Jun 2020 17:20:27 +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 49v4qc62Z3zDqN7 for ; Sat, 27 Jun 2020 17:18:49 +1000 (AEST) Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v4qS6JbBz9tyWF; Sat, 27 Jun 2020 09:18:44 +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 R0Xe0WEpH3V0; Sat, 27 Jun 2020 09:18:44 +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 49v4qS4vSnz9tyWD; Sat, 27 Jun 2020 09:18:44 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E336F8B772; Sat, 27 Jun 2020 09:18:45 +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 t5lVUH5_v1hK; Sat, 27 Jun 2020 09:18:45 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 483478B75B; Sat, 27 Jun 2020 09:18:43 +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: <6da177e6-9219-9ccf-a402-f4293c7564f7@csgroup.eu> Date: Sat, 27 Jun 2020 09:18:41 +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 , linux-arm-kernel@lists.infradead.org, ziy@nvidia.com, Catalin Marinas , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , gerald.schaefer@de.ibm.com, christophe.leroy@c-s.fr, 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) > +{ > + 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); same > + 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); same > + 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); same > + 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); same > + 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); same > + 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) > +{ > + 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) > +{ > + 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) > +{ > +} > +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) > +{ > +} > +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) > +{ > +} > +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); Remplace with ptep_get() to avoid build failure on powerpc 8xx. > + 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 4E6B8C433E0 for ; Sat, 27 Jun 2020 07:18:58 +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 133132080C for ; Sat, 27 Jun 2020 07:18:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="GS33iISp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 133132080C 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=Wr7ts7PaBZctbJVOecSWwlqIsGGNCJECxusLOnMgyis=; b=GS33iISp6gJ9zur2zyeGVbFC2 5hOXlGSI/JsrMAoJH7AklcjqzXImPsEsa2gu3+2cySosfBBVbbFNdbLm5zONCW1+XdU3h1rBukydL CBK47T9QT21Tk87tJDi/H3ppySJ0JEqZogMsP5181GiKLeNtyRrJFXQcJAFfNdq3FroYu9j46+rtp OxDXw1pC1hJVcmfZy/zwq2/rHYbrP6PVPs549iKWmpqsjRyRRYUrdZatNseB0Mb6DLtIsiz9ng/0j c+1fjcLIIfDuYiWfTnKGP4r8MLFkS4de3I3TZVk7KmKxsOrCHCifCdrt9xYRdP294w913e1OnJVoi 5Bb0KGB5A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp573-0008TV-3s; Sat, 27 Jun 2020 07:18:57 +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 1jp56u-0008SM-9J; Sat, 27 Jun 2020 07:18:50 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v4qS6JbBz9tyWF; Sat, 27 Jun 2020 09:18:44 +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 R0Xe0WEpH3V0; Sat, 27 Jun 2020 09:18:44 +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 49v4qS4vSnz9tyWD; Sat, 27 Jun 2020 09:18:44 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E336F8B772; Sat, 27 Jun 2020 09:18:45 +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 t5lVUH5_v1hK; Sat, 27 Jun 2020 09:18:45 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 483478B75B; Sat, 27 Jun 2020 09:18:43 +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: <6da177e6-9219-9ccf-a402-f4293c7564f7@csgroup.eu> Date: Sat, 27 Jun 2020 09:18:41 +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 , linux-arm-kernel@lists.infradead.org, ziy@nvidia.com, Catalin Marinas , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , gerald.schaefer@de.ibm.com, christophe.leroy@c-s.fr, 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 aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sK PiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCj4gKwlwdGUgPSBwZm5fcHRl KHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0 ZXBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpw dGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKHB0ZV93cml0ZShwdGUpKTsKPiArCj4gKwlwdGUgPSBw Zm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9P TkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlw dGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0KHB0ZSk7Cj4g KwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAs IHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRlX21rZGlydHko cHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVwLCBwdGUsIDEp Owo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCEocHRlX3dy aXRlKHB0ZSkgJiYgcHRlX2RpcnR5KHB0ZSkpKTsKPiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwg cHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0ZXBfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHRlcCwgMSk7Cj4gKwlwdGUgPSBSRUFEX09OQ0Uo KnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04oIXB0ZV9ub25lKHB0ZSkpOwo+ICsKPiArCXB0ZSA9 IHB0ZV9ta3lvdW5nKHB0ZSk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUg PSBSRUFEX09OQ0UoKnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUo cGZuLCBwcm90KTsKPiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9 Cj4gICAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBf X2luaXQgcG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ ICAgewo+IEBAIC03Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190 ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRf YmFkKHBtZF9ta2h1Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBw bWRfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNp Z25lZCBsb25nIHZhZGRyLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5f cG1kKHBmbiwgcHJvdCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BNRF9T SVpFICovCj4gKwl2YWRkciA9ICh2YWRkciAmIEhQQUdFX1BNRF9NQVNLKSArIEhQQUdFX1BNRF9T SVpFOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcG1k cCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRfd3JpdGUocG1k KSk7Cj4gKwo+ICsJcG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsJc2V0X3BtZF9hdChtbSwg dmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIs IHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXBtZCA9IHBtZF93 cnByb3RlY3QocG1kKTsKPiArCXBtZCA9IHBtZF9ta2NsZWFuKHBtZCk7Cj4gKwlzZXRfcG1kX2F0 KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZCA9IHBtZF9ta3dyaXRlKHBtZCk7Cj4gKwlw bWQgPSBwbWRfbWtkaXJ0eShwbWQpOwo+ICsJcG1kcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFk ZHIsIHBtZHAsIHBtZCwgMSk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9P TighKHBtZF93cml0ZShwbWQpICYmIHBtZF9kaXJ0eShwbWQpKSk7Cj4gKwo+ICsJcG1kID0gcG1k X21raHVnZShwZm5fcG1kKHBmbiwgcHJvdCkpOwo+ICsJc2V0X3BtZF9hdChtbSwgdmFkZHIsIHBt ZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcl9mdWxsKHZtYSwgdmFkZHIsIHBt ZHAsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBtZF9ta3lvdW5nKHBtZCk7Cj4gKwlzZXRfcG1kX2F0KG1t LCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2 YWRkciwgcG1kcCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRf eW91bmcocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0 cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcG1kX3QgcG1kID0g cGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCS8qCj4gKwkgKiBQTUQgYmFzZWQgVEhQIGlzIGEg bGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJcG1kID0gcG1kX21raHVnZShwbWQpOwo+ICsJV0FSTl9P TighcG1kX2xlYWYocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVn ZV90ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4g K3sKPiArCXBtZF90IHBtZDsKPiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJD SF9IVUdFX1ZNQVApKQo+ICsJCXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwbWRf c2V0X2h1Z2UoKSB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUE1EIGlzIG5vdCBhIHBv cHVsYXRlZCBub24tbGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcG1kcCwgX19w bWQoMCkpOwo+ICsJV0FSTl9PTighcG1kX3NldF9odWdlKHBtZHAsIF9fcGZuX3RvX3BoeXMocGZu KSwgcHJvdCkpOwo+ICsJV0FSTl9PTighcG1kX2NsZWFyX2h1Z2UocG1kcCkpOwo+ICsJcG1kID0g UkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25lKHBtZCkpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBw Zm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBtZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90 KTsKPiArCj4gKwlXQVJOX09OKCFwbWRfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICsJV0FSTl9PTihwbWRfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICt9Cj4gKwo+ICAg I2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVECj4gICBzdGF0 aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICAgewo+IEBAIC0xMDAsMTIgKzIzMywxMTUgQEAgc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAkg Ki8KPiAgIAlXQVJOX09OKCFwdWRfYmFkKHB1ZF9ta2h1Z2UocHVkKSkpOwo+ICAgfQo+ICsKPiAr c3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJ CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBs b25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVk X3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50 X2h1Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdy dCBIUEFHRV9QVURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QVURfTUFTSykg KyBIUEFHRV9QVURfU0laRTsKPiArCj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB1ZHApOwo+ICsJcHVkID0gUkVB RF9PTkNFKCpwdWRwKTsKPiArCVdBUk5fT04ocHVkX3dyaXRlKHB1ZCkpOwo+ICsKPiArI2lmbmRl ZiBfX1BBR0VUQUJMRV9QTURfRk9MREVECj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4g KwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5k X2NsZWFyKG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJ V0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKwo+ICsJcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsJc2V0X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWRwX2h1Z2VfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHVkcCwgMSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0Uo KnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKyNlbmRpZiAvKiBfX1BBR0VU QUJMRV9QTURfRk9MREVEICovCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlwdWQg PSBwdWRfd3Jwcm90ZWN0KHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtjbGVhbihwdWQpOwo+ICsJc2V0 X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWt3cml0ZShwdWQp Owo+ICsJcHVkID0gcHVkX21rZGlydHkocHVkKTsKPiArCXB1ZHBfc2V0X2FjY2Vzc19mbGFncyh2 bWEsIHZhZGRyLCBwdWRwLCBwdWQsIDEpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsKPiAr CVdBUk5fT04oIShwdWRfd3JpdGUocHVkKSAmJiBwdWRfZGlydHkocHVkKSkpOwo+ICsKPiArCXB1 ZCA9IHB1ZF9ta3lvdW5nKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHVkcCk7Cj4gKwlw dWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTihwdWRfeW91bmcocHVkKSk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsKPiArCS8qCj4gKwkgKiBQVUQgYmFzZWQgVEhQIGlzIGEgbGVhZiBlbnRyeS4KPiArCSAq Lwo+ICsJcHVkID0gcHVkX21raHVnZShwdWQpOwo+ICsJV0FSTl9PTighcHVkX2xlYWYocHVkKSk7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVk cCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB1ZF90IHB1ZDsK PiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVApKQo+ICsJ CXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwdWRfc2V0X2h1Z2UoKSB2ZXJpZmll cyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUFVEIGlzIG5vdCBhIHBvcHVsYXRlZCBub24tbGVhZiBl bnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcHVkcCwgX19wdWQoMCkpOwo+ICsJV0FSTl9P TighcHVkX3NldF9odWdlKHB1ZHAsIF9fcGZuX3RvX3BoeXMocGZuKSwgcHJvdCkpOwo+ICsJV0FS Tl9PTighcHVkX2NsZWFyX2h1Z2UocHVkcCkpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsK PiArCVdBUk5fT04oIXB1ZF9ub25lKHB1ZCkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJR19I QVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4gICBzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0K PiArc3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ ICsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25l ZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9 Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwg cGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhw dWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ ICAgI2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICov Cj4gICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGlj IHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3Qg cHJvdCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVk IGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9h ZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVk IGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJCXN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBsb25nIHBmbiwg dW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25n IHBmbiwgcGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVnZV90 ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sK PiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2h1Z2VfdGVzdHMocHVkX3QgKnB1ZHAsIHVu c2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQg X19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiAgICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAg IAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHA0ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiBAQCAtNDk1LDggKzczMSw1NiBAQCBzdGF0aWMgdm9pZCBfX2lu aXQgaHVnZXRsYl9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkK PiAgIAlXQVJOX09OKCFwdGVfaHVnZShwdGVfbWtodWdlKHB0ZSkpKTsKPiAgICNlbmRpZiAvKiBD T05GSUdfQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQiAqLwo+ICAgfQo+ICsKPiArc3RhdGljIHZv aWQgX19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4g KwkJCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVw LCB1bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJv dF90IHByb3QpCj4gK3sKPiArCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsK PiArCXB0ZV90IHB0ZSA9IFJFQURfT05DRSgqcHRlcCk7CgpSZW1wbGFjZSB3aXRoIHB0ZXBfZ2V0 KCkgdG8gYXZvaWQgYnVpbGQgZmFpbHVyZSBvbiBwb3dlcnBjIDh4eC4KCj4gKwl1bnNpZ25lZCBs b25nIHBhZGRyID0gKF9fcGZuX3RvX3BoeXMocGZuKSB8IFJBTkRPTV9PUlZBTFVFKSAmIFBNRF9N QVNLOwo+ICsKPiArCXB0ZSA9IHB0ZV9ta2h1Z2UobWtfcHRlKHBmbl90b19wYWdlKFBIWVNfUEZO KHBhZGRyKSksIHByb3QpKTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0 ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlXQVJOX09OKCFwdGVfc2FtZShwdGUsIGh1Z2VfcHRlcF9n ZXQocHRlcCkpKTsKPiArCWh1Z2VfcHRlX2NsZWFyKG1tLCB2YWRkciwgcHRlcCwgUE1EX1NJWkUp Owo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04oIWh1Z2VfcHRlX25v bmUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJvdCk7Cj4gKwlzZXRf aHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmllcigpOwo+ICsJaHVn ZV9wdGVwX3NldF93cnByb3RlY3QobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0ZSA9IGh1Z2VfcHRl cF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKGh1Z2VfcHRlX3dyaXRlKHB0ZSkpOwo+ICsKPiArCXB0 ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJc2V0X2h1Z2VfcHRlX2F0KG1tLCB2YWRk ciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCWh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFy KG1tLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FS Tl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBta19odWdlX3B0ZShwYWdl LCBwcm90KTsKPiArCXB0ZSA9IGh1Z2VfcHRlX3dycHJvdGVjdChwdGUpOwo+ICsJc2V0X2h1Z2Vf cHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCXB0ZSA9IGh1 Z2VfcHRlX21rd3JpdGUocHRlKTsKPiArCXB0ZSA9IGh1Z2VfcHRlX21rZGlydHkocHRlKTsKPiAr CWh1Z2VfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB0ZXAsIHB0ZSwgMSk7Cj4g KwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FSTl9PTighKGh1Z2VfcHRlX3dyaXRl KHB0ZSkgJiYgaHVnZV9wdGVfZGlydHkocHRlKSkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJ R19IVUdFVExCX1BBR0UgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2ljX3Rl c3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQg X19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJ CQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVwLCB1 bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90 IHByb3QpCj4gK3sKPiArfQo+ICAgI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KPiAg IAo+ICAgI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQo+IEBAIC01NjgsNiArODUy LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGdldF9yYW5kb21fdmFkZHIodm9pZCkK PiAgIAo+ICAgc3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgewo+ ICsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Cj4gICAJc3RydWN0IG1tX3N0cnVjdCAqbW07 Cj4gICAJcGdkX3QgKnBnZHA7Cj4gICAJcDRkX3QgKnA0ZHAsICpzYXZlZF9wNGRwOwo+IEBAIC01 OTYsNiArODgxLDEyIEBAIHN0YXRpYyBpbnQgX19pbml0IGRlYnVnX3ZtX3BndGFibGUodm9pZCkK PiAgIAkgKi8KPiAgIAlwcm90bm9uZSA9IF9fUDAwMDsKPiAgIAo+ICsJdm1hID0gdm1fYXJlYV9h bGxvYyhtbSk7Cj4gKwlpZiAoIXZtYSkgewo+ICsJCXByX2Vycigidm1hIGFsbG9jYXRpb24gZmFp bGVkXG4iKTsKPiArCQlyZXR1cm4gMTsKPiArCX0KPiArCj4gICAJLyoKPiAgIAkgKiBQRk4gZm9y IG1hcHBpbmcgYXQgUFRFIGxldmVsIGlzIGRldGVybWluZWQgZnJvbSBhIHN0YW5kYXJkIGtlcm5l bAo+ICAgCSAqIHRleHQgc3ltYm9sLiBCdXQgcGZucyBmb3IgaGlnaGVyIHBhZ2UgdGFibGUgbGV2 ZWxzIGFyZSBkZXJpdmVkIGJ5Cj4gQEAgLTY0NCw2ICs5MzUsMjAgQEAgc3RhdGljIGludCBfX2lu aXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXA0ZF9jbGVhcl90ZXN0cyhtbSwgcDRkcCk7 Cj4gICAJcGdkX2NsZWFyX3Rlc3RzKG1tLCBwZ2RwKTsKPiAgIAo+ICsJcHRlX2FkdmFuY2VkX3Rl c3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlwbWRfYWR2 YW5jZWRfdGVzdHMobW0sIHZtYSwgcG1kcCwgcG1kX2FsaWduZWQsIHZhZGRyLCBwcm90KTsKPiAr CXB1ZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdWRwLCBwdWRfYWxpZ25lZCwgdmFkZHIsIHBy b3QpOwo+ICsJaHVnZXRsYl9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdGVwLCBwdGVfYWxpZ25l ZCwgdmFkZHIsIHByb3QpOwo+ICsKPiArCXBtZF9sZWFmX3Rlc3RzKHBtZF9hbGlnbmVkLCBwcm90 KTsKPiArCXB1ZF9sZWFmX3Rlc3RzKHB1ZF9hbGlnbmVkLCBwcm90KTsKPiArCj4gKwlwbWRfaHVn ZV90ZXN0cyhwbWRwLCBwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwdWRfaHVnZV90ZXN0cyhwdWRw LCBwdWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICsJcHRlX3NhdmVkd3JpdGVfdGVzdHMocHRlX2Fs aWduZWQsIHByb3QpOwo+ICsJcG1kX3NhdmVkd3JpdGVfdGVzdHMocG1kX2FsaWduZWQsIHByb3Qp Owo+ICsKPiAgIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Cj4gICAKPiAgIAlwbWRfcG9w dWxhdGVfdGVzdHMobW0sIHBtZHAsIHNhdmVkX3B0ZXApOwo+IEBAIC02NzgsNiArOTgzLDcgQEAg c3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXBtZF9mcmVlKG1t LCBzYXZlZF9wbWRwKTsKPiAgIAlwdGVfZnJlZShtbSwgc2F2ZWRfcHRlcCk7Cj4gICAKPiArCXZt X2FyZWFfZnJlZSh2bWEpOwo+ICAgCW1tX2RlY19ucl9wdWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cG1kcyhtbSk7Cj4gICAJbW1fZGVjX25yX3B0ZXMobW0pOwo+IAoKQ2hyaXN0b3BoZQoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtc25wcy1hcmMg bWFpbGluZyBsaXN0CmxpbnV4LXNucHMtYXJjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1zbnBzLWFyYwo= 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 59D60C433DF for ; Sat, 27 Jun 2020 07:21:57 +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 1B386207FC for ; Sat, 27 Jun 2020 07:21:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="qrPUN67W" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B386207FC 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=jwNzvJlyXJVVuyXPdUIxqDe8va7NtEIuPpMJ839er3A=; b=qrPUN67W/pHPIRBP2sishEiV7 kVkj0qn6cfNCi2uaT1kxh1eHacpu0smLaPE9iAQYRoPRfO9WoTP8/0zZpRnVImxWwLfQawHYMYkwp UKZME/yUYLsQFKtgmqUZwgS9ZyJU+L5N0fMFeqyB0fAuQ7UHpiGv4FQC+spugVwcpC5KJYlUiZWpX IbTeMX5z8Sw2xYa9pHqBWG1fTUAlDqceE9X/q3rHZgw1voY1OQTXR/58Bb0U5GUx4B6uoUJbx852j +vs50j/oQJT1hBoEKv3terhHz3d492GzDNWZbEkn41mQ5jAcvOg8wX7B1nkrr8lBhKYdix6rF3VcX yeBLvVsng==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp56y-0008Sj-Ob; Sat, 27 Jun 2020 07:18:53 +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 1jp56u-0008SM-9J; Sat, 27 Jun 2020 07:18:50 +0000 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v4qS6JbBz9tyWF; Sat, 27 Jun 2020 09:18:44 +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 R0Xe0WEpH3V0; Sat, 27 Jun 2020 09:18:44 +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 49v4qS4vSnz9tyWD; Sat, 27 Jun 2020 09:18:44 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E336F8B772; Sat, 27 Jun 2020 09:18:45 +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 t5lVUH5_v1hK; Sat, 27 Jun 2020 09:18:45 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 483478B75B; Sat, 27 Jun 2020 09:18:43 +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: <6da177e6-9219-9ccf-a402-f4293c7564f7@csgroup.eu> Date: Sat, 27 Jun 2020 09:18:41 +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 , linux-arm-kernel@lists.infradead.org, ziy@nvidia.com, Catalin Marinas , linux-snps-arc@lists.infradead.org, Vasily Gorbik , Borislav Petkov , Paul Walmsley , "Kirill A . Shutemov" , Thomas Gleixner , gerald.schaefer@de.ibm.com, christophe.leroy@c-s.fr, 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 aWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sK PiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUocGZuLCBwcm90KTsKPiArCj4gKwlwdGUgPSBwZm5fcHRl KHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0 ZXBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9PTkNFKCpw dGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKHB0ZV93cml0ZShwdGUpKTsKPiArCj4gKwlwdGUgPSBw Zm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIsIHB0ZXApOwo+ICsJcHRlID0gUkVBRF9P TkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCFwdGVfbm9uZShwdGUpKTsKPiArCj4gKwlw dGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7Cj4gKwlwdGUgPSBwdGVfd3Jwcm90ZWN0KHB0ZSk7Cj4g KwlwdGUgPSBwdGVfbWtjbGVhbihwdGUpOwo+ICsJc2V0X3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAs IHB0ZSk7Cj4gKwlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwo+ICsJcHRlID0gcHRlX21rZGlydHko cHRlKTsKPiArCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIHZhZGRyLCBwdGVwLCBwdGUsIDEp Owo+ICsJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKCnNhbWUKCj4gKwlXQVJOX09OKCEocHRlX3dy aXRlKHB0ZSkgJiYgcHRlX2RpcnR5KHB0ZSkpKTsKPiArCj4gKwlwdGUgPSBwZm5fcHRlKHBmbiwg cHJvdCk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCXB0ZXBfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHRlcCwgMSk7Cj4gKwlwdGUgPSBSRUFEX09OQ0Uo KnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04oIXB0ZV9ub25lKHB0ZSkpOwo+ICsKPiArCXB0ZSA9 IHB0ZV9ta3lvdW5nKHB0ZSk7Cj4gKwlzZXRfcHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsK PiArCXB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUg PSBSRUFEX09OQ0UoKnB0ZXApOwoKc2FtZQoKPiArCVdBUk5fT04ocHRlX3lvdW5nKHB0ZSkpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHRlX3NhdmVkd3JpdGVfdGVzdHModW5zaWdu ZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB0ZV90IHB0ZSA9IHBmbl9wdGUo cGZuLCBwcm90KTsKPiArCj4gKwlXQVJOX09OKCFwdGVfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICsJV0FSTl9PTihwdGVfc2F2ZWR3 cml0ZShwdGVfY2xlYXJfc2F2ZWR3cml0ZShwdGVfbWtfc2F2ZWR3cml0ZShwdGUpKSkpOwo+ICt9 Cj4gICAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4gICBzdGF0aWMgdm9pZCBf X2luaXQgcG1kX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ ICAgewo+IEBAIC03Nyw2ICsxMjcsODkgQEAgc3RhdGljIHZvaWQgX19pbml0IHBtZF9iYXNpY190 ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAlXQVJOX09OKCFwbWRf YmFkKHBtZF9ta2h1Z2UocG1kKSkpOwo+ICAgfQo+ICAgCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBw bWRfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJc3RydWN0IHZtX2Fy ZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWRwLAo+ICsJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNp Z25lZCBsb25nIHZhZGRyLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gKwlwbWRfdCBwbWQgPSBwZm5f cG1kKHBmbiwgcHJvdCk7Cj4gKwo+ICsJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSkK PiArCQlyZXR1cm47Cj4gKwo+ICsJLyogQWxpZ24gdGhlIGFkZHJlc3Mgd3J0IEhQQUdFX1BNRF9T SVpFICovCj4gKwl2YWRkciA9ICh2YWRkciAmIEhQQUdFX1BNRF9NQVNLKSArIEhQQUdFX1BNRF9T SVpFOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXNldF9wbWRfYXQobW0s IHZhZGRyLCBwbWRwLCBwbWQpOwo+ICsJcG1kcF9zZXRfd3Jwcm90ZWN0KG1tLCB2YWRkciwgcG1k cCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRfd3JpdGUocG1k KSk7Cj4gKwo+ICsJcG1kID0gcGZuX3BtZChwZm4sIHByb3QpOwo+ICsJc2V0X3BtZF9hdChtbSwg dmFkZHIsIHBtZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcihtbSwgdmFkZHIs IHBtZHApOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBmbl9wbWQocGZuLCBwcm90KTsKPiArCXBtZCA9IHBtZF93 cnByb3RlY3QocG1kKTsKPiArCXBtZCA9IHBtZF9ta2NsZWFuKHBtZCk7Cj4gKwlzZXRfcG1kX2F0 KG1tLCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZCA9IHBtZF9ta3dyaXRlKHBtZCk7Cj4gKwlw bWQgPSBwbWRfbWtkaXJ0eShwbWQpOwo+ICsJcG1kcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFk ZHIsIHBtZHAsIHBtZCwgMSk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9P TighKHBtZF93cml0ZShwbWQpICYmIHBtZF9kaXJ0eShwbWQpKSk7Cj4gKwo+ICsJcG1kID0gcG1k X21raHVnZShwZm5fcG1kKHBmbiwgcHJvdCkpOwo+ICsJc2V0X3BtZF9hdChtbSwgdmFkZHIsIHBt ZHAsIHBtZCk7Cj4gKwlwbWRwX2h1Z2VfZ2V0X2FuZF9jbGVhcl9mdWxsKHZtYSwgdmFkZHIsIHBt ZHAsIDEpOwo+ICsJcG1kID0gUkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25l KHBtZCkpOwo+ICsKPiArCXBtZCA9IHBtZF9ta3lvdW5nKHBtZCk7Cj4gKwlzZXRfcG1kX2F0KG1t LCB2YWRkciwgcG1kcCwgcG1kKTsKPiArCXBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2 YWRkciwgcG1kcCk7Cj4gKwlwbWQgPSBSRUFEX09OQ0UoKnBtZHApOwo+ICsJV0FSTl9PTihwbWRf eW91bmcocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0 cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcG1kX3QgcG1kID0g cGZuX3BtZChwZm4sIHByb3QpOwo+ICsKPiArCS8qCj4gKwkgKiBQTUQgYmFzZWQgVEhQIGlzIGEg bGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJcG1kID0gcG1kX21raHVnZShwbWQpOwo+ICsJV0FSTl9P TighcG1kX2xlYWYocG1kKSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVn ZV90ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4g K3sKPiArCXBtZF90IHBtZDsKPiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJD SF9IVUdFX1ZNQVApKQo+ICsJCXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwbWRf c2V0X2h1Z2UoKSB2ZXJpZmllcyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUE1EIGlzIG5vdCBhIHBv cHVsYXRlZCBub24tbGVhZiBlbnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcG1kcCwgX19w bWQoMCkpOwo+ICsJV0FSTl9PTighcG1kX3NldF9odWdlKHBtZHAsIF9fcGZuX3RvX3BoeXMocGZu KSwgcHJvdCkpOwo+ICsJV0FSTl9PTighcG1kX2NsZWFyX2h1Z2UocG1kcCkpOwo+ICsJcG1kID0g UkVBRF9PTkNFKCpwbWRwKTsKPiArCVdBUk5fT04oIXBtZF9ub25lKHBtZCkpOwo+ICt9Cj4gKwo+ ICtzdGF0aWMgdm9pZCBfX2luaXQgcG1kX3NhdmVkd3JpdGVfdGVzdHModW5zaWduZWQgbG9uZyBw Zm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXBtZF90IHBtZCA9IHBmbl9wbWQocGZuLCBwcm90 KTsKPiArCj4gKwlXQVJOX09OKCFwbWRfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICsJV0FSTl9PTihwbWRfc2F2ZWR3cml0ZShwbWRf Y2xlYXJfc2F2ZWR3cml0ZShwbWRfbWtfc2F2ZWR3cml0ZShwbWQpKSkpOwo+ICt9Cj4gKwo+ICAg I2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVECj4gICBzdGF0 aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3Rf dCBwcm90KQo+ICAgewo+IEBAIC0xMDAsMTIgKzIzMywxMTUgQEAgc3RhdGljIHZvaWQgX19pbml0 IHB1ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKPiAgIAkg Ki8KPiAgIAlXQVJOX09OKCFwdWRfYmFkKHB1ZF9ta2h1Z2UocHVkKSkpOwo+ICAgfQo+ICsKPiAr c3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJ CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBs b25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVk X3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3QpOwo+ICsKPiArCWlmICghaGFzX3RyYW5zcGFyZW50 X2h1Z2VwYWdlKCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCS8qIEFsaWduIHRoZSBhZGRyZXNzIHdy dCBIUEFHRV9QVURfU0laRSAqLwo+ICsJdmFkZHIgPSAodmFkZHIgJiBIUEFHRV9QVURfTUFTSykg KyBIUEFHRV9QVURfU0laRTsKPiArCj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfc2V0X3dycHJvdGVjdChtbSwgdmFkZHIsIHB1ZHApOwo+ICsJcHVkID0gUkVB RF9PTkNFKCpwdWRwKTsKPiArCVdBUk5fT04ocHVkX3dyaXRlKHB1ZCkpOwo+ICsKPiArI2lmbmRl ZiBfX1BBR0VUQUJMRV9QTURfRk9MREVECj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4g KwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVkKTsKPiArCXB1ZHBfaHVnZV9nZXRfYW5k X2NsZWFyKG1tLCB2YWRkciwgcHVkcCk7Cj4gKwlwdWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJ V0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKwo+ICsJcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsJc2V0X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWRwX2h1Z2VfZ2V0 X2FuZF9jbGVhcl9mdWxsKG1tLCB2YWRkciwgcHVkcCwgMSk7Cj4gKwlwdWQgPSBSRUFEX09OQ0Uo KnB1ZHApOwo+ICsJV0FSTl9PTighcHVkX25vbmUocHVkKSk7Cj4gKyNlbmRpZiAvKiBfX1BBR0VU QUJMRV9QTURfRk9MREVEICovCj4gKwlwdWQgPSBwZm5fcHVkKHBmbiwgcHJvdCk7Cj4gKwlwdWQg PSBwdWRfd3Jwcm90ZWN0KHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWtjbGVhbihwdWQpOwo+ICsJc2V0 X3B1ZF9hdChtbSwgdmFkZHIsIHB1ZHAsIHB1ZCk7Cj4gKwlwdWQgPSBwdWRfbWt3cml0ZShwdWQp Owo+ICsJcHVkID0gcHVkX21rZGlydHkocHVkKTsKPiArCXB1ZHBfc2V0X2FjY2Vzc19mbGFncyh2 bWEsIHZhZGRyLCBwdWRwLCBwdWQsIDEpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsKPiAr CVdBUk5fT04oIShwdWRfd3JpdGUocHVkKSAmJiBwdWRfZGlydHkocHVkKSkpOwo+ICsKPiArCXB1 ZCA9IHB1ZF9ta3lvdW5nKHB1ZCk7Cj4gKwlzZXRfcHVkX2F0KG1tLCB2YWRkciwgcHVkcCwgcHVk KTsKPiArCXB1ZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCB2YWRkciwgcHVkcCk7Cj4gKwlw dWQgPSBSRUFEX09OQ0UoKnB1ZHApOwo+ICsJV0FSTl9PTihwdWRfeW91bmcocHVkKSk7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiArewo+ICsJcHVkX3QgcHVkID0gcGZuX3B1ZChwZm4sIHByb3Qp Owo+ICsKPiArCS8qCj4gKwkgKiBQVUQgYmFzZWQgVEhQIGlzIGEgbGVhZiBlbnRyeS4KPiArCSAq Lwo+ICsJcHVkID0gcHVkX21raHVnZShwdWQpOwo+ICsJV0FSTl9PTighcHVkX2xlYWYocHVkKSk7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhwdWRfdCAqcHVk cCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArCXB1ZF90IHB1ZDsK PiArCj4gKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVApKQo+ICsJ CXJldHVybjsKPiArCS8qCj4gKwkgKiBYODYgZGVmaW5lZCBwdWRfc2V0X2h1Z2UoKSB2ZXJpZmll cyB0aGF0IHRoZSBnaXZlbgo+ICsJICogUFVEIGlzIG5vdCBhIHBvcHVsYXRlZCBub24tbGVhZiBl bnRyeS4KPiArCSAqLwo+ICsJV1JJVEVfT05DRSgqcHVkcCwgX19wdWQoMCkpOwo+ICsJV0FSTl9P TighcHVkX3NldF9odWdlKHB1ZHAsIF9fcGZuX3RvX3BoeXMocGZuKSwgcHJvdCkpOwo+ICsJV0FS Tl9PTighcHVkX2NsZWFyX2h1Z2UocHVkcCkpOwo+ICsJcHVkID0gUkVBRF9PTkNFKCpwdWRwKTsK PiArCVdBUk5fT04oIXB1ZF9ub25lKHB1ZCkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJR19I QVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICovCj4gICBzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0K PiArc3RhdGljIHZvaWQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ ICsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25l ZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9 Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwg cGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfaHVnZV90ZXN0cyhw dWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ ICAgI2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEICov Cj4gICAjZWxzZSAgLyogIUNPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAgc3RhdGlj IHZvaWQgX19pbml0IHBtZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3Qg cHJvdCkgeyB9Cj4gICBzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2Jhc2ljX3Rlc3RzKHVuc2lnbmVk IGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQgX19pbml0IHBtZF9h ZHZhbmNlZF90ZXN0cyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPiArCQlzdHJ1Y3Qgdm1fYXJlYV9z dHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZHAsCj4gKwkJdW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVk IGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpCj4gK3sKPiArfQo+ICtzdGF0aWMgdm9pZCBfX2lu aXQgcHVkX2FkdmFuY2VkX3Rlc3RzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAo+ICsJCXN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkcCwKPiArCQl1bnNpZ25lZCBsb25nIHBmbiwg dW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJvdCkKPiArewo+ICt9Cj4gK3N0YXRpYyB2 b2lkIF9faW5pdCBwbWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJv dCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwdWRfbGVhZl90ZXN0cyh1bnNpZ25lZCBsb25n IHBmbiwgcGdwcm90X3QgcHJvdCkgeyB9Cj4gK3N0YXRpYyB2b2lkIF9faW5pdCBwbWRfaHVnZV90 ZXN0cyhwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHByb3QpCj4gK3sK PiArfQo+ICtzdGF0aWMgdm9pZCBfX2luaXQgcHVkX2h1Z2VfdGVzdHMocHVkX3QgKnB1ZHAsIHVu c2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KQo+ICt7Cj4gK30KPiArc3RhdGljIHZvaWQg X19pbml0IHBtZF9zYXZlZHdyaXRlX3Rlc3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBw cm90KSB7IH0KPiAgICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAg IAo+ICAgc3RhdGljIHZvaWQgX19pbml0IHA0ZF9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBm biwgcGdwcm90X3QgcHJvdCkKPiBAQCAtNDk1LDggKzczMSw1NiBAQCBzdGF0aWMgdm9pZCBfX2lu aXQgaHVnZXRsYl9iYXNpY190ZXN0cyh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkK PiAgIAlXQVJOX09OKCFwdGVfaHVnZShwdGVfbWtodWdlKHB0ZSkpKTsKPiAgICNlbmRpZiAvKiBD T05GSUdfQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQiAqLwo+ICAgfQo+ICsKPiArc3RhdGljIHZv aWQgX19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4g KwkJCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVw LCB1bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJv dF90IHByb3QpCj4gK3sKPiArCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsK PiArCXB0ZV90IHB0ZSA9IFJFQURfT05DRSgqcHRlcCk7CgpSZW1wbGFjZSB3aXRoIHB0ZXBfZ2V0 KCkgdG8gYXZvaWQgYnVpbGQgZmFpbHVyZSBvbiBwb3dlcnBjIDh4eC4KCj4gKwl1bnNpZ25lZCBs b25nIHBhZGRyID0gKF9fcGZuX3RvX3BoeXMocGZuKSB8IFJBTkRPTV9PUlZBTFVFKSAmIFBNRF9N QVNLOwo+ICsKPiArCXB0ZSA9IHB0ZV9ta2h1Z2UobWtfcHRlKHBmbl90b19wYWdlKFBIWVNfUEZO KHBhZGRyKSksIHByb3QpKTsKPiArCXNldF9odWdlX3B0ZV9hdChtbSwgdmFkZHIsIHB0ZXAsIHB0 ZSk7Cj4gKwliYXJyaWVyKCk7Cj4gKwlXQVJOX09OKCFwdGVfc2FtZShwdGUsIGh1Z2VfcHRlcF9n ZXQocHRlcCkpKTsKPiArCWh1Z2VfcHRlX2NsZWFyKG1tLCB2YWRkciwgcHRlcCwgUE1EX1NJWkUp Owo+ICsJcHRlID0gaHVnZV9wdGVwX2dldChwdGVwKTsKPiArCVdBUk5fT04oIWh1Z2VfcHRlX25v bmUocHRlKSk7Cj4gKwo+ICsJcHRlID0gbWtfaHVnZV9wdGUocGFnZSwgcHJvdCk7Cj4gKwlzZXRf aHVnZV9wdGVfYXQobW0sIHZhZGRyLCBwdGVwLCBwdGUpOwo+ICsJYmFycmllcigpOwo+ICsJaHVn ZV9wdGVwX3NldF93cnByb3RlY3QobW0sIHZhZGRyLCBwdGVwKTsKPiArCXB0ZSA9IGh1Z2VfcHRl cF9nZXQocHRlcCk7Cj4gKwlXQVJOX09OKGh1Z2VfcHRlX3dyaXRlKHB0ZSkpOwo+ICsKPiArCXB0 ZSA9IG1rX2h1Z2VfcHRlKHBhZ2UsIHByb3QpOwo+ICsJc2V0X2h1Z2VfcHRlX2F0KG1tLCB2YWRk ciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCWh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFy KG1tLCB2YWRkciwgcHRlcCk7Cj4gKwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FS Tl9PTighaHVnZV9wdGVfbm9uZShwdGUpKTsKPiArCj4gKwlwdGUgPSBta19odWdlX3B0ZShwYWdl LCBwcm90KTsKPiArCXB0ZSA9IGh1Z2VfcHRlX3dycHJvdGVjdChwdGUpOwo+ICsJc2V0X2h1Z2Vf cHRlX2F0KG1tLCB2YWRkciwgcHRlcCwgcHRlKTsKPiArCWJhcnJpZXIoKTsKPiArCXB0ZSA9IGh1 Z2VfcHRlX21rd3JpdGUocHRlKTsKPiArCXB0ZSA9IGh1Z2VfcHRlX21rZGlydHkocHRlKTsKPiAr CWh1Z2VfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgdmFkZHIsIHB0ZXAsIHB0ZSwgMSk7Cj4g KwlwdGUgPSBodWdlX3B0ZXBfZ2V0KHB0ZXApOwo+ICsJV0FSTl9PTighKGh1Z2VfcHRlX3dyaXRl KHB0ZSkgJiYgaHVnZV9wdGVfZGlydHkocHRlKSkpOwo+ICt9Cj4gICAjZWxzZSAgLyogIUNPTkZJ R19IVUdFVExCX1BBR0UgKi8KPiAgIHN0YXRpYyB2b2lkIF9faW5pdCBodWdldGxiX2Jhc2ljX3Rl c3RzKHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBwcm90KSB7IH0KPiArc3RhdGljIHZvaWQg X19pbml0IGh1Z2V0bGJfYWR2YW5jZWRfdGVzdHMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCj4gKwkJ CQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiArCQkJCQkgIHB0ZV90ICpwdGVwLCB1 bnNpZ25lZCBsb25nIHBmbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90 IHByb3QpCj4gK3sKPiArfQo+ICAgI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KPiAg IAo+ICAgI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQo+IEBAIC01NjgsNiArODUy LDcgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGdldF9yYW5kb21fdmFkZHIodm9pZCkK PiAgIAo+ICAgc3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgewo+ ICsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Cj4gICAJc3RydWN0IG1tX3N0cnVjdCAqbW07 Cj4gICAJcGdkX3QgKnBnZHA7Cj4gICAJcDRkX3QgKnA0ZHAsICpzYXZlZF9wNGRwOwo+IEBAIC01 OTYsNiArODgxLDEyIEBAIHN0YXRpYyBpbnQgX19pbml0IGRlYnVnX3ZtX3BndGFibGUodm9pZCkK PiAgIAkgKi8KPiAgIAlwcm90bm9uZSA9IF9fUDAwMDsKPiAgIAo+ICsJdm1hID0gdm1fYXJlYV9h bGxvYyhtbSk7Cj4gKwlpZiAoIXZtYSkgewo+ICsJCXByX2Vycigidm1hIGFsbG9jYXRpb24gZmFp bGVkXG4iKTsKPiArCQlyZXR1cm4gMTsKPiArCX0KPiArCj4gICAJLyoKPiAgIAkgKiBQRk4gZm9y IG1hcHBpbmcgYXQgUFRFIGxldmVsIGlzIGRldGVybWluZWQgZnJvbSBhIHN0YW5kYXJkIGtlcm5l bAo+ICAgCSAqIHRleHQgc3ltYm9sLiBCdXQgcGZucyBmb3IgaGlnaGVyIHBhZ2UgdGFibGUgbGV2 ZWxzIGFyZSBkZXJpdmVkIGJ5Cj4gQEAgLTY0NCw2ICs5MzUsMjAgQEAgc3RhdGljIGludCBfX2lu aXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXA0ZF9jbGVhcl90ZXN0cyhtbSwgcDRkcCk7 Cj4gICAJcGdkX2NsZWFyX3Rlc3RzKG1tLCBwZ2RwKTsKPiAgIAo+ICsJcHRlX2FkdmFuY2VkX3Rl c3RzKG1tLCB2bWEsIHB0ZXAsIHB0ZV9hbGlnbmVkLCB2YWRkciwgcHJvdCk7Cj4gKwlwbWRfYWR2 YW5jZWRfdGVzdHMobW0sIHZtYSwgcG1kcCwgcG1kX2FsaWduZWQsIHZhZGRyLCBwcm90KTsKPiAr CXB1ZF9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdWRwLCBwdWRfYWxpZ25lZCwgdmFkZHIsIHBy b3QpOwo+ICsJaHVnZXRsYl9hZHZhbmNlZF90ZXN0cyhtbSwgdm1hLCBwdGVwLCBwdGVfYWxpZ25l ZCwgdmFkZHIsIHByb3QpOwo+ICsKPiArCXBtZF9sZWFmX3Rlc3RzKHBtZF9hbGlnbmVkLCBwcm90 KTsKPiArCXB1ZF9sZWFmX3Rlc3RzKHB1ZF9hbGlnbmVkLCBwcm90KTsKPiArCj4gKwlwbWRfaHVn ZV90ZXN0cyhwbWRwLCBwbWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwlwdWRfaHVnZV90ZXN0cyhwdWRw LCBwdWRfYWxpZ25lZCwgcHJvdCk7Cj4gKwo+ICsJcHRlX3NhdmVkd3JpdGVfdGVzdHMocHRlX2Fs aWduZWQsIHByb3QpOwo+ICsJcG1kX3NhdmVkd3JpdGVfdGVzdHMocG1kX2FsaWduZWQsIHByb3Qp Owo+ICsKPiAgIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Cj4gICAKPiAgIAlwbWRfcG9w dWxhdGVfdGVzdHMobW0sIHBtZHAsIHNhdmVkX3B0ZXApOwo+IEBAIC02NzgsNiArOTgzLDcgQEAg c3RhdGljIGludCBfX2luaXQgZGVidWdfdm1fcGd0YWJsZSh2b2lkKQo+ICAgCXBtZF9mcmVlKG1t LCBzYXZlZF9wbWRwKTsKPiAgIAlwdGVfZnJlZShtbSwgc2F2ZWRfcHRlcCk7Cj4gICAKPiArCXZt X2FyZWFfZnJlZSh2bWEpOwo+ICAgCW1tX2RlY19ucl9wdWRzKG1tKTsKPiAgIAltbV9kZWNfbnJf cG1kcyhtbSk7Cj4gICAJbW1fZGVjX25yX3B0ZXMobW0pOwo+IAoKQ2hyaXN0b3BoZQoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=