diff options
Diffstat (limited to 'src/crt')
-rw-r--r-- | src/crt/Makefile | 42 | ||||
-rw-r--r-- | src/crt/crt0.c | 60 |
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; +} + |