static int clone_stack(struct proc_info * new_proc, struct proc_info * old_proc) { struct buf * const old_region = (*old_proc->mm.regions)[MM_STACK_REGION]; struct buf * new_region; int err; if (unlikely(!old_region)) { KERROR_DBG("No stack created\n"); return 0; } err = clone2vr(old_region, &new_region); if (err) return err; err = vm_replace_region(new_proc, new_region, MM_STACK_REGION, VM_INSOP_MAP_REG); return err; }
static int load_sections(struct proc_info * proc, file_t * file, struct elf32_header * elfhdr, struct elf32_phdr * phdr, uintptr_t rbase, uintptr_t * vaddr_base) { int e_type = elfhdr->e_type; size_t phnum = elfhdr->e_phnum; for (size_t i = 0; i < phnum; i++) { struct buf * sect; int err; if (!(phdr[i].p_type == PT_LOAD && phdr[i].p_memsz != 0)) continue; if ((err = load_section(§, file, rbase, &phdr[i]))) return err; if (e_type == ET_EXEC && i < 2) { const int reg_nr = (i == 0) ? MM_CODE_REGION : MM_HEAP_REGION; if (i == 0) *vaddr_base = phdr[i].p_vaddr + rbase; err = vm_replace_region(proc, sect, reg_nr, VM_INSOP_MAP_REG); if (err) { KERROR(KERROR_ERR, "Failed to replace a region\n"); return err; } } else { err = vm_insert_region(proc, sect, VM_INSOP_MAP_REG); if (err < 0) { KERROR(KERROR_ERR, "Failed to insert a region\n"); return -1; } } } return 0; }