xref: /csrg-svn/sys/hp/dev/hil_subr.c (revision 53925)
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