summaryrefslogtreecommitdiffstats
path: root/src/kernel/kernel.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/kernel.C')
-rw-r--r--src/kernel/kernel.C16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C
index 00f3002e5..7b119d232 100644
--- a/src/kernel/kernel.C
+++ b/src/kernel/kernel.C
@@ -14,6 +14,7 @@
extern "C" void kernel_dispatch_task();
extern void init_main(void* unused);
+extern uint64_t kernel_other_thread_spinlock;
class Kernel
{
@@ -27,6 +28,7 @@ class Kernel
Kernel() {};
};
+extern "C"
int main()
{
printk("Booting %s kernel...\n\n", "Chenoo");
@@ -37,12 +39,25 @@ int main()
kernel.cpuBootstrap();
kernel.inittaskBootstrap();
+
+ // Ready to let the other CPUs go.
+ kernel_other_thread_spinlock = 1;
kernel_dispatch_task(); // no return.
while(1);
return 0;
}
+extern "C"
+int smp_slave_main(cpu_t* cpu)
+{
+ CpuManager::init_slave_smp(cpu);
+ VmmManager::init_slb();
+ cpu->scheduler->setNextRunnable();
+ kernel_dispatch_task();
+ return 0;
+}
+
void Kernel::cppBootstrap()
{
// Call default constructors for any static objects.
@@ -73,6 +88,5 @@ void Kernel::inittaskBootstrap()
task_t * t = TaskManager::createTask(&init_main, NULL);
t->cpu = CpuManager::getCurrentCPU();
TaskManager::setCurrentTask(t);
-
}
OpenPOWER on IntegriCloud