Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/806976/?format=api
{ "id": 806976, "url": "http://patchwork.ozlabs.org/api/patches/806976/?format=api", "web_url": "http://patchwork.ozlabs.org/project/skiboot/patch/20170829062506.8317-14-cyril.bur@au1.ibm.com/", "project": { "id": 44, "url": "http://patchwork.ozlabs.org/api/projects/44/?format=api", "name": "skiboot firmware development", "link_name": "skiboot", "list_id": "skiboot.lists.ozlabs.org", "list_email": "skiboot@lists.ozlabs.org", "web_url": "http://github.com/open-power/skiboot", "scm_url": "http://github.com/open-power/skiboot", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170829062506.8317-14-cyril.bur@au1.ibm.com>", "list_archive_url": null, "date": "2017-08-29T06:25:06", "name": "[RFC,13/13] external/ffspart: Use new interface", "commit_ref": null, "pull_url": null, "state": "rfc", "archived": false, "hash": "f2eb8e4aa5b2227cd7193297d9e660cda7ac4afd", "submitter": { "id": 64738, "url": "http://patchwork.ozlabs.org/api/people/64738/?format=api", "name": "Cyril Bur", "email": "cyril.bur@au1.ibm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/skiboot/patch/20170829062506.8317-14-cyril.bur@au1.ibm.com/mbox/", "series": [ { "id": 313, "url": "http://patchwork.ozlabs.org/api/series/313/?format=api", "web_url": "http://patchwork.ozlabs.org/project/skiboot/list/?series=313", "date": "2017-08-29T06:24:53", "name": "Rework flash TOC generation", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/313/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/806976/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/806976/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "skiboot@lists.ozlabs.org" ], "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "skiboot@lists.ozlabs.org" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\t(using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xhJxl5gw3z9ryr\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 16:43:39 +1000 (AEST)", "from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 3xhJxl4rW0zDrLy\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 16:43:39 +1000 (AEST)", "from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com\n\t[148.163.158.5])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 3xhJY932g1zDqZq\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:49 +1000 (AEST)", "from pps.filterd (m0098419.ppops.net [127.0.0.1])\n\tby mx0b-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv7T6OCCf025387\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 02:25:43 -0400", "from e23smtp06.au.ibm.com (e23smtp06.au.ibm.com [202.81.31.148])\n\tby mx0b-001b2d01.pphosted.com with ESMTP id 2cmvhgxvh3-1\n\t(version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT)\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 02:25:41 -0400", "from localhost\n\tby e23smtp06.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use\n\tOnly! Violators will be prosecuted\n\tfor <skiboot@lists.ozlabs.org> from <cyril.bur@au1.ibm.com>;\n\tTue, 29 Aug 2017 16:25:38 +1000", "from d23relay10.au.ibm.com (202.81.31.229)\n\tby e23smtp06.au.ibm.com (202.81.31.212) with IBM ESMTP SMTP Gateway:\n\tAuthorized Use Only! Violators will be prosecuted; \n\tTue, 29 Aug 2017 16:25:37 +1000", "from d23av05.au.ibm.com (d23av05.au.ibm.com [9.190.234.119])\n\tby d23relay10.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id\n\tv7T6PaQ018546784\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:36 +1000", "from d23av05.au.ibm.com (localhost [127.0.0.1])\n\tby d23av05.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id\n\tv7T6PatP017758\n\tfor <skiboot@lists.ozlabs.org>; Tue, 29 Aug 2017 16:25:36 +1000", "from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.192.253.14])\n\tby d23av05.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id\n\tv7T6PaTP017752; Tue, 29 Aug 2017 16:25:36 +1000", "from camb691.ozlabs.ibm.com (haven.au.ibm.com [9.192.254.114])\n\t(using TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby ozlabs.au.ibm.com (Postfix) with ESMTPSA id BC00BA0258;\n\tTue, 29 Aug 2017 16:25:35 +1000 (AEST)" ], "From": "Cyril Bur <cyril.bur@au1.ibm.com>", "To": "skiboot@lists.ozlabs.org, stewart@linux.vnet.ibm.com", "Date": "Tue, 29 Aug 2017 16:25:06 +1000", "X-Mailer": "git-send-email 2.14.1", "In-Reply-To": "<20170829062506.8317-1-cyril.bur@au1.ibm.com>", "References": "<20170829062506.8317-1-cyril.bur@au1.ibm.com>", "X-TM-AS-MML": "disable", "x-cbid": "17082906-0040-0000-0000-00000351E323", "X-IBM-AV-DETECTION": "SAVI=unused REMOTE=unused XFE=unused", "x-cbparentid": "17082906-0041-0000-0000-00000CCFDD92", "Message-Id": "<20170829062506.8317-14-cyril.bur@au1.ibm.com>", "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10432:, ,\n\tdefinitions=2017-08-29_01:, , signatures=0", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tspamscore=0 suspectscore=29\n\tmalwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam\n\tadjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000\n\tdefinitions=main-1708290096", "Subject": "[Skiboot] [RFC PATCH 13/13] external/ffspart: Use new interface", "X-BeenThere": "skiboot@lists.ozlabs.org", "X-Mailman-Version": "2.1.23", "Precedence": "list", "List-Id": "Mailing list for skiboot development <skiboot.lists.ozlabs.org>", "List-Unsubscribe": "<https://lists.ozlabs.org/options/skiboot>,\n\t<mailto:skiboot-request@lists.ozlabs.org?subject=unsubscribe>", "List-Archive": "<http://lists.ozlabs.org/pipermail/skiboot/>", "List-Post": "<mailto:skiboot@lists.ozlabs.org>", "List-Help": "<mailto:skiboot-request@lists.ozlabs.org?subject=help>", "List-Subscribe": "<https://lists.ozlabs.org/listinfo/skiboot>,\n\t<mailto:skiboot-request@lists.ozlabs.org?subject=subscribe>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org", "Sender": "\"Skiboot\"\n\t<skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org>" }, "content": "This also updated the pflash tests which use ffspart to generate pnors\n\nSigned-off-by: Cyril Bur <cyril.bur@au1.ibm.com>\n---\n external/ffspart/ffspart.c | 527 +++++++++++++--------\n external/ffspart/test/files/03-tiny-pnor.in | 8 +-\n .../ffspart/test/files/03.1-tiny-pnor-backup.in | 4 -\n .../ffspart/test/files/03.1-tiny-pnor-backup.out | Bin 3840 -> 0 bytes\n external/ffspart/test/files/04-tiny-pnor2.in | 8 +-\n external/ffspart/test/files/05-hdr-overlap.in | 8 +-\n .../ffspart/test/files/05.1-hdr-overlap-backup.in | 3 -\n external/ffspart/test/files/06-small-flash.in | 10 +-\n external/ffspart/test/files/07-big-files.in | 8 +-\n external/ffspart/test/files/08-small-files.in | 8 +-\n external/ffspart/test/files/10-bad-input.in | 8 +-\n external/ffspart/test/files/11-long-name.in | 8 +-\n external/ffspart/test/files/12-bad-numbers-base.in | 8 +-\n external/ffspart/test/files/13-bad-numbers-size.in | 8 +-\n external/ffspart/test/files/14-bad-input-flags.in | 8 +-\n .../test/files/15-overlapping-partitions.in | 8 +-\n external/ffspart/test/results/01-param-sanity.err | 1 -\n external/ffspart/test/results/01-param-sanity.out | 5 -\n .../ffspart/test/results/01.1-param-sanity.err | 0\n .../{02-param-sides.out => 01.1-param-sanity.out} | 5 -\n external/ffspart/test/results/02-param-sides.err | 1 -\n external/ffspart/test/results/05-hdr-overlap.err | 5 +-\n external/ffspart/test/results/05-hdr-overlap.out | 3 -\n .../test/results/05.1-hdr-overlap-backup.err | 2 -\n .../test/results/05.1-hdr-overlap-backup.out | 4 -\n external/ffspart/test/results/06-small-flash.err | 5 +-\n external/ffspart/test/results/06-small-flash.out | 2 -\n external/ffspart/test/results/07-big-files.err | 5 +-\n external/ffspart/test/results/07-big-files.out | 1 -\n external/ffspart/test/results/08-small-files.err | 2 +\n external/ffspart/test/results/08-small-files.out | 4 -\n external/ffspart/test/results/10-bad-input.err | 5 +-\n external/ffspart/test/results/11-long-name.err | 6 +-\n external/ffspart/test/results/11-long-name.out | 4 -\n .../ffspart/test/results/12-bad-numbers-base.err | 5 +-\n .../ffspart/test/results/13-bad-numbers-size.err | 5 +-\n .../ffspart/test/results/14-bad-input-flags.err | 5 +-\n .../test/results/15-overlapping-partitions.err | 5 +-\n .../test/results/15-overlapping-partitions.out | 2 -\n external/ffspart/test/tests/01-param-sanity | 6 +-\n external/ffspart/test/tests/01.1-param-sanity | 12 +\n external/ffspart/test/tests/02-param-sides | 16 -\n external/ffspart/test/tests/03.1-tiny-pnor-backup | 19 -\n external/ffspart/test/tests/05-hdr-overlap | 7 +-\n .../ffspart/test/tests/05.1-hdr-overlap-backup | 19 -\n external/ffspart/test/tests/06-small-flash | 5 +-\n external/ffspart/test/tests/07-big-files | 4 +\n external/ffspart/test/tests/10-bad-input | 2 +\n external/ffspart/test/tests/12-bad-numbers-base | 2 +\n external/ffspart/test/tests/13-bad-numbers-size | 2 +\n external/ffspart/test/tests/14-bad-input-flags | 2 +\n .../ffspart/test/tests/15-overlapping-partitions | 4 +-\n external/pflash/test/files/01-info.ffs | 8 +-\n external/pflash/test/files/02-erase.ffs | 8 +-\n external/pflash/test/files/03-erase-parts.ffs | 8 +-\n external/pflash/test/files/04-program-rand.ffs | 8 +-\n external/pflash/test/files/05-bad-numbers.ffs | 8 +-\n external/pflash/test/files/06-miscprint.ffs | 8 +-\n external/pflash/test/results/06-miscprint.out | 2 +-\n libflash/libffs.c | 5 +-\n 60 files changed, 480 insertions(+), 389 deletions(-)\n delete mode 100644 external/ffspart/test/files/03.1-tiny-pnor-backup.in\n delete mode 100644 external/ffspart/test/files/03.1-tiny-pnor-backup.out\n delete mode 100644 external/ffspart/test/files/05.1-hdr-overlap-backup.in\n create mode 100644 external/ffspart/test/results/01.1-param-sanity.err\n rename external/ffspart/test/results/{02-param-sides.out => 01.1-param-sanity.out} (67%)\n delete mode 100644 external/ffspart/test/results/02-param-sides.err\n delete mode 100644 external/ffspart/test/results/05.1-hdr-overlap-backup.err\n delete mode 100644 external/ffspart/test/results/05.1-hdr-overlap-backup.out\n create mode 100644 external/ffspart/test/tests/01.1-param-sanity\n delete mode 100644 external/ffspart/test/tests/02-param-sides\n delete mode 100644 external/ffspart/test/tests/03.1-tiny-pnor-backup\n delete mode 100644 external/ffspart/test/tests/05.1-hdr-overlap-backup", "diff": "diff --git a/external/ffspart/ffspart.c b/external/ffspart/ffspart.c\nindex 9b66f4fe..0f5d7d6f 100644\n--- a/external/ffspart/ffspart.c\n+++ b/external/ffspart/ffspart.c\n@@ -1,4 +1,4 @@\n-/* Copyright 2013-2016 IBM Corp.\n+/* Copyright 2013-2017 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n@@ -14,6 +14,7 @@\n * limitations under the License.\n */\n \n+#include <ctype.h>\n #include <errno.h>\n #include <fcntl.h>\n #include <getopt.h>\n@@ -50,11 +51,250 @@\n * Lets do 50.\n */\n #define MAX_LINE 100\n+#define MAX_TOCS 10\n #define SEPARATOR ','\n \n /* Full version number (possibly includes gitid). */\n extern const char version[];\n \n+static int read_u32(const char *input, uint32_t *val)\n+{\n+\tchar *endptr;\n+\t*val = strtoul(input, &endptr, 0);\n+\treturn (*endptr == SEPARATOR) ? 0 : 1;\n+}\n+\n+static const char *advance_line(const char *input)\n+{\n+\tchar *pos = strchr(input, SEPARATOR);\n+\tif (!pos)\n+\t\treturn NULL;\n+\treturn pos + 1;\n+}\n+\n+static struct ffs_hdr *parse_toc(const char *line, uint32_t block_size,\n+\t\tuint32_t block_count)\n+{\n+\tstruct ffs_entry_user user;\n+\tstruct ffs_entry *ent;\n+\tstruct ffs_hdr *hdr;\n+\tuint32_t tbase;\n+\tint rc;\n+\n+\tif (read_u32(line, &tbase)) {\n+\t\tfprintf(stderr, \"Couldn't parse TOC base address\\n\");\n+\t\treturn NULL;\n+\t}\n+\n+\tline = advance_line(line);\n+\tif (!line) {\n+\t\tfprintf(stderr, \"Couldn't find TOC flags\\n\");\n+\t\treturn NULL;\n+\t}\n+\n+\trc = ffs_string_to_entry_user(line, strlen(line), &user);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Couldn't parse TOC flags\\n\");\n+\t\treturn NULL;\n+\t}\n+\n+\trc = ffs_entry_new(\"part\", tbase, 0, &ent);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Couldn't make entry for TOC@0x%08x\\n\", tbase);\n+\t\treturn NULL;\n+\t}\n+\n+\trc = ffs_entry_user_set(ent, &user);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Invalid TOC flag\\n\");\n+\t\tffs_entry_put(ent);\n+\t\treturn NULL;\n+\t}\n+\n+\trc = ffs_hdr_new(block_size, block_count, &ent, &hdr);\n+\tif (rc) {\n+\t\thdr = NULL;\n+\t\tfprintf(stderr, \"Couldn't make header for TOC@0x%08x\\n\", tbase);\n+\t}\n+\n+\tffs_entry_put(ent);\n+\treturn hdr;\n+}\n+\n+static int parse_entry(struct blocklevel_device *bl,\n+\t\tstruct ffs_hdr **tocs, const char *line)\n+{\n+\tchar name[FFS_PART_NAME_MAX + 2] = { 0 };\n+\tstruct ffs_entry_user user = { 0 };\n+\tuint32_t pbase, psize, pactual;\n+\tstruct ffs_entry *new_entry;\n+\tstruct stat data_stat;\n+\tconst char *filename;\n+\tbool added = false;\n+\tuint8_t *data_ptr;\n+\tint data_fd, rc;\n+\tchar *pos;\n+\n+\tmemcpy(name, line, FFS_PART_NAME_MAX + 1);\n+\tpos = strchr(name, SEPARATOR);\n+\t/* There is discussion to be had as to if we should bail here */\n+\tif (!pos) {\n+\t\tfprintf(stderr, \"WARNING: Long partition name will get truncated to '%s'\\n\",\n+\t\t\t\tname);\n+\t\tname[FFS_PART_NAME_MAX] = '\\0';\n+\t} else {\n+\t\t*pos = '\\0';\n+\t}\n+\n+\tline = advance_line(line);\n+\tif (!line || read_u32(line, &pbase)) {\n+\t\tfprintf(stderr, \"Couldn't parse '%s' partition base address\\n\",\n+\t\t\t\tname);\n+\t\treturn -1;\n+\t}\n+\n+\tline = advance_line(line);\n+\tif (!line || read_u32(line, &psize)) {\n+\t\tfprintf(stderr, \"Couldn't parse '%s' partition length\\n\",\n+\t\t\t\tname);\n+\t\treturn -1;\n+\t}\n+\n+\tline = advance_line(line);\n+\tif (!line || !advance_line(line)) {\n+\t\tfprintf(stderr, \"Couldn't find '%s' partition flags\\n\",\n+\t\t\t\tname);\n+\t\treturn -1;\n+\t}\n+\n+\trc = ffs_string_to_entry_user(line, advance_line(line) - 1 - line, &user);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Couldn't parse '%s' partition flags\\n\",\n+\t\t\t\tname);\n+\t\treturn -1;\n+\t}\n+\tline = advance_line(line);\n+\t/* Already checked return value */\n+\n+\trc = ffs_entry_new(name, pbase, psize, &new_entry);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Invalid entry '%s' 0x%08x for 0x%08x\\n\",\n+\t\t\t\tname, pbase, psize);\n+\t\treturn -1;\n+\t}\n+\n+\trc = ffs_entry_user_set(new_entry, &user);\n+\tif (rc) {\n+\t\tfprintf(stderr, \"Couldn't set '%s' partition flags\\n\",\n+\t\t\t\tname);\n+\t\tffs_entry_put(new_entry);\n+\t\treturn -1;\n+\t}\n+\n+\tif (has_flag(new_entry, FFS_MISCFLAGS_BACKUP)) {\n+\t\trc = ffs_entry_set_act_size(new_entry, 0);\n+\t\tif (rc) {\n+\t\t\tfprintf(stderr, \"Couldn't set '%s' partition actual size\\n\",\n+\t\t\t\t\tname);\n+\t\t\tffs_entry_put(new_entry);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (!advance_line(line)) {\n+\t\tfprintf(stderr, \"Missing TOC field for '%s' partition\\n\",\n+\t\t\t\tname);\n+\t\tffs_entry_put(new_entry);\n+\t\treturn -1;\n+\t}\n+\n+\twhile (*line != SEPARATOR) {\n+\t\tint toc = *(line++);\n+\n+\t\tif (!isdigit(toc)) {\n+\t\t\tfprintf(stderr, \"Bad TOC value %d (%c) for '%s' partition\\n\",\n+\t\t\t\t\ttoc, toc, name);\n+\t\t\tffs_entry_put(new_entry);\n+\t\t\treturn -1;\n+\t\t}\n+\t\ttoc -= '0';\n+\t\tif (!tocs[toc]) {\n+\t\t\tfprintf(stderr, \"No TOC with ID %d for '%s' partition\\n\",\n+\t\t\t\t\ttoc, name);\n+\t\t\tffs_entry_put(new_entry);\n+\t\t\treturn -1;\n+\t\t}\n+\t\trc = ffs_entry_add(tocs[toc], new_entry);\n+\t\tif (rc) {\n+\t\t\tfprintf(stderr, \"Couldn't add '%s' parition to TOC %d\\n\",\n+\t\t\t\t\tname, toc);\n+\t\t\tffs_entry_put(new_entry);\n+\t\t\treturn rc;\n+\t\t}\n+\t\tadded = true;\n+\t}\n+\tif (!added) {\n+\t\t/*\n+\t\t * They didn't specify a TOC in the TOC field, use\n+\t\t * TOC@0 as the default\n+\t\t */\n+\t\trc = ffs_entry_add(tocs[0], new_entry);\n+\t\tif (rc) {\n+\t\t\tfprintf(stderr, \"Couldn't add '%s' partition to default TOC: %d\\n\",\n+\t\t\t\t\tname, rc);\n+\t\t\tffs_entry_put(new_entry);\n+\t\t\treturn rc;\n+\t\t}\n+\t}\n+\tffs_entry_put(new_entry);\n+\n+\tif (*line != '\\0' && *(line + 1) != '\\0') {\n+\t\tfilename = line + 1;\n+\t\tdata_fd = open(filename, O_RDONLY);\n+\t\tif (data_fd == -1) {\n+\t\t\tfprintf(stderr, \"Couldn't open file '%s' for '%s' partition \"\n+\t\t\t\t\t\"(%m)\\n\", filename, name);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tif (fstat(data_fd, &data_stat) == -1) {\n+\t\t\tfprintf(stderr, \"Couldn't stat file '%s' for '%s' partition \"\n+\t\t\t\t\"(%m)\\n\", filename, name);\n+\t\t\tclose(data_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tpactual = data_stat.st_size;\n+\n+\t\t/*\n+\t\t * Sanity check that the file isn't too large for\n+\t\t * partition\n+\t\t */\n+\t\tif (pactual > psize) {\n+\t\t\tfprintf(stderr, \"File '%s' for partition '%s' is too large\\n\",\n+\t\t\t\t\tfilename, name);\n+\t\t\tclose(data_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tdata_ptr = mmap(NULL, pactual, PROT_READ, MAP_SHARED, data_fd, 0);\n+\t\tif (!data_ptr) {\n+\t\t\tfprintf(stderr, \"Couldn't mmap file '%s' for '%s' partition \"\n+\t\t\t\t\"(%m)\\n\", filename, name);\n+\t\t\tclose(data_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\trc = blocklevel_write(bl, pbase, data_ptr, pactual);\n+\t\tif (rc)\n+\t\t\tfprintf(stderr, \"Couldn't write file '%s' for '%s' partition to PNOR \"\n+\t\t\t\t\t\"(%m)\\n\", filename, name);\n+\t\tmunmap(data_ptr, pactual);\n+\t\tclose(data_fd);\n+\t}\n+\n+\treturn 0;\n+}\n+\n static void print_version(void)\n {\n \tprintf(\"Open-Power FFS format tool %s\\n\", version);\n@@ -77,20 +317,19 @@ static void print_help(const char *pname)\n \n int main(int argc, char *argv[])\n {\n-\tconst char *pname = argv[0];\n-\tstruct blocklevel_device *bl = NULL;\n+\tchar *pnor = NULL, *input = NULL, line[MAX_LINE];\n+\tbool toc_created = false, bad_input = false;\n \tuint32_t block_size = 0, block_count = 0;\n-\tbool bad_input = false;\n-\tchar *pnor = NULL, *input = NULL;\n-\tstruct ffs_hdr *new_hdr;\n+\tstruct ffs_hdr *tocs[MAX_TOCS] = { 0 };\n+\tstruct blocklevel_device *bl = NULL;\n+\tconst char *pname = argv[0];\n+\tint line_number, rc, i;\n \tFILE *in_file;\n-\tchar line[MAX_LINE];\n-\tint rc;\n \n \twhile(1) {\n \t\tstruct option long_opts[] = {\n-\t\t\t{\"block_size\",\trequired_argument,\tNULL,\t's'},\n \t\t\t{\"block_count\",\trequired_argument,\tNULL,\t'c'},\n+\t\t\t{\"block_size\",\trequired_argument,\tNULL,\t's'},\n \t\t\t{\"debug\",\tno_argument,\tNULL,\t'g'},\n \t\t\t{\"input\",\trequired_argument,\tNULL,\t'i'},\n \t\t\t{\"pnor\",\trequired_argument,\tNULL,\t'p'},\n@@ -98,7 +337,7 @@ int main(int argc, char *argv[])\n \t\t};\n \t\tint c, oidx = 0;\n \n-\t\tc = getopt_long(argc, argv, \"c:gi:p:s:\", long_opts, &oidx);\n+\t\tc = getopt_long(argc, argv, \"+:c:gi:p:s:\", long_opts, &oidx);\n \t\tif (c == EOF)\n \t\t\tbreak;\n \t\tswitch(c) {\n@@ -109,50 +348,55 @@ int main(int argc, char *argv[])\n \t\t\tlibflash_debug = true;\n \t\t\tbreak;\n \t\tcase 'i':\n+\t\t\tfree(input);\n \t\t\tinput = strdup(optarg);\n+\t\t\tif (!input)\n+\t\t\t\tfprintf(stderr, \"Out of memory!\\n\");\n \t\t\tbreak;\n \t\tcase 'p':\n+\t\t\tfree(pnor);\n \t\t\tpnor = strdup(optarg);\n+\t\t\tif (!pnor)\n+\t\t\t\tfprintf(stderr, \"Out of memory!\\n\");\n \t\t\tbreak;\n \t\tcase 's':\n \t\t\tblock_size = strtoul(optarg, NULL, 0);\n \t\t\tbreak;\n+\t\tcase ':':\n+\t\t\tfprintf(stderr, \"Unrecognised option \\\"%s\\\" to '%c'\\n\",\n+\t\t\t\t\toptarg, optopt);\n+\t\t\tbad_input = true;\n+\t\t\tbreak;\n+\t\tcase '?':\n+\t\t\tfprintf(stderr, \"Unrecognised option '%c'\\n\", optopt);\n+\t\t\tbad_input = true;\n+\t\t\tbreak;\n \t\tdefault:\n-\t\t\texit(1);\n+\t\t\tfprintf(stderr , \"Encountered unknown error parsing options\\n\");\n+\t\t\tbad_input = true;\n \t\t}\n \t}\n \n-\tif (!block_size || !block_count || !input || !pnor)\n-\t\tbad_input = true;\n-\n-\tif (bad_input) {\n+\tif (bad_input || !block_size || !block_count || !input || !pnor) {\n \t\tprint_help(pname);\n-\t\trc = 1;\n-\t\tgoto out;\n-\t}\n-\n-\trc = ffs_hdr_new(block_size, block_count, NULL, &new_hdr);\n-\tif (rc) {\n-\t\tif (rc == FFS_ERR_BAD_SIZE) {\n-\t\t\t/* Well this check is a tad redudant now */\n-\t\t\tfprintf(stderr, \"Bad parametres passed to libffs\\n\");\n-\t\t} else {\n-\t\t\tfprintf(stderr, \"Error %d initialising new TOC\\n\", rc);\n-\t\t}\n-\t\tgoto out;\n+\t\treturn 1;\n \t}\n \n \tin_file = fopen(input, \"r\");\n \tif (!in_file) {\n-\t\trc = errno;\n-\t\tfprintf(stderr, \"Couldn't open your input file %s because %s\\n\", input, strerror(errno));\n-\t\tgoto out_free_hdr;\n+\t\tfprintf(stderr, \"Couldn't open your input file %s: %m\\n\", input);\n+\t\treturn 2;\n \t}\n \n+\t/*\n+\t * TODO: This won't create the file.\n+\t * We should do this\n+\t */\n \trc = arch_flash_init(&bl, pnor, true);\n \tif (rc) {\n \t\tfprintf(stderr, \"Couldn't initialise architecture flash structures\\n\");\n-\t\tgoto out_close_f;\n+\t\tfclose(in_file);\n+\t\treturn 3;\n \t}\n \n \t/*\n@@ -161,16 +405,14 @@ int main(int argc, char *argv[])\n \t */\n \trc = blocklevel_erase(bl, 0, block_size * block_count);\n \tif (rc) {\n-\t\tfprintf(stderr, \"Couldn't erase file\\n\");\n-\t\tgoto out_close_bl;\n+\t\tfprintf(stderr, \"Couldn't erase '%s' pnor file\\n\", pnor);\n+\t\tfclose(in_file);\n+\t\treturn 4;\n \t}\n \n+\tline_number = 0;\n \twhile (fgets(line, MAX_LINE, in_file) != NULL) {\n-\t\tstruct ffs_entry *new_entry;\n-\t\tstruct ffs_entry_user user = { 0 };\n-\t\tchar *pos, *old_pos;\n-\t\tchar *name, *endptr;\n-\t\tuint32_t pbase, psize, pactual = 0;\n+\t\tline_number++;\n \n \t\t/* Inline comments in input file */\n \t\tif (line[0] == '#')\n@@ -179,180 +421,71 @@ int main(int argc, char *argv[])\n \t\tif (line[strlen(line) - 1] == '\\n')\n \t\t\tline[strlen(line) - 1] = '\\0';\n \n-\t\tpos = strchr(line, SEPARATOR);\n-\t\tif (!pos) {\n-\t\t\tfprintf(stderr, \"Invalid input file format: Couldn't find name\\n\");\n-\t\t\trc = -1;\n-\t\t\tgoto out_close_bl;\n-\t\t}\n-\t\t*pos = '\\0';\n-\t\tname = line;\n-\t\t/* There is discussion to be had as to if we should bail here */\n-\t\tif (pos - line > FFS_PART_NAME_MAX)\n-\t\t\tfprintf(stderr, \"WARNING: Long partition '%s' name will get truncated\\n\",\n-\t\t\t\t\tline);\n-\n-\t\tpos++;\n-\t\told_pos = pos;\n-\t\tpos = strchr(pos, SEPARATOR);\n-\t\tif (!pos) {\n-\t\t\tfprintf(stderr, \"Invalid input file format: Couldn't find base\\n\");\n-\t\t\trc = -1;\n-\t\t\tgoto out_close_bl;\n-\t\t}\n-\t\t*pos = '\\0';\n-\t\tpbase = strtoul(old_pos, &endptr, 0);\n-\t\tif (*endptr != '\\0') {\n-\t\t\tfprintf(stderr, \"Invalid input file format: Couldn't parse \"\n-\t\t\t\t\t\"'%s' partition base address\\n\", name);\n-\t\t\trc = -1;\n-\t\t\tgoto out_close_bl;\n-\t\t}\n-\n-\t\tpos++;\n-\t\told_pos = pos;\n-\t\tpos = strchr(pos, SEPARATOR);\n-\t\tif (!pos) {\n-\t\t\tfprintf(stderr, \"Invalid input file format: Couldn't find size\\n\");\n-\t\t\trc = -1;\n-\t\t\tgoto out_close_bl;\n-\t\t}\n-\t\t*pos = '\\0';\n-\t\tpsize = strtoul(old_pos, &endptr, 0);\n-\t\tif (*endptr != '\\0') {\n-\t\t\tfprintf(stderr, \"Invalid input file format: Couldn't parse \"\n-\t\t\t\t\t\"'%s' partition length\\n\", name);\n-\t\t\trc = -1;\n-\t\t\tgoto out_close_bl;\n-\t\t}\n+\t\tif (line[0] == '@') {\n+\t\t\tint toc_num = line[1];\n+\t\t\trc = 5;\n \n-\t\tpos++;\n-\t\twhile (*pos != '\\0' && *pos != SEPARATOR) {\n-\t\t\tswitch (*pos) {\n-\t\t\tcase 'E':\n-\t\t\t\tuser.datainteg |= FFS_ENRY_INTEG_ECC;\n-\t\t\t\tbreak;\n-\t\t\tcase 'V':\n-\t\t\t\tuser.vercheck |= FFS_VERCHECK_SHA512V;\n-\t\t\t\tbreak;\n-\t\t\tcase 'I':\n-\t\t\t\tuser.vercheck |= FFS_VERCHECK_SHA512EC;\n-\t\t\t\tbreak;\n-\t\t\tcase 'P':\n-\t\t\t\tuser.miscflags |= FFS_MISCFLAGS_PRESERVED;\n-\t\t\t\tbreak;\n-\t\t\tcase 'R':\n-\t\t\t\tuser.miscflags |= FFS_MISCFLAGS_READONLY;\n-\t\t\t\tbreak;\n-\t\t\tcase 'F':\n-\t\t\t\tuser.miscflags |= FFS_MISCFLAGS_REPROVISION;\n-\t\t\t\tbreak;\n-\t\t\t/* Not sure these are valid */\n-\t\t\tcase 'B':\n-\t\t\t\tuser.miscflags |= FFS_MISCFLAGS_BACKUP;\n-\t\t\t\tbreak;\n-\t\t\tdefault:\n-\t\t\t\tfprintf(stderr, \"Unknown flag '%c'\\n\", *pos);\n-\t\t\t\trc = -1;\n-\t\t\t\tgoto out_close_bl;\n+\t\t\tif (!isdigit(toc_num)) {\n+\t\t\t\tfprintf(stderr, \"Invalid TOC ID %d (%c)\\n\",\n+\t\t\t\t\t\ttoc_num, toc_num);\n+\t\t\t\tgoto parse_out;\n \t\t\t}\n-\t\t\tpos++;\n-\t\t}\n-\n-\t\tprintf(\"Adding '%s' 0x%08x, 0x%08x\\n\", name, pbase, psize);\n-\t\trc = ffs_entry_new(name, pbase, psize, &new_entry);\n-\t\tif (rc) {\n-\t\t\tfprintf(stderr, \"Invalid entry '%s' 0x%08x for 0x%08x\\n\",\n-\t\t\t\t\tname, pbase, psize);\n-\t\t\tgoto out_close_bl;\n-\t\t}\n \n-\t\trc = ffs_entry_user_set(new_entry, &user);\n-\t\tif (rc) {\n-\t\t\tfprintf(stderr, \"Invalid flag passed to ffs_entry_user_set\\n\");\n-\t\t\tgoto out_while;\n-\t\t}\n+\t\t\ttoc_num -= '0';\n \n-\t\trc = ffs_entry_add(new_hdr, new_entry);\n-\t\tif (rc) {\n-\t\t\tfprintf(stderr, \"Couldn't add entry '%s' 0x%08x for 0x%08x\\n\",\n-\t\t\t\t\tname, pbase, psize);\n-\t\t\tgoto out_while;\n-\t\t}\n+\t\t\tif (line[2] != SEPARATOR) {\n+\t\t\t\tfprintf(stderr, \"TOC ID too long\\n\");\n+\t\t\t\tgoto parse_out;\n+\t\t\t}\n \n-\t\tif (*pos != '\\0') {\n-\t\t\tstruct stat data_stat;\n-\t\t\tint data_fd;\n-\t\t\tuint8_t *data_ptr;\n-\t\t\tchar *data_fname = pos + 1;\n-\n-\t\t\tdata_fd = open(data_fname, O_RDONLY);\n-\t\t\tif (data_fd == -1) {\n-\t\t\t\tfprintf(stderr, \"Couldn't open data file for partition '%s' (filename: %s)\\n\",\n-\t\t\t\t\t\tname, data_fname);\n-\t\t\t\trc = -1;\n-\t\t\t\tgoto out_while;\n+\t\t\tif (tocs[toc_num]) {\n+\t\t\t\tfprintf(stderr, \"Duplicate TOC ID %d\\n\", toc_num);\n+\t\t\t\tgoto parse_out;\n \t\t\t}\n \n-\t\t\tif (fstat(data_fd, &data_stat) == -1) {\n-\t\t\t\tfprintf(stderr, \"Couldn't stat data file for partition '%s': %s\\n\",\n-\t\t\t\t\t\tname, strerror(errno));\n-\t\t\t\trc = -1;\n-\t\t\t\tgoto out_if;\n+\t\t\ttocs[toc_num] = parse_toc(&line[3], block_size, block_count);\n+\t\t\tif (!tocs[toc_num])\n+\t\t\t\tgoto parse_out;\n+\t\t\ttoc_created = true;\n+\t\t} else {\n+\t\t\tif (!toc_created) {\n+\t\t\t\tfprintf(stderr, \"WARNING: Attempting to parse a partition line without any TOCs created.\\n\");\n+\t\t\t\tfprintf(stderr, \" Generating a default TOC at zero\\n\");\n+\t\t\t\trc = ffs_hdr_new(block_size, block_count, NULL, &tocs[0]);\n+\t\t\t\tif (rc) {\n+\t\t\t\t\trc = 7;\n+\t\t\t\t\tfprintf(stderr, \"Couldn't generate a default TOC at zero\\n\");\n+\t\t\t\t\tgoto parse_out;\n+\t\t\t\t}\n+\t\t\t\ttoc_created = true;\n \t\t\t}\n-\t\t\tpactual = data_stat.st_size;\n-\n-\t\t\t/*\n-\t\t\t * Sanity check that the file isn't too large for\n-\t\t\t * partition\n-\t\t\t */\n-\t\t\tif (pactual > psize) {\n-\t\t\t\tfprintf(stderr, \"Data file for partition '%s' is too large\\n\",\n-\t\t\t\t\t\tname);\n-\t\t\t\trc = -1;\n-\t\t\t\tgoto out_if;\n+\t\t\trc = parse_entry(bl, tocs, line);\n+\t\t\tif (rc) {\n+\t\t\t\trc = 6;\n+\t\t\t\tgoto parse_out;\n \t\t\t}\n+\t\t}\n+\t}\n \n-\t\t\tdata_ptr = mmap(NULL, pactual, PROT_READ, MAP_SHARED, data_fd, 0);\n-\t\t\tif (!data_ptr) {\n-\t\t\t\tfprintf(stderr, \"Couldn't mmap data file for partition '%s': %s\\n\",\n-\t\t\t\t\t\tname, strerror(errno));\n-\t\t\t\trc = -1;\n-\t\t\t\tgoto out_if;\n+\tfor(i = 0; i < MAX_TOCS; i++) {\n+\t\tif (tocs[i]) {\n+\t\t\trc = ffs_hdr_finalise(bl, tocs[i]);\n+\t\t\tif (rc) {\n+\t\t\t\trc = 7;\n+\t\t\t\tfprintf(stderr, \"Failed to write out TOC values\\n\");\n+\t\t\t\tbreak;\n \t\t\t}\n-\n-\t\t\trc = blocklevel_write(bl, pbase, data_ptr, pactual);\n-\t\t\tif (rc)\n-\t\t\t\tfprintf(stderr, \"Couldn't write data file for partition '%s' to pnor file:\"\n-\t\t\t\t\t \" %s\\n\", name, strerror(errno));\n-\n-\t\t\tmunmap(data_ptr, pactual);\n-out_if:\n-\t\t\tclose(data_fd);\n-\t\t\tif (rc)\n-\t\t\t\tgoto out_while;\n-\t\t\t/*\n-\t\t\t * TODO: Update the actual size within the partition table.\n-\t\t\t */\n \t\t}\n-\n-\t\tcontinue;\n-out_while:\n-\t\tffs_entry_put(new_entry);\n-\t\tgoto out_close_bl;\n \t}\n \n-\trc = ffs_hdr_finalise(bl, new_hdr);\n-\tif (rc)\n-\t\tfprintf(stderr, \"Failed to write out TOC values\\n\");\n-\n-out_close_bl:\n+parse_out:\n+\tif (rc == 5 || rc == 6)\n+\t\tfprintf(stderr, \"Failed to parse input file '%s' at line %d\\n\",\n+\t\t\t\tinput, line_number);\n \tarch_flash_close(bl, pnor);\n-out_close_f:\n \tfclose(in_file);\n-out_free_hdr:\n-\tffs_hdr_free(new_hdr);\n-out:\n+\tfor(i = 0; i < MAX_TOCS; i++)\n+\t\tffs_hdr_free(tocs[i]);\n \tfree(input);\n \tfree(pnor);\n \treturn rc;\ndiff --git a/external/ffspart/test/files/03-tiny-pnor.in b/external/ffspart/test/files/03-tiny-pnor.in\nindex 3c02b029..90ad9c27 100644\n--- a/external/ffspart/test/files/03-tiny-pnor.in\n+++ b/external/ffspart/test/files/03-tiny-pnor.in\n@@ -1,4 +1,4 @@\n-ONE,0x00400,0x00000100,EV,/dev/zero\n-TWO,0x00500,0x00000100,EF,/dev/zero\n-THREE,0x600,0x00000100,EF,/dev/zero\n-FOUR,0x0700,0x00000100,EF,/dev/zero\n+ONE,0x00400,0x00000100,EV,,/dev/zero\n+TWO,0x00500,0x00000100,EF,,/dev/zero\n+THREE,0x600,0x00000100,EF,,/dev/zero\n+FOUR,0x0700,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/03.1-tiny-pnor-backup.in b/external/ffspart/test/files/03.1-tiny-pnor-backup.in\ndeleted file mode 100644\nindex b5527503..00000000\n--- a/external/ffspart/test/files/03.1-tiny-pnor-backup.in\n+++ /dev/null\n@@ -1,4 +0,0 @@\n-ONE,0x00400,0x100,EV,/dev/zero\n-TWO,0x00500,0x100,EF,/dev/zero\n-THREE,0x600,0x100,EF,/dev/zero\n-FOUR,0x0700,0x100,EF,/dev/zero\ndiff --git a/external/ffspart/test/files/03.1-tiny-pnor-backup.out b/external/ffspart/test/files/03.1-tiny-pnor-backup.out\ndeleted file mode 100644\nindex e173e9e75451d5359d97aca9e16e411bd255f0eb..0000000000000000000000000000000000000000\nGIT binary patch\nliteral 0\nHcmV?d00001\n\nliteral 3840\nzcmWG=3<_ajU|<Ad79ef_Vm1hufgi|50RfJ|HwqGqN>BtL9G3q;0Azy9VTRBk<ERVz\nz=XLh@`?;bU3bKe1YCjW*4N(B4P*gX7J%}Pi0>@yZ_0N!Se{>zJKmnNjP``teV7H$^\nz09`xr{M9=Qe};GjxuS&tFuvgSgTn%1BK7Tmw_In3n}28!nv2<y><5Pht?b{qKzqHD\nzqqBEtKzsls*@A8229mJ!2M!B}{nSr?EB9=E14?J3U^E0qLtr!nMnhmU1V%$(Xomo_\ngApvSEff@`AKs?(11qK2(FxvhdZT}AK+>Ysb0KP^AFaQ7m\n\ndiff --git a/external/ffspart/test/files/04-tiny-pnor2.in b/external/ffspart/test/files/04-tiny-pnor2.in\nindex 34bfbde9..0369bf66 100644\n--- a/external/ffspart/test/files/04-tiny-pnor2.in\n+++ b/external/ffspart/test/files/04-tiny-pnor2.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,SEDCATCH_1\n-TWO,0x00000400,0x00000100,EF,SEDCATCH_2\n-THREE,0x00000500,0x00000100,EF,SEDCATCH_3\n-FOUR,0x00000600,0x00000100,EF,SEDCATCH_4\n+ONE,0x00000300,0x00000100,EV,,SEDCATCH_1\n+TWO,0x00000400,0x00000100,EF,,SEDCATCH_2\n+THREE,0x00000500,0x00000100,EF,,SEDCATCH_3\n+FOUR,0x00000600,0x00000100,EF,,SEDCATCH_4\ndiff --git a/external/ffspart/test/files/05-hdr-overlap.in b/external/ffspart/test/files/05-hdr-overlap.in\nindex 0dd37116..8af94d2d 100644\n--- a/external/ffspart/test/files/05-hdr-overlap.in\n+++ b/external/ffspart/test/files/05-hdr-overlap.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000200,0x00000100,EV,/dev/zero\n-TWO,0x00000300,0x00000100,EF,/dev/zero\n-THREE,0x00000400,0x00000100,EF,/dev/zero\n-FOUR,0x00000500,0x00000100,EF,/dev/zero\n+ONE,0x00000200,0x00000100,EV,,/dev/zero\n+TWO,0x00000300,0x00000100,EF,,/dev/zero\n+THREE,0x00000400,0x00000100,EF,,/dev/zero\n+FOUR,0x00000500,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/05.1-hdr-overlap-backup.in b/external/ffspart/test/files/05.1-hdr-overlap-backup.in\ndeleted file mode 100644\nindex c6cf6e65..00000000\n--- a/external/ffspart/test/files/05.1-hdr-overlap-backup.in\n+++ /dev/null\n@@ -1,3 +0,0 @@\n-ONE,0x00000200,0x00000100,EV,/dev/zero\n-TWO,0x00000300,0x00000100,EF,/dev/zero\n-THREE,0x00000400,0x00000100,EF,/dev/zero\ndiff --git a/external/ffspart/test/files/06-small-flash.in b/external/ffspart/test/files/06-small-flash.in\nindex a4af6205..a717888b 100644\n--- a/external/ffspart/test/files/06-small-flash.in\n+++ b/external/ffspart/test/files/06-small-flash.in\n@@ -1,5 +1,5 @@\n-ONE,0x00000300,0x00000100,EV,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n-FIVE,0x00000700,0x00000100,EF,/dev/zero\n+ONE,0x00000300,0x00000100,EV,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\n+FIVE,0x00000700,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/07-big-files.in b/external/ffspart/test/files/07-big-files.in\nindex 34bfbde9..0369bf66 100644\n--- a/external/ffspart/test/files/07-big-files.in\n+++ b/external/ffspart/test/files/07-big-files.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,SEDCATCH_1\n-TWO,0x00000400,0x00000100,EF,SEDCATCH_2\n-THREE,0x00000500,0x00000100,EF,SEDCATCH_3\n-FOUR,0x00000600,0x00000100,EF,SEDCATCH_4\n+ONE,0x00000300,0x00000100,EV,,SEDCATCH_1\n+TWO,0x00000400,0x00000100,EF,,SEDCATCH_2\n+THREE,0x00000500,0x00000100,EF,,SEDCATCH_3\n+FOUR,0x00000600,0x00000100,EF,,SEDCATCH_4\ndiff --git a/external/ffspart/test/files/08-small-files.in b/external/ffspart/test/files/08-small-files.in\nindex 34bfbde9..0369bf66 100644\n--- a/external/ffspart/test/files/08-small-files.in\n+++ b/external/ffspart/test/files/08-small-files.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,SEDCATCH_1\n-TWO,0x00000400,0x00000100,EF,SEDCATCH_2\n-THREE,0x00000500,0x00000100,EF,SEDCATCH_3\n-FOUR,0x00000600,0x00000100,EF,SEDCATCH_4\n+ONE,0x00000300,0x00000100,EV,,SEDCATCH_1\n+TWO,0x00000400,0x00000100,EF,,SEDCATCH_2\n+THREE,0x00000500,0x00000100,EF,,SEDCATCH_3\n+FOUR,0x00000600,0x00000100,EF,,SEDCATCH_4\ndiff --git a/external/ffspart/test/files/10-bad-input.in b/external/ffspart/test/files/10-bad-input.in\nindex 6015a521..5c4c90ee 100644\n--- a/external/ffspart/test/files/10-bad-input.in\n+++ b/external/ffspart/test/files/10-bad-input.in\n@@ -1,4 +1,4 @@\n-ONE0x00000300,0x00000100,EV,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE0x00000300,0x00000100,EV,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/11-long-name.in b/external/ffspart/test/files/11-long-name.in\nindex a194de0c..bd32ea89 100644\n--- a/external/ffspart/test/files/11-long-name.in\n+++ b/external/ffspart/test/files/11-long-name.in\n@@ -1,4 +1,4 @@\n-This_is_more_than_15_characters,0x00000300,0x00000100,EV,/dev/zero\n-This_is_exactly,0x00000400,0x00000100,EF,/dev/zero\n-This_is_one_le,0x00000500,0x00000100,EF,/dev/zero\n-This_is_one_more,0x00000600,0x00000100,EF,/dev/zero\n+This_is_more_than_15_characters,0x00000300,0x00000100,EV,,/dev/zero\n+This_is_exactly,0x00000400,0x00000100,EF,,/dev/zero\n+This_is_one_le,0x00000500,0x00000100,EF,,/dev/zero\n+This_is_one_more,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/12-bad-numbers-base.in b/external/ffspart/test/files/12-bad-numbers-base.in\nindex f3de343a..8f6fd27a 100644\n--- a/external/ffspart/test/files/12-bad-numbers-base.in\n+++ b/external/ffspart/test/files/12-bad-numbers-base.in\n@@ -1,4 +1,4 @@\n-ONE,0xg0000300,0x00000100,EV,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE,0xg0000300,0x00000100,EV,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/13-bad-numbers-size.in b/external/ffspart/test/files/13-bad-numbers-size.in\nindex 56fd5df1..b1dacc73 100644\n--- a/external/ffspart/test/files/13-bad-numbers-size.in\n+++ b/external/ffspart/test/files/13-bad-numbers-size.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00001g00,EV,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE,0x00000300,0x00001g00,EV,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/14-bad-input-flags.in b/external/ffspart/test/files/14-bad-input-flags.in\nindex c483f57f..dcf18f24 100644\n--- a/external/ffspart/test/files/14-bad-input-flags.in\n+++ b/external/ffspart/test/files/14-bad-input-flags.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EVZ,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE,0x00000300,0x00000100,EVZ,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/files/15-overlapping-partitions.in b/external/ffspart/test/files/15-overlapping-partitions.in\nindex 47c3837d..e496afa1 100644\n--- a/external/ffspart/test/files/15-overlapping-partitions.in\n+++ b/external/ffspart/test/files/15-overlapping-partitions.in\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/zero\n-TWO,0x00000350,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE,0x00000300,0x00000100,EV,,/dev/zero\n+TWO,0x00000350,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/ffspart/test/results/01-param-sanity.err b/external/ffspart/test/results/01-param-sanity.err\nindex 7b8bb3ba..e69de29b 100644\n--- a/external/ffspart/test/results/01-param-sanity.err\n+++ b/external/ffspart/test/results/01-param-sanity.err\n@@ -1 +0,0 @@\n-Greater than two sides is not supported\ndiff --git a/external/ffspart/test/results/01-param-sanity.out b/external/ffspart/test/results/01-param-sanity.out\nindex 19eedc74..3ad0441d 100644\n--- a/external/ffspart/test/results/01-param-sanity.out\n+++ b/external/ffspart/test/results/01-param-sanity.out\n@@ -11,11 +11,6 @@ Usage: ./ffspart [options] -s size -c num -i layout_file -p pnor_file ...\n \t-i, --input=file\n \t\tFile containing the required partition data\n \n-\t-o, --order=( ADB | ABD )\n-\t\tOrdering of the TOC, Data and Backup TOC. Currently only ADB (default)\n-\t\tis supported\n \t-p, --pnor=file\n \t\tOutput file to write data\n \n-\t-t, --sides=( 1 | 2 )\n-\t\tNumber of sides to the flash (Default: 1)\ndiff --git a/external/ffspart/test/results/01.1-param-sanity.err b/external/ffspart/test/results/01.1-param-sanity.err\nnew file mode 100644\nindex 00000000..e69de29b\ndiff --git a/external/ffspart/test/results/02-param-sides.out b/external/ffspart/test/results/01.1-param-sanity.out\nsimilarity index 67%\nrename from external/ffspart/test/results/02-param-sides.out\nrename to external/ffspart/test/results/01.1-param-sanity.out\nindex 19eedc74..3ad0441d 100644\n--- a/external/ffspart/test/results/02-param-sides.out\n+++ b/external/ffspart/test/results/01.1-param-sanity.out\n@@ -11,11 +11,6 @@ Usage: ./ffspart [options] -s size -c num -i layout_file -p pnor_file ...\n \t-i, --input=file\n \t\tFile containing the required partition data\n \n-\t-o, --order=( ADB | ABD )\n-\t\tOrdering of the TOC, Data and Backup TOC. Currently only ADB (default)\n-\t\tis supported\n \t-p, --pnor=file\n \t\tOutput file to write data\n \n-\t-t, --sides=( 1 | 2 )\n-\t\tNumber of sides to the flash (Default: 1)\ndiff --git a/external/ffspart/test/results/02-param-sides.err b/external/ffspart/test/results/02-param-sides.err\ndeleted file mode 100644\nindex faf9d9ff..00000000\n--- a/external/ffspart/test/results/02-param-sides.err\n+++ /dev/null\n@@ -1 +0,0 @@\n-Invalid block_count 1 for sides 2\ndiff --git a/external/ffspart/test/results/05-hdr-overlap.err b/external/ffspart/test/results/05-hdr-overlap.err\nindex 55f07c6c..ff8aca20 100644\n--- a/external/ffspart/test/results/05-hdr-overlap.err\n+++ b/external/ffspart/test/results/05-hdr-overlap.err\n@@ -1,2 +1,5 @@\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n Adding partition 'THREE' would cause partition 'ONE' at 0x00000200 to overlap with the header\n-Couldn't add entry 'THREE' 0x00000400 for 0x00000100\n+Couldn't add 'THREE' partition to default TOC: 107\n+Failed to parse input file 'FILE' at line 3\ndiff --git a/external/ffspart/test/results/05-hdr-overlap.out b/external/ffspart/test/results/05-hdr-overlap.out\nindex 2dbf5a43..e69de29b 100644\n--- a/external/ffspart/test/results/05-hdr-overlap.out\n+++ b/external/ffspart/test/results/05-hdr-overlap.out\n@@ -1,3 +0,0 @@\n-Adding 'ONE' 0x00000200, 0x00000100\n-Adding 'TWO' 0x00000300, 0x00000100\n-Adding 'THREE' 0x00000400, 0x00000100\ndiff --git a/external/ffspart/test/results/05.1-hdr-overlap-backup.err b/external/ffspart/test/results/05.1-hdr-overlap-backup.err\ndeleted file mode 100644\nindex 55f07c6c..00000000\n--- a/external/ffspart/test/results/05.1-hdr-overlap-backup.err\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-Adding partition 'THREE' would cause partition 'ONE' at 0x00000200 to overlap with the header\n-Couldn't add entry 'THREE' 0x00000400 for 0x00000100\ndiff --git a/external/ffspart/test/results/05.1-hdr-overlap-backup.out b/external/ffspart/test/results/05.1-hdr-overlap-backup.out\ndeleted file mode 100644\nindex dbcdcb1d..00000000\n--- a/external/ffspart/test/results/05.1-hdr-overlap-backup.out\n+++ /dev/null\n@@ -1,4 +0,0 @@\n-Adding 'ONE' 0x00000200, 0x00000100\n-Adding 'TWO' 0x00000300, 0x00000100\n-Adding 'THREE' 0x00000400, 0x00000100\n-Freeing hdr\ndiff --git a/external/ffspart/test/results/06-small-flash.err b/external/ffspart/test/results/06-small-flash.err\nindex a95149bd..a5316a90 100644\n--- a/external/ffspart/test/results/06-small-flash.err\n+++ b/external/ffspart/test/results/06-small-flash.err\n@@ -1 +1,4 @@\n-Couldn't add entry 'TWO' 0x00000400 for 0x00000100\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't add 'TWO' partition to default TOC: 108\n+Failed to parse input file 'FILE' at line 2\ndiff --git a/external/ffspart/test/results/06-small-flash.out b/external/ffspart/test/results/06-small-flash.out\nindex 25214672..e69de29b 100644\n--- a/external/ffspart/test/results/06-small-flash.out\n+++ b/external/ffspart/test/results/06-small-flash.out\n@@ -1,2 +0,0 @@\n-Adding 'ONE' 0x00000300, 0x00000100\n-Adding 'TWO' 0x00000400, 0x00000100\ndiff --git a/external/ffspart/test/results/07-big-files.err b/external/ffspart/test/results/07-big-files.err\nindex f179a53d..083bad20 100644\n--- a/external/ffspart/test/results/07-big-files.err\n+++ b/external/ffspart/test/results/07-big-files.err\n@@ -1 +1,4 @@\n-Data file for partition 'ONE' is too large\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+File 'FILE_ONE' for partition 'ONE' is too large\n+Failed to parse input file 'FILE' at line 1\ndiff --git a/external/ffspart/test/results/07-big-files.out b/external/ffspart/test/results/07-big-files.out\nindex 0555381e..e69de29b 100644\n--- a/external/ffspart/test/results/07-big-files.out\n+++ b/external/ffspart/test/results/07-big-files.out\n@@ -1 +0,0 @@\n-Adding 'ONE' 0x00000300, 0x00000100\ndiff --git a/external/ffspart/test/results/08-small-files.err b/external/ffspart/test/results/08-small-files.err\nindex e69de29b..c902b642 100644\n--- a/external/ffspart/test/results/08-small-files.err\n+++ b/external/ffspart/test/results/08-small-files.err\n@@ -0,0 +1,2 @@\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\ndiff --git a/external/ffspart/test/results/08-small-files.out b/external/ffspart/test/results/08-small-files.out\nindex fdf70bf8..e69de29b 100644\n--- a/external/ffspart/test/results/08-small-files.out\n+++ b/external/ffspart/test/results/08-small-files.out\n@@ -1,4 +0,0 @@\n-Adding 'ONE' 0x00000300, 0x00000100\n-Adding 'TWO' 0x00000400, 0x00000100\n-Adding 'THREE' 0x00000500, 0x00000100\n-Adding 'FOUR' 0x00000600, 0x00000100\ndiff --git a/external/ffspart/test/results/10-bad-input.err b/external/ffspart/test/results/10-bad-input.err\nindex 08d2fcff..01c43d81 100644\n--- a/external/ffspart/test/results/10-bad-input.err\n+++ b/external/ffspart/test/results/10-bad-input.err\n@@ -1 +1,4 @@\n-Invalid input file format: Couldn't parse 'ONE0x00000300' partition length\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't parse 'ONE0x00000300' partition length\n+Failed to parse input file 'FILE' at line 1\ndiff --git a/external/ffspart/test/results/11-long-name.err b/external/ffspart/test/results/11-long-name.err\nindex 824062ec..cf8dcc32 100644\n--- a/external/ffspart/test/results/11-long-name.err\n+++ b/external/ffspart/test/results/11-long-name.err\n@@ -1,2 +1,4 @@\n-WARNING: Long partition 'This_is_more_than_15_characters' name will get truncated\n-WARNING: Long partition 'This_is_one_more' name will get truncated\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+WARNING: Long partition name will get truncated to 'This_is_more_tha'\n+WARNING: Long partition name will get truncated to 'This_is_one_more'\ndiff --git a/external/ffspart/test/results/11-long-name.out b/external/ffspart/test/results/11-long-name.out\nindex 2d7dcb32..e69de29b 100644\n--- a/external/ffspart/test/results/11-long-name.out\n+++ b/external/ffspart/test/results/11-long-name.out\n@@ -1,4 +0,0 @@\n-Adding 'This_is_more_than_15_characters' 0x00000300, 0x00000100\n-Adding 'This_is_exactly' 0x00000400, 0x00000100\n-Adding 'This_is_one_le' 0x00000500, 0x00000100\n-Adding 'This_is_one_more' 0x00000600, 0x00000100\ndiff --git a/external/ffspart/test/results/12-bad-numbers-base.err b/external/ffspart/test/results/12-bad-numbers-base.err\nindex 7312b034..cdd836ea 100644\n--- a/external/ffspart/test/results/12-bad-numbers-base.err\n+++ b/external/ffspart/test/results/12-bad-numbers-base.err\n@@ -1 +1,4 @@\n-Invalid input file format: Couldn't parse 'ONE' partition base address\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't parse 'ONE' partition base address\n+Failed to parse input file 'FILE' at line 1\ndiff --git a/external/ffspart/test/results/13-bad-numbers-size.err b/external/ffspart/test/results/13-bad-numbers-size.err\nindex 592fec20..19078d5d 100644\n--- a/external/ffspart/test/results/13-bad-numbers-size.err\n+++ b/external/ffspart/test/results/13-bad-numbers-size.err\n@@ -1 +1,4 @@\n-Invalid input file format: Couldn't parse 'ONE' partition length\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't parse 'ONE' partition length\n+Failed to parse input file 'FILE' at line 1\ndiff --git a/external/ffspart/test/results/14-bad-input-flags.err b/external/ffspart/test/results/14-bad-input-flags.err\nindex fecdb6ea..613525c3 100644\n--- a/external/ffspart/test/results/14-bad-input-flags.err\n+++ b/external/ffspart/test/results/14-bad-input-flags.err\n@@ -1 +1,4 @@\n-Unknown flag 'Z'\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't parse 'ONE' partition flags\n+Failed to parse input file 'FILE' at line 1\ndiff --git a/external/ffspart/test/results/15-overlapping-partitions.err b/external/ffspart/test/results/15-overlapping-partitions.err\nindex d92f443e..c81d3c0e 100644\n--- a/external/ffspart/test/results/15-overlapping-partitions.err\n+++ b/external/ffspart/test/results/15-overlapping-partitions.err\n@@ -1 +1,4 @@\n-Couldn't add entry 'TWO' 0x00000350 for 0x00000100\n+WARNING: Attempting to parse a partition line without any TOCs created.\n+ Generating a default TOC at zero\n+Couldn't add 'TWO' partition to default TOC: 107\n+Failed to parse input file 'FILE' at line 2\ndiff --git a/external/ffspart/test/results/15-overlapping-partitions.out b/external/ffspart/test/results/15-overlapping-partitions.out\nindex 04e04c30..e69de29b 100644\n--- a/external/ffspart/test/results/15-overlapping-partitions.out\n+++ b/external/ffspart/test/results/15-overlapping-partitions.out\n@@ -1,2 +0,0 @@\n-Adding 'ONE' 0x00000300, 0x00000100\n-Adding 'TWO' 0x00000350, 0x00000100\ndiff --git a/external/ffspart/test/tests/01-param-sanity b/external/ffspart/test/tests/01-param-sanity\nindex 28acf511..d6373600 100644\n--- a/external/ffspart/test/tests/01-param-sanity\n+++ b/external/ffspart/test/tests/01-param-sanity\n@@ -1,10 +1,6 @@\n #! /bin/sh\n \n-#This test has become a little redundant now.\n-#TODO Do more sanity checking\n-return 0\n-\n-run_binary \"./ffspart\" \"-s 1 -c 3 -i /dev/null -p /dev/null\"\n+run_binary \"./ffspart\" \"-c 3 -i /dev/null -p /dev/null\"\n if [ \"$?\" -ne 1 ] ; then\n \tfail_test\n fi\ndiff --git a/external/ffspart/test/tests/01.1-param-sanity b/external/ffspart/test/tests/01.1-param-sanity\nnew file mode 100644\nindex 00000000..1ce1f906\n--- /dev/null\n+++ b/external/ffspart/test/tests/01.1-param-sanity\n@@ -0,0 +1,12 @@\n+#! /bin/sh\n+\n+run_binary \"./ffspart\" \"-s 1 -i /dev/null -p /dev/null\"\n+if [ \"$?\" -ne 1 ] ; then\n+\tfail_test\n+fi\n+\n+strip_version_from_result \"ffspart\"\n+\n+diff_with_result\n+\n+pass_test\ndiff --git a/external/ffspart/test/tests/02-param-sides b/external/ffspart/test/tests/02-param-sides\ndeleted file mode 100644\nindex 17a2461e..00000000\n--- a/external/ffspart/test/tests/02-param-sides\n+++ /dev/null\n@@ -1,16 +0,0 @@\n-#! /bin/sh\n-\n-#The parameter has been removed\n-#TODO Something clever with this test\n-return 0\n-\n-run_binary \"./ffspart\" \"-s 1 -c 1 -i /dev/null -p /dev/null\"\n-if [ \"$?\" -ne 1 ] ; then\n-\tfail_test\n-fi\n-\n-strip_version_from_result \"ffspart\"\n-\n-diff_with_result\n-\n-pass_test\ndiff --git a/external/ffspart/test/tests/03.1-tiny-pnor-backup b/external/ffspart/test/tests/03.1-tiny-pnor-backup\ndeleted file mode 100644\nindex 8fa8d4e4..00000000\n--- a/external/ffspart/test/tests/03.1-tiny-pnor-backup\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-#! /bin/sh\n-\n-#The backup partition flag is gone\n-#disable this test temporarily\n-return 0\n-\n-touch $DATA_DIR/$CUR_TEST.gen\n-\n-run_binary \"./ffspart\" \"-b -s 0x100 -c 15 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen\"\n-if [ \"$?\" -ne 0 ] ; then\n-\tfail_test\n-fi\n-\n-if ! cmp -n $((0x100)) $DATA_DIR/$CUR_TEST.out $DATA_DIR/$CUR_TEST.gen ; then\n-\techo \"Output differs\"\n-\tfail_test\n-fi\n-\n-pass_test\ndiff --git a/external/ffspart/test/tests/05-hdr-overlap b/external/ffspart/test/tests/05-hdr-overlap\nindex 2fa050b1..39a1a140 100644\n--- a/external/ffspart/test/tests/05-hdr-overlap\n+++ b/external/ffspart/test/tests/05-hdr-overlap\n@@ -3,13 +3,12 @@\n touch $DATA_DIR/$CUR_TEST.gen\n \n run_binary \"./ffspart\" \"-s 0x100 -c 10 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen\"\n-#expect this error code, which is FFS_ERR_BAD_PART_BASE becase we're\n-#going to have too many partitions for header to fit before the first\n-#partition\n-if [ \"$?\" -ne 107 ] ; then\n+if [ \"$?\" -ne 6 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/05.1-hdr-overlap-backup b/external/ffspart/test/tests/05.1-hdr-overlap-backup\ndeleted file mode 100644\nindex 0cbd9fa4..00000000\n--- a/external/ffspart/test/tests/05.1-hdr-overlap-backup\n+++ /dev/null\n@@ -1,19 +0,0 @@\n-#! /bin/sh\n-\n-#The backup partition flag is gone\n-#disable this test temporarily\n-return 0\n-\n-touch $DATA_DIR/$CUR_TEST.gen\n-\n-run_binary \"./ffspart\" \"-s 0x100 -c 10 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen\"\n-#expect this error code, which is FFS_ERR_BAD_PART_BASE becase we're\n-#going to have too many partitions for header to fit before the first\n-#partition\n-if [ \"$?\" -ne 107 ] ; then\n-\tfail_test\n-fi\n-\n-diff_with_result\n-\n-pass_test\ndiff --git a/external/ffspart/test/tests/06-small-flash b/external/ffspart/test/tests/06-small-flash\nindex b49f4578..7c41e33f 100644\n--- a/external/ffspart/test/tests/06-small-flash\n+++ b/external/ffspart/test/tests/06-small-flash\n@@ -2,11 +2,12 @@\n touch $DATA_DIR/$CUR_TEST.gen\n \n run_binary \"./ffspart\" \"-s 0x100 -c 4 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen\"\n-#Expect FFS_ERR_BAD_PART_SIZE because the flash is too small\n-if [ \"$?\" -ne 108 ] ; then\n+if [ \"$?\" -ne 6 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/07-big-files b/external/ffspart/test/tests/07-big-files\nindex 2381824f..f7a0064d 100644\n--- a/external/ffspart/test/tests/07-big-files\n+++ b/external/ffspart/test/tests/07-big-files\n@@ -17,6 +17,10 @@ if [ \"$?\" -eq 0 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.1|FILE_ONE|\" \"$STDERR_OUT\"\n+\n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/10-bad-input b/external/ffspart/test/tests/10-bad-input\nindex e2f418ce..d7c43326 100644\n--- a/external/ffspart/test/tests/10-bad-input\n+++ b/external/ffspart/test/tests/10-bad-input\n@@ -6,6 +6,8 @@ if [ \"$?\" -eq 0 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/12-bad-numbers-base b/external/ffspart/test/tests/12-bad-numbers-base\nindex e2f418ce..d7c43326 100644\n--- a/external/ffspart/test/tests/12-bad-numbers-base\n+++ b/external/ffspart/test/tests/12-bad-numbers-base\n@@ -6,6 +6,8 @@ if [ \"$?\" -eq 0 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/13-bad-numbers-size b/external/ffspart/test/tests/13-bad-numbers-size\nindex e2f418ce..d7c43326 100644\n--- a/external/ffspart/test/tests/13-bad-numbers-size\n+++ b/external/ffspart/test/tests/13-bad-numbers-size\n@@ -6,6 +6,8 @@ if [ \"$?\" -eq 0 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/14-bad-input-flags b/external/ffspart/test/tests/14-bad-input-flags\nindex e2f418ce..d7c43326 100644\n--- a/external/ffspart/test/tests/14-bad-input-flags\n+++ b/external/ffspart/test/tests/14-bad-input-flags\n@@ -6,6 +6,8 @@ if [ \"$?\" -eq 0 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/ffspart/test/tests/15-overlapping-partitions b/external/ffspart/test/tests/15-overlapping-partitions\nindex 26c24d00..6d85748d 100644\n--- a/external/ffspart/test/tests/15-overlapping-partitions\n+++ b/external/ffspart/test/tests/15-overlapping-partitions\n@@ -2,10 +2,12 @@\n touch $DATA_DIR/$CUR_TEST.gen\n \n run_binary \"./ffspart\" \"-s 0x100 -c 10 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen\"\n-if [ \"$?\" -ne 107 ] ; then\n+if [ \"$?\" -ne 6 ] ; then\n \tfail_test\n fi\n \n+sed -i \"s|$DATA_DIR/$CUR_TEST.in|FILE|\" \"$STDERR_OUT\"\n+\n diff_with_result\n \n pass_test\ndiff --git a/external/pflash/test/files/01-info.ffs b/external/pflash/test/files/01-info.ffs\nindex 517dc47b..a22143a3 100644\n--- a/external/pflash/test/files/01-info.ffs\n+++ b/external/pflash/test/files/01-info.ffs\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/zero\n-TWO,0x00000400,0x00000100,EF,/dev/zero\n-THREE,0x00000500,0x00000100,EF,/dev/zero\n-FOUR,0x00000600,0x00000100,EF,/dev/zero\n+ONE,0x00000300,0x00000100,EV,,/dev/zero\n+TWO,0x00000400,0x00000100,EF,,/dev/zero\n+THREE,0x00000500,0x00000100,EF,,/dev/zero\n+FOUR,0x00000600,0x00000100,EF,,/dev/zero\ndiff --git a/external/pflash/test/files/02-erase.ffs b/external/pflash/test/files/02-erase.ffs\nindex 7efcd717..ff64d4e6 100644\n--- a/external/pflash/test/files/02-erase.ffs\n+++ b/external/pflash/test/files/02-erase.ffs\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/urandom\n-TWO,0x00000400,0x00000100,EF,/dev/urandom\n-THREE,0x00000500,0x00000100,EF,/dev/urandom\n-FOUR,0x00000600,0x00000100,EF,/dev/urandom\n+ONE,0x00000300,0x00000100,EV,,/dev/urandom\n+TWO,0x00000400,0x00000100,EF,,/dev/urandom\n+THREE,0x00000500,0x00000100,EF,,/dev/urandom\n+FOUR,0x00000600,0x00000100,EF,,/dev/urandom\ndiff --git a/external/pflash/test/files/03-erase-parts.ffs b/external/pflash/test/files/03-erase-parts.ffs\nindex 7efcd717..ff64d4e6 100644\n--- a/external/pflash/test/files/03-erase-parts.ffs\n+++ b/external/pflash/test/files/03-erase-parts.ffs\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/urandom\n-TWO,0x00000400,0x00000100,EF,/dev/urandom\n-THREE,0x00000500,0x00000100,EF,/dev/urandom\n-FOUR,0x00000600,0x00000100,EF,/dev/urandom\n+ONE,0x00000300,0x00000100,EV,,/dev/urandom\n+TWO,0x00000400,0x00000100,EF,,/dev/urandom\n+THREE,0x00000500,0x00000100,EF,,/dev/urandom\n+FOUR,0x00000600,0x00000100,EF,,/dev/urandom\ndiff --git a/external/pflash/test/files/04-program-rand.ffs b/external/pflash/test/files/04-program-rand.ffs\nindex 7efcd717..ff64d4e6 100644\n--- a/external/pflash/test/files/04-program-rand.ffs\n+++ b/external/pflash/test/files/04-program-rand.ffs\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/urandom\n-TWO,0x00000400,0x00000100,EF,/dev/urandom\n-THREE,0x00000500,0x00000100,EF,/dev/urandom\n-FOUR,0x00000600,0x00000100,EF,/dev/urandom\n+ONE,0x00000300,0x00000100,EV,,/dev/urandom\n+TWO,0x00000400,0x00000100,EF,,/dev/urandom\n+THREE,0x00000500,0x00000100,EF,,/dev/urandom\n+FOUR,0x00000600,0x00000100,EF,,/dev/urandom\ndiff --git a/external/pflash/test/files/05-bad-numbers.ffs b/external/pflash/test/files/05-bad-numbers.ffs\nindex 7efcd717..ff64d4e6 100644\n--- a/external/pflash/test/files/05-bad-numbers.ffs\n+++ b/external/pflash/test/files/05-bad-numbers.ffs\n@@ -1,4 +1,4 @@\n-ONE,0x00000300,0x00000100,EV,/dev/urandom\n-TWO,0x00000400,0x00000100,EF,/dev/urandom\n-THREE,0x00000500,0x00000100,EF,/dev/urandom\n-FOUR,0x00000600,0x00000100,EF,/dev/urandom\n+ONE,0x00000300,0x00000100,EV,,/dev/urandom\n+TWO,0x00000400,0x00000100,EF,,/dev/urandom\n+THREE,0x00000500,0x00000100,EF,,/dev/urandom\n+FOUR,0x00000600,0x00000100,EF,,/dev/urandom\ndiff --git a/external/pflash/test/files/06-miscprint.ffs b/external/pflash/test/files/06-miscprint.ffs\nindex 8f916f39..160ed51f 100644\n--- a/external/pflash/test/files/06-miscprint.ffs\n+++ b/external/pflash/test/files/06-miscprint.ffs\n@@ -1,4 +1,4 @@\n-PRESERVED,0x00300,0x100,P,/dev/zero\n-READONLY,0x000400,0x100,R,/dev/zero\n-REPROVISION,0x500,0x100,F,/dev/zero\n-BACKUP,0x00000600,0x100,B,/dev/zero\n+PRESERVED,0x00300,0x100,P,,/dev/zero\n+READONLY,0x000400,0x100,R,,/dev/zero\n+REPROVISION,0x500,0x100,F,,/dev/zero\n+BACKUP,0x00000600,0x100,B,,/dev/zero\ndiff --git a/external/pflash/test/results/06-miscprint.out b/external/pflash/test/results/06-miscprint.out\nindex e90976d6..6d3377f1 100644\n--- a/external/pflash/test/results/06-miscprint.out\n+++ b/external/pflash/test/results/06-miscprint.out\n@@ -30,7 +30,7 @@ Name:\n BACKUP (ID=04)\n \n Start End Actual \n-0x00000600 0x00000700 0x00000100\n+0x00000600 0x00000700 0x00000000\n \n Flags:\n BACKUP [B]\ndiff --git a/libflash/libffs.c b/libflash/libffs.c\nindex 5accf1ff..a1418f4f 100644\n--- a/libflash/libffs.c\n+++ b/libflash/libffs.c\n@@ -562,8 +562,11 @@ int ffs_entry_add(struct ffs_hdr *hdr, struct ffs_entry *entry)\n \tuint32_t smallest_base;\n \tint i;\n \n+\tFL_DBG(\"LIBFFS: Adding '%s' at 0x%08x..0x%08x\\n\",\n+\t\tentry->name, entry->base, entry->base + entry->size);\n+\n \tif (hdr->count == 0) {\n-\t\tFL_DBG(\"Adding an entry to an empty header\\n\");\n+\t\tFL_DBG(\"LIBFFS: Adding an entry to an empty header\\n\");\n \t\thdr->entries[hdr->count++] = entry;\n \t}\n \tif (entry->base + entry->size > hdr->block_size * hdr->block_count)\n", "prefixes": [ "RFC", "13/13" ] }