diff --git a/include/l4/generic/resource.h b/include/l4/generic/resource.h index 0dfb32b..f52e741 100644 --- a/include/l4/generic/resource.h +++ b/include/l4/generic/resource.h @@ -98,6 +98,7 @@ struct ktcb *alloc_ktcb(void); struct capability *alloc_capability(void); struct container *alloc_container(void); struct mutex_queue *alloc_user_mutex(void); +int free_boot_memory(struct kernel_container *kcont); int init_system_resources(struct kernel_container *kcont); diff --git a/src/api/thread.c b/src/api/thread.c index ed776bb..a41a929 100644 --- a/src/api/thread.c +++ b/src/api/thread.c @@ -249,9 +249,6 @@ int thread_setup_new_ids(struct task_ids *ids, unsigned int flags, new->tgid = new->tid; } - /* Set all ids */ - //set_task_ids(new, ids); - return 0; } @@ -354,7 +351,11 @@ out_err: */ int sys_thread_control(unsigned int flags, struct task_ids *ids) { - int ret = 0; + int err, ret = 0; + + if ((err = check_access((unsigned long)ids, sizeof(*ids), + MAP_USR_RW_FLAGS, 1)) < 0) + return err; switch (flags & THREAD_ACTION_MASK) { case THREAD_CREATE: diff --git a/src/generic/resource.c b/src/generic/resource.c index 9eba489..db4e8de 100644 --- a/src/generic/resource.c +++ b/src/generic/resource.c @@ -161,6 +161,7 @@ int memcap_unmap_range(struct capability *cap, return 0; } + /* * Unmaps given memory range from the list of capabilities * by either shrinking, splitting or destroying the @@ -190,34 +191,56 @@ int memcap_unmap(struct cap_list *cap_list, } /* - * Migrate any boot allocations to their relevant caches. + * TODO: Evaluate if access bits are needed and add new cap ranges + * only if their access bits match. + * + * Maps a memory range as a capability to a list of capabilities either by + * merging the given range to an existing capability or creating a new one. */ -void migrate_boot_resources(struct boot_resources *bootres, - struct kernel_container *kcont) +int memcap_map(struct cap_list *cap_list, + const unsigned long map_start, + const unsigned long map_end) { - /* Migrate boot page tables to new caches */ - // migrate_page_tables(kcont); + struct capability *cap, *n; - /* Migrate all boot-allocated capabilities */ - // migrate_boot_caps(kcont); + list_foreach_removable_struct(cap, n, &cap_list->caps, list) { + if (cap->start == map_end) { + cap->start = map_start; + return 0; + } else if(cap->end == map_start) { + cap->end = map_end; + return 0; + } + } + + /* No capability could be extended, we create a new one */ + cap = alloc_capability(); + cap->start = map_start; + cap->end = map_end; + link_init(&cap->list); + cap_list_insert(cap, cap_list); + + return 0; } /* Delete all boot memory and add it to physical memory pool. */ -int free_boot_memory(struct boot_resources *bootres, - struct kernel_container *kcont) +int free_boot_memory(struct kernel_container *kcont) { + unsigned long pfn_start = + __pfn(virt_to_phys(_start_init)); + unsigned long pfn_end = + __pfn(page_align_up(virt_to_phys(_end_init))); + /* Trim kernel used memory cap */ - memcap_unmap(&kcont->physmem_used, (unsigned long)_start_init, - (unsigned long)_end_init); + memcap_unmap(&kcont->physmem_used, pfn_start, pfn_end); /* Add it to unused physical memory */ - // memcap_map(&kcont->physmem_free, (unsigned long)_start_init, - // (unsigned long)_end_init); + memcap_map(&kcont->physmem_free, pfn_start, pfn_end); + + /* Remove the init memory from the page tables */ + for (unsigned long i = pfn_start; i < pfn_end; i++) + remove_mapping(phys_to_virt(__pfn_to_addr(i))); - /* - * Freed physical area will be unmapped from virtual - * by not mapping it in the task page tables. - */ return 0; } @@ -536,7 +559,7 @@ void init_resource_allocators(struct boot_resources *bootres, kcont->pmd_cache = init_resource_cache(bootres->npmds, PMD_SIZE, kcont, 1); - } +} /* * Do all system accounting for a given capability info diff --git a/src/glue/arm/init.c b/src/glue/arm/init.c index db5d6cb..a1b035a 100644 --- a/src/glue/arm/init.c +++ b/src/glue/arm/init.c @@ -369,11 +369,6 @@ void setup_dummy_current() TASK_PGD(current) = &init_pgd; } -void free_bootmem(void) -{ - /* TODO: Fill. */ -} - void init_finalize(struct kernel_container *kcont) { volatile register unsigned int stack asm("sp"); @@ -402,7 +397,7 @@ void init_finalize(struct kernel_container *kcont) * Unmap boot memory, and add it as * an unused kernel memcap */ - free_bootmem(); + free_boot_memory(&kernel_container); /* * Set up KIP UTCB ref @@ -444,9 +439,6 @@ void start_kernel(void) remap_as_pages((void *)page_align(_start_kernel), (void *)page_align_up(_end_kernel)); - /* Move the initial pgd into a more convenient place, mapped as pages. */ - // relocate_page_tables(); - /* Initialise kip and map for userspace access */ kip_init();