diff -Naur linux-2.6.11-rc3-mm2/drivers/char/console_macros.h linux-2.6.11-rc3-mm2-fb/drivers/char/console_macros.h --- linux-2.6.11-rc3-mm2/drivers/char/console_macros.h 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/console_macros.h 2005-02-18 17:31:58.171517528 -0800 @@ -0,0 +1,71 @@ +#define cons_num (vc_cons[currcons].d->vc_num) +#define video_scan_lines (vc_cons[currcons].d->vc_scan_lines) +#define sw (vc_cons[currcons].d->vc_sw) +#define screenbuf (vc_cons[currcons].d->vc_screenbuf) +#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) +#define origin (vc_cons[currcons].d->vc_origin) +#define scr_top (vc_cons[currcons].d->vc_scr_top) +#define visible_origin (vc_cons[currcons].d->vc_visible_origin) +#define scr_end (vc_cons[currcons].d->vc_scr_end) +#define pos (vc_cons[currcons].d->vc_pos) +#define top (vc_cons[currcons].d->vc_top) +#define bottom (vc_cons[currcons].d->vc_bottom) +#define x (vc_cons[currcons].d->vc_x) +#define y (vc_cons[currcons].d->vc_y) +#define vc_state (vc_cons[currcons].d->vc_state) +#define npar (vc_cons[currcons].d->vc_npar) +#define par (vc_cons[currcons].d->vc_par) +#define ques (vc_cons[currcons].d->vc_ques) +#define attr (vc_cons[currcons].d->vc_attr) +#define saved_x (vc_cons[currcons].d->vc_saved_x) +#define saved_y (vc_cons[currcons].d->vc_saved_y) +#define translate (vc_cons[currcons].d->vc_translate) +#define G0_charset (vc_cons[currcons].d->vc_G0_charset) +#define G1_charset (vc_cons[currcons].d->vc_G1_charset) +#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) +#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) +#define utf (vc_cons[currcons].d->vc_utf) +#define utf_count (vc_cons[currcons].d->vc_utf_count) +#define utf_char (vc_cons[currcons].d->vc_utf_char) +#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) +#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) +#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) +#define decscnm (vc_cons[currcons].d->vc_decscnm) +#define decom (vc_cons[currcons].d->vc_decom) +#define decawm (vc_cons[currcons].d->vc_decawm) +#define deccm (vc_cons[currcons].d->vc_deccm) +#define decim (vc_cons[currcons].d->vc_decim) +#define deccolm (vc_cons[currcons].d->vc_deccolm) +#define need_wrap (vc_cons[currcons].d->vc_need_wrap) +#define kmalloced (vc_cons[currcons].d->vc_kmalloced) +#define report_mouse (vc_cons[currcons].d->vc_report_mouse) +#define color (vc_cons[currcons].d->vc_color) +#define s_color (vc_cons[currcons].d->vc_s_color) +#define def_color (vc_cons[currcons].d->vc_def_color) +#define foreground (color & 0x0f) +#define background (color & 0xf0) +#define charset (vc_cons[currcons].d->vc_charset) +#define s_charset (vc_cons[currcons].d->vc_s_charset) +#define intensity (vc_cons[currcons].d->vc_intensity) +#define underline (vc_cons[currcons].d->vc_underline) +#define blink (vc_cons[currcons].d->vc_blink) +#define reverse (vc_cons[currcons].d->vc_reverse) +#define s_intensity (vc_cons[currcons].d->vc_s_intensity) +#define s_underline (vc_cons[currcons].d->vc_s_underline) +#define s_blink (vc_cons[currcons].d->vc_s_blink) +#define s_reverse (vc_cons[currcons].d->vc_s_reverse) +#define ulcolor (vc_cons[currcons].d->vc_ulcolor) +#define halfcolor (vc_cons[currcons].d->vc_halfcolor) +#define tab_stop (vc_cons[currcons].d->vc_tab_stop) +#define palette (vc_cons[currcons].d->vc_palette) +#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) +#define bell_duration (vc_cons[currcons].d->vc_bell_duration) +#define cursor_type (vc_cons[currcons].d->vc_cursor_type) +#define display_fg (vc_cons[currcons].d->vc_display_fg) +#define complement_mask (vc_cons[currcons].d->vc_complement_mask) +#define s_complement_mask (vc_cons[currcons].d->vc_s_complement_mask) +#define hi_font_mask (vc_cons[currcons].d->vc_hi_font_mask) + +#define vcmode (vt_cons[currcons]->vc_mode) + +#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) diff -Naur linux-2.6.11-rc3-mm2/drivers/char/consolemap.c linux-2.6.11-rc3-mm2-fb/drivers/char/consolemap.c --- linux-2.6.11-rc3-mm2/drivers/char/consolemap.c 2005-02-14 17:29:20.680884800 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/consolemap.c 2005-02-18 17:31:58.210511600 -0800 @@ -208,9 +208,9 @@ } } -unsigned short *set_translate(int m, struct vc_data *vc) +unsigned short *set_translate(int m,int currcons) { - inv_translate[vc->vc_num] = m; + inv_translate[currcons] = m; return translations[m]; } @@ -362,16 +362,15 @@ } } -void con_free_unimap(struct vc_data *vc) +void con_free_unimap(int con) { struct uni_pagedir *p; - - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; - if (!p) - return; - *vc->vc_uni_pagedir_loc = 0; - if (--p->refcount) - return; + struct vc_data *conp = vc_cons[con].d; + + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + if (!p) return; + *conp->vc_uni_pagedir_loc = 0; + if (--p->refcount) return; con_release_unimap(p); kfree(p); } @@ -443,11 +442,12 @@ } /* ui is a leftover from using a hashtable, but might be used again */ -int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui) +int con_clear_unimap(int con, struct unimapinit *ui) { struct uni_pagedir *p, *q; + struct vc_data *conp = vc_cons[con].d; - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; if (p && p->readonly) return -EIO; if (!p || --p->refcount) { q = (struct uni_pagedir *)kmalloc(sizeof(*p), GFP_KERNEL); @@ -457,7 +457,7 @@ } memset(q, 0, sizeof(*q)); q->refcount=1; - *vc->vc_uni_pagedir_loc = (unsigned long)q; + *conp->vc_uni_pagedir_loc = (unsigned long)q; } else { if (p == dflt) dflt = NULL; p->refcount++; @@ -467,12 +467,14 @@ return 0; } -int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list) +int +con_set_unimap(int con, ushort ct, struct unipair __user *list) { int err = 0, err1, i; struct uni_pagedir *p, *q; + struct vc_data *conp = vc_cons[con].d; - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; if (p->readonly) return -EIO; if (!ct) return 0; @@ -481,10 +483,10 @@ int j, k; u16 **p1, *p2, l; - err1 = con_clear_unimap(vc, NULL); + err1 = con_clear_unimap(con, NULL); if (err1) return err1; - q = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + q = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; for (i = 0, l = 0; i < 32; i++) if ((p1 = p->uni_pgdir[i])) for (j = 0; j < 32; j++) @@ -494,7 +496,7 @@ err1 = con_insert_unipair(q, l, p2[k]); if (err1) { p->refcount++; - *vc->vc_uni_pagedir_loc = (unsigned long)p; + *conp->vc_uni_pagedir_loc = (unsigned long)p; con_release_unimap(q); kfree(q); return err1; @@ -513,11 +515,11 @@ list++; } - if (con_unify_unimap(vc, p)) + if (con_unify_unimap(conp, p)) return err; for (i = 0; i <= 3; i++) - set_inverse_transl(vc, p, i); /* Update all inverse translations */ + set_inverse_transl(conp, p, i); /* Update all inverse translations */ return err; } @@ -527,18 +529,20 @@ with. This routine is executed at sys_setup time, and when the PIO_FONTRESET ioctl is called. */ -int con_set_default_unimap(struct vc_data *vc) +int +con_set_default_unimap(int con) { int i, j, err = 0, err1; u16 *q; struct uni_pagedir *p; - + struct vc_data *conp = vc_cons[con].d; + if (dflt) { - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; if (p == dflt) return 0; dflt->refcount++; - *vc->vc_uni_pagedir_loc = (unsigned long)dflt; + *conp->vc_uni_pagedir_loc = (unsigned long)dflt; if (p && --p->refcount) { con_release_unimap(p); kfree(p); @@ -548,10 +552,10 @@ /* The default font is always 256 characters */ - err = con_clear_unimap(vc, NULL); + err = con_clear_unimap(con,NULL); if (err) return err; - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; q = dfont_unitable; for (i = 0; i < 256; i++) @@ -561,42 +565,47 @@ err = err1; } - if (con_unify_unimap(vc, p)) { - dflt = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + if (con_unify_unimap(conp, p)) { + dflt = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; return err; } for (i = 0; i <= 3; i++) - set_inverse_transl(vc, p, i); /* Update all inverse translations */ + set_inverse_transl(conp, p, i); /* Update all inverse translations */ dflt = p; return err; } EXPORT_SYMBOL(con_set_default_unimap); -int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc) +int +con_copy_unimap(int dstcon, int srccon) { + struct vc_data *sconp = vc_cons[srccon].d; + struct vc_data *dconp = vc_cons[dstcon].d; struct uni_pagedir *q; - - if (!*src_vc->vc_uni_pagedir_loc) + + if (!vc_cons_allocated(srccon) || !*sconp->vc_uni_pagedir_loc) return -EINVAL; - if (*dst_vc->vc_uni_pagedir_loc == *src_vc->vc_uni_pagedir_loc) + if (*dconp->vc_uni_pagedir_loc == *sconp->vc_uni_pagedir_loc) return 0; - con_free_unimap(dst_vc); - q = (struct uni_pagedir *)*src_vc->vc_uni_pagedir_loc; + con_free_unimap(dstcon); + q = (struct uni_pagedir *)*sconp->vc_uni_pagedir_loc; q->refcount++; - *dst_vc->vc_uni_pagedir_loc = (long)q; + *dconp->vc_uni_pagedir_loc = (long)q; return 0; } -int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct, struct unipair __user *list) +int +con_get_unimap(int con, ushort ct, ushort __user *uct, struct unipair __user *list) { int i, j, k, ect; u16 **p1, *p2; struct uni_pagedir *p; + struct vc_data *conp = vc_cons[con].d; ect = 0; - if (*vc->vc_uni_pagedir_loc) { - p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + if (*conp->vc_uni_pagedir_loc) { + p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; for (i = 0; i < 32; i++) if ((p1 = p->uni_pgdir[i])) for (j = 0; j < 32; j++) @@ -616,12 +625,12 @@ return ((ect <= ct) ? 0 : -ENOMEM); } -void con_protect_unimap(struct vc_data *vc, int rdonly) +void con_protect_unimap(int con, int rdonly) { - struct uni_pagedir *p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; + struct uni_pagedir *p = (struct uni_pagedir *) + *vc_cons[con].d->vc_uni_pagedir_loc; - if (p) - p->readonly = rdonly; + if (p) p->readonly = rdonly; } int @@ -670,7 +679,7 @@ for (i = 0; i < MAX_NR_CONSOLES; i++) if (vc_cons_allocated(i) && !*vc_cons[i].d->vc_uni_pagedir_loc) - con_set_default_unimap(vc_cons[i].d); + con_set_default_unimap(i); } EXPORT_SYMBOL(con_copy_unimap); diff -Naur linux-2.6.11-rc3-mm2/drivers/char/keyboard.c linux-2.6.11-rc3-mm2-fb/drivers/char/keyboard.c --- linux-2.6.11-rc3-mm2/drivers/char/keyboard.c 2005-02-14 17:29:20.875855160 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/keyboard.c 2005-02-18 17:32:42.447786512 -0800 @@ -534,12 +534,12 @@ static void fn_scroll_forw(struct vc_data *vc, struct pt_regs *regs) { - scrollfront(vc, 0); + scrollfront(0); } static void fn_scroll_back(struct vc_data *vc, struct pt_regs *regs) { - scrollback(vc, 0); + scrollback(0); } static void fn_show_mem(struct vc_data *vc, struct pt_regs *regs) @@ -579,7 +579,7 @@ */ if (tty) do_SAK(tty); - reset_vc(vc); + reset_vc(fg_console); } static void fn_null(struct vc_data *vc, struct pt_regs *regs) diff -Naur linux-2.6.11-rc3-mm2/drivers/char/selection.c linux-2.6.11-rc3-mm2-fb/drivers/char/selection.c --- linux-2.6.11-rc3-mm2/drivers/char/selection.c 2005-02-14 17:29:20.977839656 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/selection.c 2005-02-18 17:31:58.252505216 -0800 @@ -43,13 +43,15 @@ from interrupt (via scrollback/front) */ /* set reverse video on characters s-e of console with selection. */ -static inline void highlight(const int s, const int e) +inline static void +highlight(const int s, const int e) { invert_screen(sel_cons, s, e-s+2, 1); } /* use complementary color to show the pointer */ -static inline void highlight_pointer(const int where) +inline static void +highlight_pointer(const int where) { complement_pos(sel_cons, where); } @@ -275,7 +277,7 @@ */ int paste_selection(struct tty_struct *tty) { - struct vc_data *vc = (struct vc_data *)tty->driver_data; + struct vt_struct *vt = (struct vt_struct *) tty->driver_data; int pasted = 0, count; struct tty_ldisc *ld; DECLARE_WAITQUEUE(wait, current); @@ -286,7 +288,7 @@ ld = tty_ldisc_ref_wait(tty); - add_wait_queue(&vc->paste_wait, &wait); + add_wait_queue(&vt->paste_wait, &wait); while (sel_buffer && sel_buffer_lth > pasted) { set_current_state(TASK_INTERRUPTIBLE); if (test_bit(TTY_THROTTLED, &tty->flags)) { @@ -298,7 +300,7 @@ tty->ldisc.receive_buf(tty, sel_buffer + pasted, NULL, count); pasted += count; } - remove_wait_queue(&vc->paste_wait, &wait); + remove_wait_queue(&vt->paste_wait, &wait); current->state = TASK_RUNNING; tty_ldisc_deref(ld); diff -Naur linux-2.6.11-rc3-mm2/drivers/char/sysrq.c linux-2.6.11-rc3-mm2-fb/drivers/char/sysrq.c --- linux-2.6.11-rc3-mm2/drivers/char/sysrq.c 2005-02-14 17:29:21.023832664 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/sysrq.c 2005-02-18 17:31:58.258504304 -0800 @@ -33,9 +33,10 @@ #include /* for fsync_bdev() */ #include #include -#include #include + +extern void reset_vc(unsigned int); #ifdef CONFIG_KGDB_SYSRQ #define GDB_OP &kgdb_op @@ -87,7 +88,7 @@ { if (tty) do_SAK(tty); - reset_vc(vc_cons[fg_console].d); + reset_vc(fg_console); } static struct sysrq_key_op sysrq_SAK_op = { .handler = sysrq_handle_SAK, diff -Naur linux-2.6.11-rc3-mm2/drivers/char/tty_io.c linux-2.6.11-rc3-mm2-fb/drivers/char/tty_io.c --- linux-2.6.11-rc3-mm2/drivers/char/tty_io.c 2005-02-14 17:29:21.069825672 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/tty_io.c 2005-02-18 17:31:58.264503392 -0800 @@ -1786,6 +1786,7 @@ } #ifdef CONFIG_VT if (device == MKDEV(TTY_MAJOR,0)) { + extern int fg_console; extern struct tty_driver *console_driver; driver = console_driver; index = fg_console; @@ -2012,10 +2013,11 @@ return 0; #ifdef CONFIG_VT if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { + unsigned int currcons = tty->index; int rc; acquire_console_sem(); - rc = vc_resize(tty->driver_data, tmp_ws.ws_col, tmp_ws.ws_row); + rc = vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row); release_console_sem(); if (rc) return -ENXIO; diff -Naur linux-2.6.11-rc3-mm2/drivers/char/vc_screen.c linux-2.6.11-rc3-mm2-fb/drivers/char/vc_screen.c --- linux-2.6.11-rc3-mm2/drivers/char/vc_screen.c 2005-02-14 17:29:21.071825368 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/vc_screen.c 2005-02-18 17:31:58.265503240 -0800 @@ -52,17 +52,14 @@ int size; int minor = iminor(inode); int currcons = minor & 127; - struct vc_data *vc; - if (currcons == 0) currcons = fg_console; else currcons--; if (!vc_cons_allocated(currcons)) return -ENXIO; - vc = vc_cons[currcons].d; - size = vc->vc_rows * vc->vc_cols; + size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_cols; if (minor & 128) size = 2*size + HEADER_SIZE; @@ -445,7 +442,7 @@ buf += orig_count; pos += orig_count; if (org0) - update_region(vc, (unsigned long)(org0), org - org0); + update_region(currcons, (unsigned long)(org0), org-org0); } *ppos += written; ret = written; diff -Naur linux-2.6.11-rc3-mm2/drivers/char/vt.c linux-2.6.11-rc3-mm2-fb/drivers/char/vt.c --- linux-2.6.11-rc3-mm2/drivers/char/vt.c 2005-02-14 17:29:21.079824152 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/vt.c 2005-02-18 17:31:58.280500960 -0800 @@ -98,6 +98,8 @@ #include #include +#include "console_macros.h" + const struct consw *conswitchp; @@ -133,11 +135,11 @@ #endif static int con_open(struct tty_struct *, struct file *); -static void vc_init(struct vc_data *vc, unsigned int rows, +static void vc_init(unsigned int console, unsigned int rows, unsigned int cols, int do_clear); static void gotoxy(struct vc_data *vc, int new_x, int new_y); -static void save_cur(struct vc_data *vc); -static void reset_terminal(struct vc_data *vc, int do_clear); +static void save_cur(int currcons); +static void reset_terminal(int currcons, int do_clear); static void con_flush_chars(struct tty_struct *tty); static void set_vesa_blanking(char __user *p); static void set_cursor(struct vc_data *vc); @@ -212,12 +214,17 @@ * Low-Level Functions */ -#define IS_FG(vc) ((vc)->vc_num == fg_console) +#define IS_FG (currcons == fg_console) +#define IS_FG_VC(vc) (vc == vc_cons[fg_console].d) + +#define IS_VISIBLE CON_IS_VISIBLE(vc_cons[currcons].d) #ifdef VT_BUF_VRAM_ONLY -#define DO_UPDATE(vc) 0 +#define DO_UPDATE 0 +#define DO_UPDATE_VC(vc) 0 #else -#define DO_UPDATE(vc) CON_IS_VISIBLE(vc) +#define DO_UPDATE IS_VISIBLE +#define DO_UPDATE_VC(vc) CON_IS_VISIBLE(vc) #endif static int pm_con_request(struct pm_dev *dev, pm_request_t rqst, void *data); @@ -247,38 +254,39 @@ schedule_work(&console_work); } -static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr) +static void scrup(int currcons, unsigned int t, unsigned int b, int nr) { unsigned short *d, *s; if (t+nr >= b) nr = b - t - 1; - if (b > vc->vc_rows || t >= b || nr < 1) + if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1) return; - if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_UP, nr)) + if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr)) return; - d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); - s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr)); - scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row); - scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char, - vc->vc_size_row * nr); + d = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t); + s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*(t+nr)); + scr_memmovew(d, s, (b-t-nr) * vc_cons[currcons].d->vc_size_row); + scr_memsetw(d + (b-t-nr) * vc_cons[currcons].d->vc_cols, video_erase_char, + vc_cons[currcons].d->vc_size_row * nr); } -static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr) +static void +scrdown(int currcons, unsigned int t, unsigned int b, int nr) { unsigned short *s; unsigned int step; if (t+nr >= b) nr = b - t - 1; - if (b > vc->vc_rows || t >= b || nr < 1) + if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1) return; - if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_DOWN, nr)) + if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr)) return; - s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); - step = vc->vc_cols * nr; - scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row); - scr_memsetw(s, vc->vc_video_erase_char, 2 * step); + s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t); + step = vc_cons[currcons].d->vc_cols * nr; + scr_memmovew(s + step, s, (b-t-nr)*vc_cons[currcons].d->vc_size_row); + scr_memsetw(s, video_erase_char, 2*step); } static void do_update_region(struct vc_data *vc, unsigned long start, int count) @@ -327,23 +335,23 @@ #endif } -void update_region(struct vc_data *vc, unsigned long start, int count) +void update_region(int currcons, unsigned long start, int count) { WARN_CONSOLE_UNLOCKED(); - if (DO_UPDATE(vc)) { - hide_cursor(vc); - do_update_region(vc, start, count); - set_cursor(vc); + if (DO_UPDATE) { + hide_cursor(vc_cons[currcons].d); + do_update_region(vc_cons[currcons].d, start, count); + set_cursor(vc_cons[currcons].d); } } /* Structure of attributes is hardware-dependent */ -static u8 build_attr(struct vc_data *vc, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse) +static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse) { - if (vc->vc_sw->con_build_attr) - return vc->vc_sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse); + if (sw->con_build_attr) + return sw->con_build_attr(vc_cons[currcons].d, _color, _intensity, _blink, _underline, _reverse); #ifndef VT_BUF_VRAM_ONLY /* @@ -357,23 +365,23 @@ * Bit 7 : blink */ { - u8 a = vc->vc_color; - if (!vc->vc_can_do_color) + u8 a = color; + if (!vc_cons[currcons].d->vc_can_do_color) return _intensity | (_underline ? 4 : 0) | (_reverse ? 8 : 0) | (_blink ? 0x80 : 0); if (_underline) - a = (a & 0xf0) | vc->vc_ulcolor; + a = (a & 0xf0) | ulcolor; else if (_intensity == 0) - a = (a & 0xf0) | vc->vc_ulcolor; + a = (a & 0xf0) | halfcolor; if (_reverse) a = ((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77); if (_blink) a ^= 0x80; if (_intensity == 2) a ^= 0x08; - if (vc->vc_hi_font_mask == 0x100) + if (hi_font_mask == 0x100) a <<= 1; return a; } @@ -382,10 +390,10 @@ #endif } -static void update_attr(struct vc_data *vc) +static void update_attr(int currcons) { - vc->vc_attr = build_attr(vc, vc->vc_color, vc->vc_intensity, vc->vc_blink, vc->vc_underline, vc->vc_reverse ^ vc->vc_decscnm); - vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm) << 8) | ' '; + attr = build_attr(currcons, color, intensity, blink, underline, reverse ^ decscnm); + video_erase_char = (build_attr(currcons, color, 1, blink, 0, decscnm) << 8) | ' '; } /* Note: inverting the screen twice should revert to the original state */ @@ -429,7 +437,7 @@ } } #endif - if (DO_UPDATE(vc)) + if (DO_UPDATE_VC(vc)) do_update_region(vc, (unsigned long) p, count); } @@ -444,7 +452,7 @@ if (p) { scr_writew(old, p); - if (DO_UPDATE(vc)) + if (DO_UPDATE_VC(vc)) vc->vc_sw->con_putc(vc, old, oldy, oldx); } if (offset == -1) @@ -455,7 +463,7 @@ old = scr_readw(p); new = old ^ vc->vc_complement_mask; scr_writew(new, p); - if (DO_UPDATE(vc)) { + if (DO_UPDATE_VC(vc)) { oldx = (offset >> 1) % vc->vc_cols; oldy = (offset >> 1) / vc->vc_cols; vc->vc_sw->con_putc(vc, new, oldy, oldx); @@ -463,46 +471,48 @@ } } -static void insert_char(struct vc_data *vc, unsigned int nr) +static void insert_char(int currcons, unsigned int nr) { - unsigned short *p, *q = (unsigned short *)vc->vc_pos; + unsigned short *p, *q = (unsigned short *) pos; - p = q + vc->vc_cols - nr - vc->vc_x; + p = q + vc_cons[currcons].d->vc_cols - nr - x; while (--p >= q) scr_writew(scr_readw(p), p + nr); - scr_memsetw(q, vc->vc_video_erase_char, nr * 2); - vc->vc_need_wrap = 0; - if (DO_UPDATE(vc)) { - unsigned short oldattr = vc->vc_attr; - vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x, vc->vc_y, vc->vc_x + nr, 1, - vc->vc_cols - vc->vc_x - nr); - vc->vc_attr = vc->vc_video_erase_char >> 8; + scr_memsetw(q, video_erase_char, nr*2); + need_wrap = 0; + if (DO_UPDATE) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1, + vc_cons[currcons].d->vc_cols-x-nr); + attr = video_erase_char >> 8; while (nr--) - vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, vc->vc_x + nr); - vc->vc_attr = oldattr; + sw->con_putc(vc_cons[currcons].d, + video_erase_char,y,x+nr); + attr = oldattr; } } -static void delete_char(struct vc_data *vc, unsigned int nr) +static void delete_char(int currcons, unsigned int nr) { - unsigned int i = vc->vc_x; - unsigned short *p = (unsigned short *)vc->vc_pos; + unsigned int i = x; + unsigned short *p = (unsigned short *) pos; - while (++i <= vc->vc_cols - nr) { + while (++i <= vc_cons[currcons].d->vc_cols - nr) { scr_writew(scr_readw(p+nr), p); p++; } - scr_memsetw(p, vc->vc_video_erase_char, nr * 2); - vc->vc_need_wrap = 0; - if (DO_UPDATE(vc)) { - unsigned short oldattr = vc->vc_attr; - vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x + nr, vc->vc_y, vc->vc_x, 1, - vc->vc_cols - vc->vc_x - nr); - vc->vc_attr = vc->vc_video_erase_char >> 8; + scr_memsetw(p, video_erase_char, nr*2); + need_wrap = 0; + if (DO_UPDATE) { + unsigned short oldattr = attr; + sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1, + vc_cons[currcons].d->vc_cols-x-nr); + attr = video_erase_char >> 8; while (nr--) - vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, - vc->vc_cols - 1 - nr); - vc->vc_attr = oldattr; + sw->con_putc(vc_cons[currcons].d, + video_erase_char, y, + vc_cons[currcons].d->vc_cols-1-nr); + attr = oldattr; } } @@ -521,7 +531,7 @@ if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000; if ((type & 0x40) && ((i & 0x700) == ((i & 0x7000) >> 4))) i ^= 0x0700; scr_writew(i, (u16 *) vc->vc_pos); - if (DO_UPDATE(vc)) + if (DO_UPDATE_VC(vc)) vc->vc_sw->con_putc(vc, i, vc->vc_y, vc->vc_x); } @@ -529,7 +539,7 @@ { if (softcursor_original != -1) { scr_writew(softcursor_original, (u16 *)vc->vc_pos); - if (DO_UPDATE(vc)) + if (DO_UPDATE_VC(vc)) vc->vc_sw->con_putc(vc, softcursor_original, vc->vc_y, vc->vc_x); softcursor_original = -1; @@ -546,8 +556,8 @@ static void set_cursor(struct vc_data *vc) { - if (!IS_FG(vc) || console_blanked || - vc->vc_mode == KD_GRAPHICS) + if (!IS_FG_VC(vc) || console_blanked || + vc->vc_vt->vc_mode == KD_GRAPHICS) return; if (vc->vc_deccm) { if (vc == sel_cons) @@ -559,93 +569,98 @@ hide_cursor(vc); } -static void set_origin(struct vc_data *vc) +static void set_origin(int currcons) { WARN_CONSOLE_UNLOCKED(); - if (!CON_IS_VISIBLE(vc) || - !vc->vc_sw->con_set_origin || - !vc->vc_sw->con_set_origin(vc)) - vc->vc_origin = (unsigned long)vc->vc_screenbuf; - vc->vc_visible_origin = vc->vc_origin; - vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size; - vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x; + if (!IS_VISIBLE || + !sw->con_set_origin || + !sw->con_set_origin(vc_cons[currcons].d)) + origin = (unsigned long) screenbuf; + visible_origin = origin; + scr_end = origin + screenbuf_size; + pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x; } -static inline void save_screen(struct vc_data *vc) +static inline void save_screen(int currcons) { WARN_CONSOLE_UNLOCKED(); - if (vc->vc_sw->con_save_screen) - vc->vc_sw->con_save_screen(vc); + if (sw->con_save_screen) + sw->con_save_screen(vc_cons[currcons].d); } /* * Redrawing of screen */ -static void clear_buffer_attributes(struct vc_data *vc) +static void clear_buffer_attributes(int currcons) { - unsigned short *p = (unsigned short *)vc->vc_origin; - int count = vc->vc_screenbuf_size / 2; - int mask = vc->vc_hi_font_mask | 0xff; + unsigned short *p = (unsigned short *) origin; + int count = screenbuf_size/2; + int mask = hi_font_mask | 0xff; for (; count > 0; count--, p++) { - scr_writew((scr_readw(p)&mask) | (vc->vc_video_erase_char & ~mask), p); + scr_writew((scr_readw(p)&mask) | (video_erase_char&~mask), p); } } -void redraw_screen(struct vc_data *vc, int is_switch) +void redraw_screen(int new_console, int is_switch) { - int redraw = 0; + int redraw = 1; + int currcons, old_console; WARN_CONSOLE_UNLOCKED(); - if (!vc) { + if (!vc_cons_allocated(new_console)) { /* strange ... */ /* printk("redraw_screen: tty %d not allocated ??\n", new_console+1); */ return; } if (is_switch) { - struct vc_data *old_vc = vc_cons[fg_console].d; - if (old_vc == vc) - return; - if (!CON_IS_VISIBLE(vc)) - redraw = 1; - *vc->vc_display_fg = vc; - fg_console = vc->vc_num; - hide_cursor(old_vc); - if (!CON_IS_VISIBLE(old_vc)) { - save_screen(old_vc); - set_origin(old_vc); + currcons = fg_console; + hide_cursor(vc_cons[currcons].d); + if (fg_console != new_console) { + struct vc_data **display = vc_cons[new_console].d->vc_display_fg; + old_console = (*display) ? (*display)->vc_num : fg_console; + *display = vc_cons[new_console].d; + fg_console = new_console; + currcons = old_console; + if (!IS_VISIBLE) { + save_screen(currcons); + set_origin(currcons); + } + currcons = new_console; + if (old_console == new_console) + redraw = 0; } } else { - hide_cursor(vc); - redraw = 1; + currcons = new_console; + hide_cursor(vc_cons[currcons].d); } if (redraw) { int update; - int old_was_color = vc->vc_can_do_color; + int old_was_color = vc_cons[currcons].d->vc_can_do_color; - set_origin(vc); - update = vc->vc_sw->con_switch(vc); - set_palette(vc); + set_origin(currcons); + update = sw->con_switch(vc_cons[currcons].d); + set_palette(currcons); /* * If console changed from mono<->color, the best we can do * is to clear the buffer attributes. As it currently stands, * rebuilding new attributes from the old buffer is not doable * without overly complex code. */ - if (old_was_color != vc->vc_can_do_color) { - update_attr(vc); - clear_buffer_attributes(vc); + if (old_was_color != vc_cons[currcons].d->vc_can_do_color) { + update_attr(currcons); + clear_buffer_attributes(currcons); } - if (update && vc->vc_mode != KD_GRAPHICS) - do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2); + if (update && vcmode != KD_GRAPHICS) + do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2); } - set_cursor(vc); + set_cursor(vc_cons[currcons].d); if (is_switch) { set_leds(); compute_shiftstate(); @@ -661,30 +676,31 @@ return (i < MAX_NR_CONSOLES && vc_cons[i].d); } -static void visual_init(struct vc_data *vc, int num, int init) +static void visual_init(int currcons, int init) { - /* ++Geert: vc->vc_sw->con_init determines console size */ - if (vc->vc_sw) - module_put(vc->vc_sw->owner); - vc->vc_sw = conswitchp; + /* ++Geert: sw->con_init determines console size */ + if (sw) + module_put(sw->owner); + sw = conswitchp; #ifndef VT_SINGLE_DRIVER - if (con_driver_map[num]) - vc->vc_sw = con_driver_map[num]; + if (con_driver_map[currcons]) + sw = con_driver_map[currcons]; #endif - __module_get(vc->vc_sw->owner); - vc->vc_num = num; - vc->vc_display_fg = &master_display_fg; - vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir; - vc->vc_uni_pagedir = 0; - vc->vc_hi_font_mask = 0; - vc->vc_complement_mask = 0; - vc->vc_can_do_color = 0; - vc->vc_sw->con_init(vc, init); - if (!vc->vc_complement_mask) - vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800; - vc->vc_s_complement_mask = vc->vc_complement_mask; - vc->vc_size_row = vc->vc_cols << 1; - vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row; + __module_get(sw->owner); + cons_num = currcons; + display_fg = &master_display_fg; + vc_cons[currcons].d->vc_uni_pagedir_loc = &vc_cons[currcons].d->vc_uni_pagedir; + vc_cons[currcons].d->vc_uni_pagedir = 0; + hi_font_mask = 0; + complement_mask = 0; + vc_cons[currcons].d->vc_can_do_color = 0; + sw->con_init(vc_cons[currcons].d, init); + if (!complement_mask) + complement_mask = + vc_cons[currcons].d->vc_can_do_color ? 0x7700 : 0x0800; + s_complement_mask = complement_mask; + vc_cons[currcons].d->vc_size_row = vc_cons[currcons].d->vc_cols<<1; + screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row; } int vc_allocate(unsigned int currcons) /* return 0 on success */ @@ -694,7 +710,7 @@ if (currcons >= MAX_NR_CONSOLES) return -ENXIO; if (!vc_cons[currcons].d) { - struct vc_data *vc; + long p, q; /* prevent users from taking too much memory */ if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE)) @@ -706,22 +722,26 @@ /* although the numbers above are not valid since long ago, the point is still up-to-date and the comment still has its value even if only as a historical artifact. --mj, July 1998 */ - vc = kmalloc(sizeof(struct vc_data), GFP_KERNEL); - if (!vc) + p = (long) kmalloc(structsize, GFP_KERNEL); + if (!p) return -ENOMEM; - memset(vc, 0, sizeof(*vc)); - vc_cons[currcons].d = vc; - visual_init(vc, currcons, 1); - if (!*vc->vc_uni_pagedir_loc) - con_set_default_unimap(vc); - vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL); - if (!vc->vc_screenbuf) { - kfree(vc); + memset((void *)p, 0, structsize); + vc_cons[currcons].d = (struct vc_data *)p; + vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data)); + vc_cons[currcons].d->vc_vt = vt_cons[currcons]; + visual_init(currcons, 1); + if (!*vc_cons[currcons].d->vc_uni_pagedir_loc) + con_set_default_unimap(currcons); + q = (long)kmalloc(screenbuf_size, GFP_KERNEL); + if (!q) { + kfree((char *) p); vc_cons[currcons].d = NULL; + vt_cons[currcons] = NULL; return -ENOMEM; } - vc->vc_kmalloced = 1; - vc_init(vc, vc->vc_rows, vc->vc_cols, 1); + screenbuf = (unsigned short *) q; + kmalloced = 1; + vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols, 1); if (!pm_con) { pm_con = pm_register(PM_SYS_DEV, @@ -732,13 +752,13 @@ return 0; } -inline int resize_screen(struct vc_data *vc, int width, int height) +inline int resize_screen(int currcons, int width, int height) { /* Resizes the resolution of the display adapater */ int err = 0; - if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize) - err = vc->vc_sw->con_resize(vc, width, height); + if (vcmode != KD_GRAPHICS && sw->con_resize) + err = sw->con_resize(vc_cons[currcons].d, width, height); return err; } @@ -749,7 +769,7 @@ */ #define VC_RESIZE_MAXCOL (32767) #define VC_RESIZE_MAXROW (32767) -int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) +int vc_resize(int currcons, unsigned int cols, unsigned int lines) { unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; unsigned int old_cols, old_rows, old_row_size, old_screen_size; @@ -758,87 +778,87 @@ WARN_CONSOLE_UNLOCKED(); - if (!vc) + if (!vc_cons_allocated(currcons)) return -ENXIO; if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW) return -EINVAL; - new_cols = (cols ? cols : vc->vc_cols); - new_rows = (lines ? lines : vc->vc_rows); + new_cols = (cols ? cols : vc_cons[currcons].d->vc_cols); + new_rows = (lines ? lines : vc_cons[currcons].d->vc_rows); new_row_size = new_cols << 1; new_screen_size = new_row_size * new_rows; - if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) + if (new_cols == vc_cons[currcons].d->vc_cols && new_rows == vc_cons[currcons].d->vc_rows) return 0; newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER); if (!newscreen) return -ENOMEM; - old_rows = vc->vc_rows; - old_cols = vc->vc_cols; - old_row_size = vc->vc_size_row; - old_screen_size = vc->vc_screenbuf_size; + old_rows = vc_cons[currcons].d->vc_rows; + old_cols = vc_cons[currcons].d->vc_cols; + old_row_size = vc_cons[currcons].d->vc_size_row; + old_screen_size = screenbuf_size; - err = resize_screen(vc, new_cols, new_rows); + err = resize_screen(currcons, new_cols, new_rows); if (err) { kfree(newscreen); return err; } - vc->vc_rows = new_rows; - vc->vc_cols = new_cols; - vc->vc_size_row = new_row_size; - vc->vc_screenbuf_size = new_screen_size; + vc_cons[currcons].d->vc_rows = new_rows; + vc_cons[currcons].d->vc_cols = new_cols; + vc_cons[currcons].d->vc_size_row = new_row_size; + screenbuf_size = new_screen_size; rlth = min(old_row_size, new_row_size); rrem = new_row_size - rlth; - old_origin = vc->vc_origin; + old_origin = origin; new_origin = (long) newscreen; new_scr_end = new_origin + new_screen_size; if (new_rows < old_rows) old_origin += (old_rows - new_rows) * old_row_size; - update_attr(vc); + update_attr(currcons); - while (old_origin < vc->vc_scr_end) { + while (old_origin < scr_end) { scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth); if (rrem) - scr_memsetw((void *)(new_origin + rlth), vc->vc_video_erase_char, rrem); + scr_memsetw((void *)(new_origin + rlth), video_erase_char, rrem); old_origin += old_row_size; new_origin += new_row_size; } if (new_scr_end > new_origin) - scr_memsetw((void *)new_origin, vc->vc_video_erase_char, new_scr_end - new_origin); - if (vc->vc_kmalloced) - kfree(vc->vc_screenbuf); - vc->vc_screenbuf = newscreen; - vc->vc_kmalloced = 1; - vc->vc_screenbuf_size = new_screen_size; - set_origin(vc); + scr_memsetw((void *) new_origin, video_erase_char, new_scr_end - new_origin); + if (kmalloced) + kfree(screenbuf); + screenbuf = newscreen; + kmalloced = 1; + screenbuf_size = new_screen_size; + set_origin(currcons); /* do part of a reset_terminal() */ - vc->vc_top = 0; - vc->vc_bottom = vc->vc_rows; - gotoxy(vc, vc->vc_x, vc->vc_y); - save_cur(vc); + top = 0; + bottom = vc_cons[currcons].d->vc_rows; + gotoxy(vc_cons[currcons].d, x, y); + save_cur(currcons); - if (vc->vc_tty) { - struct winsize ws, *cws = &vc->vc_tty->winsize; + if (vc_cons[currcons].d->vc_tty) { + struct winsize ws, *cws = &vc_cons[currcons].d->vc_tty->winsize; memset(&ws, 0, sizeof(ws)); - ws.ws_row = vc->vc_rows; - ws.ws_col = vc->vc_cols; - ws.ws_ypixel = vc->vc_scan_lines; + ws.ws_row = vc_cons[currcons].d->vc_rows; + ws.ws_col = vc_cons[currcons].d->vc_cols; + ws.ws_ypixel = video_scan_lines; if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) && - vc->vc_tty->pgrp > 0) - kill_pg(vc->vc_tty->pgrp, SIGWINCH, 1); + vc_cons[currcons].d->vc_tty->pgrp > 0) + kill_pg(vc_cons[currcons].d->vc_tty->pgrp, SIGWINCH, 1); *cws = ws; } - if (CON_IS_VISIBLE(vc)) - update_screen(vc); + if (IS_VISIBLE) + update_screen(currcons); return err; } @@ -848,13 +868,12 @@ WARN_CONSOLE_UNLOCKED(); if (vc_cons_allocated(currcons)) { - struct vc_data *vc = vc_cons[currcons].d; - vc->vc_sw->con_deinit(vc); - if (vc->vc_kmalloced) - kfree(vc->vc_screenbuf); - if (currcons >= MIN_NR_CONSOLES) - kfree(vc); - vc_cons[currcons].d = NULL; + sw->con_deinit(vc_cons[currcons].d); + if (kmalloced) + kfree(screenbuf); + if (currcons >= MIN_NR_CONSOLES) + kfree(vc_cons[currcons].d); + vc_cons[currcons].d = NULL; } } @@ -862,9 +881,9 @@ * VT102 emulator */ -#define set_kbd(vc, x) set_vc_kbd_mode(kbd_table + (vc)->vc_num, (x)) -#define clr_kbd(vc, x) clr_vc_kbd_mode(kbd_table + (vc)->vc_num, (x)) -#define is_kbd(vc, x) vc_kbd_mode(kbd_table + (vc)->vc_num, (x)) +#define set_kbd(x) set_vc_kbd_mode(kbd_table+currcons,x) +#define clr_kbd(x) clr_vc_kbd_mode(kbd_table+currcons,x) +#define is_kbd(x) vc_kbd_mode(kbd_table+currcons,x) #define decarm VC_REPEAT #define decckm VC_CKMODE @@ -924,268 +943,272 @@ } /* for absolute user moves, when decom is set */ -static void gotoxay(struct vc_data *vc, int new_x, int new_y) +static void gotoxay(int currcons, int new_x, int new_y) { - gotoxy(vc, new_x, vc->vc_decom ? (vc->vc_top + new_y) : new_y); + gotoxy(vc_cons[currcons].d, new_x, decom ? (top+new_y) : new_y); } -void scrollback(struct vc_data *vc, int lines) +void scrollback(int lines) { + int currcons = fg_console; + if (!lines) - lines = vc->vc_rows / 2; + lines = vc_cons[currcons].d->vc_rows/2; scrolldelta(-lines); } -void scrollfront(struct vc_data *vc, int lines) +void scrollfront(int lines) { + int currcons = fg_console; + if (!lines) - lines = vc->vc_rows / 2; + lines = vc_cons[currcons].d->vc_rows/2; scrolldelta(lines); } -static void lf(struct vc_data *vc) +static void lf(int currcons) { /* don't scroll if above bottom of scrolling region, or * if below scrolling region */ - if (vc->vc_y + 1 == vc->vc_bottom) - scrup(vc, vc->vc_top, vc->vc_bottom, 1); - else if (vc->vc_y < vc->vc_rows - 1) { - vc->vc_y++; - vc->vc_pos += vc->vc_size_row; + if (y+1 == bottom) + scrup(currcons,top,bottom,1); + else if (y < vc_cons[currcons].d->vc_rows-1) { + y++; + pos += vc_cons[currcons].d->vc_size_row; } - vc->vc_need_wrap = 0; + need_wrap = 0; } -static void ri(struct vc_data *vc) +static void ri(int currcons) { /* don't scroll if below top of scrolling region, or * if above scrolling region */ - if (vc->vc_y == vc->vc_top) - scrdown(vc, vc->vc_top, vc->vc_bottom, 1); - else if (vc->vc_y > 0) { - vc->vc_y--; - vc->vc_pos -= vc->vc_size_row; + if (y == top) + scrdown(currcons,top,bottom,1); + else if (y > 0) { + y--; + pos -= vc_cons[currcons].d->vc_size_row; } - vc->vc_need_wrap = 0; + need_wrap = 0; } -static inline void cr(struct vc_data *vc) +static inline void cr(int currcons) { - vc->vc_pos -= vc->vc_x << 1; - vc->vc_need_wrap = vc->vc_x = 0; + pos -= x<<1; + need_wrap = x = 0; } -static inline void bs(struct vc_data *vc) +static inline void bs(int currcons) { - if (vc->vc_x) { - vc->vc_pos -= 2; - vc->vc_x--; - vc->vc_need_wrap = 0; + if (x) { + pos -= 2; + x--; + need_wrap = 0; } } -static inline void del(struct vc_data *vc) +static inline void del(int currcons) { /* ignored */ } -static void csi_J(struct vc_data *vc, int vpar) +static void csi_J(int currcons, int vpar) { unsigned int count; unsigned short * start; switch (vpar) { case 0: /* erase from cursor to end of display */ - count = (vc->vc_scr_end - vc->vc_pos) >> 1; - start = (unsigned short *)vc->vc_pos; - if (DO_UPDATE(vc)) { + count = (scr_end-pos)>>1; + start = (unsigned short *) pos; + if (DO_UPDATE) { /* do in two stages */ - vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, - vc->vc_cols - vc->vc_x); - vc->vc_sw->con_clear(vc, vc->vc_y + 1, 0, - vc->vc_rows - vc->vc_y - 1, - vc->vc_cols); + sw->con_clear(vc_cons[currcons].d, y, x, 1, + vc_cons[currcons].d->vc_cols-x); + sw->con_clear(vc_cons[currcons].d, y+1, 0, + vc_cons[currcons].d->vc_rows-y-1, + vc_cons[currcons].d->vc_cols); } break; case 1: /* erase from start to cursor */ - count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1; - start = (unsigned short *)vc->vc_origin; - if (DO_UPDATE(vc)) { + count = ((pos-origin)>>1)+1; + start = (unsigned short *) origin; + if (DO_UPDATE) { /* do in two stages */ - vc->vc_sw->con_clear(vc, 0, 0, vc->vc_y, - vc->vc_cols); - vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, - vc->vc_x + 1); + sw->con_clear(vc_cons[currcons].d, 0, 0, y, + vc_cons[currcons].d->vc_cols); + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); } break; case 2: /* erase whole display */ - count = vc->vc_cols * vc->vc_rows; - start = (unsigned short *)vc->vc_origin; - if (DO_UPDATE(vc)) - vc->vc_sw->con_clear(vc, 0, 0, - vc->vc_rows, - vc->vc_cols); + count = vc_cons[currcons].d->vc_cols * vc_cons[currcons].d->vc_rows; + start = (unsigned short *) origin; + if (DO_UPDATE) + sw->con_clear(vc_cons[currcons].d, 0, 0, + vc_cons[currcons].d->vc_rows, + vc_cons[currcons].d->vc_cols); break; default: return; } - scr_memsetw(start, vc->vc_video_erase_char, 2 * count); - vc->vc_need_wrap = 0; + scr_memsetw(start, video_erase_char, 2*count); + need_wrap = 0; } -static void csi_K(struct vc_data *vc, int vpar) +static void csi_K(int currcons, int vpar) { unsigned int count; unsigned short * start; switch (vpar) { case 0: /* erase from cursor to end of line */ - count = vc->vc_cols - vc->vc_x; - start = (unsigned short *)vc->vc_pos; - if (DO_UPDATE(vc)) - vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, - vc->vc_cols - vc->vc_x); + count = vc_cons[currcons].d->vc_cols-x; + start = (unsigned short *) pos; + if (DO_UPDATE) + sw->con_clear(vc_cons[currcons].d, y, x, 1, + vc_cons[currcons].d->vc_cols-x); break; case 1: /* erase from start of line to cursor */ - start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1)); - count = vc->vc_x + 1; - if (DO_UPDATE(vc)) - vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, - vc->vc_x + 1); + start = (unsigned short *) (pos - (x<<1)); + count = x+1; + if (DO_UPDATE) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + x + 1); break; case 2: /* erase whole line */ - start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1)); - count = vc->vc_cols; - if (DO_UPDATE(vc)) - vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1, - vc->vc_cols); + start = (unsigned short *) (pos - (x<<1)); + count = vc_cons[currcons].d->vc_cols; + if (DO_UPDATE) + sw->con_clear(vc_cons[currcons].d, y, 0, 1, + vc_cons[currcons].d->vc_cols); break; default: return; } - scr_memsetw(start, vc->vc_video_erase_char, 2 * count); - vc->vc_need_wrap = 0; + scr_memsetw(start, video_erase_char, 2 * count); + need_wrap = 0; } -static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */ +static void csi_X(int currcons, int vpar) /* erase the following vpar positions */ { /* not vt100? */ int count; if (!vpar) vpar++; - count = (vpar > vc->vc_cols - vc->vc_x) ? (vc->vc_cols - vc->vc_x) : vpar; + count = (vpar > vc_cons[currcons].d->vc_cols-x) ? (vc_cons[currcons].d->vc_cols-x) : vpar; - scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * count); - if (DO_UPDATE(vc)) - vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, count); - vc->vc_need_wrap = 0; + scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count); + if (DO_UPDATE) + sw->con_clear(vc_cons[currcons].d, y, x, 1, count); + need_wrap = 0; } -static void default_attr(struct vc_data *vc) +static void default_attr(int currcons) { - vc->vc_intensity = 1; - vc->vc_underline = 0; - vc->vc_reverse = 0; - vc->vc_blink = 0; - vc->vc_color = vc->vc_def_color; + intensity = 1; + underline = 0; + reverse = 0; + blink = 0; + color = def_color; } /* console_sem is held */ -static void csi_m(struct vc_data *vc) +static void csi_m(int currcons) { int i; - for (i = 0; i <= vc->vc_npar; i++) - switch (vc->vc_par[i]) { + for (i=0;i<=npar;i++) + switch (par[i]) { case 0: /* all attributes off */ - default_attr(vc); + default_attr(currcons); break; case 1: - vc->vc_intensity = 2; + intensity = 2; break; case 2: - vc->vc_intensity = 0; + intensity = 0; break; case 4: - vc->vc_underline = 1; + underline = 1; break; case 5: - vc->vc_blink = 1; + blink = 1; break; case 7: - vc->vc_reverse = 1; + reverse = 1; break; case 10: /* ANSI X3.64-1979 (SCO-ish?) * Select primary font, don't display * control chars if defined, don't set * bit 8 on output. */ - vc->vc_translate = set_translate(vc->vc_charset == 0 - ? vc->vc_G0_charset - : vc->vc_G1_charset, vc); - vc->vc_disp_ctrl = 0; - vc->vc_toggle_meta = 0; + translate = set_translate(charset == 0 + ? G0_charset + : G1_charset,currcons); + disp_ctrl = 0; + toggle_meta = 0; break; case 11: /* ANSI X3.64-1979 (SCO-ish?) * Select first alternate font, lets * chars < 32 be displayed as ROM chars. */ - vc->vc_translate = set_translate(IBMPC_MAP, vc); - vc->vc_disp_ctrl = 1; - vc->vc_toggle_meta = 0; + translate = set_translate(IBMPC_MAP,currcons); + disp_ctrl = 1; + toggle_meta = 0; break; case 12: /* ANSI X3.64-1979 (SCO-ish?) * Select second alternate font, toggle * high bit before displaying as ROM char. */ - vc->vc_translate = set_translate(IBMPC_MAP, vc); - vc->vc_disp_ctrl = 1; - vc->vc_toggle_meta = 1; + translate = set_translate(IBMPC_MAP,currcons); + disp_ctrl = 1; + toggle_meta = 1; break; case 21: case 22: - vc->vc_intensity = 1; + intensity = 1; break; case 24: - vc->vc_underline = 0; + underline = 0; break; case 25: - vc->vc_blink = 0; + blink = 0; break; case 27: - vc->vc_reverse = 0; + reverse = 0; break; case 38: /* ANSI X3.64-1979 (SCO-ish?) * Enables underscore, white foreground * with white underscore (Linux - use * default foreground). */ - vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0); - vc->vc_underline = 1; + color = (def_color & 0x0f) | background; + underline = 1; break; case 39: /* ANSI X3.64-1979 (SCO-ish?) * Disable underline option. * Reset colour to default? It did this * before... */ - vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0); - vc->vc_underline = 0; + color = (def_color & 0x0f) | background; + underline = 0; break; case 49: - vc->vc_color = (vc->vc_def_color & 0xf0) | (vc->vc_color & 0x0f); + color = (def_color & 0xf0) | foreground; break; default: - if (vc->vc_par[i] >= 30 && vc->vc_par[i] <= 37) - vc->vc_color = color_table[vc->vc_par[i] - 30] - | (vc->vc_color & 0xf0); - else if (vc->vc_par[i] >= 40 && vc->vc_par[i] <= 47) - vc->vc_color = (color_table[vc->vc_par[i] - 40] << 4) - | (vc->vc_color & 0x0f); + if (par[i] >= 30 && par[i] <= 37) + color = color_table[par[i]-30] + | background; + else if (par[i] >= 40 && par[i] <= 47) + color = (color_table[par[i]-40]<<4) + | foreground; break; } - update_attr(vc); + update_attr(currcons); } static void respond_string(const char *p, struct tty_struct *tty) @@ -1197,11 +1220,11 @@ con_schedule_flip(tty); } -static void cursor_report(struct vc_data *vc, struct tty_struct *tty) +static void cursor_report(int currcons, struct tty_struct *tty) { char buf[40]; - sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1); + sprintf(buf, "\033[%d;%dR", y + (decom ? top+1 : 1), x+1); respond_string(buf, tty); } @@ -1227,132 +1250,130 @@ /* invoked via ioctl(TIOCLINUX) and through set_selection */ int mouse_reporting(void) { - return vc_cons[fg_console].d->vc_report_mouse; + int currcons = fg_console; + + return report_mouse; } /* console_sem is held */ -static void set_mode(struct vc_data *vc, int on_off) +static void set_mode(int currcons, int on_off) { int i; - for (i = 0; i <= vc->vc_npar; i++) - if (vc->vc_ques) { - switch(vc->vc_par[i]) { /* DEC private modes set/reset */ + for (i=0; i<=npar; i++) + if (ques) switch(par[i]) { /* DEC private modes set/reset */ case 1: /* Cursor keys send ^[Ox/^[[x */ if (on_off) - set_kbd(vc, decckm); + set_kbd(decckm); else - clr_kbd(vc, decckm); + clr_kbd(decckm); break; case 3: /* 80/132 mode switch unimplemented */ - vc->vc_deccolm = on_off; + deccolm = on_off; #if 0 - vc_resize(deccolm ? 132 : 80, vc->vc_rows); + (void) vc_resize(deccolm ? 132 : 80, vc_cons[currcons].d->vc_rows); /* this alone does not suffice; some user mode utility has to change the hardware regs */ #endif break; case 5: /* Inverted screen on/off */ - if (vc->vc_decscnm != on_off) { - vc->vc_decscnm = on_off; - invert_screen(vc, 0, vc->vc_screenbuf_size, 0); - update_attr(vc); + if (decscnm != on_off) { + decscnm = on_off; + invert_screen(vc_cons[currcons].d, 0, screenbuf_size, 0); + update_attr(currcons); } break; case 6: /* Origin relative/absolute */ - vc->vc_decom = on_off; - gotoxay(vc, 0, 0); + decom = on_off; + gotoxay(currcons,0,0); break; case 7: /* Autowrap on/off */ - vc->vc_decawm = on_off; + decawm = on_off; break; case 8: /* Autorepeat on/off */ if (on_off) - set_kbd(vc, decarm); + set_kbd(decarm); else - clr_kbd(vc, decarm); + clr_kbd(decarm); break; case 9: - vc->vc_report_mouse = on_off ? 1 : 0; + report_mouse = on_off ? 1 : 0; break; case 25: /* Cursor on/off */ - vc->vc_deccm = on_off; + deccm = on_off; break; case 1000: - vc->vc_report_mouse = on_off ? 2 : 0; + report_mouse = on_off ? 2 : 0; break; - } - } else { - switch(vc->vc_par[i]) { /* ANSI modes set/reset */ + } else switch(par[i]) { /* ANSI modes set/reset */ case 3: /* Monitor (display ctrls) */ - vc->vc_disp_ctrl = on_off; + disp_ctrl = on_off; break; case 4: /* Insert Mode on/off */ - vc->vc_decim = on_off; + decim = on_off; break; case 20: /* Lf, Enter == CrLf/Lf */ if (on_off) - set_kbd(vc, lnm); + set_kbd(lnm); else - clr_kbd(vc, lnm); + clr_kbd(lnm); break; - } } } /* console_sem is held */ -static void setterm_command(struct vc_data *vc) +static void setterm_command(int currcons) { - switch(vc->vc_par[0]) { + switch(par[0]) { case 1: /* set color for underline mode */ - if (vc->vc_can_do_color && - vc->vc_par[1] < 16) { - vc->vc_ulcolor = color_table[vc->vc_par[1]]; - if (vc->vc_underline) - update_attr(vc); + if (vc_cons[currcons].d->vc_can_do_color && + par[1] < 16) { + ulcolor = color_table[par[1]]; + if (underline) + update_attr(currcons); } break; case 2: /* set color for half intensity mode */ - if (vc->vc_can_do_color && - vc->vc_par[1] < 16) { - vc->vc_halfcolor = color_table[vc->vc_par[1]]; - if (vc->vc_intensity == 0) - update_attr(vc); + if (vc_cons[currcons].d->vc_can_do_color && + par[1] < 16) { + halfcolor = color_table[par[1]]; + if (intensity == 0) + update_attr(currcons); } break; case 8: /* store colors as defaults */ - vc->vc_def_color = vc->vc_attr; - if (vc->vc_hi_font_mask == 0x100) - vc->vc_def_color >>= 1; - default_attr(vc); - update_attr(vc); + def_color = attr; + if (hi_font_mask == 0x100) + def_color >>= 1; + default_attr(currcons); + update_attr(currcons); break; case 9: /* set blanking interval */ - blankinterval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ; + blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ; poke_blanked_console(); break; case 10: /* set bell frequency in Hz */ - if (vc->vc_npar >= 1) - vc->vc_bell_pitch = vc->vc_par[1]; + if (npar >= 1) + bell_pitch = par[1]; else - vc->vc_bell_pitch = DEFAULT_BELL_PITCH; + bell_pitch = DEFAULT_BELL_PITCH; break; case 11: /* set bell duration in msec */ - if (vc->vc_npar >= 1) - vc->vc_bell_duration = (vc->vc_par[1] < 2000) ? - vc->vc_par[1] * HZ / 1000 : 0; + if (npar >= 1) + bell_duration = (par[1] < 2000) ? + par[1]*HZ/1000 : 0; else - vc->vc_bell_duration = DEFAULT_BELL_DURATION; + bell_duration = DEFAULT_BELL_DURATION; break; case 12: /* bring specified console to the front */ - if (vc->vc_par[1] >= 1 && vc_cons_allocated(vc->vc_par[1] - 1)) - set_console(vc->vc_par[1] - 1); + if (par[1] >= 1 && vc_cons_allocated(par[1]-1)) + set_console(par[1] - 1); break; case 13: /* unblank the screen */ poke_blanked_console(); break; case 14: /* set vesa powerdown interval */ - vesa_off_interval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ; + vesa_off_interval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ; break; case 15: /* activate the previous console */ set_console(last_console); @@ -1361,77 +1382,77 @@ } /* console_sem is held */ -static void csi_at(struct vc_data *vc, unsigned int nr) +static void csi_at(int currcons, unsigned int nr) { - if (nr > vc->vc_cols - vc->vc_x) - nr = vc->vc_cols - vc->vc_x; + if (nr > vc_cons[currcons].d->vc_cols - x) + nr = vc_cons[currcons].d->vc_cols - x; else if (!nr) nr = 1; - insert_char(vc, nr); + insert_char(currcons, nr); } /* console_sem is held */ -static void csi_L(struct vc_data *vc, unsigned int nr) +static void csi_L(int currcons, unsigned int nr) { - if (nr > vc->vc_rows - vc->vc_y) - nr = vc->vc_rows - vc->vc_y; + if (nr > vc_cons[currcons].d->vc_rows - y) + nr = vc_cons[currcons].d->vc_rows - y; else if (!nr) nr = 1; - scrdown(vc, vc->vc_y, vc->vc_bottom, nr); - vc->vc_need_wrap = 0; + scrdown(currcons,y,bottom,nr); + need_wrap = 0; } /* console_sem is held */ -static void csi_P(struct vc_data *vc, unsigned int nr) +static void csi_P(int currcons, unsigned int nr) { - if (nr > vc->vc_cols - vc->vc_x) - nr = vc->vc_cols - vc->vc_x; + if (nr > vc_cons[currcons].d->vc_cols - x) + nr = vc_cons[currcons].d->vc_cols - x; else if (!nr) nr = 1; - delete_char(vc, nr); + delete_char(currcons, nr); } /* console_sem is held */ -static void csi_M(struct vc_data *vc, unsigned int nr) +static void csi_M(int currcons, unsigned int nr) { - if (nr > vc->vc_rows - vc->vc_y) - nr = vc->vc_rows - vc->vc_y; + if (nr > vc_cons[currcons].d->vc_rows - y) + nr = vc_cons[currcons].d->vc_rows - y; else if (!nr) nr=1; - scrup(vc, vc->vc_y, vc->vc_bottom, nr); - vc->vc_need_wrap = 0; + scrup(currcons,y,bottom,nr); + need_wrap = 0; } /* console_sem is held (except via vc_init->reset_terminal */ -static void save_cur(struct vc_data *vc) +static void save_cur(int currcons) { - vc->vc_saved_x = vc->vc_x; - vc->vc_saved_y = vc->vc_y; - vc->vc_s_intensity = vc->vc_intensity; - vc->vc_s_underline = vc->vc_underline; - vc->vc_s_blink = vc->vc_blink; - vc->vc_s_reverse = vc->vc_reverse; - vc->vc_s_charset = vc->vc_charset; - vc->vc_s_color = vc->vc_color; - vc->vc_saved_G0 = vc->vc_G0_charset; - vc->vc_saved_G1 = vc->vc_G1_charset; + saved_x = x; + saved_y = y; + s_intensity = intensity; + s_underline = underline; + s_blink = blink; + s_reverse = reverse; + s_charset = charset; + s_color = color; + saved_G0 = G0_charset; + saved_G1 = G1_charset; } /* console_sem is held */ -static void restore_cur(struct vc_data *vc) +static void restore_cur(int currcons) { - gotoxy(vc, vc->vc_saved_x, vc->vc_saved_y); - vc->vc_intensity = vc->vc_s_intensity; - vc->vc_underline = vc->vc_s_underline; - vc->vc_blink = vc->vc_s_blink; - vc->vc_reverse = vc->vc_s_reverse; - vc->vc_charset = vc->vc_s_charset; - vc->vc_color = vc->vc_s_color; - vc->vc_G0_charset = vc->vc_saved_G0; - vc->vc_G1_charset = vc->vc_saved_G1; - vc->vc_translate = set_translate(vc->vc_charset ? vc->vc_G1_charset : vc->vc_G0_charset, vc); - update_attr(vc); - vc->vc_need_wrap = 0; + gotoxy(vc_cons[currcons].d,saved_x,saved_y); + intensity = s_intensity; + underline = s_underline; + blink = s_blink; + reverse = s_reverse; + charset = s_charset; + color = s_color; + G0_charset = saved_G0; + G1_charset = saved_G1; + translate = set_translate(charset ? G1_charset : G0_charset,currcons); + update_attr(currcons); + need_wrap = 0; } enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, @@ -1439,64 +1460,64 @@ ESpalette }; /* console_sem is held (except via vc_init()) */ -static void reset_terminal(struct vc_data *vc, int do_clear) +static void reset_terminal(int currcons, int do_clear) { - vc->vc_top = 0; - vc->vc_bottom = vc->vc_rows; - vc->vc_state = ESnormal; - vc->vc_ques = 0; - vc->vc_translate = set_translate(LAT1_MAP, vc); - vc->vc_G0_charset = LAT1_MAP; - vc->vc_G1_charset = GRAF_MAP; - vc->vc_charset = 0; - vc->vc_need_wrap = 0; - vc->vc_report_mouse = 0; - vc->vc_utf = 0; - vc->vc_utf_count = 0; - - vc->vc_disp_ctrl = 0; - vc->vc_toggle_meta = 0; - - vc->vc_decscnm = 0; - vc->vc_decom = 0; - vc->vc_decawm = 1; - vc->vc_deccm = 1; - vc->vc_decim = 0; - - set_kbd(vc, decarm); - clr_kbd(vc, decckm); - clr_kbd(vc, kbdapplic); - clr_kbd(vc, lnm); - kbd_table[vc->vc_num].lockstate = 0; - kbd_table[vc->vc_num].slockstate = 0; - kbd_table[vc->vc_num].ledmode = LED_SHOW_FLAGS; - kbd_table[vc->vc_num].ledflagstate = kbd_table[vc->vc_num].default_ledflagstate; + top = 0; + bottom = vc_cons[currcons].d->vc_rows; + vc_state = ESnormal; + ques = 0; + translate = set_translate(LAT1_MAP,currcons); + G0_charset = LAT1_MAP; + G1_charset = GRAF_MAP; + charset = 0; + need_wrap = 0; + report_mouse = 0; + utf = 0; + utf_count = 0; + + disp_ctrl = 0; + toggle_meta = 0; + + decscnm = 0; + decom = 0; + decawm = 1; + deccm = 1; + decim = 0; + + set_kbd(decarm); + clr_kbd(decckm); + clr_kbd(kbdapplic); + clr_kbd(lnm); + kbd_table[currcons].lockstate = 0; + kbd_table[currcons].slockstate = 0; + kbd_table[currcons].ledmode = LED_SHOW_FLAGS; + kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate; /* do not do set_leds here because this causes an endless tasklet loop when the keyboard hasn't been initialized yet */ - vc->vc_cursor_type = CUR_DEFAULT; - vc->vc_complement_mask = vc->vc_s_complement_mask; + cursor_type = CUR_DEFAULT; + complement_mask = s_complement_mask; - default_attr(vc); - update_attr(vc); + default_attr(currcons); + update_attr(currcons); - vc->vc_tab_stop[0] = 0x01010100; - vc->vc_tab_stop[1] = - vc->vc_tab_stop[2] = - vc->vc_tab_stop[3] = - vc->vc_tab_stop[4] = 0x01010101; + tab_stop[0] = 0x01010100; + tab_stop[1] = + tab_stop[2] = + tab_stop[3] = + tab_stop[4] = 0x01010101; - vc->vc_bell_pitch = DEFAULT_BELL_PITCH; - vc->vc_bell_duration = DEFAULT_BELL_DURATION; + bell_pitch = DEFAULT_BELL_PITCH; + bell_duration = DEFAULT_BELL_DURATION; - gotoxy(vc, 0, 0); - save_cur(vc); + gotoxy(vc_cons[currcons].d, 0, 0); + save_cur(currcons); if (do_clear) - csi_J(vc, 2); + csi_J(currcons,2); } /* console_sem is held */ -static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c) +static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) { /* * Control characters can be used in the _middle_ @@ -1506,371 +1527,360 @@ case 0: return; case 7: - if (vc->vc_bell_duration) - kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration); + if (bell_duration) + kd_mksound(bell_pitch, bell_duration); return; case 8: - bs(vc); + bs(currcons); return; case 9: - vc->vc_pos -= (vc->vc_x << 1); - while (vc->vc_x < vc->vc_cols - 1) { - vc->vc_x++; - if (vc->vc_tab_stop[vc->vc_x >> 5] & (1 << (vc->vc_x & 31))) + pos -= (x << 1); + while (x < vc_cons[currcons].d->vc_cols - 1) { + x++; + if (tab_stop[x >> 5] & (1 << (x & 31))) break; } - vc->vc_pos += (vc->vc_x << 1); + pos += (x << 1); return; case 10: case 11: case 12: - lf(vc); - if (!is_kbd(vc, lnm)) + lf(currcons); + if (!is_kbd(lnm)) return; case 13: - cr(vc); + cr(currcons); return; case 14: - vc->vc_charset = 1; - vc->vc_translate = set_translate(vc->vc_G1_charset, vc); - vc->vc_disp_ctrl = 1; + charset = 1; + translate = set_translate(G1_charset,currcons); + disp_ctrl = 1; return; case 15: - vc->vc_charset = 0; - vc->vc_translate = set_translate(vc->vc_G0_charset, vc); - vc->vc_disp_ctrl = 0; + charset = 0; + translate = set_translate(G0_charset,currcons); + disp_ctrl = 0; return; case 24: case 26: - vc->vc_state = ESnormal; + vc_state = ESnormal; return; case 27: - vc->vc_state = ESesc; + vc_state = ESesc; return; case 127: - del(vc); + del(currcons); return; case 128+27: - vc->vc_state = ESsquare; + vc_state = ESsquare; return; } - switch(vc->vc_state) { + switch(vc_state) { case ESesc: - vc->vc_state = ESnormal; + vc_state = ESnormal; switch (c) { case '[': - vc->vc_state = ESsquare; + vc_state = ESsquare; return; case ']': - vc->vc_state = ESnonstd; + vc_state = ESnonstd; return; case '%': - vc->vc_state = ESpercent; + vc_state = ESpercent; return; case 'E': - cr(vc); - lf(vc); + cr(currcons); + lf(currcons); return; case 'M': - ri(vc); + ri(currcons); return; case 'D': - lf(vc); + lf(currcons); return; case 'H': - vc->vc_tab_stop[vc->vc_x >> 5] |= (1 << (vc->vc_x & 31)); + tab_stop[x >> 5] |= (1 << (x & 31)); return; case 'Z': respond_ID(tty); return; case '7': - save_cur(vc); + save_cur(currcons); return; case '8': - restore_cur(vc); + restore_cur(currcons); return; case '(': - vc->vc_state = ESsetG0; + vc_state = ESsetG0; return; case ')': - vc->vc_state = ESsetG1; + vc_state = ESsetG1; return; case '#': - vc->vc_state = EShash; + vc_state = EShash; return; case 'c': - reset_terminal(vc, 1); + reset_terminal(currcons,1); return; case '>': /* Numeric keypad */ - clr_kbd(vc, kbdapplic); + clr_kbd(kbdapplic); return; case '=': /* Appl. keypad */ - set_kbd(vc, kbdapplic); + set_kbd(kbdapplic); return; } return; case ESnonstd: if (c=='P') { /* palette escape sequence */ - for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++) - vc->vc_par[vc->vc_npar] = 0; - vc->vc_npar = 0; - vc->vc_state = ESpalette; + for (npar=0; nparvc_state = ESnormal; + reset_palette(currcons); + vc_state = ESnormal; } else - vc->vc_state = ESnormal; + vc_state = ESnormal; return; case ESpalette: if ( (c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f') ) { - vc->vc_par[vc->vc_npar++] = (c > '9' ? (c & 0xDF) - 'A' + 10 : c - '0'); - if (vc->vc_npar == 7) { - int i = vc->vc_par[0] * 3, j = 1; - vc->vc_palette[i] = 16 * vc->vc_par[j++]; - vc->vc_palette[i++] += vc->vc_par[j++]; - vc->vc_palette[i] = 16 * vc->vc_par[j++]; - vc->vc_palette[i++] += vc->vc_par[j++]; - vc->vc_palette[i] = 16 * vc->vc_par[j++]; - vc->vc_palette[i] += vc->vc_par[j]; - set_palette(vc); - vc->vc_state = ESnormal; + par[npar++] = (c>'9' ? (c&0xDF)-'A'+10 : c-'0') ; + if (npar==7) { + int i = par[0]*3, j = 1; + palette[i] = 16*par[j++]; + palette[i++] += par[j++]; + palette[i] = 16*par[j++]; + palette[i++] += par[j++]; + palette[i] = 16*par[j++]; + palette[i] += par[j]; + set_palette(currcons); + vc_state = ESnormal; } } else - vc->vc_state = ESnormal; + vc_state = ESnormal; return; case ESsquare: - for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++) - vc->vc_par[vc->vc_npar] = 0; - vc->vc_npar = 0; - vc->vc_state = ESgetpars; + for(npar = 0 ; npar < NPAR ; npar++) + par[npar] = 0; + npar = 0; + vc_state = ESgetpars; if (c == '[') { /* Function key */ - vc->vc_state=ESfunckey; + vc_state=ESfunckey; return; } - vc->vc_ques = (c == '?'); - if (vc->vc_ques) + ques = (c=='?'); + if (ques) return; case ESgetpars: - if (c == ';' && vc->vc_npar < NPAR - 1) { - vc->vc_npar++; + if (c==';' && npar='0' && c<='9') { - vc->vc_par[vc->vc_npar] *= 10; - vc->vc_par[vc->vc_npar] += c - '0'; + par[npar] *= 10; + par[npar] += c-'0'; return; - } else - vc->vc_state = ESgotpars; + } else vc_state=ESgotpars; case ESgotpars: - vc->vc_state = ESnormal; + vc_state = ESnormal; switch(c) { case 'h': - set_mode(vc, 1); + set_mode(currcons,1); return; case 'l': - set_mode(vc, 0); + set_mode(currcons,0); return; case 'c': - if (vc->vc_ques) { - if (vc->vc_par[0]) - vc->vc_cursor_type = vc->vc_par[0] | (vc->vc_par[1] << 8) | (vc->vc_par[2] << 16); + if (ques) { + if (par[0]) + cursor_type = par[0] | (par[1]<<8) | (par[2]<<16); else - vc->vc_cursor_type = CUR_DEFAULT; + cursor_type = CUR_DEFAULT; return; } break; case 'm': - if (vc->vc_ques) { + if (ques) { clear_selection(); - if (vc->vc_par[0]) - vc->vc_complement_mask = vc->vc_par[0] << 8 | vc->vc_par[1]; + if (par[0]) + complement_mask = par[0]<<8 | par[1]; else - vc->vc_complement_mask = vc->vc_s_complement_mask; + complement_mask = s_complement_mask; return; } break; case 'n': - if (!vc->vc_ques) { - if (vc->vc_par[0] == 5) + if (!ques) { + if (par[0] == 5) status_report(tty); - else if (vc->vc_par[0] == 6) - cursor_report(vc, tty); + else if (par[0] == 6) + cursor_report(currcons,tty); } return; } - if (vc->vc_ques) { - vc->vc_ques = 0; + if (ques) { + ques = 0; return; } switch(c) { case 'G': case '`': - if (vc->vc_par[0]) - vc->vc_par[0]--; - gotoxy(vc, vc->vc_par[0], vc->vc_y); + if (par[0]) par[0]--; + gotoxy(vc_cons[currcons].d, par[0], y); return; case 'A': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, vc->vc_x, vc->vc_y - vc->vc_par[0]); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, x, y-par[0]); return; case 'B': case 'e': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, vc->vc_x, vc->vc_y + vc->vc_par[0]); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, x, y+par[0]); return; case 'C': case 'a': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, vc->vc_x + vc->vc_par[0], vc->vc_y); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, x+par[0], y); return; case 'D': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, vc->vc_x - vc->vc_par[0], vc->vc_y); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, x-par[0], y); return; case 'E': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, 0, vc->vc_y + vc->vc_par[0]); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, 0, y+par[0]); return; case 'F': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - gotoxy(vc, 0, vc->vc_y - vc->vc_par[0]); + if (!par[0]) par[0]++; + gotoxy(vc_cons[currcons].d, 0, y-par[0]); return; case 'd': - if (vc->vc_par[0]) - vc->vc_par[0]--; - gotoxay(vc, vc->vc_x ,vc->vc_par[0]); + if (par[0]) par[0]--; + gotoxay(currcons,x,par[0]); return; case 'H': case 'f': - if (vc->vc_par[0]) - vc->vc_par[0]--; - if (vc->vc_par[1]) - vc->vc_par[1]--; - gotoxay(vc, vc->vc_par[1], vc->vc_par[0]); + if (par[0]) par[0]--; + if (par[1]) par[1]--; + gotoxay(currcons,par[1],par[0]); return; case 'J': - csi_J(vc, vc->vc_par[0]); + csi_J(currcons,par[0]); return; case 'K': - csi_K(vc, vc->vc_par[0]); + csi_K(currcons,par[0]); return; case 'L': - csi_L(vc, vc->vc_par[0]); + csi_L(currcons,par[0]); return; case 'M': - csi_M(vc, vc->vc_par[0]); + csi_M(currcons,par[0]); return; case 'P': - csi_P(vc, vc->vc_par[0]); + csi_P(currcons,par[0]); return; case 'c': - if (!vc->vc_par[0]) + if (!par[0]) respond_ID(tty); return; case 'g': - if (!vc->vc_par[0]) - vc->vc_tab_stop[vc->vc_x >> 5] &= ~(1 << (vc->vc_x & 31)); - else if (vc->vc_par[0] == 3) { - vc->vc_tab_stop[0] = - vc->vc_tab_stop[1] = - vc->vc_tab_stop[2] = - vc->vc_tab_stop[3] = - vc->vc_tab_stop[4] = 0; + if (!par[0]) + tab_stop[x >> 5] &= ~(1 << (x & 31)); + else if (par[0] == 3) { + tab_stop[0] = + tab_stop[1] = + tab_stop[2] = + tab_stop[3] = + tab_stop[4] = 0; } return; case 'm': - csi_m(vc); + csi_m(currcons); return; case 'q': /* DECLL - but only 3 leds */ /* map 0,1,2,3 to 0,1,2,4 */ - if (vc->vc_par[0] < 4) - setledstate(kbd_table + vc->vc_num, - (vc->vc_par[0] < 3) ? vc->vc_par[0] : 4); + if (par[0] < 4) + setledstate(kbd_table + currcons, + (par[0] < 3) ? par[0] : 4); return; case 'r': - if (!vc->vc_par[0]) - vc->vc_par[0]++; - if (!vc->vc_par[1]) - vc->vc_par[1] = vc->vc_rows; + if (!par[0]) + par[0]++; + if (!par[1]) + par[1] = vc_cons[currcons].d->vc_rows; /* Minimum allowed region is 2 lines */ - if (vc->vc_par[0] < vc->vc_par[1] && - vc->vc_par[1] <= vc->vc_rows) { - vc->vc_top = vc->vc_par[0] - 1; - vc->vc_bottom = vc->vc_par[1]; - gotoxay(vc, 0, 0); + if (par[0] < par[1] && + par[1] <= vc_cons[currcons].d->vc_rows) { + top=par[0]-1; + bottom=par[1]; + gotoxay(currcons,0,0); } return; case 's': - save_cur(vc); + save_cur(currcons); return; case 'u': - restore_cur(vc); + restore_cur(currcons); return; case 'X': - csi_X(vc, vc->vc_par[0]); + csi_X(currcons, par[0]); return; case '@': - csi_at(vc, vc->vc_par[0]); + csi_at(currcons,par[0]); return; case ']': /* setterm functions */ - setterm_command(vc); + setterm_command(currcons); return; } return; case ESpercent: - vc->vc_state = ESnormal; + vc_state = ESnormal; switch (c) { case '@': /* defined in ISO 2022 */ - vc->vc_utf = 0; + utf = 0; return; case 'G': /* prelim official escape code */ case '8': /* retained for compatibility */ - vc->vc_utf = 1; + utf = 1; return; } return; case ESfunckey: - vc->vc_state = ESnormal; + vc_state = ESnormal; return; case EShash: - vc->vc_state = ESnormal; + vc_state = ESnormal; if (c == '8') { /* DEC screen alignment test. kludge :-) */ - vc->vc_video_erase_char = - (vc->vc_video_erase_char & 0xff00) | 'E'; - csi_J(vc, 2); - vc->vc_video_erase_char = - (vc->vc_video_erase_char & 0xff00) | ' '; - do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2); + video_erase_char = + (video_erase_char & 0xff00) | 'E'; + csi_J(currcons, 2); + video_erase_char = + (video_erase_char & 0xff00) | ' '; + do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2); } return; case ESsetG0: if (c == '0') - vc->vc_G0_charset = GRAF_MAP; + G0_charset = GRAF_MAP; else if (c == 'B') - vc->vc_G0_charset = LAT1_MAP; + G0_charset = LAT1_MAP; else if (c == 'U') - vc->vc_G0_charset = IBMPC_MAP; + G0_charset = IBMPC_MAP; else if (c == 'K') - vc->vc_G0_charset = USER_MAP; - if (vc->vc_charset == 0) - vc->vc_translate = set_translate(vc->vc_G0_charset, vc); - vc->vc_state = ESnormal; + G0_charset = USER_MAP; + if (charset == 0) + translate = set_translate(G0_charset,currcons); + vc_state = ESnormal; return; case ESsetG1: if (c == '0') - vc->vc_G1_charset = GRAF_MAP; + G1_charset = GRAF_MAP; else if (c == 'B') - vc->vc_G1_charset = LAT1_MAP; + G1_charset = LAT1_MAP; else if (c == 'U') - vc->vc_G1_charset = IBMPC_MAP; + G1_charset = IBMPC_MAP; else if (c == 'K') - vc->vc_G1_charset = USER_MAP; - if (vc->vc_charset == 1) - vc->vc_translate = set_translate(vc->vc_G1_charset, vc); - vc->vc_state = ESnormal; + G1_charset = USER_MAP; + if (charset == 1) + translate = set_translate(G1_charset,currcons); + vc_state = ESnormal; return; default: - vc->vc_state = ESnormal; + vc_state = ESnormal; } } @@ -1893,7 +1903,7 @@ #define FLUSH do { } while(0); #else #define FLUSH if (draw_x >= 0) { \ - vc->vc_sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to - (u16 *)draw_from, vc->vc_y, draw_x); \ + sw->con_putcs(vc_cons[currcons].d, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x); \ draw_x = -1; \ } #endif @@ -1901,7 +1911,7 @@ int c, tc, ok, n = 0, draw_x = -1; unsigned int currcons; unsigned long draw_from = 0, draw_to = 0; - struct vc_data *vc; + struct vt_struct *vt; u16 himask, charmask; const unsigned char *orig_buf = NULL; int orig_count; @@ -1912,14 +1922,14 @@ might_sleep(); acquire_console_sem(); - vc = tty->driver_data; - if (vc == NULL) { + vt = tty->driver_data; + if (vt == NULL) { printk(KERN_ERR "vt: argh, driver_data is NULL !\n"); release_console_sem(); return 0; } - currcons = vc->vc_num; + currcons = vt->vc_num; if (!vc_cons_allocated(currcons)) { /* could this happen? */ static int error = 0; @@ -1944,19 +1954,19 @@ acquire_console_sem(); - vc = tty->driver_data; - if (vc == NULL) { + vt = tty->driver_data; + if (vt == NULL) { printk(KERN_ERR "vt: argh, driver_data _became_ NULL !\n"); release_console_sem(); goto out; } - himask = vc->vc_hi_font_mask; + himask = hi_font_mask; charmask = himask ? 0x1ff : 0xff; /* undraw cursor first */ - if (IS_FG(vc)) - hide_cursor(vc); + if (IS_FG) + hide_cursor(vc_cons[currcons].d); while (!tty->stopped && count) { int orig = *buf; @@ -1966,44 +1976,44 @@ count--; /* Do no translation at all in control states */ - if (vc->vc_state != ESnormal) { + if (vc_state != ESnormal) { tc = c; - } else if (vc->vc_utf) { + } else if (utf) { /* Combine UTF-8 into Unicode */ /* Incomplete characters silently ignored */ if(c > 0x7f) { - if (vc->vc_utf_count > 0 && (c & 0xc0) == 0x80) { - vc->vc_utf_char = (vc->vc_utf_char << 6) | (c & 0x3f); - vc->vc_utf_count--; - if (vc->vc_utf_count == 0) - tc = c = vc->vc_utf_char; + if (utf_count > 0 && (c & 0xc0) == 0x80) { + utf_char = (utf_char << 6) | (c & 0x3f); + utf_count--; + if (utf_count == 0) + tc = c = utf_char; else continue; } else { if ((c & 0xe0) == 0xc0) { - vc->vc_utf_count = 1; - vc->vc_utf_char = (c & 0x1f); + utf_count = 1; + utf_char = (c & 0x1f); } else if ((c & 0xf0) == 0xe0) { - vc->vc_utf_count = 2; - vc->vc_utf_char = (c & 0x0f); + utf_count = 2; + utf_char = (c & 0x0f); } else if ((c & 0xf8) == 0xf0) { - vc->vc_utf_count = 3; - vc->vc_utf_char = (c & 0x07); + utf_count = 3; + utf_char = (c & 0x07); } else if ((c & 0xfc) == 0xf8) { - vc->vc_utf_count = 4; - vc->vc_utf_char = (c & 0x03); + utf_count = 4; + utf_char = (c & 0x03); } else if ((c & 0xfe) == 0xfc) { - vc->vc_utf_count = 5; - vc->vc_utf_char = (c & 0x01); + utf_count = 5; + utf_char = (c & 0x01); } else - vc->vc_utf_count = 0; + utf_count = 0; continue; } } else { tc = c; - vc->vc_utf_count = 0; + utf_count = 0; } } else { /* no utf */ - tc = vc->vc_translate[vc->vc_toggle_meta ? (c | 0x80) : c]; + tc = translate[toggle_meta ? (c|0x80) : c]; } /* If the original code was a control character we @@ -2017,18 +2027,18 @@ * direct-to-font zone in UTF-8 mode. */ ok = tc && (c >= 32 || - (!vc->vc_utf && !(((vc->vc_disp_ctrl ? CTRL_ALWAYS - : CTRL_ACTION) >> c) & 1))) - && (c != 127 || vc->vc_disp_ctrl) + (!utf && !(((disp_ctrl ? CTRL_ALWAYS + : CTRL_ACTION) >> c) & 1))) + && (c != 127 || disp_ctrl) && (c != 128+27); - if (vc->vc_state == ESnormal && ok) { + if (vc_state == ESnormal && ok) { /* Now try to find out how to display it */ - tc = conv_uni_to_pc(vc, tc); + tc = conv_uni_to_pc(vc_cons[currcons].d, tc); if ( tc == -4 ) { /* If we got -4 (not found) then see if we have defined a replacement character (U+FFFD) */ - tc = conv_uni_to_pc(vc, 0xfffd); + tc = conv_uni_to_pc(vc_cons[currcons].d, 0xfffd); /* One reason for the -4 can be that we just did a clear_unimap(); @@ -2042,33 +2052,33 @@ if (tc & ~charmask) continue; /* Conversion failed */ - if (vc->vc_need_wrap || vc->vc_decim) + if (need_wrap || decim) FLUSH - if (vc->vc_need_wrap) { - cr(vc); - lf(vc); + if (need_wrap) { + cr(currcons); + lf(currcons); } - if (vc->vc_decim) - insert_char(vc, 1); + if (decim) + insert_char(currcons, 1); scr_writew(himask ? - ((vc->vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) : - (vc->vc_attr << 8) + tc, - (u16 *) vc->vc_pos); - if (DO_UPDATE(vc) && draw_x < 0) { - draw_x = vc->vc_x; - draw_from = vc->vc_pos; - } - if (vc->vc_x == vc->vc_cols - 1) { - vc->vc_need_wrap = vc->vc_decawm; - draw_to = vc->vc_pos + 2; + ((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) : + (attr << 8) + tc, + (u16 *) pos); + if (DO_UPDATE && draw_x < 0) { + draw_x = x; + draw_from = pos; + } + if (x == vc_cons[currcons].d->vc_cols - 1) { + need_wrap = decawm; + draw_to = pos+2; } else { - vc->vc_x++; - draw_to = (vc->vc_pos += 2); + x++; + draw_to = (pos+=2); } continue; } FLUSH - do_con_trol(tty, vc, orig); + do_con_trol(tty, currcons, orig); } FLUSH console_conditional_schedule(); @@ -2096,7 +2106,7 @@ if (want_console != fg_console && vc_cons_allocated(want_console)) { hide_cursor(vc_cons[fg_console].d); - change_console(vc_cons[want_console].d); + change_console(want_console); /* we only changed when the console had already been allocated - a new console is not created in an interrupt routine */ @@ -2108,10 +2118,10 @@ poke_blanked_console(); } if (scrollback_delta) { - struct vc_data *vc = vc_cons[fg_console].d; + int currcons = fg_console; clear_selection(); - if (vc->vc_mode == KD_TEXT) - vc->vc_sw->con_scrolldelta(vc, scrollback_delta); + if (vcmode == KD_TEXT) + sw->con_scrolldelta(vc_cons[currcons].d, scrollback_delta); scrollback_delta = 0; } if (blank_timer_expired) { @@ -2140,7 +2150,7 @@ void vt_console_print(struct console *co, const char *b, unsigned count) { - struct vc_data *vc = vc_cons[fg_console].d; + int currcons = fg_console; unsigned char c; static unsigned long printing; const ushort *start; @@ -2152,73 +2162,73 @@ return; if (kmsg_redirect && vc_cons_allocated(kmsg_redirect - 1)) - vc = vc_cons[kmsg_redirect - 1].d; + currcons = kmsg_redirect - 1; /* read `x' only after setting currcons properly (otherwise the `x' macro will read the x of the foreground console). */ - myx = vc->vc_x; + myx = x; - if (!vc_cons_allocated(fg_console)) { + if (!vc_cons_allocated(currcons)) { /* impossible */ /* printk("vt_console_print: tty %d not allocated ??\n", currcons+1); */ goto quit; } - if (vc->vc_mode != KD_TEXT) + if (vcmode != KD_TEXT) goto quit; /* undraw cursor first */ - if (IS_FG(vc)) - hide_cursor(vc); + if (IS_FG) + hide_cursor(vc_cons[currcons].d); - start = (ushort *)vc->vc_pos; + start = (ushort *)pos; /* Contrived structure to try to emulate original need_wrap behaviour * Problems caused when we have need_wrap set on '\n' character */ while (count--) { c = *b++; - if (c == 10 || c == 13 || c == 8 || vc->vc_need_wrap) { + if (c == 10 || c == 13 || c == 8 || need_wrap) { if (cnt > 0) { - if (CON_IS_VISIBLE(vc)) - vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x); - vc->vc_x += cnt; - if (vc->vc_need_wrap) - vc->vc_x--; + if (IS_VISIBLE) + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (need_wrap) + x--; cnt = 0; } if (c == 8) { /* backspace */ - bs(vc); - start = (ushort *)vc->vc_pos; - myx = vc->vc_x; + bs(currcons); + start = (ushort *)pos; + myx = x; continue; } if (c != 13) - lf(vc); - cr(vc); - start = (ushort *)vc->vc_pos; - myx = vc->vc_x; + lf(currcons); + cr(currcons); + start = (ushort *)pos; + myx = x; if (c == 10 || c == 13) continue; } - scr_writew((vc->vc_attr << 8) + c, (unsigned short *)vc->vc_pos); + scr_writew((attr << 8) + c, (unsigned short *) pos); cnt++; - if (myx == vc->vc_cols - 1) { - vc->vc_need_wrap = 1; + if (myx == vc_cons[currcons].d->vc_cols - 1) { + need_wrap = 1; continue; } - vc->vc_pos += 2; + pos+=2; myx++; } if (cnt > 0) { - if (CON_IS_VISIBLE(vc)) - vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x); - vc->vc_x += cnt; - if (vc->vc_x == vc->vc_cols) { - vc->vc_x--; - vc->vc_need_wrap = 1; + if (IS_VISIBLE) + sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); + x += cnt; + if (x == vc_cons[currcons].d->vc_cols) { + x--; + need_wrap = 1; } } - set_cursor(vc); + set_cursor(vc_cons[currcons].d); if (!oops_in_progress) poke_blanked_console(); @@ -2323,7 +2333,7 @@ if (get_user(lines, (s32 __user *)(p+4))) { ret = -EFAULT; } else { - scrollfront(vc_cons[fg_console].d, lines); + scrollfront(lines); ret = 0; } break; @@ -2385,9 +2395,9 @@ static void con_unthrottle(struct tty_struct *tty) { - struct vc_data *vc = tty->driver_data; + struct vt_struct *vt = tty->driver_data; - wake_up_interruptible(&vc->paste_wait); + wake_up_interruptible(&vt->paste_wait); } /* @@ -2422,16 +2432,16 @@ static void con_flush_chars(struct tty_struct *tty) { - struct vc_data *vc; + struct vt_struct *vt; if (in_interrupt()) /* from flush_to_ldisc */ return; /* if we race with con_close(), vt may be null */ acquire_console_sem(); - vc = tty->driver_data; - if (vc) - set_cursor(vc); + vt = tty->driver_data; + if (vt) + set_cursor(vc_cons[vt->vc_num].d); release_console_sem(); } @@ -2447,9 +2457,9 @@ if (tty->count == 1) { ret = vc_allocate(currcons); if (ret == 0) { - struct vc_data *vc = vc_cons[currcons].d; - tty->driver_data = vc; - vc->vc_tty = tty; + vt_cons[currcons]->vc_num = currcons; + tty->driver_data = vt_cons[currcons]; + vc_cons[currcons].d->vc_tty = tty; if (!tty->winsize.ws_row && !tty->winsize.ws_col) { tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; @@ -2476,10 +2486,11 @@ down(&tty_sem); acquire_console_sem(); if (tty && tty->count == 1) { - struct vc_data *vc = tty->driver_data; + struct vt_struct *vt; - if (vc) - vc->vc_tty = NULL; + vt = tty->driver_data; + if (vt) + vc_cons[vt->vc_num].d->vc_tty = NULL; tty->driver_data = NULL; release_console_sem(); vcs_remove_devfs(tty); @@ -2494,29 +2505,29 @@ up(&tty_sem); } -static void vc_init(struct vc_data *vc, unsigned int rows, - unsigned int cols, int do_clear) +static void vc_init(unsigned int currcons, unsigned int rows, + unsigned int cols, int do_clear) { int j, k ; - vc->vc_cols = cols; - vc->vc_rows = rows; - vc->vc_size_row = cols << 1; - vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row; - - set_origin(vc); - vc->vc_pos = vc->vc_origin; - reset_vc(vc); + vc_cons[currcons].d->vc_cols = cols; + vc_cons[currcons].d->vc_rows = rows; + vc_cons[currcons].d->vc_size_row = cols<<1; + screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row; + + set_origin(currcons); + pos = origin; + reset_vc(currcons); for (j=k=0; j<16; j++) { - vc->vc_palette[k++] = default_red[j] ; - vc->vc_palette[k++] = default_grn[j] ; - vc->vc_palette[k++] = default_blu[j] ; - } - vc->vc_def_color = 0x07; /* white */ - vc->vc_ulcolor = 0x0f; /* bold white */ - vc->vc_halfcolor = 0x08; /* grey */ - init_waitqueue_head(&vc->paste_wait); - reset_terminal(vc, do_clear); + vc_cons[currcons].d->vc_palette[k++] = default_red[j] ; + vc_cons[currcons].d->vc_palette[k++] = default_grn[j] ; + vc_cons[currcons].d->vc_palette[k++] = default_blu[j] ; + } + def_color = 0x07; /* white */ + ulcolor = 0x0f; /* bold white */ + halfcolor = 0x08; /* grey */ + init_waitqueue_head(&vt_cons[currcons]->paste_wait); + reset_terminal(currcons, do_clear); } /* @@ -2528,7 +2539,6 @@ static int __init con_init(void) { const char *display_desc = NULL; - struct vc_data *vc; unsigned int currcons = 0; acquire_console_sem(); @@ -2552,23 +2562,27 @@ * kmalloc is not running yet - we use the bootmem allocator. */ for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) { - vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data)); - visual_init(vc, currcons, 1); - vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size); - vc->vc_kmalloced = 0; - vc_init(vc, vc->vc_rows, vc->vc_cols, - currcons || !vc->vc_sw->con_save_screen); + 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)); + vc_cons[currcons].d->vc_vt = vt_cons[currcons]; + visual_init(currcons, 1); + screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size); + kmalloced = 0; + vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols, + currcons || !sw->con_save_screen); } currcons = fg_console = 0; - master_display_fg = vc = vc_cons[currcons].d; - set_origin(vc); - save_screen(vc); - gotoxy(vc, vc->vc_x, vc->vc_y); - csi_J(vc, 0); - update_screen(vc); + master_display_fg = vc_cons[currcons].d; + set_origin(currcons); + save_screen(currcons); + gotoxy(vc_cons[currcons].d, x, y); + csi_J(currcons, 0); + update_screen(fg_console); printk("Console: %s %s %dx%d", - vc->vc_can_do_color ? "colour" : "mono", - display_desc, vc->vc_cols, vc->vc_rows); + vc_cons[currcons].d->vc_can_do_color ? "colour" : "mono", + display_desc, vc_cons[currcons].d->vc_cols, vc_cons[currcons].d->vc_rows); printable = 1; printk("\n"); @@ -2662,37 +2676,37 @@ for (i = first; i <= last; i++) { int old_was_color; - struct vc_data *vc = vc_cons[i].d; + int currcons = i; if (con_driver_map[i]) module_put(con_driver_map[i]->owner); __module_get(owner); con_driver_map[i] = csw; - if (!vc || !vc->vc_sw) + if (!vc_cons[i].d || !vc_cons[i].d->vc_sw) continue; j = i; - if (CON_IS_VISIBLE(vc)) - save_screen(vc); - old_was_color = vc->vc_can_do_color; - vc->vc_sw->con_deinit(vc); - vc->vc_origin = (unsigned long)vc->vc_screenbuf; - vc->vc_visible_origin = vc->vc_origin; - vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size; - vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x; - visual_init(vc, i, 0); - update_attr(vc); + if (IS_VISIBLE) + save_screen(i); + old_was_color = vc_cons[i].d->vc_can_do_color; + vc_cons[i].d->vc_sw->con_deinit(vc_cons[i].d); + origin = (unsigned long) screenbuf; + visible_origin = origin; + scr_end = origin + screenbuf_size; + pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x; + visual_init(i, 0); + update_attr(i); /* If the console changed between mono <-> color, then * the attributes in the screenbuf will be wrong. The * following resets all attributes to something sane. */ - if (old_was_color != vc->vc_can_do_color) - clear_buffer_attributes(vc); + if (old_was_color != vc_cons[i].d->vc_can_do_color) + clear_buffer_attributes(i); - if (CON_IS_VISIBLE(vc)) - update_screen(vc); + if (IS_VISIBLE) + update_screen(i); } printk("Console: switching "); if (!deflt) @@ -2759,7 +2773,7 @@ void do_blank_screen(int entering_gfx) { - struct vc_data *vc = vc_cons[fg_console].d; + int currcons = fg_console; int i; WARN_CONSOLE_UNLOCKED(); @@ -2778,30 +2792,30 @@ /* entering graphics mode? */ if (entering_gfx) { - hide_cursor(vc); - save_screen(vc); - vc->vc_sw->con_blank(vc, -1, 1); + hide_cursor(vc_cons[currcons].d); + save_screen(currcons); + sw->con_blank(vc_cons[currcons].d, -1, 1); console_blanked = fg_console + 1; - set_origin(vc); + set_origin(currcons); return; } /* don't blank graphics */ - if (vc->vc_mode != KD_TEXT) { + if (vcmode != KD_TEXT) { console_blanked = fg_console + 1; return; } - hide_cursor(vc); + hide_cursor(vc_cons[currcons].d); del_timer_sync(&console_timer); blank_timer_expired = 0; - save_screen(vc); + save_screen(currcons); /* In case we need to reset origin, blanking hook returns 1 */ - i = vc->vc_sw->con_blank(vc, 1, 0); + i = sw->con_blank(vc_cons[currcons].d, 1, 0); console_blanked = fg_console + 1; if (i) - set_origin(vc); + set_origin(currcons); if (console_blank_hook && console_blank_hook(1)) return; @@ -2812,7 +2826,7 @@ } if (vesa_blank_mode) - vc->vc_sw->con_blank(vc, vesa_blank_mode + 1, 0); + sw->con_blank(vc_cons[currcons].d, vesa_blank_mode + 1, 0); } EXPORT_SYMBOL(do_blank_screen); @@ -2821,7 +2835,7 @@ */ void do_unblank_screen(int leaving_gfx) { - struct vc_data *vc; + int currcons; WARN_CONSOLE_UNLOCKED(); @@ -2833,8 +2847,8 @@ printk("unblank_screen: tty %d not allocated ??\n", fg_console+1); return; } - vc = vc_cons[fg_console].d; - if (vc->vc_mode != KD_TEXT) + currcons = fg_console; + if (vcmode != KD_TEXT) return; /* but leave console_blanked != 0 */ if (blankinterval) { @@ -2843,13 +2857,13 @@ } console_blanked = 0; - if (vc->vc_sw->con_blank(vc, 0, leaving_gfx)) + if (sw->con_blank(vc_cons[currcons].d, 0, leaving_gfx)) /* Low-level driver cannot restore -> do it ourselves */ - update_screen(vc); + update_screen(fg_console); if (console_blank_hook) console_blank_hook(0); - set_palette(vc); - set_cursor(vc); + set_palette(currcons); + set_cursor(vc_cons[fg_console].d); } EXPORT_SYMBOL(do_unblank_screen); @@ -2885,7 +2899,7 @@ del_timer(&console_timer); blank_timer_expired = 0; - if (ignore_poke || !vc_cons[fg_console].d || vc_cons[fg_console].d->vc_mode == KD_GRAPHICS) + if (ignore_poke || !vt_cons[fg_console] || vt_cons[fg_console]->vc_mode == KD_GRAPHICS) return; if (console_blanked) unblank_screen(); @@ -2899,12 +2913,12 @@ * Palettes */ -void set_palette(struct vc_data *vc) +void set_palette(int currcons) { WARN_CONSOLE_UNLOCKED(); - if (vc->vc_mode != KD_GRAPHICS) - vc->vc_sw->con_set_palette(vc, color_table); + if (vcmode != KD_GRAPHICS) + sw->con_set_palette(vc_cons[currcons].d, color_table); } static int set_get_cmap(unsigned char __user *arg, int set) @@ -2931,7 +2945,7 @@ vc_cons[i].d->vc_palette[k++] = default_grn[j]; vc_cons[i].d->vc_palette[k++] = default_blu[j]; } - set_palette(vc_cons[i].d); + set_palette(i); } } return 0; @@ -2964,15 +2978,15 @@ return rc; } -void reset_palette(struct vc_data *vc) +void reset_palette(int currcons) { int j, k; for (j=k=0; j<16; j++) { - vc->vc_palette[k++] = default_red[j]; - vc->vc_palette[k++] = default_grn[j]; - vc->vc_palette[k++] = default_blu[j]; + palette[k++] = default_red[j]; + palette[k++] = default_grn[j]; + palette[k++] = default_blu[j]; } - set_palette(vc); + set_palette(currcons); } /* @@ -2990,13 +3004,13 @@ #define max_font_size 65536 -int con_font_get(struct vc_data *vc, struct console_font_op *op) +int con_font_get(int currcons, struct console_font_op *op) { struct console_font font; int rc = -EINVAL; int c; - if (vc->vc_mode != KD_TEXT) + if (vt_cons[currcons]->vc_mode != KD_TEXT) return -EINVAL; if (op->data) { @@ -3007,8 +3021,8 @@ font.data = NULL; acquire_console_sem(); - if (vc->vc_sw->con_font_get) - rc = vc->vc_sw->con_font_get(vc, &font); + if (sw->con_font_get) + rc = sw->con_font_get(vc_cons[currcons].d, &font); else rc = -ENOSYS; release_console_sem(); @@ -3045,13 +3059,13 @@ return rc; } -int con_font_set(struct vc_data *vc, struct console_font_op *op) +int con_font_set(int currcons, struct console_font_op *op) { struct console_font font; int rc = -EINVAL; int size; - if (vc->vc_mode != KD_TEXT) + if (vt_cons[currcons]->vc_mode != KD_TEXT) return -EINVAL; if (!op->data) return -EINVAL; @@ -3093,8 +3107,8 @@ return -EFAULT; } acquire_console_sem(); - if (vc->vc_sw->con_font_set) - rc = vc->vc_sw->con_font_set(vc, &font, op->flags); + if (sw->con_font_set) + rc = sw->con_font_set(vc_cons[currcons].d, &font, op->flags); else rc = -ENOSYS; release_console_sem(); @@ -3102,14 +3116,14 @@ return rc; } -int con_font_default(struct vc_data *vc, struct console_font_op *op) +int con_font_default(int currcons, struct console_font_op *op) { struct console_font font = {.width = op->width, .height = op->height}; char name[MAX_FONT_NAME]; char *s = name; int rc; - if (vc->vc_mode != KD_TEXT) + if (vt_cons[currcons]->vc_mode != KD_TEXT) return -EINVAL; if (!op->data) @@ -3120,8 +3134,8 @@ name[MAX_FONT_NAME - 1] = 0; acquire_console_sem(); - if (vc->vc_sw->con_font_default) - rc = vc->vc_sw->con_font_default(vc, &font, s); + if (sw->con_font_default) + rc = sw->con_font_default(vc_cons[currcons].d, &font, s); else rc = -ENOSYS; release_console_sem(); @@ -3132,38 +3146,40 @@ return rc; } -int con_font_copy(struct vc_data *vc, struct console_font_op *op) +int con_font_copy(int currcons, struct console_font_op *op) { int con = op->height; + struct vc_data *vc; int rc; - if (vc->vc_mode != KD_TEXT) + if (vt_cons[currcons]->vc_mode != KD_TEXT) return -EINVAL; acquire_console_sem(); - if (!vc->vc_sw->con_font_copy) + vc = vc_cons[currcons].d; + if (!sw->con_font_copy) rc = -ENOSYS; else if (con < 0 || !vc_cons_allocated(con)) rc = -ENOTTY; else if (con == vc->vc_num) /* nothing to do */ rc = 0; else - rc = vc->vc_sw->con_font_copy(vc, con); + rc = sw->con_font_copy(vc, con); release_console_sem(); return rc; } -int con_font_op(struct vc_data *vc, struct console_font_op *op) +int con_font_op(int currcons, struct console_font_op *op) { switch (op->op) { case KD_FONT_OP_SET: - return con_font_set(vc, op); + return con_font_set(currcons, op); case KD_FONT_OP_GET: - return con_font_get(vc, op); + return con_font_get(currcons, op); case KD_FONT_OP_SET_DEFAULT: - return con_font_default(vc, op); + return con_font_default(currcons, op); case KD_FONT_OP_COPY: - return con_font_copy(vc, op); + return con_font_copy(currcons, op); } return -ENOSYS; } @@ -3249,6 +3265,7 @@ EXPORT_SYMBOL(fg_console); EXPORT_SYMBOL(console_blank_hook); EXPORT_SYMBOL(console_blanked); +EXPORT_SYMBOL(vt_cons); EXPORT_SYMBOL(vc_cons); #ifndef VT_SINGLE_DRIVER EXPORT_SYMBOL(take_over_console); diff -Naur linux-2.6.11-rc3-mm2/drivers/char/vt_ioctl.c linux-2.6.11-rc3-mm2-fb/drivers/char/vt_ioctl.c --- linux-2.6.11-rc3-mm2/drivers/char/vt_ioctl.c 2005-02-14 17:29:21.082823696 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/char/vt_ioctl.c 2005-02-18 17:31:58.282500656 -0800 @@ -52,6 +52,8 @@ * to the current console is done by the main ioctl code. */ +struct vt_struct *vt_cons[MAX_NR_CONSOLES]; + /* Keyboard type: Default is KB_101, but can be set by machine * specific code. */ @@ -309,7 +311,7 @@ op->height = cfdarg.charheight; op->charcount = cfdarg.charcount; op->data = cfdarg.chardata; - return con_font_op(vc_cons[fg_console].d, op); + return con_font_op(fg_console, op); case GIO_FONTX: { op->op = KD_FONT_OP_GET; op->flags = KD_FONT_FLAG_OLD; @@ -317,7 +319,7 @@ op->height = cfdarg.charheight; op->charcount = cfdarg.charcount; op->data = cfdarg.chardata; - i = con_font_op(vc_cons[fg_console].d, op); + i = con_font_op(fg_console, op); if (i) return i; cfdarg.charheight = op->height; @@ -331,7 +333,7 @@ } static inline int -do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, struct vc_data *vc) +do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, unsigned int console) { struct unimapdesc tmp; int i = 0; @@ -347,11 +349,11 @@ case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(vc, tmp.entry_ct, tmp.entries); + return con_set_unimap(console, tmp.entry_ct, tmp.entries); case GIO_UNIMAP: - if (!perm && fg_console != vc->vc_num) + if (!perm && fg_console != console) return -EPERM; - return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); + return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); } return 0; } @@ -363,7 +365,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) { - struct vc_data *vc = (struct vc_data *)tty->driver_data; + struct vt_struct *vt = (struct vt_struct *)tty->driver_data; + struct vc_data *vc = vc_cons[vt->vc_num].d; struct console_font_op op; /* used in multiple places here */ struct kbd_struct * kbd; unsigned int console; @@ -371,7 +374,7 @@ void __user *up = (void __user *)arg; int i, perm; - console = vc->vc_num; + console = vt->vc_num; if (!vc_cons_allocated(console)) /* impossible? */ return -ENOIOCTLCMD; @@ -484,9 +487,9 @@ default: return -EINVAL; } - if (vc->vc_mode == (unsigned char) arg) + if (vt_cons[console]->vc_mode == (unsigned char) arg) return 0; - vc->vc_mode = (unsigned char) arg; + vt_cons[console]->vc_mode = (unsigned char) arg; if (console != fg_console) return 0; /* @@ -501,7 +504,7 @@ return 0; case KDGETMODE: - ucval = vc->vc_mode; + ucval = vt_cons[console]->vc_mode; goto setint; case KDMAPDISP: @@ -664,12 +667,12 @@ if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) return -EINVAL; acquire_console_sem(); - vc->vt_mode = tmp; + vt_cons[console]->vt_mode = tmp; /* the frsig is ignored, so we set it to 0 */ - vc->vt_mode.frsig = 0; - vc->vt_pid = current->pid; + vt_cons[console]->vt_mode.frsig = 0; + vt_cons[console]->vt_pid = current->pid; /* no switch is required -- saw@shade.msu.ru */ - vc->vt_newvt = -1; + vt_cons[console]->vt_newvt = -1; release_console_sem(); return 0; } @@ -680,7 +683,7 @@ int rc; acquire_console_sem(); - memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); + memcpy(&tmp, &vt_cons[console]->vt_mode, sizeof(struct vt_mode)); release_console_sem(); rc = copy_to_user(up, &tmp, sizeof(struct vt_mode)); @@ -758,29 +761,31 @@ case VT_RELDISP: if (!perm) return -EPERM; - if (vc->vt_mode.mode != VT_PROCESS) + if (vt_cons[console]->vt_mode.mode != VT_PROCESS) return -EINVAL; /* * Switching-from response */ - if (vc->vt_newvt >= 0) { + if (vt_cons[console]->vt_newvt >= 0) + { if (arg == 0) /* * Switch disallowed, so forget we were trying * to do it. */ - vc->vt_newvt = -1; + vt_cons[console]->vt_newvt = -1; - else { + else + { /* * The current vt has been released, so * complete the switch. */ int newvt; acquire_console_sem(); - newvt = vc->vt_newvt; - vc->vt_newvt = -1; + newvt = vt_cons[console]->vt_newvt; + vt_cons[console]->vt_newvt = -1; i = vc_allocate(newvt); if (i) { release_console_sem(); @@ -791,7 +796,7 @@ * make sure we are atomic with respect to * other console switches.. */ - complete_change_console(vc_cons[newvt].d); + complete_change_console(newvt); release_console_sem(); } } @@ -847,7 +852,7 @@ return -EFAULT; for (i = 0; i < MAX_NR_CONSOLES; i++) { acquire_console_sem(); - vc_resize(vc_cons[i].d, cc, ll); + vc_resize(i, cc, ll); release_console_sem(); } return 0; @@ -895,7 +900,7 @@ vc_cons[i].d->vc_scan_lines = vlin; if (clin) vc_cons[i].d->vc_font.height = clin; - vc_resize(vc_cons[i].d, cc, ll); + vc_resize(i, cc, ll); release_console_sem(); } return 0; @@ -910,7 +915,7 @@ op.height = 0; op.charcount = 256; op.data = up; - return con_font_op(vc_cons[fg_console].d, &op); + return con_font_op(fg_console, &op); } case GIO_FONT: { @@ -920,7 +925,7 @@ op.height = 32; op.charcount = 256; op.data = up; - return con_font_op(vc_cons[fg_console].d, &op); + return con_font_op(fg_console, &op); } case PIO_CMAP: @@ -948,10 +953,9 @@ { op.op = KD_FONT_OP_SET_DEFAULT; op.data = NULL; - i = con_font_op(vc_cons[fg_console].d, &op); - if (i) - return i; - con_set_default_unimap(vc_cons[fg_console].d); + i = con_font_op(fg_console, &op); + if (i) return i; + con_set_default_unimap(fg_console); return 0; } #endif @@ -962,7 +966,7 @@ return -EFAULT; if (!perm && op.op != KD_FONT_OP_GET) return -EPERM; - i = con_font_op(vc, &op); + i = con_font_op(console, &op); if (i) return i; if (copy_to_user(up, &op, sizeof(op))) return -EFAULT; @@ -991,13 +995,13 @@ return -EPERM; i = copy_from_user(&ui, up, sizeof(struct unimapinit)); if (i) return -EFAULT; - con_clear_unimap(vc, &ui); + con_clear_unimap(console, &ui); return 0; } case PIO_UNIMAP: case GIO_UNIMAP: - return do_unimap_ioctl(cmd, up, perm, vc); + return do_unimap_ioctl(cmd, up, perm, console); case VT_LOCKSWITCH: if (!capable(CAP_SYS_TTY_CONFIG)) @@ -1050,25 +1054,25 @@ #define vt_wake_waitactive() wake_up(&vt_activate_queue) -void reset_vc(struct vc_data *vc) +void reset_vc(unsigned int new_console) { - vc->vc_mode = KD_TEXT; - kbd_table[vc->vc_num].kbdmode = VC_XLATE; - vc->vt_mode.mode = VT_AUTO; - vc->vt_mode.waitv = 0; - vc->vt_mode.relsig = 0; - vc->vt_mode.acqsig = 0; - vc->vt_mode.frsig = 0; - vc->vt_pid = -1; - vc->vt_newvt = -1; + vt_cons[new_console]->vc_mode = KD_TEXT; + kbd_table[new_console].kbdmode = VC_XLATE; + vt_cons[new_console]->vt_mode.mode = VT_AUTO; + vt_cons[new_console]->vt_mode.waitv = 0; + vt_cons[new_console]->vt_mode.relsig = 0; + vt_cons[new_console]->vt_mode.acqsig = 0; + vt_cons[new_console]->vt_mode.frsig = 0; + vt_cons[new_console]->vt_pid = -1; + vt_cons[new_console]->vt_newvt = -1; if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */ - reset_palette(vc); + reset_palette(new_console) ; } /* * Performs the back end of a vt switch */ -void complete_change_console(struct vc_data *vc) +void complete_change_console(unsigned int new_console) { unsigned char old_vc_mode; @@ -1079,8 +1083,8 @@ * KD_TEXT mode or vice versa, which means we need to blank or * unblank the screen later. */ - old_vc_mode = vc_cons[fg_console].d->vc_mode; - switch_screen(vc); + old_vc_mode = vt_cons[fg_console]->vc_mode; + switch_screen(new_console); /* * This can't appear below a successful kill_proc(). If it did, @@ -1092,8 +1096,9 @@ * To account for this we duplicate this code below only if the * controlling process is gone and we've called reset_vc. */ - if (old_vc_mode != vc->vc_mode) { - if (vc->vc_mode == KD_TEXT) + if (old_vc_mode != vt_cons[new_console]->vc_mode) + { + if (vt_cons[new_console]->vc_mode == KD_TEXT) do_unblank_screen(1); else do_blank_screen(1); @@ -1104,13 +1109,17 @@ * telling it that it has acquired. Also check if it has died and * clean up (similar to logic employed in change_console()) */ - if (vc->vt_mode.mode == VT_PROCESS) { + if (vt_cons[new_console]->vt_mode.mode == VT_PROCESS) + { /* * Send the signal as privileged - kill_proc() will * tell us if the process has gone or something else * is awry */ - if (kill_proc(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) { + if (kill_proc(vt_cons[new_console]->vt_pid, + vt_cons[new_console]->vt_mode.acqsig, + 1) != 0) + { /* * The controlling process has died, so we revert back to * normal operation. In this case, we'll also change back @@ -1120,10 +1129,11 @@ * this outside of VT_PROCESS but there is no single process * to account for and tracking tty count may be undesirable. */ - reset_vc(vc); + reset_vc(new_console); - if (old_vc_mode != vc->vc_mode) { - if (vc->vc_mode == KD_TEXT) + if (old_vc_mode != vt_cons[new_console]->vc_mode) + { + if (vt_cons[new_console]->vc_mode == KD_TEXT) do_unblank_screen(1); else do_blank_screen(1); @@ -1141,11 +1151,11 @@ /* * Performs the front-end of a vt switch */ -void change_console(struct vc_data *new_vc) +void change_console(unsigned int new_console) { - struct vc_data *vc; - - if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch) + if ((new_console == fg_console) || (vt_dont_switch)) + return; + if (!vc_cons_allocated(new_console)) return; /* @@ -1163,20 +1173,23 @@ * the user waits just the right amount of time :-) and revert the * vt to auto control. */ - vc = vc_cons[fg_console].d; - if (vc->vt_mode.mode == VT_PROCESS) { + if (vt_cons[fg_console]->vt_mode.mode == VT_PROCESS) + { /* * Send the signal as privileged - kill_proc() will * tell us if the process has gone or something else * is awry */ - if (kill_proc(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) { + if (kill_proc(vt_cons[fg_console]->vt_pid, + vt_cons[fg_console]->vt_mode.relsig, + 1) == 0) + { /* * It worked. Mark the vt to switch to and * return. The process needs to send us a * VT_RELDISP ioctl to complete the switch. */ - vc->vt_newvt = new_vc->vc_num; + vt_cons[fg_console]->vt_newvt = new_console; return; } @@ -1189,7 +1202,7 @@ * this outside of VT_PROCESS but there is no single process * to account for and tracking tty count may be undesirable. */ - reset_vc(vc); + reset_vc(fg_console); /* * Fall through to normal (VT_AUTO) handling of the switch... @@ -1199,8 +1212,8 @@ /* * Ignore all switches in KD_GRAPHICS+VT_AUTO mode */ - if (vc->vc_mode == KD_GRAPHICS) + if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS) return; - complete_change_console(new_vc); + complete_change_console(new_console); } diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/dummycon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/dummycon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/dummycon.c 2005-02-14 17:29:28.212739784 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/dummycon.c 2005-02-18 17:31:58.323494424 -0800 @@ -42,7 +42,7 @@ vc->vc_cols = DUMMY_COLUMNS; vc->vc_rows = DUMMY_ROWS; } else - vc_resize(vc, DUMMY_COLUMNS, DUMMY_ROWS); + vc_resize(vc->vc_num, DUMMY_COLUMNS, DUMMY_ROWS); } static int dummycon_dummy(void) diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/fbcon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/fbcon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/fbcon.c 2005-02-14 17:29:28.260732488 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/fbcon.c 2005-02-18 17:36:41.750406984 -0800 @@ -203,7 +203,7 @@ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info) { return (info->state != FBINFO_STATE_RUNNING || - vc->vc_mode != KD_TEXT); + vt_cons[vc->vc_num]->vc_mode != KD_TEXT); } static inline int get_color(struct vc_data *vc, struct fb_info *info, @@ -456,9 +456,9 @@ erase, vc->vc_size_row * logo_lines); - if (CON_IS_VISIBLE(vc) && vc->vc_mode == KD_TEXT) { + if (CON_IS_VISIBLE(vc) && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) { fbcon_clear_margins(vc, 0); - update_screen(vc); + update_screen(vc->vc_num); } if (save) { @@ -609,7 +609,7 @@ fg_vc->vc_rows); } - update_screen(vc_cons[fg_console].d); + switch_screen(fg_console); } /** @@ -802,7 +802,7 @@ cols = info->var.xres / vc->vc_font.width; rows = info->var.yres / vc->vc_font.height; - vc_resize(vc, cols, rows); + vc_resize(vc->vc_num, cols, rows); DPRINTK("mode: %s\n", info->fix.id); DPRINTK("visual: %d\n", info->fix.visual); @@ -890,12 +890,13 @@ struct vc_data **default_mode = vc->vc_display_fg; struct vc_data *svc = *default_mode; struct display *t, *p = &fb_display[vc->vc_num]; + int display_fg = (*default_mode)->vc_num; int logo = 1, new_rows, new_cols, rows, cols, charcnt = 256; int cap = info->flags; if (info_idx == -1 || info == NULL) return; - if (vc != svc || logo_shown == FBCON_LOGO_DONTSHOW || + if (vc->vc_num != display_fg || logo_shown == FBCON_LOGO_DONTSHOW || (info->fix.type == FB_TYPE_TEXT)) logo = 0; @@ -906,7 +907,7 @@ /* If we are not the first console on this fb, copy the font from that console */ - t = &fb_display[svc->vc_num]; + t = &fb_display[display_fg]; if (!vc->vc_font.data) { vc->vc_font.data = p->fontdata = t->fontdata; vc->vc_font.width = (*default_mode)->vc_font.width; @@ -928,15 +929,15 @@ } if (!*svc->vc_uni_pagedir_loc) - con_set_default_unimap(svc); + con_set_default_unimap(display_fg); if (!*vc->vc_uni_pagedir_loc) - con_copy_unimap(vc, svc); + con_copy_unimap(vc->vc_num, display_fg); cols = vc->vc_cols; rows = vc->vc_rows; new_cols = info->var.xres / vc->vc_font.width; new_rows = info->var.yres / vc->vc_font.height; - vc_resize(vc, new_cols, new_rows); + vc_resize(vc->vc_num, new_cols, new_rows); /* * We must always set the mode. The mode of the previous console * driver could be in the same resolution but we are using different @@ -967,7 +968,7 @@ if (logo) fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows); - if (vc == svc && softback_buf) { + if (vc->vc_num == display_fg && softback_buf) { int l = fbcon_softback_size / vc->vc_size_row; if (l > 5) softback_end = softback_buf + l * vc->vc_size_row; @@ -1143,12 +1144,13 @@ struct display *p = &fb_display[vc->vc_num], *t; struct vc_data **default_mode = vc->vc_display_fg; struct vc_data *svc = *default_mode; + int display_fg = (*default_mode)->vc_num; int rows, cols, charcnt = 256; info->var.xoffset = info->var.yoffset = p->yscroll = 0; if (var_to_display(p, &info->var, info)) return; - t = &fb_display[svc->vc_num]; + t = &fb_display[display_fg]; if (!vc->vc_font.data) { vc->vc_font.data = p->fontdata = t->fontdata; vc->vc_font.width = (*default_mode)->vc_font.width; @@ -1171,15 +1173,15 @@ } if (!*svc->vc_uni_pagedir_loc) - con_set_default_unimap(svc); + con_set_default_unimap(display_fg); if (!*vc->vc_uni_pagedir_loc) - con_copy_unimap(vc, svc); + con_copy_unimap(vc->vc_num, display_fg); cols = info->var.xres / vc->vc_font.width; rows = info->var.yres / vc->vc_font.height; - vc_resize(vc, cols, rows); + vc_resize(vc->vc_num, cols, rows); if (CON_IS_VISIBLE(vc)) { - update_screen(vc); + update_screen(vc->vc_num); if (softback_buf) { int l = fbcon_softback_size / vc->vc_size_row; @@ -1985,7 +1987,7 @@ logo_shown = fg_console; /* This is protected above by initmem_freed */ fb_show_logo(info); - update_region(vc, + update_region(fg_console, vc->vc_origin + vc->vc_size_row * vc->vc_top, vc->vc_size_row * (vc->vc_bottom - vc->vc_top) / 2); @@ -2046,7 +2048,7 @@ } if (!blank) - update_screen(vc); + update_screen(vc->vc_num); } return 0; @@ -2195,8 +2197,8 @@ if (resize) { /* reset wrap/pan */ - info->var.xoffset = info->var.yoffset = p->yscroll = 0; - vc_resize(vc, info->var.xres / w, info->var.yres / h); + info->var.xoffset = info->var.yoffset = p->yscroll = 0; + vc_resize(vc->vc_num, info->var.xres / w, info->var.yres / h); if (CON_IS_VISIBLE(vc) && softback_buf) { int l = fbcon_softback_size / vc->vc_size_row; if (l > 5) @@ -2209,9 +2211,9 @@ } } } else if (CON_IS_VISIBLE(vc) - && vc->vc_mode == KD_TEXT) { + && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) { fbcon_clear_margins(vc, 0); - update_screen(vc); + update_screen(vc->vc_num); } if (old_data && (--REFCOUNT(old_data) == 0)) @@ -2436,7 +2438,7 @@ if (softback_top) { if (vc->vc_num != fg_console) return 0; - if (vc->vc_mode != KD_TEXT || !lines) + if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT || !lines) return 0; if (logo_shown >= 0) { struct vc_data *conp2 = vc_cons[logo_shown].d; @@ -2462,7 +2464,7 @@ vc->vc_size_row); } softback_in = p; - update_region(vc, vc->vc_origin, + update_region(vc->vc_num, vc->vc_origin, logo_lines * vc->vc_cols); } logo_shown = FBCON_LOGO_CANSHOW; @@ -2543,7 +2545,7 @@ return; vc = vc_cons[ops->currcon].d; - update_screen(vc); + update_screen(vc->vc_num); } static void fbcon_modechanged(struct fb_info *info) @@ -2553,11 +2555,11 @@ struct display *p; int rows, cols; - if (!ops || ops->currcon < 0) + if (!ops || ops->currcon < 0 || vt_cons[ops->currcon]->vc_mode != + KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info) return; + vc = vc_cons[ops->currcon].d; - if (vc->vc_mode != KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info) - return; p = &fb_display[vc->vc_num]; @@ -2567,13 +2569,13 @@ var_to_display(p, &info->var, info); cols = info->var.xres / vc->vc_font.width; rows = info->var.yres / vc->vc_font.height; - vc_resize(vc, cols, rows); + vc_resize(vc->vc_num, cols, rows); updatescrollmode(p, info, vc); scrollback_max = 0; scrollback_current = 0; update_var(vc->vc_num, info); fbcon_set_palette(vc, color_table); - update_screen(vc); + update_screen(vc->vc_num); if (softback_buf) { int l = fbcon_softback_size / vc->vc_size_row; if (l > 5) @@ -2639,23 +2641,26 @@ static void fbcon_fb_blanked(struct fb_info *info, int blank) { struct fbcon_ops *ops = info->fbcon_par; - struct vc_data *vc; + int valid = 1; - if (!ops || ops->currcon < 0) - return; + if (!ops || ops->currcon < 0 || + vt_cons[ops->currcon]->vc_mode != KD_TEXT || + registered_fb[con2fb_map[ops->currcon]] != info) + valid = 0; - vc = vc_cons[ops->currcon].d; - if (vc->vc_mode != KD_TEXT || - registered_fb[con2fb_map[ops->currcon]] != info) - return; + if (valid) { + struct vc_data *vc; - if (CON_IS_VISIBLE(vc)) { - if (blank) - do_blank_screen(0); - else - do_unblank_screen(0); + vc = vc_cons[ops->currcon].d; + + if (CON_IS_VISIBLE(vc)) { + if (blank) + do_blank_screen(0); + else + do_unblank_screen(0); + } + ops->blank_state = blank; } - ops->blank_state = blank; } static int fbcon_event_notify(struct notifier_block *self, diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/mdacon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/mdacon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/mdacon.c 2005-02-14 17:29:28.264731880 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/mdacon.c 2005-02-18 17:31:58.334492752 -0800 @@ -351,9 +351,10 @@ if (init) { c->vc_cols = mda_num_columns; c->vc_rows = mda_num_lines; - } else - vc_resize(c, mda_num_columns, mda_num_lines); - + } else { + vc_resize(c->vc_num, mda_num_columns, mda_num_lines); + } + /* make the first MDA console visible */ if (mda_display_fg == NULL) diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/promcon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/promcon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/promcon.c 2005-02-14 17:29:28.279729600 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/promcon.c 2005-02-18 17:31:58.336492448 -0800 @@ -155,9 +155,9 @@ k++; } set_fs(KERNEL_DS); - con_clear_unimap(conp, NULL); - con_set_unimap(conp, k, p); - con_protect_unimap(conp, 1); + con_clear_unimap(conp->vc_num, NULL); + con_set_unimap(conp->vc_num, k, p); + con_protect_unimap(conp->vc_num, 1); set_fs(old_fs); kfree(p); } @@ -175,7 +175,7 @@ p = *conp->vc_uni_pagedir_loc; if (conp->vc_uni_pagedir_loc == &conp->vc_uni_pagedir || !--conp->vc_uni_pagedir_loc[1]) - con_free_unimap(conp); + con_free_unimap(conp->vc_num); conp->vc_uni_pagedir_loc = promcon_uni_pagedir; promcon_uni_pagedir[1]++; if (!promcon_uni_pagedir[0] && p) { @@ -183,7 +183,7 @@ } if (!init) { if (conp->vc_cols != pw + 1 || conp->vc_rows != ph + 1) - vc_resize(conp, pw + 1, ph + 1); + vc_resize(conp->vc_num, pw + 1, ph + 1); } } @@ -192,9 +192,9 @@ { /* When closing the last console, reset video origin */ if (!--promcon_uni_pagedir[1]) - con_free_unimap(conp); + con_free_unimap(conp->vc_num); conp->vc_uni_pagedir_loc = &conp->vc_uni_pagedir; - con_set_default_unimap(conp); + con_set_default_unimap(conp->vc_num); } static int diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/sticon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/sticon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/sticon.c 2005-02-14 17:29:28.281729296 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/sticon.c 2005-02-18 17:31:58.338492144 -0800 @@ -87,12 +87,13 @@ static void sticon_putc(struct vc_data *conp, int c, int ypos, int xpos) { + int unit = conp->vc_num; int redraw_cursor = 0; if (vga_is_gfx || console_blanked) return; - - if (conp->vc_mode != KD_TEXT) + + if (vt_cons[unit]->vc_mode != KD_TEXT) return; #if 0 if ((p->cursor_x == xpos) && (p->cursor_y == ypos)) { @@ -110,14 +111,15 @@ static void sticon_putcs(struct vc_data *conp, const unsigned short *s, int count, int ypos, int xpos) { + int unit = conp->vc_num; int redraw_cursor = 0; if (vga_is_gfx || console_blanked) return; - if (conp->vc_mode != KD_TEXT) + if (vt_cons[unit]->vc_mode != KD_TEXT) return; - + #if 0 if ((p->cursor_y == ypos) && (xpos <= p->cursor_x) && (p->cursor_x < (xpos + count))) { @@ -215,7 +217,7 @@ } else { /* vc_rows = (c->vc_rows > vc_rows) ? vc_rows : c->vc_rows; */ /* vc_cols = (c->vc_cols > vc_cols) ? vc_cols : c->vc_cols; */ - vc_resize(c, vc_cols, vc_rows); + vc_resize(c->vc_num, vc_cols, vc_rows); /* vc_resize_con(vc_rows, vc_cols, c->vc_num); */ } } diff -Naur linux-2.6.11-rc3-mm2/drivers/video/console/vgacon.c linux-2.6.11-rc3-mm2-fb/drivers/video/console/vgacon.c --- linux-2.6.11-rc3-mm2/drivers/video/console/vgacon.c 2005-02-14 17:29:28.304725800 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/console/vgacon.c 2005-02-18 17:31:58.340491840 -0800 @@ -340,11 +340,11 @@ p = *c->vc_uni_pagedir_loc; if (c->vc_uni_pagedir_loc == &c->vc_uni_pagedir || !--c->vc_uni_pagedir_loc[1]) - con_free_unimap(c); + con_free_unimap(c->vc_num); c->vc_uni_pagedir_loc = vgacon_uni_pagedir; vgacon_uni_pagedir[1]++; if (!vgacon_uni_pagedir[0] && p) - con_set_default_unimap(c); + con_set_default_unimap(c->vc_num); } static inline void vga_set_mem_top(struct vc_data *c) @@ -358,10 +358,10 @@ if (!--vgacon_uni_pagedir[1]) { c->vc_visible_origin = vga_vram_base; vga_set_mem_top(c); - con_free_unimap(c); + con_free_unimap(c->vc_num); } c->vc_uni_pagedir_loc = &c->vc_uni_pagedir; - con_set_default_unimap(c); + con_set_default_unimap(c->vc_num); } static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity, @@ -908,7 +908,7 @@ c->vc_sw->con_cursor(c, CM_DRAW); } c->vc_font.height = fontheight; - vc_resize(c, 0, rows); /* Adjust console size */ + vc_resize(c->vc_num, 0, rows); /* Adjust console size */ } } return 0; diff -Naur linux-2.6.11-rc3-mm2/drivers/video/sun3fb.c linux-2.6.11-rc3-mm2-fb/drivers/video/sun3fb.c --- linux-2.6.11-rc3-mm2/drivers/video/sun3fb.c 2005-02-14 17:29:28.576684456 -0800 +++ linux-2.6.11-rc3-mm2-fb/drivers/video/sun3fb.c 2005-02-18 17:31:58.362488496 -0800 @@ -505,7 +505,7 @@ if (fb->restore_palette) { if (enter) fb->restore_palette(fb); - else if (vc_cons[i].d->vc_mode != KD_GRAPHICS) + else if (vt_cons[i]->vc_mode != KD_GRAPHICS) vc_cons[i].d->vc_sw->con_set_palette(vc_cons[i].d, color_table); } } diff -Naur linux-2.6.11-rc3-mm2/fs/compat_ioctl.c linux-2.6.11-rc3-mm2-fb/fs/compat_ioctl.c --- linux-2.6.11-rc3-mm2/fs/compat_ioctl.c 2005-02-14 17:29:28.873639312 -0800 +++ linux-2.6.11-rc3-mm2-fb/fs/compat_ioctl.c 2005-02-18 17:31:58.377486216 -0800 @@ -1615,7 +1615,7 @@ get_user(data, &user_cfd->chardata)) return -EFAULT; op.data = compat_ptr(data); - return con_font_op(vc_cons[fg_console].d, &op); + return con_font_op(fg_console, &op); case GIO_FONTX: op.op = KD_FONT_OP_GET; op.flags = 0; @@ -1627,7 +1627,7 @@ if (!data) return 0; op.data = compat_ptr(data); - i = con_font_op(vc_cons[fg_console].d, &op); + i = con_font_op(fg_console, &op); if (i) return i; if (put_user(op.height, &user_cfd->charheight) || @@ -1653,7 +1653,7 @@ struct console_font_op op; struct console_font_op32 __user *fontop = compat_ptr(arg); int perm = vt_check(file), i; - struct vc_data *vc; + struct vt_struct *vt; if (perm < 0) return perm; @@ -1663,10 +1663,9 @@ return -EPERM; op.data = compat_ptr(((struct console_font_op32 *)&op)->data); op.flags |= KD_FONT_FLAG_OLD; - vc = ((struct tty_struct *)file->private_data)->driver_data; - i = con_font_op(vc, &op); - if (i) - return i; + vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data; + i = con_font_op(vt->vc_num, &op); + if (i) return i; ((struct console_font_op32 *)&op)->data = (unsigned long)op.data; if (copy_to_user(fontop, &op, sizeof(struct console_font_op32))) return -EFAULT; @@ -1690,9 +1689,9 @@ switch (cmd) { case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(vc_cons[fg_console].d, tmp.entry_ct, compat_ptr(tmp.entries)); + return con_set_unimap(fg_console, tmp.entry_ct, compat_ptr(tmp.entries)); case GIO_UNIMAP: - return con_get_unimap(vc_cons[fg_console].d, tmp.entry_ct, &(user_ud->entry_ct), compat_ptr(tmp.entries)); + return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), compat_ptr(tmp.entries)); } return 0; } diff -Naur linux-2.6.11-rc3-mm2/include/linux/console_struct.h linux-2.6.11-rc3-mm2-fb/include/linux/console_struct.h --- linux-2.6.11-rc3-mm2/include/linux/console_struct.h 2005-02-14 17:29:32.779045600 -0800 +++ linux-2.6.11-rc3-mm2-fb/include/linux/console_struct.h 2005-02-18 17:32:42.485780736 -0800 @@ -26,7 +26,6 @@ const struct consw *vc_sw; unsigned short *vc_screenbuf; /* In-memory character/attribute buffer */ unsigned int vc_screenbuf_size; - unsigned char vc_mode; /* KD_TEXT, ... */ /* attributes for all characters on screen */ unsigned char vc_attr; /* Current attributes */ unsigned char vc_def_color; /* Default colors */ @@ -49,11 +48,6 @@ unsigned int vc_state; /* Escape sequence parser state */ unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ struct tty_struct *vc_tty; /* TTY we are attached to */ - /* data for manual vt switching */ - struct vt_mode vt_mode; - int vt_pid; - int vt_newvt; - wait_queue_head_t paste_wait; /* mode flags */ unsigned int vc_charset : 1; /* Character set G0 / G1 */ unsigned int vc_s_charset : 1; /* Saved character set */ @@ -95,6 +89,7 @@ struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */ unsigned long vc_uni_pagedir; unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */ + struct vt_struct *vc_vt; /* additional information is in vt_kern.h */ }; diff -Naur linux-2.6.11-rc3-mm2/include/linux/consolemap.h linux-2.6.11-rc3-mm2-fb/include/linux/consolemap.h --- linux-2.6.11-rc3-mm2/include/linux/consolemap.h 2005-02-14 17:29:32.778045752 -0800 +++ linux-2.6.11-rc3-mm2-fb/include/linux/consolemap.h 2005-02-18 17:31:58.384485152 -0800 @@ -11,5 +11,5 @@ struct vc_data; extern unsigned char inverse_translate(struct vc_data *conp, int glyph); -extern unsigned short *set_translate(int m, struct vc_data *vc); +extern unsigned short *set_translate(int m,int currcons); extern int conv_uni_to_pc(struct vc_data *conp, long ucs); diff -Naur linux-2.6.11-rc3-mm2/include/linux/vt_kern.h linux-2.6.11-rc3-mm2-fb/include/linux/vt_kern.h --- linux-2.6.11-rc3-mm2/include/linux/vt_kern.h 2005-02-14 17:29:33.234976288 -0800 +++ linux-2.6.11-rc3-mm2-fb/include/linux/vt_kern.h 2005-02-18 17:31:58.403482264 -0800 @@ -25,6 +25,15 @@ #define BROKEN_GRAPHICS_PROGRAMS 1 #endif +extern struct vt_struct { + int vc_num; /* The console number */ + unsigned char vc_mode; /* KD_TEXT, ... */ + struct vt_mode vt_mode; + int vt_pid; + int vt_newvt; + wait_queue_head_t paste_wait; +} *vt_cons[MAX_NR_CONSOLES]; + extern void kd_mksound(unsigned int hz, unsigned int ticks); extern int kbd_rate(struct kbd_repeat *rep); @@ -32,25 +41,25 @@ int vc_allocate(unsigned int console); int vc_cons_allocated(unsigned int console); -int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); +int vc_resize(int currcons, unsigned int cols, unsigned int lines); void vc_disallocate(unsigned int console); -void reset_palette(struct vc_data *vc); -void set_palette(struct vc_data *vc); +void reset_palette(int currcons); +void set_palette(int currcons); void do_blank_screen(int entering_gfx); void do_unblank_screen(int leaving_gfx); void unblank_screen(void); void poke_blanked_console(void); -int con_font_op(struct vc_data *vc, struct console_font_op *op); -int con_font_set(struct vc_data *vc, struct console_font_op *op); -int con_font_get(struct vc_data *vc, struct console_font_op *op); -int con_font_default(struct vc_data *vc, struct console_font_op *op); -int con_font_copy(struct vc_data *vc, struct console_font_op *op); +int con_font_op(int currcons, struct console_font_op *op); +int con_font_set(int currcons, struct console_font_op *op); +int con_font_get(int currcons, struct console_font_op *op); +int con_font_default(int currcons, struct console_font_op *op); +int con_font_copy(int currcons, struct console_font_op *op); int con_set_cmap(unsigned char __user *cmap); int con_get_cmap(unsigned char __user *cmap); -void scrollback(struct vc_data *vc, int lines); -void scrollfront(struct vc_data *vc, int lines); -void update_region(struct vc_data *vc, unsigned long start, int count); -void redraw_screen(struct vc_data *vc, int is_switch); +void scrollback(int); +void scrollfront(int); +void update_region(int currcons, unsigned long start, int count); +void redraw_screen(int new_console, int is_switch); #define update_screen(x) redraw_screen(x, 0) #define switch_screen(x) redraw_screen(x, 1) @@ -66,19 +75,19 @@ int con_get_trans_old(unsigned char __user * table); int con_set_trans_new(unsigned short __user * table); int con_get_trans_new(unsigned short __user * table); -int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui); -int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list); -int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct, struct unipair __user *list); -int con_set_default_unimap(struct vc_data *vc); -void con_free_unimap(struct vc_data *vc); -void con_protect_unimap(struct vc_data *vc, int rdonly); -int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc); +int con_clear_unimap(int currcons, struct unimapinit *ui); +int con_set_unimap(int currcons, ushort ct, struct unipair __user *list); +int con_get_unimap(int currcons, ushort ct, ushort __user *uct, struct unipair __user *list); +int con_set_default_unimap(int currcons); +void con_free_unimap(int currcons); +void con_protect_unimap(int currcons, int rdonly); +int con_copy_unimap(int dstcons, int srccons); /* vt.c */ -void complete_change_console(struct vc_data *vc); +void complete_change_console(unsigned int new_console); int vt_waitactive(int vt); -void change_console(struct vc_data *new_vc); -void reset_vc(struct vc_data *vc); +void change_console(unsigned int); +void reset_vc(unsigned int new_console); /* * vc_screen.c shares this temporary buffer with the console write code so that