diff options
-rw-r--r-- | config.mk | 20 | ||||
-rw-r--r-- | src/include/kernel/console.H | 25 | ||||
-rw-r--r-- | src/include/stdint.h | 17 | ||||
-rw-r--r-- | src/include/string.h | 17 | ||||
-rw-r--r-- | src/include/util/singleton.H | 18 | ||||
-rw-r--r-- | src/kernel.ld | 6 | ||||
-rw-r--r-- | src/kernel/console.C | 28 | ||||
-rw-r--r-- | src/kernel/kernel.C | 4 | ||||
-rw-r--r-- | src/kernel/makefile | 4 | ||||
-rw-r--r-- | src/lib/makefile | 10 | ||||
-rw-r--r-- | src/lib/string.c | 11 | ||||
-rw-r--r-- | src/libc++/builtins.C | 33 | ||||
-rw-r--r-- | src/libc++/makefile | 10 | ||||
-rw-r--r-- | src/makefile | 2 |
14 files changed, 194 insertions, 11 deletions
@@ -2,21 +2,27 @@ CC = powerpc64-unknown-linux-gnu-gcc CXX = powerpc64-unknown-linux-gnu-g++ LD = powerpc64-unknown-linux-gnu-ld -COMMONFLAGS = -O3 -nostdlib -CFLAGS = ${COMMONFLAGS} -mcpu=620 -fno-rtti -fno-exceptions -CXXFLAGS = ${CFLAGS} +COMMONFLAGS = -O3 -nostdlib +CFLAGS = ${COMMONFLAGS} -mcpu=620 -nostdinc -g +ASMFLAGS = ${COMMONFLAGS} -mcpu=620 +CXXFLAGS = ${CFLAGS} -nostdinc++ -fno-rtti -fno-exceptions LDFLAGS = -static ${COMMONFLAGS} +INCDIR = ${OBJDIR}/../src/include/ + ${OBJDIR}/%.o : %.C - ${CXX} -c ${CXXFLAGS} $< -o $@ + ${CXX} -c ${CXXFLAGS} $< -o $@ -I ${INCDIR} + +${OBJDIR}/%.o : %.c + ${CC} -c ${CFLAGS} $< -o $@ -I ${INCDIR} ${OBJDIR}/%.o : %.S - ${CC} -c ${CFLAGS} $< -o $@ + ${CC} -c ${ASMFLAGS} $< -o $@ -${IMGDIR}/%.elf: kernel.ld +${IMGDIR}/%.elf: kernel.ld ${OBJDIR}/*.o ${LD} ${LDFLAGS} ${OBJDIR}/*.o -T kernel.ld -o $@ -${IMGDIR}/%.bin: kernel.ld +${IMGDIR}/%.bin: kernel.ld ${OBJDIR}/*.o ${LD} ${LDFLAGS} ${OBJDIR}/*.o --oformat=binary -T kernel.ld -o $@ %.d: diff --git a/src/include/kernel/console.H b/src/include/kernel/console.H new file mode 100644 index 000000000..4c5f7a52a --- /dev/null +++ b/src/include/kernel/console.H @@ -0,0 +1,25 @@ +#ifndef __KERNEL_CONSOLE_H +#define __KERNEL_CONSOLE_H + +#include <stdint.h> +#include <string.h> + +void printk(const char*); + +class Console +{ + public: + int putc(int); + + enum { BUFFER_SIZE = 1024 * 4 }; + + protected: + Console(); + ~Console() {}; + + private: + char * iv_buffer; + size_t iv_pos; +}; + +#endif diff --git a/src/include/stdint.h b/src/include/stdint.h new file mode 100644 index 000000000..350f4c3da --- /dev/null +++ b/src/include/stdint.h @@ -0,0 +1,17 @@ +#ifndef __STDINT_H +#define __STDINT_H + +typedef char int8_t; +typedef short int int16_t; +typedef long int int32_t; +typedef long long int int64_t; + +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long int uint32_t; +typedef unsigned long long int uint64_t; + +typedef uint64_t size_t; +typedef int64_t ssize_t; + +#endif diff --git a/src/include/string.h b/src/include/string.h new file mode 100644 index 000000000..f1465a4c0 --- /dev/null +++ b/src/include/string.h @@ -0,0 +1,17 @@ +#ifndef __STRING_H +#define __STRING_H + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + + void* memset(void* s, int c, size_t n); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/src/include/util/singleton.H b/src/include/util/singleton.H new file mode 100644 index 000000000..f448303df --- /dev/null +++ b/src/include/util/singleton.H @@ -0,0 +1,18 @@ +#ifndef __UTIL_SINGLETON_H +#define __UTIL_SINGLETON_H + +template <typename _T> +class Singleton : private _T +{ + public: + static _T& instance() + { + static Singleton<_T> instance; + return instance; + }; + + private: + Singleton() : _T() {}; +}; + +#endif diff --git a/src/kernel.ld b/src/kernel.ld index 0f44adb34..dc433807a 100644 --- a/src/kernel.ld +++ b/src/kernel.ld @@ -14,6 +14,7 @@ SECTIONS . = text_load_address; .text ALIGN(0x1000): { *(.text) + *(.text._*) *(.rodata) *(.rodata.*) @@ -24,13 +25,16 @@ SECTIONS *(.data) *(.data.*) *(.branch_lt) - *(.bss) toc_load_address = .; *(.toc) opd_load_address = .; *(.opd) *(.got) + + *(.bss) + *(.bss.*) + } . = hreset_load_address; diff --git a/src/kernel/console.C b/src/kernel/console.C new file mode 100644 index 000000000..a2ad0ffe2 --- /dev/null +++ b/src/kernel/console.C @@ -0,0 +1,28 @@ +#include <util/singleton.H> +#include <kernel/console.H> + +static char kernel_printk_buffer[Console::BUFFER_SIZE]; + +Console::Console() : iv_pos(0), iv_buffer(kernel_printk_buffer) +{ + memset(iv_buffer, '\0', Console::BUFFER_SIZE); +} + +int Console::putc(int c) +{ + if (BUFFER_SIZE > iv_pos) + { + iv_buffer[iv_pos] = c; + iv_pos++; + } +} + +void printk(const char* str) +{ + Console& console = Singleton<Console>::instance(); + while('\0' != *str) + { + console.putc(*str); + str++; + } +} diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C index 2ea0d2fbc..fede83f02 100644 --- a/src/kernel/kernel.C +++ b/src/kernel/kernel.C @@ -1,5 +1,9 @@ +#include <stdint.h> +#include <kernel/console.H> + int main() { + printk("Welcome to the kernel!\n"); while(1); return 0; diff --git a/src/kernel/makefile b/src/kernel/makefile index 74a6bffbc..1047de456 100644 --- a/src/kernel/makefile +++ b/src/kernel/makefile @@ -1,8 +1,8 @@ OBJDIR = ../../obj include ../../config.mk -OBJECTS += ${OBJDIR}/start.o -OBJECTS += ${OBJDIR}/kernel.o +OBJS = start.o kernel.o console.o +OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS}) all: ${OBJECTS} diff --git a/src/lib/makefile b/src/lib/makefile new file mode 100644 index 000000000..105f74a05 --- /dev/null +++ b/src/lib/makefile @@ -0,0 +1,10 @@ +OBJDIR = ../../obj +include ../../config.mk + +OBJS = string.o +OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS}) + +all: ${OBJECTS} + +clean: + (rm -f ${OBJECTS} ) diff --git a/src/lib/string.c b/src/lib/string.c new file mode 100644 index 000000000..b84de213f --- /dev/null +++ b/src/lib/string.c @@ -0,0 +1,11 @@ +#include <string.h> + +void* memset(void* s, int c, size_t n) +{ + char* _s = s; + while(n) + { + *_s = c; + _s++; n--; + } +} diff --git a/src/libc++/builtins.C b/src/libc++/builtins.C new file mode 100644 index 000000000..ed373c8cc --- /dev/null +++ b/src/libc++/builtins.C @@ -0,0 +1,33 @@ +#include <stdint.h> + +extern "C" int __cxa_guard_acquire(volatile uint64_t* gv) +{ + // 0 .. uninitialized + // 1 .. locked + // 2 .. unlocked, initialized + if (0 == *gv) + { + *gv = 1; + return 1; + } + else if (1 == *gv) + { + while(1 == *gv); + } + + return 0; +} + +extern "C" void __cxa_guard_release(volatile uint64_t* gv) +{ + *gv = 2; + return; +} + + +extern "C" int __cxa_atexit(void (*)(void*), void*, void*) +{ + return 0; +} + +void* __dso_handle = (void*) &__dso_handle; diff --git a/src/libc++/makefile b/src/libc++/makefile new file mode 100644 index 000000000..9f7cd97aa --- /dev/null +++ b/src/libc++/makefile @@ -0,0 +1,10 @@ +OBJDIR = ../../obj +include ../../config.mk + +OBJS = builtins.o +OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS}) + +all: ${OBJECTS} + +clean: + (rm -f ${OBJECTS} ) diff --git a/src/makefile b/src/makefile index 3247e581e..e0265b92e 100644 --- a/src/makefile +++ b/src/makefile @@ -2,7 +2,7 @@ IMGDIR = ../img OBJDIR = ../obj include ../config.mk -SUBDIRS = kernel.d +SUBDIRS = kernel.d lib.d libc++.d IMAGES += ${IMGDIR}/kernel.elf IMAGES += ${IMGDIR}/kernel.bin |