diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-20 04:51:23 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-20 04:51:23 +0100 |
| commit | 1acde03a7c0f85aca9919e374e3df6cee6f0bd08 (patch) | |
| tree | 10ae84ce2693bad62e5c7376cd0c3c40a80c93df | |
| parent | bcab3c0be8ff5fe1db1fac9e01973531cc29f554 (diff) | |
workin on syscall interface etc..
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | README.md | 6 | ||||
| -rw-r--r-- | asm/int_syscall_handler.asm | 52 | ||||
| -rw-r--r-- | kernel/config.h | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 2 | ||||
| -rw-r--r-- | kernel/syscalls.c | 108 | ||||
| -rw-r--r-- | kernel/syscalls.h | 21 | ||||
| -rw-r--r-- | userspace/Makefile | 6 | ||||
| -rw-r--r-- | userspace/add.c | 1 | ||||
| -rw-r--r-- | userspace/brainfuck.c | 2 | ||||
| -rw-r--r-- | userspace/foolshell.c | 18 | ||||
| -rw-r--r-- | userspace/simple.c | 3 | ||||
| -rw-r--r-- | userspace/syscalls.c | 76 | ||||
| -rw-r--r-- | video/console.h | 2 |
14 files changed, 236 insertions, 65 deletions
@@ -35,7 +35,8 @@ CFLAGS= CFLAGS+=-ffreestanding CFLAGS+=-nostdlib CFLAGS+=-std=gnu11 -CFLAGS+= -I. +CFLAGS+=-I. +CFLAGS+=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include #CFLAGS+=-lgcc CFLAGS+=-Werror-implicit-function-declaration #CFLAGS+=-fno-zero-initialized-in-bss @@ -36,6 +36,12 @@ $ cat FoolOS.img > /dev/sdX You will require some dependencies (as newlib) in order to build. +adapt libgloss/libnosys + +uncomment environ.c and add stubwarnings for sbrk and exit +Build newlib with: --target=i686-elf to use the crosscompiler + + Supported Platforms ------------------- diff --git a/asm/int_syscall_handler.asm b/asm/int_syscall_handler.asm index 25de51a..e9bc79d 100644 --- a/asm/int_syscall_handler.asm +++ b/asm/int_syscall_handler.asm @@ -4,6 +4,12 @@ global int_syscall_handler [extern syscall_read] [extern syscall_readdir] [extern syscall_execve] +[extern syscall_open] +[extern syscall_close] +[extern syscall_fstat] +[extern syscall_isatty] +[extern syscall_lseek] +[extern syscall_sbrk] [bits 32] int_syscall_handler: @@ -26,6 +32,24 @@ int_syscall_handler: cmp eax, 64 je call_execve + cmp eax, 65 + je call_open + + cmp eax, 66 + je call_close + + cmp eax, 67 + je call_fstat + + cmp eax, 68 + je call_isatty + + cmp eax, 69 + je call_lseek + + cmp eax, 70 + je call_sbrk + done: mov ebx,eax @@ -53,11 +77,37 @@ call_write: call syscall_write jmp done +call_open: + call syscall_open + jmp done + call_readdir: call syscall_readdir jmp done +call_close: + call syscall_close + jmp done + +call_fstat: + call syscall_fstat + jmp done + +call_isatty: + call syscall_isatty + jmp done + +call_lseek: + call syscall_lseek + jmp done + +call_sbrk: + call syscall_sbrk + jmp done + + ;;; THIS CALLS NEED REENABLE INTERRUPTS BEFORE calling workers call_read: + mov al, 0x20 ;Port number AND command number to Acknowledge IRQ out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts sti @@ -67,9 +117,11 @@ call_read: jmp done_blocking call_execve: + mov al, 0x20 ;Port number AND command number to Acknowledge IRQ out 0x20, al ;Acknowledge IRQ, so we keep getting interrupts sti + call syscall_execve jmp $ ; this should never return TODO: pop stack!? diff --git a/kernel/config.h b/kernel/config.h index 039ced7..ef0fa71 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -10,4 +10,5 @@ #define FOOLOS_CONSOLE // otherwise VESA will be used! #define MEM_PRINT_MEMORYMAP #define LOG_BUF_SIZE 4069 +#define LOG_SYSCALLS diff --git a/kernel/kernel.c b/kernel/kernel.c index 2f7cfc3..6058480 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -108,7 +108,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) // - vmem_init(); + // vmem_init(); // diff --git a/kernel/syscalls.c b/kernel/syscalls.c index b5a581d..1de5d3a 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -5,11 +5,20 @@ #include "fs/fs.h" #include "fs/ext2.h" #include "kernel/console.h" +#include "kernel/config.h" +#include <sys/stat.h> -// +static int preread; +static int alloc=0x600000; // TODO: implement properly sbrk!!! + int syscall_write(int file, char *buf, int len) { + + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"write(file=%d, buf=0x%08X, len=%d)", file,buf,len); + #endif + // ALL output to stdout for(int i=0;i<len;i++) { @@ -22,6 +31,10 @@ int syscall_write(int file, char *buf, int len) int syscall_read(int file, char *buf, int len) { + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read(file=%d, buf=0x%08X, len=%d)", file,buf,len); + #endif + // stdin if(file==1) { @@ -48,14 +61,107 @@ int syscall_read(int file, char *buf, int len) int syscall_readdir(const char *name,fs_dirent *dirs,int max) { + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"readdir(name=0x%08X, dirs=0x%08X, %d)", name,dirs,max); + #endif + return fs_readdir(name,dirs,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); + #endif + ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); // autorun "user-space" prog asm("push $0x800000"); asm("ret"); } + +int syscall_open(char *name, int flags, int len) +{ + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"open (name=0x%08X, flags=%d, len=%d)", name,flags,len); + #endif + + return 1; + +} + +//newcomers +// +int syscall_close(int file,int none1,int none2) +{ + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"close (file=%d)", file); + #endif + + return -1; +} + +int syscall_fstat(int file, struct stat *st,int none) +{ + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"fstat (file=%d,stat=0x%08X)", file,st); + #endif + + st->st_mode = S_IFCHR; + return 0; +} + +int syscall_isatty(int file,int none1,int none2) +{ + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"isatty (file=%d)", file); + #endif + + return 1; +} + +int syscall_lseek(int file,int ptr,int dir) +{ + + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"lseek (file=%d, ptr=%d, dir=%d)", file,ptr,dir); + #endif + + if(dir==0)preread=ptr; + else{ while(1);} + return preread; +} + +caddr_t syscall_sbrk(int incr, int none1, int none2) +{ + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d)", incr); + #endif + + int oldalloc=alloc; + alloc+=incr; + return oldalloc; + + /* + + extern char end; +// char _end; + static char *heap_end; + char *prev_heap_end; + + if (heap_end == 0) { + heap_end = &end; + } + prev_heap_end = heap_end; + + if (heap_end + incr > stack_ptr) { + write (1, "Heap and stack collision\n", 25); + abort (); + } + + heap_end += incr; + return (caddr_t) prev_heap_end; + */ +} + diff --git a/kernel/syscalls.h b/kernel/syscalls.h index 6569aa6..63aafc4 100644 --- a/kernel/syscalls.h +++ b/kernel/syscalls.h @@ -1,6 +1,27 @@ #include "fs/fs.h" +#define SYSCALL_WRITE 61 +#define SYSCALL_READ 62 +#define SYSCALL_READDIR 63 +#define SYSCALL_EXECVE 64 +#define SYSCALL_OPEN 65 +#define SYSCALL_CLOSE 66 +#define SYSCALL_FSTAT 67 +#define SYSCALL_ISATTY 68 +#define SYSCALL_LSEEK 69 +#define SYSCALL_SBRK 70 + + +int syscall_open(char *name, int flags, int len); int syscall_write(int file, char *buf, int len); int syscall_read(int file, char *buf, int len); int syscall_readdir(const char *name,fs_dirent *dirs,int max); int syscall_execve(char *name, char **argv, char **env); + +int syscall_close(int file,int none1,int none2); +int syscall_fstat(int file, struct stat *st,int none); +int syscall_isatty(int file,int none1,int none2); +int syscall_lseek(int file,int ptr,int dir); +int syscall_sbrk(int incr, int none1, int none2); + +// missing: _exit, environ, fork, getpid, kill, link, stat, times, unlink, wait; diff --git a/userspace/Makefile b/userspace/Makefile index d54bfa8..564ffe0 100644 --- a/userspace/Makefile +++ b/userspace/Makefile @@ -3,12 +3,10 @@ CC=i686-elf-gcc LD=i686-elf-ld -CFLAGS=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include +CFLAGS=-I.. -I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include CFLAGS+=--no-builtin-malloc CFLAGS+=--no-builtin-free -LDFLAGS=-L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/newlib/ \ - -L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/libgloss/libnosys/ \ - -lnosys +LDFLAGS=-L/home/miguel/temp/fool-os-stuff/newlib-build-clean-new/i686-elf/newlib ext2.img: shell simple brainfuck add dd if=/dev/zero of=ext2.img bs=512 count=500 diff --git a/userspace/add.c b/userspace/add.c index 17ddb64..eecb05a 100644 --- a/userspace/add.c +++ b/userspace/add.c @@ -6,7 +6,6 @@ int main(int argc, char **argv) { - syscalls_init(); FILE *input; input=fopen(1,"r"); diff --git a/userspace/brainfuck.c b/userspace/brainfuck.c index a54e4e5..f985fb9 100644 --- a/userspace/brainfuck.c +++ b/userspace/brainfuck.c @@ -37,8 +37,6 @@ void usage() { int main(int argc, char **argv) { - //added by FOOLOS - syscalls_init(); // used by the bf program unsigned char *dataptr = malloc(sizeof(char) * DATA_SIZE); diff --git a/userspace/foolshell.c b/userspace/foolshell.c index 3fe7353..77c78dd 100644 --- a/userspace/foolshell.c +++ b/userspace/foolshell.c @@ -1,8 +1,11 @@ #include <stdio.h> +#include <assert.h> #include <string.h> #include "syscalls.c" #include "../fs/fs.h" +char **environ; + void hello() { puts( "Welcome to FoolShell v0.1" @@ -17,7 +20,6 @@ void prompt() { int main(int argc, char **argv) { - syscalls_init(); hello(); FILE *input; @@ -86,7 +88,7 @@ int process(char *buf) if(!strcmp(command,"help")) { - puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'ls [inode_nr]', exec [inode_nr],'malloc [bytes]', 'free [address]'"); + puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'ls [inode_nr]', exec [inode_nr],'malloc [bytes]', 'free [address]', 'getenv [var]'"); } else if(!strcmp(command,"ls")) { @@ -121,11 +123,23 @@ int process(char *buf) free(atoi(token[1])); printf("foolshell: called free(%08x).\n",atoi(token[1])); } + else if(!strcmp(command,"getenv")) + { + printf("foolshell: %s = %s \n",token[1],getenv(token[1])); + } + else if(!strcmp(command,"putenv")) + { + char buf[256]; + sprintf(buf,"%s=%s",token[1],token[2]); + putenv(buf); + printf("foolshell: %s = %s \n",token[1],getenv(token[1])); + } else { puts("foolshell: command not found"); } + // } diff --git a/userspace/simple.c b/userspace/simple.c index 36f0580..59bd4f1 100644 --- a/userspace/simple.c +++ b/userspace/simple.c @@ -2,12 +2,11 @@ int main(int argc, char **argv) { - syscalls_init(); - int i; for(i=0;i<10;i++) { + write(1,"dupa\n",5); } diff --git a/userspace/syscalls.c b/userspace/syscalls.c index b5959eb..7471418 100644 --- a/userspace/syscalls.c +++ b/userspace/syscalls.c @@ -1,20 +1,17 @@ -//printf needs following syscalls: sbrk write close fstat isatty lseek read -// - #include <sys/stat.h> #include <string.h> #include <stdint.h> -#include "../fs/fs.h" +#include "../kernel/syscalls.h" -static int preread; -static int alloc; -easywrite(char *c); +/* +char *__env1[]={0}; +char *__env2[]={"dupa","test"}; +char **environ={__env1,__env2}; +*/ -// init syscalls -void syscalls_init() +void _exit(int ret) { - // TODO dynamic! - alloc=0x300000; +while(1); } // generic syscall interface! @@ -43,85 +40,62 @@ int syscall(int call, int p1, int p2, int p3) return ebx; } -// int close(int file) { - return -1; + return syscall(SYSCALL_CLOSE,file,0,0); } int fstat(int file, struct stat *st) { - st->st_mode = S_IFCHR; - return 0; + return syscall(SYSCALL_FSTAT,file,st,0); } int isatty(int file) { - return 1; + return syscall(SYSCALL_ISATTY,file,0,0); } int lseek(int file, int ptr, int dir) { - if(dir==0)preread=ptr; - else{ puts("other modes unsupported sorry"); while(1);} - return preread; + return syscall(SYSCALL_LSEEK,file,ptr,dir); } int read(int file, char *ptr, int len) { - return syscall(62,file,ptr,len); + + return syscall(SYSCALL_READ,file,ptr,len); } int readdir(const char *name,fs_dirent *dirs,int max) { - return syscall(63,name,dirs,max); + return syscall(SYSCALL_READDIR,name,dirs,max); } int open(const char *name, int flags, int mode) { - return name; + return syscall(SYSCALL_OPEN,name,flags,mode); } int write(int file, char *ptr, int len) { - return syscall(61,file,ptr,len); + return syscall(SYSCALL_WRITE,file,ptr,len); } int execve(char *name, char **argv, char **env) { - - return syscall(64,name,argv,env); + return syscall(SYSCALL_EXECVE,name,argv,env); } - caddr_t sbrk(int incr) { -// easywrite("syscall: sbrk!!\n"); - int oldalloc=alloc; - alloc+=incr; - return oldalloc; - /* - - extern char end; -// char _end; - static char *heap_end; - char *prev_heap_end; - - if (heap_end == 0) { - heap_end = &end; - } - prev_heap_end = heap_end; - - if (heap_end + incr > stack_ptr) { - write (1, "Heap and stack collision\n", 25); - abort (); - } - - heap_end += incr; - return (caddr_t) prev_heap_end; - */ + static int alloc=0x300000; // TODO: implement properly sbrk!!! + int oldalloc=alloc; + alloc+=incr; + return oldalloc; + + return syscall(SYSCALL_SBRK,incr,0,0); } -// + diff --git a/video/console.h b/video/console.h index e8939e7..74ec50c 100644 --- a/video/console.h +++ b/video/console.h @@ -1,5 +1,7 @@ #ifndef CONSOLEINT_H #define CONSOLEINT_H +// 80 x 24 +// TODO: implement VT100 #include "lib/int/stdint.h" |
