From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751449AbeAWKo0 (ORCPT ); Tue, 23 Jan 2018 05:44:26 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:4677 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751255AbeAWKoY (ORCPT ); Tue, 23 Jan 2018 05:44:24 -0500 Subject: Re: [PATCH v3 11/20] arm64: mm: Map entry trampoline into trampoline and kernel page tables To: Will Deacon References: <1512563739-25239-1-git-send-email-will.deacon@arm.com> <1512563739-25239-12-git-send-email-will.deacon@arm.com> <20180123100447.GB1686@arm.com> CC: , , , , , , , , , , From: Yisheng Xie Message-ID: <09b4f791-241d-61f5-a6b5-889021a83fe4@huawei.com> Date: Tue, 23 Jan 2018 18:43:49 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <20180123100447.GB1686@arm.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.29.40] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Will, On 2018/1/23 18:04, Will Deacon wrote: > On Tue, Jan 23, 2018 at 04:28:45PM +0800, Yisheng Xie wrote: >> On 2017/12/6 20:35, Will Deacon wrote: >>> +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 >>> +static int __init map_entry_trampoline(void) >>> +{ >>> + extern char __entry_tramp_text_start[]; >>> + >>> + pgprot_t prot = rodata_enabled ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC; >>> + phys_addr_t pa_start = __pa_symbol(__entry_tramp_text_start); >>> + >>> + /* The trampoline is always mapped and can therefore be global */ >>> + pgprot_val(prot) &= ~PTE_NG; >>> + >>> + /* Map only the text into the trampoline page table */ >>> + memset(tramp_pg_dir, 0, PGD_SIZE); >>> + __create_pgd_mapping(tramp_pg_dir, pa_start, TRAMP_VALIAS, PAGE_SIZE, >>> + prot, pgd_pgtable_alloc, 0); >> >> How the tramp_pg_dir is used, should it be set to ttbr1 when exit kernel? Sorry >> for I do not find where it is used. > > Yes, that's what happens when we return to userspace. The code is a little > convoluted, but the tramp_pg_dir is placed at a fixed offset from swapper > (see the linker script) so the sub instruction in tramp_unmap_kernel is what > gives us the ttbr1 value we need. oh, I missed that. Maybe a comment inline is better to understand. Thanks once more for your help and explain :) Thanks Yisheng > > Will > > . > From mboxrd@z Thu Jan 1 00:00:00 1970 From: xieyisheng1@huawei.com (Yisheng Xie) Date: Tue, 23 Jan 2018 18:43:49 +0800 Subject: [PATCH v3 11/20] arm64: mm: Map entry trampoline into trampoline and kernel page tables In-Reply-To: <20180123100447.GB1686@arm.com> References: <1512563739-25239-1-git-send-email-will.deacon@arm.com> <1512563739-25239-12-git-send-email-will.deacon@arm.com> <20180123100447.GB1686@arm.com> Message-ID: <09b4f791-241d-61f5-a6b5-889021a83fe4@huawei.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Will, On 2018/1/23 18:04, Will Deacon wrote: > On Tue, Jan 23, 2018 at 04:28:45PM +0800, Yisheng Xie wrote: >> On 2017/12/6 20:35, Will Deacon wrote: >>> +#ifdef CONFIG_UNMAP_KERNEL_AT_EL0 >>> +static int __init map_entry_trampoline(void) >>> +{ >>> + extern char __entry_tramp_text_start[]; >>> + >>> + pgprot_t prot = rodata_enabled ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC; >>> + phys_addr_t pa_start = __pa_symbol(__entry_tramp_text_start); >>> + >>> + /* The trampoline is always mapped and can therefore be global */ >>> + pgprot_val(prot) &= ~PTE_NG; >>> + >>> + /* Map only the text into the trampoline page table */ >>> + memset(tramp_pg_dir, 0, PGD_SIZE); >>> + __create_pgd_mapping(tramp_pg_dir, pa_start, TRAMP_VALIAS, PAGE_SIZE, >>> + prot, pgd_pgtable_alloc, 0); >> >> How the tramp_pg_dir is used, should it be set to ttbr1 when exit kernel? Sorry >> for I do not find where it is used. > > Yes, that's what happens when we return to userspace. The code is a little > convoluted, but the tramp_pg_dir is placed at a fixed offset from swapper > (see the linker script) so the sub instruction in tramp_unmap_kernel is what > gives us the ttbr1 value we need. oh, I missed that. Maybe a comment inline is better to understand. Thanks once more for your help and explain :) Thanks Yisheng > > Will > > . >