summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2011-09-27 16:22:11 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2011-09-28 09:23:45 +0200
commit7b49dc335ac5f56a4a53c75eba8d9c0ec589b959 (patch)
tree29adb1e54d0788894ab9114852f986d1a59d1d8c
parentd1ffab8f0c1db7ddc51302883f364700e0894edd (diff)
downloadbarebox-7b49dc335ac5f56a4a53c75eba8d9c0ec589b959.tar.gz
barebox-7b49dc335ac5f56a4a53c75eba8d9c0ec589b959.tar.xz
image: move map_image amd unmap_image to image.c
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--commands/bootm.c114
-rw-r--r--common/image.c121
-rw-r--r--include/image.h1
3 files changed, 122 insertions, 114 deletions
diff --git a/commands/bootm.c b/commands/bootm.c
index 5adc3fa4df..755932b505 100644
--- a/commands/bootm.c
+++ b/commands/bootm.c
@@ -158,120 +158,6 @@ int relocate_image(struct image_handle *handle, void *load_address)
}
EXPORT_SYMBOL(relocate_image);
-static struct image_handle_data * gen_image_handle_data(void* data, ulong len)
-{
- struct image_handle_data *iha;
-
- iha = xzalloc(sizeof(struct image_handle_data));
- iha->data = data;
- iha->len = len;
-
- return iha;
-}
-
-struct image_handle *map_image(const char *filename, int verify)
-{
- int fd;
- uint32_t checksum, len;
- struct image_handle *handle;
- image_header_t *header;
- int type;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
- printf("could not open: %s\n", errno_str());
- return NULL;
- }
-
- handle = xzalloc(sizeof(struct image_handle));
- header = &handle->header;
-
- if (read(fd, header, image_get_header_size()) < 0) {
- printf("could not read: %s\n", errno_str());
- goto err_out;
- }
-
- if (image_get_magic(header) != IH_MAGIC) {
- puts ("Bad Magic Number\n");
- goto err_out;
- }
-
- checksum = image_get_hcrc(header);
- header->ih_hcrc = 0;
-
- if (crc32 (0, (uchar *)header, image_get_header_size()) != checksum) {
- puts ("Bad Header Checksum\n");
- goto err_out;
- }
- len = image_get_size(header);
-
- handle->data = memmap(fd, PROT_READ);
- if (handle->data == (void *)-1) {
- handle->data = xmalloc(len);
- handle->flags = IH_MALLOC;
- if (read(fd, handle->data, len) < 0) {
- printf("could not read: %s\n", errno_str());
- goto err_out;
- }
- } else {
- handle->data = (void *)((unsigned long)handle->data +
- image_get_header_size());
- }
-
- type = image_get_type(header);
- if (type == IH_TYPE_MULTI) {
- struct image_handle_data *data_entries;
- int i;
- ulong img_data;
- ulong count = image_multi_count(handle->data);
-
- data_entries = xzalloc(sizeof(struct image_handle_data) * count);
-
- for (i = 0; i < count; i++) {
- image_multi_getimg(handle->data, i, &img_data,
- &data_entries[i].len);
-
- data_entries[i].data = (void*)img_data;
- }
- handle->data_entries = data_entries;
- handle->nb_data_entries = count;
- } else {
- handle->data_entries = gen_image_handle_data(handle->data, len);
- handle->nb_data_entries = 1;
- }
-
- if (verify) {
- puts (" Verifying Checksum ... ");
- if (crc32 (0, handle->data, len) != image_get_dcrc(header)) {
- printf ("Bad Data CRC\n");
- goto err_out;
- }
- puts ("OK\n");
- }
-
- image_print_contents(header, handle->data);
-
- close(fd);
-
- return handle;
-err_out:
- close(fd);
- if (handle->flags & IH_MALLOC)
- free(handle->data);
- free(handle);
- return NULL;
-}
-EXPORT_SYMBOL(map_image);
-
-void unmap_image(struct image_handle *handle)
-{
- if (handle->flags & IH_MALLOC)
- free(handle->data);
- free(handle->data_entries);
- free(handle);
-}
-EXPORT_SYMBOL(unmap_image);
-
static LIST_HEAD(handler_list);
int register_image_handler(struct image_handler *handler)
diff --git a/common/image.c b/common/image.c
index 501218b5a7..4a6402d8b9 100644
--- a/common/image.c
+++ b/common/image.c
@@ -27,6 +27,10 @@
#include <common.h>
#include <image.h>
#include <rtc.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <malloc.h>
+#include <fs.h>
#else
#include <time.h>
#endif
@@ -309,3 +313,120 @@ void image_print_contents(const image_header_t *hdr, void *data)
}
}
}
+
+#ifdef __BAREBOX__
+struct image_handle *map_image(const char *filename, int verify)
+{
+ int fd;
+ uint32_t checksum, len;
+ struct image_handle *handle;
+ image_header_t *header;
+ int type;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ printf("could not open: %s\n", errno_str());
+ return NULL;
+ }
+
+ handle = xzalloc(sizeof(struct image_handle));
+ header = &handle->header;
+
+ if (read(fd, header, image_get_header_size()) < 0) {
+ printf("could not read: %s\n", errno_str());
+ goto err_out;
+ }
+
+ if (image_get_magic(header) != IH_MAGIC) {
+ puts ("Bad Magic Number\n");
+ goto err_out;
+ }
+
+ checksum = image_get_hcrc(header);
+ header->ih_hcrc = 0;
+
+ if (crc32 (0, (uchar *)header, image_get_header_size()) != checksum) {
+ puts ("Bad Header Checksum\n");
+ goto err_out;
+ }
+ len = image_get_size(header);
+
+ handle->data = memmap(fd, PROT_READ);
+ if (handle->data == (void *)-1) {
+ handle->data = xmalloc(len);
+ handle->flags = IH_MALLOC;
+ if (read(fd, handle->data, len) < 0) {
+ printf("could not read: %s\n", errno_str());
+ goto err_out;
+ }
+ } else {
+ handle->data = (void *)((unsigned long)handle->data +
+ image_get_header_size());
+ }
+
+ type = image_get_type(header);
+ if (type == IH_TYPE_MULTI) {
+ struct image_handle_data *data_entries;
+ int i;
+ ulong img_data;
+ ulong count = image_multi_count(handle->data);
+
+ data_entries = xzalloc(sizeof(struct image_handle_data) * count);
+
+ for (i = 0; i < count; i++) {
+ image_multi_getimg(handle->data, i, &img_data,
+ &data_entries[i].len);
+
+ data_entries[i].data = (void*)img_data;
+ }
+ handle->data_entries = data_entries;
+ handle->nb_data_entries = count;
+ } else {
+ handle->data_entries = gen_image_handle_data(handle->data, len);
+ handle->nb_data_entries = 1;
+ }
+
+ if (verify) {
+ puts (" Verifying Checksum ... ");
+ if (crc32 (0, handle->data, len) != image_get_dcrc(header)) {
+ printf ("Bad Data CRC\n");
+ goto err_out;
+ }
+ puts ("OK\n");
+ }
+
+ image_print_contents(header, handle->data);
+
+ close(fd);
+
+ return handle;
+err_out:
+ close(fd);
+ if (handle->flags & IH_MALLOC)
+ free(handle->data);
+ free(handle);
+ return NULL;
+}
+EXPORT_SYMBOL(map_image);
+
+void unmap_image(struct image_handle *handle)
+{
+ if (handle->flags & IH_MALLOC)
+ free(handle->data);
+ free(handle->data_entries);
+ free(handle);
+}
+EXPORT_SYMBOL(unmap_image);
+
+struct image_handle_data * gen_image_handle_data(void* data, ulong len)
+{
+ struct image_handle_data *iha;
+
+ iha = xzalloc(sizeof(struct image_handle_data));
+ iha->data = data;
+ iha->len = len;
+
+ return iha;
+}
+EXPORT_SYMBOL(gen_image_handle_data);
+#endif
diff --git a/include/image.h b/include/image.h
index d34d4320d5..691bf2d88b 100644
--- a/include/image.h
+++ b/include/image.h
@@ -344,6 +344,7 @@ void print_image_hdr (image_header_t *hdr);
*/
struct image_handle *map_image(const char *filename, int verify);
void unmap_image(struct image_handle *handle);
+struct image_handle_data* gen_image_handle_data(void* data, ulong len);
/*
* Relocate an image to load_address by uncompressing