mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
tools: kwbimage/kwboot: Check ext field for non-zero value
Despite the official specification, BootROM does not look at the lowest bit of ext field but rather checks if ext field is non-zero. Moreover original Marvell doimage tool puts into the mhdr->ext field the number of extended headers, so basically it sets ext filed to non-zero value if some extended header is present. Fix U-Boot dumpimage and kwboot tools to parse correctly also kwbimage files created by Marvell doimage tool, in the same way as the BootROM is doing it when booting these images. Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
1a0e52f50a
commit
44691034e1
3 changed files with 6 additions and 6 deletions
|
@ -1948,7 +1948,7 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size,
|
|||
if (kwbimage_version(ptr) == 0) {
|
||||
struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
|
||||
|
||||
if (mhdr->ext & 0x1) {
|
||||
if (mhdr->ext) {
|
||||
struct ext_hdr_v0 *ext_hdr = (void *)(mhdr + 1);
|
||||
|
||||
csum = image_checksum8(ext_hdr, sizeof(*ext_hdr) - 1);
|
||||
|
|
|
@ -208,7 +208,7 @@ static inline size_t kwbheader_size(const void *header)
|
|||
const struct main_hdr_v0 *hdr = header;
|
||||
|
||||
return sizeof(*hdr) +
|
||||
(hdr->ext & 0x1) ? sizeof(struct ext_hdr_v0) : 0;
|
||||
hdr->ext ? sizeof(struct ext_hdr_v0) : 0;
|
||||
} else {
|
||||
const struct main_hdr_v1 *hdr = header;
|
||||
|
||||
|
@ -252,7 +252,7 @@ static inline struct opt_hdr_v1 *opt_hdr_v1_first(void *img) {
|
|||
return NULL;
|
||||
|
||||
mhdr = img;
|
||||
if (mhdr->ext & 0x1)
|
||||
if (mhdr->ext)
|
||||
return (struct opt_hdr_v1 *)(mhdr + 1);
|
||||
else
|
||||
return NULL;
|
||||
|
@ -272,7 +272,7 @@ static inline struct opt_hdr_v1 *_opt_hdr_v1_next(struct opt_hdr_v1 *cur)
|
|||
|
||||
static inline struct opt_hdr_v1 *opt_hdr_v1_next(struct opt_hdr_v1 *cur)
|
||||
{
|
||||
if (*opt_hdr_v1_ext(cur) & 0x1)
|
||||
if (*opt_hdr_v1_ext(cur))
|
||||
return _opt_hdr_v1_next(cur);
|
||||
else
|
||||
return NULL;
|
||||
|
|
|
@ -1398,7 +1398,7 @@ kwboot_add_bin_ohdr_v1(void *img, size_t *size, uint32_t binsz)
|
|||
uint32_t ohdrsz;
|
||||
uint8_t *prev_ext;
|
||||
|
||||
if (hdr->ext & 0x1) {
|
||||
if (hdr->ext) {
|
||||
for_each_opt_hdr_v1 (ohdr, img)
|
||||
if (opt_hdr_v1_next(ohdr) == NULL)
|
||||
break;
|
||||
|
@ -1422,7 +1422,7 @@ kwboot_add_bin_ohdr_v1(void *img, size_t *size, uint32_t binsz)
|
|||
ohdrsz = sizeof(*ohdr) + 4 + 4 * num_args + binsz + 4;
|
||||
kwboot_img_grow_hdr(hdr, size, ohdrsz);
|
||||
|
||||
*prev_ext |= 1;
|
||||
*prev_ext = 1;
|
||||
|
||||
ohdr->headertype = OPT_HDR_V1_BINARY_TYPE;
|
||||
ohdr->headersz_msb = ohdrsz >> 16;
|
||||
|
|
Loading…
Reference in a new issue