diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-05-18 15:55:03 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-05-18 15:55:03 -0500 |
commit | cf138201c24fdc83ee7835b65cce67e7d7a85e70 (patch) | |
tree | 16650f82ac519ff60bc9100b4e90868463bd987d /src | |
parent | 9ea98f274e18a3407ce109a331553e1c910274d9 (diff) | |
download | talos-hostboot-cf138201c24fdc83ee7835b65cce67e7d7a85e70.tar.gz talos-hostboot-cf138201c24fdc83ee7835b65cce67e7d7a85e70.zip |
Create simple console.
Diffstat (limited to 'src')
-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 |
13 files changed, 181 insertions, 4 deletions
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 |