Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/program.c

    rf8fb03b r3fcea34  
    4949#include <lib/elf_load.h>
    5050#include <str.h>
     51#include <str_error.h>
    5152#include <log.h>
    5253#include <syscall/copy.h>
    5354#include <proc/program.h>
     55#include <userspace.h>
    5456
    5557/**
     
    7173errno_t program_create(as_t *as, uspace_addr_t entry_addr, char *name, program_t *prg)
    7274{
    73         uspace_arg_t *kernel_uarg = (uspace_arg_t *)
    74             malloc(sizeof(uspace_arg_t));
     75        uinit_arg_t *kernel_uarg = malloc(sizeof(uinit_arg_t));
    7576        if (!kernel_uarg)
    7677                return ENOMEM;
     
    9899        if (!area) {
    99100                free(kernel_uarg);
    100                 task_destroy(prg->task);
     101                task_release(prg->task);
    101102                prg->task = NULL;
    102103                return ENOMEM;
    103104        }
    104105
    105         kernel_uarg->uspace_entry = entry_addr;
    106         kernel_uarg->uspace_stack = virt;
    107         kernel_uarg->uspace_stack_size = STACK_SIZE_USER;
    108         kernel_uarg->uspace_thread_function = USPACE_NULL;
    109         kernel_uarg->uspace_thread_arg = USPACE_NULL;
    110         kernel_uarg->uspace_uarg = USPACE_NULL;
     106        kernel_uarg->pc = entry_addr;
     107        kernel_uarg->sp = arch_get_initial_sp(virt, STACK_SIZE_USER);
    111108
    112109        /*
     
    118115                free(kernel_uarg);
    119116                as_area_destroy(as, virt);
    120                 task_destroy(prg->task);
     117                task_release(prg->task);
    121118                prg->task = NULL;
    122119                return ELIMIT;
     
    142139 *
    143140 */
    144 errno_t program_create_from_image(void *image_addr, char *name, program_t *prg)
     141errno_t program_create_from_image(void *image_addr, size_t image_size, char *name, program_t *prg)
    145142{
    146143        as_t *as = as_create(0);
     
    156153        }
    157154
    158         return program_create(as, ((elf_header_t *) image_addr)->e_entry,
     155        errno_t rc = program_create(as, ((elf_header_t *) image_addr)->e_entry,
    159156            name, prg);
     157
     158        if (rc == EOK) {
     159                prg->task->debug_sections = calloc(1, sizeof(debug_sections_t));
     160                if (prg->task->debug_sections != NULL)
     161                        *prg->task->debug_sections = get_debug_sections(image_addr, image_size);
     162        }
     163
     164        return rc;
    160165}
    161166
     
    203208void program_ready(program_t *prg)
    204209{
    205         thread_ready(prg->main_thread);
     210        thread_start(prg->main_thread);
     211        thread_detach(prg->main_thread);
     212        prg->main_thread = NULL;
    206213}
    207214
     
    241248        program_ready(&prg);
    242249
     250        task_release(prg.task);
     251
    243252        return EOK;
    244253}
Note: See TracChangeset for help on using the changeset viewer.