From patchwork Mon Aug 1 17:07:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Garnier X-Patchwork-Id: 9254561 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 BFAC66048B for ; Mon, 1 Aug 2016 17:08:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AA911283A6 for ; Mon, 1 Aug 2016 17:08:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9F304284AF; Mon, 1 Aug 2016 17:08:49 +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=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48FFF283A6 for ; Mon, 1 Aug 2016 17:08:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754333AbcHARIr (ORCPT ); Mon, 1 Aug 2016 13:08:47 -0400 Received: from mail-pa0-f53.google.com ([209.85.220.53]:36623 "EHLO mail-pa0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754244AbcHARIm (ORCPT ); Mon, 1 Aug 2016 13:08:42 -0400 Received: by mail-pa0-f53.google.com with SMTP id pp5so54518868pac.3 for ; Mon, 01 Aug 2016 10:08:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mTjOZrHcNZXNncVA+qGGWobyjQviMglXZpI3a8woWf0=; b=KXKdXj6Hea1DRpQgYcVOnxNj4Nu5M6CWAG6cjaZRYUYQzEiXR+5ljytnmWp74m9I07 34uVhxMR/QIglF1JRJsxlGx5Fyd65K+sZtDs/22MMcUUEiGw1wjZVePy5/m8sDv43tAQ W0Lbvm0/1h9CorQvbdZ13GFQp6G9uPrVGQ3iWh5pt7QRwaBYlDlw4qe7XDVsljgjB65Q ja1bhvV5ukJ+ZTycF6gpRLHH4VdZ12KvF0xfIGHhqRD2cEZTKrxXkX1hZNAwHZ0ugUoz OGL4tIoY6s4Kf2+OQlTZT1D7h2UtycGY/HFXe5apIOp64bpD6VWNXB5TLKuWy+Mx1aiP lq/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mTjOZrHcNZXNncVA+qGGWobyjQviMglXZpI3a8woWf0=; b=bmFsud9AG6DS0h1HS8cEV7gENkGi4uFTGl4YIN2lxlUOh3iQdYcYSSWHOCIbCKH+fv kJZkDYvlOxFN9J/L7bP9K/YLvDuFUJ/vkfSfNmK5mPK3kdsPYM5at2WT8KSrouiiDuEo OFMhA7/iKdAxbsO5/Irkwzxr4EVlyAbcZWFhJMA3HHdSwyz4FcdvMReyJqGxIyeHQjTo bNIldJe0a6TUduNMn//JaNR24D4/Z+ypV8E/tY6ygohVkf5U0UrE0q08d0jjGzp+CKi3 aRfl9QN/JXCxkkO9zVeUQUDX6FGFI87pM8U7Qlygroatw0OInpk/9xS5urMKC03VC5yP bA7Q== X-Gm-Message-State: AEkoousnKKRkN+V4aGFQ8QopBx0GDOJy9IJOen4wuvXFS46VFbX/THju8u5F6QaGuz5GCHbQ X-Received: by 10.66.86.170 with SMTP id q10mr97675504paz.105.1470071300031; Mon, 01 Aug 2016 10:08:20 -0700 (PDT) Received: from skynet.sea.corp.google.com ([100.119.232.34]) by smtp.gmail.com with ESMTPSA id i69sm47087390pfk.30.2016.08.01.10.08.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 01 Aug 2016 10:08:19 -0700 (PDT) From: Thomas Garnier To: Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , Kees Cook , Thomas Garnier , Yinghai Lu , "Rafael J . Wysocki" , Pavel Machek Cc: x86@kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, kernel-hardening@lists.openwall.com Subject: [PATCH v1 1/2] x86/power/64: Support unaligned addresses for temporary mapping Date: Mon, 1 Aug 2016 10:07:59 -0700 Message-Id: <1470071280-78706-2-git-send-email-thgarnie@google.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1470071280-78706-1-git-send-email-thgarnie@google.com> References: <1470071280-78706-1-git-send-email-thgarnie@google.com> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Correctly setup the temporary mapping for hibernation. Previous implementation assumed the address was aligned on the PGD level. With KASLR memory randomization enabled, the address is randomized on the PUD level. This change supports unaligned address up to PMD. Signed-off-by: Thomas Garnier Acked-by: Rafael J. Wysocki --- arch/x86/mm/ident_map.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/arch/x86/mm/ident_map.c b/arch/x86/mm/ident_map.c index ec21796..ea1ebf1 100644 --- a/arch/x86/mm/ident_map.c +++ b/arch/x86/mm/ident_map.c @@ -3,15 +3,16 @@ * included by both the compressed kernel and the regular kernel. */ -static void ident_pmd_init(unsigned long pmd_flag, pmd_t *pmd_page, +static void ident_pmd_init(struct x86_mapping_info *info, pmd_t *pmd_page, unsigned long addr, unsigned long end) { - addr &= PMD_MASK; - for (; addr < end; addr += PMD_SIZE) { - pmd_t *pmd = pmd_page + pmd_index(addr); + int off = info->kernel_mapping ? pmd_index(__PAGE_OFFSET) : 0; + + for (addr &= PMD_MASK; addr < end; addr += PMD_SIZE) { + pmd_t *pmd = pmd_page + pmd_index(addr) + off; if (!pmd_present(*pmd)) - set_pmd(pmd, __pmd(addr | pmd_flag)); + set_pmd(pmd, __pmd(addr | info->pmd_flag)); } } @@ -19,9 +20,10 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page, unsigned long addr, unsigned long end) { unsigned long next; + int off = info->kernel_mapping ? pud_index(__PAGE_OFFSET) : 0; for (; addr < end; addr = next) { - pud_t *pud = pud_page + pud_index(addr); + pud_t *pud = pud_page + pud_index(addr) + off; pmd_t *pmd; next = (addr & PUD_MASK) + PUD_SIZE; @@ -30,13 +32,13 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page, if (pud_present(*pud)) { pmd = pmd_offset(pud, 0); - ident_pmd_init(info->pmd_flag, pmd, addr, next); + ident_pmd_init(info, pmd, addr, next); continue; } pmd = (pmd_t *)info->alloc_pgt_page(info->context); if (!pmd) return -ENOMEM; - ident_pmd_init(info->pmd_flag, pmd, addr, next); + ident_pmd_init(info, pmd, addr, next); set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); }