summaryrefslogtreecommitdiffstats
path: root/scripts/csmith/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/csmith/syscalls.c')
-rw-r--r--scripts/csmith/syscalls.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/scripts/csmith/syscalls.c b/scripts/csmith/syscalls.c
new file mode 100644
index 0000000..8ea84ca
--- /dev/null
+++ b/scripts/csmith/syscalls.c
@@ -0,0 +1,95 @@
+// An extremely minimalist syscalls.c for newlib
+// Based on riscv newlib libgloss/riscv/sys_*.c
+// Written by Clifford Wolf.
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define UNIMPL_FUNC(_f) ".globl " #_f "\n.type " #_f ", @function\n" #_f ":\n"
+
+asm (
+ ".text\n"
+ ".align 2\n"
+ UNIMPL_FUNC(_open)
+ UNIMPL_FUNC(_openat)
+ UNIMPL_FUNC(_lseek)
+ UNIMPL_FUNC(_stat)
+ UNIMPL_FUNC(_lstat)
+ UNIMPL_FUNC(_fstatat)
+ UNIMPL_FUNC(_isatty)
+ UNIMPL_FUNC(_access)
+ UNIMPL_FUNC(_faccessat)
+ UNIMPL_FUNC(_link)
+ UNIMPL_FUNC(_unlink)
+ UNIMPL_FUNC(_execve)
+ UNIMPL_FUNC(_getpid)
+ UNIMPL_FUNC(_fork)
+ UNIMPL_FUNC(_kill)
+ UNIMPL_FUNC(_wait)
+ UNIMPL_FUNC(_times)
+ UNIMPL_FUNC(_gettimeofday)
+ UNIMPL_FUNC(_ftime)
+ UNIMPL_FUNC(_utime)
+ UNIMPL_FUNC(_chown)
+ UNIMPL_FUNC(_chmod)
+ UNIMPL_FUNC(_chdir)
+ UNIMPL_FUNC(_getcwd)
+ UNIMPL_FUNC(_sysconf)
+ "j unimplemented_syscall\n"
+);
+
+void unimplemented_syscall()
+{
+ const char *p = "Unimplemented system call called!\n";
+ while (*p)
+ *(volatile int*)0x10000000 = *(p++);
+ asm volatile ("ebreak");
+ __builtin_unreachable();
+}
+
+ssize_t _read(int file, void *ptr, size_t len)
+{
+ // always EOF
+ return 0;
+}
+
+ssize_t _write(int file, const void *ptr, size_t len)
+{
+ const void *eptr = ptr + len;
+ while (ptr != eptr)
+ *(volatile int*)0x10000000 = *(char*)(ptr++);
+ return len;
+}
+
+int _close(int file)
+{
+ // close is called before _exit()
+ return 0;
+}
+
+int _fstat(int file, struct stat *st)
+{
+ // fstat is called during libc startup
+ errno = ENOENT;
+ return -1;
+}
+
+void *_sbrk(ptrdiff_t incr)
+{
+ extern unsigned char _end[]; // Defined by linker
+ static unsigned long heap_end;
+
+ if (heap_end == 0)
+ heap_end = (long)_end;
+
+ heap_end += incr;
+ return (void *)(heap_end - incr);
+}
+
+void _exit(int exit_status)
+{
+ asm volatile ("ebreak");
+ __builtin_unreachable();
+}
+