fix usage of krnspinlock & wip changes to set TS_SPIN for tasks spinning on spin...
[AROS.git] / arch / arm-native / exec / platform_init.c
blob9041d06cc85929b1f1be2f05548424ed2af1f8a6
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 1
8 #include <aros/debug.h>
9 #include <aros/cpu.h>
10 #include <aros/kernel.h>
11 #include <aros/symbolsets.h>
12 #include <exec/memory.h>
13 #include <exec/tasks.h>
14 #include <exec/alerts.h>
15 #include <exec/execbase.h>
16 #include <asm/io.h>
18 #include <proto/exec.h>
19 #include <proto/kernel.h>
21 #include <strings.h>
22 #include <stdio.h>
24 #include "exec_intern.h"
25 #if defined(__AROSEXEC_SMP__)
26 #include "etask.h"
27 #endif
29 /* Linked from kernel.resource,
30 * need to retrieve in a cleaner fashion .. */
31 extern IPTR stack[];
33 extern void IdleTask(struct ExecBase *);
35 int Exec_ARMCPUInit(struct ExecBase *SysBase)
37 struct Task *BootTask, *CPUIdleTask;
38 int cpu, cpunum = KrnGetCPUCount();
39 char *taskName;
41 D(bug("[Exec] %s()\n", __PRETTY_FUNCTION__));
43 BootTask = GET_THIS_TASK;
45 D(bug("[Exec] %s: launched from %s @ 0x%p\n", __PRETTY_FUNCTION__, BootTask->tc_Node.ln_Name, BootTask));
47 if (cpunum == 0)
49 /* for our sanity we will tell exec about the correct stack for the boot task */
50 BootTask->tc_SPLower = stack;
51 BootTask->tc_SPUpper = stack + AROS_STACKSIZE;
54 #if defined(__AROSEXEC_SMP__)
55 for (cpu = 0; cpu < cpunum; cpu ++)
57 taskName = AllocVec(15, MEMF_CLEAR);
58 sprintf( taskName, "CPU #%02d Idle", cpu);
59 #else
60 taskName = "System Idle";
61 #endif
62 CPUIdleTask = NewCreateTask(TASKTAG_NAME , taskName,
63 #if defined(__AROSEXEC_SMP__)
64 TASKTAG_AFFINITY , KrnGetCPUMask(cpu),
65 #endif
66 TASKTAG_PRI , -127,
67 TASKTAG_PC , IdleTask,
68 TASKTAG_ARG1 , SysBase,
69 TAG_DONE);
71 if (CPUIdleTask)
74 bug("[Exec] %s: %s Task created @ 0x%p\n", __PRETTY_FUNCTION__, CPUIdleTask->tc_Node.ln_Name, CPUIdleTask);
75 #if defined(__AROSEXEC_SMP__)
76 bug("[Exec] %s: CPU Affinity : %08x\n", __PRETTY_FUNCTION__, GetIntETask(CPUIdleTask)->iet_CpuAffinity);
77 #endif
80 #if defined(__AROSEXEC_SMP__)
82 #endif
84 return TRUE;
87 #if defined(__AROSEXEC_SMP__)
88 struct Hook Exec_TaskSpinLockFailHook;
90 AROS_UFH3(void, Exec_TaskSpinLockFailFunc,
91 AROS_UFHA(struct Hook *, h, A0),
92 AROS_UFHA(void *, unused, A2),
93 AROS_UFHA(APTR, msg, A1))
95 AROS_USERFUNC_INIT
97 struct Task *thisTask = GET_THIS_TASK;
99 /* tell the schedular that the task is waiting on a spinlock */
100 thisTask->tc_State = TS_SPIN;
102 AROS_USERFUNC_EXIT
105 void Exec_TaskSpinUnlock(spinlock_t *thisLock)
107 #if (0)
108 struct Task *curTask, *tmp;
110 ForeachNodeSafe(&PrivExecBase(SysBase)->TaskSpinning, (struct Node *)curTask, tmp)
112 if (curTask-> == thisLock)
114 Kernel_43_KrnSpinLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL,
115 SPINLOCK_MODE_WRITE);
116 Disable();
117 Remove(&curTask->tc_Node);
118 Enqueue(&SysBase->TaskReady, &task->tc_Node);
119 Kernel_44_KrnSpinUnLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL);
120 Enable();
123 Kernel_44_KrnSpinUnLock(&PrivExecBase(SysBase)->TaskSpinningLock, NULL);
124 #endif
127 int Exec_TaskSpinningInit(struct ExecBase *SysBase)
129 /* setup the task spinning hook */
130 Exec_TaskSpinLockFailHook.h_Entry = (HOOKFUNC)Exec_TaskSpinLockFailFunc;
133 ADD2INITLIB(Exec_TaskSpinningInit, 125)
134 #endif
136 ADD2INITLIB(Exec_ARMCPUInit, 0)