Example #1
0
string formatter::format_vma(field_datum const & f)
{
	return get_vma(f.sample.vma, vma_64);
}
Example #2
0
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;
}