| #pragma once | 
 |  | 
 | #include <ros/bits/syscall.h> | 
 | #include <ros/arch/syscall.h> | 
 | #include <ros/event.h> | 
 | #include <ros/atomic.h> | 
 |  | 
 | /* Flags for an individual syscall. */ | 
 | #define SC_DONE					0x0001		/* SC is done */ | 
 | #define SC_PROGRESS				0x0002		/* SC made progress */ | 
 | #define SC_UEVENT				0x0004		/* user has an ev_q */ | 
 | #define SC_K_LOCK				0x0008		/* kernel locked sysc */ | 
 | #define SC_ABORT				0x0010		/* syscall abort attempted */ | 
 |  | 
 | #define MAX_ERRSTR_LEN			128 | 
 | #define SYSTR_BUF_SZ			PGSIZE | 
 |  | 
 | struct syscall { | 
 | 	unsigned int				num; | 
 | 	int							err;			/* errno */ | 
 | 	long						retval; | 
 | 	atomic_t					flags; | 
 | 	struct event_queue			*ev_q; | 
 | 	void						*u_data; | 
 | 	long						arg0; | 
 | 	long						arg1; | 
 | 	long						arg2; | 
 | 	long						arg3; | 
 | 	long						arg4; | 
 | 	long						arg5; | 
 | 	char						errstr[MAX_ERRSTR_LEN]; | 
 | }; | 
 |  | 
 | struct childfdmap { | 
 | 	unsigned int				parentfd; | 
 | 	unsigned int				childfd; | 
 | 	int							ok; | 
 | }; | 
 |  | 
 | struct argenv { | 
 | 	size_t argc; | 
 | 	size_t envc; | 
 | 	char buf[]; | 
 | 	/* The buf array is laid out as follows: | 
 | 	 * buf { | 
 | 	 *   char *argv[argc]; // Offset of arg relative to &argbuf[0] | 
 | 	 *   char *envp[envc]; // Offset of envvar relative to &argbuf[0] | 
 | 	 *   char argbuf[sum(map(strlen + 1, argv + envp))]; | 
 | 	 * } | 
 | 	 */ | 
 | }; | 
 |  | 
 | #ifndef ROS_KERNEL | 
 |  | 
 | /* Temp hack, til the rest of glibc/userspace uses sys/syscall.h */ | 
 | #include <sys/syscall.h> | 
 | #endif /* ifndef ROS_KERNEL */ |