diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/console.C | 255 | ||||
-rw-r--r-- | src/kernel/cpumgr.C | 10 | ||||
-rw-r--r-- | src/kernel/exception.C | 8 | ||||
-rw-r--r-- | src/kernel/spinlock.C | 11 | ||||
-rw-r--r-- | src/kernel/start.S | 4 | ||||
-rw-r--r-- | src/kernel/syscall.C | 2 | ||||
-rw-r--r-- | src/kernel/taskmgr.C | 6 | ||||
-rw-r--r-- | src/kernel/terminate.S | 18 | ||||
-rw-r--r-- | src/kernel/vmmmgr.C | 4 |
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; |