From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE0F0388379 for ; Wed, 29 Apr 2026 05:14:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777439649; cv=none; b=dCxtpVHq7jGL+bRUPDKjA8f9ZGJQ3mkTAgLkxleC2fqHsbmNFBFQtxJszTriTvTlFj5kO6Q4anl6XDmZgyb5MK4P+6tcAWoRsRdB9yfeknD4jnd21VoMd67k7P/sXdB55N7SlLOHae0NFz9jLaPXKbrlJ1+RcSAnWpiqah2CZcw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777439649; c=relaxed/simple; bh=dItIsPbk/j3Cl3D6WqOm0NerVIalkv5nzvBY3Zn3xvQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HteBbV8KgBjAcA+Q1tb9SOYwycs1q7DhR2Y3aVXkshpnT2lIsdfhS5bbSM/s0+O/KgUopfqjWj/Atg0bRFThYvzx/+IpTK8oJaCActn8+DyhEvdfAY1Whd7QCFQSbfv7NTIDAEdTPHEuaZ8aJznQeI88yXnzdx6vdL+oU5bA438= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=hev.cc; spf=pass smtp.mailfrom=hev.cc; dkim=pass (2048-bit key) header.d=hev-cc.20251104.gappssmtp.com header.i=@hev-cc.20251104.gappssmtp.com header.b=RaP71bfk; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=hev.cc Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hev.cc Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hev-cc.20251104.gappssmtp.com header.i=@hev-cc.20251104.gappssmtp.com header.b="RaP71bfk" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2ab39b111b9so50392495ad.1 for ; Tue, 28 Apr 2026 22:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hev-cc.20251104.gappssmtp.com; s=20251104; t=1777439647; x=1778044447; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=99tLjWOK/mLpAv9uxA8Gv2R+vi67znNvjWmjayf7030=; b=RaP71bfkiykOFpSz7etZdREtpyULq/YII+YILILuAhshL2M6GOcXWXdrogLgFm1JFL K1uP0Al4udjorWRiAVLOi82M4d0LzqM2Gy1BAw2D+3qq1p8bzddRdC7hyZkn5wLUUNRm 16ccIEYshP15EJg7b29StaAAOuCA95z8pkcqwKKUgRmWRvTno9nKLDEl8Na77tdhzCLY YYYOi7osZb74FB0sjxCebDD1UyiJBuN9ObGCuQaefoRywJG/QTKY3qsVROrJNi/vokRo 5LGxP1KQatZeVvJBCS+O7VXKbQWYhOnHinnwn9fmAL0NeXxAAsLMmrOxsdKMTDBhXXz9 EqJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777439647; x=1778044447; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=99tLjWOK/mLpAv9uxA8Gv2R+vi67znNvjWmjayf7030=; b=DEVX2vr3OLlUXyRqbVq8/iXFw1ghetOr//gD7xVG2VEWk2GeeVDvtU9j2QUEl3NKu2 1AG+M8r68yElgOIAL1WoWciFwQCt7DG8JcA/Gwrgr7/NESjrKiDPF2e0Ao59IDV7dOGk jUcyVp14X//uEsAI9jOiyOYFWKd4suMYZa8It/Dc/P7KMvflSp7nXak/SOPFNqGwU7Fd FPp3KB/1oiL7QFA9ezrW47072gwvDEmnhY6ozEeNbvIxrg0OlJ+Vp29yFYO23R9ORuGO xYsxBZQM7czqcoHCYKFMKVxVRHqxkE2qB256HSEPEmHOJXROOkHH2RolW+T2x++PLLe6 sj2A== X-Forwarded-Encrypted: i=1; AFNElJ8/Kw8KnrXMdsNDVRGnw2t7N8ZeX7YHpoPGSo+xPZif6MGOKKEWzNHzwzLBhOjGjrtV2+wZmNi7987Xqq4=@vger.kernel.org X-Gm-Message-State: AOJu0Yx2QQX1NJSqIaD7niDpUjcvbpBLH8WH4fLCQo1Af5ApEJMQaHLA tK53vMC4bvb4maR2YzQnUh3jb72+1jCmmJBVxi/7YjbQBNKZqeiDvtPzb5zNLLhBYQo= X-Gm-Gg: AeBDiesdYc83Lnsq1qpmHE0kWOc9E7FvxCKgwkLY7Zh2XRXUerNRxxTuzc2CEG5A6pT 4kZUUkdabV/95gxn38HEDEJscbCbCiANCk0/8nEujDFQChO8WQgWsluD0bzC2vCrkw+2dUQEVDt SX16OFzZO20okvOdgO0NVkT43Bm0Va012n9lMXjoKySJHsvAeJ5xdJNNjLimmTa9VsqaLsBBoFQ NreoPOwzed1287/ltonwpuamic6GPjIb4rQ/arR2RmcAN1kKc7au4c2cnIfIaP3B772TtVseXlJ DJ2uuoqqwXhjkGbyhzkxUqcyEDq1iGhQudt0axrwFPehB2c7k9RQvZjbxcgMsqmikFdSAq05P6/ ohZA5zVjnsc0GLvsOFzQUr2J1E4whKtVyMx6uVzXfG6zwCUVVpXAd7mIesegVh+5n+b2KRtlDf2 SmSjk25qbYDZod8MzY7+hC+kDznpgb X-Received: by 2002:a17:902:f907:b0:2b2:42b1:adac with SMTP id d9443c01a7336-2b97c412257mr40027755ad.3.1777439647157; Tue, 28 Apr 2026 22:14:07 -0700 (PDT) Received: from localhost ([2400:8902:e002:de33:3dbd:69cf:4a22:309]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b988787360sm8846935ad.20.2026.04.28.22.14.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Apr 2026 22:14:06 -0700 (PDT) From: WANG Rui To: Huacai Chen , Ard Biesheuvel Cc: WANG Xuerui , Ilias Apalodimas , Haiyong Sun , Lisa Robinson , loongarch@lists.linux.dev, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, WANG Rui Subject: [PATCH v3 3/3] LoongArch: Avoid initrd overlap during kernel relocation Date: Wed, 29 Apr 2026 13:13:18 +0800 Message-ID: <20260429051318.1581350-4-r@hev.cc> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260429051318.1581350-1-r@hev.cc> References: <20260429051318.1581350-1-r@hev.cc> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Validate the relocation address against the initrd region specified via "initrd=" or "initrdmem=" on the command line. Reject relocation targets that overlap the initrd to prevent memory corruption during early boot. Signed-off-by: WANG Rui --- arch/loongarch/kernel/relocate.c | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/arch/loongarch/kernel/relocate.c b/arch/loongarch/kernel/relocate.c index c36604a81d08..c303c0be8f06 100644 --- a/arch/loongarch/kernel/relocate.c +++ b/arch/loongarch/kernel/relocate.c @@ -214,14 +214,59 @@ static inline void __init *determine_relocation_address(void) return RELOCATED_KASLR(destination); } +static unsigned long __init try_get_initrd(unsigned long *size) +{ + unsigned long start = 0; + unsigned int key_length; + const char *key; + char *p; + + key = "initrd="; + key_length = strlen(key); + p = strstr(boot_command_line, key); + + if (!p) { + key = "initrdmem="; + key_length = strlen(key); + p = strstr(boot_command_line, key); + } + + if (p == boot_command_line || (p > boot_command_line && *(p - 1) == ' ')) { + char *endp; + + p += key_length; + start = memparse(p, &endp); + if (*endp == ',') + *size = memparse(endp + 1, NULL); + } + + return start; +} + static inline int __init relocation_addr_valid(void *location_new) { + unsigned long initrd_start; + unsigned long initrd_size = 0; + if ((unsigned long)location_new & 0x00000ffff) return 0; /* Inappropriately aligned new location */ if ((unsigned long)location_new < (unsigned long)_end) return 0; /* New location overlaps original kernel */ + initrd_start = try_get_initrd(&initrd_size); + if (initrd_start && initrd_size) { + unsigned long kernel_start; + unsigned long kernel_size; + + kernel_start = PHYSADDR(location_new); + kernel_size = (unsigned long)_end - (unsigned long)_text; + + if (kernel_start < (initrd_start + initrd_size) && + initrd_start < (kernel_start + kernel_size)) + return 0; /* Initrd overlaps kernel */ + } + return 1; } #endif -- 2.54.0