Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp1165246pxy; Fri, 23 Apr 2021 01:35:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSfmsWv5/j1DdiW/F7aaHOJOp24/uVNLZ1R66kjLoeMLxml+RHYvZhNJfP6bgHJJGTDhKD X-Received: by 2002:a62:6497:0:b029:220:d96a:8a79 with SMTP id y145-20020a6264970000b0290220d96a8a79mr2754933pfb.23.1619166957455; Fri, 23 Apr 2021 01:35:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619166957; cv=none; d=google.com; s=arc-20160816; b=YjuBHRBV6n5kscCNS9MoPgDgWPJpJJ3dgkfvYumtY+gbrGtRQNP7jZT++YvFfUUZKh mAWsVHXc06+18Y/Hu7XiDCB7IaeY2bWM3CrwDYamrKWbTCyRPzaPvFmtIrkNvg33Qnq3 wuDbPtNTRwZ3+LWDX1oMjwWnHRu/dgRx09NxHih71YtiJSIQgp6Y0cqWGo3Uf1B1mr9x fV4N9P2jJ1qS6LFdz+ysQw4yXovAjoSNo2ErLBQoHrwicTOXc70FKch5NrrNsBWlwU3k xI1RTzh81cGgF6wKYX9/Ns11RCPVBZ9j2VgqY6k1/ougZ4irOd/NfZ/U0DI9Tmq7bPxi pJFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=kk4Yf0r0GhZLTEFLCr0o+DDD5D/QxTNMw6tTugkWxTc=; b=TWq9rYdEQgpLfGFgIlSnf70wpCkgQjsRqQ3hYuunInygdDDV44dz5ut+PBpcQJY8QI hMThM3tRFSaOtcuZN3XR2NSmN8NpbwsBkyW8VkdxHhC6WxNK+mtXuzPSJJsVSDR7qsKQ 0D4kesQ7xoTp2Nw9jMe3GC6ORhqomfrhL7eo0NuNCtOTeuBVxfTtOlJCGjj2TyhychvJ StzLkxr+Hv4HnfdMf+GpeWwH+TrOGJFd4bu3K1FFX/ccanx8yoXiQ8JQTNKqW4AWXEYH 3KWgaySRU6oPCdQ5+hiHzDYCq65t/14tKL0PIesBf7BC1Vl5qvo0wrnEhzVI35hMIAW9 01sw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g3si5977257pjp.134.2021.04.23.01.35.44; Fri, 23 Apr 2021 01:35:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241439AbhDWIeo (ORCPT + 99 others); Fri, 23 Apr 2021 04:34:44 -0400 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:55361 "EHLO relay7-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230059AbhDWIen (ORCPT ); Fri, 23 Apr 2021 04:34:43 -0400 X-Originating-IP: 2.7.49.219 Received: from [192.168.1.12] (lfbn-lyo-1-457-219.w2-7.abo.wanadoo.fr [2.7.49.219]) (Authenticated sender: alex@ghiti.fr) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 178B620003; Fri, 23 Apr 2021 08:34:02 +0000 (UTC) Subject: Re: [PATCH] riscv: Fix 32b kernel caused by 64b kernel mapping moving outside linear mapping To: Anup Patel Cc: Jonathan Corbet , Paul Walmsley , Palmer Dabbelt , Albert Ou , Arnd Bergmann , Andrey Ryabinin , Alexander Potapenko , Dmitry Vyukov , linux-doc@vger.kernel.org, linux-riscv , "linux-kernel@vger.kernel.org List" , kasan-dev@googlegroups.com, linux-arch , Linux Memory Management List References: <20210417172159.32085-1-alex@ghiti.fr> From: Alex Ghiti Message-ID: <66e9a8e0-5764-2eea-4070-bad3fb7ee48e@ghiti.fr> Date: Fri, 23 Apr 2021 04:34:02 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.10.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 4/20/21 à 12:18 AM, Anup Patel a écrit : > On Sat, Apr 17, 2021 at 10:52 PM Alexandre Ghiti wrote: >> >> Fix multiple leftovers when moving the kernel mapping outside the linear >> mapping for 64b kernel that left the 32b kernel unusable. >> >> Fixes: 4b67f48da707 ("riscv: Move kernel mapping outside of linear mapping") >> Signed-off-by: Alexandre Ghiti > > Quite a few #ifdef but I don't see any better way at the moment. Maybe we can > clean this later. Otherwise looks good to me. > > Reviewed-by: Anup Patel Thanks Anup! @Palmer: This is not on for-next yet and then rv32 is broken. This does not apply immediately on top of for-next though, so if you need a new version, I can do that. But this squashes nicely with the patch it fixes if you prefer. Let me know, I can do that very quickly. Alex > > Regards, > Anup > >> --- >> arch/riscv/include/asm/page.h | 9 +++++++++ >> arch/riscv/include/asm/pgtable.h | 16 ++++++++++++---- >> arch/riscv/mm/init.c | 25 ++++++++++++++++++++++++- >> 3 files changed, 45 insertions(+), 5 deletions(-) >> >> diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h >> index 22cfb2be60dc..f64b61296c0c 100644 >> --- a/arch/riscv/include/asm/page.h >> +++ b/arch/riscv/include/asm/page.h >> @@ -90,15 +90,20 @@ typedef struct page *pgtable_t; >> >> #ifdef CONFIG_MMU >> extern unsigned long va_pa_offset; >> +#ifdef CONFIG_64BIT >> extern unsigned long va_kernel_pa_offset; >> +#endif >> extern unsigned long pfn_base; >> #define ARCH_PFN_OFFSET (pfn_base) >> #else >> #define va_pa_offset 0 >> +#ifdef CONFIG_64BIT >> #define va_kernel_pa_offset 0 >> +#endif >> #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) >> #endif /* CONFIG_MMU */ >> >> +#ifdef CONFIG_64BIT >> extern unsigned long kernel_virt_addr; >> >> #define linear_mapping_pa_to_va(x) ((void *)((unsigned long)(x) + va_pa_offset)) >> @@ -112,6 +117,10 @@ extern unsigned long kernel_virt_addr; >> (_x < kernel_virt_addr) ? \ >> linear_mapping_va_to_pa(_x) : kernel_mapping_va_to_pa(_x); \ >> }) >> +#else >> +#define __pa_to_va_nodebug(x) ((void *)((unsigned long) (x) + va_pa_offset)) >> +#define __va_to_pa_nodebug(x) ((unsigned long)(x) - va_pa_offset) >> +#endif >> >> #ifdef CONFIG_DEBUG_VIRTUAL >> extern phys_addr_t __virt_to_phys(unsigned long x); >> diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h >> index 80e63a93e903..5afda75cc2c3 100644 >> --- a/arch/riscv/include/asm/pgtable.h >> +++ b/arch/riscv/include/asm/pgtable.h >> @@ -16,19 +16,27 @@ >> #else >> >> #define ADDRESS_SPACE_END (UL(-1)) >> -/* >> - * Leave 2GB for kernel and BPF at the end of the address space >> - */ >> + >> +#ifdef CONFIG_64BIT >> +/* Leave 2GB for kernel and BPF at the end of the address space */ >> #define KERNEL_LINK_ADDR (ADDRESS_SPACE_END - SZ_2G + 1) >> +#else >> +#define KERNEL_LINK_ADDR PAGE_OFFSET >> +#endif >> >> #define VMALLOC_SIZE (KERN_VIRT_SIZE >> 1) >> #define VMALLOC_END (PAGE_OFFSET - 1) >> #define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE) >> >> -/* KASLR should leave at least 128MB for BPF after the kernel */ >> #define BPF_JIT_REGION_SIZE (SZ_128M) >> +#ifdef CONFIG_64BIT >> +/* KASLR should leave at least 128MB for BPF after the kernel */ >> #define BPF_JIT_REGION_START PFN_ALIGN((unsigned long)&_end) >> #define BPF_JIT_REGION_END (BPF_JIT_REGION_START + BPF_JIT_REGION_SIZE) >> +#else >> +#define BPF_JIT_REGION_START (PAGE_OFFSET - BPF_JIT_REGION_SIZE) >> +#define BPF_JIT_REGION_END (VMALLOC_END) >> +#endif >> >> /* Modules always live before the kernel */ >> #ifdef CONFIG_64BIT >> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c >> index 093f3a96ecfc..dc9b988e0778 100644 >> --- a/arch/riscv/mm/init.c >> +++ b/arch/riscv/mm/init.c >> @@ -91,8 +91,10 @@ static void print_vm_layout(void) >> (unsigned long)VMALLOC_END); >> print_mlm("lowmem", (unsigned long)PAGE_OFFSET, >> (unsigned long)high_memory); >> +#ifdef CONFIG_64BIT >> print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR, >> (unsigned long)ADDRESS_SPACE_END); >> +#endif >> } >> #else >> static void print_vm_layout(void) { } >> @@ -165,9 +167,11 @@ static struct pt_alloc_ops pt_ops; >> /* Offset between linear mapping virtual address and kernel load address */ >> unsigned long va_pa_offset; >> EXPORT_SYMBOL(va_pa_offset); >> +#ifdef CONFIG_64BIT >> /* Offset between kernel mapping virtual address and kernel load address */ >> unsigned long va_kernel_pa_offset; >> EXPORT_SYMBOL(va_kernel_pa_offset); >> +#endif >> unsigned long pfn_base; >> EXPORT_SYMBOL(pfn_base); >> >> @@ -410,7 +414,9 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) >> load_sz = (uintptr_t)(&_end) - load_pa; >> >> va_pa_offset = PAGE_OFFSET - load_pa; >> +#ifdef CONFIG_64BIT >> va_kernel_pa_offset = kernel_virt_addr - load_pa; >> +#endif >> >> pfn_base = PFN_DOWN(load_pa); >> >> @@ -469,12 +475,16 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) >> pa + PMD_SIZE, PMD_SIZE, PAGE_KERNEL); >> dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PMD_SIZE - 1)); >> #else /* CONFIG_BUILTIN_DTB */ >> +#ifdef CONFIG_64BIT >> /* >> * __va can't be used since it would return a linear mapping address >> * whereas dtb_early_va will be used before setup_vm_final installs >> * the linear mapping. >> */ >> dtb_early_va = kernel_mapping_pa_to_va(dtb_pa); >> +#else >> + dtb_early_va = __va(dtb_pa); >> +#endif /* CONFIG_64BIT */ >> #endif /* CONFIG_BUILTIN_DTB */ >> #else >> #ifndef CONFIG_BUILTIN_DTB >> @@ -486,7 +496,11 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) >> pa + PGDIR_SIZE, PGDIR_SIZE, PAGE_KERNEL); >> dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PGDIR_SIZE - 1)); >> #else /* CONFIG_BUILTIN_DTB */ >> +#ifdef CONFIG_64BIT >> dtb_early_va = kernel_mapping_pa_to_va(dtb_pa); >> +#else >> + dtb_early_va = __va(dtb_pa); >> +#endif /* CONFIG_64BIT */ >> #endif /* CONFIG_BUILTIN_DTB */ >> #endif >> dtb_early_pa = dtb_pa; >> @@ -571,12 +585,21 @@ static void __init setup_vm_final(void) >> for (pa = start; pa < end; pa += map_size) { >> va = (uintptr_t)__va(pa); >> create_pgd_mapping(swapper_pg_dir, va, pa, >> - map_size, PAGE_KERNEL); >> + map_size, >> +#ifdef CONFIG_64BIT >> + PAGE_KERNEL >> +#else >> + PAGE_KERNEL_EXEC >> +#endif >> + ); >> + >> } >> } >> >> +#ifdef CONFIG_64BIT >> /* Map the kernel */ >> create_kernel_page_table(swapper_pg_dir, PMD_SIZE); >> +#endif >> >> /* Clear fixmap PTE and PMD mappings */ >> clear_fixmap(FIX_PTE); >> -- >> 2.20.1 >>