From patchwork Sat Nov 17 09:18:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999261 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="SbLup1Wg"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqKB6pyrz9s5c for ; Sat, 17 Nov 2018 20:18:38 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id A8CF9C220CD; Sat, 17 Nov 2018 09:18:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 138CFC220CD; Sat, 17 Nov 2018 09:18:32 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7E187C220CD; Sat, 17 Nov 2018 09:18:31 +0000 (UTC) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by lists.denx.de (Postfix) with ESMTPS id 29216C22014 for ; Sat, 17 Nov 2018 09:18:31 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id g131so383330wmg.3 for ; Sat, 17 Nov 2018 01:18:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MnHQ79G65Wy9lKRoKnQ8YC6XLpvneApKcFzCmAJ8X8Q=; b=SbLup1WgnooMYDXEODz9IwI44rZ4u0G+iWzbXpe8MiMVRciuyt8LOhG4zOizyfY3JN YsA3TpDdg1LTws6MbUpA5UzyRrlkddBko10VALaApVsaPPH7JPVnhyLhnxOtvH3rIEWr GVcaw6XwE2J7+0AE9EAD1tkwoSv9K1Uj5G+1rDvt4vtPjFOFgz0A9g9esD2Zw22L+IEQ FndnfGG4r9n0S0kgEK0J113b6byJa4PUbaRlROOXtWrJXaApvwf1Q0238O0u9hII4kBG 4Lh5DT8ydoLsvYZYXWKBlYUjW5T/oDpi6zM5WBRp+GWtlwjNadS5SOnrywYKQQKFro3G UwNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MnHQ79G65Wy9lKRoKnQ8YC6XLpvneApKcFzCmAJ8X8Q=; b=FcDW7Qd0cj/vIh/V4b9pNPqUmY5QemeeGOBz5JLvb4r5ev+Z3pHAMqv/Kl4ebVLp6i BZrKpLQ0xFh9u1KBJVjwcvd56I23Pipa8lqWmKqBLM45xTLiU6ckEwvXYdbmd7LTvIsk augNTmmgDZSIdvGesAylnZ+k/ITUYjZhw78A6DkTcpOYmBogfkmxysi/fZqoQNvt5QSw eEtATzLGBrbr2eP95D3pRZdClaEKDH2oJvQOhG4AMDcJGnJog7eG7wpqo90O4klZ5cxn 4KDH/6DR68YebdTIFaeWEbSd/mUKPbi7gSMBonOrMprBg0a2kle4bezrycw8YrbEsdH0 F8yQ== X-Gm-Message-State: AGRZ1gLvKcNEsMiLJ1ImTHjTmCxss9iOE2pQFepZPAnUq96u7nr+BIXh htn6zNIQtrQyxyiQCEGPIFk= X-Google-Smtp-Source: AFSGD/UTqBNqUvGBPlQB7ND5KW2w4g/kWIxvau5+P9u6DJOfQmXcVKB+YM9zN5xxXn7BlXqWjgt96Q== X-Received: by 2002:a1c:9f01:: with SMTP id i1-v6mr1139336wme.8.1542446310736; Sat, 17 Nov 2018 01:18:30 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:29 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:11 +0100 Message-Id: <20181117091818.15393-2-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Heinrich Schuchardt , Andrea Barisani Subject: [U-Boot] [PATCH v2 1/8] lib: lmb: reserving overlapping regions should fail X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" lmb_add_region handles overlapping regions wrong: instead of merging or rejecting to add a new reserved region that overlaps an existing one, it just adds the new region. Since internally the same function is used for lmb_alloc, change lmb_add_region to reject overlapping regions. Signed-off-by: Simon Goldschmidt --- Changes in v2: None lib/lmb.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/lmb.c b/lib/lmb.c index 1705417348..8dc703d996 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -136,6 +136,9 @@ static long lmb_add_region(struct lmb_region *rgn, phys_addr_t base, phys_size_t rgn->region[i].size += size; coalesced++; break; + } else if (lmb_addrs_overlap(base, size, rgnbase, rgnsize)) { + /* regions overlap */ + return -1; } } From patchwork Sat Nov 17 09:18:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999262 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="NVdDCG52"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqLB5SsRz9s5c for ; Sat, 17 Nov 2018 20:19:30 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 41E8FC222CC; Sat, 17 Nov 2018 09:19:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A5766C222DE; Sat, 17 Nov 2018 09:18:41 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id DB37AC22313; Sat, 17 Nov 2018 09:18:36 +0000 (UTC) Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by lists.denx.de (Postfix) with ESMTPS id 1F419C222E3 for ; Sat, 17 Nov 2018 09:18:33 +0000 (UTC) Received: by mail-wm1-f68.google.com with SMTP id 124-v6so792821wmw.0 for ; Sat, 17 Nov 2018 01:18:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=WS07eggGoTW69Ho4qw3zxggNdwUk9Sx4SiMCLxiY2uw=; b=NVdDCG52KfRKqaxg2ico1IfkLzCmJf98eQFgfPU/fQRErm7TfKfhe5EhREyWgzKUxq jk9+8sPljBGcya95gdOadFnjudVI57706+5mygVCCNQf/utSVwwynz7a1Qz6HAIi1Yls SsaZkpDUpnm4zBPU7mjOThFwdB4RvJZF0vVXUG0hNFWn7eh0AcDzoV8xzPAtxURavGtN ToxfRj/LotUhZUdPsrX3hRI8VEmWGr6Z5yrLbRHj10GLzolcC2b0+B28vnO98R8bt0Q3 idV8V35EPe/+f1FCjN/q7Eg66OfuAoOo2AtFvcRPd+EkOclvYkuKugTDZGdtUzI0GoGk xpsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=WS07eggGoTW69Ho4qw3zxggNdwUk9Sx4SiMCLxiY2uw=; b=cyOOM3IO+0kxx2sy3/QHCkF0+E7XGUFHNWpRMs8bWP/lRdI4318BGOSgVdAb6WBLnl +YQEJHX0XRDxNTGpg9x8LQh3QPV7aJ0oi5g1W/WqJbVtacYEIXv607git/Ffk6H+ArYH kTt97wRVXfCA32bqVAova/s0tgFccI3njC4qV6Iv1+AyszaFE+EmuEsFGas8wsxvonEf jj6KKKruI5A2efnh7EEj1JY6UVXNzTAl+pPgIgazZKKKbYUketFJ3smEsgXreghCPo6l HEwAicf0RTisx9A7ifY46i4RjM1NhTJMuYWVBksGYEFJynnLVoKW4T1qGF1EBvOixbll QXzw== X-Gm-Message-State: AA+aEWZjHF9O1Sk0albl3JQS6oIB6owJvfin3QF0ohWNJWPhgsQ7XZKL 80xm6+MoR8C6oAsK5DaNsvw= X-Google-Smtp-Source: AJdET5fX2PdkwIsp1OilS32cdGkMS9b1CW5pkAvAevZlSSZIZ1/z03pOwn0JHzc55GZyCrC7WzCQ4A== X-Received: by 2002:a1c:ef0c:: with SMTP id n12-v6mr1094059wmh.55.1542446312668; Sat, 17 Nov 2018 01:18:32 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:31 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:12 +0100 Message-Id: <20181117091818.15393-3-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Alexey Brodkin , Heinrich Schuchardt , Alexander Graf , Andrea Barisani Subject: [U-Boot] [PATCH v2 2/8] fdt: parse "reserved-memory" for memory reservation X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" boot_fdt_add_mem_rsv_regions() adds reserved memory sections to an lmb struct. Currently, it only parses regions described by /memreserve/ entries. Extend this to the more commonly used scheme of the "reserved-memory" node. Signed-off-by: Simon Goldschmidt Reviewed-by: Simon Glass --- Changes in v2: - this patch is new in v2 common/image-fdt.c | 52 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/common/image-fdt.c b/common/image-fdt.c index 95748f0ae1..65984c3c98 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -67,30 +68,65 @@ static const image_header_t *image_get_fdt(ulong fdt_addr) } #endif +static void boot_fdt_reserve_region(struct lmb *lmb, uint64_t addr, + uint64_t size) +{ + int ret; + + ret = lmb_reserve(lmb, addr, size); + if (!ret) + debug(" reserving fdt memory region: addr=%llx size=%llx\n", + (unsigned long long)addr, (unsigned long long)size); + else + puts("ERROR: reserving fdt memory region failed "); + printf("(addr=%llx size=%llx)\n", + (unsigned long long)addr, (unsigned long long)size); +} + /** - * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable + * boot_fdt_add_mem_rsv_regions - Mark the memreserve and reserved-memory + * sections as unusable * @lmb: pointer to lmb handle, will be used for memory mgmt * @fdt_blob: pointer to fdt blob base address * - * Adds the memreserve regions in the dtb to the lmb block. Adding the - * memreserve regions prevents u-boot from using them to store the initrd - * or the fdt blob. + * Adds the and reserved-memorymemreserve regions in the dtb to the lmb block. + * Adding the memreserve regions prevents u-boot from using them to store the + * initrd or the fdt blob. */ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) { uint64_t addr, size; - int i, total; + int i, total, ret; + int nodeoffset, subnode; + struct fdt_resource res; if (fdt_check_header(fdt_blob) != 0) return; + /* process memreserve sections */ total = fdt_num_mem_rsv(fdt_blob); for (i = 0; i < total; i++) { if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0) continue; - printf(" reserving fdt memory region: addr=%llx size=%llx\n", - (unsigned long long)addr, (unsigned long long)size); - lmb_reserve(lmb, addr, size); + boot_fdt_reserve_region(lmb, addr, size); + } + + /* process reserved-memory */ + nodeoffset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory"); + if (nodeoffset >= 0) { + subnode = fdt_first_subnode(fdt_blob, nodeoffset); + while (subnode >= 0) { + /* check if this subnode has a reg property */ + ret = fdt_get_resource(fdt_blob, subnode, "reg", 0, + &res); + if (!ret) { + addr = res.start; + size = res.end - res.start + 1; + boot_fdt_reserve_region(lmb, addr, size); + } + + subnode = fdt_next_subnode(fdt_blob, subnode); + } } } From patchwork Sat Nov 17 09:18:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999263 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bvsFcwwJ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqLj1FFZz9s9m for ; Sat, 17 Nov 2018 20:19:57 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id D7495C2233E; Sat, 17 Nov 2018 09:18:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id C4B72C22333; Sat, 17 Nov 2018 09:18:40 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id CA6C9C22333; Sat, 17 Nov 2018 09:18:37 +0000 (UTC) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by lists.denx.de (Postfix) with ESMTPS id 46774C2230C for ; Sat, 17 Nov 2018 09:18:34 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id r63-v6so776425wma.4 for ; Sat, 17 Nov 2018 01:18:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=erXrpQIDJPsLfEBBlx20usoYhOduK7V9YHV3TT0slpI=; b=bvsFcwwJJS3faU3866bEJ7H1xVutD5Kb4HNmiBchfa7wAjBvXg0SXhS5simfgrP3bp pVsbVw0ytqkxzJrYXFdYdKEKMSKVTXt3bdQOAGiCXNDLR3BOM7vBTv7AxJXYeVNx/Arb JZ3bnPTBbE0ZWHu2bkjz+cvdI+VdFDrngMIZL+kYzstlD1vrQJ0pHW9bGh8DOTHqXco3 o7UqN/fKbl6C6NHGF5ui01S9CjUscb+DFzk4pp/Oz0I3q1DtQoolUDfV20ssumIqsGLg Xp5JRNwm1Some/aYnfJazIvUTe9JOdztMjAh4uagUFiHltwPL4j2tPglIorX95BrcWzD ymFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=erXrpQIDJPsLfEBBlx20usoYhOduK7V9YHV3TT0slpI=; b=eu3sEpqYwaevv20ROKNcqfA2KwY5K/aGRvNKCZt6NEhjEnfax3GBUpfglI18m0uyCU ik+gGfm0c1h+7ivsfxuBMmjpfA0oxMXlXg5gIGZEu4QB0dTv50mO0fHKiINcM84T3Mvj /EieC0bd/v7Zjpr2awQszSqwb+EWAEWg+6H05jn4BF/kM8yE9GIm56Lqle9UAwlT6Jfa 6SK3QysLpwYkbhzVVuNGDYHNtAgWZW5mmDWgKBKMFVj5QVQ/pj5iW08lg1KWVat+B/Nf I00KjjOozPEyUtB6bJUertgR+gM/otgSX8cxzgm+7U0mbp5PisR2gRO7wnA5lSMkV8Vw +xBQ== X-Gm-Message-State: AA+aEWYFKsrv9jsH5ORMBa42DRD4APX9BCrKeqX5K2YxmOWm123X85O2 ifF2R4ez2ipBzDM/CwCbGjI= X-Google-Smtp-Source: AFSGD/WQstOeMWSJ1vY+3OGGKvVxMBH4CCwcUNGa7l2LPv0t4S9+v//WUxLPQ9zMLTvsbOxLJ5SonQ== X-Received: by 2002:a1c:5f8a:: with SMTP id t132mr1127658wmb.40.1542446313879; Sat, 17 Nov 2018 01:18:33 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:32 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:13 +0100 Message-Id: <20181117091818.15393-4-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Heinrich Schuchardt , Andrea Barisani Subject: [U-Boot] [PATCH v2 3/8] lib: lmb: extend lmb for checks at load time X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This adds two new functions, lmb_alloc_addr and lmb_get_unreserved_size. lmb_alloc_addr behaves like lmb_alloc, but it tries to allocate a pre-specified address range. Unlike lmb_reserve, this address range must be inside one of the memory ranges that has been set up with lmb_add. lmb_get_unreserved_size returns the number of bytes that can be used up to the next reserved region or the end of valid ram. This can be 0 if the address passed is reserved. Signed-off-by: Simon Goldschmidt --- Changes in v2: - added lmb_get_unreserved_size() for tftp include/lmb.h | 3 +++ lib/lmb.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/include/lmb.h b/include/lmb.h index f04d058093..7d7e2a78dc 100644 --- a/include/lmb.h +++ b/include/lmb.h @@ -38,6 +38,9 @@ extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align phys_addr_t max_addr); extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phys_addr_t max_addr); +extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, + phys_size_t size); +extern phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr); extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr); extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size); diff --git a/lib/lmb.c b/lib/lmb.c index 8dc703d996..9de1581972 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -324,6 +324,59 @@ phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align, phy return 0; } +/* + * Try to allocate a specific address range: must be in defined memory but not + * reserved + */ +phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base, phys_size_t size) +{ + long j; + + /* Check if the requested address is in one of the memory regions */ + j = lmb_overlaps_region(&lmb->memory, base, size); + if (j >= 0) { + /* + * Check if the requested end address is in the same memory + * region we found. + */ + if (lmb_addrs_overlap(lmb->memory.region[j].base, + lmb->memory.region[j].size, base + size - + 1, 1)) { + /* ok, reserve the memory */ + if (!lmb_reserve(lmb, base, size)) + return base; + } + } + return 0; +} + +/* Return number of bytes from a given address that are free */ +phys_size_t lmb_get_unreserved_size(struct lmb *lmb, phys_addr_t addr) +{ + int i; + long j; + + /* check if the requested address is in the memory regions */ + j = lmb_overlaps_region(&lmb->memory, addr, 1); + if (j >= 0) { + for (i = 0; i < lmb->reserved.cnt; i++) { + if (addr < lmb->reserved.region[i].base) { + /* first reserved range > requested address */ + return lmb->reserved.region[i].base - addr; + } + if (lmb->reserved.region[i].base + + lmb->reserved.region[i].size > addr) { + /* requested addr is in this reserved range */ + return 0; + } + } + /* if we come here: no reserved ranges above requested addr */ + return lmb->memory.region[lmb->memory.cnt - 1].base + + lmb->memory.region[lmb->memory.cnt - 1].size - addr; + } + return 0; +} + int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr) { int i; From patchwork Sat Nov 17 09:18:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999264 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="k8uviprq"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqMg6X6Lz9s5c for ; Sat, 17 Nov 2018 20:20:47 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 7CD84C22340; Sat, 17 Nov 2018 09:19:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id AF79AC222DF; Sat, 17 Nov 2018 09:19:11 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 6EAC6C222F8; Sat, 17 Nov 2018 09:18:41 +0000 (UTC) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by lists.denx.de (Postfix) with ESMTPS id 0BDDBC222DE for ; Sat, 17 Nov 2018 09:18:38 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id k198so338306wmd.3 for ; Sat, 17 Nov 2018 01:18:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o3oXB+hlFAmn76tgQFc0Wh0yDjBFJdOCxSkZN/OpfT0=; b=k8uviprqQHf09xiAEdTJv8u3EfSqm5mdgi21Ilq59baDXoHx7csrNstwE6IBzdjKih AvtFxIGo1Rv0zlTNlQC0M/ytsxEfYnW4epUMBPQv69vxye3xEjyDRECzf4+9tPurhzeg xfQX/xonEgNdKgmI3kM8914OCsIoVdy8B+HTv7zgXDwERcXezhZvLVFNAxwPSWiuWbw6 +JUSUiFuPRs571l8EgghzYX4epPuuIuffYy/aDTCQesztU3qrOfnb+UKBJ3wY4KMNxAX Qo7ESGaQYLppemQDvFQz2YYbTQGyjhC1sJtSahtp2nRAf9cdRCZ1FX1HMk//uTbuc7o+ o5hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o3oXB+hlFAmn76tgQFc0Wh0yDjBFJdOCxSkZN/OpfT0=; b=MPIynBMFSn3WFHHQ+TxuKeIbwJYicKEmwCPl8psY6V5TtIASRXTvY7c/VixMXxh/AZ chOG61C9TmwrLUR6GDu5Xh0EzrbN3xF4bEzqGQWS3BSI+DNC5YSwLxIadR9XdxlWnYKZ 6yYt7FbdOE3Ufr3r1tPZNHLSpjit86gaLwRPQ09RRYnlztV7karutqkNYighiRwCI4NN U6pOsA3AnbAY8JZDrmHO4C637RILwfktNdNVg5mpJVBLY936WXcNdv3sBGdF46kLr5qB aZtu305FLPQGNiJD63R5rqfjf6AW7rFuD8OPXTZ/86LaaP52tqkH2Yb0mcxqRd03FDXD 1AHQ== X-Gm-Message-State: AA+aEWbwC0TbB/HTuxn2hFf9qXwNHgzQR68VBFSyYk/b7e/YIN9PE1Qw SC4ifSKi5dv3kwA19Tlrep4= X-Google-Smtp-Source: AJdET5f1meB3l2UNYHmspRjIoT93Jmiuo0MRmMAyfsEDGrFhV7dDwEY1uRjdVmbpURa5nDkTOtWarQ== X-Received: by 2002:a1c:d14d:: with SMTP id i74mr1043149wmg.100.1542446317703; Sat, 17 Nov 2018 01:18:37 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:37 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:15 +0100 Message-Id: <20181117091818.15393-6-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Heinrich Schuchardt , Alexander Graf , Andrea Barisani Subject: [U-Boot] [PATCH v2 5/8] bootm: use new common function lmb_init_and_reserve X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This reduces duplicate code only. Signed-off-by: Simon Goldschmidt Reviewed-by: Simon Glass --- Changes in v2: None common/bootm.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/common/bootm.c b/common/bootm.c index 8bf84ebcb7..31e4f0f794 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -56,15 +56,11 @@ static void boot_start_lmb(bootm_headers_t *images) ulong mem_start; phys_size_t mem_size; - lmb_init(&images->lmb); - mem_start = env_get_bootm_low(); mem_size = env_get_bootm_size(); - lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size); - - arch_lmb_reserve(&images->lmb); - board_lmb_reserve(&images->lmb); + lmb_init_and_reserve(&images->lmb, (phys_addr_t)mem_start, mem_size, + NULL); } #else #define lmb_reserve(lmb, base, size) From patchwork Sat Nov 17 09:18:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999266 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="irUZGxWK"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqPl6H37z9s5c for ; Sat, 17 Nov 2018 20:22:35 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 8819AC2230C; Sat, 17 Nov 2018 09:19:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A1A05C220CD; Sat, 17 Nov 2018 09:18:55 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 17711C22285; Sat, 17 Nov 2018 09:18:42 +0000 (UTC) Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by lists.denx.de (Postfix) with ESMTPS id 2918CC222F9 for ; Sat, 17 Nov 2018 09:18:39 +0000 (UTC) Received: by mail-wr1-f46.google.com with SMTP id p4so18016813wrt.7 for ; Sat, 17 Nov 2018 01:18:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xGRwyWt8tHpOLMPDYSCO4m/GL2gumsUAtLh87QazDm4=; b=irUZGxWKO5PawGERZY+OZ0T9YI0YE8TyuPiArtmTSlzDTIAzRGyJC1BldYSY6Qjm8p nPVD4spKPTLV+J+csXJXok5gpFeHNF/WrItgZtBV/djI2rnlvL/kp6d/IvFd3nRpIY5+ blpJ/3oxTh43IpkduSK5kHkE9v0Mjc8adPiAg4cJpq1jSniqvWYi7zBJxgkKf9wfxRfy zqzba4guBRoaOonzy1mZXxogKfY5NDtPegpIElJK9a/baIzdMR6oMOfhKRwDRGUmJPdq 0jKrJ08q49yRVi4000La+vfBPdSamcx09EEwXBFXRFOVfhILSBsCVtQGN19dmxVczjzq kuHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xGRwyWt8tHpOLMPDYSCO4m/GL2gumsUAtLh87QazDm4=; b=ucTjU2NVq9xdwgjLWaxOVjor9lc2KbBaG+F+tWhvBiThymZrtWiTMCu3yQmeolpyqQ JltVWCKp1vsWh1APwf4alGtiCraFp5MbhPzzFjacyTh6pCOGFACZeskSibSEdzAUb1KK olSEtEOOMQQoZDGI1Skiy4zx9bX6v55Raa/y3zDedGn01nnsvgkZR3AtO3bdbkqyXWke gPKIRIbRzN07QuzC3eRnm/9nNZZuN1YM3xmtBsigKpA0UNWnruxKUNJdxvbc9Xf5n0zP r4bvswKf9YvqitcN6z61ty+ZELFF2fCb+iUIY9VK43GqMT/G3FOrYIpajFOnhmhdsyMF n0GQ== X-Gm-Message-State: AA+aEWadIG2VFWr4bdpmdLtTCywgE8xj3IW/HIxR2lJsQ72MPp0I9hBY IBgpjZ4rZldprqT3MOIPNE2oGo/7 X-Google-Smtp-Source: AFSGD/W8ohs2eaTyt/mh1WnrKvX+EJVGKDpPfHtSgj35lxp0VIbaBTeXFDSPgwnWPOZaQ/7LHsIbyw== X-Received: by 2002:a5d:4b01:: with SMTP id v1mr6328500wrq.5.1542446318820; Sat, 17 Nov 2018 01:18:38 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:38 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:16 +0100 Message-Id: <20181117091818.15393-7-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Heinrich Schuchardt , Andrea Barisani Subject: [U-Boot] [PATCH v2 6/8] lmb: remove unused extern declaration X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" lmb.h includes an extern declaration of "struct lmb lmb;" which is not used anywhere, so remove it. Signed-off-by: Simon Goldschmidt --- Changes in v2: - this patch is new in v2 include/lmb.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/lmb.h b/include/lmb.h index 62da85e716..1bb003e35e 100644 --- a/include/lmb.h +++ b/include/lmb.h @@ -28,8 +28,6 @@ struct lmb { struct lmb_region reserved; }; -extern struct lmb lmb; - extern void lmb_init(struct lmb *lmb); extern void lmb_init_and_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size, void *fdt_blob); From patchwork Sat Nov 17 09:18:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 999265 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mcuEXa0B"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 42xqNc4fNCz9s5c for ; Sat, 17 Nov 2018 20:21:36 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 49483C22014; Sat, 17 Nov 2018 09:20:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id DD7B8C22363; Sat, 17 Nov 2018 09:19:57 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 607F4C222A2; Sat, 17 Nov 2018 09:18:46 +0000 (UTC) Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by lists.denx.de (Postfix) with ESMTPS id 6CD59C2237C for ; Sat, 17 Nov 2018 09:18:42 +0000 (UTC) Received: by mail-wm1-f65.google.com with SMTP id 124-v6so793096wmw.0 for ; Sat, 17 Nov 2018 01:18:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wbJklMEWa5CLUUElStPiL3CzvYp6HuWNOE9nqyf9RWY=; b=mcuEXa0BoEseTV3zCkw48Lcn67iIO3PBXjrQJSyXBhdBcWa8tq9iQfq1GyY/m17dIf l6bHsYaOfmcRmRQaq8T61suSRbLoRKdYuTTkrd/NMA9cRdjhhfNvBWhz4Oka/aykPDCk yDD9qc16t3vRHSbPffoxA1W8fUoAlezWwkvPMZwC2EWffAlACf08SPjgw4GfSsSD3ebG IjfhI7k84N+yycaq9Mnz6msmrR/lhETQtdIKAcAiD+18+spvOhU7k06gJb+QUyLFmc7x dyIRu1JjcF3VHONKempa0mx6oo5LSjgz9BfU5JK8kSbjQIfnpPqJyEW2SbVOC+VhrYyC ErLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wbJklMEWa5CLUUElStPiL3CzvYp6HuWNOE9nqyf9RWY=; b=lZVy/nEEdjT1WJj9STH0p09LcBwLDO5gqrcS4E6xGCebQVY3ozLvmjM1gLXL2CZiHO uQuu3PsYBiBA0G1bmxDd7BUrh19xU5q1OA/jbrzTLc81WjE010jRxjatzL8btR4oGclK VN3bJWZEBnZ4scv1hOpRJCRCgEwiUroAInEFzcFJpkKEoLLQH3fZp15z/x1GaloRltIO n+rhJVf+6yQ6uV7jw3eP6diVyJrPwlVt7z3/1NXZ87QTz+bzhOqKlqngmTnAwA2QvTmj WX7mLoB2HN4vmgR72EMp2Ke9KSoXQh5QBt5J4Jnrtr1gkpOdNP9P4MlKrivluVeq6WsM klZw== X-Gm-Message-State: AGRZ1gLp2T0Njp1YpMA+Phie3DZOijI8pMI8huWOeYiT30VSepsk0e66 BRNPAl/lquOHs4lqz9JSeog= X-Google-Smtp-Source: AFSGD/VrPd19eookldTW3dA3V23of3r2ieFdi4fFt7TQn+wxC8o0JA+io4Mb5WlnJp6VAiwX4kcRFQ== X-Received: by 2002:a1c:414:: with SMTP id 20mr1068496wme.67.1542446321941; Sat, 17 Nov 2018 01:18:41 -0800 (PST) Received: from ubuntu.home ([2a02:8071:6a3:700:456c:50ae:6b7:768d]) by smtp.gmail.com with ESMTPSA id f18-v6sm30027642wre.57.2018.11.17.01.18.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Nov 2018 01:18:41 -0800 (PST) From: Simon Goldschmidt To: Tom Rini , u-boot@lists.denx.de, Joe Hershberger Date: Sat, 17 Nov 2018 10:18:18 +0100 Message-Id: <20181117091818.15393-9-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> References: <20181117091818.15393-1-simon.k.r.goldschmidt@gmail.com> Cc: Heinrich Schuchardt , Andrea Barisani Subject: [U-Boot] [PATCH v2 8/8] tftp: prevent overwriting reserved memory X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" This fixes CVE-2018-18439 ("insufficient boundary checks in network image boot") by using lmb to check for a valid range to store received blocks. Signed-off-by: Simon Goldschmidt --- Changes in v2: - this patch is new in v2 net/tftp.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/net/tftp.c b/net/tftp.c index 563ce3a06f..390394199d 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -17,6 +17,8 @@ #include #endif +DECLARE_GLOBAL_DATA_PTR; + /* Well known TFTP port # */ #define WELL_KNOWN_PORT 69 /* Millisecs to timeout for lost pkt */ @@ -81,6 +83,8 @@ static ulong tftp_block_wrap; /* memory offset due to wrapping */ static ulong tftp_block_wrap_offset; static int tftp_state; +static ulong tftp_load_addr; +static ulong tftp_load_size; #ifdef CONFIG_TFTP_TSIZE /* The file size reported by the server */ static int tftp_tsize; @@ -134,10 +138,11 @@ static char tftp_filename[MAX_LEN]; static unsigned short tftp_block_size = TFTP_BLOCK_SIZE; static unsigned short tftp_block_size_option = TFTP_MTU_BLOCKSIZE; -static inline void store_block(int block, uchar *src, unsigned len) +static inline int store_block(int block, uchar *src, unsigned int len) { ulong offset = block * tftp_block_size + tftp_block_wrap_offset; ulong newsize = offset + len; + ulong store_addr = tftp_load_addr + offset; #ifdef CONFIG_SYS_DIRECT_FLASH_TFTP int i, rc = 0; @@ -145,30 +150,38 @@ static inline void store_block(int block, uchar *src, unsigned len) /* start address in flash? */ if (flash_info[i].flash_id == FLASH_UNKNOWN) continue; - if (load_addr + offset >= flash_info[i].start[0]) { + if (store_addr >= flash_info[i].start[0]) { rc = 1; break; } } if (rc) { /* Flash is destination for this packet */ - rc = flash_write((char *)src, (ulong)(load_addr+offset), len); + rc = flash_write((char *)src, store_addr, len); if (rc) { flash_perror(rc); - net_set_state(NETLOOP_FAIL); - return; + return rc; } } else #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */ { - void *ptr = map_sysmem(load_addr + offset, len); + void *ptr; + if (store_addr < tftp_load_addr || + store_addr + len > tftp_load_addr + tftp_load_size) { + puts("\nTFTP error: "); + puts("trying to overwrite reserved memory...\n"); + return -1; + } + ptr = map_sysmem(store_addr, len); memcpy(ptr, src, len); unmap_sysmem(ptr); } if (net_boot_file_size < newsize) net_boot_file_size = newsize; + + return 0; } /* Clear our state ready for a new transfer */ @@ -527,7 +540,11 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip, timeout_count_max = tftp_timeout_count_max; net_set_timeout_handler(timeout_ms, tftp_timeout_handler); - store_block(tftp_cur_block - 1, pkt + 2, len); + if (store_block(tftp_cur_block - 1, pkt + 2, len)) { + eth_halt(); + net_set_state(NETLOOP_FAIL); + break; + } /* * Acknowledge the block just received, which will prompt @@ -577,6 +594,24 @@ static void tftp_timeout_handler(void) } } +/* Initialize tftp_load_addr and tftp_load_size from load_addr and lmb */ +static int tftp_init_load_addr(void) +{ + struct lmb lmb; + phys_size_t max_size; + + tftp_load_addr = load_addr; + + lmb_init_and_reserve(&lmb, gd->bd->bi_dram[0].start, + gd->bd->bi_dram[0].size, (void *)gd->fdt_blob); + + max_size = lmb_get_unreserved_size(&lmb, tftp_load_addr); + if (!max_size) + return -1; + + tftp_load_size = max_size; + return 0; +} void tftp_start(enum proto_t protocol) { @@ -673,7 +708,14 @@ void tftp_start(enum proto_t protocol) } else #endif { - printf("Load address: 0x%lx\n", load_addr); + if (tftp_init_load_addr()) { + eth_halt(); + net_set_state(NETLOOP_FAIL); + puts("\nTFTP error: "); + puts("trying to overwrite reserved memory...\n"); + return; + } + printf("Load address: 0x%lx\n", tftp_load_addr); puts("Loading: *\b"); tftp_state = STATE_SEND_RRQ; #ifdef CONFIG_CMD_BOOTEFI @@ -721,9 +763,15 @@ void tftp_start_server(void) { tftp_filename[0] = 0; + if (tftp_init_load_addr()) { + eth_halt(); + net_set_state(NETLOOP_FAIL); + puts("\nTFTP error: trying to overwrite reserved memory...\n"); + return; + } printf("Using %s device\n", eth_get_name()); printf("Listening for TFTP transfer on %pI4\n", &net_ip); - printf("Load address: 0x%lx\n", load_addr); + printf("Load address: 0x%lx\n", tftp_load_addr); puts("Loading: *\b");