diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-07-07 17:24:25 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-07-07 17:24:25 -0500 |
commit | 2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (patch) | |
tree | a9710129f768bce446b05cab9dac44c9846bb39b /src/include | |
parent | ce785ea353070d14462e3c3395bf89d47c896461 (diff) | |
download | talos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.tar.gz talos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.zip |
SMT support.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/kernel/cpu.H | 11 | ||||
-rw-r--r-- | src/include/kernel/cpumgr.H | 7 | ||||
-rw-r--r-- | src/include/kernel/ppcarch.H | 3 | ||||
-rw-r--r-- | src/include/kernel/ppcconsts.S | 2 | ||||
-rw-r--r-- | src/include/kernel/scheduler.H | 10 | ||||
-rw-r--r-- | src/include/kernel/vmmmgr.H | 1 | ||||
-rw-r--r-- | src/include/sys/task.h | 1 |
7 files changed, 24 insertions, 11 deletions
diff --git a/src/include/kernel/cpu.H b/src/include/kernel/cpu.H index 2e5a489d9..81b43a57c 100644 --- a/src/include/kernel/cpu.H +++ b/src/include/kernel/cpu.H @@ -2,6 +2,10 @@ #define __KERNEL_CPU_H #include <kernel/types.h> +#include <kernel/ppcarch.H> + +// Thread ID support only, Power7 (4 threads). +#define KERNEL_MAX_SUPPORTED_CPUS 4 class Scheduler; @@ -11,6 +15,13 @@ struct cpu_t cpuid_t cpu; Scheduler* scheduler; + task_t* idle_task; }; +__attribute__((always_inline)) +inline uint64_t getCpuId() +{ + return ppc_getPIR() & (KERNEL_MAX_SUPPORTED_CPUS - 1); +} + #endif diff --git a/src/include/kernel/cpumgr.H b/src/include/kernel/cpumgr.H index 325f09d32..47ec78c4d 100644 --- a/src/include/kernel/cpumgr.H +++ b/src/include/kernel/cpumgr.H @@ -13,8 +13,10 @@ class CpuManager * task structure in SPRG3. */ static cpu_t* getCurrentCPU(); + static cpu_t* getCpu(size_t i) { return cv_cpus[i]; }; static void init(); + static void init_slave_smp(cpu_t*); protected: CpuManager(); @@ -24,9 +26,12 @@ class CpuManager * Starts the requested CPU. Default of -1 implies current CPU. */ void startCPU(ssize_t i = -1); + void startSlaveCPU(cpu_t*); private: - cpu_t* iv_cpus[MAXCPUS]; + static cpu_t* cv_cpus[MAXCPUS]; // Need to be able to access this + // from start.S to get initial stacks + // of secondary cpus / threads. }; #endif diff --git a/src/include/kernel/ppcarch.H b/src/include/kernel/ppcarch.H index 13ebfe6e2..71d4516d4 100644 --- a/src/include/kernel/ppcarch.H +++ b/src/include/kernel/ppcarch.H @@ -55,8 +55,7 @@ __attribute__((always_inline)) inline void ppc_setMSR(uint64_t _msr) { register uint64_t msr = _msr; - asm volatile("mtmsr %0; isync" : "=r" (msr)); + asm volatile("mtmsr %0; isync" :: "r" (msr)); } - #endif diff --git a/src/include/kernel/ppcconsts.S b/src/include/kernel/ppcconsts.S index 450972026..0c5e1dc3d 100644 --- a/src/include/kernel/ppcconsts.S +++ b/src/include/kernel/ppcconsts.S @@ -122,6 +122,8 @@ .set HID0,1008 .set IABR,1010 + .set PIR, 1023 + #*--------------------------------------------------------------------*# #* Task offset Constants *# #*--------------------------------------------------------------------*# diff --git a/src/include/kernel/scheduler.H b/src/include/kernel/scheduler.H index 76034af48..71b21559a 100644 --- a/src/include/kernel/scheduler.H +++ b/src/include/kernel/scheduler.H @@ -18,18 +18,12 @@ class Scheduler void setNextRunnable(); protected: - Scheduler(cpu_t* cpu) : - iv_taskList(), iv_idleTask(NULL), iv_cpu(cpu) {}; + Scheduler() : + iv_taskList() {}; ~Scheduler() {}; - void setIdleTask(task_t* t) { iv_idleTask = t; }; - task_t* getIdleTask() { return iv_idleTask; }; - private: Util::Locked::Queue<task_t, true, Spinlock> iv_taskList; - - task_t* iv_idleTask; - cpu_t* iv_cpu; }; #endif diff --git a/src/include/kernel/vmmmgr.H b/src/include/kernel/vmmmgr.H index 7ea2350bb..e55595ed5 100644 --- a/src/include/kernel/vmmmgr.H +++ b/src/include/kernel/vmmmgr.H @@ -38,6 +38,7 @@ class VmmManager }; static void init(); + static void init_slb(); protected: VmmManager(); diff --git a/src/include/sys/task.h b/src/include/sys/task.h index e50c6daee..520008e6d 100644 --- a/src/include/sys/task.h +++ b/src/include/sys/task.h @@ -14,6 +14,7 @@ tid_t task_create(void(*)(void*), void*); void task_end(); tid_t task_gettid(); +cpuid_t task_getcpuid(); #ifdef __cplusplus } |