@@ -25,7 +25,7 @@ int process_close_file_handles(struct process *process);
2525
2626void * process_virtual_address_to_physical (struct process * process , void * virt_addr )
2727{
28- return paging_get_physical_address (process -> task -> paging_desc , virt_addr );
28+ return paging_get_physical_address (process -> paging_desc , virt_addr );
2929}
3030
3131static void process_init (struct process * process )
@@ -88,7 +88,7 @@ int process_find_free_allocation_index(struct process *process)
8888
8989int process_allocation_set_map (struct process * process , int allocation_entry_index , void * ptr , size_t size )
9090{
91- int res = paging_map_to (process -> task -> paging_desc , ptr , ptr , paging_align_address (ptr + size ), PAGING_IS_WRITEABLE | PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL );
91+ int res = paging_map_to (process -> paging_desc , ptr , ptr , paging_align_address (ptr + size ), PAGING_IS_WRITEABLE | PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL );
9292 if (res < 0 )
9393 {
9494 goto out ;
@@ -402,7 +402,7 @@ void process_free(struct process *process, void *ptr)
402402 return ;
403403 }
404404
405- res = paging_map_to (process -> task -> paging_desc , allocation .ptr , allocation .ptr , paging_align_address (allocation .ptr + allocation .size ), 0x00 );
405+ res = paging_map_to (process -> paging_desc , allocation .ptr , allocation .ptr , paging_align_address (allocation .ptr + allocation .size ), 0x00 );
406406 if (res < 0 )
407407 {
408408 return ;
@@ -492,7 +492,7 @@ static int process_load_data(const char *filename, struct process *process)
492492int process_map_binary (struct process * process )
493493{
494494 int res = 0 ;
495- paging_map_to (process -> task -> paging_desc , (void * )PEACHOS_PROGRAM_VIRTUAL_ADDRESS , process -> ptr , paging_align_address (process -> ptr + process -> size ), PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL | PAGING_IS_WRITEABLE );
495+ paging_map_to (process -> paging_desc , (void * )PEACHOS_PROGRAM_VIRTUAL_ADDRESS , process -> ptr , paging_align_address (process -> ptr + process -> size ), PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL | PAGING_IS_WRITEABLE );
496496 return res ;
497497}
498498
@@ -512,7 +512,7 @@ static int process_map_elf(struct process *process)
512512 {
513513 flags |= PAGING_IS_WRITEABLE ;
514514 }
515- res = paging_map_to (process -> task -> paging_desc , paging_align_to_lower_page ((void * )(uintptr_t )phdr -> p_vaddr ), paging_align_to_lower_page (phdr_phys_address ), paging_align_address (phdr_phys_address + phdr -> p_memsz ), flags );
515+ res = paging_map_to (process -> paging_desc , paging_align_to_lower_page ((void * )(uintptr_t )phdr -> p_vaddr ), paging_align_to_lower_page (phdr_phys_address ), paging_align_address (phdr_phys_address + phdr -> p_memsz ), flags );
516516 if (ISERR (res ))
517517 {
518518 break ;
@@ -524,6 +524,10 @@ int process_map_memory(struct process *process)
524524{
525525 int res = 0 ;
526526
527+ // Map all the e820 memory regions
528+ // so the whole address space is mapped
529+ paging_map_e820_memory_regions (process -> paging_desc );
530+
527531 switch (process -> filetype )
528532 {
529533 case PROCESS_FILETYPE_ELF :
@@ -544,7 +548,7 @@ int process_map_memory(struct process *process)
544548 }
545549
546550 // Finally map the stack
547- paging_map_to (process -> task -> paging_desc , (void * )PEACHOS_PROGRAM_VIRTUAL_STACK_ADDRESS_END , process -> stack , paging_align_address (process -> stack + PEACHOS_USER_PROGRAM_STACK_SIZE ), PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL | PAGING_IS_WRITEABLE );
551+ paging_map_to (process -> paging_desc , (void * )PEACHOS_PROGRAM_VIRTUAL_STACK_ADDRESS_END , process -> stack , paging_align_address (process -> stack + PEACHOS_USER_PROGRAM_STACK_SIZE ), PAGING_IS_PRESENT | PAGING_ACCESS_FROM_ALL | PAGING_IS_WRITEABLE );
548552out :
549553 return res ;
550554}
@@ -621,6 +625,19 @@ int process_load_for_slot(const char *filename, struct process **process, int pr
621625 strncpy (_process -> filename , filename , sizeof (_process -> filename ));
622626 _process -> id = process_slot ;
623627
628+ _process -> paging_desc = paging_desc_new (PAGING_MAP_LEVEL_4 );
629+ if (!_process -> paging_desc )
630+ {
631+ res = - EIO ;
632+ goto out ;
633+ }
634+
635+ res = process_map_memory (_process );
636+ if (res < 0 )
637+ {
638+ goto out ;
639+ }
640+
624641 // Create a task
625642 _process -> task = task_new (_process );
626643 if (ERROR_I (_process -> task ) == 0 )
@@ -632,12 +649,6 @@ int process_load_for_slot(const char *filename, struct process **process, int pr
632649 goto out ;
633650 }
634651
635- res = process_map_memory (_process );
636- if (res < 0 )
637- {
638- goto out ;
639- }
640-
641652 * process = _process ;
642653
643654 // Add the process to the array
@@ -759,7 +770,7 @@ int process_fstat(struct process* process, int fd, struct file_stat* virt_filest
759770 {
760771 goto out ;
761772 }
762-
773+
763774out :
764775 return res ;
765776}
0 commit comments