X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/0eabc11fcf240415e39f3873dfce7cd9384b3042..75339638bc5f21f13d3475374ecbd91065a427c3:/lunaix-os/kernel/loader/elf.c?ds=sidebyside diff --git a/lunaix-os/kernel/loader/elf.c b/lunaix-os/kernel/loader/elf.c index 241ddf9..f6d4947 100644 --- a/lunaix-os/kernel/loader/elf.c +++ b/lunaix-os/kernel/loader/elf.c @@ -7,33 +7,13 @@ #include #include -int -__elf_populate_mapped(struct mm_region* region, void* pg, off_t segfoff) -{ - size_t segsz = region->flen; - size_t segmoff = segfoff - region->foff; - - if (segmoff >= segsz) { - return 0; - } - - struct v_file* file = region->mfile; - size_t rdlen = MIN(segsz - segmoff, PG_SIZE); - - if (rdlen == PG_SIZE) { - // This is because we want to exploit any optimization on read_page - return file->ops->read_page(file->inode, pg, PG_SIZE, segfoff); - } else { - // we don't want to over-read the segment! - return file->ops->read(file->inode, pg, rdlen, segfoff); - } -} - int elf_map_segment(struct ld_param* ldparam, struct v_file* elfile, struct elf32_phdr* phdr) { + assert(PG_ALIGNED(phdr->p_offset)); + int proct = 0; if ((phdr->p_flags & PF_R)) { proct |= PROT_READ; @@ -45,21 +25,19 @@ elf_map_segment(struct ld_param* ldparam, proct |= PROT_EXEC; } - struct mm_region* seg_reg; struct mmap_param param = { .vms_mnt = ldparam->vms_mnt, .pvms = &ldparam->proc->mm, .proct = proct, - .offset = phdr->p_offset, + .offset = PG_ALIGN(phdr->p_offset), .mlen = ROUNDUP(phdr->p_memsz, PG_SIZE), - .flen = phdr->p_filesz, + .flen = phdr->p_filesz + PG_MOD(phdr->p_va), .flags = MAP_FIXED | MAP_PRIVATE, .type = REGION_TYPE_CODE }; + struct mm_region* seg_reg; int status = mem_map(NULL, &seg_reg, PG_ALIGN(phdr->p_va), elfile, ¶m); if (!status) { - seg_reg->init_page = __elf_populate_mapped; - size_t next_addr = phdr->p_memsz + phdr->p_va; ldparam->info.end = MAX(ldparam->info.end, ROUNDUP(next_addr, PG_SIZE)); ldparam->info.mem_sz += phdr->p_memsz;