*** 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;