153925Shibler /*- 253925Shibler * Copyright (c) 1988 University of Utah. 353925Shibler * Copyright (c) 1982, 1986, 1991 The Regents of the University of California. 453925Shibler * All rights reserved. 553925Shibler * 653925Shibler * %sccs.include.proprietary.c% 753925Shibler * 853925Shibler * from: Utah $Hdr: hil_subr.c 1.1 91/11/19$ 953925Shibler * 10*56504Sbostic * @(#)hil_subr.c 7.3 (Berkeley) 10/11/92 1153925Shibler */ 1253925Shibler 13*56504Sbostic #include <sys/param.h> 14*56504Sbostic #include <sys/systm.h> 15*56504Sbostic #include <sys/ioctl.h> 16*56504Sbostic #include <sys/tty.h> 17*56504Sbostic #include <sys/clist.h> 1853925Shibler 19*56504Sbostic #include <hp/dev/hilreg.h> 2053925Shibler 2153925Shibler /* 2253925Shibler * XXX this file only exists to separate out the AT&T tainted code. 2353925Shibler */ 2453925Shibler 2553925Shibler /* 2653925Shibler * This is just a copy of the virgin q_to_b routine with minor 2753925Shibler * optimizations for HIL use. It is used because we don't have 2853925Shibler * to raise the priority to spltty() for most of the clist manipulations. 2953925Shibler */ 3053925Shibler hilq_to_b(q, cp, cc) 3153925Shibler register struct clist *q; 3253925Shibler register char *cp; 3353925Shibler { 3453925Shibler register struct cblock *bp; 3553925Shibler register int nc; 3653925Shibler char *acp; 3753925Shibler int s; 3853925Shibler extern char cwaiting; 3953925Shibler 4053925Shibler if (cc <= 0) 4153925Shibler return (0); 4253925Shibler s = splhil(); 4353925Shibler if (q->c_cc <= 0) { 4453925Shibler q->c_cc = 0; 4553925Shibler q->c_cf = q->c_cl = NULL; 4653925Shibler splx(s); 4753925Shibler return (0); 4853925Shibler } 4953925Shibler acp = cp; 5053925Shibler 5153925Shibler while (cc) { 5253925Shibler nc = sizeof (struct cblock) - ((int)q->c_cf & CROUND); 5355069Spendry nc = min(nc, cc); 5455069Spendry nc = min(nc, q->c_cc); 5553925Shibler (void) bcopy(q->c_cf, cp, (unsigned)nc); 5653925Shibler q->c_cf += nc; 5753925Shibler q->c_cc -= nc; 5853925Shibler cc -= nc; 5953925Shibler cp += nc; 6053925Shibler if (q->c_cc <= 0) { 6153925Shibler bp = (struct cblock *)(q->c_cf - 1); 6253925Shibler bp = (struct cblock *)((int)bp & ~CROUND); 6353925Shibler q->c_cf = q->c_cl = NULL; 6453925Shibler spltty(); 6553925Shibler bp->c_next = cfreelist; 6653925Shibler cfreelist = bp; 6753925Shibler cfreecount += CBSIZE; 6853925Shibler if (cwaiting) { 6953925Shibler wakeup(&cwaiting); 7053925Shibler cwaiting = 0; 7153925Shibler } 7253925Shibler break; 7353925Shibler } 7453925Shibler if (((int)q->c_cf & CROUND) == 0) { 7553925Shibler bp = (struct cblock *)(q->c_cf); 7653925Shibler bp--; 7753925Shibler q->c_cf = bp->c_next->c_info; 7853925Shibler spltty(); 7953925Shibler bp->c_next = cfreelist; 8053925Shibler cfreelist = bp; 8153925Shibler cfreecount += CBSIZE; 8253925Shibler if (cwaiting) { 8353925Shibler wakeup(&cwaiting); 8453925Shibler cwaiting = 0; 8553925Shibler } 8653925Shibler splhil(); 8753925Shibler } 8853925Shibler } 8953925Shibler splx(s); 9053925Shibler return (cp-acp); 9153925Shibler } 9253925Shibler 93