1*53925Shibler /*- 2*53925Shibler * Copyright (c) 1988 University of Utah. 3*53925Shibler * Copyright (c) 1982, 1986, 1991 The Regents of the University of California. 4*53925Shibler * All rights reserved. 5*53925Shibler * 6*53925Shibler * %sccs.include.proprietary.c% 7*53925Shibler * 8*53925Shibler * from: Utah $Hdr: hil_subr.c 1.1 91/11/19$ 9*53925Shibler * 10*53925Shibler * @(#)hil_subr.c 7.1 (Berkeley) 06/05/92 11*53925Shibler */ 12*53925Shibler 13*53925Shibler #include "sys/param.h" 14*53925Shibler #include "sys/ioctl.h" 15*53925Shibler #include "sys/tty.h" 16*53925Shibler #include "sys/clist.h" 17*53925Shibler 18*53925Shibler #include "hilreg.h" 19*53925Shibler 20*53925Shibler /* 21*53925Shibler * XXX this file only exists to separate out the AT&T tainted code. 22*53925Shibler */ 23*53925Shibler 24*53925Shibler /* 25*53925Shibler * This is just a copy of the virgin q_to_b routine with minor 26*53925Shibler * optimizations for HIL use. It is used because we don't have 27*53925Shibler * to raise the priority to spltty() for most of the clist manipulations. 28*53925Shibler */ 29*53925Shibler hilq_to_b(q, cp, cc) 30*53925Shibler register struct clist *q; 31*53925Shibler register char *cp; 32*53925Shibler { 33*53925Shibler register struct cblock *bp; 34*53925Shibler register int nc; 35*53925Shibler char *acp; 36*53925Shibler int s; 37*53925Shibler extern char cwaiting; 38*53925Shibler 39*53925Shibler if (cc <= 0) 40*53925Shibler return (0); 41*53925Shibler s = splhil(); 42*53925Shibler if (q->c_cc <= 0) { 43*53925Shibler q->c_cc = 0; 44*53925Shibler q->c_cf = q->c_cl = NULL; 45*53925Shibler splx(s); 46*53925Shibler return (0); 47*53925Shibler } 48*53925Shibler acp = cp; 49*53925Shibler 50*53925Shibler while (cc) { 51*53925Shibler nc = sizeof (struct cblock) - ((int)q->c_cf & CROUND); 52*53925Shibler nc = MIN(nc, cc); 53*53925Shibler nc = MIN(nc, q->c_cc); 54*53925Shibler (void) bcopy(q->c_cf, cp, (unsigned)nc); 55*53925Shibler q->c_cf += nc; 56*53925Shibler q->c_cc -= nc; 57*53925Shibler cc -= nc; 58*53925Shibler cp += nc; 59*53925Shibler if (q->c_cc <= 0) { 60*53925Shibler bp = (struct cblock *)(q->c_cf - 1); 61*53925Shibler bp = (struct cblock *)((int)bp & ~CROUND); 62*53925Shibler q->c_cf = q->c_cl = NULL; 63*53925Shibler spltty(); 64*53925Shibler bp->c_next = cfreelist; 65*53925Shibler cfreelist = bp; 66*53925Shibler cfreecount += CBSIZE; 67*53925Shibler if (cwaiting) { 68*53925Shibler wakeup(&cwaiting); 69*53925Shibler cwaiting = 0; 70*53925Shibler } 71*53925Shibler break; 72*53925Shibler } 73*53925Shibler if (((int)q->c_cf & CROUND) == 0) { 74*53925Shibler bp = (struct cblock *)(q->c_cf); 75*53925Shibler bp--; 76*53925Shibler q->c_cf = bp->c_next->c_info; 77*53925Shibler spltty(); 78*53925Shibler bp->c_next = cfreelist; 79*53925Shibler cfreelist = bp; 80*53925Shibler cfreecount += CBSIZE; 81*53925Shibler if (cwaiting) { 82*53925Shibler wakeup(&cwaiting); 83*53925Shibler cwaiting = 0; 84*53925Shibler } 85*53925Shibler splhil(); 86*53925Shibler } 87*53925Shibler } 88*53925Shibler splx(s); 89*53925Shibler return (cp-acp); 90*53925Shibler } 91*53925Shibler 92