123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #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>
- int
- runprogram(char *progname)
- {
- struct addrspace *as;
- struct vnode *v;
- vaddr_t entrypoint, stackptr;
- int result;
-
- result = vfs_open(progname, O_RDONLY, 0, &v);
- if (result) {
- return result;
- }
-
- KASSERT(curproc_getas() == NULL);
-
- as = as_create();
- if (as ==NULL) {
- vfs_close(v);
- return ENOMEM;
- }
-
- curproc_setas(as);
- as_activate();
-
- result = load_elf(v, &entrypoint);
- if (result) {
-
- vfs_close(v);
- return result;
- }
-
- vfs_close(v);
-
- result = as_define_stack(as, &stackptr);
- if (result) {
-
- return result;
- }
-
- enter_new_process(0 , NULL ,
- stackptr, entrypoint);
-
-
- panic("enter_new_process returned\n");
- return EINVAL;
- }
|