Changeset bb252ca in mainline
- Timestamp:
- 2010-05-02T20:58:27Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4872160
- Parents:
- 4ce914d4 (diff), 1624aae (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- kernel/generic
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2004Jakub Jermar2 * Copyright (c) 2010 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 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);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); 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 * as, int flags);252 extern int as_constructor_arch(as_t *, int); 253 253 #endif /* !def as_constructor_arch */ 254 254 #ifndef as_destructor_arch 255 extern int as_destructor_arch(as_t * as);255 extern int as_destructor_arch(as_t *); 256 256 #endif /* !def as_destructor_arch */ 257 257 #ifndef as_create_arch 258 extern int as_create_arch(as_t * as, int flags);258 extern int as_create_arch(as_t *, int); 259 259 #endif /* !def as_create_arch */ 260 260 #ifndef as_install_arch 261 extern void as_install_arch(as_t * as);261 extern void as_install_arch(as_t *); 262 262 #endif /* !def as_install_arch */ 263 263 #ifndef as_deinstall_arch 264 extern void as_deinstall_arch(as_t * as);264 extern void as_deinstall_arch(as_t *); 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 * header, as_t *as, int flags);279 extern unsigned int elf_load(elf_header_t *, as_t *, int); 280 280 281 281 /* Address space area related syscalls. */ 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);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); 286 286 287 287 /* Introspection functions. */ 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);288 extern void as_get_area_info(as_t *, as_area_info_t **, size_t *); 289 extern void as_print(as_t *); 290 290 291 291 #endif /* KERNEL */ -
kernel/generic/include/proc/task.h
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2004Jakub Jermar2 * Copyright (c) 2010 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 *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); 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 *); 138 140 extern void task_print_list(void); 139 141 140 extern void cap_set(task_t * t, cap_t caps);141 extern cap_t cap_get(task_t * t);142 extern void cap_set(task_t *, cap_t); 143 extern cap_t cap_get(task_t *); 142 144 143 145 #ifndef task_create_arch 144 extern void task_create_arch(task_t * t);146 extern void task_create_arch(task_t *); 145 147 #endif 146 148 147 149 #ifndef task_destroy_arch 148 extern void task_destroy_arch(task_t * t);150 extern void task_destroy_arch(task_t *); 149 151 #endif 150 152 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);153 extern unative_t sys_task_get_id(task_id_t *); 154 extern unative_t sys_task_set_name(const char *, size_t); 153 155 154 156 #endif -
kernel/generic/src/mm/as.c
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2006Jakub Jermar2 * Copyright (c) 2010 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 152 152 * reference count never drops to zero. 153 153 */ 154 a tomic_set(&AS_KERNEL->refcount, 1);154 as_hold(AS_KERNEL); 155 155 } 156 156 … … 200 200 DEADLOCK_PROBE_INIT(p_asidlock); 201 201 202 ASSERT(as != AS); 202 203 ASSERT(atomic_get(&as->refcount) == 0); 203 204 204 205 /* 205 * Since there is no reference to this a rea,206 * it is safe not tolock its mutex.206 * Since there is no reference to this address space, it is safe not to 207 * lock its mutex. 207 208 */ 208 209 … … 225 226 preemption_enable(); /* Interrupts disabled, enable preemption */ 226 227 if (as->asid != ASID_INVALID && as != AS_KERNEL) { 227 if (as != AS && as->cpu_refcount == 0)228 if (as->cpu_refcount == 0) 228 229 list_remove(&as->inactive_as_with_asid_link); 229 230 asid_put(as->asid); … … 258 259 259 260 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 address 266 * 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 address 278 * 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); 260 286 } 261 287 -
kernel/generic/src/proc/scheduler.c
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2007Jakub Jermar2 * Copyright (c) 2010 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; 384 386 385 387 ASSERT(CPU != NULL); 386 388 389 /* 390 * Hold the current task and the address space to prevent their 391 * possible destruction should thread_destroy() be called on this or any 392 * 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 387 399 if (THREAD) { 388 400 /* must be run after the switch to scheduler stack */ … … 476 488 */ 477 489 if (TASK != THREAD->task) { 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); 490 as_t *new_as = THREAD->task->as; 490 491 491 492 /* … … 493 494 * space. 494 495 */ 495 if ( as1 != as2) {496 if (old_as != new_as) { 496 497 /* 497 498 * Both tasks and address spaces are different. 498 499 * Replace the old one with the new one. 499 500 */ 500 as_switch( as1, as2);501 as_switch(old_as, new_as); 501 502 } 503 502 504 TASK = THREAD->task; 503 505 before_task_runs(); 504 506 } 505 507 508 if (old_task) 509 task_release(old_task); 510 if (old_as) 511 as_release(old_as); 512 506 513 spinlock_lock(&THREAD->lock); 507 514 THREAD->state = Running; -
kernel/generic/src/proc/task.c
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2004Jakub Jermar2 * Copyright (c) 2010 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 212 217 ipl = interrupts_disable(); 213 atomic_inc(&as->refcount);214 218 spinlock_lock(&tasks_lock); 215 219 ta->taskid = ++task_counter; … … 250 254 * Drop our reference to the address space. 251 255 */ 252 if (atomic_predec(&t->as->refcount) == 0) 253 as_destroy(t->as); 256 as_release(t->as); 254 257 255 258 slab_free(task_slab, t); 256 TASK = NULL; 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); 257 282 } 258 283 -
kernel/generic/src/proc/thread.c
r4ce914d4 rbb252ca 1 1 /* 2 * Copyright (c) 20 01-2004Jakub Jermar2 * Copyright (c) 2010 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 409 409 410 410 /* 411 * t is guaranteed to be the very last thread of its task. 412 * It is safe to destroy the task. 411 * Drop the reference to the containing task. 413 412 */ 414 if (atomic_predec(&t->task->refcount) == 0) 415 task_destroy(t->task); 413 task_release(t->task); 416 414 417 415 slab_free(thread_slab, t); … … 436 434 spinlock_lock(&task->lock); 437 435 438 atomic_inc(&task->refcount); 436 /* Hold a reference to the task. */ 437 task_hold(task); 439 438 440 439 /* Must not count kbox thread into lifecount */
Note:
See TracChangeset
for help on using the changeset viewer.