Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3314 → Rev 3315

/trunk/uspace/srv/loader/elf_load.c
71,6 → 71,19
static int section_header(elf_ld_t *elf, elf_section_header_t *entry);
static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry);
 
/** Read until the buffer is read in its entirety. */
static int my_read(int fd, char *buf, size_t len)
{
int cnt = 0;
do {
buf += cnt;
len -= cnt;
cnt = read(fd, buf, len);
} while ((cnt > 0) && ((len - cnt) > 0));
 
return cnt;
}
 
/** Load ELF binary from a file.
*
* Load an ELF binary from the specified file. If the file is
156,7 → 169,7
elf_header_t *header = &header_buf;
int i, rc;
 
rc = read(elf->fd, header, sizeof(elf_header_t));
rc = my_read(elf->fd, header, sizeof(elf_header_t));
if (rc < 0) {
printf("read error\n");
return EE_INVALID;
223,7 → 236,8
lseek(elf->fd, header->e_phoff
+ i * sizeof(elf_segment_header_t), SEEK_SET);
 
rc = read(elf->fd, &segment_hdr, sizeof(elf_segment_header_t));
rc = my_read(elf->fd, &segment_hdr,
sizeof(elf_segment_header_t));
if (rc < 0) {
printf("read error\n");
return EE_INVALID;
244,7 → 258,8
lseek(elf->fd, header->e_shoff
+ i * sizeof(elf_section_header_t), SEEK_SET);
 
rc = read(elf->fd, &section_hdr, sizeof(elf_section_header_t));
rc = my_read(elf->fd, &section_hdr,
sizeof(elf_section_header_t));
if (rc < 0) {
printf("read error\n");
return EE_INVALID;
361,8 → 376,8
* For the course of loading, the area needs to be readable
* and writeable.
*/
a = as_area_create((uint8_t *)base + bias,
mem_sz, AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
a = as_area_create((uint8_t *)base + bias, mem_sz,
AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
if (a == (void *)(-1)) {
printf("memory mapping failed\n");
return EE_MEMORY;
398,7 → 413,7
if (now > left) now = left;
 
// printf("read %d...", now);
rc = read(elf->fd, dp, now);
rc = my_read(elf->fd, dp, now);
// printf("->%d\n", rc);
 
if (rc < 0) {