From fc286db3ad6a7c3515f6fb6d8671842f92e8639e Mon Sep 17 00:00:00 2001 From: NicJA Date: Fri, 8 May 2015 01:11:17 +0000 Subject: [PATCH] wip commit. add idle tasks for additional cpu's. cleanup some debug. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@50625 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/arm-native/exec/platform_init.c | 31 +++++++++++++++++++++++-------- arch/arm-native/kernel/kernel_execsmp.c | 22 +++++++++------------- arch/arm-native/kernel/platform_bcm2708.c | 2 +- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/arch/arm-native/exec/platform_init.c b/arch/arm-native/exec/platform_init.c index 1be4d8ea4b..8f578c2ea2 100644 --- a/arch/arm-native/exec/platform_init.c +++ b/arch/arm-native/exec/platform_init.c @@ -14,9 +14,12 @@ #include #include #include + #include #include + #include +#include #include "exec_intern.h" @@ -29,13 +32,14 @@ extern void IdleTask(struct ExecBase *); int Exec_ARMCPUInit(struct ExecBase *SysBase) { struct Task *BootTask, *CPUIdleTask; - int cpunum = KrnGetCPUNumber(); + int cpu, cpunum = KrnGetCPUCount(); + char *taskName; - D(bug("[Exec] Exec_ARMCPUInit(%02d)\n", cpunum)); + D(bug("[Exec] %s()\n", __PRETTY_FUNCTION__)); BootTask = GET_THIS_TASK; - D(bug("[Exec] Exec_ARMCPUInit[%02d]: launched from %s @ 0x%p\n", cpunum, BootTask->tc_Node.ln_Name, BootTask)); + D(bug("[Exec] %s: launched from %s @ 0x%p\n", __PRETTY_FUNCTION__, BootTask->tc_Node.ln_Name, BootTask)); if (cpunum == 0) { @@ -44,19 +48,30 @@ int Exec_ARMCPUInit(struct ExecBase *SysBase) BootTask->tc_SPUpper = stack + AROS_STACKSIZE; } - CPUIdleTask = NewCreateTask(TASKTAG_NAME , "System Idle", #if defined(__AROSEXEC_SMP__) - TASKTAG_AFFINITY , KrnGetCPUMask(cpunum), + for (cpu = 0; cpu < cpunum; cpu ++) + { + taskName = AllocVec(15, MEMF_CLEAR); + sprintf( taskName, "CPU #%02d Idle", cpu); +#else + taskName = "System Idle"; +#endif + CPUIdleTask = NewCreateTask(TASKTAG_NAME , taskName, +#if defined(__AROSEXEC_SMP__) + TASKTAG_AFFINITY , KrnGetCPUMask(cpu), #endif TASKTAG_PRI , -127, TASKTAG_PC , IdleTask, TASKTAG_ARG1 , SysBase, TAG_DONE); - if (CPUIdleTask) - { - D(bug("[Exec] Exec_ARMCPUInit[%02d]: %s Task created @ 0x%p\n", cpunum, CPUIdleTask->tc_Node.ln_Name, CPUIdleTask)); + if (CPUIdleTask) + { + D(bug("[Exec] %s: %s Task created @ 0x%p\n", __PRETTY_FUNCTION__, CPUIdleTask->tc_Node.ln_Name, CPUIdleTask)); + } +#if defined(__AROSEXEC_SMP__) } +#endif return TRUE; } diff --git a/arch/arm-native/kernel/kernel_execsmp.c b/arch/arm-native/kernel/kernel_execsmp.c index 2933cabdc9..a53ab39f84 100644 --- a/arch/arm-native/kernel/kernel_execsmp.c +++ b/arch/arm-native/kernel/kernel_execsmp.c @@ -8,13 +8,13 @@ #include +#include "etask.h" #include "exec_intern.h" -#include "etask.h" +#define D(x) #if defined(__AROSEXEC_SMP__) extern BOOL Exec_InitETask(struct Task *, struct ExecBase *); -extern int Exec_ARMCPUInit(struct ExecBase *); struct Task *cpu_InitBootStrap(struct ExecBase *SysBase) { @@ -27,34 +27,34 @@ struct Task *cpu_InitBootStrap(struct ExecBase *SysBase) if ((bstask = AllocMem(sizeof(struct Task), MEMF_PUBLIC|MEMF_CLEAR)) == NULL) { - bug("[KRN] Core %d FATAL : Failed to allocate task for bootstrap", (tmp & 0x3)); + bug("[KRN] CPU #%02d FATAL : Failed to allocate task for bootstrap", (tmp & 0x3)); return NULL; } if ((ml = AllocMem(sizeof(struct MemList), MEMF_PUBLIC|MEMF_CLEAR)) == NULL) { - bug("[KRN] Core %d FATAL : Failed to allocate memory for bootstrap task", (tmp & 0x3)); + bug("[KRN] CPU #%02d FATAL : Failed to allocate memory for bootstrap task", (tmp & 0x3)); FreeMem(bstask, sizeof(struct Task)); return NULL; } - bug("[KRN] Core %d Bootstrap task @ 0x%p\n", (tmp & 0x3), bstask); + D(bug("[KRN] CPU #%02d Bootstrap task @ 0x%p\n", (tmp & 0x3), bstask)); if ((bsctx = KrnCreateContext()) == NULL) { - bug("[KRN] Core %d FATAL : Failed to create the boostrap task context\n", (tmp & 0x3)); + bug("[KRN] CPU %d FATAL : Failed to create the boostrap task context\n", (tmp & 0x3)); FreeMem(ml, sizeof(struct MemList)); FreeMem(bstask, sizeof(struct Task)); return NULL; } - bug("[KRN] Core %d cpu ctx @ 0x%p\n", (tmp & 0x3), bsctx); + D(bug("[KRN] CPU #%02d cpu ctx @ 0x%p\n", (tmp & 0x3), bsctx)); NEWLIST(&bstask->tc_MemEntry); if ((bstask->tc_Node.ln_Name = AllocVec(20, MEMF_CLEAR)) != NULL) { - sprintf( bstask->tc_Node.ln_Name, "Core(%d) Bootstrap", (tmp & 0x3)); + sprintf(bstask->tc_Node.ln_Name, "CPU #%02d Bootstrap", (tmp & 0x3)); } bstask->tc_Node.ln_Type = NT_TASK; bstask->tc_Node.ln_Pri = 0; @@ -70,7 +70,7 @@ struct Task *cpu_InitBootStrap(struct ExecBase *SysBase) /* Create a ETask structure and attach CPU context */ if (!Exec_InitETask(bstask, SysBase)) { - bug("[KRN] Core %d FATAL : Failed to initialize boostrap etask\n", (tmp & 0x3)); + bug("[KRN] CPU %d FATAL : Failed to initialize boostrap etask\n", (tmp & 0x3)); FreeVec(bstask->tc_Node.ln_Name); FreeMem(ml, sizeof(struct MemList)); FreeMem(bstask, sizeof(struct Task)); @@ -88,9 +88,5 @@ struct Task *cpu_InitBootStrap(struct ExecBase *SysBase) void cpu_BootStrap(struct Task *bstask, struct ExecBase *SysBase) { SET_THIS_TASK(bstask); - -#if (0) - Exec_ARMCPUInit(SysBase); -#endif } #endif diff --git a/arch/arm-native/kernel/platform_bcm2708.c b/arch/arm-native/kernel/platform_bcm2708.c index 09d26b8682..a14b3f03df 100644 --- a/arch/arm-native/kernel/platform_bcm2708.c +++ b/arch/arm-native/kernel/platform_bcm2708.c @@ -182,7 +182,7 @@ static void bcm2807_send_ipi(uint32_t ipi, uint32_t ipi_data, uint32_t cpumask) { /* TODO: check which mailbox is available and use it */ bcm2708_cpuipid[cpu]->ipi_data[mbno] = ipi_data; - *((uint32_t *)(BCM2836_MAILBOX0_SET0 + (0x10 * cpu))) = ipi; + *((uint32_t *)(BCM2836_MAILBOX0_SET0 + 4 * mbno + (0x10 * cpu))) = ipi; } #endif } -- 2.11.4.GIT