static void putiopages(int i, int n) { lock(&iopagelock); while(n--) freeio(i++); unlock(&iopagelock); }
void vunmap(void *virt, ulong length) { ulong v, *l2; if((ulong)virt < IZERO || (ulong)virt >= IZERO + NIOPAGES * BY2PG) panic("vunmap: virt=%p", virt); v = (ROUNDDN((ulong) virt, BY2PG) - IZERO) / BY2PG; length = (ROUNDUP(((ulong) virt) + length, BY2PG) - ROUNDDN((ulong) virt, BY2PG)) / BY2PG; if(length == 0) return; l2 = KADDR(IOPT); l2 += v; lock(&iopagelock); while(length--){ *l2++ = 0; freeio(v++); } unlock(&iopagelock); flushtlb(); }
void freetree(struct trenod *t) { if (t) { int type; type = t->tretyp & COMMSK; switch (type) { case TFND: { struct fndnod *f = fndptr(t); if (f->fndref > 0) { f->fndref--; return; } free(f->fndnam); freetree(f->fndval); break; } case TCOM: freeio(comptr(t)->comio); free_arg(comptr(t)->comarg); free_arg(comptr(t)->comset); break; case TFORK: freeio(forkptr(t)->forkio); freetree(forkptr(t)->forktre); break; case TPAR: freetree(parptr(t)->partre); break; case TFIL: case TLST: case TAND: case TORF: freetree(lstptr(t)->lstlef); freetree(lstptr(t)->lstrit); break; case TFOR: { struct fornod *f = (struct fornod *)t; free(f->fornam); freetree(f->fortre); if (f->forlst) { freeio(f->forlst->comio); free_arg(f->forlst->comarg); free_arg(f->forlst->comset); free(f->forlst); } } break; case TWH: case TUN: freetree(whptr(t)->whtre); freetree(whptr(t)->dotre); break; case TIF: freetree(ifptr(t)->iftre); freetree(ifptr(t)->thtre); freetree(ifptr(t)->eltre); break; case TSW: free(swptr(t)->swarg); freereg(swptr(t)->swlst); break; } free(t); } }