From patchwork Tue Mar 24 07:30:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454589 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 683BA14B4 for ; Tue, 24 Mar 2020 07:31:04 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4813120735 for ; Tue, 24 Mar 2020 07:31: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="cPdlICkI"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="dEevPmr8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4813120735 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rI7k74kFCx75JJFZ6P5OAIxYXRc1E3R4Ch5Nvkd/PLg=; b=cPdlICkIrx8j/p 7UKKzAmwPk/PNbq41r8iDQ5uq3Dy6oSCxVahwJjIDuatLMF0zPkrxcmhx9vauTt2W0eqZaRC5DTy3 xjbN9CwgTODnD0zyVjLFDKcF/mkIB9eQJ4oR3MJtc6OkoanCg8EX6ngl+8j7PkL65DimNFWBU9vF7 ln7ZdzBSM+WUh7juI+KV6lO9nKr8gYKr5Zi0Em3rw8a0OZ1H6rwa77SS+0L418HtR3MzuCyraltpP Imna4+7rAcdo98WaVPO1o6tXEH9WkmVJYqzRHE4srSbTsNKySnOQP+kR8zuw1YOxQS8mrQEFEkWse tYR+ijGjQ1UrgftpJT7w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1d-0003ni-V0; Tue, 24 Mar 2020 07:31:01 +0000 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1b-0003lL-Lx for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:00 +0000 Received: by mail-pl1-x642.google.com with SMTP id v23so3012093ply.10 for ; Tue, 24 Mar 2020 00:30:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rI7k74kFCx75JJFZ6P5OAIxYXRc1E3R4Ch5Nvkd/PLg=; b=dEevPmr87gMs/zwZYhDr7kBAchZIIxA4j5XE/SWfIF4tf1bkYVtCjmF3HsMceLOm/f yMUMX1CJJOm8dr2xxEoJWUbfGXvxESvk3D0nxnwpGXEjuBCmUsgS16u0WGb8owp6HQw4 IEug9xf/t27S0CWLebeXEEqDTvoaWjbkL720nZutV1M8l8cdL588L5zelE+ZOKxiTCS+ vbMGHNscXpKxbnk87V5VOYQz2ImoBQUmms6OABHlwE0fY7e3BGB4yTliJXWw0s0KJMwR 34bOJFpvs9St2+5ZOCOEN7S9LcoDAIhATu3a1S1NGHc8lMXQbEUh2u2WKje+RTRJjySE 088Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rI7k74kFCx75JJFZ6P5OAIxYXRc1E3R4Ch5Nvkd/PLg=; b=pS3R2KYroXt0B33wqcBoupwFCOAXEhtfsrCeN9+sYR+tQdqVQz2DOqCLX/KiwuWs12 9WbpGsv54wmQd272ZljyZb48zoRd2pqP5mP4O+YpHsq9+DG6VGREjq7KjG4o8Ax8yESP 2+q9IWP9xSNgPURXxZfwA3iNw6P98cbWAZF09mGPyabM4GTbaOUZNbUbvvn7G67OXfhw v3Jm3J6lbKEDMUwvdrKW4tyIu456QJLddRHNnMDgUmKAZhncxI6C3XlAdWZ/3RrsIpJP ajGmQRxeI/cn6HQFvyUXmqG4VcrqT99G7ykmJJdCnHN25jCG37K23rhZxyG5b4XqRyWc 99jA== X-Gm-Message-State: ANhLgQ2PJDwzhk/8WZ3vwLa3W8J5pXmaU08MRp7DP6wR4qFyCaSrfwEb lJFeQeaJtAzz7vN8tbS22buToA== X-Google-Smtp-Source: ADFU+vslTkhtG9uiit3rXTJkBTjyUlQnzV2opL3cYdGTfGD2f0Xo7eaCNuOpvpfefHtqiXeUtLDX/Q== X-Received: by 2002:a17:90a:3606:: with SMTP id s6mr3821002pjb.195.1585035058819; Tue, 24 Mar 2020 00:30:58 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:30:58 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 1/8] riscv/kaslr: add interface to get kaslr offset Date: Tue, 24 Mar 2020 15:30:46 +0800 Message-Id: X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003059_714086_E905E8E1 X-CRM114-Status: UNSURE ( 6.49 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:642 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org Add interface to get the random offset. Signed-off-by: Zong Li Reviewed-by: Alexandre Ghiti --- arch/riscv/include/asm/page.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h index 92848e172a40..e2c2020f0a8d 100644 --- a/arch/riscv/include/asm/page.h +++ b/arch/riscv/include/asm/page.h @@ -101,6 +101,11 @@ extern unsigned long kernel_virt_addr; extern unsigned long max_low_pfn; extern unsigned long min_low_pfn; +static inline unsigned long get_kaslr_offset(void) +{ + return kernel_virt_addr - PAGE_OFFSET; +} + #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) From patchwork Tue Mar 24 07:30:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454591 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 639F414B4 for ; Tue, 24 Mar 2020 07:31:09 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 42DEB20735 for ; Tue, 24 Mar 2020 07:31:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Jucdof2C"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="AG+9uC/8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 42DEB20735 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=klBEcTaZTM89My6NFvl8X/nEuMTFhvIx/ugZCt3MXO4=; b=Jucdof2CvVDA16 Ev2/bFyYQy3LdeKGdTDHXeZ8F+bI2g2hoL4BLou4AYMCHGUB80sglpfgLIrXi3dg6DxDX1uiSBBp5 GAYwVhFxX98jBGkmosK8X+SpaYQSBROy2blJfTgMA7W8+a/plPtcoDi2RJ0jspAhv8LBCKAmp+whj 8zrTnhq3BCzOFzbNlydzOcTYe0LTJxowzpOmIPsSawWoanbdv2WvvYvD3mko6MEAumc1WeMY+DHD2 HGxwJL1jTIu1W1BZTj8TaieHMZHxDwEUOoHzSyVFUlWpnUWGu32cCVEIhVPPV8g81KJNvJcvRcoxn RaiUk6ucE+K4FCV/wX6A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1h-0003sK-KK; Tue, 24 Mar 2020 07:31:05 +0000 Received: from mail-pj1-x1042.google.com ([2607:f8b0:4864:20::1042]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1d-0003mi-DN for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:03 +0000 Received: by mail-pj1-x1042.google.com with SMTP id nu11so1056259pjb.1 for ; Tue, 24 Mar 2020 00:31:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=klBEcTaZTM89My6NFvl8X/nEuMTFhvIx/ugZCt3MXO4=; b=AG+9uC/8nRSOJB+P5ypaf3gqmhSCEHjRpdinGoG0ihkvqs00uicArdKU/RauncEVNS /jr4FM3waJ7m3kgA0/YlE9Y/s2AXXDgjbcVvws87Q+asnKzmm0lO8BVXx4qHBuS+Zdac utC7Is/6yjR+1eC5kX1thCIKZAwGmuq+3OJT6bOgObDpguY3PMR3hGE+qaVesFwDMmx6 3g/jgTiZ2VJSx0ct7YhuzgCBmxpGWsUXxl+v5d4+UMOczw0qWBkSS6RxXqATJlLs63bp TnETxvwb0viDn668uejcqivlG5/kLXFfhOtcIHeJvDtfYmKios0w0AS4V3YtK6DnRdye zAcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=klBEcTaZTM89My6NFvl8X/nEuMTFhvIx/ugZCt3MXO4=; b=ZA+mpvboBWFtk64SmkFEbJVcHUi0Wv5uVB10ox+pCge/cjSIuJfbnmzIBwuyomXgBy SnraB7wIxCE0RHD6zNNVO0JA8RGWxWOFzPQekmjCgzY9eFAHzkRKEK60prCeXnZvSCDL +NDJqGgmZ///jpZi3OpmUsYQltFS+/ZE6sVX4QKqET8aJT+42eYX2j/+CYnwUDahzsvQ bxDP0RqhIsrhTHGTM9jAbW5Ccjps+iMPRCF22g3CkHfnXK7j3KblBGyH76EM0CEoS6l7 9prU0ZDMXlP/S5jOZ5PeUAwrRiYhng7Yl//Pf3XGchl3k1gski2+BrNJdYBm8Ez0ASQ1 3Kfg== X-Gm-Message-State: ANhLgQ0EeV7FmI3rFio12zKTCFtblAN5Oon3tVtN+Ai+YtVAQoRUxQ9J OydDJ/Ba+2MfOb6z4vU+vJuwIg== X-Google-Smtp-Source: ADFU+vurevye9kGuwfX5gxdkntd88xuvY3Fgsvd35C31e8AXMXuwYNW3TYUL5f30GFG46lLBGeJy6Q== X-Received: by 2002:a17:90a:628a:: with SMTP id d10mr3826207pjj.25.1585035060570; Tue, 24 Mar 2020 00:31:00 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.30.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:00 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 2/8] riscv/kaslr: introduce functions to clear page table Date: Tue, 24 Mar 2020 15:30:47 +0800 Message-Id: <286a940ef8fbc4480c63679271eea440d167a258.1584352425.git.zong.li@sifive.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003101_466943_25C58E63 X-CRM114-Status: GOOD ( 10.04 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:1042 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org In KASLR, we need to re-create page table after getting a random destination. Introduce clear function to clear old content. Also, the page table entries allow writing value when it's empty, so we have to clear the early page table. This patch is a preparation to support KASLR. Signed-off-by: Zong Li --- arch/riscv/mm/init.c | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index ace5d74fd939..51e263c04fa2 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -315,6 +315,7 @@ static void __init create_pmd_mapping(pmd_t *pmdp, #define get_pgd_next_virt(__pa) get_pmd_virt(__pa) #define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot) \ create_pmd_mapping(__nextp, __va, __pa, __sz, __prot) +#define clear_pgd_next_mapping(__nextp) clear_pmd(__nextp) #define fixmap_pgd_next fixmap_pmd #else #define pgd_next_t pte_t @@ -322,6 +323,7 @@ static void __init create_pmd_mapping(pmd_t *pmdp, #define get_pgd_next_virt(__pa) get_pte_virt(__pa) #define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot) \ create_pte_mapping(__nextp, __va, __pa, __sz, __prot) +#define clear_pgd_next_mapping(__nextp) clear_pte(__nextp) #define fixmap_pgd_next fixmap_pte #endif @@ -361,6 +363,58 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size) return PMD_SIZE; } +#ifdef CONFIG_RANDOMIZE_BASE +static void __init clear_pte(pte_t *ptep) +{ + unsigned int i; + + for (i = 0; i < PTRS_PER_PTE; i++) + if (!pte_none(ptep[i])) + ptep[i] = __pte(0); +} + +static void __init clear_pmd(pmd_t *pmdp) +{ + unsigned int i; + pte_t *ptep; + phys_addr_t pte_phys; + uintptr_t kaslr_offset = get_kaslr_offset(); + + for (i = 0; i < PTRS_PER_PMD; i++) + if (!pmd_none(pmdp[i])) { + if (pmd_leaf(pmdp[i])) { + pmd_clear(&pmdp[i]); + } else { + pte_phys = PFN_PHYS(_pmd_pfn(pmdp[i])); + ptep = get_pte_virt(pte_phys + kaslr_offset); + clear_pte(ptep); + pmd_clear(&pmdp[i]); + } + } +} + +static void __init clear_pgd(pgd_t *pgdp) +{ + unsigned int i; + pgd_next_t *nextp; + phys_addr_t next_phys; + uintptr_t kaslr_offset = get_kaslr_offset(); + + for (i = 0; i < PTRS_PER_PGD; i++) + if (pgd_val(pgdp[i]) != 0) { + if (pgd_leaf(pgd_val(pgdp[i]))) { + set_pgd(&pgdp[i], __pgd(0)); + } else { + next_phys = PFN_PHYS(_pgd_pfn(pgdp[i])); + nextp = get_pgd_next_virt(next_phys + + kaslr_offset); + clear_pgd_next_mapping(nextp); + set_pgd(&pgdp[i], __pgd(0)); + } + } +} +#endif + /* * setup_vm() is called from head.S with MMU-off. * From patchwork Tue Mar 24 07:30:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454593 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0C99A15AB for ; Tue, 24 Mar 2020 07:31:12 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D7B6D2076A for ; Tue, 24 Mar 2020 07:31:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="SjNOZT43"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="fT0T3waW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D7B6D2076A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=aV00Aos6NfFPctBoXUWMRl1LHyRDZzOvQI99IlvbQVI=; b=SjNOZT43hqMbCE 27JRYpovK+q40JkAZWzv+zlun7JvTUxqqPSktHerg9HgRVgVePiPMP8nMQ1nPk/mpXfGd1mBgCt4w b2gtNCewDXZWzOVGQqdNLXPElO8IkZMkVC5Jg9P9vcN2rguG1xcH8ooDTf20EcqC9UH6/PvM3qRUt NDuDiWJyDnUcGOaI/plCGhevGyAn9t0mf65a26DDmounHwbNReafneS3lIWSpzHHHEKnBJIVyiuy+ ++LXPkR6/cnWAPDHR712FylHZ+/CNSTCp/lvE3Eg9jLupuXezEqFFxvBJiXkOOiBAoVAqu7vivaoY FqvJJ3w6P5whEUzdZyEA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1j-0003uj-Uy; Tue, 24 Mar 2020 07:31:07 +0000 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1f-0003pc-Hb for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:05 +0000 Received: by mail-pf1-x443.google.com with SMTP id q3so4330209pff.13 for ; Tue, 24 Mar 2020 00:31:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aV00Aos6NfFPctBoXUWMRl1LHyRDZzOvQI99IlvbQVI=; b=fT0T3waWDmTJaCyblxvZqXAiyut9XsipmAA9zYYrRhahCx5Tuj7GnkLHgxS5uR+fcu oFtlRCXaTdfOYYdIOsufgKmLG9r0qEAGqwhSs70Ij/pbo4pk2FVOeBYxAKWQJAlt/OEH kKlEJ3dJJ0lJ3IdwIFj+ghtQoWNCbJm4dAFTEBDBMDnMoRgSFSamKtd2tFiwKFN2+HvJ XDxj+FGSVa4m8BbYzFaYAdnOHSRZHWQkJxQwRCXOfJNctC88YUwxaZFE05SkiH9EEFTc KT0go2um9CW3u8IgwqSTaaSj/7gjCT8PvwK6xkoA0J/W4V2jZJb6p3s7BIzy507NBH0t H4WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aV00Aos6NfFPctBoXUWMRl1LHyRDZzOvQI99IlvbQVI=; b=lIlOvj8X/MJd1Ic3q6NM67SYay2iSu38hEvqzbrwCBI5IKKqkYZ++mxhuCRJB+YYO2 gR8UfhAdq9kbhgTHk3VRbr3APl7gxMwduig0X9OygsnVfR12vihxNG7vumxnQ3yk0r/2 wtB6rvFxoJHo2DqF/H720K/OuWiGjOMz6SKGBDC7WDE8Mmw7Kva+Kp3CKWY4WIuHgOfJ aZex7cb+WyVHr21dNK4Qbpuvps4ceU4Y7vQfozpOYHTTCP628cehTzK8DqerxqKnEUZx lplsK2e23Fhs3c0rKhNksntIhJMCH/6XXzAOgBTfjFOg+FZKOiRQl2xnq5Qn8Xr+Aume 4QGA== X-Gm-Message-State: ANhLgQ1/J0Wdnkm8/Waxm/0oc4ITSOfSwuZYkI1CQwxOwanVk3tPewp2 i59bjDVPAQLVQVZMgjUpHnwOkQ== X-Google-Smtp-Source: ADFU+vub8hYsaP14B7TYJsABqmijrSWr1OBNZOXedSsNTIs8xznh1U4qgPc6eT95n5xiW0Nnyg9KdQ== X-Received: by 2002:a63:312:: with SMTP id 18mr25374634pgd.377.1585035062381; Tue, 24 Mar 2020 00:31:02 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:01 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 3/8] riscv/kaslr: support KASLR infrastructure Date: Tue, 24 Mar 2020 15:30:48 +0800 Message-Id: X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003103_591625_D0EA3777 X-CRM114-Status: GOOD ( 18.96 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:443 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org This patch support KASLR implementation. It copies kernel image to a proper and random place, and make all harts go to the new destination. After KASLR initialization, secondary harts go to the new destination to wait their stack pointer to be setup by main hart, main hart goes to re-create the early page table and doing relocation by going back to setup_vm again. We separate the randomization process from this patch, so the kernel offset was not randomized yet, it just hardcode a meanless number here. Signed-off-by: Zong Li --- arch/riscv/Kconfig | 15 +++++++++++ arch/riscv/kernel/Makefile | 2 ++ arch/riscv/kernel/head.S | 39 +++++++++++++++++++++++++++ arch/riscv/kernel/kaslr.c | 55 ++++++++++++++++++++++++++++++++++++++ arch/riscv/mm/init.c | 53 +++++++++++++++++++++++++++++++++++- 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/kernel/kaslr.c diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index aea03ac470c8..8f566b40ea1e 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -183,6 +183,21 @@ config RELOCATABLE relocation pass at runtime even if the kernel is loaded at the same address it was linked at. +config RANDOMIZE_BASE + bool "Randomize the address of the kernel image" + depends on MMU + select MODULE_SECTIONS if MODULES + select RELOCATABLE + help + Randomizes the virtual address at which the kernel image is + loaded, as a security feature that deters exploit attempts + relying on knowledge of the location of kernel internals. + + It is the job of previous stage to provide entropy, by passing a + random u64 value in /chosen/kaslr-seed at kernel entry. + + If unsure, say N. + source "arch/riscv/Kconfig.socs" menu "Platform type" diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index d189bd3d8501..8f62732b1135 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -45,4 +45,6 @@ obj-$(CONFIG_PERF_EVENTS) += perf_callchain.o obj-$(CONFIG_HAVE_PERF_REGS) += perf_regs.o obj-$(CONFIG_RISCV_SBI) += sbi.o +obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o + clean: diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S index cb4a6e2d3793..5191e528d813 100644 --- a/arch/riscv/kernel/head.S +++ b/arch/riscv/kernel/head.S @@ -113,9 +113,12 @@ clear_bss_done: la a2, boot_cpu_hartid REG_S a0, (a2) +.align 2 +early_page_table: /* Initialize page tables and relocate to virtual addresses */ la sp, init_thread_union + THREAD_SIZE mv a0, s1 + call setup_vm #ifdef CONFIG_MMU la a0, early_pg_dir @@ -127,6 +130,29 @@ clear_bss_done: sw zero, TASK_TI_CPU(tp) la sp, init_thread_union + THREAD_SIZE +#ifdef CONFIG_RANDOMIZE_BASE + /* KASRL initialization. Try to get a random kernel offset. */ + call kaslr_early_init + + /* If return value equals to zero, we don't need to randomize kernel */ + beqz a0, 1f + + la a1, early_page_table + add a1, a1, a0 + la a0, va_pa_offset + REG_L a0, 0(a0) + sub a1, a1, a0 + mv a0, s1 + + /* + * Go to new kernel image destination, and disable MMU to re-create + * early page table and do relocation. + */ + csrw CSR_TVEC, a1 + csrw CSR_SATP, x0 +1: +#endif + #ifdef CONFIG_KASAN call kasan_early_init #endif @@ -194,6 +220,19 @@ relocate: la a3, .Lsecondary_park csrw CSR_TVEC, a3 +#ifdef CONFIG_RANDOMIZE_BASE + /* + * Wait winning hart to tell secondary harts where is the new + * destination to go. + */ +.Lwait_for_next_target: + la a3, secondary_next_target + REG_L a3, 0(a3) + beqz a3, .Lwait_for_next_target + jr a3 +.global secondary_random_target +secondary_random_target: +#endif slli a3, a0, LGREG la a1, __cpu_up_stack_pointer la a2, __cpu_up_task_pointer diff --git a/arch/riscv/kernel/kaslr.c b/arch/riscv/kernel/kaslr.c new file mode 100644 index 000000000000..281b5fcca5c8 --- /dev/null +++ b/arch/riscv/kernel/kaslr.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2020 SiFive + * Copyright (C) 2020 Zong Li + */ + +#include +#include +#include +#include +#include + +extern char _start[], _end[]; +extern void secondary_random_target(void); +extern void kaslr_create_page_table(uintptr_t start, uintptr_t end); + +uintptr_t secondary_next_target __initdata; +static uintptr_t kaslr_offset __initdata; + +uintptr_t __init kaslr_early_init(void) +{ + uintptr_t dest_start, dest_end; + uintptr_t kernel_size = (uintptr_t) _end - (uintptr_t) _start; + + /* Get zero value at second time to avoid doing randomization again. */ + if (kaslr_offset) + return 0; + + /* Get the random number for kaslr offset. */ + kaslr_offset = 0x10000000; + + /* Update kernel_virt_addr for get_kaslr_offset. */ + kernel_virt_addr += kaslr_offset; + + if (kaslr_offset) { + dest_start = (uintptr_t) (PAGE_OFFSET + kaslr_offset); + dest_end = dest_start + kernel_size; + + /* Create the new destination mapping for kernel image. */ + kaslr_create_page_table(dest_start, dest_end); + + /* Copy kernel image from orignial location. */ + memcpy((void *)dest_start, (void *)_start, kernel_size); + flush_icache_range(dest_start, dest_end); + + /* Make secondary harts jump to new kernel image destination. */ + WRITE_ONCE(secondary_next_target, + __pa_symbol(secondary_random_target) + kaslr_offset); + } else { + WRITE_ONCE(secondary_next_target, + __pa_symbol(secondary_random_target)); + } + + return kaslr_offset; +} diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 51e263c04fa2..2f5b25f02b6c 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -413,6 +413,41 @@ static void __init clear_pgd(pgd_t *pgdp) } } } + +static void __init clear_page_tables(void) +{ + clear_pgd(early_pg_dir); + clear_pgd(trampoline_pg_dir); +} + +void __init kaslr_create_page_table(uintptr_t start, uintptr_t end) +{ + pgd_next_t *nextp; + phys_addr_t next_phys; + uintptr_t pgd_index, va; + phys_addr_t pa = __pa(PAGE_OFFSET) + get_kaslr_offset(); + uintptr_t map_size = + best_map_size(__pa(PAGE_OFFSET), MAX_EARLY_MAPPING_SIZE); + + /* Expolit early_pg_dir and early_pmd during using early page table. */ + for (va = start; va < end; va += map_size, pa += map_size) { + pgd_index = pgd_index(va); + + if (pgd_val(early_pg_dir[pgd_index]) == 0) { + next_phys = alloc_pgd_next(va); + early_pg_dir[pgd_index] = + pfn_pgd(PFN_DOWN(next_phys), PAGE_TABLE); + nextp = (pgd_next_t *)(__va(next_phys)); + memset(nextp, 0, PAGE_SIZE); + } else { + next_phys = PFN_PHYS(_pgd_pfn(early_pg_dir[pgd_index])); + nextp = (pgd_next_t *)(__va(next_phys)); + } + + create_pgd_next_mapping(nextp, va, pa, map_size, + PAGE_KERNEL_EXEC); + } +} #endif /* @@ -489,7 +524,13 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) uintptr_t map_size = best_map_size(load_pa, MAX_EARLY_MAPPING_SIZE); va_pa_offset = kernel_virt_addr - load_pa; - pfn_base = PFN_DOWN(load_pa); + + /* + * Update pfn_base only if pfn_base is empty. It's avoid to mess up it + * when re-enter this function by KASLR. + */ + if (!pfn_base) + pfn_base = PFN_DOWN(load_pa); #ifdef CONFIG_RELOCATABLE /* @@ -513,6 +554,16 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) BUG_ON((load_pa % map_size) != 0); BUG_ON(load_sz > MAX_EARLY_MAPPING_SIZE); +#ifdef CONFIG_RANDOMIZE_BASE + /* + * Enter setup_vm twice if there is a legal random destination in KASLR, + * Reach here at second time, Clear page table because PTE entris allow + * writing when it's empty. + */ + if (get_kaslr_offset()) + clear_page_tables(); +#endif + /* Setup early PGD for fixmap */ create_pgd_mapping(early_pg_dir, FIXADDR_START, (uintptr_t)fixmap_pgd_next, PGDIR_SIZE, PAGE_TABLE); From patchwork Tue Mar 24 07:30:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454595 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E1BB315AB for ; Tue, 24 Mar 2020 07:31:14 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B7F252076A for ; Tue, 24 Mar 2020 07:31:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="JbhF5r/d"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="AYn8T3ub" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B7F252076A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=oi42rC0je4n7md93kV9gmahD8VmOS3UfUyw23vs8Ns0=; b=JbhF5r/dPylbpP BwjKZb4rs2RElhgACZtg6KIpOjr8PrTnGPZ4OjndQQfA/kR4evAiXFQYWHmmW/eFEVY8YyXDLo0+r 8m7/qGpIWobL7gRO/DW86wSAclDeix48nFvLkKXZlYgiJPdfv8dPi1QbacqVmo15yEFquieOVPlYA 8STvhKoIyO2dAOkQVnqFF7+Io0q6r+lo2I+ATV4EEkoK9ikgl5RJElKNjkbnBJYxGEAqM3rOK4+hp YiD3e6O0BSrkQrxDje5jYPdzNwcmvJ6X2snS8wFnFF5jtl7au9khoaR17+GTYu8T8BCJRpkdHdcnt c5y2WdfKsXJUkA2B8GQQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1n-0003zZ-AI; Tue, 24 Mar 2020 07:31:11 +0000 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1g-0003rb-Qy for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:06 +0000 Received: by mail-pf1-x443.google.com with SMTP id i13so8882807pfe.3 for ; Tue, 24 Mar 2020 00:31:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oi42rC0je4n7md93kV9gmahD8VmOS3UfUyw23vs8Ns0=; b=AYn8T3ubd38OtJin3i3xmXBPcIi5ciekq98iIIYBpzHf5BnWO0Yn2D5yGf4wlJ33CB trXDJJACeFxaM7JRb2AUUmWkpZxS9oXYNYULjO1JekRvBuLxx+dPuGUoivxQeaREMd+D PYID/o///O47RXAAOkQ64oowLC9P5DkrE3l0WKdUUBVhKDpg8AGFv1C4jSdELI9n9hNw H2CbQtoeg6+OVgCwkS8aX09xy37pD4RYAhiaSo9+LjOVy60/KpEPejf9ZV/E5NyO3Hib I0QdH9ms+62I2vsBPq2vFtyvq/IEds7hyW5siVb8ItEWHYIKoTgkFcEdxTYAdJwzhFCb MkeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oi42rC0je4n7md93kV9gmahD8VmOS3UfUyw23vs8Ns0=; b=EK+tmqjH9JHnvtdHx15WTdVee1SMz0ucoIHZ5XxeixXltvVBzjuJBTuEuzbkoPMLkd 8fvpPKgY8qD2RWLevukad7H4mJeUJFwRdIcPrhXSO7OdpTv1/z2G7BNr/3kxWYx11knj v/pBUNuu6ssiVhctK7N8ReDd7/IxYjcO/naAAVKlFT6gUBSz6yEe3DiNwtW9aa1sg5q7 p2udbiWYmcXnmlfjv0HeNRfjgxzrbWJVr9J9jN7U5fxqA08JhQmVxXyb+0osKfmrJltU 0/Zt6d9grbXle71kHaJkGNosCzlTQ8Alom+EfB6Qd7ner8RS3aUh8wHWKHR521bRfuhL an4A== X-Gm-Message-State: ANhLgQ3HzCiVaosvJTaopRWT4HJBxiFr4/On6GjXoSXbzhP4jLI3OCKC YurwXHwcVcw+YFJcv5KUQIVxZw== X-Google-Smtp-Source: ADFU+vtDYbTt1sYmg/+1XWaDJl1dmryu65Dikphg9FI886DYT1GoTtbDvFi9lQIoqP+nxIl9GVMbiA== X-Received: by 2002:a63:cd12:: with SMTP id i18mr24626903pgg.98.1585035064219; Tue, 24 Mar 2020 00:31:04 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:03 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 4/8] riscv/kaslr: randomize the kernel image offset Date: Tue, 24 Mar 2020 15:30:49 +0800 Message-Id: <16924c3f07b142688a3c0562d229cd67dc7bf8e6.1584352425.git.zong.li@sifive.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003104_874056_97B9B991 X-CRM114-Status: GOOD ( 17.94 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:443 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org Entropy is derived from the banner and timer, it is better than nothing but not enough secure, so previous stage may pass entropy via the device tree /chosen/kaslr-seed node. We limit randomization range within 1GB, so we can exploit early page table to map new destination of kernel image. Additionally, the kernel offset need 2M alignment to ensure it's good in PMD page table. We also checks the kernel offset whether it's safe by avoiding to overlaps with dtb, initrd and reserved memory regions. Signed-off-by: Zong Li --- arch/riscv/kernel/kaslr.c | 274 +++++++++++++++++++++++++++++++++++++- arch/riscv/mm/init.c | 2 +- 2 files changed, 273 insertions(+), 3 deletions(-) diff --git a/arch/riscv/kernel/kaslr.c b/arch/riscv/kernel/kaslr.c index 281b5fcca5c8..9ec2b608eb7f 100644 --- a/arch/riscv/kernel/kaslr.c +++ b/arch/riscv/kernel/kaslr.c @@ -11,23 +11,293 @@ #include extern char _start[], _end[]; +extern void *dtb_early_va; +extern phys_addr_t dtb_early_pa; extern void secondary_random_target(void); extern void kaslr_create_page_table(uintptr_t start, uintptr_t end); uintptr_t secondary_next_target __initdata; static uintptr_t kaslr_offset __initdata; +static const __init u32 *get_reg_address(int root_cells, + const u32 *value, u64 *result) +{ + int cell; + *result = 0; + + for (cell = root_cells; cell > 0; --cell) + *result = (*result << 32) + fdt32_to_cpu(*value++); + + return value; +} + +static __init int get_node_addr_size_cells(const char *path, int *addr_cell, + int *size_cell) +{ + int node = fdt_path_offset(dtb_early_va, path); + fdt64_t *prop; + + if (node < 0) + return -EINVAL; + + prop = fdt_getprop_w(dtb_early_va, node, "#address-cells", NULL); + if (!prop) + return -EINVAL; + *addr_cell = fdt32_to_cpu(*prop); + + prop = fdt_getprop_w(dtb_early_va, node, "#size-cells", NULL); + if (!prop) + return -EINVAL; + *size_cell = fdt32_to_cpu(*prop); + + return node; +} + +static __init void kaslr_get_mem_info(uintptr_t *mem_start, + uintptr_t *mem_size) +{ + int node, root, addr_cells, size_cells; + u64 base, size; + + /* Get root node's address cells and size cells. */ + root = get_node_addr_size_cells("/", &addr_cells, &size_cells); + if (root < 0) + return; + + /* Get memory base address and size. */ + fdt_for_each_subnode(node, dtb_early_va, root) { + const char *dev_type; + const u32 *reg; + + dev_type = fdt_getprop(dtb_early_va, node, "device_type", NULL); + if (!dev_type) + continue; + + if (!strcmp(dev_type, "memory")) { + reg = fdt_getprop(dtb_early_va, node, "reg", NULL); + if (!reg) + return; + + reg = get_reg_address(addr_cells, reg, &base); + reg = get_reg_address(size_cells, reg, &size); + + *mem_start = base; + *mem_size = size; + + break; + } + } +} + +/* Return a default seed if there is no HW generator. */ +static u64 kaslr_default_seed = ULL(-1); +static __init u64 kaslr_get_seed(void) +{ + int node, len; + fdt64_t *prop; + u64 ret; + + node = fdt_path_offset(dtb_early_va, "/chosen"); + if (node < 0) + return kaslr_default_seed++; + + prop = fdt_getprop_w(dtb_early_va, node, "kaslr-seed", &len); + if (!prop || len != sizeof(u64)) + return kaslr_default_seed++; + + ret = fdt64_to_cpu(*prop); + + /* Re-write to zero for checking whether get seed at second time */ + *prop = 0; + + return ret; +} + +static __init bool is_overlap(uintptr_t s1, uintptr_t e1, uintptr_t s2, + uintptr_t e2) +{ + return e1 >= s2 && e2 >= s1; +} + +static __init bool is_overlap_reserved_mem(uintptr_t start_addr, + uintptr_t end_addr) +{ + int node, rsv_mem, addr_cells, size_cells; + + /* Get the reserved-memory node. */ + rsv_mem = get_node_addr_size_cells("/reserved-memory", + &addr_cells, + &size_cells); + if (rsv_mem < 0) + return false; + + /* Get memory base address and size. */ + fdt_for_each_subnode(node, dtb_early_va, rsv_mem) { + uint64_t base, size; + const uint32_t *reg; + + reg = fdt_getprop(dtb_early_va, node, "reg", NULL); + if (!reg) + return 0; + + reg = get_reg_address(addr_cells, reg, &base); + reg = get_reg_address(size_cells, reg, &size); + + if (is_overlap(start_addr, end_addr, base, base + size)) + return true; + } + + return false; +} + +static __init bool is_overlap_initrd(uintptr_t start_addr, uintptr_t end_addr) +{ + int node; + uintptr_t initrd_start, initrd_end; + fdt64_t *prop; + + node = fdt_path_offset(dtb_early_va, "/chosen"); + if (node < 0) + return false; + + prop = fdt_getprop_w(dtb_early_va, node, "linux,initrd-start", NULL); + if (!prop) + return false; + + initrd_start = fdt64_to_cpu(*prop); + + prop = fdt_getprop_w(dtb_early_va, node, "linux,initrd-end", NULL); + if (!prop) + return false; + + initrd_end = fdt64_to_cpu(*prop); + + return is_overlap(start_addr, end_addr, initrd_start, initrd_end); +} + +static __init bool is_overlap_dtb(uintptr_t start_addr, uintptr_t end_addr) +{ + uintptr_t dtb_start = dtb_early_pa; + uintptr_t dtb_end = dtb_start + fdt_totalsize(dtb_early_va); + + return is_overlap(start_addr, end_addr, dtb_start, dtb_end); +} + +static __init bool has_regions_overlapping(uintptr_t start_addr, + uintptr_t end_addr) +{ + if (is_overlap_dtb(start_addr, end_addr)) + return true; + + if (is_overlap_initrd(start_addr, end_addr)) + return true; + + if (is_overlap_reserved_mem(start_addr, end_addr)) + return true; + + return false; +} + +static inline __init unsigned long get_legal_offset(int random_index, + int max_index, + uintptr_t mem_start, + uintptr_t kernel_size) +{ + uintptr_t start_addr, end_addr; + int idx, stop_idx; + + idx = stop_idx = random_index; + + do { + start_addr = mem_start + idx * SZ_2M + kernel_size; + end_addr = start_addr + kernel_size; + + /* Check overlap to other regions. */ + if (!has_regions_overlapping(start_addr, end_addr)) + return idx * SZ_2M + kernel_size; + + if (idx-- < 0) + idx = max_index; + + } while (idx != stop_idx); + + return 0; +} + +static inline __init u64 rotate_xor(u64 hash, const void *area, size_t size) +{ + size_t i; + uintptr_t *ptr = (uintptr_t *) area; + + for (i = 0; i < size / sizeof(hash); i++) { + /* Rotate by odd number of bits and XOR. */ + hash = (hash << ((sizeof(hash) * 8) - 7)) | (hash >> 7); + hash ^= ptr[i]; + } + + return hash; +} + +#define MEM_RESERVE_START __pa(PAGE_OFFSET) +static __init uintptr_t get_random_offset(u64 seed, uintptr_t kernel_size) +{ + uintptr_t mem_start = 0, mem_size= 0, random_size; + uintptr_t kernel_size_align = round_up(kernel_size, SZ_2M); + int index; + u64 random = 0; + cycles_t time_base; + + /* Attempt to create a simple but unpredictable starting entropy */ + random = rotate_xor(random, linux_banner, strlen(linux_banner)); + + /* + * If there is no HW random number generator, use timer to get a random + * number. This is better than nothing but not enough secure. + */ + time_base = get_cycles() << 32; + time_base ^= get_cycles(); + random = rotate_xor(random, &time_base, sizeof(time_base)); + + if (seed) + random = rotate_xor(random, &seed, sizeof(seed)); + + kaslr_get_mem_info(&mem_start, &mem_size); + if (!mem_size) + return 0; + + if (mem_start < MEM_RESERVE_START) { + mem_size -= MEM_RESERVE_START - mem_start; + mem_start = MEM_RESERVE_START; + } + + /* + * Limit randomization range within 1G, so we can exploit + * early_pmd/early_pte during early page table phase. + */ + random_size = min_t(u64, + mem_size - (kernel_size_align * 2), + SZ_1G - (kernel_size_align * 2)); + + /* The index of 2M block in whole avaliable region */ + index = random % (random_size / SZ_2M); + + return get_legal_offset(index, random_size / SZ_2M, + mem_start, kernel_size_align); +} + uintptr_t __init kaslr_early_init(void) { + u64 seed; uintptr_t dest_start, dest_end; uintptr_t kernel_size = (uintptr_t) _end - (uintptr_t) _start; /* Get zero value at second time to avoid doing randomization again. */ - if (kaslr_offset) + seed = kaslr_get_seed(); + if (!seed) return 0; /* Get the random number for kaslr offset. */ - kaslr_offset = 0x10000000; + kaslr_offset = get_random_offset(seed, kernel_size); /* Update kernel_virt_addr for get_kaslr_offset. */ kernel_virt_addr += kaslr_offset; diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 2f5b25f02b6c..34c6ecf2c599 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -125,7 +125,7 @@ static void __init setup_initrd(void) } #endif /* CONFIG_BLK_DEV_INITRD */ -static phys_addr_t dtb_early_pa __initdata; +phys_addr_t dtb_early_pa __initdata; void __init setup_bootmem(void) { From patchwork Tue Mar 24 07:30:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454597 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4545314B4 for ; Tue, 24 Mar 2020 07:31:18 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 120322076A for ; Tue, 24 Mar 2020 07:31:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="MxcWE9Hg"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="FhK74WmX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 120322076A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=y4huE9PkydIicq5T4ToTqpbGJkd9wdfCuQCsFDoDdXI=; b=MxcWE9HgCUaEDB uqxIEIs2arTPS3Ip8ZkE+tDNyh5oKimaTL8ob2anCFh/3Qtbu2OewJAxfOb9vsqAmh7wQahG/bLgu XnBvTL3isamm4ibnkKY44cdEqDXGWWm/H8S5Z0qVpfWPc6ENyJFpD8VlE/AJMgxNZb1z10iDts4e+ vLMznq9hdkAajL1U3KqsIHVuXTmDjwp8y9TnM0PqLkhR+ciT4sV36ol+OrF5HIbQBtaeqRZJsiAcI 4rJhHwLi4v+DeiUyeZS+9ZunWZz3PNu5uYBltbXk6evUmTjd8yWf3WugcGkltZurfp+Nn9JEy6Yc3 V33Jzzn40mq0co2mkogA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1q-00044M-JX; Tue, 24 Mar 2020 07:31:14 +0000 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1i-0003te-UP for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:08 +0000 Received: by mail-pg1-x544.google.com with SMTP id t3so8614192pgn.1 for ; Tue, 24 Mar 2020 00:31:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=y4huE9PkydIicq5T4ToTqpbGJkd9wdfCuQCsFDoDdXI=; b=FhK74WmXI7hJqCemmQx1mgserzDO1KLlmRwF1MCmAA+Kk32Vbp7pUevd18ZsmLpvT1 eSTslws5Fr6Q1SiSTdS7Ctv1cgGPZe6IA5znoEUoyB4Nf/F5CTvnvkEi2laS26D10o/Q FNQy/TxTbKFJKnrWyKn3FCdrYiirhY1WWqPNDxrABFQ+WEfedXn8qf5VMWRif4m4CjaD GKi3ADkoOUNXDdGY2mswzgS7PsayHv/+FrQy5JgrNxok89w/44MR0I+BIhpAPbLOuv4Y j37eYW0F/wfWKcoNvhYvcNvz5C6sjcWZNKSufkqJJDJKqBhH7H9GtX2aSisITqoZPW5H WlMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=y4huE9PkydIicq5T4ToTqpbGJkd9wdfCuQCsFDoDdXI=; b=AukYavQnNlFhkSxH9fS5IF3Ddi7G1TmKikGoXx/Q8UBexGuPlWdhsBHd9WidQ6rJ0S REwlIhmTSPrZX6t6zR5DIRdgRfgN4wEQgoo93iLLeWQy80JovQa1wbV6N70wbmPYHdac BdT4EaEjvkcBL26MzXOBGea4AHMea3MnCc5OdiWYEDyokEorhD8C8txBNODUe7zOtjgk mLqU98wsIRXWd68UqCcXK7aY/wsNUT2FbvIq8dNaf7NLeGbt/mJ5eISzAuUOshFVPDdq WlsQVbrKWB/ArcHPI+lJnMKR53ufbxztQorPK3AMz+R/f3jWUHVrv+fbSzkwd1uHVkPt zarw== X-Gm-Message-State: ANhLgQ1kjHhZd7tbAA+SbFgiH6xNwUFoIoVmgy70AwT5NpFtOJKRfMn/ spTByvWRrkftIxusmNVsgdqaaw== X-Google-Smtp-Source: ADFU+vv5SjTRjPOReGo2Qbtrxk+zEIUWvNyjITDupdkD8rEgyr3X1n0khPpCY5ThEbL31ODjAG7mwg== X-Received: by 2002:a63:7b1a:: with SMTP id w26mr9084743pgc.298.1585035065921; Tue, 24 Mar 2020 00:31:05 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:05 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 5/8] riscv/kaslr: support sparse memory model Date: Tue, 24 Mar 2020 15:30:50 +0800 Message-Id: X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003107_028065_F842262A X-CRM114-Status: GOOD ( 14.63 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:544 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org For sparse memory model, we select a random memory node first, then get a random offset in this node. It gets one memory node in flat memory model case. Signed-off-by: Zong Li --- arch/riscv/kernel/kaslr.c | 139 ++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 34 deletions(-) diff --git a/arch/riscv/kernel/kaslr.c b/arch/riscv/kernel/kaslr.c index 9ec2b608eb7f..59001d6fdfc3 100644 --- a/arch/riscv/kernel/kaslr.c +++ b/arch/riscv/kernel/kaslr.c @@ -55,8 +55,9 @@ static __init int get_node_addr_size_cells(const char *path, int *addr_cell, static __init void kaslr_get_mem_info(uintptr_t *mem_start, uintptr_t *mem_size) + uintptr_t kernel_size, int find_index) { - int node, root, addr_cells, size_cells; + int node, root, addr_cells, size_cells, idx = 0; u64 base, size; /* Get root node's address cells and size cells. */ @@ -81,14 +82,56 @@ static __init void kaslr_get_mem_info(uintptr_t *mem_start, reg = get_reg_address(addr_cells, reg, &base); reg = get_reg_address(size_cells, reg, &size); - *mem_start = base; - *mem_size = size; + if (size < (kernel_size * 2)) + continue; - break; + if (idx == find_index) { + *mem_start = base; + *mem_size = size; + break; + } + + idx++; } } } +static __init int get_memory_nodes_num(uintptr_t kernel_size) +{ + int node, root, addr_cells, size_cells, total_nodes = 0; + u64 base, size; + + /* Get root node's address cells and size cells. */ + root = get_node_addr_size_cells("/", &addr_cells, &size_cells); + if (root < 0) + return 0; + + /* Get memory base address and size. */ + fdt_for_each_subnode(node, dtb_early_va, root) { + const char *dev_type; + const u32 *reg; + + dev_type = fdt_getprop(dtb_early_va, node, "device_type", NULL); + if (!dev_type) + continue; + + if (!strcmp(dev_type, "memory")) { + reg = fdt_getprop(dtb_early_va, node, "reg", NULL); + if (!reg) + return 0; + + reg = get_reg_address(addr_cells, reg, &base); + reg = get_reg_address(size_cells, reg, &size); + + /* Candidate ensures that it don't overlap itself. */ + if (size > kernel_size * 2) + total_nodes++; + } + } + + return total_nodes; +} + /* Return a default seed if there is no HW generator. */ static u64 kaslr_default_seed = ULL(-1); static __init u64 kaslr_get_seed(void) @@ -198,10 +241,11 @@ static __init bool has_regions_overlapping(uintptr_t start_addr, return false; } -static inline __init unsigned long get_legal_offset(int random_index, - int max_index, - uintptr_t mem_start, - uintptr_t kernel_size) +static inline __init unsigned long get_legal_offset_in_node(int random_index, + int max_index, + uintptr_t mem_start, + uintptr_t + kernel_size) { uintptr_t start_addr, end_addr; int idx, stop_idx; @@ -214,7 +258,8 @@ static inline __init unsigned long get_legal_offset(int random_index, /* Check overlap to other regions. */ if (!has_regions_overlapping(start_addr, end_addr)) - return idx * SZ_2M + kernel_size; + return idx * SZ_2M + kernel_size + (mem_start - + __pa(PAGE_OFFSET)); if (idx-- < 0) idx = max_index; @@ -224,6 +269,56 @@ static inline __init unsigned long get_legal_offset(int random_index, return 0; } +#define MEM_RESERVE_START __pa(PAGE_OFFSET) +static inline __init unsigned long get_legal_offset(u64 random, + uintptr_t kernel_size) +{ + int mem_nodes, idx, stop_idx, index; + uintptr_t mem_start = 0, mem_size = 0, random_size, ret; + + mem_nodes = get_memory_nodes_num(kernel_size); + + idx = stop_idx = random % mem_nodes; + + do { + kaslr_get_mem_info(&mem_start, &mem_size, kernel_size, idx); + + if (!mem_size) + return 0; + + if (mem_start < MEM_RESERVE_START) { + mem_size -= MEM_RESERVE_START - mem_start; + mem_start = MEM_RESERVE_START; + } + + /* + * Limit randomization range within 1G, so we can exploit + * early_pmd/early_pte during early page table phase. + */ + random_size = min_t(u64, + mem_size - (kernel_size * 2), + SZ_1G - (kernel_size * 2)); + + if (!random_size || random_size < SZ_2M) + return 0; + + /* The index of 2M block in whole available region */ + index = random % (random_size / SZ_2M); + + ret = + get_legal_offset_in_node(index, random_size / SZ_2M, + mem_start, kernel_size); + if (ret) + break; + + if (idx-- < 0) + idx = mem_nodes - 1; + + } while (idx != stop_idx); + + return ret; +} + static inline __init u64 rotate_xor(u64 hash, const void *area, size_t size) { size_t i; @@ -238,12 +333,9 @@ static inline __init u64 rotate_xor(u64 hash, const void *area, size_t size) return hash; } -#define MEM_RESERVE_START __pa(PAGE_OFFSET) static __init uintptr_t get_random_offset(u64 seed, uintptr_t kernel_size) { - uintptr_t mem_start = 0, mem_size= 0, random_size; uintptr_t kernel_size_align = round_up(kernel_size, SZ_2M); - int index; u64 random = 0; cycles_t time_base; @@ -261,28 +353,7 @@ static __init uintptr_t get_random_offset(u64 seed, uintptr_t kernel_size) if (seed) random = rotate_xor(random, &seed, sizeof(seed)); - kaslr_get_mem_info(&mem_start, &mem_size); - if (!mem_size) - return 0; - - if (mem_start < MEM_RESERVE_START) { - mem_size -= MEM_RESERVE_START - mem_start; - mem_start = MEM_RESERVE_START; - } - - /* - * Limit randomization range within 1G, so we can exploit - * early_pmd/early_pte during early page table phase. - */ - random_size = min_t(u64, - mem_size - (kernel_size_align * 2), - SZ_1G - (kernel_size_align * 2)); - - /* The index of 2M block in whole avaliable region */ - index = random % (random_size / SZ_2M); - - return get_legal_offset(index, random_size / SZ_2M, - mem_start, kernel_size_align); + return get_legal_offset(random, kernel_size_align); } uintptr_t __init kaslr_early_init(void) From patchwork Tue Mar 24 07:30:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454599 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 92A2615AB for ; Tue, 24 Mar 2020 07:31:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 543DA2076A for ; Tue, 24 Mar 2020 07:31:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="huNibd9G"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="FFPXtP0J" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 543DA2076A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XEXvf7YM3IfG8+Nza4lz7YWo/aCxS7DRWP5Lj0YYBjc=; b=huNibd9GKkmBQ7 4EUx80IFZlmqZiXBZSahDlWKgiwX/XCuoSbJylcilfbiKL8xH/eHpMSBc2k/rWHwVkK6R5q8fwnLN J7BbtQmRUBeX/LwBWo6oWlFa+p3nugSIAiBjEd0uI3UvReMhaIMh0D6utD5K79J+cKRdwhudTSDUp awf3Nuq2Jyff4AlEHRyYGR4IgbZX8jk1ZyMVSZXjN6t8snJUKkS3STaY5rdvf5JSR1Gv0viDyZaCi 5lRj1heiC5NTxbFaVK4+82xAn6dWdbzurO37rpkEZqbVgHil18vxMMFJOtKhhPsNNqVdZZJmDMc6C 8ZPMbD/L8Z5HaLi9okUg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1t-00048I-7c; Tue, 24 Mar 2020 07:31:17 +0000 Received: from mail-pg1-x544.google.com ([2607:f8b0:4864:20::544]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1k-0003vi-CK for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:09 +0000 Received: by mail-pg1-x544.google.com with SMTP id b22so8597903pgb.6 for ; Tue, 24 Mar 2020 00:31:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XEXvf7YM3IfG8+Nza4lz7YWo/aCxS7DRWP5Lj0YYBjc=; b=FFPXtP0JGFZuxhK64DdBrFFIn56NYFvcpNK4yw2jPsrNBzClysK7yzg71194N9zxlm DahcEGASnS2ix5XgdwV4Lo9/xTQnS7dbdexFOYf9D9V/N1n6i5a6r5ro0rFbNJFZcj11 zLkBMr4Vt++GfCQOzTAFEa0m+Wvc+ZyFp5Z8gZl6H6Yrdc0JCKu7QON2n2vuswysspfK FjefZR8RpVRjH6rQq94sITHb2ZfhG8tVOzJJsl4bUe2bFTLcio7f5m4GDprt6yrHDQlf fJJiesOscjpShsShndfOjML8ZFBlEYONjEBWGDRYn6lcWE46TdJ+ecom/MTHMqdtm32f wAIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XEXvf7YM3IfG8+Nza4lz7YWo/aCxS7DRWP5Lj0YYBjc=; b=Tvh5yc2LbKHSvRHbU+KIq0f45BSmavkmz4FQm7NBJq+HvsdrEzkm0TsH7OdDUJNRtA Qb0QWBDSEYfCtWGs0X9SjZG80JmMlfG0IMxg5+F+mNPllUNxl9CMMlclJj7EqUGiskao OR2yzc7Gl8iVBkHluH1//NvnlNihfkWo5DxCWURbgExE6jXp1Rs/G4adjPw1RAh3HFYX eCJ84W/C3O7C5FHakH5Y4Hbp/uKcaRpIEe2ydfVNG1CwWVNwcA0tycks1neGYd63Urdx 2vwsbztdKx92EtqB4a1VhwO2ePeuF4khg9JozEPPAl4Qg2ycrF8XJ5+d//I2fxQ3jW5q 3DIA== X-Gm-Message-State: ANhLgQ0S98NCNoWqKxgMvQS2SXRmgZHQxc8GZS+rQE4VTVGFKQ3SWroN 5F6PZlB4tghellRJ9vlsXeROpA== X-Google-Smtp-Source: ADFU+vsdrPgNn4KpM07PAP6pvwMAOBhla8yo85VYdbcgVyUYoPwTMJ1rmnsy6w33qY/lkhlyJ+8YlQ== X-Received: by 2002:a63:7c02:: with SMTP id x2mr26880475pgc.236.1585035067681; Tue, 24 Mar 2020 00:31:07 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:07 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 6/8] riscv/kaslr: clear the original kernel image Date: Tue, 24 Mar 2020 15:30:51 +0800 Message-Id: <8373a9d18958b99b72ed9499786dffe45adf9617.1584352425.git.zong.li@sifive.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003108_440084_43CB000E X-CRM114-Status: GOOD ( 11.64 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:544 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org After completing final page table, we can clear original kernel image and remove executable permission. Signed-off-by: Zong Li --- arch/riscv/include/asm/kaslr.h | 12 ++++++++++++ arch/riscv/kernel/kaslr.c | 12 ++++++++++++ arch/riscv/mm/init.c | 6 ++++++ 3 files changed, 30 insertions(+) create mode 100644 arch/riscv/include/asm/kaslr.h diff --git a/arch/riscv/include/asm/kaslr.h b/arch/riscv/include/asm/kaslr.h new file mode 100644 index 000000000000..b165fe71dd4a --- /dev/null +++ b/arch/riscv/include/asm/kaslr.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2020 SiFive + * Copyright (C) 2020 Zong Li + */ + +#ifndef _ASM_RISCV_KASLR_H +#define _ASM_RISCV_KASLR_H + +void __init kaslr_late_init(void); + +#endif /* _ASM_RISCV_KASLR_H */ diff --git a/arch/riscv/kernel/kaslr.c b/arch/riscv/kernel/kaslr.c index 59001d6fdfc3..0bd30831c455 100644 --- a/arch/riscv/kernel/kaslr.c +++ b/arch/riscv/kernel/kaslr.c @@ -356,6 +356,18 @@ static __init uintptr_t get_random_offset(u64 seed, uintptr_t kernel_size) return get_legal_offset(random, kernel_size_align); } +void __init kaslr_late_init(void) +{ + uintptr_t kernel_size; + + /* Clear original kernel image. */ + if (kaslr_offset) { + kernel_size = (uintptr_t) _end - (uintptr_t) _start; + memset((void *)PAGE_OFFSET, 0, kernel_size); + set_memory_nx(PAGE_OFFSET, kaslr_offset >> PAGE_SHIFT); + } +} + uintptr_t __init kaslr_early_init(void) { u64 seed; diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 34c6ecf2c599..08e2ce170533 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -15,6 +15,7 @@ #include #ifdef CONFIG_RELOCATABLE #include +#include #endif #include @@ -649,6 +650,11 @@ static void __init setup_vm_final(void) /* Move to swapper page table */ csr_write(CSR_SATP, PFN_DOWN(__pa_symbol(swapper_pg_dir)) | SATP_MODE); local_flush_tlb_all(); + +#ifdef CONFIG_RANDOMIZE_BASE + /* Clear orignial kernel image and set the right permission. */ + kaslr_late_init(); +#endif } void free_initmem(void) From patchwork Tue Mar 24 07:30:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454601 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DFB5E15AB for ; Tue, 24 Mar 2020 07:31:23 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BFA4120771 for ; Tue, 24 Mar 2020 07:31:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="BftXFfJU"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="XoVHwOun" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BFA4120771 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=eR+uDkZlwayIbsgbPeyhEUp7doO9+jBvD/Fsht7osWo=; b=BftXFfJUvh4QQz UfUCETdkiBdQvW1U0nldC6C+wL1jPiHBewp4CtfLCWKS1BLI7JQZ0yRu26TvwHkImxWUjOtw3hNU5 OhX4n1/ZOaP2Qg7mIt4LYa49nc2piq/9xJviHxL2JLVVnP8TYKsodPf6VtnsWy/xEyk8dhGmhiEQD dp+bF7UNAqPmY8Z0vfKYRznc5ypOAG7aWKswPxGujDyhf1AdbI4Lwlbco19Hqnq9hYDwgA02jBkI1 bGob2dGtl0ole/VJW+PbS0dZOii2aEPR5O2DLwTo2bNQCoQRwgZs7YgTuG1J/hKAREvJClQN1o6fm J61NbASYGFiMOAMg24rw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1v-0004By-Qf; Tue, 24 Mar 2020 07:31:19 +0000 Received: from mail-pg1-x543.google.com ([2607:f8b0:4864:20::543]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1m-0003xy-Av for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:11 +0000 Received: by mail-pg1-x543.google.com with SMTP id x7so8604295pgh.5 for ; Tue, 24 Mar 2020 00:31:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eR+uDkZlwayIbsgbPeyhEUp7doO9+jBvD/Fsht7osWo=; b=XoVHwOunlnnbXskW9yEXFl7rJ9ssINpRGhRVPBNdeKX2ubyzIqYnH7eOAuSMPP47WM vpKFBPcMqG36hjx5V9ijQ5XnCZZkQIWI1tZjd3oRZHyBNBWUi8pl2Gt2hBTYwifQ6ftG GYYAaKaGAfU6znHtAwVS6nk59jizZ8IkH8NR3GC2jDw2RAP+PoQIb66l7GXWxPSDOk6X t86QXLZ+el4hQ8fIoCNxLsTKPO8lBNpFPmrg8J/tRYBogRjl6D83lkUa6ICTHiT9t0Pp Qnpj/UoH5ouKUI08kBZfOPHpXugMxTI5KFE/nG2KOA+7/RRz8rf7p8QYWs/H0b7RkqFM J+QA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eR+uDkZlwayIbsgbPeyhEUp7doO9+jBvD/Fsht7osWo=; b=mx8vzt6o0dfuKAoO6ow5OyTEPEOwP9fnotIkxgjuwjSvTOxfFNoqoWWrrEFdptmMSD hOQbkbGKjBJGozoeH3wZcBjyfAqAyMlwDwzyCb+DyXe5qGswldf9wwQXf1dLrd15Twri jkVD4qtzBIh2ewLd3jzLQ3e1it6mpmtLXuGfTI656VHqCpugWVpD4h9ixM3tBwoAONm0 oSfXOPfctPoJ30Mt7e8Yk5Ic0ixvBNJXgTyeLfK3R5CceX6jAJg7fchby/f2zoe+6I1D u1YiEESGnlY0JvXOTRRZ+bYvwbBMjkknVEN8XfqdoDiG8KUNzuF4Gfe9J5y+xDv6cI+i S/nw== X-Gm-Message-State: ANhLgQ3hIVvmndOaWijwWHJK+OK5e0Z6xew/uGV+T74dKXrb+Cf52VaJ fvoFAW1VNLylis0J7y9FaMUR3g== X-Google-Smtp-Source: ADFU+vtQyavi3WiglYVqrQnZDp3eiLFu1j+s5c3PNQLghbIos9mzlMX/psPU7J6BV8na+AKAN5ODnQ== X-Received: by 2002:a63:ff4e:: with SMTP id s14mr26364986pgk.269.1585035069344; Tue, 24 Mar 2020 00:31:09 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:09 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 7/8] riscv/kaslr: add cmdline support to disable KASLR Date: Tue, 24 Mar 2020 15:30:52 +0800 Message-Id: <292e5511fff99d564c947c9ee71be367be947f55.1584352425.git.zong.li@sifive.com> X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003110_401528_3A2E70ED X-CRM114-Status: UNSURE ( 9.51 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:543 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org Provide a cmdline parameter 'nokaslr' to disable KASLR. Signed-off-by: Zong Li --- arch/riscv/kernel/kaslr.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/arch/riscv/kernel/kaslr.c b/arch/riscv/kernel/kaslr.c index 0bd30831c455..6920727e4b4a 100644 --- a/arch/riscv/kernel/kaslr.c +++ b/arch/riscv/kernel/kaslr.c @@ -156,6 +156,36 @@ static __init u64 kaslr_get_seed(void) return ret; } +static __init const u8 *kaslr_get_cmdline(void) +{ + static const u8 default_cmdline[] __initconst = CONFIG_CMDLINE; + + if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) { + int node; + const u8 *prop; + + node = fdt_path_offset(dtb_early_va, "/chosen"); + if (node < 0) + goto out; + + prop = fdt_getprop(dtb_early_va, node, "bootargs", NULL); + if (!prop) + goto out; + + return prop; + } + +out: + return default_cmdline; +} + +static __init bool kaslr_is_disabled(void) +{ + const u8 *cmdline = kaslr_get_cmdline(); + + return strstr(cmdline, "nokaslr") != NULL; +} + static __init bool is_overlap(uintptr_t s1, uintptr_t e1, uintptr_t s2, uintptr_t e2) { @@ -379,6 +409,10 @@ uintptr_t __init kaslr_early_init(void) if (!seed) return 0; + /* Check whether disable kaslr by cmdline. */ + if (kaslr_is_disabled()) + return 0; + /* Get the random number for kaslr offset. */ kaslr_offset = get_random_offset(seed, kernel_size); From patchwork Tue Mar 24 07:30:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zong Li X-Patchwork-Id: 11454603 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1823014B4 for ; Tue, 24 Mar 2020 07:31:26 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EA9A02076F for ; Tue, 24 Mar 2020 07:31:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="P9nePPC5"; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="iEXF+9cx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EA9A02076F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date :Subject:To:From:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=54p31XcZy9VY/uTSVV1VAo6tqKUeT0iaZ8T4Yx3sR7Y=; b=P9nePPC5lxgNTY qssfxOG1CX69iuq//Oi+xbLw6kc7FejrDLPwQaG03u41CQbXczfbKcEy/1a+YdSPV4+0nYnlKr6mS AoQB9Yj477RK6LGkngOgo+6iWINSKok5lj8IiI1seSM17sNl0FlG69Gz+gf2JO8cf+S3h+xQgeLTz i5tlCFHVOtYpIipVCCjLHwLgyrsLnaIEUyfgNIhZu+eSjp0WYeZ5nA1jDpD4H7nB6jTsZ5RZC4gCt ixl0qg+cAeFSlcMD+Dlt+y3UcsSrHVnb5/GxtbKMSGmecWeuVZA2ky+lXJJO+rVUp8OHhRa0PRK4D OOqTHaKSpxVUjwcxF65Q==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1y-0004Fo-EG; Tue, 24 Mar 2020 07:31:22 +0000 Received: from mail-pj1-x1043.google.com ([2607:f8b0:4864:20::1043]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jGe1o-00040E-A9 for linux-riscv@lists.infradead.org; Tue, 24 Mar 2020 07:31:13 +0000 Received: by mail-pj1-x1043.google.com with SMTP id l36so1091901pjb.3 for ; Tue, 24 Mar 2020 00:31:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=54p31XcZy9VY/uTSVV1VAo6tqKUeT0iaZ8T4Yx3sR7Y=; b=iEXF+9cxq8xsvBHmABzfWbJjn41vgvA6oKrfEkKliYoY7j4OI83K0ywdq9cODsiA2Z v6OCCQIEj68L96a+WLVMjjt6ALm+CsD3j0D4KebwyuwLrDSgVo6P9mlbgoXk12+g8hYq h3HZjhPy1S8gcvtOkooUJKx59NBgXDGs9v2+7xxixk90ggSaHgyDTC4fWJPtMQM6OEfo 1wP2sr8P3cQdvqRJvgyEiw6sOtpJrqjA4X1skfY4hFk5KMDcO1X3+K0WPyoE+Y3vNWP+ 0/At0OSgtSowO8eLWPmOYfifL5cMVVVHKwjfRwnTsOBdpeyiYvdATTYSilWaUKS0Ndx7 0slw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=54p31XcZy9VY/uTSVV1VAo6tqKUeT0iaZ8T4Yx3sR7Y=; b=VOgq6uyxPUA6Hc8BlzB6txrbMHQJlOeapw1aR5ca/EFrcOflOLsOdBDEW1EWo2IYmm KCiXixrfaGe47Rv3OICOQNGIFm2J4W0NMx4fn5R0sHGeBZlg4n0IToWLIBwrfEBmKCSp JwRyBqV0GGMlzbDNSQOVWgIgYqUTV8JlZbldOdY3c5q28svRIw3LFxyiX3lNLUva5+7C jiA9bKmtpWNC8t0hZKXq2QvQyqYcgTM2xxATCuGiXyMpK0sNFH2l2Ep+IaE99GpaccYp gCQ8Jz3Pb7KWBM6Zdhin6SDgdY9ZW9RUMucmXquj6yLw1Lhia97qo9/XJFLrFQWdDjoA W7ZA== X-Gm-Message-State: ANhLgQ0ESjh0we+M/LNJVdIJoxNdJ4bEiDVbw9lqwVA7zyyXxAtD9n2n H++onPHFcrw/ckSUjV+ggVEdOg== X-Google-Smtp-Source: ADFU+vv2b4TrS7mtJtADgnbvhx9fw/lDSwAZQDta7SAXFjV1VN2AFgelMDsi76samQ/8v1L0pkUKOA== X-Received: by 2002:a17:90a:cc14:: with SMTP id b20mr3916243pju.75.1585035071082; Tue, 24 Mar 2020 00:31:11 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (220-132-236-182.HINET-IP.hinet.net. [220.132.236.182]) by smtp.gmail.com with ESMTPSA id i187sm15124648pfg.33.2020.03.24.00.31.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2020 00:31:10 -0700 (PDT) From: Zong Li To: palmer@dabbelt.com, paul.walmsley@sifive.com, alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH RFC 8/8] riscv/kaslr: dump out kernel offset information on panic Date: Tue, 24 Mar 2020 15:30:53 +0800 Message-Id: X-Mailer: git-send-email 2.25.2 In-Reply-To: References: MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200324_003112_393406_AA7572FD X-CRM114-Status: UNSURE ( 7.69 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:1043 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 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: Zong Li Sender: "linux-riscv" Errors-To: linux-riscv-bounces+patchwork-linux-riscv=patchwork.kernel.org@lists.infradead.org Dump out the kernel offset when panic to help debug kernel. Signed-off-by: Zong Li --- arch/riscv/kernel/setup.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c index 913d25e4b9fa..3ce50bf628ba 100644 --- a/arch/riscv/kernel/setup.c +++ b/arch/riscv/kernel/setup.c @@ -85,3 +85,26 @@ void __init setup_arch(char **cmdline_p) riscv_fill_hwcap(); } + +static int dump_kernel_offset(struct notifier_block *self, unsigned long v, + void *p) +{ + pr_emerg("Kernel Offset: 0x%lx from 0x%lx\n", + get_kaslr_offset(), PAGE_OFFSET); + + return 0; +} + +static struct notifier_block kernel_offset_notifier = { + .notifier_call = dump_kernel_offset +}; + +static int __init register_kernel_offset_dumper(void) +{ + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && get_kaslr_offset() > 0) + atomic_notifier_chain_register(&panic_notifier_list, + &kernel_offset_notifier); + + return 0; +} +__initcall(register_kernel_offset_dumper);