From 8837b0dd0922c1bf147498a81f2dc78eb642fb98 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Fri, 23 May 2008 16:06:35 +0000 Subject: [PATCH] Move TTY unrelated bits out of . For some reason, the header file also contains routines of the clists and console that are used inside the TTY layer. Because the clists are not only used by the TTY layer (example: various input drivers), we'd better move the entire clist programming interface into . Also remove a declaration of nonexistent variable. The header also contains various definitions for the console code (tty_cons.c). Also move these to , because they are not implemented inside the TTY layer. While there, create separate malloc pools for the clist and console code. Approved by: philip (mentor) --- sys/kern/subr_clist.c | 8 +++++--- sys/kern/tty.c | 1 + sys/kern/tty_cons.c | 6 ++++-- sys/kern/tty_subr.c | 8 +++++--- sys/sys/clist.h | 25 ++++++++++++++++++++++++- sys/sys/cons.h | 7 +++++++ sys/sys/tty.h | 28 +--------------------------- 7 files changed, 47 insertions(+), 36 deletions(-) diff --git a/sys/kern/subr_clist.c b/sys/kern/subr_clist.c index 5b53efa73ccc..57225dbc5ea1 100644 --- a/sys/kern/subr_clist.c +++ b/sys/kern/subr_clist.c @@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$"); static void clist_init(void *); SYSINIT(clist, SI_SUB_CLIST, SI_ORDER_FIRST, clist_init, NULL); +static MALLOC_DEFINE(M_CLIST, "clist", "clist queue blocks"); + static struct cblock *cfreelist = 0; int cfreecount = 0; static int cslushcount; @@ -133,11 +135,11 @@ cblock_alloc_cblocks(number) struct cblock *cbp; for (i = 0; i < number; ++i) { - cbp = malloc(sizeof *cbp, M_TTYS, M_NOWAIT); + cbp = malloc(sizeof *cbp, M_CLIST, M_NOWAIT); if (cbp == NULL) { printf( "cblock_alloc_cblocks: M_NOWAIT malloc failed, trying M_WAITOK\n"); - cbp = malloc(sizeof *cbp, M_TTYS, M_WAITOK); + cbp = malloc(sizeof *cbp, M_CLIST, M_WAITOK); } /* * Freed cblocks have zero quotes and garbage elsewhere. @@ -192,7 +194,7 @@ cblock_free_cblocks(number) int i; for (i = 0; i < number; ++i) - free(cblock_alloc(), M_TTYS); + free(cblock_alloc(), M_CLIST); ctotcount -= number; } diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 97fc0ccd15f8..c5947ff41e74 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include diff --git a/sys/kern/tty_cons.c b/sys/kern/tty_cons.c index 99f6f5195276..ff57d820e8c7 100644 --- a/sys/kern/tty_cons.c +++ b/sys/kern/tty_cons.c @@ -66,6 +66,8 @@ __FBSDID("$FreeBSD$"); #include #include +static MALLOC_DEFINE(M_TTYCONS, "tty console", "tty console handling"); + static d_open_t cnopen; static d_close_t cnclose; static d_read_t cnread; @@ -673,7 +675,7 @@ constty_set(struct tty *tp) KASSERT(tp != NULL, ("constty_set: NULL tp")); if (consbuf == NULL) { size = consmsgbuf_size; - consbuf = malloc(size, M_TTYS, M_WAITOK); + consbuf = malloc(size, M_TTYCONS, M_WAITOK); msgbuf_init(&consmsgbuf, consbuf, size); callout_init(&conscallout, 0); } @@ -695,7 +697,7 @@ constty_clear(void) callout_stop(&conscallout); while ((c = msgbuf_getchar(&consmsgbuf)) != -1) cnputc(c); - free(consbuf, M_TTYS); + free(consbuf, M_TTYCONS); consbuf = NULL; } diff --git a/sys/kern/tty_subr.c b/sys/kern/tty_subr.c index 5b53efa73ccc..57225dbc5ea1 100644 --- a/sys/kern/tty_subr.c +++ b/sys/kern/tty_subr.c @@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$"); static void clist_init(void *); SYSINIT(clist, SI_SUB_CLIST, SI_ORDER_FIRST, clist_init, NULL); +static MALLOC_DEFINE(M_CLIST, "clist", "clist queue blocks"); + static struct cblock *cfreelist = 0; int cfreecount = 0; static int cslushcount; @@ -133,11 +135,11 @@ cblock_alloc_cblocks(number) struct cblock *cbp; for (i = 0; i < number; ++i) { - cbp = malloc(sizeof *cbp, M_TTYS, M_NOWAIT); + cbp = malloc(sizeof *cbp, M_CLIST, M_NOWAIT); if (cbp == NULL) { printf( "cblock_alloc_cblocks: M_NOWAIT malloc failed, trying M_WAITOK\n"); - cbp = malloc(sizeof *cbp, M_TTYS, M_WAITOK); + cbp = malloc(sizeof *cbp, M_CLIST, M_WAITOK); } /* * Freed cblocks have zero quotes and garbage elsewhere. @@ -192,7 +194,7 @@ cblock_free_cblocks(number) int i; for (i = 0; i < number; ++i) - free(cblock_alloc(), M_TTYS); + free(cblock_alloc(), M_CLIST); ctotcount -= number; } diff --git a/sys/sys/clist.h b/sys/sys/clist.h index 5edc145a976d..517c78253138 100644 --- a/sys/sys/clist.h +++ b/sys/sys/clist.h @@ -33,6 +33,19 @@ #ifndef _SYS_CLIST_H_ #define _SYS_CLIST_H_ +/* + * Clists are character lists, which is a variable length linked list + * of cblocks, with a count of the number of characters in the list. + */ +struct clist { + int c_cc; /* Number of characters in the clist. */ + int c_cbcount; /* Number of cblocks. */ + int c_cbmax; /* Max # cblocks allowed for this clist. */ + int c_cbreserved; /* # cblocks reserved for this clist. */ + char *c_cf; /* Pointer to the first cblock. */ + char *c_cl; /* Pointer to the last cblock. */ +}; + struct cblock { struct cblock *c_next; /* next cblock in queue */ unsigned char c_quote[CBQSIZE]; /* quoted characters */ @@ -40,8 +53,18 @@ struct cblock { }; #ifdef _KERNEL -extern struct cblock *cfree; extern int cfreecount; + +int b_to_q(char *cp, int cc, struct clist *q); +void catq(struct clist *from, struct clist *to); +void clist_alloc_cblocks(struct clist *q, int ccmax, int ccres); +void clist_free_cblocks(struct clist *q); +int getc(struct clist *q); +void ndflush(struct clist *q, int cc); +char *nextc(struct clist *q, char *cp, int *c); +int putc(int c, struct clist *q); +int q_to_b(struct clist *q, char *cp, int cc); +int unputc(struct clist *q); #endif #endif diff --git a/sys/sys/cons.h b/sys/sys/cons.h index a3229c3f5c81..14fc9614e4f7 100644 --- a/sys/sys/cons.h +++ b/sys/sys/cons.h @@ -39,6 +39,8 @@ #define _MACHINE_CONS_H_ struct consdev; +struct tty; + typedef void cn_probe_t(struct consdev *); typedef void cn_init_t(struct consdev *); typedef void cn_term_t(struct consdev *); @@ -80,6 +82,9 @@ struct consdev { #ifdef _KERNEL +extern struct msgbuf consmsgbuf; /* Message buffer for constty. */ +extern struct tty *constty; /* Temporary virtual console. */ + #define CONS_DRIVER(name, probe, init, term, getc, checkc, putc, dbctl) \ static struct consdev name##_consdev = { \ probe, init, term, getc, checkc, putc \ @@ -108,6 +113,8 @@ int cngetc(void); void cnputc(int); void cnputs(char *); int cnunavailable(void); +void constty_set(struct tty *tp); +void constty_clear(void); #endif /* _KERNEL */ diff --git a/sys/sys/tty.h b/sys/sys/tty.h index ad74f90bfe18..e887a2a14e6d 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -46,25 +46,13 @@ #ifndef _SYS_TTY_H_ #define _SYS_TTY_H_ +#include #include #include #include #include #include -/* - * Clists are character lists, which is a variable length linked list - * of cblocks, with a count of the number of characters in the list. - */ -struct clist { - int c_cc; /* Number of characters in the clist. */ - int c_cbcount; /* Number of cblocks. */ - int c_cbmax; /* Max # cblocks allowed for this clist. */ - int c_cbreserved; /* # cblocks reserved for this clist. */ - char *c_cf; /* Pointer to the first cblock. */ - char *c_cl; /* Pointer to the last cblock. */ -}; - struct tty; struct pps_state; struct cdev; @@ -313,25 +301,12 @@ MALLOC_DECLARE(M_TTYS); #define ISINIT(dev) (minor(dev) & MINOR_INIT) #define ISLOCK(dev) (minor(dev) & MINOR_LOCK) -extern struct msgbuf consmsgbuf; /* Message buffer for constty. */ -extern struct tty *constty; /* Temporary virtual console. */ extern long tk_cancc; extern long tk_nin; extern long tk_nout; extern long tk_rawcc; -int b_to_q(char *cp, int cc, struct clist *q); -void catq(struct clist *from, struct clist *to); -void clist_alloc_cblocks(struct clist *q, int ccmax, int ccres); -void clist_free_cblocks(struct clist *q); -void constty_set(struct tty *tp); -void constty_clear(void); -int getc(struct clist *q); -void ndflush(struct clist *q, int cc); -char *nextc(struct clist *q, char *cp, int *c); void nottystop(struct tty *tp, int rw); -int putc(int c, struct clist *q); -int q_to_b(struct clist *q, char *cp, int cc); void termioschars(struct termios *t); int tputchar(int c, struct tty *tp); int ttcompat(struct tty *tp, u_long com, caddr_t data, int flag); @@ -367,7 +342,6 @@ int ttyref(struct tty *tp); int ttyrel(struct tty *tp); int ttysleep(struct tty *tp, void *chan, int pri, char *wmesg, int timo); int ttywait(struct tty *tp); -int unputc(struct clist *q); static __inline int tt_open(struct tty *t, struct cdev *c)