diff options
author | Cyril Bur <cyril.bur@au1.ibm.com> | 2015-06-04 10:36:03 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-06-09 16:37:33 +1000 |
commit | 89ec9eb94a0bf4605e73bc3dd1d8588005b7ec4d (patch) | |
tree | 6a31ff7ac65f0c252569b5ac2cf2e7c3aca06751 /libflash | |
parent | 39d9e14cdeef9a20e3da05d527b136de65e39904 (diff) | |
download | skiboot-89ec9eb94a0bf4605e73bc3dd1d8588005b7ec4d.zip skiboot-89ec9eb94a0bf4605e73bc3dd1d8588005b7ec4d.tar.gz skiboot-89ec9eb94a0bf4605e73bc3dd1d8588005b7ec4d.tar.bz2 |
libflash: Add checking at blocklevel for erase block aligned erase lengths
Currently blocklevel_erase() will let any erase of any size get passed down
to the backend. Not strictly a problem since libflash does do this check
as well, however, not all future backends will.
This is very much a sanity check to save from a likely mistake.
Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'libflash')
-rw-r--r-- | libflash/blocklevel.c | 10 | ||||
-rw-r--r-- | libflash/blocklevel.h | 5 | ||||
-rw-r--r-- | libflash/libflash.c | 1 |
3 files changed, 16 insertions, 0 deletions
diff --git a/libflash/blocklevel.c b/libflash/blocklevel.c index 35b8c8a..320ffac 100644 --- a/libflash/blocklevel.c +++ b/libflash/blocklevel.c @@ -15,6 +15,9 @@ */ #include <unistd.h> +#include <stdio.h> + +#include <libflash/libflash.h> #include "blocklevel.h" int blocklevel_read(struct blocklevel_device *bl, uint32_t pos, void *buf, uint32_t len) @@ -38,6 +41,13 @@ int blocklevel_erase(struct blocklevel_device *bl, uint32_t pos, uint32_t len) if (!bl || !bl->erase) return -1; + /* Programmer may be making a horrible mistake without knowing it */ + if (len & bl->erase_mask) { + fprintf(stderr, "blocklevel_erase: len (0x%08x) is not erase block (0x%08x) aligned\n", + len, bl->erase_mask + 1); + return FLASH_ERR_ERASE_BOUNDARY; + } + return bl->erase(bl, pos, len); } diff --git a/libflash/blocklevel.h b/libflash/blocklevel.h index 2e8480d..a22ecb4 100644 --- a/libflash/blocklevel.h +++ b/libflash/blocklevel.h @@ -29,6 +29,11 @@ struct blocklevel_device { int (*erase)(struct blocklevel_device *bl, uint32_t pos, uint32_t len); int (*get_info)(struct blocklevel_device *bl, const char **name, uint32_t *total_size, uint32_t *erase_granule); + + /* + * Keep the erase mask so that blocklevel_erase() can do sanity checking + */ + uint32_t erase_mask; }; int blocklevel_read(struct blocklevel_device *bl, uint32_t pos, void *buf, uint32_t len); diff --git a/libflash/libflash.c b/libflash/libflash.c index 2af0c79..e7b3c8e 100644 --- a/libflash/libflash.c +++ b/libflash/libflash.c @@ -836,6 +836,7 @@ bail: c->bl.write = &flash_smart_write; c->bl.erase = &flash_erase; c->bl.get_info = &flash_get_info; + c->bl.erase_mask = c->min_erase_mask; *bl = &(c->bl); return 0; |