aboutsummaryrefslogtreecommitdiffstats
path: root/src/crt/crt0.c
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2018-11-29 20:43:06 -0500
committerClyne Sullivan <tullivan99@gmail.com>2018-11-29 20:43:06 -0500
commit563c92e6d08c305cb9f7693818ecbe2a2dec527b (patch)
tree5b8a6dcdad1daa64dc3a73e3dc9385b85b2c9200 /src/crt/crt0.c
parent22615096dee294f63c6940c17f2a448da51d9197 (diff)
hello world from initrd
Diffstat (limited to 'src/crt/crt0.c')
-rw-r--r--src/crt/crt0.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/crt/crt0.c b/src/crt/crt0.c
new file mode 100644
index 0000000..ccdb2eb
--- /dev/null
+++ b/src/crt/crt0.c
@@ -0,0 +1,60 @@
+/**
+ * @file crt0.c
+ * Userland executable startup code
+ *
+ * Copyright (C) 2018 Clyne Sullivan
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int main(int, char **);
+
+static void stdio_init(void);
+
+void _start(void)
+{
+ stdio_init();
+ exit(main(0, 0));
+}
+
+void stdio_init(void)
+{
+ stderr = calloc(1, sizeof(FILE));
+ stderr->handle = 2;
+ stderr->buffer = malloc(BUFSIZ);
+ stderr->bufsize = BUFSIZ;
+ stderr->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE);
+ stderr->status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC;
+ stderr->next = NULL;
+
+ stdout = calloc(1, sizeof(FILE));
+ stdout->handle = 1;
+ stdout->buffer = malloc(BUFSIZ);
+ stdout->bufsize = BUFSIZ;
+ stdout->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE);
+ stdout->status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC;
+ stdout->next = stderr;
+
+ stdin = calloc(1, sizeof(FILE));
+ stdin->handle = 0;
+ stdin->buffer = malloc(BUFSIZ);
+ stdin->bufsize = BUFSIZ;
+ stdin->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE);
+ stdin->status = _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC;
+ stdin->next = stdout;
+}
+