diff --git a/sys/arch/i386/i386_exec.c b/sys/arch/i386/i386_exec.c index 51ba374..f35c6e9 100644 --- a/sys/arch/i386/i386_exec.c +++ b/sys/arch/i386/i386_exec.c @@ -490,156 +490,190 @@ return; } -int sys_exec(struct thread *td, char *file, char **argv, char **envp) { +int sys_exec( struct thread *td, char *file, char **argv, char **envp ) { - int i = 0x0; - int x = 0x0; + int i = 0x0; + int x = 0x0; + int argc = argv_count(argv); + int envc = envp_count(envp); - int argc = argv_count(argv); - int envc = envp_count(envp); + uint32_t cr3 = 0x0; + uint32_t ldAddr = 0x0; + uint32_t *tmp = 0x0; - uint32_t cr3 = 0x0; + uInt32 seg_size = 0x0; + uInt32 seg_addr = 0x0; - uint32_t *tmp = 0x0; + char *interp = 0x0; - uInt32 seg_size = 0x0; - uInt32 seg_addr = 0x0; - char *interp = 0x0; - uint32_t ldAddr = 0x0; + fileDescriptor_t *fd = 0x0; - fileDescriptor_t *fd = 0x0; + Elf_Ehdr *binaryHeader = 0x0; + Elf_Phdr *programHeader = 0x0; + Elf_Shdr *sectionHeader = 0x0; - Elf_Ehdr *binaryHeader = 0x0; - Elf_Phdr *programHeader = 0x0; - Elf_Shdr *sectionHeader = 0x0; + elf_file_t ef = 0x0; - elf_file_t ef = 0x0; + u_long text_addr = 0, text_size = 0; + u_long data_addr = 0, data_size = 0; - u_long text_addr = 0, text_size = 0; - u_long data_addr = 0, data_size = 0; + struct i386_frame *iFrame = 0x0; - struct i386_frame *iFrame = 0x0; + asm( "movl %%cr3, %0;" : "=r" ( cr3 ) ); - asm("movl %%cr3, %0;" : "=r" (cr3)); + fd = fopen( file, "r" ); - fd = fopen(file, "r"); + if( fd == 0x0 ) { - if (fd == 0x0) { - td->td_retval[0] = 2; - return (-1); - } + td->td_retval[0] = 2; - /* Test If Executable */ - if (fd->perms == 0) { - kprintf("Exec Format Error: Binary File Not Executable6.\n"); - fclose(fd); - return (-1); - } + return( -1 ); - /* Set Threads FD to open FD */ - _current->files[0] = fd; + } - /* Copy In ARGS & ENVS Before Cleaning Virtual Space */ - uint32_t *argv_out = 0x0; - char *args_out = 0x0; + /* Test If Executable */ + if( fd->perms == 0 ) { - args_copyin(argv, (char **)&argv_out, &args_out); + kprintf( "Exec Format Error: Binary File Not Executable6.\n" ); - uint32_t *envp_out = 0x0; - char *envs_out = 0x0; + fclose( fd ); - envs_copyin(envp, (char **)&envp_out, &envs_out); + return( -1 ); + } - //! Clean the virtual of COW pages left over from the fork - //vmm_cleanVirtualSpace( (uint32_t) _current->td.vm_daddr + (_current->td.vm_dsize << PAGE_SHIFT) ); - //MrOlsen 2017-12-15 - FIX! - This should be done before it was causing a lot of problems why did I free space after loading binary???? - //vmm_cleanVirtualSpace((uint32_t) 0x8048000); - vmm_cleanVirtualSpace((uint32_t) VMM_USER_START); + /* Set Threads FD to open FD */ + _current->files[0] = fd; - /* Clear Stack */ - //bzero(STACK_ADDR - (100 * PAGE_SIZE), (PAGE_SIZE * 100)); - for (x = 1; x <= 100; x++) { - vmm_remapPage(vmm_findFreePage(_current->id), (STACK_ADDR+1) - (x * 0x1000), PAGE_DEFAULT | PAGE_STACK, _current->id, 0); - bzero((void *)((STACK_ADDR+1) - (x * 0x1000)), 0x1000); - } + /* Copy In ARGS & ENVS Before Cleaning Virtual Space */ + uint32_t *argv_out = 0x0; + char *args_out = 0x0; - /* Load ELF Header */ - if ((binaryHeader = (Elf_Ehdr *) kmalloc(sizeof(Elf_Ehdr))) == 0x0) - K_PANIC("MALLOC FAILED"); + args_copyin( argv, ( char ** ) &argv_out, &args_out ); - fread(binaryHeader, sizeof(Elf_Ehdr), 1, fd); - /* Done Loading ELF Header */ + uint32_t *envp_out = 0x0; + char *envs_out = 0x0; - /* Check If App Is A Real Application */ - if ((binaryHeader->e_ident[1] != 'E') && (binaryHeader->e_ident[2] != 'L') && (binaryHeader->e_ident[3] != 'F')) { - kprintf("Exec Format Error: Binary File Not Executable7.\n"); - kfree(binaryHeader); - fclose(fd); - return (-1); - } - else if (binaryHeader->e_type != ET_EXEC) { - kprintf("Exec Format Error: Binary File Not Executable8.\n"); - kfree(binaryHeader); - fclose(fd); - return (-1); - } - else if (binaryHeader->e_entry == 0x300000) { - kprintf("Exec Format Error: Binary File Not Executable9.\n"); - kfree(binaryHeader); - fclose(fd); - return (-1); - } + envs_copyin( envp, ( char ** ) &envp_out, &envs_out ); - /* Set Thread ABI */ - td->abi = binaryHeader->e_ident[EI_OSABI]; + //! Clean the virtual of COW pages left over from the fork + //vmm_cleanVirtualSpace( (uint32_t) _current->td.vm_daddr + (_current->td.vm_dsize << PAGE_SHIFT) ); + //MrOlsen 2017-12-15 - FIX! - This should be done before it was causing a lot of problems why did I free space after loading binary???? + //vmm_cleanVirtualSpace((uint32_t) 0x8048000); + vmm_cleanVirtualSpace( ( uint32_t ) VMM_USER_START ); - /* Load The Program Header(s) */ - if ((programHeader = (Elf_Phdr *) kmalloc(sizeof(Elf_Phdr) * binaryHeader->e_phnum)) == 0x0) - K_PANIC("MALLOC FAILED"); + /* Clear Stack */ + //bzero(STACK_ADDR - (100 * PAGE_SIZE), (PAGE_SIZE * 100)); + for( x = 1; x <= 100; x++ ) { - assert(programHeader); + vmm_remapPage( vmm_findFreePage( _current->id ), ( STACK_ADDR + 1 ) - ( x * 0x1000 ), PAGE_DEFAULT | PAGE_STACK, _current->id, 0 ); - kern_fseek(fd, binaryHeader->e_phoff, 0); - fread(programHeader, (sizeof(Elf_Phdr) * binaryHeader->e_phnum), 1, fd); - /* Done Loading Program Header(s) */ + bzero( ( void * ) ( ( STACK_ADDR + 1 ) - ( x * 0x1000 ) ), 0x1000 ); - /* Load The Section Header(s) */ - if ((sectionHeader = (Elf_Shdr *) kmalloc(sizeof(Elf_Shdr) * binaryHeader->e_shnum)) == 0x0) - K_PANIC("MALLOC FAILED"); + } - assert(sectionHeader); - kern_fseek(fd, binaryHeader->e_shoff, 0); - fread(sectionHeader, sizeof(Elf_Shdr) * binaryHeader->e_shnum, 1, fd); - /* Done Loading Section Header(s) */ + /* Load ELF Header */ + if( ( binaryHeader = ( Elf_Ehdr * ) kmalloc( sizeof( Elf_Ehdr ) ) ) == 0x0 ) + K_PANIC( "MALLOC FAILED" ); - ef = kmalloc(sizeof(struct elf_file)); - memset(ef, 0x0, sizeof(struct elf_file)); + fread( binaryHeader, sizeof( Elf_Ehdr ), 1, fd ); + /* Done Loading ELF Header */ - /* Loop Through The Header And Load Sections Which Need To Be Loaded */ - for (i = 0; i < binaryHeader->e_phnum; i++) { - switch (programHeader[i].p_type) { - case PT_LOAD: - if (programHeader[i].p_memsz == 0x0) - break; + /* Check If App Is A Real Application */ + if( ( binaryHeader->e_ident[1] != 'E' ) && ( binaryHeader->e_ident[2] != 'L' ) && ( binaryHeader->e_ident[3] != 'F' ) ) { - seg_addr = trunc_page(programHeader[i].p_vaddr); - seg_size = round_page(programHeader[i].p_memsz + programHeader[i].p_vaddr - seg_addr); + kprintf( "Exec Format Error: Binary File Not Executable7.\n" ); - /* - Allocate Memory Im Going To Have To Make This Load Memory With Correct - Settings so it helps us in the future - */ - for (x = 0x0; x < (round_page(programHeader[i].p_memsz)); x += 0x1000) { - /* Make readonly and read/write !!! */ - if (vmm_remapPage(vmm_findFreePage(_current->id), ((programHeader[i].p_vaddr & 0xFFFFF000) + x), PAGE_DEFAULT, _current->id, 0) == 0x0) { - K_PANIC("Error: Remap Page Failed"); - } - else { - //MrOlsen 2018-01-15 kprintf("rP[0x%X]", (programHeader[i].p_vaddr & 0xFFFFF000) + x); - } + kfree( binaryHeader ); - memset((void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x), 0x0, 0x1000); + fclose( fd ); + + return( -1 ); + + } else if( binaryHeader->e_type != ET_EXEC ) { + + kprintf( "Exec Format Error: Binary File Not Executable8.\n" ); + + kfree( binaryHeader ); + + fclose( fd ); + + return( -1 ); + + } else if( binaryHeader->e_entry == 0x300000 ) { + + kprintf( "Exec Format Error: Binary File Not Executable9.\n" ); + + kfree( binaryHeader ); + + fclose( fd ); + + return( -1 ); + + } + + /* Set Thread ABI */ + td->abi = binaryHeader->e_ident[EI_OSABI]; + + /* Load The Program Header(s) */ + if( ( programHeader = ( Elf_Phdr * ) kmalloc( sizeof( Elf_Phdr ) * binaryHeader->e_phnum ) ) == 0x0 ) + K_PANIC( "MALLOC FAILED" ); + + assert( programHeader ); + + kern_fseek( fd, binaryHeader->e_phoff, 0 ); + + fread( programHeader, ( sizeof( Elf_Phdr ) * binaryHeader->e_phnum ), 1, fd ); + /* Done Loading Program Header(s) */ + + /* Load The Section Header(s) */ + if( ( sectionHeader = ( Elf_Shdr * ) kmalloc( sizeof( Elf_Shdr ) * binaryHeader->e_shnum ) ) == 0x0 ) + K_PANIC( "MALLOC FAILED" ); + + assert( sectionHeader ); + + kern_fseek( fd, binaryHeader->e_shoff, 0 ); + + fread( sectionHeader, sizeof( Elf_Shdr ) * binaryHeader->e_shnum, 1, fd ); + /* Done Loading Section Header(s) */ + + ef = kmalloc( sizeof( struct elf_file ) ); + memset( ef, 0x0, sizeof( struct elf_file ) ); + + /* Loop Through The Header And Load Sections Which Need To Be Loaded */ + for (i = 0; i < binaryHeader->e_phnum; i++) { + + switch (programHeader[i].p_type) { + + case PT_LOAD: + + if (programHeader[i].p_memsz == 0x0) + + break; + + seg_addr = trunc_page(programHeader[i].p_vaddr); + seg_size = round_page(programHeader[i].p_memsz + programHeader[i].p_vaddr - seg_addr); + + /* + * Allocate Memory Im Going To Have To Make This Load Memory With Correct + * Settings so it helps us in the future + */ + + for( x = 0x0; x < ( round_page( programHeader[i].p_memsz ) ); x += 0x1000 ) { + + /* Make readonly and read/write !!! */ + + if( vmm_remapPage( vmm_findFreePage( _current->id ), ( ( programHeader[i].p_vaddr & 0xFFFFF000 ) + x ), PAGE_DEFAULT, _current->id, 0 ) == 0x0 ) { + + K_PANIC( "Error: Remap Page Failed" ); + + } else { + + //MrOlsen 2018-01-15 kprintf("rP[0x%X]", (programHeader[i].p_vaddr & 0xFFFFF000) + x); + + } + + memset( (void * ) ( ( programHeader[i].p_vaddr & 0xFFFFF000 ) + x ), 0x0, 0x1000 ); } @@ -702,9 +736,12 @@ ldAddr = ldEnable(interp); //ef->ld_addr = ldEnable(); break; + case PT_GNU_STACK: + asm("nop"); - break; + break; + default: break; } diff --git a/sys/vmm/vmm_mmap.c b/sys/vmm/vmm_mmap.c index 278916c..78fd541 100644 --- a/sys/vmm/vmm_mmap.c +++ b/sys/vmm/vmm_mmap.c @@ -136,7 +136,7 @@ //TEMP - kprintf( "[%s:%i] munmap(0x%X:%i) Not Implemented yet.\n", __FILE__, __LINE__, uap->addr, uap->len ); + kprintf( "[%s:%i] munmap(0x%X:0x%X) Not Implemented yet.\n", __FILE__, __LINE__, uap->addr, uap->len ); td->td_retval[0] = 0;