提交 b932ffeb 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

tlb flush barrier, commented out due to C/C++ conflicts

上级 73614a93
#include "mmu.h"
struct cilkframe;
// extern atomic<u64> tlbflush_req;
// Per-CPU state
struct cpu {
......@@ -12,6 +13,7 @@ struct cpu {
struct context *scheduler; // swtch() here to enter scheduler
struct cilkframe *cilkframe;
int timer_printpc;
// atomic<u64> tlbflush_done; // last tlb flush req done on this cpu
// Cpu-local storage variables; see below
struct cpu *cpu;
......
......@@ -213,3 +213,23 @@ inittls(void)
c->proc = NULL;
c->kmem = &kmems[cpunum()];
}
atomic<u64> tlbflush_req;
void
tlbflush()
{
// u64 myreq = tlbflush_req++;
cli();
lcr3(rcr3());
for (int i = 0; i < ncpu; i++)
if (i != mycpu()->id)
lapic_tlbflush(i);
sti();
for (int i = 0; i < ncpu; i++) {
if (i != mycpu()->id) {
// while (cpus[i].tlbflush_done < myreq) /* spin */ ;
}
}
}
......@@ -109,6 +109,7 @@ void freevm(pml4e_t*);
pml4e_t* setupkvm(void);
int setupkshared(pml4e_t *pml4, char *kshared);
pme_t * walkpgdir(pml4e_t*, const void*, int);
void tlbflush(void);
// hz.c
void microdelay(u64);
......
......@@ -181,7 +181,9 @@ lapic_ipi(int cpu, int ino)
void
lapic_tlbflush(u32 cpu)
{
cprintf("lapic_tlbflush: to cpu %d\n", cpu);
lapic_ipi(cpu, T_TLBFLUSH);
cprintf("lapic_tlbflush: to cpu %d done\n", cpu);
}
void
......
......@@ -140,12 +140,7 @@ sys_unmap(void)
updatepages(myproc()->vmap->pml4,
(void*) align_addr, (void*) (align_addr+align_len-1), 0);
cli();
lcr3(v2p(myproc()->vmap->pml4));
for (int i = 0; i < ncpu; i++)
if (i != mycpu()->id)
lapic_tlbflush(i);
sti();
tlbflush();
return 0;
}
......
......@@ -113,8 +113,10 @@ trap(struct trapframe *tf)
mycpu()->id, tf->cs, tf->rip);
lapiceoi();
case T_TLBFLUSH:
// nreq = tlbflush_req.load();
lapiceoi();
lcr3(rcr3());
// mycpu()->tlbflush_done = nreq;
break;
case T_SAMPCONF:
lapiceoi();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论