Changes in / [bb252ca:4ce914d4] in mainline
- Location:
- kernel/generic
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 227 227 extern void as_init(void); 228 228 229 extern as_t *as_create(int );230 extern void as_destroy(as_t * );231 extern void as_ hold(as_t *);232 extern void as_release(as_t *);233 extern void as_switch(as_t *, as_t *); 234 extern int as_page_fault(uintptr_t, pf_access_t, istate_t *);235 236 extern as_area_t *as_area_create(as_t *, int, size_t, uintptr_t, int, 237 mem_backend_t *, mem_backend_data_t *); 238 extern int as_area_ destroy(as_t *, uintptr_t);239 extern int as_area_resize(as_t *, uintptr_t, size_t, int); 240 extern int as_area_share(as_t *, uintptr_t, size_t, as_t *, uintptr_t, int);241 extern int as_area_change_flags(as_t * , int, uintptr_t);242 243 extern int as_area_get_flags(as_area_t * );244 extern bool as_area_check_access(as_area_t * , pf_access_t);245 extern size_t as_area_get_size(uintptr_t );246 extern int used_space_insert(as_area_t * , uintptr_t, size_t);247 extern int used_space_remove(as_area_t * , uintptr_t, size_t);229 extern as_t *as_create(int flags); 230 extern void as_destroy(as_t *as); 231 extern void as_switch(as_t *old_as, as_t *new_as); 232 extern int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate); 233 234 extern as_area_t *as_area_create(as_t *as, int flags, size_t size, 235 uintptr_t base, int attrs, mem_backend_t *backend, 236 mem_backend_data_t *backend_data); 237 extern int as_area_destroy(as_t *as, uintptr_t address); 238 extern int as_area_resize(as_t *as, uintptr_t address, size_t size, int flags); 239 int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size, 240 as_t *dst_as, uintptr_t dst_base, int dst_flags_mask); 241 extern int as_area_change_flags(as_t *as, int flags, uintptr_t address); 242 243 extern int as_area_get_flags(as_area_t *area); 244 extern bool as_area_check_access(as_area_t *area, pf_access_t access); 245 extern size_t as_area_get_size(uintptr_t base); 246 extern int used_space_insert(as_area_t *a, uintptr_t page, size_t count); 247 extern int used_space_remove(as_area_t *a, uintptr_t page, size_t count); 248 248 249 249 250 250 /* Interface to be implemented by architectures. */ 251 251 #ifndef as_constructor_arch 252 extern int as_constructor_arch(as_t * , int);252 extern int as_constructor_arch(as_t *as, int flags); 253 253 #endif /* !def as_constructor_arch */ 254 254 #ifndef as_destructor_arch 255 extern int as_destructor_arch(as_t * );255 extern int as_destructor_arch(as_t *as); 256 256 #endif /* !def as_destructor_arch */ 257 257 #ifndef as_create_arch 258 extern int as_create_arch(as_t * , int);258 extern int as_create_arch(as_t *as, int flags); 259 259 #endif /* !def as_create_arch */ 260 260 #ifndef as_install_arch 261 extern void as_install_arch(as_t * );261 extern void as_install_arch(as_t *as); 262 262 #endif /* !def as_install_arch */ 263 263 #ifndef as_deinstall_arch 264 extern void as_deinstall_arch(as_t * );264 extern void as_deinstall_arch(as_t *as); 265 265 #endif /* !def as_deinstall_arch */ 266 266 … … 277 277 #define ELD_F_LOADER 1 278 278 279 extern unsigned int elf_load(elf_header_t * , as_t *, int);279 extern unsigned int elf_load(elf_header_t *header, as_t *as, int flags); 280 280 281 281 /* Address space area related syscalls. */ 282 extern unative_t sys_as_area_create(uintptr_t , size_t, int);283 extern unative_t sys_as_area_resize(uintptr_t , size_t, int);284 extern unative_t sys_as_area_change_flags(uintptr_t , int);285 extern unative_t sys_as_area_destroy(uintptr_t );282 extern unative_t sys_as_area_create(uintptr_t address, size_t size, int flags); 283 extern unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags); 284 extern unative_t sys_as_area_change_flags(uintptr_t address, int flags); 285 extern unative_t sys_as_area_destroy(uintptr_t address); 286 286 287 287 /* Introspection functions. */ 288 extern void as_get_area_info(as_t * , as_area_info_t **, size_t *);289 extern void as_print(as_t * );288 extern void as_get_area_info(as_t *as, as_area_info_t **obuf, size_t *osize); 289 extern void as_print(as_t *as); 290 290 291 291 #endif /* KERNEL */ -
kernel/generic/include/proc/task.h
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 131 131 extern void task_init(void); 132 132 extern void task_done(void); 133 extern task_t *task_create(as_t *, const char *); 134 extern void task_destroy(task_t *); 135 extern void task_hold(task_t *); 136 extern void task_release(task_t *); 137 extern task_t *task_find_by_id(task_id_t); 138 extern int task_kill(task_id_t); 139 extern void task_get_accounting(task_t *, uint64_t *, uint64_t *); 133 extern task_t *task_create(as_t *as, const char *name); 134 extern void task_destroy(task_t *t); 135 extern task_t *task_find_by_id(task_id_t id); 136 extern int task_kill(task_id_t id); 137 extern void task_get_accounting(task_t *t, uint64_t *ucycles, uint64_t *kcycles); 140 138 extern void task_print_list(void); 141 139 142 extern void cap_set(task_t * , cap_t);143 extern cap_t cap_get(task_t * );140 extern void cap_set(task_t *t, cap_t caps); 141 extern cap_t cap_get(task_t *t); 144 142 145 143 #ifndef task_create_arch 146 extern void task_create_arch(task_t * );144 extern void task_create_arch(task_t *t); 147 145 #endif 148 146 149 147 #ifndef task_destroy_arch 150 extern void task_destroy_arch(task_t * );148 extern void task_destroy_arch(task_t *t); 151 149 #endif 152 150 153 extern unative_t sys_task_get_id(task_id_t * );154 extern unative_t sys_task_set_name(const char * , size_t);151 extern unative_t sys_task_get_id(task_id_t *uspace_task_id); 152 extern unative_t sys_task_set_name(const char *uspace_name, size_t name_len); 155 153 156 154 #endif -
kernel/generic/src/mm/as.c
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2006 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 152 152 * reference count never drops to zero. 153 153 */ 154 a s_hold(AS_KERNEL);154 atomic_set(&AS_KERNEL->refcount, 1); 155 155 } 156 156 … … 200 200 DEADLOCK_PROBE_INIT(p_asidlock); 201 201 202 ASSERT(as != AS);203 202 ASSERT(atomic_get(&as->refcount) == 0); 204 203 205 204 /* 206 * Since there is no reference to this a ddress space, it is safe not to207 * lock its mutex.205 * Since there is no reference to this area, 206 * it is safe not to lock its mutex. 208 207 */ 209 208 … … 226 225 preemption_enable(); /* Interrupts disabled, enable preemption */ 227 226 if (as->asid != ASID_INVALID && as != AS_KERNEL) { 228 if (as ->cpu_refcount == 0)227 if (as != AS && as->cpu_refcount == 0) 229 228 list_remove(&as->inactive_as_with_asid_link); 230 229 asid_put(as->asid); … … 259 258 260 259 slab_free(as_slab, as); 261 }262 263 /** Hold a reference to an address space.264 *265 * Holding a reference to an address space prevents destruction of that address266 * space.267 *268 * @param a Address space to be held.269 */270 void as_hold(as_t *as)271 {272 atomic_inc(&as->refcount);273 }274 275 /** Release a reference to an address space.276 *277 * The last one to release a reference to an address space destroys the address278 * space.279 *280 * @param a Address space to be released.281 */282 void as_release(as_t *as)283 {284 if (atomic_predec(&as->refcount) == 0)285 as_destroy(as);286 260 } 287 261 -
kernel/generic/src/proc/scheduler.c
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2007 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 382 382 int priority; 383 383 DEADLOCK_PROBE_INIT(p_joinwq); 384 task_t *old_task = TASK;385 as_t *old_as = AS;386 384 387 385 ASSERT(CPU != NULL); 388 386 389 /*390 * Hold the current task and the address space to prevent their391 * possible destruction should thread_destroy() be called on this or any392 * other processor while the scheduler is still using them.393 */394 if (old_task)395 task_hold(old_task);396 if (old_as)397 as_hold(old_as);398 399 387 if (THREAD) { 400 388 /* must be run after the switch to scheduler stack */ … … 488 476 */ 489 477 if (TASK != THREAD->task) { 490 as_t *new_as = THREAD->task->as; 478 as_t *as1 = NULL; 479 as_t *as2; 480 481 if (TASK) { 482 spinlock_lock(&TASK->lock); 483 as1 = TASK->as; 484 spinlock_unlock(&TASK->lock); 485 } 486 487 spinlock_lock(&THREAD->task->lock); 488 as2 = THREAD->task->as; 489 spinlock_unlock(&THREAD->task->lock); 491 490 492 491 /* … … 494 493 * space. 495 494 */ 496 if ( old_as != new_as) {495 if (as1 != as2) { 497 496 /* 498 497 * Both tasks and address spaces are different. 499 498 * Replace the old one with the new one. 500 499 */ 501 as_switch(old_as, new_as); 502 } 503 500 as_switch(as1, as2); 501 } 504 502 TASK = THREAD->task; 505 503 before_task_runs(); 506 504 } 507 505 508 if (old_task)509 task_release(old_task);510 if (old_as)511 as_release(old_as);512 513 506 spinlock_lock(&THREAD->lock); 514 507 THREAD->state = Running; -
kernel/generic/src/proc/task.c
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 210 210 btree_create(&ta->futexes); 211 211 212 /*213 * Get a reference to the address space.214 */215 as_hold(ta->as);216 217 212 ipl = interrupts_disable(); 213 atomic_inc(&as->refcount); 218 214 spinlock_lock(&tasks_lock); 219 215 ta->taskid = ++task_counter; … … 254 250 * Drop our reference to the address space. 255 251 */ 256 as_release(t->as); 252 if (atomic_predec(&t->as->refcount) == 0) 253 as_destroy(t->as); 257 254 258 255 slab_free(task_slab, t); 259 } 260 261 /** Hold a reference to a task. 262 * 263 * Holding a reference to a task prevents destruction of that task. 264 * 265 * @param t Task to be held. 266 */ 267 void task_hold(task_t *t) 268 { 269 atomic_inc(&t->refcount); 270 } 271 272 /** Release a reference to a task. 273 * 274 * The last one to release a reference to a task destroys the task. 275 * 276 * @param t Task to be released. 277 */ 278 void task_release(task_t *t) 279 { 280 if ((atomic_predec(&t->refcount)) == 0) 281 task_destroy(t); 256 TASK = NULL; 282 257 } 283 258 -
kernel/generic/src/proc/thread.c
rbb252ca r4ce914d4 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2001-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 409 409 410 410 /* 411 * Drop the reference to the containing task. 411 * t is guaranteed to be the very last thread of its task. 412 * It is safe to destroy the task. 412 413 */ 413 task_release(t->task); 414 if (atomic_predec(&t->task->refcount) == 0) 415 task_destroy(t->task); 414 416 415 417 slab_free(thread_slab, t); … … 434 436 spinlock_lock(&task->lock); 435 437 436 /* Hold a reference to the task. */ 437 task_hold(task); 438 atomic_inc(&task->refcount); 438 439 439 440 /* Must not count kbox thread into lifecount */
Note:
See TracChangeset
for help on using the changeset viewer.