diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel.c | 4 | ||||
| -rw-r--r-- | kernel/keyboard.c | 6 | ||||
| -rw-r--r-- | kernel/syscalls.c | 16 |
3 files changed, 18 insertions, 8 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c index 66ca21a..684b70d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -103,9 +103,9 @@ void kernel_main(uint32_t initial_stack, int mp) // ringbuffer for stdin! ringbuffer_init(); - // load and run inode 15 (shell) + // load and run foolshell // we will come back into the kernel only on interrupts... - syscall_execve(15,0,0); + syscall_execve("/bin/foolshell",0,0); // diff --git a/kernel/keyboard.c b/kernel/keyboard.c index 49c2fa0..074c495 100644 --- a/kernel/keyboard.c +++ b/kernel/keyboard.c @@ -112,6 +112,7 @@ void keyboard_handle(uint8_t in) uint8_t break_key_shift_r=0xb6; uint8_t break_caps_lock=0xba; + uint8_t break_slash=0xb5; if(make_key_shift_l==in)shift_l=true; if(break_key_shift_l==in)shift_l=false;; @@ -126,6 +127,11 @@ void keyboard_handle(uint8_t in) bool match=false; // optimize this! + if(break_slash==in) + { + ascii='/'; + match=true; + } if(break_key_space==in) { ascii=' '; diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 401a5aa..e4cb6cc 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -158,9 +158,12 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) int syscall_execve(char *name, char **argv, char **env) { #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv,env); #endif + int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); + if(inode_nr<1)return -1; + char arg1[100]; char arg2[100]; @@ -173,15 +176,15 @@ int syscall_execve(char *name, char **argv, char **env) if(argv!=NULL) { - while(argv[argc+1]!=NULL) + while(argv[argc]!=NULL) { //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg at 0x%08X: %s", argv[argc],argv[argc]); int i=-1; do{ i++; - argvcopy[argc][i]=argv[argc+1][i]; - }while(argv[argc+1][i]!=0); + argvcopy[argc][i]=argv[argc][i]; + }while(argv[argc][i]!=0); argc++; } @@ -193,7 +196,7 @@ int syscall_execve(char *name, char **argv, char **env) //load binary ext2_check(EXT2_RAM_ADDRESS); - ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); + ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x800000,0x100000); Elf32_Ehdr *elf; elf=0x800000; @@ -276,6 +279,7 @@ int syscall_execve(char *name, char **argv, char **env) } // argv / argc + //asm("mov $0xf00000,%esp"); // set stack pointer asm("push %0" :: "r" (argvcopy)); asm("push %0" :: "r" (argc)); @@ -345,7 +349,7 @@ int syscall_exit(int ret, int none1, int none2) #endif static char *argv[]={"shell","--silent",NULL}; - syscall_execve(15,argv,0); // start shell + syscall_execve("/bin/foolshell",argv,0); // start shell } |
