version 1.1.1.1, 2008/06/03 10:38:51 |
version 1.1.1.1.2.1, 2008/08/13 17:12:43 |
|
|
int i, err = 0; |
int i, err = 0; |
|
|
/* |
/* |
* Wait 1sec for loading server. |
* Check the server existence. Timeout is 1sec. |
*/ |
*/ |
for (i = 0; i < 100; i++) { |
for (i = 0; i < 100; i++) { |
err = object_lookup((char *)name, obj); |
err = object_lookup((char *)name, obj); |
|
|
/* Notify to file system server */ |
/* Notify to file system server */ |
do { |
do { |
m.hdr.code = FS_EXEC; |
m.hdr.code = FS_EXEC; |
m.data[0] = org_task; |
m.data[0] = (int)org_task; |
m.data[1] = new_task; |
m.data[1] = (int)new_task; |
err = msg_send(fs_obj, &m, sizeof(m)); |
err = msg_send(fs_obj, &m, sizeof(m)); |
} while (err == EINTR); |
} while (err == EINTR); |
|
|
/* Notify to process server */ |
/* Notify to process server */ |
do { |
do { |
m.hdr.code = PS_EXEC; |
m.hdr.code = PS_EXEC; |
m.data[0] = org_task; |
m.data[0] = (int)org_task; |
m.data[1] = new_task; |
m.data[1] = (int)new_task; |
m.data[2] = (int)stack; |
m.data[2] = (int)stack; |
err = msg_send(proc_obj, &m, sizeof(m)); |
err = msg_send(proc_obj, &m, sizeof(m)); |
} while (err == EINTR); |
} while (err == EINTR); |
|
|
void (*entry)(void); |
void (*entry)(void); |
cap_t cap; |
cap_t cap; |
|
|
dprintf("do_exec: path=%s task=%x\n", msg->path, msg->hdr.task); |
DPRINTF(("do_exec: path=%s task=%x\n", msg->path, msg->hdr.task)); |
|
|
old_task = msg->hdr.task; |
old_task = msg->hdr.task; |
|
|
|
|
err = EIO; |
err = EIO; |
goto err2; |
goto err2; |
} |
} |
for (ldr = loader_table; ldr->name != NULL; ldr++) { |
for (ldr = loader_table; ldr->el_name != NULL; ldr++) { |
if (ldr->probe(header) == 0) |
if (ldr->el_probe(header) == 0) |
break; |
break; |
/* Check next format */ |
/* Check next format */ |
} |
} |
if (ldr->name == NULL) { |
if (ldr->el_name == NULL) { |
dprintf("Unsupported file format\n"); |
DPRINTF(("Unsupported file format\n")); |
err = ENOEXEC; |
err = ENOEXEC; |
goto err2; |
goto err2; |
} |
} |
dprintf("exec loader=%s\n", ldr->name); |
DPRINTF(("exec loader=%s\n", ldr->el_name)); |
|
|
/* |
/* |
* Suspend old task |
* Suspend old task |
|
|
* Copy capabilities |
* Copy capabilities |
*/ |
*/ |
task_getcap(old_task, &cap); |
task_getcap(old_task, &cap); |
|
|
|
/* |
|
* XXX: Temporary removed... |
|
*/ |
/* cap &= CONFIG_CAP_MASK; */ |
/* cap &= CONFIG_CAP_MASK; */ |
|
|
task_setcap(new_task, &cap); |
task_setcap(new_task, &cap); |
|
|
if ((err = thread_create(new_task, &th)) != 0) |
if ((err = thread_create(new_task, &th)) != 0) |
|
|
/* |
/* |
* Load file image. |
* Load file image. |
*/ |
*/ |
if ((err = ldr->load(header, new_task, fd, (void **)&entry)) != 0) |
if ((err = ldr->el_load(header, new_task, fd, (void **)&entry)) != 0) |
goto err5; |
goto err5; |
if ((err = thread_load(th, entry, sp)) != 0) |
if ((err = thread_load(th, entry, sp)) != 0) |
goto err5; |
goto err5; |
|
|
thread_resume(th); |
thread_resume(th); |
|
|
close(fd); |
close(fd); |
dprintf("exec complete successfully\n"); |
DPRINTF(("exec complete successfully\n")); |
return 0; |
return 0; |
err5: |
err5: |
vm_free(new_task, stack); |
vm_free(new_task, stack); |
|
|
err2: |
err2: |
close(fd); |
close(fd); |
err1: |
err1: |
dprintf("exec failed err=%d\n", err); |
DPRINTF(("exec failed err=%d\n", err)); |
return err; |
return err; |
} |
} |
|
|
|
|
{ |
{ |
struct exec_loader *ldr; |
struct exec_loader *ldr; |
|
|
for (ldr = loader_table; ldr->name; ldr++) { |
for (ldr = loader_table; ldr->el_name; ldr++) { |
dprintf("Initialize \'%s\' loader\n", ldr->name); |
DPRINTF(("Initialize \'%s\' loader\n", ldr->el_name)); |
ldr->init(); |
ldr->el_init(); |
} |
} |
} |
} |
|
|
|
|
} |
} |
#ifdef DEBUG_EXEC |
#ifdef DEBUG_EXEC |
if (err) |
if (err) |
dprintf("msg error=%d\n", err); |
DPRINTF(("msg error=%d\n", err)); |
#endif |
#endif |
/* |
/* |
* Reply to the client. |
* Reply to the client. |