summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-07-07 17:24:25 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-07-07 17:24:25 -0500
commit2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (patch)
treea9710129f768bce446b05cab9dac44c9846bb39b /src/include
parentce785ea353070d14462e3c3395bf89d47c896461 (diff)
downloadtalos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.tar.gz
talos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.zip
SMT support.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/kernel/cpu.H11
-rw-r--r--src/include/kernel/cpumgr.H7
-rw-r--r--src/include/kernel/ppcarch.H3
-rw-r--r--src/include/kernel/ppcconsts.S2
-rw-r--r--src/include/kernel/scheduler.H10
-rw-r--r--src/include/kernel/vmmmgr.H1
-rw-r--r--src/include/sys/task.h1
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
}
OpenPOWER on IntegriCloud