From patchwork Mon Nov 7 21:00:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Mamonov X-Patchwork-Id: 692054 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tCPyG5jXCz9t87 for ; Tue, 8 Nov 2016 08:01:58 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bu7Rs4oh"; dkim-atps=neutral Received: from [127.0.0.1] (helo=ra.coresystems.de) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1c3r2T-0001IF-Oo; Mon, 07 Nov 2016 22:01:09 +0100 Received: from mail-lf0-f65.google.com ([209.85.215.65]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1c3r2K-00088H-T3 for flashrom@flashrom.org; Mon, 07 Nov 2016 22:01:07 +0100 Received: by mail-lf0-f65.google.com with SMTP id o20so9776924lfg.3 for ; Mon, 07 Nov 2016 13:01:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=OCEbTT80eBh7uX8gnmS3cc4OzCNo3D/FhrE6lgtnoLI=; b=bu7Rs4ohIscCtRHhxvS9gJZmv+FTIZTHZDI+ttWRt7OiZNBDQcTi0xM1nLzboow7zT 2gEHlFHzWYiZ9o0eVCU03pN0rQtzBbf0bjR83YPynXJRlnMFUL1lBCnVkSKZWLncFFa/ XQ7j914CHz45PBEg4LqRBNTC8JE3YCg7T4DNai6cYqLheUa6vppyEQDLberAYVnOw/RS Ltg3M6WBOcrB4CuRUaTg0YjCPUrmF7NlxcqTMbEpaKjDXrpmF6sBOC/ELcZKN0SNVPbq xDhPfKa0tuldP1x1WEdTSk2dzAgL1kFXFVeeitfO12EmcDrrdjNG93GPeNIYX6RPFHbP BApQ== 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; bh=OCEbTT80eBh7uX8gnmS3cc4OzCNo3D/FhrE6lgtnoLI=; b=j7YvtsV15qIKK2IC3dfL9ZBaU6pQYa+UeNOc6gctNXMrT7CDbbDguwtJhiNi+8FnhD CWRZvt6T+nSqoMygCvb7xwMEeyNimMNNif0rXPJ5wb61quypEpM4SUx5LJfsdvGWnj3l KXfHP5CXlB0N9NS+opcJpOos3v9ti/EfPuIoscKJADWYxWFxqsA3jOuFdBbSbyv+Ti+o T4wy4WjV6uNrSb41LWz0+zEP+/x5S3Fh7TpRsZqQFmQj3KLRyBLcEl6ogN4Ruv7j4Aix KL3BNefv9wCZyGF4qrbRNnZghI8ORRry+uaj6PShDKQ7jh/6wIG1niuJsOhI6G5A5nKd DJYA== X-Gm-Message-State: ABUngvcu0VbrhM7dYP6+YjqiuPQqMSUbSoIdXcEKEcd2496Q1fiAgoP9bpCH4UyaQV8T7w== X-Received: by 10.25.104.2 with SMTP id d2mr4067298lfc.95.1478552459076; Mon, 07 Nov 2016 13:00:59 -0800 (PST) Received: from localhost.localdomain (ppp109-252-62-224.pppoe.spdop.ru. [109.252.62.224]) by smtp.gmail.com with ESMTPSA id e37sm3317024lji.42.2016.11.07.13.00.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 Nov 2016 13:00:58 -0800 (PST) From: Peter Mamonov To: flashrom@flashrom.org Date: Tue, 8 Nov 2016 00:00:39 +0300 Message-Id: <1478552439-16843-1-git-send-email-pmamonov@gmail.com> X-Mailer: git-send-email 2.1.4 X-Spam-Score: -0.7 (/) Subject: [flashrom] [PATCH] RFC: enable flashrom to write images of arbitrary size X-BeenThere: flashrom@flashrom.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: flashrom discussion and development mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: flashrom-bounces@flashrom.org Sender: "flashrom" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff Flashrom restricts an image size to be equal to a ROM capacity. This is inconvenient in case of large and slow ROM chips, when only part of the ROM should be updated. This patch removes this restriction in a quick-and-dirty manner. Signed-off-by: Peter Mamonov --- flashrom.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/flashrom.c b/flashrom.c index d51a44c..f805e00 100644 --- a/flashrom.c +++ b/flashrom.c @@ -1255,30 +1255,30 @@ int read_buf_from_file(unsigned char *buf, unsigned long size, if ((image = fopen(filename, "rb")) == NULL) { msg_gerr("Error: opening file \"%s\" failed: %s\n", filename, strerror(errno)); - return 1; + return -1; } if (fstat(fileno(image), &image_stat) != 0) { msg_gerr("Error: getting metadata of file \"%s\" failed: %s\n", filename, strerror(errno)); fclose(image); - return 1; + return -1; } - if (image_stat.st_size != size) { + if (image_stat.st_size > size) { msg_gerr("Error: Image size (%jd B) doesn't match the flash chip's size (%lu B)!\n", (intmax_t)image_stat.st_size, size); - fclose(image); - return 1; + return -1; } + size = image_stat.st_size; numbytes = fread(buf, 1, size, image); if (fclose(image)) { msg_gerr("Error: closing file \"%s\" failed: %s\n", filename, strerror(errno)); - return 1; + return -1; } if (numbytes != size) { msg_gerr("Error: Failed to read complete file. Got %ld bytes, " "wanted %ld!\n", numbytes, size); - return 1; + return -1; } - return 0; + return size; #endif } @@ -1481,7 +1481,10 @@ static int walk_eraseregions(struct flashctx *flash, int erasefunction, * members so the loop below won't be executed for them. */ len = eraser.eraseblocks[i].size; - for (j = 0; j < eraser.eraseblocks[i].count; j++) { + for (j = 0; + j < eraser.eraseblocks[i].count && + start + len <= flash->chip->total_size * 1024; + j++) { /* Print this for every block except the first one. */ if (i || j) msg_cdbg(", "); @@ -1988,11 +1991,12 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, } if (write_it || verify_it) { - if (read_buf_from_file(newcontents, size, filename)) { + size = read_buf_from_file(newcontents, size, filename); + if (size < 0) { ret = 1; goto out; } - + flash->chip->total_size = size / 1024; /* FIXME */ #if CONFIG_INTERNAL == 1 if (programmer == PROGRAMMER_INTERNAL && cb_check_image(newcontents, size) < 0) { if (force_boardmismatch) {