Rev 675 | Rev 775 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 675 | Rev 703 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | #include <proc/thread.h> |
30 | #include <proc/thread.h> |
31 | #include <proc/task.h> |
31 | #include <proc/task.h> |
32 | #include <mm/heap.h> |
32 | #include <mm/heap.h> |
33 | #include <mm/frame.h> |
33 | #include <mm/frame.h> |
34 | #include <mm/page.h> |
34 | #include <mm/page.h> |
35 | #include <mm/vm.h> |
35 | #include <mm/as.h> |
36 | #include <arch/asm.h> |
36 | #include <arch/asm.h> |
37 | #include <arch/faddr.h> |
37 | #include <arch/faddr.h> |
38 | #include <arch/atomic.h> |
38 | #include <arch/atomic.h> |
39 | #include <synch/spinlock.h> |
39 | #include <synch/spinlock.h> |
40 | #include <config.h> |
40 | #include <config.h> |
Line 350... | Line 350... | ||
350 | 350 | ||
351 | /* |
351 | /* |
352 | * If both the old and the new task are the same, lots of work is avoided. |
352 | * If both the old and the new task are the same, lots of work is avoided. |
353 | */ |
353 | */ |
354 | if (TASK != THREAD->task) { |
354 | if (TASK != THREAD->task) { |
355 | vm_t *m1 = NULL; |
355 | as_t *as1 = NULL; |
356 | vm_t *m2; |
356 | as_t *as2; |
357 | 357 | ||
358 | if (TASK) { |
358 | if (TASK) { |
359 | spinlock_lock(&TASK->lock); |
359 | spinlock_lock(&TASK->lock); |
360 | m1 = TASK->vm; |
360 | as1 = TASK->as; |
361 | spinlock_unlock(&TASK->lock); |
361 | spinlock_unlock(&TASK->lock); |
362 | } |
362 | } |
363 | 363 | ||
364 | spinlock_lock(&THREAD->task->lock); |
364 | spinlock_lock(&THREAD->task->lock); |
365 | m2 = THREAD->task->vm; |
365 | as2 = THREAD->task->as; |
366 | spinlock_unlock(&THREAD->task->lock); |
366 | spinlock_unlock(&THREAD->task->lock); |
367 | 367 | ||
368 | /* |
368 | /* |
369 | * Note that it is possible for two tasks to share one vm mapping. |
369 | * Note that it is possible for two tasks to share one address space. |
370 | */ |
370 | */ |
371 | if (m1 != m2) { |
371 | if (as1 != as2) { |
372 | /* |
372 | /* |
373 | * Both tasks and vm mappings are different. |
373 | * Both tasks and address spaces are different. |
374 | * Replace the old one with the new one. |
374 | * Replace the old one with the new one. |
375 | */ |
375 | */ |
376 | vm_install(m2); |
376 | as_install(as2); |
377 | } |
377 | } |
378 | TASK = THREAD->task; |
378 | TASK = THREAD->task; |
379 | } |
379 | } |
380 | 380 | ||
381 | THREAD->state = Running; |
381 | THREAD->state = Running; |