aboutsummaryrefslogtreecommitdiff
path: root/libflash/libffs.c
diff options
context:
space:
mode:
authorCyril Bur <cyril.bur@au1.ibm.com>2018-03-15 16:58:14 +1100
committerStewart Smith <stewart@linux.ibm.com>2018-04-09 03:45:23 -0500
commit60b8ea49c8a6249820e586f92cf65b42c5514813 (patch)
treee30d0b3fa763e23872886aec7524a3e9771a2201 /libflash/libffs.c
parent267e65357c2e6d98cedebe55ec4cbca95af68f13 (diff)
downloadskiboot-60b8ea49c8a6249820e586f92cf65b42c5514813.zip
skiboot-60b8ea49c8a6249820e586f92cf65b42c5514813.tar.gz
skiboot-60b8ea49c8a6249820e586f92cf65b42c5514813.tar.bz2
libffs: Standardise ffs partition flags
It seems we've developed a character respresentation for ffs partition flags. Currently only pflash really prints them so it hasn't been a problem but now ffspart wants to read them in from user input. It is important that what libffs reads and what pflash prints remain consistent, we should move the code into libffs to avoid problems. Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'libflash/libffs.c')
-rw-r--r--libflash/libffs.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/libflash/libffs.c b/libflash/libffs.c
index 57dca49..9a80a56 100644
--- a/libflash/libffs.c
+++ b/libflash/libffs.c
@@ -188,6 +188,100 @@ static int ffs_entry_to_cpu(struct ffs_hdr *hdr,
return rc;
}
+char *ffs_entry_user_to_string(struct ffs_entry_user *user)
+{
+ char *ret;
+
+ if (!user)
+ return NULL;
+
+ ret = strdup("----------");
+ if (!ret)
+ return NULL;
+
+ if (user->datainteg & FFS_ENRY_INTEG_ECC)
+ ret[0] = 'E';
+
+ if (user->vercheck & FFS_VERCHECK_SHA512V)
+ ret[1] = 'L';
+
+ if (user->vercheck & FFS_VERCHECK_SHA512EC)
+ ret[2] = 'I';
+
+ if (user->miscflags & FFS_MISCFLAGS_PRESERVED)
+ ret[3] = 'P';
+
+ if (user->miscflags & FFS_MISCFLAGS_READONLY)
+ ret[4] = 'R';
+
+ if (user->miscflags & FFS_MISCFLAGS_BACKUP)
+ ret[5] = 'B';
+
+ if (user->miscflags & FFS_MISCFLAGS_REPROVISION)
+ ret[6] = 'F';
+
+ if (user->miscflags & FFS_MISCFLAGS_GOLDEN)
+ ret[7] = 'G';
+
+ if (user->miscflags & FFS_MISCFLAGS_CLEARECC)
+ ret[8] = 'C';
+
+ if (user->miscflags & FFS_MISCFLAGS_VOLATILE)
+ ret[9] = 'V';
+
+ return ret;
+}
+
+int ffs_string_to_entry_user(const char *flags, int nflags,
+ struct ffs_entry_user *user)
+{
+ int i;
+
+ if (!user || !flags)
+ return FLASH_ERR_PARM_ERROR;
+
+ memset(user, 0, sizeof(struct ffs_entry_user));
+ for (i = 0; i < nflags; i++) {
+ switch (flags[i]) {
+ case 'E':
+ user->datainteg |= FFS_ENRY_INTEG_ECC;
+ break;
+ case 'L':
+ user->vercheck |= FFS_VERCHECK_SHA512V;
+ break;
+ case 'I':
+ user->vercheck |= FFS_VERCHECK_SHA512EC;
+ break;
+ case 'P':
+ user->miscflags |= FFS_MISCFLAGS_PRESERVED;
+ break;
+ case 'R':
+ user->miscflags |= FFS_MISCFLAGS_READONLY;
+ break;
+ case 'B':
+ user->miscflags |= FFS_MISCFLAGS_BACKUP;
+ break;
+ case 'F':
+ user->miscflags |= FFS_MISCFLAGS_REPROVISION;
+ break;
+ case 'G':
+ user->miscflags |= FFS_MISCFLAGS_GOLDEN;
+ break;
+ case 'C':
+ user->miscflags |= FFS_MISCFLAGS_CLEARECC;
+ break;
+ case 'V':
+ user->miscflags |= FFS_MISCFLAGS_VOLATILE;
+ break;
+ default:
+ FL_DBG("Unknown flag '%c'\n", flags[i]);
+ return FLASH_ERR_PARM_ERROR;
+ }
+ }
+
+ return 0;
+}
+
bool has_flag(struct ffs_entry *ent, uint16_t flag)
{
return ((ent->user.miscflags & flag) != 0);
@@ -724,13 +818,24 @@ int ffs_entry_user_set(struct ffs_entry *ent, struct ffs_entry_user *user)
return -1;
if (user->miscflags & ~(FFS_MISCFLAGS_PRESERVED | FFS_MISCFLAGS_BACKUP |
FFS_MISCFLAGS_READONLY | FFS_MISCFLAGS_REPROVISION |
- FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_CLEARECC))
+ FFS_MISCFLAGS_VOLATILE | FFS_MISCFLAGS_GOLDEN |
+ FFS_MISCFLAGS_CLEARECC))
return -1;
memcpy(&ent->user, user, sizeof(*user));
return 0;
}
+struct ffs_entry_user ffs_entry_user_get(struct ffs_entry *ent)
+{
+ struct ffs_entry_user user = { 0 };
+
+ if (ent)
+ memcpy(&user, &ent->user, sizeof(user));
+
+ return user;
+}
+
int ffs_entry_new(const char *name, uint32_t base, uint32_t size, struct ffs_entry **r)
{
struct ffs_entry *ret;