Mercurial > ecos
diff 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 |
line wrap: on
line diff
--- a/packages/redboot/current/src/load.c +++ b/packages/redboot/current/src/load.c @@ -366,6 +366,10 @@ do_load(int argc, char *argv[]) printf("Specified address (%p) is not in RAM.\n", (void*)base); return; } + if (raw && !base_addr_set) { + printf("Raw load requires a memory address\n"); + return; + } #ifdef CYGPKG_REDBOOT_NETWORKING if (mode == MODE_TFTP) { res = tftp_stream_open(filename, &host, TFTP_OCTET, &err); @@ -385,63 +389,59 @@ do_load(int argc, char *argv[]) // Suppress verbosity when using xyz modem download redboot_getc_init(xyzModem_stream_read, 0 && verbose); } - // Read initial header - to determine file [image] type - for (i = 0; i < sizeof(type); i++) { - if ((res = redboot_getc()) < 0) { - err = getc_info.err; - break; - } - type[i] = res; - } - if (res >= 0) { - redboot_getc_rewind(); // Restore header to stream - if (raw) { - if (!base_addr_set) { - printf("Raw load requires a memory address\n"); - } else { + if (raw) { #ifdef CYGPKG_COMPRESS_ZLIB - if (decompress) { - _pipe_t* p = &load_pipe; - p->out_buf = (unsigned char*) base; - p->out_size = 0; - p->in_buf = _buffer; + if (decompress) { + _pipe_t* p = &load_pipe; + p->out_buf = (unsigned char*) base; + p->out_size = 0; + p->in_buf = _buffer; - err = (*_dc_init)(p); + err = (*_dc_init)(p); + + while (0 == err) { + p->in_avail = 0; + for (i = 0; i < CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER; i++) { + res = redboot_getc(); + if (res < 0) break; + p->in_buf[p->in_avail++] = res; + } + if (0 == p->in_avail) break; + + err = (*_dc_inflate)(p); + } + + // Free used resources, do final translation of + // error value. + err = (*_dc_close)(p, err); - while (0 == err) { - p->in_avail = 0; - for (i = 0; i < CYGNUM_REDBOOT_LOAD_ZLIB_BUFFER; i++) { - res = redboot_getc(); - if (res < 0) break; - p->in_buf[p->in_avail++] = res; - } - if (0 == p->in_avail) break; - - err = (*_dc_inflate)(p); - } - - // Free used resources, do final translation of - // error value. - err = (*_dc_close)(p, err); + if (0 != err && p->msg) + printf("zlib: %s\n", p->msg); - if (0 != err && p->msg) - printf("zlib: %s\n", p->msg); - - end = (unsigned long) base + p->out_size; - } else // dangling block + end = (unsigned long) base + p->out_size; + } else // dangling block #endif - { - unsigned char *mp = (unsigned char *)base; - while ((res = redboot_getc()) >= 0) { - *mp++ = res; - } - err = 0; - end = (unsigned long) mp; - } - if (0 == err) - printf("Raw file loaded %p-%p\n", (void *)base, (void *)end); + { + unsigned char *mp = (unsigned char *)base; + while ((res = redboot_getc()) >= 0) { + *mp++ = res; } - } else { + err = 0; + end = (unsigned long) mp; + } + if (0 == err) + printf("Raw file loaded %p-%p\n", (void *)base, (void *)end); + } else { + // Read initial header - to determine file [image] type + for (i = 0; i < sizeof(type); i++) { + if ((res = redboot_getc()) < 0) { + err = getc_info.err; + break; + } + type[i] = res; + } + if (res >= 0) { + redboot_getc_rewind(); // Restore header to stream // Treat data as some sort of executable image if (strncmp(&type[1], "ELF", 3) == 0) { end = load_elf_image(redboot_getc);
