Subversion Repositories HelenOS

Rev

Rev 3597 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3597 Rev 4377
Line 131... Line 131...
131
            return ENOTSUP;
131
            return ENOTSUP;
132
       
132
       
133
        /* Register image as the program loader */
133
        /* Register image as the program loader */
134
        ASSERT(program_loader == NULL);
134
        ASSERT(program_loader == NULL);
135
        program_loader = image_addr;
135
        program_loader = image_addr;
136
        printf("Registered program loader at 0x%" PRIp "\n",
136
        LOG("Registered program loader at 0x%" PRIp "\n",
137
            image_addr);
137
            image_addr);
138
        return EOK;
138
        return EOK;
139
    }
139
    }
140
 
140
 
141
    program_create(as, ((elf_header_t *) image_addr)->e_entry, name, p);
141
    program_create(as, ((elf_header_t *) image_addr)->e_entry, name, p);
Line 188... Line 188...
188
    thread_ready(p->main_thread);
188
    thread_ready(p->main_thread);
189
}
189
}
190
 
190
 
191
/** Syscall for creating a new loader instance from userspace.
191
/** Syscall for creating a new loader instance from userspace.
192
 *
192
 *
193
 * Creates a new task from the program loader image, connects a phone
193
 * Creates a new task from the program loader image and sets
194
 * to it and stores the phone id into the provided buffer.
194
 * the task name.
195
 *
195
 *
196
 * @param uspace_phone_id   Userspace address where to store the phone id.
-
 
197
 * @param name          Name to set on the new task (typically the same
196
 * @param name          Name to set on the new task (typically the same
198
 *              as the command used to execute it).
197
 *              as the command used to execute it).
199
 *
198
 *
200
 * @return 0 on success or an error code from @ref errno.h.
199
 * @return 0 on success or an error code from @ref errno.h.
201
 */
200
 */
202
unative_t sys_program_spawn_loader(int *uspace_phone_id, char *uspace_name,
201
unative_t sys_program_spawn_loader(char *uspace_name, size_t name_len)
203
    size_t name_len)
-
 
204
{
202
{
205
    program_t p;
203
    program_t p;
206
    int fake_id;
-
 
207
    int rc;
204
    int rc;
208
    int phone_id;
-
 
209
    char namebuf[TASK_NAME_BUFLEN];
205
    char namebuf[TASK_NAME_BUFLEN];
210
 
206
 
211
    fake_id = 0;
-
 
212
 
-
 
213
    /* Before we even try creating the task, see if we can write the id */
-
 
214
    rc = (unative_t) copy_to_uspace(uspace_phone_id, &fake_id,
-
 
215
        sizeof(fake_id));
-
 
216
    if (rc != 0)
-
 
217
        return rc;
-
 
218
 
-
 
219
    /* Cap length of name and copy it from userspace. */
207
    /* Cap length of name and copy it from userspace. */
220
 
208
 
221
    if (name_len > THREAD_NAME_BUFLEN - 1)
209
    if (name_len > TASK_NAME_BUFLEN - 1)
222
        name_len = THREAD_NAME_BUFLEN - 1;
210
        name_len = TASK_NAME_BUFLEN - 1;
223
 
211
 
224
    rc = copy_from_uspace(namebuf, uspace_name, name_len);
212
    rc = copy_from_uspace(namebuf, uspace_name, name_len);
225
    if (rc != 0)
213
    if (rc != 0)
226
        return (unative_t) rc;
214
        return (unative_t) rc;
227
 
215
 
228
    namebuf[name_len] = '\0';
216
    namebuf[name_len] = 0;
229
 
-
 
230
    /* Allocate the phone for communicating with the new task. */
-
 
231
 
-
 
232
    phone_id = phone_alloc();
-
 
233
    if (phone_id < 0)
-
 
234
        return ELIMIT;
-
 
235
 
217
 
236
    /* Spawn the new task. */
218
    /* Spawn the new task. */
237
 
219
 
238
    rc = program_create_loader(&p, namebuf);
220
    rc = program_create_loader(&p, namebuf);
239
    if (rc != 0)
221
    if (rc != 0)
240
        return rc;
222
        return rc;
241
 
223
 
242
    phone_connect(phone_id, &p.task->answerbox);
-
 
243
 
-
 
244
    /* No need to aquire lock before task_ready() */
-
 
245
    rc = (unative_t) copy_to_uspace(uspace_phone_id, &phone_id,
-
 
246
        sizeof(phone_id));
-
 
247
    if (rc != 0) {
-
 
248
        /* Ooops */
-
 
249
        ipc_phone_hangup(&TASK->phones[phone_id]);
-
 
250
        task_kill(p.task->taskid);
-
 
251
        return rc;
-
 
252
    }
-
 
253
 
-
 
254
    // FIXME: control the capabilities
224
    // FIXME: control the capabilities
255
    cap_set(p.task, cap_get(TASK));
225
    cap_set(p.task, cap_get(TASK));
256
 
226
 
257
    program_ready(&p);
227
    program_ready(&p);
258
 
228