source: mainline/uspace/app/init/init.c@ 1916d1f

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

Remove support for Sun hardware for which we have no test plan.

This includes the removal of the following functionality only available
via the Simics simulator, for which we have been unable to secure a
license:

  • FHC bus and interrupt controller
  • Zilog 8530 serial controller attached to Sun keyboard
  • Serengeti and SGCN support
  • Property mode set to 100644
File size: 7.5 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 printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, dev);
179
180 /* Wait for the input device to be ready */
181 devmap_handle_t handle;
182 int rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
183 if (rc != EOK) {
184 printf("%s: Error waiting on %s (%s)\n", NAME, dev,
185 str_error(rc));
186 return;
187 }
188
189 rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, dev, NULL);
190 if (rc != EOK) {
191 printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
192 dev, str_error(rc));
193 }
194}
195
196static void getterm(const char *dev, const char *app, bool wmsg)
197{
198 char term[DEVMAP_NAME_MAXLEN];
199 int rc;
200
201 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
202
203 printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app);
204
205 /* Wait for the terminal device to be ready */
206 devmap_handle_t handle;
207 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
208 if (rc != EOK) {
209 printf("%s: Error waiting on %s (%s)\n", NAME, term,
210 str_error(rc));
211 return;
212 }
213
214 if (wmsg) {
215 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term,
216 app, NULL);
217 if (rc != EOK) {
218 printf("%s: Error spawning %s -w %s %s (%s)\n", NAME,
219 APP_GETTERM, term, app, str_error(rc));
220 }
221 } else {
222 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app,
223 NULL);
224 if (rc != EOK) {
225 printf("%s: Error spawning %s %s %s (%s)\n", NAME,
226 APP_GETTERM, term, app, str_error(rc));
227 }
228 }
229}
230
231static bool mount_tmpfs(void)
232{
233 int rc = mount(TMPFS_FS_TYPE, TMPFS_MOUNT_POINT, "", "", 0);
234 return mount_report("Temporary filesystem", TMPFS_MOUNT_POINT,
235 TMPFS_FS_TYPE, NULL, rc);
236}
237
238static bool mount_data(void)
239{
240 int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0);
241 return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE,
242 DATA_DEVICE, rc);
243}
244
245int main(int argc, char *argv[])
246{
247 info_print();
248
249 if (!mount_root(STRING(RDFMT))) {
250 printf("%s: Exiting\n", NAME);
251 return -1;
252 }
253
254 /* Make sure tmpfs is running. */
255 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
256 spawn("/srv/tmpfs");
257 }
258
259 spawn("/srv/devfs");
260 spawn("/srv/taskmon");
261
262 if (!mount_devfs()) {
263 printf("%s: Exiting\n", NAME);
264 return -2;
265 }
266
267 mount_tmpfs();
268
269 spawn("/srv/devman");
270 spawn("/srv/apic");
271 spawn("/srv/i8259");
272 spawn("/srv/obio");
273 srv_start("/srv/cuda_adb");
274 srv_start("/srv/i8042");
275 srv_start("/srv/s3c24ser");
276 srv_start("/srv/s3c24ts");
277
278 spawn("/srv/fb");
279 spawn("/srv/input");
280 console("hid/input");
281
282 spawn("/srv/clip");
283
284 /*
285 * Start these synchronously so that mount_data() can be
286 * non-blocking.
287 */
288#ifdef CONFIG_START_BD
289 srv_start("/srv/ata_bd");
290 srv_start("/srv/gxe_bd");
291#else
292 (void) srv_start;
293#endif
294
295#ifdef CONFIG_MOUNT_DATA
296 mount_data();
297#else
298 (void) mount_data;
299#endif
300
301 getterm("term/vc0", "/app/bdsh", true);
302 getterm("term/vc1", "/app/bdsh", false);
303 getterm("term/vc2", "/app/bdsh", false);
304 getterm("term/vc3", "/app/bdsh", false);
305 getterm("term/vc4", "/app/bdsh", false);
306 getterm("term/vc5", "/app/bdsh", false);
307 getterm("term/vc6", "/app/klog", false);
308
309 return 0;
310}
311
312/** @}
313 */
Note: See TracBrowser for help on using the repository browser.