summaryrefslogtreecommitdiff
path: root/userspace/test.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-10-20 18:54:18 +0200
committerMichal Idziorek <m.i@gmx.at>2014-10-20 18:54:18 +0200
commit813272cd88cc6c0a1dfbb121d2130fc849042c8a (patch)
tree61b8ede4a5c191c491621f0185d3a442ff5407dd /userspace/test.c
parent2f6fe94d436347c4d886407dbfd44b6ac1aa41fa (diff)
1st userspace programm and partial newlib support!
Diffstat (limited to 'userspace/test.c')
-rw-r--r--userspace/test.c104
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;
+ }
+
+
+}