Subversion Repositories HelenOS

Rev

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

Rev 3191 Rev 3203
Line 45... Line 45...
45
#include <config.h>
45
#include <config.h>
46
#include <arch.h>
46
#include <arch.h>
47
#include <proc/scheduler.h>
47
#include <proc/scheduler.h>
48
#include <proc/task.h>
48
#include <proc/task.h>
49
#include <proc/thread.h>
49
#include <proc/thread.h>
-
 
50
#include <proc/program.h>
50
#include <panic.h>
51
#include <panic.h>
51
#include <func.h>
52
#include <func.h>
52
#include <cpu.h>
53
#include <cpu.h>
53
#include <arch/asm.h>
54
#include <arch/asm.h>
54
#include <mm/page.h>
55
#include <mm/page.h>
Line 157... Line 158...
157
   
158
   
158
    /*
159
    /*
159
     * Create user tasks, load RAM disk images.
160
     * Create user tasks, load RAM disk images.
160
     */
161
     */
161
    count_t i;
162
    count_t i;
162
    thread_t *threads[CONFIG_INIT_TASKS];
163
    program_t programs[CONFIG_INIT_TASKS];
163
   
164
   
164
    for (i = 0; i < init.cnt; i++) {
165
    for (i = 0; i < init.cnt; i++) {
165
        if (init.tasks[i].addr % FRAME_SIZE) {
166
        if (init.tasks[i].addr % FRAME_SIZE) {
166
            printf("init[%" PRIc "].addr is not frame aligned", i);
167
            printf("init[%" PRIc "].addr is not frame aligned", i);
167
            continue;
168
            continue;
168
        }
169
        }
169
 
170
 
170
        int rc = task_parse_initial((void *) init.tasks[i].addr,
171
        int rc = program_create_from_image((void *) init.tasks[i].addr,
171
            "uspace", &threads[i]);
172
            &programs[i]);
172
 
173
 
173
        if (rc == 0 && threads[i] != NULL) {
174
        if (rc == 0 && programs[i].task != NULL) {
174
            /*
175
            /*
175
             * Set capabilities to init userspace tasks.
176
             * Set capabilities to init userspace tasks.
176
             */
177
             */
177
            cap_set(threads[i]->task, CAP_CAP | CAP_MEM_MANAGER |
178
            cap_set(programs[i].task, CAP_CAP | CAP_MEM_MANAGER |
178
                CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG);
179
                CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG);
179
 
180
 
180
           
181
           
181
            if (!ipc_phone_0)
182
            if (!ipc_phone_0)
182
                ipc_phone_0 = &threads[i]->task->answerbox;
183
                ipc_phone_0 = &programs[i].task->answerbox;
183
        } else if (rc == 0) {
184
        } else if (rc == 0) {
184
            /* It was the program loader and was registered */
185
            /* It was the program loader and was registered */
185
        } else {
186
        } else {
186
            /* RAM disk image */
187
            /* RAM disk image */
187
            int rd = init_rd((rd_header_t *) init.tasks[i].addr,
188
            int rd = init_rd((rd_header_t *) init.tasks[i].addr,
Line 195... Line 196...
195
   
196
   
196
    /*
197
    /*
197
     * Run user tasks with reasonable delays
198
     * Run user tasks with reasonable delays
198
     */
199
     */
199
    for (i = 0; i < init.cnt; i++) {
200
    for (i = 0; i < init.cnt; i++) {
200
        if (threads[i] != NULL) {
201
        if (programs[i].task != NULL) {
201
            thread_usleep(50000);
202
            thread_usleep(50000);
202
            thread_ready(threads[i]);
203
            program_ready(&programs[i]);
203
        }
204
        }
204
    }
205
    }
205
 
206
 
206
    if (!stdin) {
207
    if (!stdin) {
207
        while (1) {
208
        while (1) {