00001 #include <types.h>
00002 #include <kern/errno.h>
00003 #include <kern/unistd.h>
00004 #include <kern/wait.h>
00005 #include <lib.h>
00006 #include <syscall.h>
00007 #include <current.h>
00008 #include <proc.h>
00009 #include <thread.h>
00010 #include <addrspace.h>
00011 #include <copyinout.h>
00012
00013
00014
00015
00016 void sys__exit(int exitcode) {
00017
00018 struct addrspace *as;
00019 struct proc *p = curproc;
00020
00021
00022 (void)exitcode;
00023
00024 DEBUG(DB_SYSCALL,"Syscall: _exit(%d)\n",exitcode);
00025
00026 KASSERT(curproc->p_addrspace != NULL);
00027 as_deactivate();
00028
00029
00030
00031
00032
00033
00034
00035 as = curproc_setas(NULL);
00036 as_destroy(as);
00037
00038
00039
00040 proc_remthread(curthread);
00041
00042
00043
00044 proc_destroy(p);
00045
00046 thread_exit();
00047
00048 panic("return from thread_exit in sys_exit\n");
00049 }
00050
00051
00052
00053 int
00054 sys_getpid(pid_t *retval)
00055 {
00056
00057
00058 *retval = 1;
00059 return(0);
00060 }
00061
00062
00063
00064 int
00065 sys_waitpid(pid_t pid,
00066 userptr_t status,
00067 int options,
00068 pid_t *retval)
00069 {
00070 int exitstatus;
00071 int result;
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 if (options != 0) {
00083 return(EINVAL);
00084 }
00085
00086 exitstatus = 0;
00087 result = copyout((void *)&exitstatus,status,sizeof(int));
00088 if (result) {
00089 return(result);
00090 }
00091 *retval = pid;
00092 return(0);
00093 }
00094