string formatter::format_vma(field_datum const & f) { return get_vma(f.sample.vma, vma_64); }
int load_elf(task_struct* task, char* bin_name) { int i; int m=0; struct file* file = tarfs_open(bin_name, O_RDONLY); if (file == NULL) { return -1; } char* dir = strstr(bin_name, "/"); char tmp[100]="init"; /*size_t length = strlen(dir); size_t length1 = strlen(bin_name); strncpy(task->cur_dir, bin_name, length1-length+1);*/ size_t length = strlen(dir); size_t length1 = strlen(bin_name); strcpy(task->cur_dir, "rootfs/"); strncpy(tmp, bin_name, length1-length+1); //strcat(tmp,"\0"); strcat(task->cur_dir, tmp); void* file_start = (void*) file->start; elf_h *elfh = (elf_h*) file_start; //find elf header //dprintf("LOAD_ELF: elf header \n"); //dprintf("LOAD_ELF: \n"); pgm_h *pgh = (pgm_h*) ((uint64_t) elfh + elfh->e_phoff);// find program header task->rip = elfh->e_entry; //assign entry for the task //get the cur dir for the task for (i = 0; i < elfh->e_phnum; i++) //go through all the program headers { if (pgh->p_type == PT_LOAD) //if the program header is loadable { //warning: didn't do the alignment, maybe a bug in future if (pgh->p_flag & PH_TYPE_X) //then it's the .text section { task->mm->start_code = pgh->p_vaddr; task->mm->end_code = pgh->p_vaddr + pgh->p_memsz; //map code/text segment uint64_t code_size = task->mm->end_code - task->mm->start_code; // TODO: reference to original physical pages get lost. Need to free umalloc((void*) task->mm->start_code, code_size); memcpy((void*) task->mm->start_code, (void*) file_start + pgh->p_offset, pgh->p_filesz); struct vma_struct* vma_tmp = get_vma(task->mm, CODE); vma_tmp->vm_file = file; vma_tmp->file_offset = pgh->p_offset; m++; } else //it's the .data section { task->mm->start_data = pgh->p_vaddr; task->mm->end_data = pgh->p_vaddr + pgh->p_filesz; uint64_t data_size = task->mm->end_data - task->mm->start_data; task->mm->bss = pgh->p_memsz - pgh->p_filesz; // task->mm->end_data +=task->mm->bss; //map data segment (include bss segment) // TODO: reference to original physical pages get lost. Need to free umalloc((void*) task->mm->start_data, data_size+task->mm->bss); //copy data size memcpy((void*) task->mm->start_data, (void*) file_start + pgh->p_offset, pgh->p_filesz); //set bss segment value to all 0 memset((void*)task->mm->end_data,0,task->mm->bss); struct vma_struct* vma_tmp1 = get_vma(task->mm, DATA); vma_tmp1->vm_file = file; vma_tmp1->file_offset = pgh->p_offset; m++; } } pgh++; } if(m==0) { return -1; } return 0; }