From 6982e96d1f98981221286f7d8b30caf36c18ccaf Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Thu, 15 Oct 2009 20:24:01 +0300 Subject: [PATCH 1/3] Some cleanups on last commit --- conts/posix/mm0/include/memory.h | 10 ++++++++ conts/posix/mm0/mm/init.c | 40 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/conts/posix/mm0/include/memory.h b/conts/posix/mm0/include/memory.h index 7b95989..6db55ad 100644 --- a/conts/posix/mm0/include/memory.h +++ b/conts/posix/mm0/include/memory.h @@ -10,6 +10,16 @@ #include #include #include +#include + +struct container_memory_regions { + struct capability *shmem; + struct capability *utcb; + struct capability *task; + struct capability *pager; + struct capability *physmem; +}; +extern struct container_memory_regions cont_mem_regions; #define PAGER_MMAP_SEGMENT SZ_4MB #define PAGER_MMAP_START (page_align_up(__stack)) diff --git a/conts/posix/mm0/mm/init.c b/conts/posix/mm0/mm/init.c index 653799e..21b747a 100644 --- a/conts/posix/mm0/mm/init.c +++ b/conts/posix/mm0/mm/init.c @@ -43,17 +43,13 @@ struct memdesc physmem; /* Initial, primitive memory descriptor */ struct membank membank[1]; /* The memory bank */ struct page *page_array; /* The physical page array based on mem bank */ -struct container_memory_regions { - struct capability *shmem; - struct capability *utcb; - struct capability *task; - struct capability *pager; - struct capability *physmem; -} cont_mem_regions; /* Capability descriptor list */ struct cap_list capability_list; +/* Memory region capabilities */ +struct container_memory_regions cont_mem_regions; + __initdata static struct capability *caparray; __initdata static int total_caps = 0; @@ -192,8 +188,6 @@ int read_pager_capabilities() " capabilities failed.\n Could not " "complete CAP_CONTROL_NCAPS request.\n"); BUG(); - } else { - printf("There are %d capabilities defined.\n", ncaps); } total_caps = ncaps; @@ -225,16 +219,16 @@ int read_pager_capabilities() if ((cap->type & CAP_RTYPE_MASK) == CAP_RTYPE_VIRTMEM) { - printf("Capability range 0x%lx - 0x%lx\n", - __pfn_to_addr(cap->start), __pfn_to_addr(cap->end)); /* Pager address region (get from linker-defined) */ if (__pfn_to_addr(cap->start) == (unsigned long)virtual_base) cont_mem_regions.pager = cap; /* UTCB address region */ - else if (UTCB_REGION_START == __pfn_to_addr(cap->start)) { - if (UTCB_REGION_END != __pfn_to_addr(cap->end)) { + else if (UTCB_REGION_START == + __pfn_to_addr(cap->start)) { + if (UTCB_REGION_END != + __pfn_to_addr(cap->end)) { printf("FATAL: Region designated " "for UTCB allocation does not " "match on start/end marks"); @@ -251,8 +245,10 @@ int read_pager_capabilities() } /* Shared memory disjoint region */ - else if (SHMEM_REGION_START == __pfn_to_addr(cap->start)) { - if (SHMEM_REGION_END != __pfn_to_addr(cap->end)) { + else if (SHMEM_REGION_START == + __pfn_to_addr(cap->start)) { + if (SHMEM_REGION_END != + __pfn_to_addr(cap->end)) { printf("FATAL: Region designated " "for SHM allocation does not " "match on start/end marks"); @@ -263,11 +259,13 @@ int read_pager_capabilities() } /* Task memory region */ - else if (TASK_REGION_START == __pfn_to_addr(cap->start)) { - if (TASK_REGION_END != __pfn_to_addr(cap->end)) { + else if (TASK_REGION_START == + __pfn_to_addr(cap->start)) { + if (TASK_REGION_END != + __pfn_to_addr(cap->end)) { printf("FATAL: Region designated " - "for Task address space does not " - "match on start/end marks"); + "for Task address space does" + "not match on start/end mark."); BUG(); } cont_mem_regions.task = cap; @@ -283,7 +281,9 @@ int read_pager_capabilities() printf("%s: Error, pager does not have one of the required" "mem capabilities defined. (TASK, SHM, PHYSMEM, UTCB)\n", __TASKNAME__); - printf("%p, %p, %p, %p, %p\n", cont_mem_regions.task, cont_mem_regions.shmem, cont_mem_regions.utcb, cont_mem_regions.physmem, cont_mem_regions.pager); + printf("%p, %p, %p, %p, %p\n", cont_mem_regions.task, + cont_mem_regions.shmem, cont_mem_regions.utcb, + cont_mem_regions.physmem, cont_mem_regions.pager); BUG(); } From e9afbbaad904902a65d793f611894b52b6d38a96 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Thu, 15 Oct 2009 20:35:41 +0300 Subject: [PATCH 2/3] Replaced all hard-coded values for UTCB, SHM, TASK region assumptions. Not tested. Not replaced pager run-area values. --- conts/posix/mm0/lib/vaddr.c | 6 ++++-- conts/posix/mm0/mm/init.c | 2 +- conts/posix/mm0/mm/mmap.c | 8 ++++---- conts/posix/mm0/mm/shm.c | 8 ++++++-- conts/posix/mm0/mm/task.c | 8 ++++---- conts/posix/mm0/mm/utcb.c | 8 ++++++-- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/conts/posix/mm0/lib/vaddr.c b/conts/posix/mm0/lib/vaddr.c index 8a847a7..3d5d806 100644 --- a/conts/posix/mm0/lib/vaddr.c +++ b/conts/posix/mm0/lib/vaddr.c @@ -9,6 +9,7 @@ #include INC_GLUE(memory.h) #include #include +#include void vaddr_pool_init(struct id_pool *pool, unsigned long start, unsigned long end) { @@ -22,12 +23,13 @@ void *vaddr_new(struct id_pool *pool, int npages) if ((int)(shm_vpfn = ids_new_contiguous(pool, npages)) < 0) return 0; - return (void *)__pfn_to_addr(shm_vpfn + SHM_AREA_START); + return (void *)__pfn_to_addr(shm_vpfn + cont_mem_regions.shmem->start); } int vaddr_del(struct id_pool *pool, void *vaddr, int npages) { - unsigned long idpfn = __pfn(page_align(vaddr) - SHM_AREA_START); + unsigned long idpfn = __pfn(page_align(vaddr) - + __pfn_to_addr(cont_mem_regions.shmem->start)); if (ids_del_contiguous(pool, idpfn, npages) < 0) { printf("%s: Invalid address range returned to " diff --git a/conts/posix/mm0/mm/init.c b/conts/posix/mm0/mm/init.c index 21b747a..df1a0bb 100644 --- a/conts/posix/mm0/mm/init.c +++ b/conts/posix/mm0/mm/init.c @@ -142,7 +142,7 @@ int pager_setup_task(void) * microkernel for this pager. Ensure that we also get * the same from our internal utcb bookkeeping. */ - BUG_ON(task->utcb_address != UTCB_AREA_START); + BUG_ON(task->utcb_address != __pfn_to_addr(cont_mem_regions.utcb->start)); /* Pager must prefault its utcb */ prefault_page(task, task->utcb_address, diff --git a/conts/posix/mm0/mm/mmap.c b/conts/posix/mm0/mm/mmap.c index 90b6972..5f2e374 100644 --- a/conts/posix/mm0/mm/mmap.c +++ b/conts/posix/mm0/mm/mmap.c @@ -169,8 +169,8 @@ int mmap_address_validate(struct tcb *task, unsigned long map_address, if (vm_flags & VMA_PRIVATE) { if ((map_address >= task->start && map_address < task->end) || - (map_address >= UTCB_AREA_START && - map_address < UTCB_AREA_END)) { + (map_address >= __pfn_to_addr(cont_mem_regions.utcb->start) && + map_address < __pfn_to_addr(cont_mem_regions.utcb->end))) { return 1; } else return 0; @@ -181,8 +181,8 @@ int mmap_address_validate(struct tcb *task, unsigned long map_address, } else if (vm_flags & VMA_SHARED) { if ((map_address >= task->start && map_address < task->end) || - (map_address >= SHM_AREA_START && - map_address < SHM_AREA_END)) + (map_address >= __pfn_to_addr(cont_mem_regions.shmem->start) && + map_address < __pfn_to_addr(cont_mem_regions.shmem->end))) return 1; else return 0; diff --git a/conts/posix/mm0/mm/shm.c b/conts/posix/mm0/mm/shm.c index 7338bf1..370a926 100644 --- a/conts/posix/mm0/mm/shm.c +++ b/conts/posix/mm0/mm/shm.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -62,8 +63,11 @@ int shm_pool_init() } /* Initialise the global shm virtual address pool */ - if ((err = address_pool_init(&shm_vaddr_pool, - SHM_AREA_START, SHM_AREA_END)) < 0) { + if ((err = + address_pool_init(&shm_vaddr_pool, + __pfn_to_addr(cont_mem_regions.shmem->start), + __pfn_to_addr(cont_mem_regions.shmem->end))) + < 0) { printf("SHM Address pool initialisation failed.\n"); return err; } diff --git a/conts/posix/mm0/mm/task.c b/conts/posix/mm0/mm/task.c index d4e199e..41c07c0 100644 --- a/conts/posix/mm0/mm/task.c +++ b/conts/posix/mm0/mm/task.c @@ -519,8 +519,8 @@ int task_map_stack(struct vm_file *f, struct exec_file_desc *efd, char *args_on_stack; void *mapped; - task->stack_end = USER_AREA_END; - task->stack_start = USER_AREA_END - DEFAULT_STACK_SIZE; + task->stack_end = __pfn_to_addr(cont_mem_regions.task->end); + task->stack_start = __pfn_to_addr(cont_mem_regions.task->end) - DEFAULT_STACK_SIZE; task->args_end = task->stack_end; task->args_start = task->stack_end - stack_used; @@ -636,8 +636,8 @@ int task_mmap_segments(struct tcb *task, struct vm_file *file, struct exec_file_ int text_size, data_size; /* Set up task's user boundary regions */ - task->start = USER_AREA_START; - task->end = USER_AREA_END; + task->start = __pfn_to_addr(cont_mem_regions.task->start); + task->end = __pfn_to_addr(cont_mem_regions.task->end); task->map_start = task->start; task->map_end = task->end; diff --git a/conts/posix/mm0/mm/utcb.c b/conts/posix/mm0/mm/utcb.c index 3e7c814..31f6ce0 100644 --- a/conts/posix/mm0/mm/utcb.c +++ b/conts/posix/mm0/mm/utcb.c @@ -10,6 +10,7 @@ #include #include #include +#include /* * UTCB management in Codezero @@ -23,8 +24,11 @@ int utcb_pool_init() int err; /* Initialise the global shm virtual address pool */ - if ((err = address_pool_init(&utcb_region_pool, - UTCB_AREA_START, UTCB_AREA_END)) < 0) { + if ((err = + address_pool_init(&utcb_region_pool, + __pfn_to_addr(cont_mem_regions.utcb->start), + __pfn_to_addr(cont_mem_regions.utcb->end))) + < 0) { printf("UTCB address pool initialisation failed.\n"); return err; } From e28e2f486a88b9ecef206fcd106925c93406afda Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Thu, 15 Oct 2009 20:43:19 +0300 Subject: [PATCH 3/3] Changed all pager hardcoded value assumptions, too. Not tested. --- conts/posix/mm0/include/arch-arm/mm.h | 3 --- conts/posix/mm0/include/arch-arm/offsets.h | 9 --------- conts/posix/mm0/mm/init.c | 7 ++++--- conts/posix/mm0/mm/memory.c | 9 +++++---- 4 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 conts/posix/mm0/include/arch-arm/offsets.h diff --git a/conts/posix/mm0/include/arch-arm/mm.h b/conts/posix/mm0/include/arch-arm/mm.h index 54fbe66..6224afc 100644 --- a/conts/posix/mm0/include/arch-arm/mm.h +++ b/conts/posix/mm0/include/arch-arm/mm.h @@ -1,14 +1,11 @@ #ifndef __INITTASK_ARCH_MM_H__ #define __INITTASK_ARCH_MM_H__ -#include #include #include #include INC_GLUE(memory.h) #include -#define INITTASK_ADDR(x) ((x >= INITTASK_AREA_START) && (x < INITTASK_AREA_END)) - struct fault_data; unsigned int vm_prot_flags(pte_t pte); void set_generic_fault_params(struct fault_data *fault); diff --git a/conts/posix/mm0/include/arch-arm/offsets.h b/conts/posix/mm0/include/arch-arm/offsets.h deleted file mode 100644 index 78cdfda..0000000 --- a/conts/posix/mm0/include/arch-arm/offsets.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __INITTASK_ARCH_OFFSETS_H__ -#define __INITTASK_ARCH_OFFSETS_H__ - -#define INITTASK_AREA_START 0xE0000000 -#define INITTASK_AREA_END 0xF0000000 - -#define INITTASK_OFFSET INITTASK_AREA_START - -#endif diff --git a/conts/posix/mm0/mm/init.c b/conts/posix/mm0/mm/init.c index df1a0bb..44e2af2 100644 --- a/conts/posix/mm0/mm/init.c +++ b/conts/posix/mm0/mm/init.c @@ -113,8 +113,8 @@ int pager_setup_task(void) task->map_end = PAGER_MMAP_END; /* Task's total map boundaries */ - task->start = task->text_start; - task->end = 0xF0000000; + task->start = __pfn_to_addr(cont_mem_regions.pager->start); + task->end = __pfn_to_addr(cont_mem_regions.pager->end); /* * Map all regions as anonymous (since no real @@ -142,7 +142,8 @@ int pager_setup_task(void) * microkernel for this pager. Ensure that we also get * the same from our internal utcb bookkeeping. */ - BUG_ON(task->utcb_address != __pfn_to_addr(cont_mem_regions.utcb->start)); + BUG_ON(task->utcb_address != + __pfn_to_addr(cont_mem_regions.utcb->start)); /* Pager must prefault its utcb */ prefault_page(task, task->utcb_address, diff --git a/conts/posix/mm0/mm/memory.c b/conts/posix/mm0/mm/memory.c index b45e17e..f018ae1 100644 --- a/conts/posix/mm0/mm/memory.c +++ b/conts/posix/mm0/mm/memory.c @@ -57,10 +57,11 @@ static struct pager_virtual_address_id_pool { */ int pager_address_pool_init(void) { - address_pool_init_with_idpool(&pager_vaddr_pool, - (struct id_pool *) - &pager_virtual_address_id_pool, - PAGER_MMAP_END, 0xF0000000); + address_pool_init_with_idpool(&pager_vaddr_pool, + (struct id_pool *) + &pager_virtual_address_id_pool, + PAGER_MMAP_END, + __pfn_to_addr(cont_mem_regions.pager->end)); return 0; }