SCCS-vsn: sys/vax/if/if_uba.c 4.5
-/* if_uba.c 4.4 81/12/03 */
+/* if_uba.c 4.5 81/12/09 */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
register struct ifuba *ifu;
int uban, hlen, nmr;
{
register struct ifuba *ifu;
int uban, hlen, nmr;
{
- register caddr_t cp = (caddr_t)m_pgalloc(2 * (nmr + 1));
- int i;
+ register caddr_t cp;
+ int i, ncl;
+ ncl = clrnd(nmr + CLSIZE) / CLSIZE;
+ cp = m_clalloc(2 * ncl, MPG_SPACE);
if (cp == 0)
return (0);
ifu->ifu_hlen = hlen;
ifu->ifu_uban = uban;
ifu->ifu_uba = uba_hd[uban].uh_uba;
if (cp == 0)
return (0);
ifu->ifu_hlen = hlen;
ifu->ifu_uban = uban;
ifu->ifu_uba = uba_hd[uban].uh_uba;
- ifu->ifu_r.ifrw_addr = cp + NBPG - hlen;
- ifu->ifu_w.ifrw_addr = ifu->ifu_r.ifrw_addr + (nmr + 1) * NBPG;
+ ifu->ifu_r.ifrw_addr = cp + CLBYTES - hlen;
+ ifu->ifu_w.ifrw_addr = ifu->ifu_r.ifrw_addr + ncl * CLBYTES;
if (if_ubaalloc(ifu, &ifu->ifu_r, nmr) == 0)
goto bad;
if (if_ubaalloc(ifu, &ifu->ifu_w, nmr) == 0)
goto bad2;
for (i = 0; i < nmr; i++)
if (if_ubaalloc(ifu, &ifu->ifu_r, nmr) == 0)
goto bad;
if (if_ubaalloc(ifu, &ifu->ifu_w, nmr) == 0)
goto bad2;
for (i = 0; i < nmr; i++)
- ifu->ifu_wmap[i] = ifu->ifu_w.ifrw_mr[i+1];
+ ifu->ifu_wmap[i] = ifu->ifu_w.ifrw_mr[i];
ifu->ifu_xswapd = 0;
return (1);
bad2:
ubarelse(ifu->ifu_uban, &ifu->ifu_r.ifrw_info);
bad:
ifu->ifu_xswapd = 0;
return (1);
bad2:
ubarelse(ifu->ifu_uban, &ifu->ifu_r.ifrw_info);
bad:
- m_pgfree(cp, 2 * (nmr + 1));
return (0);
ifrw->ifrw_info = info;
ifrw->ifrw_bdp = UBAI_BDP(info);
return (0);
ifrw->ifrw_info = info;
ifrw->ifrw_bdp = UBAI_BDP(info);
- ifrw->ifrw_proto = UBAMR_MRV | (UBAI_MR(info) << UBAMR_DPSHIFT);
+ ifrw->ifrw_proto = UBAMR_MRV | (UBAI_BDP(info) << UBAMR_DPSHIFT);
ifrw->ifrw_mr = &ifu->ifu_uba->uba_map[UBAI_MR(info) + 1];
return (1);
}
ifrw->ifrw_mr = &ifu->ifu_uba->uba_map[UBAI_MR(info) + 1];
return (1);
}
{
struct mbuf *top, **mp, *m;
int off = off0, len;
{
struct mbuf *top, **mp, *m;
int off = off0, len;
+ register caddr_t cp = ifu->ifu_r.ifrw_addr + ifu->ifu_hlen;
+printf("if_rubaget totlen %d off0 %d cp %x\n", totlen, off0, cp);
top = 0;
mp = ⊤
while (totlen > 0) {
top = 0;
mp = ⊤
while (totlen > 0) {
cp = ifu->ifu_r.ifrw_addr + ifu->ifu_hlen + off;
} else
len = totlen;
cp = ifu->ifu_r.ifrw_addr + ifu->ifu_hlen + off;
} else
len = totlen;
+printf("m %x len %d off %d cp %x\n", m, len, off, cp);
+ if (len >= CLBYTES) {
struct mbuf *p;
struct pte *cpte, *ppte;
int x, *ip, i;
struct mbuf *p;
struct pte *cpte, *ppte;
int x, *ip, i;
MCLGET(p, 1);
if (p == 0)
goto nopage;
MCLGET(p, 1);
if (p == 0)
goto nopage;
+ len = m->m_len = CLBYTES;
m->m_off = (int)p - (int)m;
if (!claligned(cp))
goto copy;
m->m_off = (int)p - (int)m;
if (!claligned(cp))
goto copy;
cpte = &Mbmap[mtocl(cp)*CLSIZE];
ppte = &Mbmap[mtocl(p)*CLSIZE];
x = btop(cp - ifu->ifu_r.ifrw_addr);
cpte = &Mbmap[mtocl(cp)*CLSIZE];
ppte = &Mbmap[mtocl(p)*CLSIZE];
x = btop(cp - ifu->ifu_r.ifrw_addr);
- ip = (int *)&ifu->ifu_r.ifrw_mr[x+1];
+ ip = (int *)&ifu->ifu_r.ifrw_mr[x];
for (i = 0; i < CLSIZE; i++) {
struct pte t;
t = *ppte; *ppte++ = *cpte; *cpte = t;
for (i = 0; i < CLSIZE; i++) {
struct pte t;
t = *ppte; *ppte++ = *cpte; *cpte = t;
nopage:
m->m_len = MIN(MLEN, len);
m->m_off = MMINOFF;
nopage:
m->m_len = MIN(MLEN, len);
m->m_off = MMINOFF;
+printf("nopage m->m_len %d, m %x\n", m->m_len, len);
+printf("copy %d from %x to %x", m->m_len, cp, mtod(m, caddr_t));
bcopy(cp, mtod(m, caddr_t), (unsigned)m->m_len);
cp += m->m_len;
nocopy:
bcopy(cp, mtod(m, caddr_t), (unsigned)m->m_len);
cp += m->m_len;
nocopy:
if (off == totlen) {
cp = ifu->ifu_r.ifrw_addr + ifu->ifu_hlen;
off = 0;
if (off == totlen) {
cp = ifu->ifu_r.ifrw_addr + ifu->ifu_hlen;
off = 0;
+ } else
+ totlen -= len;
cp = ifu->ifu_w.ifrw_addr;
while (m) {
dp = mtod(m, char *);
cp = ifu->ifu_w.ifrw_addr;
while (m) {
dp = mtod(m, char *);
- if (claligned(cp) && claligned(dp)) {
+ if (claligned(cp) && claligned(dp) && m->m_len == CLBYTES) {
struct pte *pte; int *ip;
pte = &Mbmap[mtocl(dp)*CLSIZE];
x = btop(cp - ifu->ifu_w.ifrw_addr);
struct pte *pte; int *ip;
pte = &Mbmap[mtocl(dp)*CLSIZE];
x = btop(cp - ifu->ifu_w.ifrw_addr);
- ip = (int *)&ifu->ifu_w.ifrw_mr[x + 1];
+ ip = (int *)&ifu->ifu_w.ifrw_mr[x];
for (i = 0; i < CLSIZE; i++)
*ip++ =
ifu->ifu_w.ifrw_proto | pte++->pg_pfnum;
for (i = 0; i < CLSIZE; i++)
*ip++ =
ifu->ifu_w.ifrw_proto | pte++->pg_pfnum;
- ifu->ifu_xswapd |= 1 << (x>>(CLSHIFT-PGSHIFT));
+ xswapd |= 1 << (x>>(CLSHIFT-PGSHIFT));
mp = m->m_next;
m->m_next = ifu->ifu_xtofree;
ifu->ifu_xtofree = m;
mp = m->m_next;
m->m_next = ifu->ifu_xtofree;
ifu->ifu_xtofree = m;
*/
cc = cp - ifu->ifu_w.ifrw_addr;
x = ((cc - ifu->ifu_hlen) + CLBYTES - 1) >> CLSHIFT;
*/
cc = cp - ifu->ifu_w.ifrw_addr;
x = ((cc - ifu->ifu_hlen) + CLBYTES - 1) >> CLSHIFT;
+ ifu->ifu_xswapd &= ~xswapd;
xswapd &= ~ifu->ifu_xswapd;
xswapd &= ~ifu->ifu_xswapd;
- if (xswapd)
- while (i = ffs(xswapd)) {
- i--;
- if (i >= x)
- break;
- xswapd &= ~(1<<i);
- i *= CLSIZE;
- for (x = 0; x < CLSIZE; x++) {
- ifu->ifu_w.ifrw_mr[i] = ifu->ifu_wmap[i];
- i++;
- }
+ while (i = ffs(ifu->ifu_xswapd)) {
+ i--;
+ if (i >= x)
+ break;
+ ifu->ifu_xswapd &= ~(1<<i);
+ i *= CLSIZE;
+ for (x = 0; x < CLSIZE; x++) {
+ ifu->ifu_w.ifrw_mr[i] = ifu->ifu_wmap[i];
+ i++;
ifu->ifu_xswapd |= xswapd;
return (cc);
}
ifu->ifu_xswapd |= xswapd;
return (cc);
}