summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/cpumgr.C11
-rw-r--r--src/kernel/misc.C3
-rw-r--r--src/kernel/start.S2
-rw-r--r--src/kernel/syscall.C5
4 files changed, 16 insertions, 5 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index 791d14703..db79a15bf 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -177,8 +177,15 @@ void CpuManager::startCPU(ssize_t i)
}
cpu->scheduler = &Singleton<Scheduler>::instance();
cpu->scheduler_extra = NULL;
- cpu->kernel_stack =
- (void*) (((uint64_t)PageManager::allocatePage(4)) + 16320);
+
+ const size_t kernel_page_count = 4;
+ const size_t kernel_page_offset = kernel_page_count * PAGESIZE -
+ 8 * sizeof(uint64_t);
+ cpu->kernel_stack_bottom = PageManager::allocatePage(kernel_page_count);
+ cpu->kernel_stack = reinterpret_cast<void*>(
+ reinterpret_cast<uintptr_t>(cpu->kernel_stack_bottom) +
+ kernel_page_offset);
+
cpu->xscom_mutex = (mutex_t)MUTEX_INITIALIZER;
// Create idle task.
diff --git a/src/kernel/misc.C b/src/kernel/misc.C
index 3754003d0..9b2872f04 100644
--- a/src/kernel/misc.C
+++ b/src/kernel/misc.C
@@ -162,7 +162,7 @@ namespace KernelMisc
task_t* saveArea = new task_t;
memset(saveArea, '\0', sizeof(task_t));
saveArea->context.msr_mask = 0xC030; // EE, PR, IR, DR.
- *(reinterpret_cast<task_t**>(cpu->kernel_stack)) = saveArea;
+ *(reinterpret_cast<task_t**>(cpu->kernel_stack_bottom)) = saveArea;
// Execute winkle.
kernel_execute_winkle(saveArea);
@@ -190,6 +190,7 @@ namespace KernelMisc
setTB(iv_timebase);
// Restore caller of cpu_master_winkle().
+ iv_caller->state = TASK_STATE_RUNNING;
TaskManager::setCurrentTask(iv_caller);
}
diff --git a/src/kernel/start.S b/src/kernel/start.S
index 048c2411e..252014e6a 100644
--- a/src/kernel/start.S
+++ b/src/kernel/start.S
@@ -618,7 +618,7 @@ intvect_system_reset_inactive:
beq+ _start
;// Now we are a winkled processor that is awoken.
- ld r1, CPU_KERNEL_STACK(r2)
+ ld r1, CPU_KERNEL_STACK_BOTTOM(r2)
ld r1, 0(r1)
mtsprg3 r1
b kernel_dispatch_task
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index a38f08b78..4eb3b4fa8 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -701,7 +701,10 @@ namespace Systemcalls
else
{
TASK_SETRTN(t, 0);
- DeferredQueue::insert(new KernelMisc::WinkleCore(t));
+ KernelMisc::WinkleCore* deferred = new KernelMisc::WinkleCore(t);
+ t->state = TASK_STATE_BLOCK_USRSPACE;
+ t->state_info = deferred;
+ DeferredQueue::insert(deferred);
TaskManager::setCurrentTask(cpu->idle_task);
DeferredQueue::execute();
}
OpenPOWER on IntegriCloud