Mercurial > ecos
comparison packages/redboot/current/src/load.c @ 157:b65ec671dd4c
Merge from eCos master repository on 2001-04-06-18:28:36-BST
| author | jlarmour |
|---|---|
| date | Fri, 06 Apr 2001 19:06:06 +0000 |
| parents | b939e9cada46 |
| children | ac086aa3217e |
comparison
equal
deleted
inserted
replaced
| 156:b939e9cada46 | 157:b65ec671dd4c |
|---|---|
| 364 ((base < (unsigned long)user_ram_start) || | 364 ((base < (unsigned long)user_ram_start) || |
| 365 (base > (unsigned long)user_ram_end))) { | 365 (base > (unsigned long)user_ram_end))) { |
| 366 printf("Specified address (%p) is not in RAM.\n", (void*)base); | 366 printf("Specified address (%p) is not in RAM.\n", (void*)base); |
| 367 return; | 367 return; |
| 368 } | 368 } |
| 369 if (raw && !base_addr_set) { | |
| 370 printf("Raw load requires a memory address\n"); | |
| 371 return; | |
| 372 } | |
| 369 #ifdef CYGPKG_REDBOOT_NETWORKING | 373 #ifdef CYGPKG_REDBOOT_NETWORKING |
| 370 if (mode == MODE_TFTP) { | 374 if (mode == MODE_TFTP) { |
| 371 res = tftp_stream_open(filename, &host, TFTP_OCTET, &err); | 375 res = tftp_stream_open(filename, &host, TFTP_OCTET, &err); |
| 372 if (res < 0) { | 376 if (res < 0) { |
| 373 printf("Can't load '%s': %s\n", filename, tftp_error(err)); | 377 printf("Can't load '%s': %s\n", filename, tftp_error(err)); |
| 383 return; | 387 return; |
| 384 } | 388 } |
| 385 // Suppress verbosity when using xyz modem download | 389 // Suppress verbosity when using xyz modem download |
| 386 redboot_getc_init(xyzModem_stream_read, 0 && verbose); | 390 redboot_getc_init(xyzModem_stream_read, 0 && verbose); |
| 387 } | 391 } |
| 388 // Read initial header - to determine file [image] type | 392 if (raw) { |
| 389 for (i = 0; i < sizeof(type); i++) { | |
| 390 if ((res = redboot_getc()) < 0) { | |
| 391 err = getc_info.err; | |
| 392 break; | |
| 393 } | |
| 394 type[i] = res; | |
| 395 } | |
| 396 if (res >= 0) { | |
| 397 redboot_getc_rewind(); // Restore header to stream | |
| 398 if (raw) { | |
| 399 if (!base_addr_set) { | |
| 400 printf("Raw load requires a memory address\n"); | |
| 401 } else { | |
| 402 #ifdef CYGPKG_COMPRESS_ZLIB | 393 #ifdef CYGPKG_COMPRESS_ZLIB |
| 403 if (decompress) { | 394 if (decompress) { |
| 404 _pipe_t* p = &load_pipe; | 395 _pipe_t* p = &load_pipe; |
| 405 p->out_buf = (unsigned char*) base; | 396 p->out_buf = (unsigned char*) base; |
| 406 p->out_size = 0; | 397 p->out_size = 0; |
| 407 p->in_buf = _buffer; | 398 p->in_buf = _buffer; |
| 408 | 399 |
| 409 err = (*_dc_init)(p); | 400 err = (*_dc_init)(p); |
| 410 | 401 |
| 411 while (0 == err) { | 402 while (0 == err) { |
| 412 p->in_avail = 0; | 403 p->in_avail = 0; |
| 413 for (i = 0; i < CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER; i++) { | 404 for (i = 0; i < CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER; i++) { |
| 414 res = redboot_getc(); | 405 res = redboot_getc(); |
| 415 if (res < 0) break; | 406 if (res < 0) break; |
| 416 p->in_buf[p->in_avail++] = res; | 407 p->in_buf[p->in_avail++] = res; |
| 417 } | |
| 418 if (0 == p->in_avail) break; | |
| 419 | |
| 420 err = (*_dc_inflate)(p); | |
| 421 } | |
| 422 | |
| 423 // Free used resources, do final translation of | |
| 424 // error value. | |
| 425 err = (*_dc_close)(p, err); | |
| 426 | |
| 427 if (0 != err && p->msg) | |
| 428 printf("zlib: %s\n", p->msg); | |
| 429 | |
| 430 end = (unsigned long) base + p->out_size; | |
| 431 } else // dangling block | |
| 432 #endif | |
| 433 { | |
| 434 unsigned char *mp = (unsigned char *)base; | |
| 435 while ((res = redboot_getc()) >= 0) { | |
| 436 *mp++ = res; | |
| 437 } | |
| 438 err = 0; | |
| 439 end = (unsigned long) mp; | |
| 440 } | 408 } |
| 441 if (0 == err) | 409 if (0 == p->in_avail) break; |
| 442 printf("Raw file loaded %p-%p\n", (void *)base, (void *)end); | 410 |
| 443 } | 411 err = (*_dc_inflate)(p); |
| 444 } else { | 412 } |
| 413 | |
| 414 // Free used resources, do final translation of | |
| 415 // error value. | |
| 416 err = (*_dc_close)(p, err); | |
| 417 | |
| 418 if (0 != err && p->msg) | |
| 419 printf("zlib: %s\n", p->msg); | |
| 420 | |
| 421 end = (unsigned long) base + p->out_size; | |
| 422 } else // dangling block | |
| 423 #endif | |
| 424 { | |
| 425 unsigned char *mp = (unsigned char *)base; | |
| 426 while ((res = redboot_getc()) >= 0) { | |
| 427 *mp++ = res; | |
| 428 } | |
| 429 err = 0; | |
| 430 end = (unsigned long) mp; | |
| 431 } | |
| 432 if (0 == err) | |
| 433 printf("Raw file loaded %p-%p\n", (void *)base, (void *)end); | |
| 434 } else { | |
| 435 // Read initial header - to determine file [image] type | |
| 436 for (i = 0; i < sizeof(type); i++) { | |
| 437 if ((res = redboot_getc()) < 0) { | |
| 438 err = getc_info.err; | |
| 439 break; | |
| 440 } | |
| 441 type[i] = res; | |
| 442 } | |
| 443 if (res >= 0) { | |
| 444 redboot_getc_rewind(); // Restore header to stream | |
| 445 // Treat data as some sort of executable image | 445 // Treat data as some sort of executable image |
| 446 if (strncmp(&type[1], "ELF", 3) == 0) { | 446 if (strncmp(&type[1], "ELF", 3) == 0) { |
| 447 end = load_elf_image(redboot_getc); | 447 end = load_elf_image(redboot_getc); |
| 448 } else if ((type[0] == 'S') && | 448 } else if ((type[0] == 'S') && |
| 449 ((type[1] >= '0') && (type[1] <= '9'))) { | 449 ((type[1] >= '0') && (type[1] <= '9'))) { |
