summaryrefslogtreecommitdiff
path: root/userspace
diff options
context:
space:
mode:
Diffstat (limited to 'userspace')
-rw-r--r--userspace/Makefile14
-rw-r--r--userspace/crt0.S9
-rw-r--r--userspace/linker.ld4
-rw-r--r--userspace/test.c104
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;
+ }
+
+
+}