Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp6417ybt; Tue, 23 Jun 2020 13:49:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzptH6416c5TqwEi0njBCAQvZPKpVjc+W7ecf3VIW+nv7geNYJ787n41QYcrKKtOzbspa+c X-Received: by 2002:a17:906:7ad7:: with SMTP id k23mr22731896ejo.439.1592945363786; Tue, 23 Jun 2020 13:49:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592945363; cv=none; d=google.com; s=arc-20160816; b=DQjLTjiniKx0mYlKpNQCcKrr9meiUpb3lp44aXXf2XTukdAg9NnDIr1F3yYuaZ6oMD ZI5iYHeHQ9BB6/n4AesKuG5ROSYnE82ut2q69XhmlKKKJwjS0Kq14j0/lZ+NtdtNZu1D uZH2mRmtoZWr2SQdhI8hpUEIh+PmH7VjViVsPIjjIci4ITy+Y0FWQrDuh4gKrqKGuA6O NcxLn6dXxzAomEjiwiH5TbXJmT8jzCbRLk6ejtjsuEDraKd5uBdAm3ZKtB3BBOHzt2UJ g3d7l/mYZp5imYfwUY9wkhrGcPPYTLRYmyomshB4J7NsWHYbkmd4BaxeHgnozX75xafv nekQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=OBtVLVRMaUelnO5SL4M388V7ZQA/uQU8GkwR349g1ZU=; b=TJL5shRBvHaPCo7QS8dOfSFSN02eWS4ZBHimwOS6I+CSMpS0hBWuajv7Qxn7bN+KcB 1dPkhC0eNcPPdGp9aRL+3ZRvL2tT4VN7DpUBI2E7tQ8CKo4ra0AgZYbhalegCFxdE9gX J1oR34jcaGAyTeSrjwknI/R/I5nesFbqCV9GQElQV9EjBxc5JSDKMG41iEOyPQhNY12T Al+Buu05X5ce0MeQITqSv0V+9+sozfj9a72+UIlJpz7Tmat0u+MhCmVUmPXx6CAl7kQ6 ngVtUj9bPVo3qkYTnjjzPS4qhRSga4Zt8e4s/WGXe6zdSqJOfXGRknWOuXEnMSYZoDhr snEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jllzmCau; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cc10si11596939edb.236.2020.06.23.13.48.59; Tue, 23 Jun 2020 13:49:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=jllzmCau; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391222AbgFWUqe (ORCPT + 99 others); Tue, 23 Jun 2020 16:46:34 -0400 Received: from mail.kernel.org ([198.145.29.99]:44382 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392483AbgFWUq2 (ORCPT ); Tue, 23 Jun 2020 16:46:28 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 20AE220781; Tue, 23 Jun 2020 20:46:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592945188; bh=w9e40VJgFi/5xIhYjyWmoWAugoEtwnTY8hHt6ZeEIAk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jllzmCaunI5jE+mjrqtbVhnhZkHCNg679ys5qxWI3puaES+WBeEtSNBmX7Bj9fMJa Zd/jFqej21i/ePkKU/OmvqzEseRAoiYgiGXdM69rTuH/0x5TPx5A5OgKB4woZXyHpr fw0lxrnH+SVg2BKu3e/OYMo59PfbNGoYvCZVqzAs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Christophe Leroy , Qian Cai , Michael Ellerman , Sasha Levin Subject: [PATCH 4.14 066/136] powerpc/64s/pgtable: fix an undefined behaviour Date: Tue, 23 Jun 2020 21:58:42 +0200 Message-Id: <20200623195307.010581305@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200623195303.601828702@linuxfoundation.org> References: <20200623195303.601828702@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Qian Cai [ Upstream commit c2e929b18cea6cbf71364f22d742d9aad7f4677a ] Booting a power9 server with hash MMU could trigger an undefined behaviour because pud_offset(p4d, 0) will do, 0 >> (PAGE_SHIFT:16 + PTE_INDEX_SIZE:8 + H_PMD_INDEX_SIZE:10) Fix it by converting pud_index() and friends to static inline functions. UBSAN: shift-out-of-bounds in arch/powerpc/mm/ptdump/ptdump.c:282:15 shift exponent 34 is too large for 32-bit type 'int' CPU: 6 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc4-next-20200303+ #13 Call Trace: dump_stack+0xf4/0x164 (unreliable) ubsan_epilogue+0x18/0x78 __ubsan_handle_shift_out_of_bounds+0x160/0x21c walk_pagetables+0x2cc/0x700 walk_pud at arch/powerpc/mm/ptdump/ptdump.c:282 (inlined by) walk_pagetables at arch/powerpc/mm/ptdump/ptdump.c:311 ptdump_check_wx+0x8c/0xf0 mark_rodata_ro+0x48/0x80 kernel_init+0x74/0x194 ret_from_kernel_thread+0x5c/0x74 Suggested-by: Christophe Leroy Signed-off-by: Qian Cai Signed-off-by: Michael Ellerman Reviewed-by: Christophe Leroy Link: https://lore.kernel.org/r/20200306044852.3236-1-cai@lca.pw Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/book3s/64/pgtable.h | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h index bcb79a96a6c83..618ee2c0ed53d 100644 --- a/arch/powerpc/include/asm/book3s/64/pgtable.h +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -898,10 +898,25 @@ extern struct page *pgd_page(pgd_t pgd); #define pud_page_vaddr(pud) __va(pud_val(pud) & ~PUD_MASKED_BITS) #define pgd_page_vaddr(pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS) -#define pgd_index(address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1)) -#define pud_index(address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1)) -#define pmd_index(address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1)) -#define pte_index(address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1)) +static inline unsigned long pgd_index(unsigned long address) +{ + return (address >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1); +} + +static inline unsigned long pud_index(unsigned long address) +{ + return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1); +} + +static inline unsigned long pmd_index(unsigned long address) +{ + return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); +} + +static inline unsigned long pte_index(unsigned long address) +{ + return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); +} /* * Find an entry in a page-table-directory. We combine the address region -- 2.25.1