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