2 * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
3 * Licensed under the GPL
6 #include "linux/config.h"
7 #include "linux/posix_types.h"
9 #include "linux/tty_flip.h"
10 #include "linux/types.h"
11 #include "linux/major.h"
12 #include "linux/kdev_t.h"
13 #include "linux/console.h"
14 #include "linux/string.h"
15 #include "linux/sched.h"
16 #include "linux/list.h"
17 #include "linux/init.h"
18 #include "linux/interrupt.h"
19 #include "linux/slab.h"
20 #include "asm/current.h"
21 #include "asm/softirq.h"
22 #include "asm/hardirq.h"
24 #include "stdio_console.h"
26 #include "chan_kern.h"
27 #include "user_util.h"
28 #include "kern_util.h"
31 #include "2_5compat.h"
35 /* Referenced only by tty_driver below - presumably it's locked correctly
39 static struct tty_driver console_driver
;
41 static int console_refcount
= 0;
43 static struct chan_ops init_console_ops
= {
49 console_write
: generic_write
,
55 static struct chan init_console_chan
= {
63 ops
: &init_console_ops
,
67 void stdio_announce(char *dev_name
, int dev
)
69 printk(KERN_INFO
"Virtual console %d assigned device '%s'\n", dev
,
73 static struct chan_opts opts
= {
74 announce
: stdio_announce
,
75 xterm_title
: "Virtual Console #%d",
81 static struct line_driver driver
= {
86 type
: TTY_DRIVER_TYPE_CONSOLE
,
87 subtype
: SYSTEM_TYPE_CONSOLE
,
88 read_irq
: CONSOLE_IRQ
,
89 read_irq_name
: "console",
90 write_irq
: CONSOLE_WRITE_IRQ
,
91 write_irq_name
: "console-write",
92 symlink_from
: "ttys",
96 static struct lines console_lines
= LINES_INIT(MAX_TTYS
);
98 /* The array is initialized by line_init, which is an initcall. The
99 * individual elements are protected by individual semaphores.
101 struct line vts
[MAX_TTYS
] = { LINE_INIT(CONFIG_CON_ZERO_CHAN
, &driver
),
102 [ 1 ... MAX_TTYS
- 1 ] =
103 LINE_INIT(CONFIG_CON_CHAN
, &driver
) };
105 static int open_console(struct tty_struct
*tty
)
107 return(line_open(vts
, tty
, &opts
));
110 static int con_open(struct tty_struct
*tty
, struct file
*filp
)
112 return(open_console(tty
));
115 static void con_close(struct tty_struct
*tty
, struct file
*filp
)
117 line_close(vts
, tty
);
120 static int con_write(struct tty_struct
*tty
, int from_user
,
121 const unsigned char *buf
, int count
)
123 return(line_write(vts
, tty
, buf
, count
));
126 static void set_termios(struct tty_struct
*tty
, struct termios
* old
)
130 static int chars_in_buffer(struct tty_struct
*tty
)
135 static int con_init_done
= 0;
141 printk(KERN_INFO
"Initializing stdio console driver\n");
143 line_register_devfs(&console_lines
, &driver
, &console_driver
, vts
,
144 sizeof(vts
)/sizeof(vts
[0]));
146 lines_init(vts
, sizeof(vts
)/sizeof(vts
[0]));
148 new_title
= add_xterm_umid(opts
.xterm_title
);
149 if(new_title
!= NULL
) opts
.xterm_title
= new_title
;
156 __initcall(stdio_init
);
158 static void console_write(struct console
*console
, const char *string
,
161 if(con_init_done
) down(&vts
[console
->index
].sem
);
162 console_write_chan(&vts
[console
->index
].chan_list
, string
, len
);
163 if(con_init_done
) up(&vts
[console
->index
].sem
);
166 static struct tty_driver console_driver
= {
167 refcount
: &console_refcount
,
171 chars_in_buffer
: chars_in_buffer
,
172 set_termios
: set_termios
175 static kdev_t
console_device(struct console
*c
)
177 return mk_kdev(TTY_MAJOR
, c
->index
);
180 static int console_setup(struct console
*co
, char *options
)
185 static struct console stdiocons
= INIT_CONSOLE("tty", console_write
,
186 console_device
, console_setup
,
189 void stdio_console_init(void)
191 INIT_LIST_HEAD(&vts
[0].chan_list
);
192 list_add(&init_console_chan
.list
, &vts
[0].chan_list
);
193 register_console(&stdiocons
);
196 static int console_chan_setup(char *str
)
198 line_setup(vts
, sizeof(vts
)/sizeof(vts
[0]), str
);
202 __setup("con", console_chan_setup
);
203 __channel_help(console_chan_setup
, "con");
205 static void console_exit(void)
207 if(!con_init_done
) return;
208 close_lines(vts
, sizeof(vts
)/sizeof(vts
[0]));
211 __uml_exitcall(console_exit
);
214 * Overrides for Emacs so that we follow Linus's tabbing style.
215 * Emacs will notice this stuff at the end of the file and automatically
216 * adjust the settings for this buffer only. This must remain at the end
218 * ---------------------------------------------------------------------------
220 * c-file-style: "linux"