static int do_bootz_linux(struct image_data *data) { int fd, ret, swap = 0; struct zimage_header __header, *header; void *zimage; u32 end; unsigned long load_address = data->os_address; if (load_address == UIMAGE_INVALID_ADDRESS) { struct memory_bank *bank = list_first_entry(&memory_banks, struct memory_bank, list); data->os_address = bank->start + SZ_8M; load_address = data->os_address; if (bootm_verbose(data)) printf("no os load address, defaulting to 0x%08lx\n", load_address); } fd = open(data->os_file, O_RDONLY); if (fd < 0) { perror("open"); return 1; } header = &__header; ret = read(fd, header, sizeof(*header)); if (ret < sizeof(*header)) { printf("could not read %s\n", data->os_file); goto err_out; } switch (header->magic) { case swab32(ZIMAGE_MAGIC): swap = 1; /* fall through */ case ZIMAGE_MAGIC: break; default: printf("invalid magic 0x%08x\n", header->magic); ret = -EINVAL; goto err_out; } end = header->end; if (swap) end = swab32(end); data->os_res = request_sdram_region("zimage", load_address, end); if (!data->os_res) { pr_err("bootm/zImage: failed to request memory at 0x%lx to 0x%lx (%d).\n", load_address, load_address + end, end); ret = -ENOMEM; goto err_out; } zimage = (void *)data->os_res->start; memcpy(zimage, header, sizeof(*header)); ret = read_full(fd, zimage + sizeof(*header), end - sizeof(*header)); if (ret < 0) goto err_out; if (ret < end - sizeof(*header)) { printf("premature end of image\n"); ret = -EIO; goto err_out; } if (swap) { void *ptr; for (ptr = zimage; ptr < zimage + end; ptr += 4) *(u32 *)ptr = swab32(*(u32 *)ptr); } ret = do_bootz_linux_fdt(fd, data); if (ret && ret != -ENXIO) goto err_out; close(fd); return __do_bootm_linux(data, swap); err_out: close(fd); return ret; }
static int do_bootz_linux(struct image_data *data) { int fd, ret, swap = 0; struct zimage_header __header, *header; void *zimage; u32 end, start; size_t image_size; unsigned long load_address = data->os_address; unsigned long mem_free; fd = open(data->os_file, O_RDONLY); if (fd < 0) { perror("open"); return 1; } header = &__header; ret = read(fd, header, sizeof(*header)); if (ret < sizeof(*header)) { printf("could not read %s\n", data->os_file); goto err_out; } switch (header->magic) { case swab32(ZIMAGE_MAGIC): swap = 1; /* fall through */ case ZIMAGE_MAGIC: break; default: printf("invalid magic 0x%08x\n", header->magic); ret = -EINVAL; goto err_out; } end = header->end; start = header->start; if (swap) { end = swab32(end); start = swab32(start); } image_size = end - start; load_address = data->os_address; ret = get_kernel_addresses(image_size, bootm_verbose(data), &load_address, &mem_free); if (ret) return ret; data->os_res = request_sdram_region("zimage", load_address, image_size); if (!data->os_res) { pr_err("bootm/zImage: failed to request memory at 0x%lx to 0x%lx (%d).\n", load_address, load_address + image_size, image_size); ret = -ENOMEM; goto err_out; } zimage = (void *)data->os_res->start; memcpy(zimage, header, sizeof(*header)); ret = read_full(fd, zimage + sizeof(*header), image_size - sizeof(*header)); if (ret < 0) goto err_out; if (ret < image_size - sizeof(*header)) { printf("premature end of image\n"); ret = -EIO; goto err_out; } if (swap) { void *ptr; for (ptr = zimage; ptr < zimage + end; ptr += 4) *(u32 *)ptr = swab32(*(u32 *)ptr); } ret = do_bootz_linux_fdt(fd, data); if (ret && ret != -ENXIO) goto err_out; close(fd); return __do_bootm_linux(data, mem_free, swap); err_out: close(fd); return ret; }
static int do_bootz_linux(struct image_data *data) { int fd, ret, swap = 0; struct zimage_header __header, *header; void *zimage; u32 end, start; size_t image_size; unsigned long load_address = data->os_address; unsigned long mem_start, mem_size, mem_free; ret = sdram_start_and_size(&mem_start, &mem_size); if (ret) return ret; fd = open(data->os_file, O_RDONLY); if (fd < 0) { perror("open"); return 1; } header = &__header; ret = read(fd, header, sizeof(*header)); if (ret < sizeof(*header)) { printf("could not read %s\n", data->os_file); goto err_out; } switch (header->magic) { case swab32(ZIMAGE_MAGIC): swap = 1; /* fall through */ case ZIMAGE_MAGIC: break; default: printf("invalid magic 0x%08x\n", header->magic); ret = -EINVAL; goto err_out; } end = header->end; start = header->start; if (swap) { end = swab32(end); start = swab32(start); } image_size = end - start; if (load_address == UIMAGE_INVALID_ADDRESS) { /* * Just use a conservative default of 4 times the size of the * compressed image, to avoid the need for the kernel to * relocate itself before decompression. */ data->os_address = mem_start + PAGE_ALIGN(image_size * 4); load_address = data->os_address; if (bootm_verbose(data)) printf("no OS load address, defaulting to 0x%08lx\n", load_address); } data->os_res = request_sdram_region("zimage", load_address, image_size); if (!data->os_res) { pr_err("bootm/zImage: failed to request memory at 0x%lx to 0x%lx (%d).\n", load_address, load_address + image_size, image_size); ret = -ENOMEM; goto err_out; } zimage = (void *)data->os_res->start; memcpy(zimage, header, sizeof(*header)); ret = read_full(fd, zimage + sizeof(*header), image_size - sizeof(*header)); if (ret < 0) goto err_out; if (ret < end - sizeof(*header)) { printf("premature end of image\n"); ret = -EIO; goto err_out; } if (swap) { void *ptr; for (ptr = zimage; ptr < zimage + end; ptr += 4) *(u32 *)ptr = swab32(*(u32 *)ptr); } ret = do_bootz_linux_fdt(fd, data); if (ret && ret != -ENXIO) goto err_out; close(fd); /* * put oftree/initrd close behind compressed kernel image to avoid * placing it outside of the kernels lowmem. */ mem_free = PAGE_ALIGN(data->os_res->end + SZ_1M); return __do_bootm_linux(data, mem_free, swap); err_out: close(fd); return ret; }