[U-Boot] [PATCH 2/6] image: Implement a function to load Android Images.
Simon Glass
sjg at chromium.org
Thu Apr 6 22:42:49 UTC 2017
Hi Alex,
On 2 April 2017 at 02:49, Alex Deymo <deymo at google.com> wrote:
> This patch implements the logic needed to load an Android boot image
> from storage, since the size and kernel address in Android images is
> defined in its header.
>
> Signed-off-by: Alex Deymo <deymo at google.com>
> ---
> common/image-android.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
> include/image.h | 19 +++++++++++++++++++
> 2 files changed, 70 insertions(+)
>
> diff --git a/common/image-android.c b/common/image-android.c
> index c668407817..f040f5b400 100644
> --- a/common/image-android.c
> +++ b/common/image-android.c
> @@ -8,6 +8,7 @@
> #include <image.h>
> #include <android_image.h>
> #include <malloc.h>
> +#include <mapmem.h>
> #include <errno.h>
>
> #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR 0x10008000
> @@ -146,6 +147,56 @@ int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
> return 0;
> }
>
> +long android_image_load(struct blk_desc *dev_desc,
Can you pass a udevice * instead of dev_desc?
> + const disk_partition_t *part_info,
> + unsigned long load_address,
> + unsigned long max_size) {
> + void *buf;
> + long blk_cnt, blk_read = 0;
> +
> + if (max_size < part_info->blksz)
> + return -1;
> +
> + /* We don't know the size of the Android image before reading the header
Comment style:
/*
* We don't know ...
* ...
*/
> + * so we don't limit the size of the mapped memory.
> + */
> + buf = map_sysmem(load_address, 0 /* size */);
This is fine, or you could provide a guess here, since there really
isn't any mapping going on. You could use max_size, for example.
> +
> + /* Read the Android header first and then read the rest. */
> + if (blk_dread(dev_desc, part_info->start, 1, buf) != 1)
> + blk_read = -1;
This should be blk_read(). Unfortunately that function is not defined.
It should call the device's read() method. Can you add a patch to
define this function for read/write/erase/select_hwpart? See pch.h for
an example of how this is done in the header file.
That way you can get a proper error number.
> +
> + if (!blk_read && android_image_check_header(buf) != 0) {
> + printf("** Invalid Android Image header **\n");
> + blk_read = -1;
-EINVAL perhaps?
> + }
> + if (!blk_read) {
> + blk_cnt = (android_image_get_end(buf) - (ulong)buf +
> + part_info->blksz - 1) / part_info->blksz;
> + if (blk_cnt * part_info->blksz > max_size) {
> + debug("Android Image too big (%lu bytes, max %lu)\n",
> + android_image_get_end(buf) - (ulong)buf,
> + max_size);
> + blk_read = -1;
> + } else {
> + debug("Loading Android Image (%lu blocks) to 0x%lx... ",
> + blk_cnt, load_address);
> + blk_read = blk_dread(dev_desc, part_info->start,
> + blk_cnt, buf);
> + }
> + }
> +
> + unmap_sysmem(buf);
> + if (blk_read < 0)
> + return blk_read;
> +
> + debug("%lu blocks read: %s\n",
> + blk_read, (blk_read == blk_cnt) ? "OK" : "ERROR");
> + if (blk_read != blk_cnt)
> + return -1;
> + return blk_read;
> +}
> +
> #if !defined(CONFIG_SPL_BUILD)
> /**
> * android_print_contents - prints out the contents of the Android format image
> diff --git a/include/image.h b/include/image.h
> index 2372518960..de448a9a01 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1241,6 +1241,25 @@ ulong android_image_get_end(const struct andr_img_hdr *hdr);
> ulong android_image_get_kload(const struct andr_img_hdr *hdr);
> void android_print_contents(const struct andr_img_hdr *hdr);
>
> +/** android_image_load - Load an Android Image from storage.
> + *
> + * Load an Android Image based on the header size in the storage. Return the
> + * number of bytes read from storage, which could be bigger than the actual
> + * Android Image as described in the header size. In case of error reading the
> + * image or if the image size needed to be read from disk is bigger than the
> + * the passed |max_size| a negative number is returned.
We normally do @max_size in U-Boot.
> + *
> + * @dev_desc: The device where to read the image from
> + * @part_info: The partition in |dev_desc| where to read the image from
> + * @load_address: The address where the image will be loaded
> + * @max_size: The maximum loaded size, in bytes
> + * @return the number of bytes read or a negative number in case of error.
Is it bytes or blocks?
> + */
> +long android_image_load(struct blk_desc *dev_desc,
> + const disk_partition_t *part_info,
> + unsigned long load_address,
> + unsigned long max_size);
> +
> #endif /* CONFIG_ANDROID_BOOT_IMAGE */
>
> /**
> --
> 2.12.2.564.g063fe858b8-goog
>
Regards,
Simon
More information about the U-Boot
mailing list