--- 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 17:12:47.000000000 +0100 @@ -144,6 +144,7 @@ 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,10 +2179,25 @@ 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,6 +2448,24 @@ } /* + * 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,15 +2532,7 @@ * 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); + con_setup_vt(currcons); } currcons = fg_console = 0; master_display_fg = vc_cons[currcons].d;