diff options
Diffstat (limited to 'userspace')
| -rw-r--r-- | userspace/Makefile | 14 | ||||
| -rw-r--r-- | userspace/crt0.S | 9 | ||||
| -rw-r--r-- | userspace/linker.ld | 4 | ||||
| -rw-r--r-- | userspace/test.c | 104 |
4 files changed, 131 insertions, 0 deletions
diff --git a/userspace/Makefile b/userspace/Makefile new file mode 100644 index 0000000..2a286da --- /dev/null +++ b/userspace/Makefile @@ -0,0 +1,14 @@ +#i686-elf-gcc test.c -L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/newlib/ -I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include/ -L/home/miguel/temp/fool-os-stuff/newlib-build-clean/i686-elf/libgloss/libnosys/ + +CC=i686-elf-gcc +LD=i686-elf-ld + +CFLAGS=-I/home/miguel/temp/fool-os-stuff/newlib-2.1.0/newlib/libc/include +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 + +all: test.o crt0.o + ${CC} -T linker.ld ${LDFLAGS} test.o -Wl,--oformat,binary -o userprog +clean: + -rm *.o *.out userprog diff --git a/userspace/crt0.S b/userspace/crt0.S new file mode 100644 index 0000000..9f7dab1 --- /dev/null +++ b/userspace/crt0.S @@ -0,0 +1,9 @@ +.global _start +.extern main +.extern exit +_start: +call main +call _exit +.wait: + hlt +jmp .wait diff --git a/userspace/linker.ld b/userspace/linker.ld new file mode 100644 index 0000000..bfaae93 --- /dev/null +++ b/userspace/linker.ld @@ -0,0 +1,4 @@ +SECTIONS +{ + . = 0x80800; +} 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; + } + + +} |
