#include "uart.h" #include #include #include #include #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; }