static int bootread (int fd, void *addr, int size) { int i; if (bootseg++ > 0) fprintf (stderr, "\b + "); fprintf (stderr, "0x%x/%d ", addr + dl_offset, size); if (!dl_checksetloadaddr (addr + dl_offset, size, 1)) return (-1); #if NGZIP > 0 if(myflags&ZFLAG){ if(myflags&OFLAG){ if(lastaddr)dl_loffset +=(unsigned long long)(addr-lastaddr); lastaddr=addr; i=0; while(i<size) { int i1; int len=min(0x1000,size-i); i1=gz_read (fd,dl_Oloadbuffer,len); if(i1<0)break; highmemcpy(dl_loffset+i,dl_Oloadbuffer,i1); i+=i1; if(i1<len)break; } } else i = gz_read (fd, addr + dl_offset, size); }else #endif /* NGZIP */ { if(myflags&OFLAG){ if(lastaddr)dl_loffset +=(unsigned long long)(addr-lastaddr); lastaddr=addr; i=0; while(i<size) { int i1; int len=min(0x1000,size-i); i1=read (fd,dl_Oloadbuffer,len); if(i1<0)break; highmemcpy(dl_loffset+i,dl_Oloadbuffer,i1); i+=i1; if(i1<len)break; } } else i = read (fd, addr + dl_offset, size); } if (i < size) { if (i >= 0) fprintf (stderr, "\nread failed (corrupt object file?)"); else perror ("\nsegment read"); return (-1); } return size; }
static long load_bin(int fd, char *buf, int *n, int flags) { unsigned long long addr; int size = 2048; int n2; int count = 0; if (flags & OFLAG) addr = dl_loffset; else addr = (void *)dl_offset; fprintf (stderr, "(bin)\n"); dl_minaddr = (long)addr; do { if (flags & OFLAG) { n2 = read(fd, buf, size); highmemcpy((long long)addr, (long long)buf, (long long)n2); } else n2 = read(fd, addr, size); addr = (addr + n2); count += n2; } while (n2 >= size); dl_maxaddr = (long)addr; printf("\nLoaded %d bytes\n", count); return dl_offset; }