Messages in this thread | | | Date | Sat, 29 Nov 2003 00:49:50 +0100 | From | Baptiste Malguy <> | Subject | [PATCH] VT driver/char/console.c, kernel 2.4.22 |
| |
Hello,
Abstract: -----------
This patch makes effective the ability to redirect kernel messages to a specific VT through the 'console=' argument. It is already supposed to work (that is, kernel messages only appear on /dev/tty1 or /dev/tty2 or ...) but actually does not (messages are always sent to the foreground console, that is /dev/tty or /dev/tty0).
Sebastian Schmidt <yath -at- yath.eu.org> already noticed the problem in March 2003. Benjamin Reed <breed -at- almaden.ibm.com> wrote a patch two years ago to correct this. Here is a link to his post: http://www.ussg.iu.edu/hypermail/linux/kernel/0108.2/1455.html It seems have never been taken in account.
The patch I made is almost based on Benjamin's patch, completing its effectiveness via vt_console_setup().
Relative comment: ---------------------
In relation to this patch, I want to say that many many websites, FAQs, ... say that you must have something like console="/dev/ttyX CONSOLE=/dev/ttyN" to redirect the kernel and init messages.
About 'CONSOLE=', that's true because this is a environment variable that /sbin/init obtains. About 'console=', it's completly wrong ! 'console=' expects a driver name (example: "tty", "tty1", "ttyS0"), not device file name. Only the Linux source code reading and a few websites says the right usage of 'console='.
Question ----------- Is the way I attached the patch "correct" ? Must I Cc: it to Marcello or someone else ? I didn't find the ideal maintainer in linux/MAINTAINERS.
Bye.
-- Baptiste Malguy - http://baptiste.malguy.net Ingénieur en informatique libre
*** linux-2.4.22/drivers/char/console.c 2002-11-29 00:53:12.000000000 +0100 --- work/linux-2.4.22-bm1/drivers/char/console.c 2003-11-28 16:45:58.000000000 +0100 *************** *** 144,149 **** --- 144,150 ---- static int con_open(struct tty_struct *, struct file *); static void vc_init(unsigned int console, unsigned int rows, unsigned int cols, int do_clear); + static void con_setup_vt(unsigned int currcons); static void blank_screen(unsigned long dummy); static void gotoxy(int currcons, int new_x, int new_y); static void save_cur(int currcons); *************** *** 2178,2187 **** --- 2179,2203 ---- return MKDEV(TTY_MAJOR, c->index ? c->index : fg_console + 1); } + int vt_console_setup(struct console *co, char *options) + { + if (co == NULL) + return -1; + + if (co->index > 0 && + co->index < MAX_NR_CONSOLES) { + con_setup_vt(co->index - 1); + kmsg_redirect = co->index; + } + + return 0; + } + struct console vt_console_driver = { name: "tty", write: vt_console_print, device: vt_console_device, + setup: vt_console_setup, unblank: unblank_screen, flags: CON_PRINTBUFFER, index: -1, *************** *** 2432,2437 **** --- 2448,2471 ---- } /* + * Setup a new VT + */ + static void __init con_setup_vt(unsigned int currcons) + { + if (vc_cons[currcons].d) return; + + vc_cons[currcons].d = (struct vc_data *) + alloc_bootmem(sizeof(struct vc_data)); + vt_cons[currcons] = (struct vt_struct *) + alloc_bootmem(sizeof(struct vt_struct)); + visual_init(currcons, 1); + screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size); + kmalloced = 0; + vc_init(currcons, video_num_lines, video_num_columns, + currcons || !sw->con_save_screen); + } + + /* * This routine initializes console interrupts, and does nothing * else. If you want the screen to clear, call tty_write with * the appropriate escape-sequence. *************** *** 2498,2512 **** * kmalloc is not running yet - we use the bootmem allocator. */ for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) { ! vc_cons[currcons].d = (struct vc_data *) ! alloc_bootmem(sizeof(struct vc_data)); ! vt_cons[currcons] = (struct vt_struct *) ! alloc_bootmem(sizeof(struct vt_struct)); ! visual_init(currcons, 1); ! screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size); ! kmalloced = 0; ! vc_init(currcons, video_num_lines, video_num_columns, ! currcons || !sw->con_save_screen); } currcons = fg_console = 0; master_display_fg = vc_cons[currcons].d; --- 2532,2538 ---- * kmalloc is not running yet - we use the bootmem allocator. */ for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) { ! con_setup_vt(currcons); } currcons = fg_console = 0; master_display_fg = vc_cons[currcons].d;
| |