@@ -44,6 +44,8 @@ uint64 sys_write(int fd, uint64 va, uint64 len)
4444 switch (f -> type ) {
4545 case FD_STDIO :
4646 return console_write (va , len );
47+ case FD_PIPE :
48+ return pipewrite (f -> pipe , va , len );
4749 case FD_INODE :
4850 return inodewrite (f , va , len );
4951 default :
@@ -64,6 +66,8 @@ uint64 sys_read(int fd, uint64 va, uint64 len)
6466 switch (f -> type ) {
6567 case FD_STDIO :
6668 return console_read (va , len );
69+ case FD_PIPE :
70+ return piperead (f -> pipe , va , len );
6771 case FD_INODE :
6872 return inoderead (f , va , len );
6973 default :
@@ -154,6 +158,38 @@ uint64 sys_set_priority(long long prio)
154158 return -1 ;
155159}
156160
161+ uint64 sys_pipe (uint64 fdarray )
162+ {
163+ struct proc * p = curr_proc ();
164+ uint64 fd0 , fd1 ;
165+ struct file * f0 , * f1 ;
166+ if (f0 < 0 || f1 < 0 ) {
167+ return -1 ;
168+ }
169+ f0 = filealloc ();
170+ f1 = filealloc ();
171+ if (pipealloc (f0 , f1 ) < 0 )
172+ goto err0 ;
173+ fd0 = fdalloc (f0 );
174+ fd1 = fdalloc (f1 );
175+ if (fd0 < 0 || fd1 < 0 )
176+ goto err0 ;
177+ if (copyout (p -> pagetable , fdarray , (char * )& fd0 , sizeof (fd0 )) < 0 ||
178+ copyout (p -> pagetable , fdarray + sizeof (uint64 ), (char * )& fd1 ,
179+ sizeof (fd1 )) < 0 ) {
180+ goto err1 ;
181+ }
182+ return 0 ;
183+
184+ err1 :
185+ p -> files [fd0 ] = 0 ;
186+ p -> files [fd1 ] = 0 ;
187+ err0 :
188+ fileclose (f0 );
189+ fileclose (f1 );
190+ return -1 ;
191+ }
192+
157193uint64 sys_openat (uint64 va , uint64 omode , uint64 _flags )
158194{
159195 struct proc * p = curr_proc ();
@@ -177,6 +213,16 @@ uint64 sys_close(int fd)
177213 return 0 ;
178214}
179215
216+ uint64 sys_sbrk (int n )
217+ {
218+ uint64 addr ;
219+ struct proc * p = curr_proc ();
220+ addr = p -> program_brk ;
221+ if (growproc (n ) < 0 )
222+ return -1 ;
223+ return addr ;
224+ }
225+
180226int sys_fstat (int fd , uint64 stat )
181227{
182228 //TODO: your job is to complete the syscall
@@ -196,16 +242,6 @@ int sys_unlinkat(int dirfd, uint64 name, uint64 flags)
196242 return -1 ;
197243}
198244
199- uint64 sys_sbrk (int n )
200- {
201- uint64 addr ;
202- struct proc * p = curr_proc ();
203- addr = p -> program_brk ;
204- if (growproc (n ) < 0 )
205- return -1 ;
206- return addr ;
207- }
208-
209245extern char trap_page [];
210246
211247void syscall ()
@@ -253,6 +289,9 @@ void syscall()
253289 case SYS_wait4 :
254290 ret = sys_wait (args [0 ], args [1 ]);
255291 break ;
292+ case SYS_pipe2 :
293+ ret = sys_pipe (args [0 ]);
294+ break ;
256295 case SYS_fstat :
257296 ret = sys_fstat (args [0 ], args [1 ]);
258297 break ;
@@ -261,7 +300,6 @@ void syscall()
261300 break ;
262301 case SYS_unlinkat :
263302 ret = sys_unlinkat (args [0 ], args [1 ], args [2 ]);
264- break ;
265303 case SYS_spawn :
266304 ret = sys_spawn (args [0 ]);
267305 break ;
0 commit comments