ref: ed5c9fd00a2e34a8a45288c986d52ac499db393b
parent: 9b5387fbde5267dd1f6899866053a0bbda442ab7
author: cinap_lenrek <[email protected]>
date: Thu Dec 25 06:30:29 EST 2014
zynq: only tmpmap() while splhi(), remove unneeded coherence() after tmpunmap(), splhi() in l2free() we have to call tmpmap() with interrupts disabled as the map is a per cpu and a interrupt can preempt us while we where commited to use a entry but *before* we wrote it! tmpunmap() already calls coherence() before flushpg() so it is not needed after tmpunmap(). splhi() in l2free() isnt needed as l2free() is always called with interrupts disabled from mmuswitch() and mmurelease().
--- a/sys/src/9/zynq/mmu.c
+++ b/sys/src/9/zynq/mmu.c
@@ -100,13 +100,11 @@
static void
l2free(Proc *proc)
{
- int s;
ulong *t;
Page *p, **l;
if(proc->l1 == nil || proc->mmuused == nil)
return;
- s = splhi();
l = &proc->mmuused;
for(p = *l; p != nil; p = p->next){
t = proc->l1->va + p->daddr;
@@ -116,7 +114,6 @@
*t = 0;
l = &p->next;
}
- splx(s);
*l = proc->mmufree;
proc->mmufree = proc->mmuused;
proc->mmuused = 0;
@@ -143,6 +140,7 @@
ulong *l2;
PTE old;
uintptr l2p;
+ int s;
if(up->l1 == nil)
upallocl1();
@@ -150,11 +148,15 @@
pa |= L2CACHED;
e = &up->l1->va[L1RX(va)];
if((*e & 3) == 0){
- if(up->mmufree != nil){
- p = up->mmufree;
+ p = up->mmufree;
+ if(p != nil)
up->mmufree = p->next;
- }else
+ else
p = newpage(0, 0, 0);
+ p->daddr = L1RX(va);
+ p->next = up->mmuused;
+ up->mmuused = p;
+ s = splhi();
l2p = p->pa;
l2 = tmpmap(l2p);
memset(l2, 0, BY2PG);
@@ -164,10 +166,8 @@
e[2] = e[1] + L2SZ;
e[3] = e[2] + L2SZ;
coherence();
- p->daddr = L1RX(va);
- p->next = up->mmuused;
- up->mmuused = p;
}else{
+ s = splhi();
l2p = *e & ~(BY2PG - 1);
l2 = tmpmap(l2p);
}
@@ -175,7 +175,7 @@
old = *e;
*e = pa | L2VALID | L2USER | L2LOCAL;
tmpunmap(l2);
- coherence();
+ splx(s);
if((old & L2VALID) != 0)
flushpg((void *) va);
if(pg->cachectl[0] == PG_TXTFLUSH){
@@ -274,8 +274,7 @@
kmap(Page *page)
{
ulong *e, *v;
- int i;
- ulong s;
+ int i, s;
if(up == nil)
panic("kmap: up=0 pc=%#.8lux", getcallerpc(&page));
@@ -283,23 +282,20 @@
upallocl1();
if(up->nkmap < 0)
panic("kmap %lud %s: nkmap=%d", up->pid, up->text, up->nkmap);
- s = splhi();
up->nkmap++;
e = &up->l1->va[L1X(KMAP)];
if((*e & 3) == 0){
if(up->kmaptable != nil)
panic("kmaptable");
- spllo();
up->kmaptable = newpage(0, 0, 0);
- splhi();
+ s = splhi();
v = tmpmap(up->kmaptable->pa);
memset(v, 0, BY2PG);
v[0] = page->pa | L2KERRW | L2VALID | L2CACHED | L2LOCAL;
v[NKMAP] = up->kmaptable->pa | L2KERRW | L2VALID | L2CACHED | L2LOCAL;
tmpunmap(v);
- coherence();
- *e = up->kmaptable->pa | L1PT;
splx(s);
+ *e = up->kmaptable->pa | L1PT;
coherence();
return (KMap *) KMAP;
}
@@ -309,7 +305,6 @@
for(i = 0; i < NKMAP; i++)
if((e[i] & 3) == 0){
e[i] = page->pa | L2KERRW | L2VALID | L2CACHED | L2LOCAL;
- splx(s);
coherence();
return (KMap *) (KMAP + i * BY2PG);
}
@@ -345,6 +340,8 @@
ulong *u, *ub, *ue;
void *v;
+ if(islo())
+ panic("tmpmap: islow %#p", getcallerpc(&pa));
if(cankaddr(pa))
return KADDR(pa);
ub = (ulong *) TMAPL2(m->machno);