From patchwork Wed Mar 22 08:55:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Ramana X-Patchwork-Id: 9638315 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5437860327 for ; Wed, 22 Mar 2017 08:56:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 42FD028306 for ; Wed, 22 Mar 2017 08:56:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 34F812833B; Wed, 22 Mar 2017 08:56:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D3E3C281F9 for ; Wed, 22 Mar 2017 08:56:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=gagXGyAzbU1g9645z2EyYYTJ0I8TbFRQGxjVkHV3LTA=; b=u1v wtpGULgglwrvwZKEvvZCB0cRVT2LyYr7t476unB8BVvPwgusMRAovft6XXwdlTx/eKbM1wQ8ptIhs 4t6GqPqmS7r4lRn2Na7kP50TwmUz1Xbti9meY1zNCIWTVKX62hx+447gP1Ho+g2U+wyD2uJsrMoKx 2FPZEWd1bKUg1KS+hiaNPZCQD1DFXPUcBH4w4crV42VLh2q+fH0ezKk1uCrOONROZSJl+X4UCNRlL S+DooyVWXFCTvOt/FJ6ii+XYMdVJQFqX/Da1Q9sP1c3VOBFCc671XLXMS0bxXNNULARcfkvAI3bA0 n9tO+J4LzWEjSwyUMOc1WcEoewc5x6A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1cqc4A-0001Fq-ER; Wed, 22 Mar 2017 08:56:26 +0000 Received: from smtp.codeaurora.org ([198.145.29.96]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1cqc46-0001Dd-Rg for linux-arm-kernel@lists.infradead.org; Wed, 22 Mar 2017 08:56:24 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 30B0060AC8; Wed, 22 Mar 2017 08:56:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1490172962; bh=YgfcKgAPGmcbOykk0WmadaomV68S/yHWEMS1FcLjqBQ=; h=From:To:Cc:Subject:Date:From; b=WICdAN62ojxi8zkZ/yDTbu2hl7gRBLGbmkxXMlX+ReKmsmy0kfdRen7jlGaTuMHII +Q620ZBgnrWvyOk+I8QUN7ZURBDGIxn/0tDZH/0oz+jXi1p/cyAOge4rfQa3ktANI1 Js16gk9JN3d/VVIjxvVN4WzW4YYAFZDCKBhBZE1o= Received: from sramana-linux.qualcomm.com (unknown [202.46.23.54]) (using TLSv1.1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sramana@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id E308A60817; Wed, 22 Mar 2017 08:55:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1490172961; bh=YgfcKgAPGmcbOykk0WmadaomV68S/yHWEMS1FcLjqBQ=; h=From:To:Cc:Subject:Date:From; b=VEvpqR8a0ofZZjw6/Yye9tjvbJAeGHR/n/ytB1wymFM72KmU+8dpnJqFeEB7NBsVK Opv3wMdNWtpI+X2qKim5bkEzDOhfsWsdmeEvOYjKo/ijC35mWFngck3K/dj1990Fhs J+BboFhtiu9KXowhMFiKG65vBlGKva6sf+ZfJngk= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org E308A60817 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=sramana@codeaurora.org From: Srinivas Ramana To: catalin.marinas@arm.com, will.deacon@arm.com, ard.biesheuvel@linaro.org Subject: [PATCH] arm64: kaslr: Add 2MB correction for aligning kernel image Date: Wed, 22 Mar 2017 14:25:43 +0530 Message-Id: <1490172943-826-1-git-send-email-sramana@codeaurora.org> X-Mailer: git-send-email 1.8.2.1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170322_015622_946138_C6C2CEB5 X-CRM114-Status: GOOD ( 12.26 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-msm@vger.kernel.org, Srinivas Ramana , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Neeraj Upadhyay MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Neeraj Upadhyay If kernel image extends across alignment boundary, existing code increases the KASLR offset by size of kernel image. The offset is masked after resizing. There are cases, where after masking, we may still have kernel image extending across boundary. This eventually results in only 2MB block getting mapped while creating the page tables. This results in data aborts while accessing unmapped regions during second relocation (with kaslr offset) in __primary_switch. To fix this problem, add a 2MB correction to offset along with the correction of kernel image size, before applying mask. For example consider below case, where kernel image still crosses 1GB alignment boundary, after masking the offset, which is fixed by adding 2MB correction. SWAPPER_TABLE_SHIFT = 30 Swapper using section maps with section size 2MB. CONFIG_PGTABLE_LEVELS = 3 VA_BITS = 39 _text : 0xffffff8008080000 _end : 0xffffff800aa1b000 offset : 0x1f35600000 mask = ((1UL << (VA_BITS - 2)) - 1) & ~(SZ_2M - 1) (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7c (_end + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d offset after existing correction (before mask) = 0x1f37f9b000 (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d (_end + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d offset (after mask) = 0x1f37e00000 (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7c (_end + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d new offset w/ 2MB correction (before mask) = 0x1f37819b00 new offset w/ 2MB correction (after mask) = 0x1f38000000 (_text + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d (_end + offset) >> SWAPPER_TABLE_SHIFT = 0x3fffffe7d Fixes: f80fb3a3d508 ("arm64: add support for kernel ASLR") Signed-off-by: Neeraj Upadhyay Signed-off-by: Srinivas Ramana --- arch/arm64/kernel/kaslr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c index 769f24ef628c..7b8af985e497 100644 --- a/arch/arm64/kernel/kaslr.c +++ b/arch/arm64/kernel/kaslr.c @@ -135,7 +135,7 @@ u64 __init kaslr_early_init(u64 dt_phys, u64 modulo_offset) */ if ((((u64)_text + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT) != (((u64)_end + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT)) - offset = (offset + (u64)(_end - _text)) & mask; + offset = (offset + (u64)(_end - _text) + SZ_2M) & mask; if (IS_ENABLED(CONFIG_KASAN)) /*