From nobody Sun Feb 8 23:27:05 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 942D3C87FDC for ; Tue, 6 Jun 2023 19:43:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239557AbjFFTnS (ORCPT ); Tue, 6 Jun 2023 15:43:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239174AbjFFTmn (ORCPT ); Tue, 6 Jun 2023 15:42:43 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F301810EC; Tue, 6 Jun 2023 12:42:41 -0700 (PDT) Date: Tue, 06 Jun 2023 19:42:37 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1686080558; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=j/QzS4DZr/MAWlGkTC1jPLmonujE+Jd/Z/6pz1neILU=; b=QpayI/7xqooY9+M2GYnD8AY67UrGJIKaOIo4oyXwhvsXM27xf2ReUpk3QQfCQasXlgdgPa NTxxeae92h3tfeMjXz2Z5k6WzlCjFGEC5pzAgxrhBsg5Z+B3SB5A/Zvc90hRaATCVMXUSa KWsEJhEOR8tRtoXRmX8ay53/cDQ7WagVA1GE36jhMtQ+aM+jExxkC/8aDndUv22asurFT7 2EjC38tTKlbC8UmTze1pDNMTmjCyWLe63rIGkFZDzTBKAJW7vrzyd33Szp6RNSYo7Z6IP4 NMNKlVhxyAkl81oiY/lyv4vOx1ms5FPHlnQUC61B1ntzvHmrPKmvcFu/dN2zaA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1686080558; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=j/QzS4DZr/MAWlGkTC1jPLmonujE+Jd/Z/6pz1neILU=; b=llKXb/Z0YKZYgZscsNP+pc3KEIlk/1hAb6UN/68E4MSW192UDjT3PfjylbVYCqhCOGR+lq vJs1E7KObBSWunCA== From: "tip-bot2 for Tom Lendacky" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/cc] x86/sev: Fix calculation of end address based on number of pages Cc: Tom Lendacky , "Borislav Petkov (AMD)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: =?utf-8?q?=3C6a6e4eea0e1414402bac747744984fa4e9c01bb6=2E16860?= =?utf-8?q?63086=2Egit=2Ethomas=2Elendacky=40amd=2Ecom=3E?= References: =?utf-8?q?=3C6a6e4eea0e1414402bac747744984fa4e9c01bb6=2E168606?= =?utf-8?q?3086=2Egit=2Ethomas=2Elendacky=40amd=2Ecom=3E?= MIME-Version: 1.0 Message-ID: <168608055767.404.11563725377926262842.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/cc branch of tip: Commit-ID: 5dee19b6b2b194216919b99a1f5af2949a754016 Gitweb: https://git.kernel.org/tip/5dee19b6b2b194216919b99a1f5af2949= a754016 Author: Tom Lendacky AuthorDate: Tue, 06 Jun 2023 09:51:22 -05:00 Committer: Borislav Petkov (AMD) CommitterDate: Tue, 06 Jun 2023 18:27:20 +02:00 x86/sev: Fix calculation of end address based on number of pages When calculating an end address based on an unsigned int number of pages, any value greater than or equal to 0x100000 that is shift PAGE_SHIFT bits results in a 0 value, resulting in an invalid end address. Change the number of pages variable in various routines from an unsigned int to an unsigned long to calculate the end address correctly. Fixes: 5e5ccff60a29 ("x86/sev: Add helper for validating pages in early enc= attribute changes") Fixes: dc3f3d2474b8 ("x86/mm: Validate memory when changing the C-bit") Signed-off-by: Tom Lendacky Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/r/6a6e4eea0e1414402bac747744984fa4e9c01bb6.16= 86063086.git.thomas.lendacky@amd.com --- arch/x86/include/asm/sev.h | 16 ++++++++-------- arch/x86/kernel/sev.c | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index 13dc2a9..7ca5c9e 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -192,12 +192,12 @@ struct snp_guest_request_ioctl; =20 void setup_ghcb(void); void __init early_snp_set_memory_private(unsigned long vaddr, unsigned lon= g paddr, - unsigned int npages); + unsigned long npages); void __init early_snp_set_memory_shared(unsigned long vaddr, unsigned long= paddr, - unsigned int npages); + unsigned long npages); void __init snp_prep_memory(unsigned long paddr, unsigned int sz, enum psc= _op op); -void snp_set_memory_shared(unsigned long vaddr, unsigned int npages); -void snp_set_memory_private(unsigned long vaddr, unsigned int npages); +void snp_set_memory_shared(unsigned long vaddr, unsigned long npages); +void snp_set_memory_private(unsigned long vaddr, unsigned long npages); void snp_set_wakeup_secondary_cpu(void); bool snp_init(struct boot_params *bp); void __init __noreturn snp_abort(void); @@ -212,12 +212,12 @@ static inline int pvalidate(unsigned long vaddr, bool= rmp_psize, bool validate)=20 static inline int rmpadjust(unsigned long vaddr, bool rmp_psize, unsigned = long attrs) { return 0; } static inline void setup_ghcb(void) { } static inline void __init -early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, uns= igned int npages) { } +early_snp_set_memory_private(unsigned long vaddr, unsigned long paddr, uns= igned long npages) { } static inline void __init -early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr, unsi= gned int npages) { } +early_snp_set_memory_shared(unsigned long vaddr, unsigned long paddr, unsi= gned long npages) { } static inline void __init snp_prep_memory(unsigned long paddr, unsigned in= t sz, enum psc_op op) { } -static inline void snp_set_memory_shared(unsigned long vaddr, unsigned int= npages) { } -static inline void snp_set_memory_private(unsigned long vaddr, unsigned in= t npages) { } +static inline void snp_set_memory_shared(unsigned long vaddr, unsigned lon= g npages) { } +static inline void snp_set_memory_private(unsigned long vaddr, unsigned lo= ng npages) { } static inline void snp_set_wakeup_secondary_cpu(void) { } static inline bool snp_init(struct boot_params *bp) { return false; } static inline void snp_abort(void) { } diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index b031244..108bbae 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -645,7 +645,7 @@ static u64 __init get_jump_table_addr(void) return ret; } =20 -static void pvalidate_pages(unsigned long vaddr, unsigned int npages, bool= validate) +static void pvalidate_pages(unsigned long vaddr, unsigned long npages, boo= l validate) { unsigned long vaddr_end; int rc; @@ -662,7 +662,7 @@ static void pvalidate_pages(unsigned long vaddr, unsign= ed int npages, bool valid } } =20 -static void __init early_set_pages_state(unsigned long paddr, unsigned int= npages, enum psc_op op) +static void __init early_set_pages_state(unsigned long paddr, unsigned lon= g npages, enum psc_op op) { unsigned long paddr_end; u64 val; @@ -701,7 +701,7 @@ e_term: } =20 void __init early_snp_set_memory_private(unsigned long vaddr, unsigned lon= g paddr, - unsigned int npages) + unsigned long npages) { /* * This can be invoked in early boot while running identity mapped, so @@ -723,7 +723,7 @@ void __init early_snp_set_memory_private(unsigned long = vaddr, unsigned long padd } =20 void __init early_snp_set_memory_shared(unsigned long vaddr, unsigned long= paddr, - unsigned int npages) + unsigned long npages) { /* * This can be invoked in early boot while running identity mapped, so @@ -879,7 +879,7 @@ static void __set_pages_state(struct snp_psc_desc *data= , unsigned long vaddr, sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC); } =20 -static void set_pages_state(unsigned long vaddr, unsigned int npages, int = op) +static void set_pages_state(unsigned long vaddr, unsigned long npages, int= op) { unsigned long vaddr_end, next_vaddr; struct snp_psc_desc *desc; @@ -904,7 +904,7 @@ static void set_pages_state(unsigned long vaddr, unsign= ed int npages, int op) kfree(desc); } =20 -void snp_set_memory_shared(unsigned long vaddr, unsigned int npages) +void snp_set_memory_shared(unsigned long vaddr, unsigned long npages) { if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) return; @@ -914,7 +914,7 @@ void snp_set_memory_shared(unsigned long vaddr, unsigne= d int npages) set_pages_state(vaddr, npages, SNP_PAGE_STATE_SHARED); } =20 -void snp_set_memory_private(unsigned long vaddr, unsigned int npages) +void snp_set_memory_private(unsigned long vaddr, unsigned long npages) { if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) return;