Changeset 9e87562 in mainline for kernel/generic/src/cap/cap.c
- Timestamp:
- 2017-09-18T20:52:12Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6abfd250
- Parents:
- e5f5ce0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/cap/cap.c
re5f5ce0 r9e87562 35 35 #include <cap/cap.h> 36 36 #include <proc/task.h> 37 #include <synch/ spinlock.h>37 #include <synch/mutex.h> 38 38 #include <abi/errno.h> 39 39 #include <mm/slab.h> 40 #include <adt/list.h> 40 41 41 42 void cap_initialize(cap_t *cap, int handle) … … 44 45 cap->handle = handle; 45 46 cap->can_reclaim = NULL; 47 link_initialize(&cap->link); 46 48 } 47 49 48 50 void caps_task_alloc(task_t *task) 49 51 { 50 task->caps = malloc(sizeof(cap_t) * MAX_CAPS, 0); 52 task->cap_info = (cap_info_t *) malloc(sizeof(cap_info_t), 0); 53 task->cap_info->caps = malloc(sizeof(cap_t) * MAX_CAPS, 0); 51 54 } 52 55 53 56 void caps_task_init(task_t *task) 54 57 { 58 mutex_initialize(&task->cap_info->lock, MUTEX_PASSIVE); 59 60 for (int i = 0; i < CAP_TYPE_MAX; i++) 61 list_initialize(&task->cap_info->type_list[i]); 62 55 63 for (int i = 0; i < MAX_CAPS; i++) 56 cap_initialize(&task->cap s[i], i);64 cap_initialize(&task->cap_info->caps[i], i); 57 65 } 58 66 59 67 void caps_task_free(task_t *task) 60 68 { 61 free(task->caps); 69 free(task->cap_info->caps); 70 free(task->cap_info); 71 } 72 73 bool caps_apply_to_all(task_t *task, cap_type_t type, 74 bool (*cb)(cap_t *, void *), void *arg) 75 { 76 bool done = true; 77 78 mutex_lock(&task->cap_info->lock); 79 list_foreach_safe(task->cap_info->type_list[type], cur, next) { 80 cap_t *cap = list_get_instance(cur, cap_t, link); 81 done = cb(cap, arg); 82 if (!done) 83 break; 84 } 85 mutex_unlock(&task->cap_info->lock); 86 87 return done; 88 } 89 90 void caps_lock(task_t *task) 91 { 92 mutex_lock(&task->cap_info->lock); 93 } 94 95 void caps_unlock(task_t *task) 96 { 97 mutex_unlock(&task->cap_info->lock); 62 98 } 63 99 64 100 cap_t *cap_get(task_t *task, int handle, cap_type_t type) 65 101 { 102 assert(mutex_locked(&task->cap_info->lock)); 103 66 104 if ((handle < 0) || (handle >= MAX_CAPS)) 67 105 return NULL; 68 if (task->cap s[handle].type != type)106 if (task->cap_info->caps[handle].type != type) 69 107 return NULL; 70 return &task->caps[handle]; 71 } 72 73 cap_t *cap_get_current(int handle, cap_type_t type) 74 { 75 return cap_get(TASK, handle, type); 108 return &task->cap_info->caps[handle]; 76 109 } 77 110 … … 80 113 int handle; 81 114 82 irq_spinlock_lock(&task->lock, true);115 mutex_lock(&task->cap_info->lock); 83 116 for (handle = 0; handle < MAX_CAPS; handle++) { 84 cap_t *cap = &task->cap s[handle];117 cap_t *cap = &task->cap_info->caps[handle]; 85 118 if (cap->type > CAP_TYPE_ALLOCATED) { 86 119 if (cap->can_reclaim && cap->can_reclaim(cap)) … … 89 122 if (cap->type == CAP_TYPE_INVALID) { 90 123 cap->type = CAP_TYPE_ALLOCATED; 91 irq_spinlock_unlock(&task->lock, true);124 mutex_unlock(&task->cap_info->lock); 92 125 return handle; 93 126 } 94 127 } 95 irq_spinlock_unlock(&task->lock, true);128 mutex_unlock(&task->cap_info->lock); 96 129 97 130 return ELIMIT; 131 } 132 133 void cap_publish(task_t *task, int handle, cap_type_t type, void *kobject) 134 { 135 mutex_lock(&task->cap_info->lock); 136 cap_t *cap = cap_get(task, handle, CAP_TYPE_ALLOCATED); 137 assert(cap); 138 cap->type = type; 139 cap->kobject = kobject; 140 list_append(&cap->link, &task->cap_info->type_list[type]); 141 mutex_unlock(&task->cap_info->lock); 142 } 143 144 cap_t *cap_unpublish(task_t *task, int handle, cap_type_t type) 145 { 146 cap_t *cap; 147 148 mutex_lock(&task->cap_info->lock); 149 cap = cap_get(task, handle, type); 150 if (cap) { 151 list_remove(&cap->link); 152 cap->type = CAP_TYPE_ALLOCATED; 153 } 154 mutex_unlock(&task->cap_info->lock); 155 156 return cap; 98 157 } 99 158 … … 102 161 assert(handle >= 0); 103 162 assert(handle < MAX_CAPS); 104 assert(task->cap s[handle].type == CAP_TYPE_ALLOCATED);163 assert(task->cap_info->caps[handle].type == CAP_TYPE_ALLOCATED); 105 164 106 irq_spinlock_lock(&task->lock, true);107 cap_initialize(&task->cap s[handle], handle);108 irq_spinlock_unlock(&task->lock, true);165 mutex_lock(&task->cap_info->lock); 166 cap_initialize(&task->cap_info->caps[handle], handle); 167 mutex_unlock(&task->cap_info->lock); 109 168 } 110 169
Note:
See TracChangeset
for help on using the changeset viewer.