88#include <lib/utils/logging.h>
99#include <lib/utils/output.h>
1010
11- int process_spawn (int lba_index , int sector_count , int argc , char * argv []) {
11+ int process_spawn (int lba_index , int sector_count ,
12+ unsigned int ppid , int argc , char * argv []) {
1213 print_info ("[process_spawn] create" );
13- int pid = process_create (argc , argv );
14+ int pid = process_create (ppid , argc , argv );
1415 if (pid < 0 ) {
1516 print_log ("Failed to reserved a new pid" );
1617 return -1 ;
@@ -26,30 +27,25 @@ int process_spawn(int lba_index, int sector_count, int argc, char *argv[]) {
2627 struct Process * process = get_process (pid );
2728 process -> state = STATE_READY ;
2829 VERIFY_STACKGUARD ();
29- return 0 ;
30+ return pid ;
3031}
3132
3233int process_exec (int lba_index , int sector_count ) {
3334 // Not yet implemented
3435 return -1 ;
3536}
3637
37- int syscall_1_process_exit (int user_ds , int status ) {
38- process_kill (user_ds , status );
38+ int syscall_1_process_exit (int pid , int status ) {
39+ process_kill (pid , status );
3940 return 0 ;
4041}
4142
42- int syscall_1_process_spawn_lba_sc (int lba_start , int sector_count ) {
43- int fake_argc = 1 ;
44- ARGV fake_argv = {"fake_spawn" , NULL };
45- return process_spawn (lba_start , sector_count , fake_argc , fake_argv );
46- }
47-
48- int syscall_1_process_exec_lba_sc (int lba_start , int sector_count ) {
49- return process_exec (lba_start , sector_count );
43+ int syscall_1_process_wait (int pid , int blocked_on_pid ) {
44+ return process_waitpid (pid , blocked_on_pid );
5045}
5146
52- int syscall_1_process_spawn_fname (int user_ds , char * _us_filename , char * _us_argv []) {
47+ int syscall_1_process_spawn_fname (unsigned int user_pid ,
48+ int user_ds , char * _us_filename , char * _us_argv []) {
5349 // User must send all PROCESS_MAX_ARGC arguments.
5450 char * argv_with_uspointer [PROCESS_MAX_ARGC ];
5551 char filename [FS_FFS_FILENAME_LIMIT ];
@@ -74,20 +70,19 @@ int syscall_1_process_spawn_fname(int user_ds, char *_us_filename, char *_us_arg
7470 int lba_start = resolve_abs_lba (FFS_UNIQUE_PARITION_ID , entry .content .start_block_id );
7571 int sector_count = (entry .content .filesize + FS_BLOCK_SIZE - 1 )/FS_BLOCK_SIZE ;
7672
77- return process_spawn (lba_start , sector_count , argc , argv );
73+ return process_spawn (lba_start , sector_count , user_pid , argc , argv );
7874}
7975
8076int syscall_1_process (int operation , int a0 , int a1 , int a2 , int a3 , int user_ds ) {
77+ int user_pid = get_idt_reverse_pid_lookup_ds (user_ds );
8178 switch (operation ) {
8279 case SYSCALL_PROCESS_SUB_EXIT :
83- syscall_1_process_exit (user_ds , a0 );
80+ syscall_1_process_exit (user_pid , a0 );
8481 return 0 ;
85- case SYSCALL_PROCESS_SUB_SPAWN_LBA_SC :
86- return syscall_1_process_spawn_lba_sc (a0 , a1 );
87- case SYSCALL_PROCESS_SUB_EXEC_LBA_SC :
88- return syscall_1_process_exec_lba_sc (a0 , a1 );
82+ case SYSCALL_PROCESS_SUB_WAIT :
83+ return syscall_1_process_wait (user_pid , a0 );
8984 case SYSCALL_PROCESS_SUB_SPAWN_FNAME :
90- return syscall_1_process_spawn_fname (user_ds , (char * )a0 , (char * * )a1 );
85+ return syscall_1_process_spawn_fname (user_pid , user_ds , (char * )a0 , (char * * )a1 );
9186 }
9287 return -1 ;
9388}
0 commit comments