Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/init/init.c

    rffa2c8ef rf019cc07  
    3737#include <stdio.h>
    3838#include <unistd.h>
     39#include <ipc/ipc.h>
    3940#include <vfs/vfs.h>
    4041#include <bool.h>
     
    4546#include <malloc.h>
    4647#include <macros.h>
    47 #include <str.h>
     48#include <string.h>
    4849#include <devmap.h>
    49 #include <str_error.h>
     50#include <config.h>
    5051#include "init.h"
    5152
    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 
    6853static void info_print(void)
    6954{
    70         printf("%s: HelenOS init\n", NAME);
    71 }
    72 
    73 static bool mount_report(const char *desc, const char *mntpt,
    74     const char *fstype, const char *dev, int rc)
    75 {
     55        printf(NAME ": HelenOS init\n");
     56}
     57
     58static bool mount_root(const char *fstype)
     59{
     60        char *opts = "";
     61        const char *root_dev = "initrd";
     62       
     63        if (str_cmp(fstype, "tmpfs") == 0)
     64                opts = "restore";
     65       
     66        int rc = mount(fstype, "/", root_dev, opts, IPC_FLAG_BLOCKING);
     67       
    7668        switch (rc) {
    7769        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);
     70                printf(NAME ": Root filesystem mounted, %s at %s\n",
     71                    fstype, root_dev);
    8372                break;
    8473        case EBUSY:
    85                 printf("%s: %s already mounted on %s\n", NAME, desc, mntpt);
     74                printf(NAME ": Root filesystem already mounted\n");
    8675                return false;
    8776        case ELIMIT:
    88                 printf("%s: %s limit exceeded\n", NAME, desc);
     77                printf(NAME ": Unable to mount root filesystem\n");
    8978                return false;
    9079        case ENOENT:
    91                 printf("%s: %s unknown type (%s)\n", NAME, desc, fstype);
     80                printf(NAME ": Unknown filesystem type (%s)\n", fstype);
    9281                return false;
    9382        default:
    94                 printf("%s: %s not mounted on %s (%s)\n", NAME, desc, mntpt,
    95                     str_error(rc));
     83                printf(NAME ": Error mounting root filesystem (%d)\n", rc);
    9684                return false;
    9785        }
     
    10088}
    10189
    102 static 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 
    11590static bool mount_devfs(void)
    11691{
    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 
    123 static void spawn(const char *fname)
    124 {
    125         int rc;
     92        char null[MAX_DEVICE_NAME];
     93        int null_id = devmap_null_create();
     94       
     95        if (null_id == -1) {
     96                printf(NAME ": Unable to create null device\n");
     97                return false;
     98        }
     99       
     100        snprintf(null, MAX_DEVICE_NAME, "null%d", null_id);
     101        int rc = mount("devfs", "/dev", null, "", IPC_FLAG_BLOCKING);
     102       
     103        switch (rc) {
     104        case EOK:
     105                printf(NAME ": Device filesystem mounted\n");
     106                break;
     107        case EBUSY:
     108                printf(NAME ": Device filesystem already mounted\n");
     109                devmap_null_destroy(null_id);
     110                return false;
     111        case ELIMIT:
     112                printf(NAME ": Unable to mount device filesystem\n");
     113                devmap_null_destroy(null_id);
     114                return false;
     115        case ENOENT:
     116                printf(NAME ": Unknown filesystem type (devfs)\n");
     117                devmap_null_destroy(null_id);
     118                return false;
     119        default:
     120                printf(NAME ": Error mounting device filesystem (%d)\n", rc);
     121                devmap_null_destroy(null_id);
     122                return false;
     123        }
     124       
     125        return true;
     126}
     127
     128static void spawn(char *fname)
     129{
     130        char *argv[2];
    126131        struct stat s;
    127132       
     
    129134                return;
    130135       
    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 
    139 static void srv_start(const char *fname)
    140 {
     136        printf(NAME ": Spawning %s\n", fname);
     137       
     138        argv[0] = fname;
     139        argv[1] = NULL;
     140       
     141        if (!task_spawn(fname, argv))
     142                printf(NAME ": Error spawning %s\n", fname);
     143}
     144
     145static void srv_start(char *fname)
     146{
     147        char *argv[2];
    141148        task_id_t id;
    142149        task_exit_t texit;
     
    147154                return;
    148155       
    149         printf("%s: Starting %s\n", NAME, fname);
    150         rc = task_spawnl(&id, fname, fname, NULL);
     156        printf(NAME ": Starting %s\n", fname);
     157       
     158        argv[0] = fname;
     159        argv[1] = NULL;
     160       
     161        id = task_spawn(fname, argv);
    151162        if (!id) {
    152                 printf("%s: Error spawning %s (%s)\n", NAME, fname,
    153                     str_error(rc));
    154                 return;
    155         }
    156        
     163                printf(NAME ": Error spawning %s\n", fname);
     164                return;
     165        }
     166
    157167        rc = task_wait(id, &texit, &retval);
    158168        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,
     169                printf(NAME ": Error waiting for %s\n", fname);
     170                return;
     171        }
     172
     173        if (texit != TASK_EXIT_NORMAL || retval != 0) {
     174                printf(NAME ": Server %s failed to start (returned %d)\n",
    172175                        fname, retval);
    173176        }
    174177}
    175178
    176 static void console(const char *dev)
    177 {
    178         char hid_in[DEVMAP_NAME_MAXLEN];
     179static void getvc(char *dev, char *app)
     180{
     181        char *argv[4];
     182        char vc[MAX_DEVICE_NAME];
    179183        int rc;
    180184       
    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;
     185        snprintf(vc, MAX_DEVICE_NAME, "/dev/%s", dev);
     186       
     187        printf(NAME ": Spawning getvc on %s\n", vc);
     188       
     189        dev_handle_t handle;
    187190        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 
    201 static void getterm(const char *dev, const char *app, bool wmsg)
    202 {
    203         char term[DEVMAP_NAME_MAXLEN];
     191       
     192        if (rc == EOK) {
     193                argv[0] = "/app/getvc";
     194                argv[1] = vc;
     195                argv[2] = app;
     196                argv[3] = NULL;
     197               
     198                if (!task_spawn("/app/getvc", argv))
     199                        printf(NAME ": Error spawning getvc on %s\n", vc);
     200        } else {
     201                printf(NAME ": Error waiting on %s\n", vc);
     202        }
     203}
     204
     205static void mount_data(void)
     206{
    204207        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 
    236 static 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 
    243 static 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);
     208
     209        printf("Trying to mount disk0 on /data... ");
     210        fflush(stdout);
     211
     212        rc = mount("fat", "/data", "disk0", "wtcache", 0);
     213        if (rc == EOK)
     214                printf("OK\n");
     215        else
     216                printf("Failed\n");
    248217}
    249218
     
    253222       
    254223        if (!mount_root(STRING(RDFMT))) {
    255                 printf("%s: Exiting\n", NAME);
     224                printf(NAME ": Exiting\n");
    256225                return -1;
    257226        }
    258227       
    259         /* Make sure tmpfs is running. */
    260         if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
    261                 spawn("/srv/tmpfs");
    262         }
    263        
    264228        spawn("/srv/devfs");
    265         spawn("/srv/taskmon");
    266229       
    267230        if (!mount_devfs()) {
    268                 printf("%s: Exiting\n", NAME);
     231                printf(NAME ": Exiting\n");
    269232                return -2;
    270233        }
    271234       
    272         mount_tmpfs();
    273        
    274         spawn("/srv/apic");
    275         spawn("/srv/i8259");
     235        spawn("/srv/fb");
     236        spawn("/srv/kbd");
     237        spawn("/srv/console");
    276238        spawn("/srv/fhc");
    277239        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        
     240
    291241        /*
    292242         * Start these synchronously so that mount_data() can be
     
    299249        (void) srv_start;
    300250#endif
    301        
     251
    302252#ifdef CONFIG_MOUNT_DATA
    303253        mount_data();
     
    305255        (void) mount_data;
    306256#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);
     257
     258        getvc("vc0", "/app/bdsh");
     259        getvc("vc1", "/app/bdsh");
     260        getvc("vc2", "/app/bdsh");
     261        getvc("vc3", "/app/bdsh");
     262        getvc("vc4", "/app/bdsh");
     263        getvc("vc5", "/app/bdsh");
     264        getvc("vc6", "/app/klog");
    315265       
    316266        return 0;
Note: See TracChangeset for help on using the changeset viewer.