11#include <fuzzy/fs/ffs.h>
22#include <fuzzy/kernel/process/process.h>
33#include <fuzzy/kernel/interrupts/timer.h>
4+ #include <fuzzy/memmgr/stackguard/stackguard.h>
45
56#include <process.h>
67
78#include <lib/utils/logging.h>
89#include <lib/utils/output.h>
910
10- int process_spawn (int lba_index , int sector_count , char * argv []) {
11+ int process_spawn (int lba_index , int sector_count , int argc , char * argv []) {
1112 print_info ("[process_spawn] create" );
12- int pid = process_create (argv );
13+ int pid = process_create (argc , argv );
1314 if (pid < 0 ) {
1415 print_log ("Failed to reserved a new pid" );
1516 return -1 ;
1617 }
1718 print_info ("[process_spawn] loading, pid: %d" , pid );
19+
1820 int err = process_load_from_disk (pid , lba_index , sector_count );
1921 if (err ) {
2022 print_log ("Failed to load app in memory, Error: " , err );
@@ -23,6 +25,7 @@ int process_spawn(int lba_index, int sector_count, char *argv[]) {
2325 print_info ("[process_spawn] ready, pid: %d" , pid );
2426 struct Process * process = get_process (pid );
2527 process -> state = STATE_READY ;
28+ VERIFY_STACKGUARD ();
2629 return 0 ;
2730}
2831
@@ -37,33 +40,30 @@ int syscall_1_process_exit(int user_ds, int status) {
3740}
3841
3942int syscall_1_process_spawn_lba_sc (int lba_start , int sector_count ) {
40- char * fake_argv []= {"fake_spawn" , NULL };
41- return process_spawn (lba_start , sector_count , fake_argv );
43+ int fake_argc = 1 ;
44+ ARGV fake_argv = {"fake_spawn" , NULL };
45+ return process_spawn (lba_start , sector_count , fake_argc , fake_argv );
4246}
4347
4448int syscall_1_process_exec_lba_sc (int lba_start , int sector_count ) {
4549 return process_exec (lba_start , sector_count );
4650}
4751
4852int syscall_1_process_spawn_fname (int user_ds , char * _us_filename , char * _us_argv []) {
49- char filename [FS_FFS_FILENAME_LIMIT ];
50- char argv_data [PROCESS_MAX_ARGC ][PROCESS_MAX_ARG_LEN ];
53+ // User must send all PROCESS_MAX_ARGC arguments.
5154 char * argv_with_uspointer [PROCESS_MAX_ARGC ];
52- char * argv [PROCESS_MAX_ARGC ]; // kernel mode
55+ char filename [FS_FFS_FILENAME_LIMIT ];
56+ int argc = 0 ; // kernel mode
57+ ARGV argv = {0 }; // kernel mode
5358 syscall_strncpy_user_to_kernel (user_ds , _us_filename , filename , sizeof (filename ));
5459 syscall_strncpy_user_to_kernel (user_ds , _us_argv , argv_with_uspointer , sizeof (argv_with_uspointer ));
5560 // if src string is NULL, then dst string also should be null.
56- for (int i = 0 ; i < PROCESS_MAX_ARGC ; i ++ ) {
61+ for (int i = 0 ; i < PROCESS_MAX_ARGC - 1 ; i ++ ) {
5762 if (argv_with_uspointer [i ]== NULL ) {
58- argv [i ]= NULL ;
5963 break ;
6064 }
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 ]);
65+ syscall_strncpy_user_to_kernel (user_ds , argv_with_uspointer [i ], argv [i ], sizeof (argv [i ]));
66+ argc ++ ;
6767 }
6868
6969 union FFSFileEntry entry ;
@@ -74,7 +74,7 @@ int syscall_1_process_spawn_fname(int user_ds, char *_us_filename, char *_us_arg
7474 int lba_start = resolve_abs_lba (FFS_UNIQUE_PARITION_ID , entry .content .start_block_id );
7575 int sector_count = (entry .content .filesize + FS_BLOCK_SIZE - 1 )/FS_BLOCK_SIZE ;
7676
77- return process_spawn (lba_start , sector_count , argv );
77+ return process_spawn (lba_start , sector_count , argc , argv );
7878}
7979
8080int syscall_1_process (int operation , int a0 , int a1 , int a2 , int a3 , int user_ds ) {
0 commit comments