Changeset 5be1923 in mainline


Ignore:
Timestamp:
2006-03-14T12:11:28Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d3e7ff4
Parents:
4bb4836d
Message:

Added simpler userspace starting.

Location:
generic
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • generic/include/mm/as.h

    r4bb4836d r5be1923  
    108108extern int as_page_fault(__address page);
    109109extern void as_switch(as_t *old, as_t *new);
     110extern void as_free(as_t *as);
    110111
    111112/* Interface to be implemented by architectures. */
  • generic/include/proc/task.h

    r4bb4836d r5be1923  
    5050extern void task_init(void);
    5151extern task_t *task_create(as_t *as);
     52extern task_t *task_run_program(void * program_addr);
    5253
    5354#endif
  • generic/src/lib/elf.c

    r4bb4836d r5be1923  
    186186                return EE_UNSUPPORTED;
    187187
    188         /*
    189          * Copying the segment out is certainly necessary for segments with p_filesz < p_memsz
    190          * because of the effect of .bss-like sections. For security reasons, it looks like a
    191          * good idea to copy the segment anyway.
    192          */
    193188        segment_size = ALIGN_UP(max(entry->p_filesz, entry->p_memsz), PAGE_SIZE);
    194         segment = malloc(segment_size, 0);
    195         if (entry->p_filesz < entry->p_memsz)
     189        if ((entry->p_flags & PF_W)) {
     190                /* If writable, copy data (should be COW in the future) */
     191                segment = malloc(segment_size, 0);
    196192                memsetb((__address) (segment + entry->p_filesz), segment_size - entry->p_filesz, 0);
    197         memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
     193                memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
     194        } else /* Map identically original data */
     195                segment = ((void *) elf) + entry->p_offset;
    198196
    199197        a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
  • generic/src/main/kinit.c

    r4bb4836d r5be1923  
    2828
    2929#include <main/kinit.h>
    30 #include <main/uinit.h>
    3130#include <config.h>
    3231#include <arch.h>
     
    4746#include <interrupt.h>
    4847#include <console/kconsole.h>
    49 #include <elf.h>
    5048#include <ipc/ns.h>
    5149
     
    7270{
    7371        thread_t *t;
    74         as_t *as;
    75         as_area_t *a;
    76         int rc;
    77         task_t *u;
    7872
    7973        interrupts_disable();
     
    150144                if (config.init_addr % FRAME_SIZE)
    151145                        panic("config.init_addr is not frame aligned");
    152                
    153                 as = as_create(0);
    154                 if (!as)
    155                         panic("as_create\n");
    156146
    157                 rc = elf_load((elf_header_t *) config.init_addr, as);
    158                 if (rc != EE_OK) {
    159                         printf("elf_load failed: %s\n", elf_error(rc));
    160                 } else {
    161                         u = task_create(as);
    162                         if (!u)
    163                                 panic("task_create\n");
    164                         t = thread_create(uinit, (void *)((elf_header_t *) config.init_addr)->e_entry, u, THREAD_USER_STACK);
    165                         if (!t)
    166                                 panic("thread_create\n");
    167                
    168                         /*
    169                          * Create the data as_area.
    170                          */
    171                         a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS);
    172                         if (!a)
    173                                 panic("as_area_create: stack\n");
    174 
    175                         thread_ready(t);
     147                if (!task_run_program((void *)config.init_addr)) {
     148                        printf("Userspace not started.\n");
    176149                }
    177150        }
  • generic/src/mm/as.c

    r4bb4836d r5be1923  
    104104}
    105105
     106/** Free Adress space */
     107void as_free(as_t *as)
     108{
     109        ASSERT(as->refcount == 0);
     110
     111        /* TODO: free as_areas and other resources held by as */
     112        /* TODO: free page table */
     113        free(as);
     114}
     115
    106116/** Create address space area of common attributes.
    107117 *
  • generic/src/proc/task.c

    r4bb4836d r5be1923  
    2727 */
    2828
     29#include <main/uinit.h>
    2930#include <proc/thread.h>
    3031#include <proc/task.h>
     
    3940#include <ipc/ns.h>
    4041#include <memstr.h>
     42
     43#include <elf.h>
    4144
    4245SPINLOCK_INITIALIZE(tasks_lock);
     
    6063 * @param as Task's address space.
    6164 *
    62  * @return New task's structure on success, NULL on failure.
     65 * @return New task's structure
    6366 *
    6467 */
     
    8992}
    9093
     94/** Create new task with 1 thread and run it
     95 *
     96 * @return Task of the running program or NULL on error
     97 */
     98task_t * task_run_program(void *program_addr)
     99{
     100        as_t *as;
     101        as_area_t *a;
     102        int rc;
     103        thread_t *t;
     104        task_t *task;
     105
     106        as = as_create(0);
     107
     108        rc = elf_load((elf_header_t *) config.init_addr, as);
     109        if (rc != EE_OK) {
     110                as_free(as);
     111                return NULL;
     112        }
     113       
     114        task = task_create(as);
     115        t = thread_create(uinit, (void *)((elf_header_t *) config.init_addr)->e_entry,
     116                          task, THREAD_USER_STACK);
     117       
     118        /*
     119         * Create the data as_area.
     120         */
     121        a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS);
     122       
     123        thread_ready(t);
     124
     125        return task;
     126}
Note: See TracChangeset for help on using the changeset viewer.