From de087eb1f800283b2f6c3054c3dccb2f89e017bf Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Fri, 21 Aug 2009 12:10:34 +0300 Subject: [PATCH] Clean up to kernel code, Added `used' field to capabilities With the addition of used field, capability structure can be used for resource accounting over the capability. --- include/l4/generic/capability.h | 3 +++ src/api/capability.c | 4 ++-- src/api/space.c | 7 ------- src/generic/resource.c | 28 ++++++++++++++++++++++++++++ src/glue/arm/memory.c | 10 ---------- tasks/mm0/include/capability.h | 2 ++ 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/include/l4/generic/capability.h b/include/l4/generic/capability.h index 2cac2da..ed1cf42 100644 --- a/include/l4/generic/capability.h +++ b/include/l4/generic/capability.h @@ -59,6 +59,9 @@ struct capability { unsigned long start; /* Resource start value */ unsigned long end; /* Resource end value */ unsigned long size; /* Resource size */ + + /* Used amount on resource */ + unsigned long used; }; struct cap_list { diff --git a/src/api/capability.c b/src/api/capability.c index 0ee2b43..4dabe4e 100644 --- a/src/api/capability.c +++ b/src/api/capability.c @@ -14,7 +14,7 @@ #include INC_API(syscall.h) -int task_read_capabilities(void *userbuf) +int read_task_capabilities(void *userbuf) { int copy_size, copy_offset = 0; struct capability *cap; @@ -69,7 +69,7 @@ int sys_capability_control(unsigned int req, unsigned int flags, void *userbuf) /* Return all capabilities as an array of capabilities */ case CAP_CONTROL_READ_CAPS: - err = task_read_capabilities(userbuf); + err = read_task_capabilities(userbuf); break; default: diff --git a/src/api/space.c b/src/api/space.c index b3407cb..786f37e 100644 --- a/src/api/space.c +++ b/src/api/space.c @@ -9,13 +9,6 @@ #include #include -/* NOTE: - * For lazy mm switching, a list of newly created mappings that are common to - * all tasks (e.g. any mapping done in the kernel) can be kept here so that when - * a new task is scheduled, the same mappings are copied to its page tables as - * well. struct link new_mappings; - */ - int sys_map(unsigned long phys, unsigned long virt, unsigned long npages, unsigned long flags, unsigned int tid) { diff --git a/src/generic/resource.c b/src/generic/resource.c index d200ea2..068cef2 100644 --- a/src/generic/resource.c +++ b/src/generic/resource.c @@ -313,6 +313,7 @@ void init_kernel_container(struct kernel_container *kcont) */ } + /* * Copies cinfo structures to real capabilities for each pager. * @@ -341,6 +342,33 @@ int copy_pager_info(struct pager *pager, struct pager_info *pinfo) cap_list_insert(cap, &pager->cap_list); } + + /* + * Find pager's capability capability, check its + * current use count and initialize it + * + * FIXME: We may want to do this capability checking + * in a more generic and straightforward place. + */ + + list_foreach_struct(cap, &pager->cap_list.caps, list) { + /* Find capability pool capability */ + if ((cap->type & CAP_RTYPE_MASK) == CAP_RTYPE_CAPPOOL) { + /* Verify that we did not excess allocated */ + if (cap->size < pinfo->ncaps) { + printk("FATAL: Pager needs more capabilities " + "than allocated for initialization.\n"); + BUG(); + } + + /* + * Initialize used count. The rest of the checking + * of spending on this cap will be done in the + * cap syscall + */ + cap->used = pinfo->ncaps; + } + } return 0; } diff --git a/src/glue/arm/memory.c b/src/glue/arm/memory.c index 1cc52c9..2ed9932 100644 --- a/src/glue/arm/memory.c +++ b/src/glue/arm/memory.c @@ -44,16 +44,6 @@ void task_init_registers(struct ktcb *task, unsigned long pc) task->context.spsr = ARM_MODE_USR; } -#if 0 -/* Sets up struct page array and the physical memory descriptor. */ -void paging_init(void) -{ - read_bootdesc(); - physmem_init(); - memory_init(); - copy_bootdesc(); -} -#endif /* * Copies global kernel entries into another pgd. Even for sub-pmd ranges diff --git a/tasks/mm0/include/capability.h b/tasks/mm0/include/capability.h index 3294bc4..6fe1a59 100644 --- a/tasks/mm0/include/capability.h +++ b/tasks/mm0/include/capability.h @@ -30,6 +30,8 @@ struct capability { unsigned long start; /* Resource start value */ unsigned long end; /* Resource end value */ unsigned long size; /* Resource size */ + + unsigned long used; /* Resource used size */ };