summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c4
-rw-r--r--kernel/keyboard.c6
-rw-r--r--kernel/syscalls.c16
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
}