source: mainline/uspace/app/init/init.c@ f62468c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since f62468c was c9f5e238, checked in by Vojtech Horky <vojtechhorky@…>, 15 years ago

devman in kconsole fixes

It seems better to launch devman later to prevent overflooding klog.

On real machine, the devman is way to quick and more pages are needed to
allow /app/klog read everything.

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/*
2 * Copyright (c) 2005 Martin Decky
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 init Init
30 * @brief Init process for user space environment configuration.
31 * @{
32 */
33/**
34 * @file
35 */
36
37#include <stdio.h>
38#include <unistd.h>
39#include <vfs/vfs.h>
40#include <bool.h>
41#include <errno.h>
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <task.h>
45#include <malloc.h>
46#include <macros.h>
47#include <str.h>
48#include <devmap.h>
49#include <str_error.h>
50#include "init.h"
51
52#define ROOT_DEVICE "bd/initrd"
53#define ROOT_MOUNT_POINT "/"
54
55#define DEVFS_FS_TYPE "devfs"
56#define DEVFS_MOUNT_POINT "/dev"
57
58#define TMPFS_FS_TYPE "tmpfs"
59#define TMPFS_MOUNT_POINT "/tmp"
60
61#define DATA_FS_TYPE "fat"
62#define DATA_DEVICE "bd/ata1disk0"
63#define DATA_MOUNT_POINT "/data"
64
65#define SRV_CONSOLE "/srv/console"
66#define APP_GETTERM "/app/getterm"
67
68static void info_print(void)
69{
70 printf("%s: HelenOS init\n", NAME);
71}
72
73static bool mount_report(const char *desc, const char *mntpt,
74 const char *fstype, const char *dev, int rc)
75{
76 switch (rc) {
77 case EOK:
78 if (dev != NULL)
79 printf("%s: %s mounted on %s (%s at %s)\n", NAME, desc, mntpt,
80 fstype, dev);
81 else
82 printf("%s: %s mounted on %s (%s)\n", NAME, desc, mntpt, fstype);
83 break;
84 case EBUSY:
85 printf("%s: %s already mounted on %s\n", NAME, desc, mntpt);
86 return false;
87 case ELIMIT:
88 printf("%s: %s limit exceeded\n", NAME, desc);
89 return false;
90 case ENOENT:
91 printf("%s: %s unknown type (%s)\n", NAME, desc, fstype);
92 return false;
93 default:
94 printf("%s: %s not mounted on %s (%s)\n", NAME, desc, mntpt,
95 str_error(rc));
96 return false;
97 }
98
99 return true;
100}
101
102static bool mount_root(const char *fstype)
103{
104 const char *opts = "";
105
106 if (str_cmp(fstype, "tmpfs") == 0)
107 opts = "restore";
108
109 int rc = mount(fstype, ROOT_MOUNT_POINT, ROOT_DEVICE, opts,
110 IPC_FLAG_BLOCKING);
111 return mount_report("Root filesystem", ROOT_MOUNT_POINT, fstype,
112 ROOT_DEVICE, rc);
113}
114
115static bool mount_devfs(void)
116{
117 int rc = mount(DEVFS_FS_TYPE, DEVFS_MOUNT_POINT, "", "",
118 IPC_FLAG_BLOCKING);
119 return mount_report("Device filesystem", DEVFS_MOUNT_POINT, DEVFS_FS_TYPE,
120 NULL, rc);
121}
122
123static void spawn(const char *fname)
124{
125 int rc;
126 struct stat s;
127
128 if (stat(fname, &s) == ENOENT)
129 return;
130
131 printf("%s: Spawning %s\n", NAME, fname);
132 rc = task_spawnl(NULL, fname, fname, NULL);
133 if (rc != EOK) {
134 printf("%s: Error spawning %s (%s)\n", NAME, fname,
135 str_error(rc));
136 }
137}
138
139static void srv_start(const char *fname)
140{
141 task_id_t id;
142 task_exit_t texit;
143 int rc, retval;
144 struct stat s;
145
146 if (stat(fname, &s) == ENOENT)
147 return;
148
149 printf("%s: Starting %s\n", NAME, fname);
150 rc = task_spawnl(&id, fname, fname, NULL);
151 if (!id) {
152 printf("%s: Error spawning %s (%s)\n", NAME, fname,
153 str_error(rc));
154 return;
155 }
156
157 rc = task_wait(id, &texit, &retval);
158 if (rc != EOK) {
159 printf("%s: Error waiting for %s (%s(\n", NAME, fname,
160 str_error(rc));
161 return;
162 }
163
164 if (texit != TASK_EXIT_NORMAL) {
165 printf("%s: Server %s failed to start (unexpectedly "
166 "terminated)\n", NAME, fname);
167 return;
168 }
169
170 if (retval != 0) {
171 printf("%s: Server %s failed to start (exit code %d)\n", NAME,
172 fname, retval);
173 }
174}
175
176static void console(const char *dev)
177{
178 char hid_in[DEVMAP_NAME_MAXLEN];
179 int rc;
180
181 snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
182
183 printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in);
184
185 /* Wait for the input device to be ready */
186 devmap_handle_t handle;
187 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
188 if (rc != EOK) {
189 printf("%s: Error waiting on %s (%s)\n", NAME, hid_in,
190 str_error(rc));
191 return;
192 }
193
194 rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, hid_in, NULL);
195 if (rc != EOK) {
196 printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
197 hid_in, str_error(rc));
198 }
199}
200
201static void getterm(const char *dev, const char *app, bool wmsg)
202{
203 char term[DEVMAP_NAME_MAXLEN];
204 int rc;
205
206 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
207
208 printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app);
209
210 /* Wait for the terminal device to be ready */
211 devmap_handle_t handle;
212 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
213 if (rc != EOK) {
214 printf("%s: Error waiting on %s (%s)\n", NAME, term,
215 str_error(rc));
216 return;
217 }
218
219 if (wmsg) {
220 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term,
221 app, NULL);
222 if (rc != EOK) {
223 printf("%s: Error spawning %s -w %s %s (%s)\n", NAME,
224 APP_GETTERM, term, app, str_error(rc));
225 }
226 } else {
227 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app,
228 NULL);
229 if (rc != EOK) {
230 printf("%s: Error spawning %s %s %s (%s)\n", NAME,
231 APP_GETTERM, term, app, str_error(rc));
232 }
233 }
234}
235
236static bool mount_tmpfs(void)
237{
238 int rc = mount(TMPFS_FS_TYPE, TMPFS_MOUNT_POINT, "", "", 0);
239 return mount_report("Temporary filesystem", TMPFS_MOUNT_POINT,
240 TMPFS_FS_TYPE, NULL, rc);
241}
242
243static bool mount_data(void)
244{
245 int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0);
246 return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE,
247 DATA_DEVICE, rc);
248}
249
250int main(int argc, char *argv[])
251{
252 info_print();
253
254 if (!mount_root(STRING(RDFMT))) {
255 printf("%s: Exiting\n", NAME);
256 return -1;
257 }
258
259 /* Make sure tmpfs is running. */
260 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
261 spawn("/srv/tmpfs");
262 }
263
264 spawn("/srv/devfs");
265 spawn("/srv/taskmon");
266
267 if (!mount_devfs()) {
268 printf("%s: Exiting\n", NAME);
269 return -2;
270 }
271
272 mount_tmpfs();
273
274 spawn("/srv/apic");
275 spawn("/srv/i8259");
276 spawn("/srv/fhc");
277 spawn("/srv/obio");
278 srv_start("/srv/cuda_adb");
279 srv_start("/srv/i8042");
280 srv_start("/srv/s3c24ser");
281 srv_start("/srv/adb_ms");
282 srv_start("/srv/char_ms");
283 srv_start("/srv/s3c24ts");
284
285 spawn("/srv/fb");
286 spawn("/srv/kbd");
287 console("hid_in/kbd");
288
289 spawn("/srv/clip");
290
291 /*
292 * Start these synchronously so that mount_data() can be
293 * non-blocking.
294 */
295#ifdef CONFIG_START_BD
296 srv_start("/srv/ata_bd");
297 srv_start("/srv/gxe_bd");
298#else
299 (void) srv_start;
300#endif
301
302#ifdef CONFIG_MOUNT_DATA
303 mount_data();
304#else
305 (void) mount_data;
306#endif
307
308 getterm("term/vc0", "/app/bdsh", true);
309 getterm("term/vc1", "/app/bdsh", false);
310 getterm("term/vc2", "/app/bdsh", false);
311 getterm("term/vc3", "/app/bdsh", false);
312 getterm("term/vc4", "/app/bdsh", false);
313 getterm("term/vc5", "/app/bdsh", false);
314 getterm("term/vc6", "/app/klog", false);
315
316#ifdef CONFIG_DEVMAN_EARLY_LAUNCH
317 spawn("/srv/devman");
318#else
319 getterm("term/vc7", "/srv/devman", false);
320#endif
321
322 return 0;
323}
324
325/** @}
326 */
Note: See TracBrowser for help on using the repository browser.