diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/config.h | 2 | ||||
| -rw-r--r-- | kernel/console.c | 2 | ||||
| -rw-r--r-- | kernel/kernel.c | 3 | ||||
| -rw-r--r-- | kernel/mem.c | 4 | ||||
| -rw-r--r-- | kernel/syscalls.c | 49 | ||||
| -rw-r--r-- | kernel/task.c | 2 |
6 files changed, 28 insertions, 34 deletions
diff --git a/kernel/config.h b/kernel/config.h index 216641c..2e2a169 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -8,7 +8,7 @@ #define FOOLOS_CONFIG_H #define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line -//#define FOOLOS_LOG_OFF // do not log anything +#define FOOLOS_LOG_OFF // do not log anything #define FOOLOS_CONSOLE // otherwise VESA will be used! #define FOOLSOS_SHOW_VESAMODES #define MEM_PRINT_MEMORYMAP diff --git a/kernel/console.c b/kernel/console.c index 0a208bb..9db1c0b 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -16,7 +16,7 @@ uint32_t console_init(){ scr_clear(); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init console"); - // int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin"); +//int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,"/binfont.bin"); // if(inode_nr!=-1)ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x8000000,0xffff); // load font; return 0; } diff --git a/kernel/kernel.c b/kernel/kernel.c index 76ae8d7..97847e6 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -118,7 +118,6 @@ void kernel_main(uint32_t eax,uint32_t ebx) int_init(0x08); - //while(1); // // Scan the PCI Bus @@ -151,7 +150,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) // // Initialize Multitasking // - //task_init(dir); //; this will never return! + task_init(dir); //; this will never return! // while(1); //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"."); diff --git a/kernel/mem.c b/kernel/mem.c index 72b92af..f29c34f 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -102,10 +102,11 @@ int mmap_first_free_s (uint32_t x) void pmmngr_init_region (uint32_t base, uint32_t size) { - if(base<0x100000)return; uint32_t align = base / PMMNGR_BLOCK_SIZE +1; // TODO: calc properly uint32_t blocks = size / PMMNGR_BLOCK_SIZE -1; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init blocks: 0x%08X 0x%08X",base,size); + for (; blocks>0; blocks--) { mmap_unset (align++); @@ -253,6 +254,7 @@ void mem_init(uint32_t memmap,uint32_t length) // deinitialize kernel + memory (TODO: modules) pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)); pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4+PMMNGR_BLOCK_SIZE); + pmmngr_deinit_region(0,0x700000); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Usable Mem: %d (0x%X) bytes. (~%d MB)",total_mem,total_mem,total_mem/1024/1024); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Currently Free 4K blocks: %d blocks.",mem_free_blocks); diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 6d46f1a..38f7161 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -14,7 +14,7 @@ int syscall_unhandled(int nr) { log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"syscall: %d", nr); - panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + panic(FOOLOS_MODULE_NAME,"unhandled syscall (generic handler)"); } int syscall_lseek(int file,int ptr,int dir) @@ -23,7 +23,7 @@ int syscall_lseek(int file,int ptr,int dir) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"lseek (file=%d, ptr=%d, dir=%d)", file,ptr,dir); #endif - panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + panic(FOOLOS_MODULE_NAME,"unhandled syscall: lseek"); return 0; @@ -39,7 +39,7 @@ int syscall_write(int file, char *buf, int len) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] write(file=%d, buf=0x%08X, len=%d)", task_get_current_pid(),file,buf,len); #endif - if(file!=1&&file!=2) panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + if(file!=1&&file!=2) panic(FOOLOS_MODULE_NAME,"unhandled syscall: write (only stdout and stderr)"); //stderr and stdout go to console for(int i=0;i<len;i++) @@ -59,8 +59,9 @@ int syscall_read(int file, char *buf, int len) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read(file=%d, buf=0x%08X, len=%d)", file,buf,len); #endif + // stdin TODO: other descroptiors! - if(file!=0) panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + if(file!=0) panic(FOOLOS_MODULE_NAME,"unhandled syscall: read (only stdin)"); { if(eof) { @@ -149,28 +150,18 @@ int copy_args(char **in, char **out) return count; } - -int *entry_global=1; -char **argv_global=10; -char **env_global=300; -char **argv=0x8000000; -char **env=0x8000000+300; - - int syscall_execve(char *name, char **argv1, char **env1) { #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1); #endif - copy_args(argv1,argv_global); - copy_args(env1,env_global); - uint32_t alloc; - *entry_global=load_elf(name,&alloc); + uint32_t entry_global=load_elf(name,&alloc); + task_set_brk(alloc); - if(!*entry_global) + if(!entry_global) { #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve: bailing out!"); @@ -181,18 +172,14 @@ int syscall_execve(char *name, char **argv1, char **env1) /* try to move this to asm */ //asm volatile("jmp ."); asm volatile("mov $0x8fff000,%esp"); // set stack at high end of process image + int arg_count=0; - int arg_count=copy_args(argv_global,argv); - copy_args(env_global,env); - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"argc: %d" ,arg_count); - - asm volatile ("push %0" :: "r" (argv)); + asm volatile ("push %0" :: "r" (argv1)); asm volatile ("push %0" :: "r" (arg_count)); - asm volatile ("push %0" :: "r" (env)); + asm volatile ("push %0" :: "r" (env1)); // push addr and return to it - asm volatile ("push %0"::"r"(*entry_global)); + asm volatile ("pushl %0"::"r"(entry_global)); asm volatile ("sti"); asm volatile ("ret"); @@ -206,7 +193,7 @@ int syscall_open(char *name, int flags, int mode) #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"open (name=0x%08X(\"%s\"), flags=%d, mode=%d)",name, name,flags,mode); #endif - panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + panic(FOOLOS_MODULE_NAME,"unhandled syscall: open"); } @@ -220,7 +207,7 @@ int syscall_close(int file,int none1,int none2) #endif if(file!=0&&file!=1&&file!=2) - panic(FOOLOS_MODULE_NAME,"unhandled syscall"); + panic(FOOLOS_MODULE_NAME,"unhandled syscall: close"); return -1; } @@ -234,18 +221,22 @@ int syscall_isatty(int file,int none1,int none2) return 1; } +uint32_t fuckalloc=0x8500000; // TODO: per process basis! uint32_t syscall_sbrk(int incr, int none1, int none2) { uint32_t alloc=task_get_brk(); - uint32_t oldalloc=alloc; - alloc+=incr; + + uint32_t oldalloc=fuckalloc; + fuckalloc+=incr; + task_set_brk(alloc); #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d) = 0x%08X", incr,oldalloc); #endif + return oldalloc; } diff --git a/kernel/task.c b/kernel/task.c index a2a2ab8..1474a64 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -85,6 +85,7 @@ volatile uint32_t task_switch_next(uint32_t oldesp) timer_tick(); + // check if multitasking has been started if(current_task<0)return oldesp; @@ -160,6 +161,7 @@ volatile void task_init(pdirectory *dir) current_task=0; syscall_execve("/bin/init",argv_init,env_init); + //syscall_execve("/bin/foolshell",argv_init,env_init); // syscall_execve("/bin/tput",argv,env); } |
