/SPARTAN/trunk/src/main/main.c |
---|
46,6 → 46,7 |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/tlb.h> |
#include <synch/waitq.h> |
#include <arch.h> |
110,6 → 111,7 |
heap_init(config.base + hardcoded_ktext_size + hardcoded_kdata_size, CONFIG_HEAP_SIZE); |
frame_init(); |
page_init(); |
tlb_init(); |
#ifdef __SMP__ |
mp_init(); /* Multiprocessor */ |
/SPARTAN/trunk/src/mm/tlb.c |
---|
27,8 → 27,43 |
*/ |
#include <mm/tlb.h> |
#include <synch/spinlock.h> |
#include <typedefs.h> |
#include <arch/atomic.h> |
#include <config.h> |
void tlb_shutdown(void) |
#ifdef __SMP__ |
static spinlock_t tlblock; |
static volatile int tlb_shutdown_cnt; |
void tlb_init(void) |
{ |
/* TODO: implement tlb_shutdown */ |
spinlock_initialize(&tlblock); |
tlb_shutdown_cnt = 0; |
} |
/* must be called with interrupts disabled */ |
void tlb_shutdown_start(void) |
{ |
spinlock_lock(&tlblock); |
tlb_shutdown_ipi_send(); |
while (tlb_shutdown_cnt < config.cpu_active - 1) |
; |
tlb_shutdown_cnt = 0; |
} |
void tlb_shutdown_finalize(void) |
{ |
spinlock_unlock(&tlblock); |
} |
void tlb_shutdown_ipi_recv(void) |
{ |
atomic_inc((int *) &tlb_shutdown_cnt); |
spinlock_lock(&tlblock); |
spinlock_unlock(&tlblock); |
tlb_invalidate(0); /* TODO: use valid ASID */ |
} |
#endif /* __SMP__ */ |
/SPARTAN/trunk/src/mm/vm.c |
---|
29,6 → 29,7 |
#include <mm/vm.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/tlb.h> |
#include <arch/mm/page.h> |
#include <arch/types.h> |
#include <typedefs.h> |
168,6 → 169,9 |
pri_t pri; |
pri = cpu_priority_high(); |
tlb_shutdown_start(); |
spinlock_lock(&m->lock); |
for(l = m->vm_area_head.next; l != &m->vm_area_head; l = l->next) |
174,5 → 178,9 |
vm_area_unmap(list_get_instance(l, vm_area_t, link)); |
spinlock_unlock(&m->lock); |
tlb_invalidate(0); |
tlb_shutdown_finalize(); |
cpu_priority_restore(pri); |
} |