Subversion Repositories HelenOS

Rev

Rev 3042 | Rev 3425 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3042 Rev 3424
Line 151... Line 151...
151
        thread_ready(t);
151
        thread_ready(t);
152
    else
152
    else
153
        panic("thread_create/kconsole\n");
153
        panic("thread_create/kconsole\n");
154
 
154
 
155
    interrupts_enable();
155
    interrupts_enable();
156
 
156
   
-
 
157
    /*
-
 
158
     * Create user tasks, load RAM disk images.
-
 
159
     */
157
    count_t i;
160
    count_t i;
-
 
161
    thread_t *threads[CONFIG_INIT_TASKS];
-
 
162
   
158
    for (i = 0; i < init.cnt; i++) {
163
    for (i = 0; i < init.cnt; i++) {
159
        /*
-
 
160
         * Run user tasks, load RAM disk images.
-
 
161
         */
-
 
162
       
-
 
163
        if (init.tasks[i].addr % FRAME_SIZE) {
164
        if (init.tasks[i].addr % FRAME_SIZE) {
164
            printf("init[%d].addr is not frame aligned", i);
165
            printf("init[%" PRIc "].addr is not frame aligned", i);
165
            continue;
166
            continue;
166
        }
167
        }
167
 
168
 
168
        task_t *utask = task_run_program((void *) init.tasks[i].addr,
169
        threads[i] = thread_create_program(
169
            "uspace");
170
            (void *) init.tasks[i].addr, "uspace");
170
       
171
       
171
        if (utask) {
172
        if (threads[i] != NULL) {
172
            /*
173
            /*
173
             * Set capabilities to init userspace tasks.
174
             * Set capabilities to init userspace tasks.
174
             */
175
             */
175
            cap_set(utask, CAP_CAP | CAP_MEM_MANAGER |
176
            cap_set(threads[i]->task, CAP_CAP | CAP_MEM_MANAGER |
176
                CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG);
177
                CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG);
177
           
178
           
178
            if (!ipc_phone_0)
179
            if (!ipc_phone_0)
179
                ipc_phone_0 = &utask->answerbox;
180
                ipc_phone_0 = &threads[i]->task->answerbox;
180
        } else {
181
        } else {
181
            int rd = init_rd((rd_header_t *) init.tasks[i].addr,
182
            int rd = init_rd((rd_header_t *) init.tasks[i].addr,
182
                init.tasks[i].size);
183
                init.tasks[i].size);
183
           
184
           
184
            if (rd != RE_OK)
185
            if (rd != RE_OK)
185
                printf("Init binary %zd not used, error code %d.\n", i, rd);
186
                printf("Init binary %" PRIc " not used, error code %d.\n", i, rd);
-
 
187
        }
-
 
188
    }
-
 
189
   
-
 
190
    /*
-
 
191
     * Run user tasks with reasonable delays
-
 
192
     */
-
 
193
    for (i = 0; i < init.cnt; i++) {
-
 
194
        if (threads[i] != NULL) {
-
 
195
            thread_usleep(50000);
-
 
196
            thread_ready(threads[i]);
186
        }
197
        }
187
    }
198
    }
188
 
-
 
189
 
199
 
190
    if (!stdin) {
200
    if (!stdin) {
191
        while (1) {
201
        while (1) {
192
            thread_sleep(1);
202
            thread_sleep(1);
193
            printf("kinit... ");
203
            printf("kinit... ");