]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - cmd/abootimg.c
arm: Check FEAT_CCIDX when parsing ccsidr_el1 register
[thirdparty/u-boot.git] / cmd / abootimg.c
index 026c03f91c757d49b021c507798cc3b3cfe1ea97..2653b555b10a07d89192536f300524072213b8f4 100644 (file)
 static ulong _abootimg_addr = -1;
 static ulong _avendor_bootimg_addr = -1;
 
+ulong get_abootimg_addr(void)
+{
+       return (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr);
+}
+
+ulong get_avendor_bootimg_addr(void)
+{
+       return _avendor_bootimg_addr;
+}
+
 static int abootimg_get_ver(int argc, char *const argv[])
 {
        const struct andr_boot_img_hdr_v0 *hdr;
@@ -26,7 +36,7 @@ static int abootimg_get_ver(int argc, char *const argv[])
                return CMD_RET_USAGE;
 
        hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-       if (android_image_check_header(hdr)) {
+       if (!is_android_boot_image_header(hdr)) {
                printf("Error: Boot Image header is incorrect\n");
                res = CMD_RET_FAILURE;
                goto exit;
@@ -66,33 +76,43 @@ static int abootimg_get_recovery_dtbo(int argc, char *const argv[])
 
 static int abootimg_get_dtb_load_addr(int argc, char *const argv[])
 {
-       const struct andr_boot_img_hdr_v0 *hdr;
-       int res = CMD_RET_SUCCESS;
-
        if (argc > 1)
                return CMD_RET_USAGE;
+       struct andr_image_data img_data = {0};
+       const struct andr_boot_img_hdr_v0 *hdr;
+       const struct andr_vnd_boot_img_hdr *vhdr;
 
        hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-       if (android_image_check_header(hdr)) {
-               printf("Error: Boot Image header is incorrect\n");
-               res = CMD_RET_FAILURE;
-               goto exit;
+       if (get_avendor_bootimg_addr() != -1)
+               vhdr = map_sysmem(get_avendor_bootimg_addr(), sizeof(*vhdr));
+
+       if (!android_image_get_data(hdr, vhdr, &img_data)) {
+               if (get_avendor_bootimg_addr() != -1)
+                       unmap_sysmem(vhdr);
+               unmap_sysmem(hdr);
+               return CMD_RET_FAILURE;
        }
 
-       if (hdr->header_version < 2) {
+       if (get_avendor_bootimg_addr() != -1)
+               unmap_sysmem(vhdr);
+       unmap_sysmem(hdr);
+
+       if (img_data.header_version < 2) {
                printf("Error: header_version must be >= 2 for this\n");
-               res = CMD_RET_FAILURE;
-               goto exit;
+               return CMD_RET_FAILURE;
+       }
+
+       if (!img_data.dtb_load_addr) {
+               printf("Error: failed to read dtb_load_addr\n");
+               return CMD_RET_FAILURE;
        }
 
        if (argc == 0)
-               printf("%lx\n", (ulong)hdr->dtb_addr);
+               printf("%lx\n", (ulong)img_data.dtb_load_addr);
        else
-               env_set_hex(argv[0], (ulong)hdr->dtb_addr);
+               env_set_hex(argv[0], (ulong)img_data.dtb_load_addr);
 
-exit:
-       unmap_sysmem(hdr);
-       return res;
+       return CMD_RET_SUCCESS;
 }
 
 static int abootimg_get_dtb_by_index(int argc, char *const argv[])
@@ -118,7 +138,8 @@ static int abootimg_get_dtb_by_index(int argc, char *const argv[])
                return CMD_RET_FAILURE;
        }
 
-       if (!android_image_get_dtb_by_index(abootimg_addr(), num,
+       if (!android_image_get_dtb_by_index(abootimg_addr(),
+                                           get_avendor_bootimg_addr(), num,
                                            &addr, &size)) {
                return CMD_RET_FAILURE;
        }