summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-03-13 08:16:44 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-03-13 08:16:44 +0100
commit6134116686ea7ecd3e29db3ab40e4eac837680c3 (patch)
treea04f202006c9f11d1fe53ecb945166e3022bae6b /scripts
parente0093dcf236cdc1d4faef95189c9376ef6610ae7 (diff)
parent836b99c81b9f17414cbbbfdf1c4d92acfc7106ff (diff)
downloadbarebox-6134116686ea7ecd3e29db3ab40e4eac837680c3.tar.gz
barebox-6134116686ea7ecd3e29db3ab40e4eac837680c3.tar.xz
Merge branch 'for-next/mvebu'
Diffstat (limited to 'scripts')
-rw-r--r--scripts/kwboot.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/scripts/kwboot.c b/scripts/kwboot.c
index 9e4181e539..4c6b19aa21 100644
--- a/scripts/kwboot.c
+++ b/scripts/kwboot.c
@@ -264,10 +264,11 @@ out:
}
static int
-kwboot_bootmsg(int tty, void *msg)
+kwboot_bootmsg(int tty, void *msg, unsigned num_nacks)
{
int rc;
char c;
+ unsigned saw_nacks = 0;
if (msg == NULL)
kwboot_printv("Please reboot the target into UART boot mode...");
@@ -295,11 +296,13 @@ kwboot_bootmsg(int tty, void *msg)
kwboot_printv("\\x%02hhx", c);
rc = kwboot_tty_recv(tty, &c, 1, KWBOOT_MSG_RSP_TIMEO);
+
+ saw_nacks = 0;
}
- } while (rc || c != NAK);
+ } while (rc || c != NAK || (++saw_nacks < num_nacks));
- kwboot_printv("\nGot expected NAK\n");
+ kwboot_printv("\nGot expected NAKs\n");
return rc;
}
@@ -603,7 +606,7 @@ static int
kwboot_check_image(unsigned char *img, size_t size)
{
size_t i;
- size_t header_size, image_size;
+ size_t header_size, image_size, image_offset;
unsigned char csum = 0;
if (size < 0x20) {
@@ -640,12 +643,20 @@ kwboot_check_image(unsigned char *img, size_t size)
image_size = img[0x4] | (img[0x5] << 8) |
(img[0x6] << 16) | (img[0x7] << 24);
+ image_offset = img[0xc] | (img[0xd] << 8) |
+ (img[0xe] << 16) | (img[0xf] << 24);
header_size = (img[0x9] << 16) | img[0xa] | (img[0xb] << 8);
- if (header_size + image_size != size) {
- fprintf(stderr, "Size mismatch (%zu + %zu != %zu)\n",
- header_size, image_size, size);
+ if (header_size > image_offset) {
+ fprintf(stderr, "Header (%zu) expands over image start (%zu)\n",
+ header_size, image_offset);
+ return 1;
+ }
+
+ if (image_offset + image_size != size) {
+ fprintf(stderr, "Image doesn't end at file end (%zu + %zu != %zu)\n",
+ image_offset, image_size, size);
return 1;
}
@@ -728,6 +739,7 @@ main(int argc, char **argv)
void *bootmsg;
void *debugmsg;
void *img;
+ unsigned num_nacks = 1;
size_t size;
speed_t speed;
@@ -744,7 +756,7 @@ main(int argc, char **argv)
kwboot_verbose = isatty(STDOUT_FILENO);
do {
- int c = getopt(argc, argv, "b:dfhtB:D:");
+ int c = getopt(argc, argv, "b:dfhtn:B:D:");
if (c < 0)
break;
@@ -771,6 +783,10 @@ main(int argc, char **argv)
force = 1;
break;
+ case 'n':
+ num_nacks = atoi(optarg);
+ break;
+
case 'B':
speed = kwboot_tty_speed(atoi(optarg));
if (speed == -1)
@@ -820,7 +836,7 @@ main(int argc, char **argv)
goto out;
}
} else {
- rc = kwboot_bootmsg(tty, bootmsg);
+ rc = kwboot_bootmsg(tty, bootmsg, num_nacks);
if (rc) {
perror("bootmsg");
goto out;