aboutsummaryrefslogtreecommitdiffstats
path: root/src/crt
diff options
context:
space:
mode:
Diffstat (limited to 'src/crt')
-rw-r--r--src/crt/Makefile42
-rw-r--r--src/crt/crt0.c60
2 files changed, 102 insertions, 0 deletions
diff --git a/src/crt/Makefile b/src/crt/Makefile
new file mode 100644
index 0000000..ce23a89
--- /dev/null
+++ b/src/crt/Makefile
@@ -0,0 +1,42 @@
+##
+# @file Makefile
+# Script to build folder of source files
+#
+# 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/>.
+#
+
+CFILES = $(wildcard *.c)
+AFILES = $(wildcard *.s)
+OFILES = $(patsubst %.c, %.o, $(CFILES)) \
+ $(patsubst %.s, %.asm.o, $(AFILES))
+
+CFLAGS += -ffreestanding -nostdlib -I.. -I../arch/cmsis
+
+all: $(OFILES)
+
+%.o: %.c
+ @echo " CC " $<
+ @$(CROSS)$(CC) $(CFLAGS) -c $< -o $@
+
+%.asm.o: %.s
+ @echo " AS " $<
+ @$(CROSS)$(AS) $(AFLAGS) -c $< -o $@
+
+clean:
+ @echo " CLEAN"
+ @rm -f $(OFILES)
+
+
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;
+}
+