Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2087 | ||
---|---|---|---|
Line 96... | Line 96... | ||
96 | * Create the kmp thread and wait for its completion. |
96 | * Create the kmp thread and wait for its completion. |
97 | * cpu1 through cpuN-1 will come up consecutively and |
97 | * cpu1 through cpuN-1 will come up consecutively and |
98 | * not mess together with kcpulb threads. |
98 | * not mess together with kcpulb threads. |
99 | * Just a beautification. |
99 | * Just a beautification. |
100 | */ |
100 | */ |
101 | if ((t = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, "kmp", true))) { |
101 | if ((t = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, |
- | 102 | "kmp", true))) { |
|
102 | spinlock_lock(&t->lock); |
103 | spinlock_lock(&t->lock); |
103 | t->cpu = &cpus[0]; |
104 | t->cpu = &cpus[0]; |
104 | spinlock_unlock(&t->lock); |
105 | spinlock_unlock(&t->lock); |
105 | thread_ready(t); |
106 | thread_ready(t); |
106 | } else |
107 | } else |
Line 121... | Line 122... | ||
121 | /* |
122 | /* |
122 | * For each CPU, create its load balancing thread. |
123 | * For each CPU, create its load balancing thread. |
123 | */ |
124 | */ |
124 | for (i = 0; i < config.cpu_count; i++) { |
125 | for (i = 0; i < config.cpu_count; i++) { |
125 | 126 | ||
- | 127 | if ((t = thread_create(kcpulb, NULL, TASK, |
|
126 | if ((t = thread_create(kcpulb, NULL, TASK, THREAD_FLAG_WIRED, "kcpulb", true))) { |
128 | THREAD_FLAG_WIRED, "kcpulb", true))) { |
127 | spinlock_lock(&t->lock); |
129 | spinlock_lock(&t->lock); |
128 | t->cpu = &cpus[i]; |
130 | t->cpu = &cpus[i]; |
129 | spinlock_unlock(&t->lock); |
131 | spinlock_unlock(&t->lock); |
130 | thread_ready(t); |
132 | thread_ready(t); |
131 | } else |
133 | } else |
Line 141... | Line 143... | ||
141 | arch_post_smp_init(); |
143 | arch_post_smp_init(); |
142 | 144 | ||
143 | /* |
145 | /* |
144 | * Create kernel console. |
146 | * Create kernel console. |
145 | */ |
147 | */ |
146 | if ((t = thread_create(kconsole, "kconsole", TASK, 0, "kconsole", false))) |
148 | t = thread_create(kconsole, "kconsole", TASK, 0, "kconsole", false); |
- | 149 | if (t) |
|
147 | thread_ready(t); |
150 | thread_ready(t); |
148 | else |
151 | else |
149 | panic("thread_create/kconsole\n"); |
152 | panic("thread_create/kconsole\n"); |
150 | 153 | ||
151 | interrupts_enable(); |
154 | interrupts_enable(); |
Line 159... | Line 162... | ||
159 | if (init.tasks[i].addr % FRAME_SIZE) { |
162 | if (init.tasks[i].addr % FRAME_SIZE) { |
160 | printf("init[%d].addr is not frame aligned", i); |
163 | printf("init[%d].addr is not frame aligned", i); |
161 | continue; |
164 | continue; |
162 | } |
165 | } |
163 | 166 | ||
164 | task_t *utask = task_run_program((void *) init.tasks[i].addr, "uspace"); |
167 | task_t *utask = task_run_program((void *) init.tasks[i].addr, |
- | 168 | "uspace"); |
|
165 | if (utask) { |
169 | if (utask) { |
166 | /* |
170 | /* |
167 | * Set capabilities to init userspace tasks. |
171 | * Set capabilities to init userspace tasks. |
168 | */ |
172 | */ |
- | 173 | cap_set(utask, CAP_CAP | CAP_MEM_MANAGER | |
|
169 | cap_set(utask, CAP_CAP | CAP_MEM_MANAGER | CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG); |
174 | CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG); |
170 | 175 | ||
171 | if (!ipc_phone_0) |
176 | if (!ipc_phone_0) |
172 | ipc_phone_0 = &utask->answerbox; |
177 | ipc_phone_0 = &utask->answerbox; |
173 | } else { |
178 | } else { |
174 | int rd = init_rd((rd_header *) init.tasks[i].addr, init.tasks[i].size); |
179 | int rd = init_rd((rd_header *) init.tasks[i].addr, |
- | 180 | init.tasks[i].size); |
|
175 | 181 | ||
176 | if (rd != RE_OK) |
182 | if (rd != RE_OK) |
177 | printf("Init binary %zd not used.\n", i); |
183 | printf("Init binary %zd not used.\n", i); |
178 | } |
184 | } |
179 | } |
185 | } |