summaryrefslogtreecommitdiff
path: root/src/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/syscalls.c')
-rw-r--r--src/syscalls.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/syscalls.c b/src/syscalls.c
new file mode 100644
index 0000000..443c9cd
--- /dev/null
+++ b/src/syscalls.c
@@ -0,0 +1,103 @@
+#include "uart.h"
+
+#include <sys/stat.h>
+#include <sys/times.h>
+#include <sys/types.h>
+
+#include <errno.h>
+#undef errno
+extern int errno;
+
+// defined in crt0.S
+void _exit(int c);
+
+int _close(int file) { return -1; }
+
+char *__env[1] = {0};
+char **environ = __env;
+
+int _execve(char *name, char **argv, char **env) {
+ errno = ENOMEM;
+ return -1;
+}
+
+int _fork(void) {
+ errno = EAGAIN;
+ return -1;
+}
+
+int _fstat(int file, struct stat *st) {
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _getpid(void) { return 1; }
+int _isatty(int file) { return 1; }
+
+int _link(char *old, char *new) {
+ errno = EMLINK;
+ return -1;
+}
+
+int _lseek(int file, int ptr, int dir) { return 0; }
+
+int _open(const char *name, int flags, int mode) { return -1; }
+
+int _read(int file, char *buf, int len) {
+ while (!uart_rx_ready())
+ ;
+
+ int i;
+ for (i = 0; i < len; i++) {
+ if (!uart_rx_ready()) {
+ break;
+ }
+ buf[i] = uart_getc_nonblocking();
+ }
+ return i;
+}
+
+void *_sbrk(int incr) {
+ extern void _heap_start;
+ extern void *_heap_end;
+ void *prev_heap_end = _heap_end;
+
+ void *stack_ptr;
+ __asm__ volatile("mv %0, sp" : "=r"(stack_ptr));
+ if (_heap_end + incr > stack_ptr) {
+ uart_puts("Heap and stack collision\n");
+ _exit(1);
+ }
+
+ _heap_end += incr;
+ return prev_heap_end;
+}
+
+int _stat(const char *__restrict file, struct stat *__restrict st) {
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+clock_t _times(struct tms *buf) { return (clock_t)-1; }
+
+int _unlink(char *name) {
+ errno = ENOENT;
+ return -1;
+}
+
+int _wait(int *status) {
+ errno = ECHILD;
+ return -1;
+}
+
+int _write(int file, char *buf, int len) {
+ for (int i = 0; i < len; i++) {
+ uart_putc(buf[i]);
+ }
+ return len;
+}
+
+int _kill(int pid, int sig) {
+ errno = EINVAL;
+ return -1;
+}