summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/console.C255
-rw-r--r--src/kernel/cpumgr.C10
-rw-r--r--src/kernel/exception.C8
-rw-r--r--src/kernel/spinlock.C11
-rw-r--r--src/kernel/start.S4
-rw-r--r--src/kernel/syscall.C2
-rw-r--r--src/kernel/taskmgr.C6
-rw-r--r--src/kernel/terminate.S18
-rw-r--r--src/kernel/vmmmgr.C4
9 files changed, 54 insertions, 264 deletions
diff --git a/src/kernel/console.C b/src/kernel/console.C
index 6cc2d1dac..6912b8450 100644
--- a/src/kernel/console.C
+++ b/src/kernel/console.C
@@ -1,5 +1,7 @@
#include <util/singleton.H>
#include <kernel/console.H>
+#include <util/sprintf.H>
+#include <util/functor.H>
#include <stdarg.h>
char kernel_printk_buffer[Console::BUFFER_SIZE];
@@ -22,260 +24,17 @@ int Console::putc(int c)
return c;
}
-class ConsoleTraits
-{
- public:
- enum trait { NONE, HEX, DEC, };
-};
-
-template <typename _T, ConsoleTraits::trait _S = ConsoleTraits::NONE>
-class ConsoleDisplay
-{
- public:
- static void display(Console& c, _T value) {};
-};
-
-template <ConsoleTraits::trait _S>
-class ConsoleDisplay<char*, _S>
-{
- public:
- static void display(Console&c, char* value)
- {
- while(*value != '\0')
- {
- c.putc(*value);
- value++;
- }
- }
-};
-
-template <>
-class ConsoleDisplay<char, ConsoleTraits::NONE>
-{
- public:
- static void display(Console&c, char value)
- {
- c.putc(value);
- }
-};
-
-template <typename _T>
-class ConsoleDisplay<_T, ConsoleTraits::DEC>
-{
- public:
- static void display(Console&c, _T value)
- {
- if (value == 0)
- {
- c.putc('0');
- }
- else if (value < 0)
- {
- c.putc('-');
- value *= -1;
- }
- else
- subdisplay(c, value);
- }
-
- static void subdisplay(Console&c, _T value)
- {
- if (value != 0)
- {
- subdisplay(c, value / 10);
- c.putc('0' + (value % 10));
- }
- }
-};
-
-template<typename _T>
-class ConsoleDisplay<_T, ConsoleTraits::HEX>
-{
- public:
- static void display(Console&c, _T value)
- {
- size_t length = sizeof(_T) * 2;
- subdisplay(c, value, length);
- }
-
- static void subdisplay(Console&c, _T value, size_t length)
- {
- if (length == 0) return;
- subdisplay(c, value / 16, length-1);
- char nibble = value % 16;
- if (nibble >= 0x0a)
- c.putc('A' + (nibble - 0x0a));
- else
- c.putc('0' + nibble);
- }
-};
-
void printk(const char* str, ...)
{
+ using Util::mem_ptr_fun;
+ using Util::vasprintf;
+
va_list args;
va_start(args, str);
Console& console = Singleton<Console>::instance();
-
- bool format = false;
- int size = 0;
-
- while('\0' != *str)
- {
- if (('%' == *str) || (format))
- switch (*str)
- {
- case '%':
- {
- if (format)
- {
- ConsoleDisplay<char>::display(console, '%');
- format = false;
- }
- else
- {
- format = true;
- size = 2;
- }
- break;
- }
- case 'c':
- {
- format = false;
- ConsoleDisplay<char>
- ::display(console,
- (char)va_arg(args,int));
- break;
- }
- case 'h':
- {
- size--;
- break;
- }
- case 'l':
- {
- size++;
- break;
- }
- case 'z': // size_t or ssize_t
- {
- size = 4;
- break;
- }
- case 'd': // decimal
- {
- format = false;
- switch(size)
- {
- case 0:
- ConsoleDisplay<char, ConsoleTraits::DEC>
- ::display(console,
- (char)va_arg(args,int));
- break;
-
- case 1:
- ConsoleDisplay<short, ConsoleTraits::DEC>
- ::display(console,
- (short)va_arg(args,int));
- break;
-
- case 2:
- ConsoleDisplay<int, ConsoleTraits::DEC>
- ::display(console,
- va_arg(args,int));
- break;
-
- case 3:
- case 4:
- ConsoleDisplay<long, ConsoleTraits::DEC>
- ::display(console,
- va_arg(args,long));
- break;
- }
- break;
- }
- case 'u': // unsigned decimal
- {
- format = false;
- switch(size)
- {
- case 0:
- ConsoleDisplay<unsigned char, ConsoleTraits::DEC>
- ::display(console,
- (unsigned char)
- va_arg(args,unsigned int));
- break;
-
- case 1:
- ConsoleDisplay<unsigned short, ConsoleTraits::DEC>
- ::display(console,
- (unsigned short)
- va_arg(args,unsigned int));
- break;
-
- case 2:
- ConsoleDisplay<unsigned int, ConsoleTraits::DEC>
- ::display(console,
- va_arg(args,unsigned int));
- break;
-
- case 3:
- case 4:
- ConsoleDisplay<unsigned long, ConsoleTraits::DEC>
- ::display(console,
- va_arg(args,unsigned long));
- break;
- }
- break;
- }
- case 'x': // unsigned hex
- case 'X':
- {
- format = false;
- switch(size)
- {
- case 0:
- ConsoleDisplay<unsigned char, ConsoleTraits::HEX>
- ::display(console,
- (unsigned char)
- va_arg(args,unsigned int));
- break;
-
- case 1:
- ConsoleDisplay<unsigned short, ConsoleTraits::HEX>
- ::display(console,
- (unsigned short)
- va_arg(args,unsigned int));
- break;
-
- case 2:
- ConsoleDisplay<unsigned int, ConsoleTraits::HEX>
- ::display(console,
- va_arg(args,unsigned int));
- break;
-
- case 3:
- case 4:
- ConsoleDisplay<unsigned long, ConsoleTraits::HEX>
- ::display(console,
- va_arg(args,unsigned long));
- break;
- }
- break;
- }
- case 's': // string
- {
- format = false;
- ConsoleDisplay<char*>::display(console,
- (char*)va_arg(args,void*));
- break;
- }
- }
- else
- ConsoleDisplay<char>::display(console, *str);
-
- str++;
- }
+ vasprintf(mem_ptr_fun(console, &Console::putc),
+ str, args);
va_end(args);
}
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index 6d58b5b72..0f225fc13 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -6,7 +6,7 @@
#include <kernel/pagemgr.H>
#include <kernel/console.H>
#include <util/singleton.H>
-#include <kernel/ppcarch.H>
+#include <arch/ppc.H>
#include <kernel/timemgr.H>
cpu_t* CpuManager::cv_cpus[CpuManager::MAXCPUS] = { NULL };
@@ -19,7 +19,7 @@ CpuManager::CpuManager()
cpu_t* CpuManager::getCurrentCPU()
{
- register task_t* current_task = (task_t*) ppc_getSPRG3();
+ register task_t* current_task = (task_t*) getSPRG3();
return current_task->cpu;
}
@@ -50,7 +50,7 @@ void CpuManager::startCPU(ssize_t i)
// Initialize CPU structure.
if (NULL == cv_cpus[i])
{
- printk("Starting CPU %d...", i);
+ printk("Starting CPU %ld...", i);
cpu_t* cpu = cv_cpus[i] = new cpu_t;
// Initialize CPU.
@@ -68,7 +68,7 @@ void CpuManager::startCPU(ssize_t i)
if (currentCPU)
{
- ppc_setSPRG3((uint64_t) cv_cpus[i]->idle_task);
+ setSPRG3((uint64_t) cv_cpus[i]->idle_task);
register uint64_t decrementer = TimeManager::getTimeSliceCount();
asm volatile("mtdec %0" :: "r"(decrementer));
@@ -78,7 +78,7 @@ void CpuManager::startCPU(ssize_t i)
void CpuManager::startSlaveCPU(cpu_t* cpu)
{
- ppc_setSPRG3((uint64_t) cpu->idle_task);
+ setSPRG3((uint64_t) cpu->idle_task);
register uint64_t decrementer = TimeManager::getTimeSliceCount();
asm volatile("mtdec %0" :: "r"(decrementer));
diff --git a/src/kernel/exception.C b/src/kernel/exception.C
index 568d80842..cbbf3cf89 100644
--- a/src/kernel/exception.C
+++ b/src/kernel/exception.C
@@ -2,7 +2,7 @@
#include <kernel/console.H>
#include <kernel/task.H>
#include <kernel/taskmgr.H>
-#include <kernel/ppcarch.H>
+#include <arch/ppc.H>
#include <kernel/vmmmgr.H>
namespace Systemcalls { void TaskEnd(task_t*); }
@@ -18,7 +18,7 @@ extern "C"
void kernel_execute_prog_ex()
{
task_t* t = TaskManager::getCurrentTask();
- uint64_t exception = ppc_getSRR1() & EXCEPTION_SRR1_MASK;
+ uint64_t exception = getSRR1() & EXCEPTION_SRR1_MASK;
bool handled = false;
switch(exception)
@@ -41,7 +41,7 @@ extern "C"
void kernel_execute_data_storage()
{
task_t* t = TaskManager::getCurrentTask();
- uint64_t exception = ppc_getDSISR() & EXCEPTION_DSISR_MASK;
+ uint64_t exception = getDSISR() & EXCEPTION_DSISR_MASK;
bool handled = false;
switch(exception)
@@ -53,7 +53,7 @@ void kernel_execute_data_storage()
if (!handled)
{
printk("Data Storage exception on %d: %lx, %lx\n",
- t->tid, ppc_getDAR(), ppc_getDSISR());
+ t->tid, getDAR(), getDSISR());
Systemcalls::TaskEnd(t);
}
}
diff --git a/src/kernel/spinlock.C b/src/kernel/spinlock.C
index bfada05c4..5c67d8ad9 100644
--- a/src/kernel/spinlock.C
+++ b/src/kernel/spinlock.C
@@ -1,9 +1,18 @@
#include <kernel/spinlock.H>
+#include <arch/ppc.H>
void Spinlock::lock()
{
uint64_t reservation = __sync_fetch_and_add(&iv_reserve, 1);
- while(iv_ready != reservation);
+ if (iv_ready != reservation)
+ {
+ do
+ {
+ setThreadPriorityLow();
+ }
+ while(iv_ready != reservation);
+ setThreadPriorityHigh();
+ }
}
void Spinlock::unlock()
diff --git a/src/kernel/start.S b/src/kernel/start.S
index 538c5dbb5..785d86ac4 100644
--- a/src/kernel/start.S
+++ b/src/kernel/start.S
@@ -309,3 +309,7 @@ kernel_stack:
.global kernel_other_thread_spinlock
kernel_other_thread_spinlock:
.space 8
+
+.global hbi_ImageId
+hbi_ImageId:
+ .space 128
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index d9ac13b17..4d9cc7b4b 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -81,7 +81,7 @@ void kernel_execute_system_call()
if (syscall > SYSCALL_MAX)
{
// TODO : kill task.
- printk("Invalid syscall : %lld\n", syscall);
+ printk("Invalid syscall : %ld\n", syscall);
while(1);
}
else
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index c21a19d97..866a00eae 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -2,7 +2,7 @@
#include <kernel/taskmgr.H>
#include <kernel/task.H>
#include <kernel/pagemgr.H>
-#include <kernel/ppcarch.H>
+#include <arch/ppc.H>
void TaskManager::idleTaskLoop(void* unused)
{
@@ -13,14 +13,14 @@ void TaskManager::idleTaskLoop(void* unused)
task_t* TaskManager::getCurrentTask()
{
- register task_t* current_task = (task_t*) ppc_getSPRG3();
+ register task_t* current_task = (task_t*) getSPRG3();
return current_task;
}
void TaskManager::setCurrentTask(task_t* t)
{
t->cpu = getCurrentTask()->cpu;
- ppc_setSPRG3((uint64_t)t);
+ setSPRG3((uint64_t)t);
return;
}
diff --git a/src/kernel/terminate.S b/src/kernel/terminate.S
new file mode 100644
index 000000000..4088a6e0e
--- /dev/null
+++ b/src/kernel/terminate.S
@@ -0,0 +1,18 @@
+.include "kernel/ppcconsts.S"
+
+.global hal_p7_terminate_immediate
+hal_p7_terminate_immediate:
+ li r0, 1
+ mfspr r9, HID0
+ insrdi r9,r0,1,31 /* Turn on bit 31. */
+ sync
+ mtspr HID0,r9 /* Enable attentions */
+ mfspr r9, HID0
+ mfspr r9, HID0
+ mfspr r9, HID0
+ mfspr r9, HID0
+ mfspr r9, HID0
+ mfspr r9, HID0
+ isync
+ attn
+ b 0
diff --git a/src/kernel/vmmmgr.C b/src/kernel/vmmmgr.C
index 51e26e60b..f47b92059 100644
--- a/src/kernel/vmmmgr.C
+++ b/src/kernel/vmmmgr.C
@@ -1,7 +1,7 @@
#include <util/singleton.H>
#include <kernel/vmmmgr.H>
#include <kernel/console.H>
-#include <kernel/ppcarch.H>
+#include <arch/ppc.H>
extern void* data_load_address;
@@ -102,7 +102,7 @@ bool VmmManager::_pteMiss(task_t* t)
{
lock.lock();
- uint64_t effAddr = ppc_getDAR();
+ uint64_t effAddr = getDAR();
uint64_t effPid = effAddr / FULL_MEM_SIZE;
OpenPOWER on IntegriCloud