- Upgrade to romcc version 0.63
[coreboot.git] / util / romcc / tests / simple_test76.c
diff --git a/util/romcc/tests/simple_test76.c b/util/romcc/tests/simple_test76.c
new file mode 100644 (file)
index 0000000..4f682d3
--- /dev/null
@@ -0,0 +1,69 @@
+struct syscall_result {
+       long val;
+       int errno;
+};
+
+static struct syscall_result syscall_return(long result)
+{
+       struct syscall_result res;
+       if (((unsigned long)result) >= ((unsigned long)-125)) {
+               res.errno = - result;
+               res.val = -1;
+       } else {
+               res.errno = 0;
+               res.val = result;
+       }
+       return res;
+}
+static struct syscall_result syscall1(unsigned long nr, unsigned long arg1)
+{
+       long res;
+       asm volatile(
+               "int $0x80"
+               : "=a" (res)
+               : "a" (nr), "b" (arg1));
+       return syscall_return(res);
+       
+}
+
+static struct syscall_result syscall3(unsigned long nr, unsigned long arg1, unsigned long arg2,
+       unsigned long arg3)
+{
+       long res;
+       asm volatile(
+               "int $0x80"
+               : "=a" (res)
+               : "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3));
+       return syscall_return(res);
+       
+}
+
+#define NR_exit                 1
+#define NR_write                4
+/* Standard file descriptors */
+#define STDIN_FILENO    0  /* Standard input */
+#define STDOUT_FILENO   1  /* Standard output */
+#define STDERR_FILENO   2  /* Standard error output */
+
+typedef long ssize_t;
+typedef unsigned long size_t;
+
+static ssize_t write(int fd, const void *buf, size_t count)
+{
+       struct syscall_result res;
+       res = syscall3(NR_write, fd, (unsigned long)buf, count);
+       return res.val;
+}
+
+static void _exit(int status)
+{
+       struct syscall_result res;
+       res = syscall1(NR_exit, status);
+}
+
+static void main(void)
+{
+       static const char msg[] = "hello world\r\n";
+       write(STDOUT_FILENO, msg, sizeof(msg));
+       _exit(0);
+}