static int do_bootm_kwbimage_v0_v1(struct image_data *data) { int fd, ret; loff_t offset; char header[0x20]; u32 image_size, image_source; void (*barebox)(void); fd = open(data->os_file, O_RDONLY); if (fd < 0) return fd; ret = read_full(fd, header, 0x20); if (ret < 0x20) { pr_err("Failed to read header\n"); if (ret >= 0) return -EINVAL; return -errno; } image_size = header[4] | header[5] << 8 | header[6] << 16 | header[7] << 24; image_source = header[0xc] | header[0xd] << 8 | header[0xe] << 16 | header[0xf] << 24; if (data->verbose) pr_info("size: %u\noffset: %u\n", image_size, image_source); offset = lseek(fd, image_source, SEEK_SET); if (offset < 0) { pr_err("Failed to seek to image (%lld, %d)\n", offset, errno); return -errno; } barebox = xzalloc(image_size); ret = read_full(fd, barebox, image_size); if (ret < image_size) { pr_err("Failed to read image\n"); if (ret >= 0) ret = -EINVAL; else ret = -errno; goto out_free; } if (is_barebox_arm_head((void *)barebox)) put_unaligned_le32(MVEBU_REMAP_INT_REG_BASE, barebox + 0x30); shutdown_barebox(); barebox(); restart_machine(); out_free: free(barebox); return ret; }
static unsigned int get_image_size(void *head) { unsigned int ret = 0; unsigned int *psize = head + ARM_HEAD_SIZE_OFFSET; if (is_barebox_arm_head(head)) ret = *psize; debug("Detected barebox image size %u\n", ret); return ret; }
enum filetype file_detect_type(void *_buf) { u32 *buf = _buf; u64 *buf64 = _buf; u8 *buf8 = _buf; enum filetype type; if (strncmp(buf8, "#!/bin/sh", 9) == 0) return filetype_sh; if (is_barebox_arm_head(_buf)) return filetype_arm_barebox; if (buf[9] == 0x016f2818 || buf[9] == 0x18286f01) return filetype_arm_zimage; if (buf8[0] == 0x89 && buf8[1] == 0x4c && buf8[2] == 0x5a && buf8[3] == 0x4f) return filetype_lzo_compressed; if (buf[0] == be32_to_cpu(0x27051956)) return filetype_uimage; if (buf[0] == 0x23494255) return filetype_ubi; if (buf[0] == 0x20031985) return filetype_jffs2; if (buf8[0] == 0x1f && buf8[1] == 0x8b && buf8[2] == 0x08) return filetype_gzip; if (buf8[0] == 'B' && buf8[1] == 'Z' && buf8[2] == 'h' && buf8[3] > '0' && buf8[3] <= '9') return filetype_bzip2; if (buf[0] == be32_to_cpu(0xd00dfeed)) return filetype_oftree; if (strncmp(buf8, "ANDROID!", 8) == 0) return filetype_aimage; if (strncmp(buf8 + 0x10, "barebox", 7) == 0) return filetype_mips_barebox; type = is_fat_or_mbr(buf8, NULL); if (type != filetype_unknown) return type; if (strncmp(buf8, "BM", 2) == 0) return filetype_bmp; if (buf64[0] == le64_to_cpu(0x0a1a0a0d474e5089ull)) return filetype_png; return filetype_unknown; }