diff options
Diffstat (limited to 'src/syscalls.c')
| -rw-r--r-- | src/syscalls.c | 103 |
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; +} |
