Rev 3676 | Rev 3896 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3676 | Rev 3787 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | #include <as.h> |
57 | #include <as.h> |
58 | 58 | ||
59 | #include <elf.h> |
59 | #include <elf.h> |
60 | #include <elf_load.h> |
60 | #include <elf_load.h> |
61 | 61 | ||
- | 62 | #define DPRINTF(...) |
|
- | 63 | ||
62 | /** Pathname of the file that will be loaded */ |
64 | /** Pathname of the file that will be loaded */ |
63 | static char *pathname = NULL; |
65 | static char *pathname = NULL; |
64 | 66 | ||
65 | /** The Program control block */ |
67 | /** The Program control block */ |
66 | static pcb_t pcb; |
68 | static pcb_t pcb; |
Line 223... | Line 225... | ||
223 | { |
225 | { |
224 | int rc; |
226 | int rc; |
225 | 227 | ||
226 | rc = elf_load_file(pathname, 0, &prog_info); |
228 | rc = elf_load_file(pathname, 0, &prog_info); |
227 | if (rc < 0) { |
229 | if (rc < 0) { |
228 | printf("Failed to load executable '%s'.\n", pathname); |
230 | DPRINTF("Failed to load executable '%s'.\n", pathname); |
229 | ipc_answer_0(rid, EINVAL); |
231 | ipc_answer_0(rid, EINVAL); |
230 | return 1; |
232 | return 1; |
231 | } |
233 | } |
232 | 234 | ||
233 | elf_create_pcb(&prog_info, &pcb); |
235 | elf_create_pcb(&prog_info, &pcb); |
Line 242... | Line 244... | ||
242 | return 0; |
244 | return 0; |
243 | } |
245 | } |
244 | 246 | ||
245 | rc = elf_load_file(prog_info.interp, 0, &interp_info); |
247 | rc = elf_load_file(prog_info.interp, 0, &interp_info); |
246 | if (rc < 0) { |
248 | if (rc < 0) { |
247 | printf("Failed to load interpreter '%s.'\n", prog_info.interp); |
249 | DPRINTF("Failed to load interpreter '%s.'\n", |
- | 250 | prog_info.interp); |
|
248 | ipc_answer_0(rid, EINVAL); |
251 | ipc_answer_0(rid, EINVAL); |
249 | return 1; |
252 | return 1; |
250 | } |
253 | } |
251 | 254 | ||
252 | is_dyn_linked = true; |
255 | is_dyn_linked = true; |
Line 264... | Line 267... | ||
264 | */ |
267 | */ |
265 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
268 | static void loader_run(ipc_callid_t rid, ipc_call_t *request) |
266 | { |
269 | { |
267 | if (is_dyn_linked == true) { |
270 | if (is_dyn_linked == true) { |
268 | /* Dynamically linked program */ |
271 | /* Dynamically linked program */ |
269 | printf("run dynamic linker\n"); |
272 | DPRINTF("Run ELF interpreter.\n"); |
270 | printf("entry point: 0x%lx\n", interp_info.entry); |
273 | DPRINTF("Entry point: 0x%lx\n", interp_info.entry); |
271 | close_console(); |
274 | close_console(); |
272 | 275 | ||
273 | ipc_answer_0(rid, EOK); |
276 | ipc_answer_0(rid, EOK); |
274 | elf_run(&interp_info, &pcb); |
277 | elf_run(&interp_info, &pcb); |
275 | 278 | ||
Line 322... | Line 325... | ||
322 | retval = ENOENT; |
325 | retval = ENOENT; |
323 | break; |
326 | break; |
324 | } |
327 | } |
325 | if ((callid & IPC_CALLID_NOTIFICATION) == 0 && |
328 | if ((callid & IPC_CALLID_NOTIFICATION) == 0 && |
326 | IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP) { |
329 | IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP) { |
327 | printf("responding EINVAL to method %d\n", |
330 | DPRINTF("Responding EINVAL to method %d.\n", |
328 | IPC_GET_METHOD(call)); |
331 | IPC_GET_METHOD(call)); |
329 | ipc_answer_0(callid, EINVAL); |
332 | ipc_answer_0(callid, EINVAL); |
330 | } |
333 | } |
331 | } |
334 | } |
332 | } |
335 | } |