source: mainline/kernel/generic/src/main/kinit.c@ 0fa6044

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0fa6044 was 0fa6044, checked in by Jakub Jermar <jakub@…>, 19 years ago

sparc64 work.

Fix bug introduced in revision 1852. When fixing CWP,
the input registers of the current window (i.e. output
registers of the window belonging to the interrupted
context) must be preserved. Preserve those registers
in memory. Sure there exist more efficient ways how to
copy the inputs.

Simplify before_thread_runs_arch(), resp. after_thread_ran_arch(),
and make them install, resp. uninstall, DTLB locked mapping for
eventual userspace window buffer.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * Copyright (C) 2001-2004 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup main
30 * @{
31 */
32
33/**
34 * @file
35 * @brief Kernel initialization thread.
36 *
37 * This file contains kinit kernel thread which carries out
38 * high level system initialization.
39 *
40 * This file is responsible for finishing SMP configuration
41 * and creation of userspace init tasks.
42 */
43
44#include <main/kinit.h>
45#include <config.h>
46#include <arch.h>
47#include <proc/scheduler.h>
48#include <proc/task.h>
49#include <proc/thread.h>
50#include <panic.h>
51#include <func.h>
52#include <cpu.h>
53#include <arch/asm.h>
54#include <mm/page.h>
55#include <arch/mm/page.h>
56#include <mm/as.h>
57#include <mm/frame.h>
58#include <print.h>
59#include <memstr.h>
60#include <console/console.h>
61#include <interrupt.h>
62#include <console/kconsole.h>
63#include <security/cap.h>
64
65#ifdef CONFIG_SMP
66#include <arch/smp/mps.h>
67#endif /* CONFIG_SMP */
68
69#include <synch/waitq.h>
70#include <synch/spinlock.h>
71
72#ifdef CONFIG_TEST
73#include <test.h>
74#endif /* CONFIG_TEST */
75
76/** Kernel initialization thread.
77 *
78 * kinit takes care of higher level kernel
79 * initialization (i.e. thread creation,
80 * userspace initialization etc.).
81 *
82 * @param arg Not used.
83 */
84void kinit(void *arg)
85{
86 thread_t *t;
87
88 /*
89 * Detach kinit as nobody will call thread_join_timeout() on it.
90 */
91 thread_detach(THREAD);
92
93 interrupts_disable();
94
95#ifdef CONFIG_SMP
96 if (config.cpu_count > 1) {
97 /*
98 * Create the kmp thread and wait for its completion.
99 * cpu1 through cpuN-1 will come up consecutively and
100 * not mess together with kcpulb threads.
101 * Just a beautification.
102 */
103 if ((t = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, "kmp"))) {
104 spinlock_lock(&t->lock);
105 t->cpu = &cpus[0];
106 spinlock_unlock(&t->lock);
107 thread_ready(t);
108 } else
109 panic("thread_create/kmp\n");
110 thread_join(t);
111 thread_detach(t);
112 }
113#endif /* CONFIG_SMP */
114 /*
115 * Now that all CPUs are up, we can report what we've found.
116 */
117 cpu_list();
118
119#ifdef CONFIG_SMP
120 if (config.cpu_count > 1) {
121 int i;
122
123 /*
124 * For each CPU, create its load balancing thread.
125 */
126 for (i = 0; i < config.cpu_count; i++) {
127
128 if ((t = thread_create(kcpulb, NULL, TASK, THREAD_FLAG_WIRED, "kcpulb"))) {
129 spinlock_lock(&t->lock);
130 t->cpu = &cpus[i];
131 spinlock_unlock(&t->lock);
132 thread_ready(t);
133 } else
134 panic("thread_create/kcpulb\n");
135
136 }
137 }
138#endif /* CONFIG_SMP */
139
140 /*
141 * At this point SMP, if present, is configured.
142 */
143 arch_post_smp_init();
144
145 /*
146 * Create kernel console.
147 */
148 if ((t = thread_create(kconsole, "kconsole", TASK, 0, "kconsole")))
149 thread_ready(t);
150 else
151 panic("thread_create/kconsole\n");
152
153 interrupts_enable();
154
155#ifdef CONFIG_TEST
156 test();
157 printf("\nTest finished, please reboot.\n");
158#else /* CONFIG_TEST */
159
160 task_t *utask;
161 count_t i;
162 for (i = 0; i < init.cnt; i++) {
163 /*
164 * Run user tasks.
165 */
166
167 if (init.tasks[i].addr % FRAME_SIZE)
168 panic("init[%d].addr is not frame aligned", i);
169
170 utask = task_run_program((void *) init.tasks[i].addr, "USPACE");
171 if (utask) {
172 /*
173 * Set capabilities to init userspace tasks.
174 */
175 cap_set(utask, CAP_CAP | CAP_MEM_MANAGER | CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG);
176
177 if (!ipc_phone_0)
178 ipc_phone_0 = &utask->answerbox;
179 } else
180 printf("Init task %zd not started.\n", i);
181 }
182
183
184 if (!stdin) {
185 while (1) {
186 thread_sleep(1);
187 printf("kinit... ");
188 }
189 }
190#endif /* CONFIG_TEST */
191
192}
193
194/** @}
195 */
Note: See TracBrowser for help on using the repository browser.