aboutsummaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2018-05-29 14:25:18 +1000
committerStewart Smith <stewart@linux.ibm.com>2018-06-01 02:07:26 -0500
commit5cc781de88032d7e4c5e36399098d54e3cefd126 (patch)
tree4457dbc115756389b30d30afd5dde4a233625d51 /external
parent22320e119800dc743ff7ab07a4d9f6e8c0845692 (diff)
downloadskiboot-5cc781de88032d7e4c5e36399098d54e3cefd126.zip
skiboot-5cc781de88032d7e4c5e36399098d54e3cefd126.tar.gz
skiboot-5cc781de88032d7e4c5e36399098d54e3cefd126.tar.bz2
ffspart: Don't require user to create blank partitions manually
Add '--allow-empty' which allows the filename for a given partition to be blank. If set ffspart will set that part of the PNOR file 'blank' and set ECC bits if required. Without this option behaviour is unchanged and ffspart will return an error if it can not find the partition file. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'external')
-rw-r--r--external/ffspart/ffspart.c41
-rw-r--r--external/ffspart/test/files/16-create-blank.in4
-rw-r--r--external/ffspart/test/files/16-create-blank.outbin0 -> 2560 bytes
-rw-r--r--external/ffspart/test/results/00-usage.out5
-rw-r--r--external/ffspart/test/results/01-param-sanity.out5
-rw-r--r--external/ffspart/test/results/01.1-param-sanity.out5
-rw-r--r--external/ffspart/test/tests/16-create-blank15
7 files changed, 64 insertions, 11 deletions
diff --git a/external/ffspart/ffspart.c b/external/ffspart/ffspart.c
index d737e30..179ed58 100644
--- a/external/ffspart/ffspart.c
+++ b/external/ffspart/ffspart.c
@@ -122,16 +122,16 @@ static struct ffs_hdr *parse_toc(const char *line, uint32_t block_size,
}
static int parse_entry(struct blocklevel_device *bl,
- struct ffs_hdr **tocs, const char *line)
+ struct ffs_hdr **tocs, const char *line, bool allow_empty)
{
char name[FFS_PART_NAME_MAX + 2] = { 0 };
struct ffs_entry_user user = { 0 };
- uint32_t pbase, psize, pactual;
+ uint32_t pbase, psize, pactual, i;
struct ffs_entry *new_entry;
struct stat data_stat;
const char *filename;
bool added = false;
- uint8_t *data_ptr;
+ uint8_t *data_ptr, ecc = 0;
int data_fd, rc;
char *pos;
@@ -290,6 +290,25 @@ static int parse_entry(struct blocklevel_device *bl,
"(%m)\n", filename, name);
munmap(data_ptr, pactual);
close(data_fd);
+ } else {
+ if (!allow_empty) {
+ fprintf(stderr, "Filename missing for partition %s!\n",
+ name);
+ return -1;
+ }
+ if (has_ecc(new_entry)) {
+ i = pbase + 8;
+ while (i < pbase + psize) {
+ rc = blocklevel_write(bl, i, &ecc, sizeof(ecc));
+ if (rc) {
+ fprintf(stderr, "\nError setting ECC byte at 0x%08x\n",
+ i);
+ return rc;
+ }
+ i += 9;
+ }
+ }
+
}
return 0;
@@ -303,8 +322,10 @@ static void print_version(void)
static void print_help(const char *pname)
{
print_version();
- printf("Usage: %s [options] -s size -c num -i layout_file -p pnor_file ...\n\n", pname);
+ printf("Usage: %s [options] -e -s size -c num -i layout_file -p pnor_file ...\n\n", pname);
printf(" Options:\n");
+ printf("\t-e, --allow_empty\n");
+ printf("\t\tCreate partition as blank if not specified (sets ECC if flag set)\n\n");
printf("\t-s, --block_size=size\n");
printf("\t\tSize (in hex with leading 0x) of the blocks on the flash in bytes\n\n");
printf("\t-c, --block_count=num\n");
@@ -318,7 +339,7 @@ static void print_help(const char *pname)
int main(int argc, char *argv[])
{
char *pnor = NULL, *input = NULL, line[MAX_LINE];
- bool toc_created = false, bad_input = false;
+ bool toc_created = false, bad_input = false, allow_empty = false;
uint32_t block_size = 0, block_count = 0;
struct ffs_hdr *tocs[MAX_TOCS] = { 0 };
struct blocklevel_device *bl = NULL;
@@ -328,19 +349,23 @@ int main(int argc, char *argv[])
while(1) {
struct option long_opts[] = {
+ {"allow_empty", no_argument, NULL, 'e'},
{"block_count", required_argument, NULL, 'c'},
{"block_size", required_argument, NULL, 's'},
- {"debug", no_argument, NULL, 'g'},
+ {"debug", no_argument, NULL, 'g'},
{"input", required_argument, NULL, 'i'},
{"pnor", required_argument, NULL, 'p'},
{NULL, 0, 0, 0}
};
int c, oidx = 0;
- c = getopt_long(argc, argv, "+:c:gi:p:s:", long_opts, &oidx);
+ c = getopt_long(argc, argv, "+:ec:gi:p:s:", long_opts, &oidx);
if (c == EOF)
break;
switch(c) {
+ case 'e':
+ allow_empty = true;
+ break;
case 'c':
block_count = strtoul(optarg, NULL, 0);
break;
@@ -459,7 +484,7 @@ int main(int argc, char *argv[])
}
toc_created = true;
}
- rc = parse_entry(bl, tocs, line);
+ rc = parse_entry(bl, tocs, line, allow_empty);
if (rc) {
rc = 6;
goto parse_out;
diff --git a/external/ffspart/test/files/16-create-blank.in b/external/ffspart/test/files/16-create-blank.in
new file mode 100644
index 0000000..7cff6bf
--- /dev/null
+++ b/external/ffspart/test/files/16-create-blank.in
@@ -0,0 +1,4 @@
+ONE,0x00400,0x00000100,EL,,
+TWO,0x00500,0x00000100,EF,,
+THREE,0x600,0x00000100,EF,,
+FOUR,0x0700,0x00000100,EF,,
diff --git a/external/ffspart/test/files/16-create-blank.out b/external/ffspart/test/files/16-create-blank.out
new file mode 100644
index 0000000..43b9583
--- /dev/null
+++ b/external/ffspart/test/files/16-create-blank.out
Binary files differ
diff --git a/external/ffspart/test/results/00-usage.out b/external/ffspart/test/results/00-usage.out
index 3ad0441..cf7213d 100644
--- a/external/ffspart/test/results/00-usage.out
+++ b/external/ffspart/test/results/00-usage.out
@@ -1,7 +1,10 @@
Open-Power FFS format tool VERSION
-Usage: ./ffspart [options] -s size -c num -i layout_file -p pnor_file ...
+Usage: ./ffspart [options] -e -s size -c num -i layout_file -p pnor_file ...
Options:
+ -e, --allow_empty
+ Create partition as blank if not specified (sets ECC if flag set)
+
-s, --block_size=size
Size (in hex with leading 0x) of the blocks on the flash in bytes
diff --git a/external/ffspart/test/results/01-param-sanity.out b/external/ffspart/test/results/01-param-sanity.out
index 3ad0441..cf7213d 100644
--- a/external/ffspart/test/results/01-param-sanity.out
+++ b/external/ffspart/test/results/01-param-sanity.out
@@ -1,7 +1,10 @@
Open-Power FFS format tool VERSION
-Usage: ./ffspart [options] -s size -c num -i layout_file -p pnor_file ...
+Usage: ./ffspart [options] -e -s size -c num -i layout_file -p pnor_file ...
Options:
+ -e, --allow_empty
+ Create partition as blank if not specified (sets ECC if flag set)
+
-s, --block_size=size
Size (in hex with leading 0x) of the blocks on the flash in bytes
diff --git a/external/ffspart/test/results/01.1-param-sanity.out b/external/ffspart/test/results/01.1-param-sanity.out
index 3ad0441..cf7213d 100644
--- a/external/ffspart/test/results/01.1-param-sanity.out
+++ b/external/ffspart/test/results/01.1-param-sanity.out
@@ -1,7 +1,10 @@
Open-Power FFS format tool VERSION
-Usage: ./ffspart [options] -s size -c num -i layout_file -p pnor_file ...
+Usage: ./ffspart [options] -e -s size -c num -i layout_file -p pnor_file ...
Options:
+ -e, --allow_empty
+ Create partition as blank if not specified (sets ECC if flag set)
+
-s, --block_size=size
Size (in hex with leading 0x) of the blocks on the flash in bytes
diff --git a/external/ffspart/test/tests/16-create-blank b/external/ffspart/test/tests/16-create-blank
new file mode 100644
index 0000000..02640e4
--- /dev/null
+++ b/external/ffspart/test/tests/16-create-blank
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+touch $DATA_DIR/$CUR_TEST.gen
+
+run_binary "./ffspart" "-s 0x100 -c 10 -i $DATA_DIR/$CUR_TEST.in -p $DATA_DIR/$CUR_TEST.gen --allow_empty"
+if [ "$?" -ne 0 ] ; then
+ fail_test
+fi
+
+if ! cmp $DATA_DIR/$CUR_TEST.out $DATA_DIR/$CUR_TEST.gen ; then
+ echo "Output differs"
+ fail_test
+fi
+
+pass_test