diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-10-20 20:51:01 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-10-20 20:51:01 +0200 |
| commit | 37ceff93572bba6defd916884999c496108220ee (patch) | |
| tree | 1b40ae0f5e3c2c3cf1bb60c3f1d9f7ae5dd53c1b /userspace/syscalls.c | |
| parent | 813272cd88cc6c0a1dfbb121d2130fc849042c8a (diff) | |
started porting simple brainfuck interpreter
Diffstat (limited to 'userspace/syscalls.c')
| -rw-r--r-- | userspace/syscalls.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/userspace/syscalls.c b/userspace/syscalls.c new file mode 100644 index 0000000..6547879 --- /dev/null +++ b/userspace/syscalls.c @@ -0,0 +1,85 @@ + +//printf needs following syscalls: sbrk write close fstat isatty lseek read +// + +#include <sys/stat.h> + +int close(int file) +{ + return -1; +} + +int fstat(int file, struct stat *st) +{ + st->st_mode = S_IFCHR; + return 0; +} + +int isatty(int file) { + return 1; +} + +int lseek(int file, int ptr, int dir) { + return 0; +} + +int read(int file, char *ptr, int len) { + return 0; +} + int open(const char *name, int flags, int mode) { + return -1; + } + + +int write(int file, char *ptr, int len) +{ + + int todo; + for (todo = 0; todo < len; todo++) + { + + char byte=(*ptr++); + int byt=byte; + + int ebx; // will hold return value; + // system call + asm("pusha"); + asm("mov $61,%eax"); // select syscall) + + asm("mov %0,%%edx"::"m"(byt)); + //asm("mov $88,%edx"); + + asm("int $0x80"); // actual syscall ! interrupt + asm("mov %%ebx, %0": "=b" (ebx)); + asm("popa"); + // + + } + return len; +} + +caddr_t sbrk(int incr) +{ + +// extern char _end; /* Defined by the linker */ + 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; +} + +// + |
