summaryrefslogtreecommitdiff
path: root/userspace/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'userspace/syscalls.c')
-rw-r--r--userspace/syscalls.c85
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;
+}
+
+//
+