123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
- * The President and Fellows of Harvard College.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
- /*
- * Sample/test code for running a user program. You can use this for
- * reference when implementing the execv() system call. Remember though
- * that execv() needs to do more than this function does.
- */
- #include <types.h>
- #include <kern/errno.h>
- #include <kern/fcntl.h>
- #include <lib.h>
- #include <proc.h>
- #include <current.h>
- #include <addrspace.h>
- #include <vm.h>
- #include <vfs.h>
- #include <syscall.h>
- #include <test.h>
- /*
- * Load program "progname" and start running it in usermode.
- * Does not return except on error.
- *
- * Calls vfs_open on progname and thus may destroy it.
- */
- int runprogram(char * progname, int argc, char ** argv)
- {
- struct addrspace *as;
- struct vnode *v;
- vaddr_t entrypoint, stackptr;
- int result;
- /* Open the file. */
- result = vfs_open(progname, O_RDONLY, 0, &v);
- if (result) return result;
- /* We should be a new process. */
- KASSERT(curproc_getas() == NULL);
- /* Create a new address space. */
- as = as_create();
- if (!(as))
- {
- vfs_close(v);
- return ENOMEM;
- }
- /* Switch to it and activate it. */
- curproc_setas(as);
- as_activate();
- /* Load the executable. */
- result = load_elf(v, &entrypoint);
- if (result)
- {
- /* p_addrspace will go away when curproc is destroyed */
- vfs_close(v);
- return result;
- }
- /* Done with the file now. */
- vfs_close(v);
- /* Define the user stack in the address space */
- result = as_define_stack(as, &stackptr);
- if (result) return result;
- // copy args into a new argv
- userptr_t userv;
- copyArgs(argc, argv, &userv, &stackptr);
- /* Warp to user mode. */
- enter_new_process(argc, userv, stackptr, entrypoint);
-
- /* enter_new_process does not return. */
- panic("enter_new_process returned\n");
- return EINVAL;
- }
|