diff --git a/bin/init/main.c b/bin/init/main.c index db777dd..5a7052e 100644 --- a/bin/init/main.c +++ b/bin/init/main.c @@ -34,7 +34,7 @@ #include #include -int main(int argc,char **argv) { +int main(int argc,char **argv, char **envp) { int i=0x0; mpi_message_t myMsg; @@ -56,7 +56,6 @@ printf("Initializing UbixOS\n"); - /* Start TTYD */ /* i = fork(); diff --git a/sys/i386/i386_exec.c b/sys/i386/i386_exec.c index 457edad..4d41c89 100644 --- a/sys/i386/i386_exec.c +++ b/sys/i386/i386_exec.c @@ -54,6 +54,25 @@ #define AUXARGS_ENTRY(pos, id, val) {*pos = id;pos++; *pos = val;pos++;} + +static int argv_count(char **argv) { + int i = 0; + + while (*argv++ != 0x0) + i++; + + return(i); +} + +static int envp_count(char **envp) { + int i = 0; + + while (*envp++ != 0x0) + i++; + + return(i); +} + static int elf_parse_dynamic(elf_file_t ef); /***************************************************************************************** @@ -159,7 +178,7 @@ The Freshly Allocated Pages With The Correct Permissions *****************************************************************************************/ -void execFile(char *file, int argc, char **argv, int console) { +void execFile(char *file, char **argv, char **envp, int console) { kTask_t *newProcess = 0x0; @@ -172,6 +191,9 @@ Elf32_Phdr *programHeader = 0x0; + int argc = argv_count(argv); + int envc = envp_count(envp); + /* Get A New Task For This Proccess */ newProcess = schedNewTask(); assert(newProcess); @@ -330,26 +352,52 @@ kfree(programHeader); fclose(newProcess->imageFd); - tmp = (uInt32 *) newProcess->tss.esp0 - 5; + + tmp = (uInt32 *) newProcess->tss.esp0 -5; tmp[0] = binaryHeader->e_entry; tmp[3] = STACK_ADDR - 12; + #define ENVP_PAGE 0x1000 + #define ARGV_PAGE 0x1000 + #define ELF_AUX 0x1000 + #define STACK_PAD 16 + + newProcess->tss.esp = STACK_ADDR - ARGV_PAGE - ENVP_PAGE - ELF_AUX - (argc + 1) - (envc + 1) - STACK_PAD; + tmp = (uint32_t *) newProcess->tss.esp; - kprintf("argv: [0x%X]\n", argv); - //*tmp++ = 0x0; // Stack EIP Return Addr - //*tmp++ = tmp + 1; // Pointer To AP - *tmp++ = 0x1; // ARGC - *tmp++ = 0x100; // ARGV - *tmp++ = 0x0; // ARGV TERM - *tmp++ = 0x0; // ENV - *tmp++ = 0x0; // ENV TERM + tmp[0] = argc; + + uint32_t sp = 0x0; + + for (i=1;i<=argc;i++) { + tmp[i] = STACK_ADDR - ARGV_PAGE + sp; + strcpy(tmp[i], argv[i-1]); + sp += strlen(argv[i-1]) + 1; + } + tmp[i++] = 0x0; + + sp = 0; + for (int x = 0;ximageFd;//0xBEEFDEAD;//ef; break; default: - kprintf("t_tag: 0x%X>", dynp->d_tag); + asm("nop"); + //kprintf("t_tag: 0x%X>", dynp->d_tag); break; } } diff --git a/sys/include/ubixos/exec.h b/sys/include/ubixos/exec.h index b3fba3e..1fc16e6 100644 --- a/sys/include/ubixos/exec.h +++ b/sys/include/ubixos/exec.h @@ -34,7 +34,7 @@ #include uInt32 execThread( void (*tproc)( void ), uInt32, char * ); -void execFile( char *file, int argc, char **argv, int console ); +void execFile( char *file, char **argv, char **envp, int console ); int sys_exec( struct thread *, char *, char **, char ** ); diff --git a/sys/init/main.c b/sys/init/main.c index b1a4866..a542dd3 100644 --- a/sys/init/main.c +++ b/sys/init/main.c @@ -93,6 +93,10 @@ union descriptorTableUnion *gdt __attribute__ ((packed)); } loadGDT = { (11 * sizeof(union descriptorTableUnion) - 1), ubixGDT }; + +static char *argv_init[2] = { "init", NULL, }; // ARGV For Initial Proccess +static char *envp_init[6] = { "HOME=/", "PWD=/", "PATH=/bin:/sbin:/usr/bin:/usr/sbin", "USER=root", "GROUP=admin", NULL, }; //ENVP For Initial Proccess + /** * \brief This is the entry point into the os where all of the kernels sub systems are started up. * @@ -144,7 +148,7 @@ execThread(systemTask, (uInt32) sysTask + 0x2000, 0x0); kprintf("Thread Start!\n"); - execFile("sys:/bin/init", 0x0, 0x0, 0x0); /* OS Initializer */ + execFile("sys:/bin/init", argv_init, envp_init, 0x0); /* OS Initializer */ kprintf("File Start!\n"); //execFile( "sys:/bin/login", 0x0, 0x0, 0x0 ); /* OS Initializer */ diff --git a/sys/kernel/kern_execve.c b/sys/kernel/kern_execve.c new file mode 100644 index 0000000..7134720 --- /dev/null +++ b/sys/kernel/kern_execve.c @@ -0,0 +1,5 @@ +/* Kernel EXECVE */ + +int kern_execve(const char *file, char **argv, char **envp) { + return(0); +}