summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-05-18 15:55:03 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-05-18 15:55:03 -0500
commitcf138201c24fdc83ee7835b65cce67e7d7a85e70 (patch)
tree16650f82ac519ff60bc9100b4e90868463bd987d /src
parent9ea98f274e18a3407ce109a331553e1c910274d9 (diff)
downloadtalos-hostboot-cf138201c24fdc83ee7835b65cce67e7d7a85e70.tar.gz
talos-hostboot-cf138201c24fdc83ee7835b65cce67e7d7a85e70.zip
Create simple console.
Diffstat (limited to 'src')
-rw-r--r--src/include/kernel/console.H25
-rw-r--r--src/include/stdint.h17
-rw-r--r--src/include/string.h17
-rw-r--r--src/include/util/singleton.H18
-rw-r--r--src/kernel.ld6
-rw-r--r--src/kernel/console.C28
-rw-r--r--src/kernel/kernel.C4
-rw-r--r--src/kernel/makefile4
-rw-r--r--src/lib/makefile10
-rw-r--r--src/lib/string.c11
-rw-r--r--src/libc++/builtins.C33
-rw-r--r--src/libc++/makefile10
-rw-r--r--src/makefile2
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
OpenPOWER on IntegriCloud