diff options
Diffstat (limited to 'userspace/test.c')
| -rw-r--r-- | userspace/test.c | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/userspace/test.c b/userspace/test.c new file mode 100644 index 0000000..bdc6da0 --- /dev/null +++ b/userspace/test.c @@ -0,0 +1,104 @@ +#include <stdlib.h> +#include <stdio.h> + + +//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 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; +} + +// + +int main() +{ + int x=atoi("33"); + int *mem=0x80000; + int *mem2=0x80010; + + int y=0; + *mem=x; + + while(1) + { + printf("test printf"); +// write(1,"dupa",4); +// y=example_call(); + y++; + *mem2=y; + } + + +} |
