diff --git a/kernel/Makefile b/kernel/Makefile new file mode 100644 index 00000000..29e52ce4 --- /dev/null +++ b/kernel/Makefile @@ -0,0 +1,26 @@ +BUILD_TARGET = mee knf +BUILD_DIR = ../../build/mcos +SRC = $PWD + +KERNEL = kernel.img +KERNELS = $(addsuffix /$(KERNEL),$(addprefix $(BUILD_DIR)/,$(BUILD_TARGET))) + +.PHONY: all clean + +all: $(KERNELS) + +%/kernel.img: %/Makefile + make -C $(dir $@) + +%/Makefile: Makefile.build FORCE + @mkdir -p $(dir $@) + @echo 'SRC = $(PWD)' > $@ + @echo 'TARGET = $(notdir $(patsubst %/,%,$(dir $@)))' >> $@ + @cat Makefile.build >> $@ + +clean: $(addsuffix .clean,$(BUILD_TARGET)) + +%.clean: $(BUILD_DIR)/%/Makefile + make -C $(BUILD_DIR)/$(basename $@) clean + +FORCE: diff --git a/kernel/Makefile.build b/kernel/Makefile.build new file mode 100644 index 00000000..c926defc --- /dev/null +++ b/kernel/Makefile.build @@ -0,0 +1,34 @@ +AALBASE=$(SRC)/../../aal/manycore +AALDIR=$(AALBASE)/$(TARGET) +SRCS=$(wildcard $(SRC)/*.c) +OBJS=$(notdir $(patsubst %.c,%.o,$(SRCS))) +CFLAGS=-Wall -nostdlib -nostdinc -isystem $(shell $(CC) -print-file-name=include) -O3 -I$(AALBASE)/generic/include -I$(AALDIR)/include -I$(SRC)/include +LDFLAGS=-e arch_start +AALOBJ=$(AALDIR)/aal.o + +-include $(SRC)/configs/config.$(TARGET) + +all: depend kernel.img + +kernel.img: $(OBJS) $(AALOBJ) + $(LD) $(LDFLAGS) -o $@.elf $^ + [ -f $(SRC)/scripts/mkimage.$(TARGET) ] && sh $(SRC)/scripts/mkimage.$(TARGET) '$@.elf' '$@' '$(SRC)' || cp $@.elf $@ + +clean: + $(RM) $(OBJS) kernel.img kernel.img.elf Makefile.dep + make -C $(AALDIR) clean + +depend: Makefile.dep + +Makefile.dep: $(SRCS) + $(CC) $(CFLAGS) -MM $(SRCS) > Makefile.dep + +$(AALOBJ): FORCE + make -C $(AALDIR) CC=$(CC) LD=$(LD) + +%.o: $(SRC)/%.c + $(CC) $(CFLAGS) -c -o $@ $< + +FORCE: + +-include Makefile.dep diff --git a/kernel/configs/config.knf b/kernel/configs/config.knf new file mode 100644 index 00000000..daf3af28 --- /dev/null +++ b/kernel/configs/config.knf @@ -0,0 +1,5 @@ +CC = /home/shimosawa/cross.knf/bin/x86_64-l1om-linux-gcc +LD = /home/shimosawa/cross.knf/bin/x86_64-l1om-linux-ld + +CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow +LDFLAGS += -m elf_l1om diff --git a/kernel/configs/config.mee b/kernel/configs/config.mee new file mode 100644 index 00000000..af80a7d3 --- /dev/null +++ b/kernel/configs/config.mee @@ -0,0 +1,2 @@ +CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow +LDFLAGS += -T $(SRC)/mee.lds diff --git a/kernel/debug.c b/kernel/debug.c new file mode 100644 index 00000000..e6d03efc --- /dev/null +++ b/kernel/debug.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include + +struct aal_kmsg_buf kmsg_buf AAL_KMSG_ALIGN; + +extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); + +/* TODO: lock */ +void kputs(char *buf) +{ + int len = strlen(buf); + + if (len + kmsg_buf.tail > kmsg_buf.len) { + len = kmsg_buf.len - kmsg_buf.tail; + } + + strncpy(kmsg_buf.str, buf, len); + kmsg_buf.tail += len; +} + +int kprintf(const char *format, ...) +{ + int len; + va_list va; + + va_start(va, format); + + len = vsnprintf(kmsg_buf.str + kmsg_buf.tail, + kmsg_buf.len - kmsg_buf.tail, format, va); + kmsg_buf.tail += len; + + va_end(va); + + return len; +} + +void kmsg_init(void) +{ + kmsg_buf.tail = 0; + kmsg_buf.len = sizeof(kmsg_buf.str); +} diff --git a/kernel/include/kmsg.h b/kernel/include/kmsg.h new file mode 100644 index 00000000..b9c743de --- /dev/null +++ b/kernel/include/kmsg.h @@ -0,0 +1,9 @@ +#ifndef KMSG_H +#define KMSG_H + +void kputs(char *buf); +int kprintf(const char *format, ...); + +void kmsg_init(void); + +#endif diff --git a/kernel/mee.lds b/kernel/mee.lds new file mode 100644 index 00000000..516df774 --- /dev/null +++ b/kernel/mee.lds @@ -0,0 +1,3 @@ +MEMORY { + ram (rwx) : ORIGIN = 0x40001000, LENGTH = 4M +} diff --git a/kernel/scripts/mkimage.mee b/kernel/scripts/mkimage.mee new file mode 100644 index 00000000..1d9f234e --- /dev/null +++ b/kernel/scripts/mkimage.mee @@ -0,0 +1,3 @@ +#!/bin/sh + +cat $3/../elfboot/elfboot $1 > $2 diff --git a/kernel/setup.c b/kernel/setup.c new file mode 100644 index 00000000..a4720f48 --- /dev/null +++ b/kernel/setup.c @@ -0,0 +1,23 @@ +#include +#include +#include + +extern struct aal_kmsg_buf kmsg_buf; + +extern void arch_init(void); +extern void kmsg_init(void); + +int main(void) +{ + kmsg_init(); + + kputs("MCK started.\n"); + + arch_init(); + + cpu_disable_interrupt(); + while (1) { + cpu_halt(); + } + return 0; +}