Subversion Repositories HelenOS

Rev

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

Rev 3773 Rev 4338
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
void program_run(void *entry, pcb_t *pcb);
64
void program_run(void *entry, pcb_t *pcb);
63
 
65
 
64
/** Pathname of the file that will be loaded */
66
/** Pathname of the file that will be loaded */
65
static char *pathname = NULL;
67
static char *pathname = NULL;
66
 
68
 
Line 225... Line 227...
225
{
227
{
226
    int rc;
228
    int rc;
227
 
229
 
228
    rc = elf_load_file(pathname, 0, 0, &prog_info);
230
    rc = elf_load_file(pathname, 0, 0, &prog_info);
229
    if (rc < 0) {
231
    if (rc < 0) {
230
        printf("Failed to load executable '%s'.\n", pathname);
232
        DPRINTF("Failed to load executable '%s'.\n", pathname);
231
        ipc_answer_0(rid, EINVAL);
233
        ipc_answer_0(rid, EINVAL);
232
        return 1;
234
        return 1;
233
    }
235
    }
234
 
236
 
235
    elf_create_pcb(&prog_info, &pcb);
237
    elf_create_pcb(&prog_info, &pcb);
Line 245... Line 247...
245
    }
247
    }
246
 
248
 
247
    printf("Load ELF interpreter '%s'\n", prog_info.interp);
249
    printf("Load ELF interpreter '%s'\n", prog_info.interp);
248
    rc = elf_load_file(prog_info.interp, 0, 0, &interp_info);
250
    rc = elf_load_file(prog_info.interp, 0, 0, &interp_info);
249
    if (rc < 0) {
251
    if (rc < 0) {
250
        printf("Failed to load interpreter '%s.'\n", prog_info.interp);
252
        DPRINTF("Failed to load interpreter '%s.'\n",
-
 
253
            prog_info.interp);
251
        ipc_answer_0(rid, EINVAL);
254
        ipc_answer_0(rid, EINVAL);
252
        return 1;
255
        return 1;
253
    }
256
    }
254
 
257
 
255
    printf("Run interpreter.\n");
258
    printf("Run interpreter.\n");
Line 272... Line 275...
272
 */
275
 */
273
static void loader_run(ipc_callid_t rid, ipc_call_t *request)
276
static void loader_run(ipc_callid_t rid, ipc_call_t *request)
274
{
277
{
275
    if (is_dyn_linked == true) {
278
    if (is_dyn_linked == true) {
276
        /* Dynamically linked program */
279
        /* Dynamically linked program */
277
        printf("run dynamic linker\n");
280
        DPRINTF("Run ELF interpreter.\n");
278
        printf("entry point: 0x%lx\n", interp_info.entry);
281
        DPRINTF("Entry point: 0x%lx\n", interp_info.entry);
279
        close_console();
282
        close_console();
280
 
283
 
281
        ipc_answer_0(rid, EOK);
284
        ipc_answer_0(rid, EOK);
282
        program_run(interp_info.entry, &pcb);
285
        program_run(interp_info.entry, &pcb);
283
 
286
 
Line 330... Line 333...
330
            retval = ENOENT;
333
            retval = ENOENT;
331
            break;
334
            break;
332
        }
335
        }
333
        if ((callid & IPC_CALLID_NOTIFICATION) == 0 &&
336
        if ((callid & IPC_CALLID_NOTIFICATION) == 0 &&
334
            IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP) {
337
            IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP) {
335
            printf("responding EINVAL to method %d\n",
338
            DPRINTF("Responding EINVAL to method %d.\n",
336
                IPC_GET_METHOD(call));
339
                IPC_GET_METHOD(call));
337
            ipc_answer_0(callid, EINVAL);
340
            ipc_answer_0(callid, EINVAL);
338
        }
341
        }
339
    }
342
    }
340
}
343
}