Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 3 → Rev 5

/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>
142,7 → 143,7
 
for (i=0; i<a->size; i++)
map_page_to_frame(a->address + i*PAGE_SIZE, 0, PAGE_NOT_PRESENT, 0);
spinlock_unlock(&a->lock);
cpu_priority_restore(pri);
}
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);
}