bcm64: enter page tables in mmutop *AFTER* switching asid in mmuswitch()
there was a small window between modifying mmutop and switching the asid where the core could bring in the new entries under the old asid into the tlb due to speculation / prefetching. this change moves the entering of the page tables into mmutop after setttbr() to prevent this scenario. due to us switching to the resereved asid 0 on procsave()->putasid(), the only asid that could have potentially been poisoned would be asid 0 which does not have any user mappings. so this did not show any noticable effect.
This commit is contained in:
parent
ca2f1c07f2
commit
acab8881bc
1 changed files with 5 additions and 5 deletions
|
@ -499,15 +499,15 @@ mmuswitch(Proc *p)
|
||||||
p->newtlb = 0;
|
p->newtlb = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(t = p->mmuhead[PTLEVELS-1]; t != nil; t = t->next){
|
|
||||||
va = t->va;
|
|
||||||
m->mmutop[PTLX(va, PTLEVELS-1)] = t->pa | PTEVALID | PTETABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(allocasid(p))
|
if(allocasid(p))
|
||||||
flushasid((uvlong)p->asid<<48);
|
flushasid((uvlong)p->asid<<48);
|
||||||
|
|
||||||
setttbr((uvlong)p->asid<<48 | PADDR(m->mmutop));
|
setttbr((uvlong)p->asid<<48 | PADDR(m->mmutop));
|
||||||
|
|
||||||
|
for(t = p->mmuhead[PTLEVELS-1]; t != nil; t = t->next){
|
||||||
|
va = t->va;
|
||||||
|
m->mmutop[PTLX(va, PTLEVELS-1)] = t->pa | PTEVALID | PTETABLE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue