77#include <lib/utils/logging.h>
88#include <lib/utils/output.h>
99
10- extern int call_main (int cs , int ds , int argc , char * argv []);
11-
12- int process_spawn (int lba_index , int sector_count ) {
10+ int process_spawn (int lba_index , int sector_count , char * argv []) {
1311 print_info ("[process_spawn] create" );
14- int pid = process_create ();
12+ int pid = process_create (argv );
1513 if (pid < 0 ) {
1614 print_log ("Failed to reserved a new pid" );
1715 return -1 ;
@@ -39,7 +37,8 @@ int syscall_1_process_exit(int user_ds, int status) {
3937}
4038
4139int syscall_1_process_spawn_lba_sc (int lba_start , int sector_count ) {
42- return process_spawn (lba_start , sector_count );
40+ char * fake_argv []= {"fake_spawn" , NULL };
41+ return process_spawn (lba_start , sector_count , fake_argv );
4342}
4443
4544int syscall_1_process_exec_lba_sc (int lba_start , int sector_count ) {
@@ -48,19 +47,23 @@ int syscall_1_process_exec_lba_sc(int lba_start, int sector_count) {
4847
4948int syscall_1_process_spawn_fname (int user_ds , char * _us_filename , char * _us_argv []) {
5049 char filename [FS_FFS_FILENAME_LIMIT ];
51- char argv_with_uspointer [PROCESS_MAX_ARGC ];
52- char * argv_with_kspointer [PROCESS_MAX_ARGC ];
53- char argv [PROCESS_MAX_ARGC ][ PROCESS_MAX_ARG_LEN ] ; // data store
50+ char argv_data [PROCESS_MAX_ARGC ][ PROCESS_MAX_ARG_LEN ];
51+ char * argv_with_uspointer [PROCESS_MAX_ARGC ];
52+ char * argv [PROCESS_MAX_ARGC ]; // kernel mode
5453 syscall_strncpy_user_to_kernel (user_ds , _us_filename , filename , sizeof (filename ));
5554 syscall_strncpy_user_to_kernel (user_ds , _us_argv , argv_with_uspointer , sizeof (argv_with_uspointer ));
56- // if src string is NULL, then dst should be null.
55+ // if src string is NULL, then dst string also should be null.
5756 for (int i = 0 ; i < PROCESS_MAX_ARGC ; i ++ ) {
5857 if (argv_with_uspointer [i ]== NULL ) {
59- argv_with_kspointer [i ]= NULL ;
58+ argv [i ]= NULL ;
6059 break ;
6160 }
62- syscall_strncpy_user_to_kernel (user_ds , argv [i ], argv_with_uspointer [i ], sizeof (argv [i ]));
63- argv_with_kspointer [i ] = argv [i ];
61+ syscall_strncpy_user_to_kernel (user_ds , argv_with_uspointer [i ], argv_data [i ], sizeof (argv_data [i ]));
62+ argv [i ] = argv_data [i ];
63+ }
64+
65+ for (int i = 0 ; argv [i ]; i ++ ) {
66+ printf ("[kernel] arg%d: %s\n" , i , argv [i ]);
6467 }
6568
6669 union FFSFileEntry entry ;
@@ -71,8 +74,7 @@ int syscall_1_process_spawn_fname(int user_ds, char *_us_filename, char *_us_arg
7174 int lba_start = resolve_abs_lba (FFS_UNIQUE_PARITION_ID , entry .content .start_block_id );
7275 int sector_count = (entry .content .filesize + FS_BLOCK_SIZE - 1 )/FS_BLOCK_SIZE ;
7376
74- // TODO: process created should have argv pushed on top of stack.
75- return syscall_1_process_spawn_lba_sc (lba_start , sector_count );
77+ return process_spawn (lba_start , sector_count , argv );
7678}
7779
7880int syscall_1_process (int operation , int a0 , int a1 , int a2 , int a3 , int user_ds ) {
0 commit comments