Commit 716a6639 authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds

[PATCH] cleanup vc array access

This removes as far as possible unneccessary vc_cons lookups by using a
pointer to the vc_data structure instead of the index.  The hidden currcons
argument in console_macros.h is temporarily replaced with a hidden vc pointer.
Signed-off-by: default avatarRoman Zippel <zippel@linux-m68k.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c035fc12
#define cons_num (vc_cons[currcons].d->vc_num) #define cons_num (vc->vc_num)
#define video_scan_lines (vc_cons[currcons].d->vc_scan_lines) #define video_scan_lines (vc->vc_scan_lines)
#define sw (vc_cons[currcons].d->vc_sw) #define sw (vc->vc_sw)
#define screenbuf (vc_cons[currcons].d->vc_screenbuf) #define screenbuf (vc->vc_screenbuf)
#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) #define screenbuf_size (vc->vc_screenbuf_size)
#define origin (vc_cons[currcons].d->vc_origin) #define origin (vc->vc_origin)
#define scr_top (vc_cons[currcons].d->vc_scr_top) #define scr_top (vc->vc_scr_top)
#define visible_origin (vc_cons[currcons].d->vc_visible_origin) #define visible_origin (vc->vc_visible_origin)
#define scr_end (vc_cons[currcons].d->vc_scr_end) #define scr_end (vc->vc_scr_end)
#define pos (vc_cons[currcons].d->vc_pos) #define pos (vc->vc_pos)
#define top (vc_cons[currcons].d->vc_top) #define top (vc->vc_top)
#define bottom (vc_cons[currcons].d->vc_bottom) #define bottom (vc->vc_bottom)
#define x (vc_cons[currcons].d->vc_x) #define x (vc->vc_x)
#define y (vc_cons[currcons].d->vc_y) #define y (vc->vc_y)
#define vc_state (vc_cons[currcons].d->vc_state) #define vc_state (vc->vc_state)
#define npar (vc_cons[currcons].d->vc_npar) #define npar (vc->vc_npar)
#define par (vc_cons[currcons].d->vc_par) #define par (vc->vc_par)
#define ques (vc_cons[currcons].d->vc_ques) #define ques (vc->vc_ques)
#define attr (vc_cons[currcons].d->vc_attr) #define attr (vc->vc_attr)
#define saved_x (vc_cons[currcons].d->vc_saved_x) #define saved_x (vc->vc_saved_x)
#define saved_y (vc_cons[currcons].d->vc_saved_y) #define saved_y (vc->vc_saved_y)
#define translate (vc_cons[currcons].d->vc_translate) #define translate (vc->vc_translate)
#define G0_charset (vc_cons[currcons].d->vc_G0_charset) #define G0_charset (vc->vc_G0_charset)
#define G1_charset (vc_cons[currcons].d->vc_G1_charset) #define G1_charset (vc->vc_G1_charset)
#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) #define saved_G0 (vc->vc_saved_G0)
#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) #define saved_G1 (vc->vc_saved_G1)
#define utf (vc_cons[currcons].d->vc_utf) #define utf (vc->vc_utf)
#define utf_count (vc_cons[currcons].d->vc_utf_count) #define utf_count (vc->vc_utf_count)
#define utf_char (vc_cons[currcons].d->vc_utf_char) #define utf_char (vc->vc_utf_char)
#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) #define video_erase_char (vc->vc_video_erase_char)
#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) #define disp_ctrl (vc->vc_disp_ctrl)
#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) #define toggle_meta (vc->vc_toggle_meta)
#define decscnm (vc_cons[currcons].d->vc_decscnm) #define decscnm (vc->vc_decscnm)
#define decom (vc_cons[currcons].d->vc_decom) #define decom (vc->vc_decom)
#define decawm (vc_cons[currcons].d->vc_decawm) #define decawm (vc->vc_decawm)
#define deccm (vc_cons[currcons].d->vc_deccm) #define deccm (vc->vc_deccm)
#define decim (vc_cons[currcons].d->vc_decim) #define decim (vc->vc_decim)
#define deccolm (vc_cons[currcons].d->vc_deccolm) #define deccolm (vc->vc_deccolm)
#define need_wrap (vc_cons[currcons].d->vc_need_wrap) #define need_wrap (vc->vc_need_wrap)
#define kmalloced (vc_cons[currcons].d->vc_kmalloced) #define kmalloced (vc->vc_kmalloced)
#define report_mouse (vc_cons[currcons].d->vc_report_mouse) #define report_mouse (vc->vc_report_mouse)
#define color (vc_cons[currcons].d->vc_color) #define color (vc->vc_color)
#define s_color (vc_cons[currcons].d->vc_s_color) #define s_color (vc->vc_s_color)
#define def_color (vc_cons[currcons].d->vc_def_color) #define def_color (vc->vc_def_color)
#define foreground (color & 0x0f) #define foreground (color & 0x0f)
#define background (color & 0xf0) #define background (color & 0xf0)
#define charset (vc_cons[currcons].d->vc_charset) #define charset (vc->vc_charset)
#define s_charset (vc_cons[currcons].d->vc_s_charset) #define s_charset (vc->vc_s_charset)
#define intensity (vc_cons[currcons].d->vc_intensity) #define intensity (vc->vc_intensity)
#define underline (vc_cons[currcons].d->vc_underline) #define underline (vc->vc_underline)
#define blink (vc_cons[currcons].d->vc_blink) #define blink (vc->vc_blink)
#define reverse (vc_cons[currcons].d->vc_reverse) #define reverse (vc->vc_reverse)
#define s_intensity (vc_cons[currcons].d->vc_s_intensity) #define s_intensity (vc->vc_s_intensity)
#define s_underline (vc_cons[currcons].d->vc_s_underline) #define s_underline (vc->vc_s_underline)
#define s_blink (vc_cons[currcons].d->vc_s_blink) #define s_blink (vc->vc_s_blink)
#define s_reverse (vc_cons[currcons].d->vc_s_reverse) #define s_reverse (vc->vc_s_reverse)
#define ulcolor (vc_cons[currcons].d->vc_ulcolor) #define ulcolor (vc->vc_ulcolor)
#define halfcolor (vc_cons[currcons].d->vc_halfcolor) #define halfcolor (vc->vc_halfcolor)
#define tab_stop (vc_cons[currcons].d->vc_tab_stop) #define tab_stop (vc->vc_tab_stop)
#define palette (vc_cons[currcons].d->vc_palette) #define palette (vc->vc_palette)
#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) #define bell_pitch (vc->vc_bell_pitch)
#define bell_duration (vc_cons[currcons].d->vc_bell_duration) #define bell_duration (vc->vc_bell_duration)
#define cursor_type (vc_cons[currcons].d->vc_cursor_type) #define cursor_type (vc->vc_cursor_type)
#define display_fg (vc_cons[currcons].d->vc_display_fg) #define display_fg (vc->vc_display_fg)
#define complement_mask (vc_cons[currcons].d->vc_complement_mask) #define complement_mask (vc->vc_complement_mask)
#define s_complement_mask (vc_cons[currcons].d->vc_s_complement_mask) #define s_complement_mask (vc->vc_s_complement_mask)
#define hi_font_mask (vc_cons[currcons].d->vc_hi_font_mask) #define hi_font_mask (vc->vc_hi_font_mask)
#define vcmode (vt_cons[currcons]->vc_mode) #define vcmode (vt_cons[vc->vc_num]->vc_mode)
#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) #define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct))
...@@ -208,9 +208,9 @@ static void set_inverse_transl(struct vc_data *conp, struct uni_pagedir *p, int ...@@ -208,9 +208,9 @@ static void set_inverse_transl(struct vc_data *conp, struct uni_pagedir *p, int
} }
} }
unsigned short *set_translate(int m,int currcons) unsigned short *set_translate(int m, struct vc_data *vc)
{ {
inv_translate[currcons] = m; inv_translate[vc->vc_num] = m;
return translations[m]; return translations[m];
} }
...@@ -362,15 +362,16 @@ static void con_release_unimap(struct uni_pagedir *p) ...@@ -362,15 +362,16 @@ static void con_release_unimap(struct uni_pagedir *p)
} }
} }
void con_free_unimap(int con) void con_free_unimap(struct vc_data *vc)
{ {
struct uni_pagedir *p; struct uni_pagedir *p;
struct vc_data *conp = vc_cons[con].d;
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
if (!p) return; if (!p)
*conp->vc_uni_pagedir_loc = 0; return;
if (--p->refcount) return; *vc->vc_uni_pagedir_loc = 0;
if (--p->refcount)
return;
con_release_unimap(p); con_release_unimap(p);
kfree(p); kfree(p);
} }
...@@ -442,12 +443,11 @@ con_insert_unipair(struct uni_pagedir *p, u_short unicode, u_short fontpos) ...@@ -442,12 +443,11 @@ con_insert_unipair(struct uni_pagedir *p, u_short unicode, u_short fontpos)
} }
/* ui is a leftover from using a hashtable, but might be used again */ /* ui is a leftover from using a hashtable, but might be used again */
int con_clear_unimap(int con, struct unimapinit *ui) int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui)
{ {
struct uni_pagedir *p, *q; struct uni_pagedir *p, *q;
struct vc_data *conp = vc_cons[con].d;
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
if (p && p->readonly) return -EIO; if (p && p->readonly) return -EIO;
if (!p || --p->refcount) { if (!p || --p->refcount) {
q = (struct uni_pagedir *)kmalloc(sizeof(*p), GFP_KERNEL); q = (struct uni_pagedir *)kmalloc(sizeof(*p), GFP_KERNEL);
...@@ -457,7 +457,7 @@ int con_clear_unimap(int con, struct unimapinit *ui) ...@@ -457,7 +457,7 @@ int con_clear_unimap(int con, struct unimapinit *ui)
} }
memset(q, 0, sizeof(*q)); memset(q, 0, sizeof(*q));
q->refcount=1; q->refcount=1;
*conp->vc_uni_pagedir_loc = (unsigned long)q; *vc->vc_uni_pagedir_loc = (unsigned long)q;
} else { } else {
if (p == dflt) dflt = NULL; if (p == dflt) dflt = NULL;
p->refcount++; p->refcount++;
...@@ -467,14 +467,12 @@ int con_clear_unimap(int con, struct unimapinit *ui) ...@@ -467,14 +467,12 @@ int con_clear_unimap(int con, struct unimapinit *ui)
return 0; return 0;
} }
int int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
con_set_unimap(int con, ushort ct, struct unipair __user *list)
{ {
int err = 0, err1, i; int err = 0, err1, i;
struct uni_pagedir *p, *q; struct uni_pagedir *p, *q;
struct vc_data *conp = vc_cons[con].d;
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
if (p->readonly) return -EIO; if (p->readonly) return -EIO;
if (!ct) return 0; if (!ct) return 0;
...@@ -483,10 +481,10 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list) ...@@ -483,10 +481,10 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list)
int j, k; int j, k;
u16 **p1, *p2, l; u16 **p1, *p2, l;
err1 = con_clear_unimap(con, NULL); err1 = con_clear_unimap(vc, NULL);
if (err1) return err1; if (err1) return err1;
q = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; q = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
for (i = 0, l = 0; i < 32; i++) for (i = 0, l = 0; i < 32; i++)
if ((p1 = p->uni_pgdir[i])) if ((p1 = p->uni_pgdir[i]))
for (j = 0; j < 32; j++) for (j = 0; j < 32; j++)
...@@ -496,7 +494,7 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list) ...@@ -496,7 +494,7 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list)
err1 = con_insert_unipair(q, l, p2[k]); err1 = con_insert_unipair(q, l, p2[k]);
if (err1) { if (err1) {
p->refcount++; p->refcount++;
*conp->vc_uni_pagedir_loc = (unsigned long)p; *vc->vc_uni_pagedir_loc = (unsigned long)p;
con_release_unimap(q); con_release_unimap(q);
kfree(q); kfree(q);
return err1; return err1;
...@@ -515,11 +513,11 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list) ...@@ -515,11 +513,11 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list)
list++; list++;
} }
if (con_unify_unimap(conp, p)) if (con_unify_unimap(vc, p))
return err; return err;
for (i = 0; i <= 3; i++) for (i = 0; i <= 3; i++)
set_inverse_transl(conp, p, i); /* Update all inverse translations */ set_inverse_transl(vc, p, i); /* Update all inverse translations */
return err; return err;
} }
...@@ -529,20 +527,18 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list) ...@@ -529,20 +527,18 @@ con_set_unimap(int con, ushort ct, struct unipair __user *list)
with. This routine is executed at sys_setup time, and when the with. This routine is executed at sys_setup time, and when the
PIO_FONTRESET ioctl is called. */ PIO_FONTRESET ioctl is called. */
int int con_set_default_unimap(struct vc_data *vc)
con_set_default_unimap(int con)
{ {
int i, j, err = 0, err1; int i, j, err = 0, err1;
u16 *q; u16 *q;
struct uni_pagedir *p; struct uni_pagedir *p;
struct vc_data *conp = vc_cons[con].d;
if (dflt) { if (dflt) {
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
if (p == dflt) if (p == dflt)
return 0; return 0;
dflt->refcount++; dflt->refcount++;
*conp->vc_uni_pagedir_loc = (unsigned long)dflt; *vc->vc_uni_pagedir_loc = (unsigned long)dflt;
if (p && --p->refcount) { if (p && --p->refcount) {
con_release_unimap(p); con_release_unimap(p);
kfree(p); kfree(p);
...@@ -552,10 +548,10 @@ con_set_default_unimap(int con) ...@@ -552,10 +548,10 @@ con_set_default_unimap(int con)
/* The default font is always 256 characters */ /* The default font is always 256 characters */
err = con_clear_unimap(con,NULL); err = con_clear_unimap(vc, NULL);
if (err) return err; if (err) return err;
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
q = dfont_unitable; q = dfont_unitable;
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
...@@ -565,47 +561,42 @@ con_set_default_unimap(int con) ...@@ -565,47 +561,42 @@ con_set_default_unimap(int con)
err = err1; err = err1;
} }
if (con_unify_unimap(conp, p)) { if (con_unify_unimap(vc, p)) {
dflt = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; dflt = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
return err; return err;
} }
for (i = 0; i <= 3; i++) for (i = 0; i <= 3; i++)
set_inverse_transl(conp, p, i); /* Update all inverse translations */ set_inverse_transl(vc, p, i); /* Update all inverse translations */
dflt = p; dflt = p;
return err; return err;
} }
EXPORT_SYMBOL(con_set_default_unimap); EXPORT_SYMBOL(con_set_default_unimap);
int int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc)
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; struct uni_pagedir *q;
if (!vc_cons_allocated(srccon) || !*sconp->vc_uni_pagedir_loc) if (!*src_vc->vc_uni_pagedir_loc)
return -EINVAL; return -EINVAL;
if (*dconp->vc_uni_pagedir_loc == *sconp->vc_uni_pagedir_loc) if (*dst_vc->vc_uni_pagedir_loc == *src_vc->vc_uni_pagedir_loc)
return 0; return 0;
con_free_unimap(dstcon); con_free_unimap(dst_vc);
q = (struct uni_pagedir *)*sconp->vc_uni_pagedir_loc; q = (struct uni_pagedir *)*src_vc->vc_uni_pagedir_loc;
q->refcount++; q->refcount++;
*dconp->vc_uni_pagedir_loc = (long)q; *dst_vc->vc_uni_pagedir_loc = (long)q;
return 0; return 0;
} }
int int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct, struct unipair __user *list)
con_get_unimap(int con, ushort ct, ushort __user *uct, struct unipair __user *list)
{ {
int i, j, k, ect; int i, j, k, ect;
u16 **p1, *p2; u16 **p1, *p2;
struct uni_pagedir *p; struct uni_pagedir *p;
struct vc_data *conp = vc_cons[con].d;
ect = 0; ect = 0;
if (*conp->vc_uni_pagedir_loc) { if (*vc->vc_uni_pagedir_loc) {
p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
if ((p1 = p->uni_pgdir[i])) if ((p1 = p->uni_pgdir[i]))
for (j = 0; j < 32; j++) for (j = 0; j < 32; j++)
...@@ -625,12 +616,12 @@ con_get_unimap(int con, ushort ct, ushort __user *uct, struct unipair __user *li ...@@ -625,12 +616,12 @@ con_get_unimap(int con, ushort ct, ushort __user *uct, struct unipair __user *li
return ((ect <= ct) ? 0 : -ENOMEM); return ((ect <= ct) ? 0 : -ENOMEM);
} }
void con_protect_unimap(int con, int rdonly) void con_protect_unimap(struct vc_data *vc, int rdonly)
{ {
struct uni_pagedir *p = (struct uni_pagedir *) struct uni_pagedir *p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc;
*vc_cons[con].d->vc_uni_pagedir_loc;
if (p) p->readonly = rdonly; if (p)
p->readonly = rdonly;
} }
int int
...@@ -679,7 +670,7 @@ console_map_init(void) ...@@ -679,7 +670,7 @@ console_map_init(void)
for (i = 0; i < MAX_NR_CONSOLES; i++) for (i = 0; i < MAX_NR_CONSOLES; i++)
if (vc_cons_allocated(i) && !*vc_cons[i].d->vc_uni_pagedir_loc) if (vc_cons_allocated(i) && !*vc_cons[i].d->vc_uni_pagedir_loc)
con_set_default_unimap(i); con_set_default_unimap(vc_cons[i].d);
} }
EXPORT_SYMBOL(con_copy_unimap); EXPORT_SYMBOL(con_copy_unimap);
...@@ -536,12 +536,12 @@ static void fn_send_intr(struct vc_data *vc, struct pt_regs *regs) ...@@ -536,12 +536,12 @@ static void fn_send_intr(struct vc_data *vc, struct pt_regs *regs)
static void fn_scroll_forw(struct vc_data *vc, struct pt_regs *regs) static void fn_scroll_forw(struct vc_data *vc, struct pt_regs *regs)
{ {
scrollfront(0); scrollfront(vc, 0);
} }
static void fn_scroll_back(struct vc_data *vc, struct pt_regs *regs) static void fn_scroll_back(struct vc_data *vc, struct pt_regs *regs)
{ {
scrollback(0); scrollback(vc, 0);
} }
static void fn_show_mem(struct vc_data *vc, struct pt_regs *regs) static void fn_show_mem(struct vc_data *vc, struct pt_regs *regs)
...@@ -581,7 +581,7 @@ static void fn_SAK(struct vc_data *vc, struct pt_regs *regs) ...@@ -581,7 +581,7 @@ static void fn_SAK(struct vc_data *vc, struct pt_regs *regs)
*/ */
if (tty) if (tty)
do_SAK(tty); do_SAK(tty);
reset_vc(fg_console); reset_vc(vc);
} }
static void fn_null(struct vc_data *vc, struct pt_regs *regs) static void fn_null(struct vc_data *vc, struct pt_regs *regs)
......
...@@ -43,15 +43,13 @@ static char *sel_buffer; ...@@ -43,15 +43,13 @@ static char *sel_buffer;
from interrupt (via scrollback/front) */ from interrupt (via scrollback/front) */
/* set reverse video on characters s-e of console with selection. */ /* set reverse video on characters s-e of console with selection. */
inline static void static inline void highlight(const int s, const int e)
highlight(const int s, const int e)
{ {
invert_screen(sel_cons, s, e-s+2, 1); invert_screen(sel_cons, s, e-s+2, 1);
} }
/* use complementary color to show the pointer */ /* use complementary color to show the pointer */
inline static void static inline void highlight_pointer(const int where)
highlight_pointer(const int where)
{ {
complement_pos(sel_cons, where); complement_pos(sel_cons, where);
} }
......
...@@ -33,11 +33,10 @@ ...@@ -33,11 +33,10 @@
#include <linux/buffer_head.h> /* for fsync_bdev() */ #include <linux/buffer_head.h> /* for fsync_bdev() */
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/vt_kern.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
extern void reset_vc(unsigned int);
/* Whether we react on sysrq keys or just ignore them */ /* Whether we react on sysrq keys or just ignore them */
int sysrq_enabled = 1; int sysrq_enabled = 1;
...@@ -68,7 +67,7 @@ static void sysrq_handle_SAK(int key, struct pt_regs *pt_regs, ...@@ -68,7 +67,7 @@ static void sysrq_handle_SAK(int key, struct pt_regs *pt_regs,
{ {
if (tty) if (tty)
do_SAK(tty); do_SAK(tty);
reset_vc(fg_console); reset_vc(vc_cons[fg_console].d);
} }
static struct sysrq_key_op sysrq_SAK_op = { static struct sysrq_key_op sysrq_SAK_op = {
.handler = sysrq_handle_SAK, .handler = sysrq_handle_SAK,
......
...@@ -1789,7 +1789,6 @@ static int tty_open(struct inode * inode, struct file * filp) ...@@ -1789,7 +1789,6 @@ static int tty_open(struct inode * inode, struct file * filp)
} }
#ifdef CONFIG_VT #ifdef CONFIG_VT
if (device == MKDEV(TTY_MAJOR,0)) { if (device == MKDEV(TTY_MAJOR,0)) {
extern int fg_console;
extern struct tty_driver *console_driver; extern struct tty_driver *console_driver;
driver = console_driver; driver = console_driver;
index = fg_console; index = fg_console;
...@@ -2016,11 +2015,10 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, ...@@ -2016,11 +2015,10 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
return 0; return 0;
#ifdef CONFIG_VT #ifdef CONFIG_VT
if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) {
unsigned int currcons = tty->index;
int rc; int rc;
acquire_console_sem(); acquire_console_sem();
rc = vc_resize(currcons, tmp_ws.ws_col, tmp_ws.ws_row); rc = vc_resize(tty->driver_data, tmp_ws.ws_col, tmp_ws.ws_row);
release_console_sem(); release_console_sem();
if (rc) if (rc)
return -ENXIO; return -ENXIO;
......
...@@ -52,14 +52,17 @@ vcs_size(struct inode *inode) ...@@ -52,14 +52,17 @@ vcs_size(struct inode *inode)
int size; int size;
int minor = iminor(inode); int minor = iminor(inode);
int currcons = minor & 127; int currcons = minor & 127;
struct vc_data *vc;
if (currcons == 0) if (currcons == 0)
currcons = fg_console; currcons = fg_console;
else else
currcons--; currcons--;
if (!vc_cons_allocated(currcons)) if (!vc_cons_allocated(currcons))
return -ENXIO; return -ENXIO;
vc = vc_cons[currcons].d;
size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_cols; size = vc->vc_rows * vc->vc_cols;
if (minor & 128) if (minor & 128)
size = 2*size + HEADER_SIZE; size = 2*size + HEADER_SIZE;
...@@ -442,7 +445,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) ...@@ -442,7 +445,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
buf += orig_count; buf += orig_count;
pos += orig_count; pos += orig_count;
if (org0) if (org0)
update_region(currcons, (unsigned long)(org0), org-org0); update_region(vc, (unsigned long)(org0), org - org0);
} }
*ppos += written; *ppos += written;
ret = written; ret = written;
......
...@@ -135,11 +135,11 @@ static const struct consw *con_driver_map[MAX_NR_CONSOLES]; ...@@ -135,11 +135,11 @@ static const struct consw *con_driver_map[MAX_NR_CONSOLES];
#endif #endif
static int con_open(struct tty_struct *, struct file *); static int con_open(struct tty_struct *, struct file *);
static void vc_init(unsigned int console, unsigned int rows, static void vc_init(struct vc_data *vc, unsigned int rows,
unsigned int cols, int do_clear); unsigned int cols, int do_clear);
static void gotoxy(struct vc_data *vc, int new_x, int new_y); static void gotoxy(struct vc_data *vc, int new_x, int new_y);
static void save_cur(int currcons); static void save_cur(struct vc_data *vc);
static void reset_terminal(int currcons, int do_clear); static void reset_terminal(struct vc_data *vc, int do_clear);
static void con_flush_chars(struct tty_struct *tty); static void con_flush_chars(struct tty_struct *tty);
static void set_vesa_blanking(char __user *p); static void set_vesa_blanking(char __user *p);
static void set_cursor(struct vc_data *vc); static void set_cursor(struct vc_data *vc);
...@@ -214,17 +214,12 @@ enum { ...@@ -214,17 +214,12 @@ enum {
* Low-Level Functions * Low-Level Functions
*/ */
#define IS_FG (currcons == fg_console) #define IS_FG(vc) ((vc)->vc_num == 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 #ifdef VT_BUF_VRAM_ONLY
#define DO_UPDATE 0 #define DO_UPDATE(vc) 0
#define DO_UPDATE_VC(vc) 0
#else #else
#define DO_UPDATE IS_VISIBLE #define DO_UPDATE(vc) CON_IS_VISIBLE(vc)
#define DO_UPDATE_VC(vc) CON_IS_VISIBLE(vc)
#endif #endif
static int pm_con_request(struct pm_dev *dev, pm_request_t rqst, void *data); static int pm_con_request(struct pm_dev *dev, pm_request_t rqst, void *data);
...@@ -254,38 +249,37 @@ void schedule_console_callback(void) ...@@ -254,38 +249,37 @@ void schedule_console_callback(void)
schedule_work(&console_work); schedule_work(&console_work);
} }
static void scrup(int currcons, unsigned int t, unsigned int b, int nr) static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
{ {
unsigned short *d, *s; unsigned short *d, *s;
if (t+nr >= b) if (t+nr >= b)
nr = b - t - 1; nr = b - t - 1;
if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1) if (b > vc->vc_rows || t >= b || nr < 1)
return; return;
if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr)) if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_UP, nr))
return; return;
d = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t); d = (unsigned short *)(origin + vc->vc_size_row * t);
s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*(t+nr)); s = (unsigned short *)(origin + vc->vc_size_row * (t + nr));
scr_memmovew(d, s, (b-t-nr) * vc_cons[currcons].d->vc_size_row); scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
scr_memsetw(d + (b-t-nr) * vc_cons[currcons].d->vc_cols, video_erase_char, scr_memsetw(d + (b - t - nr) * vc->vc_cols, video_erase_char,
vc_cons[currcons].d->vc_size_row * nr); vc->vc_size_row * nr);
} }
static void static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
scrdown(int currcons, unsigned int t, unsigned int b, int nr)
{ {
unsigned short *s; unsigned short *s;
unsigned int step; unsigned int step;
if (t+nr >= b) if (t+nr >= b)
nr = b - t - 1; nr = b - t - 1;
if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1) if (b > vc->vc_rows || t >= b || nr < 1)
return; return;
if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr)) if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_DOWN, nr))
return; return;
s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t); s = (unsigned short *)(origin + vc->vc_size_row * t);
step = vc_cons[currcons].d->vc_cols * nr; step = vc->vc_cols * nr;
scr_memmovew(s + step, s, (b-t-nr)*vc_cons[currcons].d->vc_size_row); scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
scr_memsetw(s, video_erase_char, 2*step); scr_memsetw(s, video_erase_char, 2*step);
} }
...@@ -335,23 +329,23 @@ static void do_update_region(struct vc_data *vc, unsigned long start, int count) ...@@ -335,23 +329,23 @@ static void do_update_region(struct vc_data *vc, unsigned long start, int count)
#endif #endif
} }
void update_region(int currcons, unsigned long start, int count) void update_region(struct vc_data *vc, unsigned long start, int count)
{ {
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (DO_UPDATE) { if (DO_UPDATE(vc)) {
hide_cursor(vc_cons[currcons].d); hide_cursor(vc);
do_update_region(vc_cons[currcons].d, start, count); do_update_region(vc, start, count);
set_cursor(vc_cons[currcons].d); set_cursor(vc);
} }
} }
/* Structure of attributes is hardware-dependent */ /* Structure of attributes is hardware-dependent */
static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse) static u8 build_attr(struct vc_data *vc, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse)
{ {
if (sw->con_build_attr) if (sw->con_build_attr)
return sw->con_build_attr(vc_cons[currcons].d, _color, _intensity, _blink, _underline, _reverse); return sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse);
#ifndef VT_BUF_VRAM_ONLY #ifndef VT_BUF_VRAM_ONLY
/* /*
...@@ -366,7 +360,7 @@ static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _unde ...@@ -366,7 +360,7 @@ static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _unde
*/ */
{ {
u8 a = color; u8 a = color;
if (!vc_cons[currcons].d->vc_can_do_color) if (!vc->vc_can_do_color)
return _intensity | return _intensity |
(_underline ? 4 : 0) | (_underline ? 4 : 0) |
(_reverse ? 8 : 0) | (_reverse ? 8 : 0) |
...@@ -390,10 +384,10 @@ static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _unde ...@@ -390,10 +384,10 @@ static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _unde
#endif #endif
} }
static void update_attr(int currcons) static void update_attr(struct vc_data *vc)
{ {
attr = build_attr(currcons, color, intensity, blink, underline, reverse ^ decscnm); attr = build_attr(vc, color, intensity, blink, underline, reverse ^ decscnm);
video_erase_char = (build_attr(currcons, color, 1, blink, 0, decscnm) << 8) | ' '; video_erase_char = (build_attr(vc, color, 1, blink, 0, decscnm) << 8) | ' ';
} }
/* Note: inverting the screen twice should revert to the original state */ /* Note: inverting the screen twice should revert to the original state */
...@@ -437,7 +431,7 @@ void invert_screen(struct vc_data *vc, int offset, int count, int viewed) ...@@ -437,7 +431,7 @@ void invert_screen(struct vc_data *vc, int offset, int count, int viewed)
} }
} }
#endif #endif
if (DO_UPDATE_VC(vc)) if (DO_UPDATE(vc))
do_update_region(vc, (unsigned long) p, count); do_update_region(vc, (unsigned long) p, count);
} }
...@@ -452,7 +446,7 @@ void complement_pos(struct vc_data *vc, int offset) ...@@ -452,7 +446,7 @@ void complement_pos(struct vc_data *vc, int offset)
if (p) { if (p) {
scr_writew(old, p); scr_writew(old, p);
if (DO_UPDATE_VC(vc)) if (DO_UPDATE(vc))
vc->vc_sw->con_putc(vc, old, oldy, oldx); vc->vc_sw->con_putc(vc, old, oldy, oldx);
} }
if (offset == -1) if (offset == -1)
...@@ -463,7 +457,7 @@ void complement_pos(struct vc_data *vc, int offset) ...@@ -463,7 +457,7 @@ void complement_pos(struct vc_data *vc, int offset)
old = scr_readw(p); old = scr_readw(p);
new = old ^ vc->vc_complement_mask; new = old ^ vc->vc_complement_mask;
scr_writew(new, p); scr_writew(new, p);
if (DO_UPDATE_VC(vc)) { if (DO_UPDATE(vc)) {
oldx = (offset >> 1) % vc->vc_cols; oldx = (offset >> 1) % vc->vc_cols;
oldy = (offset >> 1) / vc->vc_cols; oldy = (offset >> 1) / vc->vc_cols;
vc->vc_sw->con_putc(vc, new, oldy, oldx); vc->vc_sw->con_putc(vc, new, oldy, oldx);
...@@ -471,47 +465,45 @@ void complement_pos(struct vc_data *vc, int offset) ...@@ -471,47 +465,45 @@ void complement_pos(struct vc_data *vc, int offset)
} }
} }
static void insert_char(int currcons, unsigned int nr) static void insert_char(struct vc_data *vc, unsigned int nr)
{ {
unsigned short *p, *q = (unsigned short *) pos; unsigned short *p, *q = (unsigned short *) pos;
p = q + vc_cons[currcons].d->vc_cols - nr - x; p = q + vc->vc_cols - nr - x;
while (--p >= q) while (--p >= q)
scr_writew(scr_readw(p), p + nr); scr_writew(scr_readw(p), p + nr);
scr_memsetw(q, video_erase_char, nr*2); scr_memsetw(q, video_erase_char, nr*2);
need_wrap = 0; need_wrap = 0;
if (DO_UPDATE) { if (DO_UPDATE(vc)) {
unsigned short oldattr = attr; unsigned short oldattr = attr;
sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1, sw->con_bmove(vc, y, x, y, x + nr, 1,
vc_cons[currcons].d->vc_cols-x-nr); vc->vc_cols - x - nr);
attr = video_erase_char >> 8; attr = video_erase_char >> 8;
while (nr--) while (nr--)
sw->con_putc(vc_cons[currcons].d, sw->con_putc(vc, video_erase_char, y, x + nr);
video_erase_char,y,x+nr);
attr = oldattr; attr = oldattr;
} }
} }
static void delete_char(int currcons, unsigned int nr) static void delete_char(struct vc_data *vc, unsigned int nr)
{ {
unsigned int i = x; unsigned int i = x;
unsigned short *p = (unsigned short *) pos; unsigned short *p = (unsigned short *) pos;
while (++i <= vc_cons[currcons].d->vc_cols - nr) { while (++i <= vc->vc_cols - nr) {
scr_writew(scr_readw(p+nr), p); scr_writew(scr_readw(p+nr), p);
p++; p++;
} }
scr_memsetw(p, video_erase_char, nr*2); scr_memsetw(p, video_erase_char, nr*2);
need_wrap = 0; need_wrap = 0;
if (DO_UPDATE) { if (DO_UPDATE(vc)) {
unsigned short oldattr = attr; unsigned short oldattr = attr;
sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1, sw->con_bmove(vc, y, x + nr, y, x, 1,
vc_cons[currcons].d->vc_cols-x-nr); vc->vc_cols - x - nr);
attr = video_erase_char >> 8; attr = video_erase_char >> 8;
while (nr--) while (nr--)
sw->con_putc(vc_cons[currcons].d, sw->con_putc(vc, video_erase_char, y,
video_erase_char, y, vc->vc_cols - 1 - nr);
vc_cons[currcons].d->vc_cols-1-nr);
attr = oldattr; attr = oldattr;
} }
} }
...@@ -531,7 +523,7 @@ static void add_softcursor(struct vc_data *vc) ...@@ -531,7 +523,7 @@ static void add_softcursor(struct vc_data *vc)
if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000; if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000;
if ((type & 0x40) && ((i & 0x700) == ((i & 0x7000) >> 4))) i ^= 0x0700; if ((type & 0x40) && ((i & 0x700) == ((i & 0x7000) >> 4))) i ^= 0x0700;
scr_writew(i, (u16 *) vc->vc_pos); scr_writew(i, (u16 *) vc->vc_pos);
if (DO_UPDATE_VC(vc)) if (DO_UPDATE(vc))
vc->vc_sw->con_putc(vc, i, vc->vc_y, vc->vc_x); vc->vc_sw->con_putc(vc, i, vc->vc_y, vc->vc_x);
} }
...@@ -539,7 +531,7 @@ static void hide_softcursor(struct vc_data *vc) ...@@ -539,7 +531,7 @@ static void hide_softcursor(struct vc_data *vc)
{ {
if (softcursor_original != -1) { if (softcursor_original != -1) {
scr_writew(softcursor_original, (u16 *)vc->vc_pos); scr_writew(softcursor_original, (u16 *)vc->vc_pos);
if (DO_UPDATE_VC(vc)) if (DO_UPDATE(vc))
vc->vc_sw->con_putc(vc, softcursor_original, vc->vc_sw->con_putc(vc, softcursor_original,
vc->vc_y, vc->vc_x); vc->vc_y, vc->vc_x);
softcursor_original = -1; softcursor_original = -1;
...@@ -556,7 +548,7 @@ static void hide_cursor(struct vc_data *vc) ...@@ -556,7 +548,7 @@ static void hide_cursor(struct vc_data *vc)
static void set_cursor(struct vc_data *vc) static void set_cursor(struct vc_data *vc)
{ {
if (!IS_FG_VC(vc) || console_blanked || if (!IS_FG(vc) || console_blanked ||
vc->vc_vt->vc_mode == KD_GRAPHICS) vc->vc_vt->vc_mode == KD_GRAPHICS)
return; return;
if (vc->vc_deccm) { if (vc->vc_deccm) {
...@@ -569,32 +561,32 @@ static void set_cursor(struct vc_data *vc) ...@@ -569,32 +561,32 @@ static void set_cursor(struct vc_data *vc)
hide_cursor(vc); hide_cursor(vc);
} }
static void set_origin(int currcons) static void set_origin(struct vc_data *vc)
{ {
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (!IS_VISIBLE || if (!CON_IS_VISIBLE(vc) ||
!sw->con_set_origin || !sw->con_set_origin ||
!sw->con_set_origin(vc_cons[currcons].d)) !sw->con_set_origin(vc))
origin = (unsigned long) screenbuf; origin = (unsigned long) screenbuf;
visible_origin = origin; visible_origin = origin;
scr_end = origin + screenbuf_size; scr_end = origin + screenbuf_size;
pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x; pos = origin + vc->vc_size_row * y + 2 * x;
} }
static inline void save_screen(int currcons) static inline void save_screen(struct vc_data *vc)
{ {
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (sw->con_save_screen) if (sw->con_save_screen)
sw->con_save_screen(vc_cons[currcons].d); sw->con_save_screen(vc);
} }
/* /*
* Redrawing of screen * Redrawing of screen
*/ */
static void clear_buffer_attributes(int currcons) static void clear_buffer_attributes(struct vc_data *vc)
{ {
unsigned short *p = (unsigned short *) origin; unsigned short *p = (unsigned short *) origin;
int count = screenbuf_size/2; int count = screenbuf_size/2;
...@@ -605,62 +597,57 @@ static void clear_buffer_attributes(int currcons) ...@@ -605,62 +597,57 @@ static void clear_buffer_attributes(int currcons)
} }
} }
void redraw_screen(int new_console, int is_switch) void redraw_screen(struct vc_data *vc, int is_switch)
{ {
int redraw = 1; int redraw = 0;
int currcons, old_console;
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (!vc_cons_allocated(new_console)) { if (!vc) {
/* strange ... */ /* strange ... */
/* printk("redraw_screen: tty %d not allocated ??\n", new_console+1); */ /* printk("redraw_screen: tty %d not allocated ??\n", new_console+1); */
return; return;
} }
if (is_switch) { if (is_switch) {
currcons = fg_console; struct vc_data *old_vc = vc_cons[fg_console].d;
hide_cursor(vc_cons[currcons].d); if (old_vc == vc)
if (fg_console != new_console) { return;
struct vc_data **display = vc_cons[new_console].d->vc_display_fg; if (!CON_IS_VISIBLE(vc))
old_console = (*display) ? (*display)->vc_num : fg_console; redraw = 1;
*display = vc_cons[new_console].d; *vc->vc_display_fg = vc;
fg_console = new_console; fg_console = vc->vc_num;
currcons = old_console; hide_cursor(old_vc);
if (!IS_VISIBLE) { if (!CON_IS_VISIBLE(old_vc)) {
save_screen(currcons); save_screen(old_vc);
set_origin(currcons); set_origin(old_vc);
}
currcons = new_console;
if (old_console == new_console)
redraw = 0;
} }
} else { } else {
currcons = new_console; hide_cursor(vc);
hide_cursor(vc_cons[currcons].d); redraw = 1;
} }
if (redraw) { if (redraw) {
int update; int update;
int old_was_color = vc_cons[currcons].d->vc_can_do_color; int old_was_color = vc->vc_can_do_color;
set_origin(currcons); set_origin(vc);
update = sw->con_switch(vc_cons[currcons].d); update = sw->con_switch(vc);
set_palette(currcons); set_palette(vc);
/* /*
* If console changed from mono<->color, the best we can do * If console changed from mono<->color, the best we can do
* is to clear the buffer attributes. As it currently stands, * is to clear the buffer attributes. As it currently stands,
* rebuilding new attributes from the old buffer is not doable * rebuilding new attributes from the old buffer is not doable
* without overly complex code. * without overly complex code.
*/ */
if (old_was_color != vc_cons[currcons].d->vc_can_do_color) { if (old_was_color != vc->vc_can_do_color) {
update_attr(currcons); update_attr(vc);
clear_buffer_attributes(currcons); clear_buffer_attributes(vc);
} }
if (update && vcmode != KD_GRAPHICS) if (update && vcmode != KD_GRAPHICS)
do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2); do_update_region(vc, origin, screenbuf_size / 2);
} }
set_cursor(vc_cons[currcons].d); set_cursor(vc);
if (is_switch) { if (is_switch) {
set_leds(); set_leds();
compute_shiftstate(); compute_shiftstate();
...@@ -676,31 +663,30 @@ int vc_cons_allocated(unsigned int i) ...@@ -676,31 +663,30 @@ int vc_cons_allocated(unsigned int i)
return (i < MAX_NR_CONSOLES && vc_cons[i].d); return (i < MAX_NR_CONSOLES && vc_cons[i].d);
} }
static void visual_init(int currcons, int init) static void visual_init(struct vc_data *vc, int num, int init)
{ {
/* ++Geert: sw->con_init determines console size */ /* ++Geert: sw->con_init determines console size */
if (sw) if (sw)
module_put(sw->owner); module_put(sw->owner);
sw = conswitchp; sw = conswitchp;
#ifndef VT_SINGLE_DRIVER #ifndef VT_SINGLE_DRIVER
if (con_driver_map[currcons]) if (con_driver_map[num])
sw = con_driver_map[currcons]; sw = con_driver_map[num];
#endif #endif
__module_get(sw->owner); __module_get(sw->owner);
cons_num = currcons; vc->vc_num = num;
display_fg = &master_display_fg; display_fg = &master_display_fg;
vc_cons[currcons].d->vc_uni_pagedir_loc = &vc_cons[currcons].d->vc_uni_pagedir; vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir;
vc_cons[currcons].d->vc_uni_pagedir = 0; vc->vc_uni_pagedir = 0;
hi_font_mask = 0; hi_font_mask = 0;
complement_mask = 0; complement_mask = 0;
vc_cons[currcons].d->vc_can_do_color = 0; vc->vc_can_do_color = 0;
sw->con_init(vc_cons[currcons].d, init); sw->con_init(vc, init);
if (!complement_mask) if (!complement_mask)
complement_mask = complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
vc_cons[currcons].d->vc_can_do_color ? 0x7700 : 0x0800;
s_complement_mask = complement_mask; s_complement_mask = complement_mask;
vc_cons[currcons].d->vc_size_row = vc_cons[currcons].d->vc_cols<<1; vc->vc_size_row = vc->vc_cols << 1;
screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row; screenbuf_size = vc->vc_rows * vc->vc_size_row;
} }
int vc_allocate(unsigned int currcons) /* return 0 on success */ int vc_allocate(unsigned int currcons) /* return 0 on success */
...@@ -710,6 +696,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ ...@@ -710,6 +696,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
if (currcons >= MAX_NR_CONSOLES) if (currcons >= MAX_NR_CONSOLES)
return -ENXIO; return -ENXIO;
if (!vc_cons[currcons].d) { if (!vc_cons[currcons].d) {
struct vc_data *vc;
long p, q; long p, q;
/* prevent users from taking too much memory */ /* prevent users from taking too much memory */
...@@ -726,12 +713,12 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ ...@@ -726,12 +713,12 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
if (!p) if (!p)
return -ENOMEM; return -ENOMEM;
memset((void *)p, 0, structsize); memset((void *)p, 0, structsize);
vc_cons[currcons].d = (struct vc_data *)p; vc_cons[currcons].d = vc = (struct vc_data *)p;
vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data)); vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
vc_cons[currcons].d->vc_vt = vt_cons[currcons]; vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(currcons, 1); visual_init(vc, currcons, 1);
if (!*vc_cons[currcons].d->vc_uni_pagedir_loc) if (!*vc->vc_uni_pagedir_loc)
con_set_default_unimap(currcons); con_set_default_unimap(vc);
q = (long)kmalloc(screenbuf_size, GFP_KERNEL); q = (long)kmalloc(screenbuf_size, GFP_KERNEL);
if (!q) { if (!q) {
kfree((char *) p); kfree((char *) p);
...@@ -741,7 +728,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ ...@@ -741,7 +728,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
} }
screenbuf = (unsigned short *) q; screenbuf = (unsigned short *) q;
kmalloced = 1; kmalloced = 1;
vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols, 1); vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
if (!pm_con) { if (!pm_con) {
pm_con = pm_register(PM_SYS_DEV, pm_con = pm_register(PM_SYS_DEV,
...@@ -752,13 +739,13 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ ...@@ -752,13 +739,13 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
return 0; return 0;
} }
inline int resize_screen(int currcons, int width, int height) inline int resize_screen(struct vc_data *vc, int width, int height)
{ {
/* Resizes the resolution of the display adapater */ /* Resizes the resolution of the display adapater */
int err = 0; int err = 0;
if (vcmode != KD_GRAPHICS && sw->con_resize) if (vcmode != KD_GRAPHICS && sw->con_resize)
err = sw->con_resize(vc_cons[currcons].d, width, height); err = sw->con_resize(vc, width, height);
return err; return err;
} }
...@@ -769,7 +756,7 @@ inline int resize_screen(int currcons, int width, int height) ...@@ -769,7 +756,7 @@ inline int resize_screen(int currcons, int width, int height)
*/ */
#define VC_RESIZE_MAXCOL (32767) #define VC_RESIZE_MAXCOL (32767)
#define VC_RESIZE_MAXROW (32767) #define VC_RESIZE_MAXROW (32767)
int vc_resize(int currcons, unsigned int cols, unsigned int lines) int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
{ {
unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; 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; unsigned int old_cols, old_rows, old_row_size, old_screen_size;
...@@ -778,38 +765,38 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines) ...@@ -778,38 +765,38 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines)
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (!vc_cons_allocated(currcons)) if (!vc)
return -ENXIO; return -ENXIO;
if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW) if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW)
return -EINVAL; return -EINVAL;
new_cols = (cols ? cols : vc_cons[currcons].d->vc_cols); new_cols = (cols ? cols : vc->vc_cols);
new_rows = (lines ? lines : vc_cons[currcons].d->vc_rows); new_rows = (lines ? lines : vc->vc_rows);
new_row_size = new_cols << 1; new_row_size = new_cols << 1;
new_screen_size = new_row_size * new_rows; new_screen_size = new_row_size * new_rows;
if (new_cols == vc_cons[currcons].d->vc_cols && new_rows == vc_cons[currcons].d->vc_rows) if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
return 0; return 0;
newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER); newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER);
if (!newscreen) if (!newscreen)
return -ENOMEM; return -ENOMEM;
old_rows = vc_cons[currcons].d->vc_rows; old_rows = vc->vc_rows;
old_cols = vc_cons[currcons].d->vc_cols; old_cols = vc->vc_cols;
old_row_size = vc_cons[currcons].d->vc_size_row; old_row_size = vc->vc_size_row;
old_screen_size = screenbuf_size; old_screen_size = screenbuf_size;
err = resize_screen(currcons, new_cols, new_rows); err = resize_screen(vc, new_cols, new_rows);
if (err) { if (err) {
kfree(newscreen); kfree(newscreen);
return err; return err;
} }
vc_cons[currcons].d->vc_rows = new_rows; vc->vc_rows = new_rows;
vc_cons[currcons].d->vc_cols = new_cols; vc->vc_cols = new_cols;
vc_cons[currcons].d->vc_size_row = new_row_size; vc->vc_size_row = new_row_size;
screenbuf_size = new_screen_size; screenbuf_size = new_screen_size;
rlth = min(old_row_size, new_row_size); rlth = min(old_row_size, new_row_size);
...@@ -820,7 +807,7 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines) ...@@ -820,7 +807,7 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines)
if (new_rows < old_rows) if (new_rows < old_rows)
old_origin += (old_rows - new_rows) * old_row_size; old_origin += (old_rows - new_rows) * old_row_size;
update_attr(currcons); update_attr(vc);
while (old_origin < scr_end) { while (old_origin < scr_end) {
scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth); scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth);
...@@ -836,29 +823,29 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines) ...@@ -836,29 +823,29 @@ int vc_resize(int currcons, unsigned int cols, unsigned int lines)
screenbuf = newscreen; screenbuf = newscreen;
kmalloced = 1; kmalloced = 1;
screenbuf_size = new_screen_size; screenbuf_size = new_screen_size;
set_origin(currcons); set_origin(vc);
/* do part of a reset_terminal() */ /* do part of a reset_terminal() */
top = 0; top = 0;
bottom = vc_cons[currcons].d->vc_rows; bottom = vc->vc_rows;
gotoxy(vc_cons[currcons].d, x, y); gotoxy(vc, x, y);
save_cur(currcons); save_cur(vc);
if (vc_cons[currcons].d->vc_tty) { if (vc->vc_tty) {
struct winsize ws, *cws = &vc_cons[currcons].d->vc_tty->winsize; struct winsize ws, *cws = &vc->vc_tty->winsize;
memset(&ws, 0, sizeof(ws)); memset(&ws, 0, sizeof(ws));
ws.ws_row = vc_cons[currcons].d->vc_rows; ws.ws_row = vc->vc_rows;
ws.ws_col = vc_cons[currcons].d->vc_cols; ws.ws_col = vc->vc_cols;
ws.ws_ypixel = video_scan_lines; ws.ws_ypixel = video_scan_lines;
if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) && if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
vc_cons[currcons].d->vc_tty->pgrp > 0) vc->vc_tty->pgrp > 0)
kill_pg(vc_cons[currcons].d->vc_tty->pgrp, SIGWINCH, 1); kill_pg(vc->vc_tty->pgrp, SIGWINCH, 1);
*cws = ws; *cws = ws;
} }
if (IS_VISIBLE) if (CON_IS_VISIBLE(vc))
update_screen(currcons); update_screen(vc);
return err; return err;
} }
...@@ -868,11 +855,12 @@ void vc_disallocate(unsigned int currcons) ...@@ -868,11 +855,12 @@ void vc_disallocate(unsigned int currcons)
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (vc_cons_allocated(currcons)) { if (vc_cons_allocated(currcons)) {
sw->con_deinit(vc_cons[currcons].d); struct vc_data *vc = vc_cons[currcons].d;
sw->con_deinit(vc);
if (kmalloced) if (kmalloced)
kfree(screenbuf); kfree(screenbuf);
if (currcons >= MIN_NR_CONSOLES) if (currcons >= MIN_NR_CONSOLES)
kfree(vc_cons[currcons].d); kfree(vc);
vc_cons[currcons].d = NULL; vc_cons[currcons].d = NULL;
} }
} }
...@@ -881,9 +869,9 @@ void vc_disallocate(unsigned int currcons) ...@@ -881,9 +869,9 @@ void vc_disallocate(unsigned int currcons)
* VT102 emulator * VT102 emulator
*/ */
#define set_kbd(x) set_vc_kbd_mode(kbd_table+currcons,x) #define set_kbd(vc, x) set_vc_kbd_mode(kbd_table + (vc)->vc_num, (x))
#define clr_kbd(x) clr_vc_kbd_mode(kbd_table+currcons,x) #define clr_kbd(vc, x) clr_vc_kbd_mode(kbd_table + (vc)->vc_num, (x))
#define is_kbd(x) vc_kbd_mode(kbd_table+currcons,x) #define is_kbd(vc, x) vc_kbd_mode(kbd_table + (vc)->vc_num, (x))
#define decarm VC_REPEAT #define decarm VC_REPEAT
#define decckm VC_CKMODE #define decckm VC_CKMODE
...@@ -943,64 +931,60 @@ static void gotoxy(struct vc_data *vc, int new_x, int new_y) ...@@ -943,64 +931,60 @@ static void gotoxy(struct vc_data *vc, int new_x, int new_y)
} }
/* for absolute user moves, when decom is set */ /* for absolute user moves, when decom is set */
static void gotoxay(int currcons, int new_x, int new_y) static void gotoxay(struct vc_data *vc, int new_x, int new_y)
{ {
gotoxy(vc_cons[currcons].d, new_x, decom ? (top+new_y) : new_y); gotoxy(vc, new_x, decom ? (top+new_y) : new_y);
} }
void scrollback(int lines) void scrollback(struct vc_data *vc, int lines)
{ {
int currcons = fg_console;
if (!lines) if (!lines)
lines = vc_cons[currcons].d->vc_rows/2; lines = vc->vc_rows / 2;
scrolldelta(-lines); scrolldelta(-lines);
} }
void scrollfront(int lines) void scrollfront(struct vc_data *vc, int lines)
{ {
int currcons = fg_console;
if (!lines) if (!lines)
lines = vc_cons[currcons].d->vc_rows/2; lines = vc->vc_rows / 2;
scrolldelta(lines); scrolldelta(lines);
} }
static void lf(int currcons) static void lf(struct vc_data *vc)
{ {
/* don't scroll if above bottom of scrolling region, or /* don't scroll if above bottom of scrolling region, or
* if below scrolling region * if below scrolling region
*/ */
if (y+1 == bottom) if (y+1 == bottom)
scrup(currcons,top,bottom,1); scrup(vc, top, bottom, 1);
else if (y < vc_cons[currcons].d->vc_rows-1) { else if (y < vc->vc_rows - 1) {
y++; y++;
pos += vc_cons[currcons].d->vc_size_row; pos += vc->vc_size_row;
} }
need_wrap = 0; need_wrap = 0;
} }
static void ri(int currcons) static void ri(struct vc_data *vc)
{ {
/* don't scroll if below top of scrolling region, or /* don't scroll if below top of scrolling region, or
* if above scrolling region * if above scrolling region
*/ */
if (y == top) if (y == top)
scrdown(currcons,top,bottom,1); scrdown(vc, top, bottom, 1);
else if (y > 0) { else if (y > 0) {
y--; y--;
pos -= vc_cons[currcons].d->vc_size_row; pos -= vc->vc_size_row;
} }
need_wrap = 0; need_wrap = 0;
} }
static inline void cr(int currcons) static inline void cr(struct vc_data *vc)
{ {
pos -= x<<1; pos -= x<<1;
need_wrap = x = 0; need_wrap = x = 0;
} }
static inline void bs(int currcons) static inline void bs(struct vc_data *vc)
{ {
if (x) { if (x) {
pos -= 2; pos -= 2;
...@@ -1009,12 +993,12 @@ static inline void bs(int currcons) ...@@ -1009,12 +993,12 @@ static inline void bs(int currcons)
} }
} }
static inline void del(int currcons) static inline void del(struct vc_data *vc)
{ {
/* ignored */ /* ignored */
} }
static void csi_J(int currcons, int vpar) static void csi_J(struct vc_data *vc, int vpar)
{ {
unsigned int count; unsigned int count;
unsigned short * start; unsigned short * start;
...@@ -1023,33 +1007,33 @@ static void csi_J(int currcons, int vpar) ...@@ -1023,33 +1007,33 @@ static void csi_J(int currcons, int vpar)
case 0: /* erase from cursor to end of display */ case 0: /* erase from cursor to end of display */
count = (scr_end-pos)>>1; count = (scr_end-pos)>>1;
start = (unsigned short *) pos; start = (unsigned short *) pos;
if (DO_UPDATE) { if (DO_UPDATE(vc)) {
/* do in two stages */ /* do in two stages */
sw->con_clear(vc_cons[currcons].d, y, x, 1, sw->con_clear(vc, y, x, 1,
vc_cons[currcons].d->vc_cols-x); vc->vc_cols - x);
sw->con_clear(vc_cons[currcons].d, y+1, 0, sw->con_clear(vc, y + 1, 0,
vc_cons[currcons].d->vc_rows-y-1, vc->vc_rows - y - 1,
vc_cons[currcons].d->vc_cols); vc->vc_cols);
} }
break; break;
case 1: /* erase from start to cursor */ case 1: /* erase from start to cursor */
count = ((pos-origin)>>1)+1; count = ((pos-origin)>>1)+1;
start = (unsigned short *) origin; start = (unsigned short *) origin;
if (DO_UPDATE) { if (DO_UPDATE(vc)) {
/* do in two stages */ /* do in two stages */
sw->con_clear(vc_cons[currcons].d, 0, 0, y, sw->con_clear(vc, 0, 0, y,
vc_cons[currcons].d->vc_cols); vc->vc_cols);
sw->con_clear(vc_cons[currcons].d, y, 0, 1, sw->con_clear(vc, y, 0, 1,
x + 1); x + 1);
} }
break; break;
case 2: /* erase whole display */ case 2: /* erase whole display */
count = vc_cons[currcons].d->vc_cols * vc_cons[currcons].d->vc_rows; count = vc->vc_cols * vc->vc_rows;
start = (unsigned short *) origin; start = (unsigned short *) origin;
if (DO_UPDATE) if (DO_UPDATE(vc))
sw->con_clear(vc_cons[currcons].d, 0, 0, sw->con_clear(vc, 0, 0,
vc_cons[currcons].d->vc_rows, vc->vc_rows,
vc_cons[currcons].d->vc_cols); vc->vc_cols);
break; break;
default: default:
return; return;
...@@ -1058,32 +1042,32 @@ static void csi_J(int currcons, int vpar) ...@@ -1058,32 +1042,32 @@ static void csi_J(int currcons, int vpar)
need_wrap = 0; need_wrap = 0;
} }
static void csi_K(int currcons, int vpar) static void csi_K(struct vc_data *vc, int vpar)
{ {
unsigned int count; unsigned int count;
unsigned short * start; unsigned short * start;
switch (vpar) { switch (vpar) {
case 0: /* erase from cursor to end of line */ case 0: /* erase from cursor to end of line */
count = vc_cons[currcons].d->vc_cols-x; count = vc->vc_cols - x;
start = (unsigned short *) pos; start = (unsigned short *) pos;
if (DO_UPDATE) if (DO_UPDATE(vc))
sw->con_clear(vc_cons[currcons].d, y, x, 1, sw->con_clear(vc, y, x, 1,
vc_cons[currcons].d->vc_cols-x); vc->vc_cols - x);
break; break;
case 1: /* erase from start of line to cursor */ case 1: /* erase from start of line to cursor */
start = (unsigned short *) (pos - (x<<1)); start = (unsigned short *) (pos - (x<<1));
count = x+1; count = x+1;
if (DO_UPDATE) if (DO_UPDATE(vc))
sw->con_clear(vc_cons[currcons].d, y, 0, 1, sw->con_clear(vc, y, 0, 1,
x + 1); x + 1);
break; break;
case 2: /* erase whole line */ case 2: /* erase whole line */
start = (unsigned short *) (pos - (x<<1)); start = (unsigned short *) (pos - (x<<1));
count = vc_cons[currcons].d->vc_cols; count = vc->vc_cols;
if (DO_UPDATE) if (DO_UPDATE(vc))
sw->con_clear(vc_cons[currcons].d, y, 0, 1, sw->con_clear(vc, y, 0, 1,
vc_cons[currcons].d->vc_cols); vc->vc_cols);
break; break;
default: default:
return; return;
...@@ -1092,21 +1076,21 @@ static void csi_K(int currcons, int vpar) ...@@ -1092,21 +1076,21 @@ static void csi_K(int currcons, int vpar)
need_wrap = 0; need_wrap = 0;
} }
static void csi_X(int currcons, int vpar) /* erase the following vpar positions */ static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */
{ /* not vt100? */ { /* not vt100? */
int count; int count;
if (!vpar) if (!vpar)
vpar++; vpar++;
count = (vpar > vc_cons[currcons].d->vc_cols-x) ? (vc_cons[currcons].d->vc_cols-x) : vpar; count = (vpar > vc->vc_cols - x) ? (vc->vc_cols - x) : vpar;
scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count); scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count);
if (DO_UPDATE) if (DO_UPDATE(vc))
sw->con_clear(vc_cons[currcons].d, y, x, 1, count); sw->con_clear(vc, y, x, 1, count);
need_wrap = 0; need_wrap = 0;
} }
static void default_attr(int currcons) static void default_attr(struct vc_data *vc)
{ {
intensity = 1; intensity = 1;
underline = 0; underline = 0;
...@@ -1116,14 +1100,14 @@ static void default_attr(int currcons) ...@@ -1116,14 +1100,14 @@ static void default_attr(int currcons)
} }
/* console_sem is held */ /* console_sem is held */
static void csi_m(int currcons) static void csi_m(struct vc_data *vc)
{ {
int i; int i;
for (i=0;i<=npar;i++) for (i=0;i<=npar;i++)
switch (par[i]) { switch (par[i]) {
case 0: /* all attributes off */ case 0: /* all attributes off */
default_attr(currcons); default_attr(vc);
break; break;
case 1: case 1:
intensity = 2; intensity = 2;
...@@ -1147,7 +1131,7 @@ static void csi_m(int currcons) ...@@ -1147,7 +1131,7 @@ static void csi_m(int currcons)
*/ */
translate = set_translate(charset == 0 translate = set_translate(charset == 0
? G0_charset ? G0_charset
: G1_charset,currcons); : G1_charset, vc);
disp_ctrl = 0; disp_ctrl = 0;
toggle_meta = 0; toggle_meta = 0;
break; break;
...@@ -1155,7 +1139,7 @@ static void csi_m(int currcons) ...@@ -1155,7 +1139,7 @@ static void csi_m(int currcons)
* Select first alternate font, lets * Select first alternate font, lets
* chars < 32 be displayed as ROM chars. * chars < 32 be displayed as ROM chars.
*/ */
translate = set_translate(IBMPC_MAP,currcons); translate = set_translate(IBMPC_MAP, vc);
disp_ctrl = 1; disp_ctrl = 1;
toggle_meta = 0; toggle_meta = 0;
break; break;
...@@ -1163,7 +1147,7 @@ static void csi_m(int currcons) ...@@ -1163,7 +1147,7 @@ static void csi_m(int currcons)
* Select second alternate font, toggle * Select second alternate font, toggle
* high bit before displaying as ROM char. * high bit before displaying as ROM char.
*/ */
translate = set_translate(IBMPC_MAP,currcons); translate = set_translate(IBMPC_MAP, vc);
disp_ctrl = 1; disp_ctrl = 1;
toggle_meta = 1; toggle_meta = 1;
break; break;
...@@ -1208,7 +1192,7 @@ static void csi_m(int currcons) ...@@ -1208,7 +1192,7 @@ static void csi_m(int currcons)
| foreground; | foreground;
break; break;
} }
update_attr(currcons); update_attr(vc);
} }
static void respond_string(const char *p, struct tty_struct *tty) static void respond_string(const char *p, struct tty_struct *tty)
...@@ -1220,7 +1204,7 @@ static void respond_string(const char *p, struct tty_struct *tty) ...@@ -1220,7 +1204,7 @@ static void respond_string(const char *p, struct tty_struct *tty)
con_schedule_flip(tty); con_schedule_flip(tty);
} }
static void cursor_report(int currcons, struct tty_struct *tty) static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
{ {
char buf[40]; char buf[40];
...@@ -1250,13 +1234,13 @@ void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry) ...@@ -1250,13 +1234,13 @@ void mouse_report(struct tty_struct *tty, int butt, int mrx, int mry)
/* invoked via ioctl(TIOCLINUX) and through set_selection */ /* invoked via ioctl(TIOCLINUX) and through set_selection */
int mouse_reporting(void) int mouse_reporting(void)
{ {
int currcons = fg_console; struct vc_data *vc = vc_cons[fg_console].d;
return report_mouse; return report_mouse;
} }
/* console_sem is held */ /* console_sem is held */
static void set_mode(int currcons, int on_off) static void set_mode(struct vc_data *vc, int on_off)
{ {
int i; int i;
...@@ -1264,14 +1248,14 @@ static void set_mode(int currcons, int on_off) ...@@ -1264,14 +1248,14 @@ static void set_mode(int currcons, int on_off)
if (ques) switch(par[i]) { /* DEC private modes set/reset */ if (ques) switch(par[i]) { /* DEC private modes set/reset */
case 1: /* Cursor keys send ^[Ox/^[[x */ case 1: /* Cursor keys send ^[Ox/^[[x */
if (on_off) if (on_off)
set_kbd(decckm); set_kbd(vc, decckm);
else else
clr_kbd(decckm); clr_kbd(vc, decckm);
break; break;
case 3: /* 80/132 mode switch unimplemented */ case 3: /* 80/132 mode switch unimplemented */
deccolm = on_off; deccolm = on_off;
#if 0 #if 0
(void) vc_resize(deccolm ? 132 : 80, vc_cons[currcons].d->vc_rows); vc_resize(deccolm ? 132 : 80, vc->vc_rows);
/* this alone does not suffice; some user mode /* this alone does not suffice; some user mode
utility has to change the hardware regs */ utility has to change the hardware regs */
#endif #endif
...@@ -1279,22 +1263,22 @@ static void set_mode(int currcons, int on_off) ...@@ -1279,22 +1263,22 @@ static void set_mode(int currcons, int on_off)
case 5: /* Inverted screen on/off */ case 5: /* Inverted screen on/off */
if (decscnm != on_off) { if (decscnm != on_off) {
decscnm = on_off; decscnm = on_off;
invert_screen(vc_cons[currcons].d, 0, screenbuf_size, 0); invert_screen(vc, 0, screenbuf_size, 0);
update_attr(currcons); update_attr(vc);
} }
break; break;
case 6: /* Origin relative/absolute */ case 6: /* Origin relative/absolute */
decom = on_off; decom = on_off;
gotoxay(currcons,0,0); gotoxay(vc, 0, 0);
break; break;
case 7: /* Autowrap on/off */ case 7: /* Autowrap on/off */
decawm = on_off; decawm = on_off;
break; break;
case 8: /* Autorepeat on/off */ case 8: /* Autorepeat on/off */
if (on_off) if (on_off)
set_kbd(decarm); set_kbd(vc, decarm);
else else
clr_kbd(decarm); clr_kbd(vc, decarm);
break; break;
case 9: case 9:
report_mouse = on_off ? 1 : 0; report_mouse = on_off ? 1 : 0;
...@@ -1314,39 +1298,39 @@ static void set_mode(int currcons, int on_off) ...@@ -1314,39 +1298,39 @@ static void set_mode(int currcons, int on_off)
break; break;
case 20: /* Lf, Enter == CrLf/Lf */ case 20: /* Lf, Enter == CrLf/Lf */
if (on_off) if (on_off)
set_kbd(lnm); set_kbd(vc, lnm);
else else
clr_kbd(lnm); clr_kbd(vc, lnm);
break; break;
} }
} }
/* console_sem is held */ /* console_sem is held */
static void setterm_command(int currcons) static void setterm_command(struct vc_data *vc)
{ {
switch(par[0]) { switch(par[0]) {
case 1: /* set color for underline mode */ case 1: /* set color for underline mode */
if (vc_cons[currcons].d->vc_can_do_color && if (vc->vc_can_do_color &&
par[1] < 16) { par[1] < 16) {
ulcolor = color_table[par[1]]; ulcolor = color_table[par[1]];
if (underline) if (underline)
update_attr(currcons); update_attr(vc);
} }
break; break;
case 2: /* set color for half intensity mode */ case 2: /* set color for half intensity mode */
if (vc_cons[currcons].d->vc_can_do_color && if (vc->vc_can_do_color &&
par[1] < 16) { par[1] < 16) {
halfcolor = color_table[par[1]]; halfcolor = color_table[par[1]];
if (intensity == 0) if (intensity == 0)
update_attr(currcons); update_attr(vc);
} }
break; break;
case 8: /* store colors as defaults */ case 8: /* store colors as defaults */
def_color = attr; def_color = attr;
if (hi_font_mask == 0x100) if (hi_font_mask == 0x100)
def_color >>= 1; def_color >>= 1;
default_attr(currcons); default_attr(vc);
update_attr(currcons); update_attr(vc);
break; break;
case 9: /* set blanking interval */ case 9: /* set blanking interval */
blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ; blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
...@@ -1382,49 +1366,49 @@ static void setterm_command(int currcons) ...@@ -1382,49 +1366,49 @@ static void setterm_command(int currcons)
} }
/* console_sem is held */ /* console_sem is held */
static void csi_at(int currcons, unsigned int nr) static void csi_at(struct vc_data *vc, unsigned int nr)
{ {
if (nr > vc_cons[currcons].d->vc_cols - x) if (nr > vc->vc_cols - x)
nr = vc_cons[currcons].d->vc_cols - x; nr = vc->vc_cols - x;
else if (!nr) else if (!nr)
nr = 1; nr = 1;
insert_char(currcons, nr); insert_char(vc, nr);
} }
/* console_sem is held */ /* console_sem is held */
static void csi_L(int currcons, unsigned int nr) static void csi_L(struct vc_data *vc, unsigned int nr)
{ {
if (nr > vc_cons[currcons].d->vc_rows - y) if (nr > vc->vc_rows - y)
nr = vc_cons[currcons].d->vc_rows - y; nr = vc->vc_rows - y;
else if (!nr) else if (!nr)
nr = 1; nr = 1;
scrdown(currcons,y,bottom,nr); scrdown(vc, y, bottom, nr);
need_wrap = 0; need_wrap = 0;
} }
/* console_sem is held */ /* console_sem is held */
static void csi_P(int currcons, unsigned int nr) static void csi_P(struct vc_data *vc, unsigned int nr)
{ {
if (nr > vc_cons[currcons].d->vc_cols - x) if (nr > vc->vc_cols - x)
nr = vc_cons[currcons].d->vc_cols - x; nr = vc->vc_cols - x;
else if (!nr) else if (!nr)
nr = 1; nr = 1;
delete_char(currcons, nr); delete_char(vc, nr);
} }
/* console_sem is held */ /* console_sem is held */
static void csi_M(int currcons, unsigned int nr) static void csi_M(struct vc_data *vc, unsigned int nr)
{ {
if (nr > vc_cons[currcons].d->vc_rows - y) if (nr > vc->vc_rows - y)
nr = vc_cons[currcons].d->vc_rows - y; nr = vc->vc_rows - y;
else if (!nr) else if (!nr)
nr=1; nr=1;
scrup(currcons,y,bottom,nr); scrup(vc, y, bottom, nr);
need_wrap = 0; need_wrap = 0;
} }
/* console_sem is held (except via vc_init->reset_terminal */ /* console_sem is held (except via vc_init->reset_terminal */
static void save_cur(int currcons) static void save_cur(struct vc_data *vc)
{ {
saved_x = x; saved_x = x;
saved_y = y; saved_y = y;
...@@ -1439,9 +1423,9 @@ static void save_cur(int currcons) ...@@ -1439,9 +1423,9 @@ static void save_cur(int currcons)
} }
/* console_sem is held */ /* console_sem is held */
static void restore_cur(int currcons) static void restore_cur(struct vc_data *vc)
{ {
gotoxy(vc_cons[currcons].d,saved_x,saved_y); gotoxy(vc, saved_x, saved_y);
intensity = s_intensity; intensity = s_intensity;
underline = s_underline; underline = s_underline;
blink = s_blink; blink = s_blink;
...@@ -1450,8 +1434,8 @@ static void restore_cur(int currcons) ...@@ -1450,8 +1434,8 @@ static void restore_cur(int currcons)
color = s_color; color = s_color;
G0_charset = saved_G0; G0_charset = saved_G0;
G1_charset = saved_G1; G1_charset = saved_G1;
translate = set_translate(charset ? G1_charset : G0_charset,currcons); translate = set_translate(charset ? G1_charset : G0_charset, vc);
update_attr(currcons); update_attr(vc);
need_wrap = 0; need_wrap = 0;
} }
...@@ -1460,13 +1444,13 @@ enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, ...@@ -1460,13 +1444,13 @@ enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
ESpalette }; ESpalette };
/* console_sem is held (except via vc_init()) */ /* console_sem is held (except via vc_init()) */
static void reset_terminal(int currcons, int do_clear) static void reset_terminal(struct vc_data *vc, int do_clear)
{ {
top = 0; top = 0;
bottom = vc_cons[currcons].d->vc_rows; bottom = vc->vc_rows;
vc_state = ESnormal; vc_state = ESnormal;
ques = 0; ques = 0;
translate = set_translate(LAT1_MAP,currcons); translate = set_translate(LAT1_MAP, vc);
G0_charset = LAT1_MAP; G0_charset = LAT1_MAP;
G1_charset = GRAF_MAP; G1_charset = GRAF_MAP;
charset = 0; charset = 0;
...@@ -1484,22 +1468,22 @@ static void reset_terminal(int currcons, int do_clear) ...@@ -1484,22 +1468,22 @@ static void reset_terminal(int currcons, int do_clear)
deccm = 1; deccm = 1;
decim = 0; decim = 0;
set_kbd(decarm); set_kbd(vc, decarm);
clr_kbd(decckm); clr_kbd(vc, decckm);
clr_kbd(kbdapplic); clr_kbd(vc, kbdapplic);
clr_kbd(lnm); clr_kbd(vc, lnm);
kbd_table[currcons].lockstate = 0; kbd_table[vc->vc_num].lockstate = 0;
kbd_table[currcons].slockstate = 0; kbd_table[vc->vc_num].slockstate = 0;
kbd_table[currcons].ledmode = LED_SHOW_FLAGS; kbd_table[vc->vc_num].ledmode = LED_SHOW_FLAGS;
kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate; kbd_table[vc->vc_num].ledflagstate = kbd_table[vc->vc_num].default_ledflagstate;
/* do not do set_leds here because this causes an endless tasklet loop /* do not do set_leds here because this causes an endless tasklet loop
when the keyboard hasn't been initialized yet */ when the keyboard hasn't been initialized yet */
cursor_type = CUR_DEFAULT; cursor_type = CUR_DEFAULT;
complement_mask = s_complement_mask; complement_mask = s_complement_mask;
default_attr(currcons); default_attr(vc);
update_attr(currcons); update_attr(vc);
tab_stop[0] = 0x01010100; tab_stop[0] = 0x01010100;
tab_stop[1] = tab_stop[1] =
...@@ -1510,14 +1494,14 @@ static void reset_terminal(int currcons, int do_clear) ...@@ -1510,14 +1494,14 @@ static void reset_terminal(int currcons, int do_clear)
bell_pitch = DEFAULT_BELL_PITCH; bell_pitch = DEFAULT_BELL_PITCH;
bell_duration = DEFAULT_BELL_DURATION; bell_duration = DEFAULT_BELL_DURATION;
gotoxy(vc_cons[currcons].d, 0, 0); gotoxy(vc, 0, 0);
save_cur(currcons); save_cur(vc);
if (do_clear) if (do_clear)
csi_J(currcons,2); csi_J(vc, 2);
} }
/* console_sem is held */ /* console_sem is held */
static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
{ {
/* /*
* Control characters can be used in the _middle_ * Control characters can be used in the _middle_
...@@ -1531,11 +1515,11 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1531,11 +1515,11 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
kd_mksound(bell_pitch, bell_duration); kd_mksound(bell_pitch, bell_duration);
return; return;
case 8: case 8:
bs(currcons); bs(vc);
return; return;
case 9: case 9:
pos -= (x << 1); pos -= (x << 1);
while (x < vc_cons[currcons].d->vc_cols - 1) { while (x < vc->vc_cols - 1) {
x++; x++;
if (tab_stop[x >> 5] & (1 << (x & 31))) if (tab_stop[x >> 5] & (1 << (x & 31)))
break; break;
...@@ -1543,20 +1527,20 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1543,20 +1527,20 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
pos += (x << 1); pos += (x << 1);
return; return;
case 10: case 11: case 12: case 10: case 11: case 12:
lf(currcons); lf(vc);
if (!is_kbd(lnm)) if (!is_kbd(vc, lnm))
return; return;
case 13: case 13:
cr(currcons); cr(vc);
return; return;
case 14: case 14:
charset = 1; charset = 1;
translate = set_translate(G1_charset,currcons); translate = set_translate(G1_charset, vc);
disp_ctrl = 1; disp_ctrl = 1;
return; return;
case 15: case 15:
charset = 0; charset = 0;
translate = set_translate(G0_charset,currcons); translate = set_translate(G0_charset, vc);
disp_ctrl = 0; disp_ctrl = 0;
return; return;
case 24: case 26: case 24: case 26:
...@@ -1566,7 +1550,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1566,7 +1550,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
vc_state = ESesc; vc_state = ESesc;
return; return;
case 127: case 127:
del(currcons); del(vc);
return; return;
case 128+27: case 128+27:
vc_state = ESsquare; vc_state = ESsquare;
...@@ -1586,14 +1570,14 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1586,14 +1570,14 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
vc_state = ESpercent; vc_state = ESpercent;
return; return;
case 'E': case 'E':
cr(currcons); cr(vc);
lf(currcons); lf(vc);
return; return;
case 'M': case 'M':
ri(currcons); ri(vc);
return; return;
case 'D': case 'D':
lf(currcons); lf(vc);
return; return;
case 'H': case 'H':
tab_stop[x >> 5] |= (1 << (x & 31)); tab_stop[x >> 5] |= (1 << (x & 31));
...@@ -1602,10 +1586,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1602,10 +1586,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
respond_ID(tty); respond_ID(tty);
return; return;
case '7': case '7':
save_cur(currcons); save_cur(vc);
return; return;
case '8': case '8':
restore_cur(currcons); restore_cur(vc);
return; return;
case '(': case '(':
vc_state = ESsetG0; vc_state = ESsetG0;
...@@ -1617,13 +1601,13 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1617,13 +1601,13 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
vc_state = EShash; vc_state = EShash;
return; return;
case 'c': case 'c':
reset_terminal(currcons,1); reset_terminal(vc, 1);
return; return;
case '>': /* Numeric keypad */ case '>': /* Numeric keypad */
clr_kbd(kbdapplic); clr_kbd(vc, kbdapplic);
return; return;
case '=': /* Appl. keypad */ case '=': /* Appl. keypad */
set_kbd(kbdapplic); set_kbd(vc, kbdapplic);
return; return;
} }
return; return;
...@@ -1635,7 +1619,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1635,7 +1619,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
vc_state = ESpalette; vc_state = ESpalette;
return; return;
} else if (c=='R') { /* reset palette */ } else if (c=='R') { /* reset palette */
reset_palette(currcons); reset_palette(vc);
vc_state = ESnormal; vc_state = ESnormal;
} else } else
vc_state = ESnormal; vc_state = ESnormal;
...@@ -1651,7 +1635,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1651,7 +1635,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
palette[i++] += par[j++]; palette[i++] += par[j++];
palette[i] = 16*par[j++]; palette[i] = 16*par[j++];
palette[i] += par[j]; palette[i] += par[j];
set_palette(currcons); set_palette(vc);
vc_state = ESnormal; vc_state = ESnormal;
} }
} else } else
...@@ -1682,10 +1666,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1682,10 +1666,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
vc_state = ESnormal; vc_state = ESnormal;
switch(c) { switch(c) {
case 'h': case 'h':
set_mode(currcons,1); set_mode(vc, 1);
return; return;
case 'l': case 'l':
set_mode(currcons,0); set_mode(vc, 0);
return; return;
case 'c': case 'c':
if (ques) { if (ques) {
...@@ -1711,7 +1695,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1711,7 +1695,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
if (par[0] == 5) if (par[0] == 5)
status_report(tty); status_report(tty);
else if (par[0] == 6) else if (par[0] == 6)
cursor_report(currcons,tty); cursor_report(vc, tty);
} }
return; return;
} }
...@@ -1722,55 +1706,55 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1722,55 +1706,55 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
switch(c) { switch(c) {
case 'G': case '`': case 'G': case '`':
if (par[0]) par[0]--; if (par[0]) par[0]--;
gotoxy(vc_cons[currcons].d, par[0], y); gotoxy(vc, par[0], y);
return; return;
case 'A': case 'A':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, x, y-par[0]); gotoxy(vc, x, y - par[0]);
return; return;
case 'B': case 'e': case 'B': case 'e':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, x, y+par[0]); gotoxy(vc, x, y + par[0]);
return; return;
case 'C': case 'a': case 'C': case 'a':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, x+par[0], y); gotoxy(vc, x + par[0], y);
return; return;
case 'D': case 'D':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, x-par[0], y); gotoxy(vc, x - par[0], y);
return; return;
case 'E': case 'E':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, 0, y+par[0]); gotoxy(vc, 0, y + par[0]);
return; return;
case 'F': case 'F':
if (!par[0]) par[0]++; if (!par[0]) par[0]++;
gotoxy(vc_cons[currcons].d, 0, y-par[0]); gotoxy(vc, 0, y - par[0]);
return; return;
case 'd': case 'd':
if (par[0]) par[0]--; if (par[0]) par[0]--;
gotoxay(currcons,x,par[0]); gotoxay(vc, x, par[0]);
return; return;
case 'H': case 'f': case 'H': case 'f':
if (par[0]) par[0]--; if (par[0]) par[0]--;
if (par[1]) par[1]--; if (par[1]) par[1]--;
gotoxay(currcons,par[1],par[0]); gotoxay(vc, par[1], par[0]);
return; return;
case 'J': case 'J':
csi_J(currcons,par[0]); csi_J(vc, par[0]);
return; return;
case 'K': case 'K':
csi_K(currcons,par[0]); csi_K(vc, par[0]);
return; return;
case 'L': case 'L':
csi_L(currcons,par[0]); csi_L(vc, par[0]);
return; return;
case 'M': case 'M':
csi_M(currcons,par[0]); csi_M(vc, par[0]);
return; return;
case 'P': case 'P':
csi_P(currcons,par[0]); csi_P(vc, par[0]);
return; return;
case 'c': case 'c':
if (!par[0]) if (!par[0])
...@@ -1788,41 +1772,41 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1788,41 +1772,41 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
} }
return; return;
case 'm': case 'm':
csi_m(currcons); csi_m(vc);
return; return;
case 'q': /* DECLL - but only 3 leds */ case 'q': /* DECLL - but only 3 leds */
/* map 0,1,2,3 to 0,1,2,4 */ /* map 0,1,2,3 to 0,1,2,4 */
if (par[0] < 4) if (par[0] < 4)
setledstate(kbd_table + currcons, setledstate(kbd_table + vc->vc_num,
(par[0] < 3) ? par[0] : 4); (par[0] < 3) ? par[0] : 4);
return; return;
case 'r': case 'r':
if (!par[0]) if (!par[0])
par[0]++; par[0]++;
if (!par[1]) if (!par[1])
par[1] = vc_cons[currcons].d->vc_rows; par[1] = vc->vc_rows;
/* Minimum allowed region is 2 lines */ /* Minimum allowed region is 2 lines */
if (par[0] < par[1] && if (par[0] < par[1] &&
par[1] <= vc_cons[currcons].d->vc_rows) { par[1] <= vc->vc_rows) {
top=par[0]-1; top=par[0]-1;
bottom=par[1]; bottom=par[1];
gotoxay(currcons,0,0); gotoxay(vc, 0, 0);
} }
return; return;
case 's': case 's':
save_cur(currcons); save_cur(vc);
return; return;
case 'u': case 'u':
restore_cur(currcons); restore_cur(vc);
return; return;
case 'X': case 'X':
csi_X(currcons, par[0]); csi_X(vc, par[0]);
return; return;
case '@': case '@':
csi_at(currcons,par[0]); csi_at(vc, par[0]);
return; return;
case ']': /* setterm functions */ case ']': /* setterm functions */
setterm_command(currcons); setterm_command(vc);
return; return;
} }
return; return;
...@@ -1847,10 +1831,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1847,10 +1831,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
/* DEC screen alignment test. kludge :-) */ /* DEC screen alignment test. kludge :-) */
video_erase_char = video_erase_char =
(video_erase_char & 0xff00) | 'E'; (video_erase_char & 0xff00) | 'E';
csi_J(currcons, 2); csi_J(vc, 2);
video_erase_char = video_erase_char =
(video_erase_char & 0xff00) | ' '; (video_erase_char & 0xff00) | ' ';
do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2); do_update_region(vc, origin, screenbuf_size / 2);
} }
return; return;
case ESsetG0: case ESsetG0:
...@@ -1863,7 +1847,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1863,7 +1847,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
else if (c == 'K') else if (c == 'K')
G0_charset = USER_MAP; G0_charset = USER_MAP;
if (charset == 0) if (charset == 0)
translate = set_translate(G0_charset,currcons); translate = set_translate(G0_charset, vc);
vc_state = ESnormal; vc_state = ESnormal;
return; return;
case ESsetG1: case ESsetG1:
...@@ -1876,7 +1860,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c) ...@@ -1876,7 +1860,7 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
else if (c == 'K') else if (c == 'K')
G1_charset = USER_MAP; G1_charset = USER_MAP;
if (charset == 1) if (charset == 1)
translate = set_translate(G1_charset,currcons); translate = set_translate(G1_charset, vc);
vc_state = ESnormal; vc_state = ESnormal;
return; return;
default: default:
...@@ -1903,7 +1887,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -1903,7 +1887,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
#define FLUSH do { } while(0); #define FLUSH do { } while(0);
#else #else
#define FLUSH if (draw_x >= 0) { \ #define FLUSH if (draw_x >= 0) { \
sw->con_putcs(vc_cons[currcons].d, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x); \ sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x); \
draw_x = -1; \ draw_x = -1; \
} }
#endif #endif
...@@ -1912,6 +1896,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -1912,6 +1896,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
unsigned int currcons; unsigned int currcons;
unsigned long draw_from = 0, draw_to = 0; unsigned long draw_from = 0, draw_to = 0;
struct vt_struct *vt; struct vt_struct *vt;
struct vc_data *vc;
u16 himask, charmask; u16 himask, charmask;
const unsigned char *orig_buf = NULL; const unsigned char *orig_buf = NULL;
int orig_count; int orig_count;
...@@ -1940,6 +1925,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -1940,6 +1925,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
release_console_sem(); release_console_sem();
return 0; return 0;
} }
vc = vc_cons[currcons].d;
release_console_sem(); release_console_sem();
orig_buf = buf; orig_buf = buf;
...@@ -1965,8 +1951,8 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -1965,8 +1951,8 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
charmask = himask ? 0x1ff : 0xff; charmask = himask ? 0x1ff : 0xff;
/* undraw cursor first */ /* undraw cursor first */
if (IS_FG) if (IS_FG(vc))
hide_cursor(vc_cons[currcons].d); hide_cursor(vc);
while (!tty->stopped && count) { while (!tty->stopped && count) {
int orig = *buf; int orig = *buf;
...@@ -2034,11 +2020,11 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -2034,11 +2020,11 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
if (vc_state == ESnormal && ok) { if (vc_state == ESnormal && ok) {
/* Now try to find out how to display it */ /* Now try to find out how to display it */
tc = conv_uni_to_pc(vc_cons[currcons].d, tc); tc = conv_uni_to_pc(vc, tc);
if ( tc == -4 ) { if ( tc == -4 ) {
/* If we got -4 (not found) then see if we have /* If we got -4 (not found) then see if we have
defined a replacement character (U+FFFD) */ defined a replacement character (U+FFFD) */
tc = conv_uni_to_pc(vc_cons[currcons].d, 0xfffd); tc = conv_uni_to_pc(vc, 0xfffd);
/* One reason for the -4 can be that we just /* One reason for the -4 can be that we just
did a clear_unimap(); did a clear_unimap();
...@@ -2055,20 +2041,20 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -2055,20 +2041,20 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
if (need_wrap || decim) if (need_wrap || decim)
FLUSH FLUSH
if (need_wrap) { if (need_wrap) {
cr(currcons); cr(vc);
lf(currcons); lf(vc);
} }
if (decim) if (decim)
insert_char(currcons, 1); insert_char(vc, 1);
scr_writew(himask ? scr_writew(himask ?
((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) : ((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
(attr << 8) + tc, (attr << 8) + tc,
(u16 *) pos); (u16 *) pos);
if (DO_UPDATE && draw_x < 0) { if (DO_UPDATE(vc) && draw_x < 0) {
draw_x = x; draw_x = x;
draw_from = pos; draw_from = pos;
} }
if (x == vc_cons[currcons].d->vc_cols - 1) { if (x == vc->vc_cols - 1) {
need_wrap = decawm; need_wrap = decawm;
draw_to = pos+2; draw_to = pos+2;
} else { } else {
...@@ -2078,7 +2064,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co ...@@ -2078,7 +2064,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
continue; continue;
} }
FLUSH FLUSH
do_con_trol(tty, currcons, orig); do_con_trol(tty, vc, orig);
} }
FLUSH FLUSH
console_conditional_schedule(); console_conditional_schedule();
...@@ -2106,7 +2092,7 @@ static void console_callback(void *ignored) ...@@ -2106,7 +2092,7 @@ static void console_callback(void *ignored)
if (want_console != fg_console && if (want_console != fg_console &&
vc_cons_allocated(want_console)) { vc_cons_allocated(want_console)) {
hide_cursor(vc_cons[fg_console].d); hide_cursor(vc_cons[fg_console].d);
change_console(want_console); change_console(vc_cons[want_console].d);
/* we only changed when the console had already /* we only changed when the console had already
been allocated - a new console is not created been allocated - a new console is not created
in an interrupt routine */ in an interrupt routine */
...@@ -2118,10 +2104,10 @@ static void console_callback(void *ignored) ...@@ -2118,10 +2104,10 @@ static void console_callback(void *ignored)
poke_blanked_console(); poke_blanked_console();
} }
if (scrollback_delta) { if (scrollback_delta) {
int currcons = fg_console; struct vc_data *vc = vc_cons[fg_console].d;
clear_selection(); clear_selection();
if (vcmode == KD_TEXT) if (vcmode == KD_TEXT)
sw->con_scrolldelta(vc_cons[currcons].d, scrollback_delta); sw->con_scrolldelta(vc, scrollback_delta);
scrollback_delta = 0; scrollback_delta = 0;
} }
if (blank_timer_expired) { if (blank_timer_expired) {
...@@ -2150,7 +2136,7 @@ struct tty_driver *console_driver; ...@@ -2150,7 +2136,7 @@ struct tty_driver *console_driver;
void vt_console_print(struct console *co, const char *b, unsigned count) void vt_console_print(struct console *co, const char *b, unsigned count)
{ {
int currcons = fg_console; struct vc_data *vc = vc_cons[fg_console].d;
unsigned char c; unsigned char c;
static unsigned long printing; static unsigned long printing;
const ushort *start; const ushort *start;
...@@ -2162,13 +2148,13 @@ void vt_console_print(struct console *co, const char *b, unsigned count) ...@@ -2162,13 +2148,13 @@ void vt_console_print(struct console *co, const char *b, unsigned count)
return; return;
if (kmsg_redirect && vc_cons_allocated(kmsg_redirect - 1)) if (kmsg_redirect && vc_cons_allocated(kmsg_redirect - 1))
currcons = kmsg_redirect - 1; vc = vc_cons[kmsg_redirect - 1].d;
/* read `x' only after setting currcons properly (otherwise /* read `x' only after setting currcons properly (otherwise
the `x' macro will read the x of the foreground console). */ the `x' macro will read the x of the foreground console). */
myx = x; myx = x;
if (!vc_cons_allocated(currcons)) { if (!vc_cons_allocated(fg_console)) {
/* impossible */ /* impossible */
/* printk("vt_console_print: tty %d not allocated ??\n", currcons+1); */ /* printk("vt_console_print: tty %d not allocated ??\n", currcons+1); */
goto quit; goto quit;
...@@ -2178,8 +2164,8 @@ void vt_console_print(struct console *co, const char *b, unsigned count) ...@@ -2178,8 +2164,8 @@ void vt_console_print(struct console *co, const char *b, unsigned count)
goto quit; goto quit;
/* undraw cursor first */ /* undraw cursor first */
if (IS_FG) if (IS_FG(vc))
hide_cursor(vc_cons[currcons].d); hide_cursor(vc);
start = (ushort *)pos; start = (ushort *)pos;
...@@ -2189,22 +2175,22 @@ void vt_console_print(struct console *co, const char *b, unsigned count) ...@@ -2189,22 +2175,22 @@ void vt_console_print(struct console *co, const char *b, unsigned count)
c = *b++; c = *b++;
if (c == 10 || c == 13 || c == 8 || need_wrap) { if (c == 10 || c == 13 || c == 8 || need_wrap) {
if (cnt > 0) { if (cnt > 0) {
if (IS_VISIBLE) if (CON_IS_VISIBLE(vc))
sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); sw->con_putcs(vc, start, cnt, y, x);
x += cnt; x += cnt;
if (need_wrap) if (need_wrap)
x--; x--;
cnt = 0; cnt = 0;
} }
if (c == 8) { /* backspace */ if (c == 8) { /* backspace */
bs(currcons); bs(vc);
start = (ushort *)pos; start = (ushort *)pos;
myx = x; myx = x;
continue; continue;
} }
if (c != 13) if (c != 13)
lf(currcons); lf(vc);
cr(currcons); cr(vc);
start = (ushort *)pos; start = (ushort *)pos;
myx = x; myx = x;
if (c == 10 || c == 13) if (c == 10 || c == 13)
...@@ -2212,7 +2198,7 @@ void vt_console_print(struct console *co, const char *b, unsigned count) ...@@ -2212,7 +2198,7 @@ void vt_console_print(struct console *co, const char *b, unsigned count)
} }
scr_writew((attr << 8) + c, (unsigned short *) pos); scr_writew((attr << 8) + c, (unsigned short *) pos);
cnt++; cnt++;
if (myx == vc_cons[currcons].d->vc_cols - 1) { if (myx == vc->vc_cols - 1) {
need_wrap = 1; need_wrap = 1;
continue; continue;
} }
...@@ -2220,15 +2206,15 @@ void vt_console_print(struct console *co, const char *b, unsigned count) ...@@ -2220,15 +2206,15 @@ void vt_console_print(struct console *co, const char *b, unsigned count)
myx++; myx++;
} }
if (cnt > 0) { if (cnt > 0) {
if (IS_VISIBLE) if (CON_IS_VISIBLE(vc))
sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x); sw->con_putcs(vc, start, cnt, y, x);
x += cnt; x += cnt;
if (x == vc_cons[currcons].d->vc_cols) { if (x == vc->vc_cols) {
x--; x--;
need_wrap = 1; need_wrap = 1;
} }
} }
set_cursor(vc_cons[currcons].d); set_cursor(vc);
if (!oops_in_progress) if (!oops_in_progress)
poke_blanked_console(); poke_blanked_console();
...@@ -2333,7 +2319,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg) ...@@ -2333,7 +2319,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
if (get_user(lines, (s32 __user *)(p+4))) { if (get_user(lines, (s32 __user *)(p+4))) {
ret = -EFAULT; ret = -EFAULT;
} else { } else {
scrollfront(lines); scrollfront(vc_cons[fg_console].d, lines);
ret = 0; ret = 0;
} }
break; break;
...@@ -2457,9 +2443,10 @@ static int con_open(struct tty_struct *tty, struct file *filp) ...@@ -2457,9 +2443,10 @@ static int con_open(struct tty_struct *tty, struct file *filp)
if (tty->count == 1) { if (tty->count == 1) {
ret = vc_allocate(currcons); ret = vc_allocate(currcons);
if (ret == 0) { if (ret == 0) {
struct vc_data *vc = vc_cons[currcons].d;
vt_cons[currcons]->vc_num = currcons; vt_cons[currcons]->vc_num = currcons;
tty->driver_data = vt_cons[currcons]; tty->driver_data = vt_cons[currcons];
vc_cons[currcons].d->vc_tty = tty; vc->vc_tty = tty;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) { if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
...@@ -2505,29 +2492,29 @@ static void con_close(struct tty_struct *tty, struct file *filp) ...@@ -2505,29 +2492,29 @@ static void con_close(struct tty_struct *tty, struct file *filp)
up(&tty_sem); up(&tty_sem);
} }
static void vc_init(unsigned int currcons, unsigned int rows, static void vc_init(struct vc_data *vc, unsigned int rows,
unsigned int cols, int do_clear) unsigned int cols, int do_clear)
{ {
int j, k ; int j, k ;
vc_cons[currcons].d->vc_cols = cols; vc->vc_cols = cols;
vc_cons[currcons].d->vc_rows = rows; vc->vc_rows = rows;
vc_cons[currcons].d->vc_size_row = cols<<1; vc->vc_size_row = cols << 1;
screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row; screenbuf_size = vc->vc_rows * vc->vc_size_row;
set_origin(currcons); set_origin(vc);
pos = origin; pos = origin;
reset_vc(currcons); reset_vc(vc);
for (j=k=0; j<16; j++) { for (j=k=0; j<16; j++) {
vc_cons[currcons].d->vc_palette[k++] = default_red[j] ; vc->vc_palette[k++] = default_red[j] ;
vc_cons[currcons].d->vc_palette[k++] = default_grn[j] ; vc->vc_palette[k++] = default_grn[j] ;
vc_cons[currcons].d->vc_palette[k++] = default_blu[j] ; vc->vc_palette[k++] = default_blu[j] ;
} }
def_color = 0x07; /* white */ def_color = 0x07; /* white */
ulcolor = 0x0f; /* bold white */ ulcolor = 0x0f; /* bold white */
halfcolor = 0x08; /* grey */ halfcolor = 0x08; /* grey */
init_waitqueue_head(&vt_cons[currcons]->paste_wait); init_waitqueue_head(&vt_cons[vc->vc_num]->paste_wait);
reset_terminal(currcons, do_clear); reset_terminal(vc, do_clear);
} }
/* /*
...@@ -2539,6 +2526,7 @@ static void vc_init(unsigned int currcons, unsigned int rows, ...@@ -2539,6 +2526,7 @@ static void vc_init(unsigned int currcons, unsigned int rows,
static int __init con_init(void) static int __init con_init(void)
{ {
const char *display_desc = NULL; const char *display_desc = NULL;
struct vc_data *vc;
unsigned int currcons = 0; unsigned int currcons = 0;
acquire_console_sem(); acquire_console_sem();
...@@ -2562,27 +2550,27 @@ static int __init con_init(void) ...@@ -2562,27 +2550,27 @@ static int __init con_init(void)
* kmalloc is not running yet - we use the bootmem allocator. * kmalloc is not running yet - we use the bootmem allocator.
*/ */
for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) { for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
vc_cons[currcons].d = (struct vc_data *) vc_cons[currcons].d = vc = (struct vc_data *)
alloc_bootmem(sizeof(struct vc_data)); alloc_bootmem(sizeof(struct vc_data));
vt_cons[currcons] = (struct vt_struct *) vt_cons[currcons] = (struct vt_struct *)
alloc_bootmem(sizeof(struct vt_struct)); alloc_bootmem(sizeof(struct vt_struct));
vc_cons[currcons].d->vc_vt = vt_cons[currcons]; vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(currcons, 1); visual_init(vc, currcons, 1);
screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size); screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size);
kmalloced = 0; kmalloced = 0;
vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols, vc_init(vc, vc->vc_rows, vc->vc_cols,
currcons || !sw->con_save_screen); currcons || !sw->con_save_screen);
} }
currcons = fg_console = 0; currcons = fg_console = 0;
master_display_fg = vc_cons[currcons].d; master_display_fg = vc = vc_cons[currcons].d;
set_origin(currcons); set_origin(vc);
save_screen(currcons); save_screen(vc);
gotoxy(vc_cons[currcons].d, x, y); gotoxy(vc, x, y);
csi_J(currcons, 0); csi_J(vc, 0);
update_screen(fg_console); update_screen(vc);
printk("Console: %s %s %dx%d", printk("Console: %s %s %dx%d",
vc_cons[currcons].d->vc_can_do_color ? "colour" : "mono", vc->vc_can_do_color ? "colour" : "mono",
display_desc, vc_cons[currcons].d->vc_cols, vc_cons[currcons].d->vc_rows); display_desc, vc->vc_cols, vc->vc_rows);
printable = 1; printable = 1;
printk("\n"); printk("\n");
...@@ -2676,37 +2664,37 @@ int take_over_console(const struct consw *csw, int first, int last, int deflt) ...@@ -2676,37 +2664,37 @@ int take_over_console(const struct consw *csw, int first, int last, int deflt)
for (i = first; i <= last; i++) { for (i = first; i <= last; i++) {
int old_was_color; int old_was_color;
int currcons = i; struct vc_data *vc = vc_cons[i].d;
if (con_driver_map[i]) if (con_driver_map[i])
module_put(con_driver_map[i]->owner); module_put(con_driver_map[i]->owner);
__module_get(owner); __module_get(owner);
con_driver_map[i] = csw; con_driver_map[i] = csw;
if (!vc_cons[i].d || !vc_cons[i].d->vc_sw) if (!vc || !vc->vc_sw)
continue; continue;
j = i; j = i;
if (IS_VISIBLE) if (CON_IS_VISIBLE(vc))
save_screen(i); save_screen(vc);
old_was_color = vc_cons[i].d->vc_can_do_color; old_was_color = vc->vc_can_do_color;
vc_cons[i].d->vc_sw->con_deinit(vc_cons[i].d); vc->vc_sw->con_deinit(vc);
origin = (unsigned long) screenbuf; origin = (unsigned long) screenbuf;
visible_origin = origin; visible_origin = origin;
scr_end = origin + screenbuf_size; scr_end = origin + screenbuf_size;
pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x; pos = origin + vc->vc_size_row * y + 2 * x;
visual_init(i, 0); visual_init(vc, i, 0);
update_attr(i); update_attr(vc);
/* If the console changed between mono <-> color, then /* If the console changed between mono <-> color, then
* the attributes in the screenbuf will be wrong. The * the attributes in the screenbuf will be wrong. The
* following resets all attributes to something sane. * following resets all attributes to something sane.
*/ */
if (old_was_color != vc_cons[i].d->vc_can_do_color) if (old_was_color != vc->vc_can_do_color)
clear_buffer_attributes(i); clear_buffer_attributes(vc);
if (IS_VISIBLE) if (CON_IS_VISIBLE(vc))
update_screen(i); update_screen(vc);
} }
printk("Console: switching "); printk("Console: switching ");
if (!deflt) if (!deflt)
...@@ -2773,7 +2761,7 @@ static void vesa_powerdown(void) ...@@ -2773,7 +2761,7 @@ static void vesa_powerdown(void)
void do_blank_screen(int entering_gfx) void do_blank_screen(int entering_gfx)
{ {
int currcons = fg_console; struct vc_data *vc = vc_cons[fg_console].d;
int i; int i;
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
...@@ -2792,11 +2780,11 @@ void do_blank_screen(int entering_gfx) ...@@ -2792,11 +2780,11 @@ void do_blank_screen(int entering_gfx)
/* entering graphics mode? */ /* entering graphics mode? */
if (entering_gfx) { if (entering_gfx) {
hide_cursor(vc_cons[currcons].d); hide_cursor(vc);
save_screen(currcons); save_screen(vc);
sw->con_blank(vc_cons[currcons].d, -1, 1); sw->con_blank(vc, -1, 1);
console_blanked = fg_console + 1; console_blanked = fg_console + 1;
set_origin(currcons); set_origin(vc);
return; return;
} }
...@@ -2806,16 +2794,16 @@ void do_blank_screen(int entering_gfx) ...@@ -2806,16 +2794,16 @@ void do_blank_screen(int entering_gfx)
return; return;
} }
hide_cursor(vc_cons[currcons].d); hide_cursor(vc);
del_timer_sync(&console_timer); del_timer_sync(&console_timer);
blank_timer_expired = 0; blank_timer_expired = 0;
save_screen(currcons); save_screen(vc);
/* In case we need to reset origin, blanking hook returns 1 */ /* In case we need to reset origin, blanking hook returns 1 */
i = sw->con_blank(vc_cons[currcons].d, 1, 0); i = sw->con_blank(vc, 1, 0);
console_blanked = fg_console + 1; console_blanked = fg_console + 1;
if (i) if (i)
set_origin(currcons); set_origin(vc);
if (console_blank_hook && console_blank_hook(1)) if (console_blank_hook && console_blank_hook(1))
return; return;
...@@ -2826,7 +2814,7 @@ void do_blank_screen(int entering_gfx) ...@@ -2826,7 +2814,7 @@ void do_blank_screen(int entering_gfx)
} }
if (vesa_blank_mode) if (vesa_blank_mode)
sw->con_blank(vc_cons[currcons].d, vesa_blank_mode + 1, 0); sw->con_blank(vc, vesa_blank_mode + 1, 0);
} }
EXPORT_SYMBOL(do_blank_screen); EXPORT_SYMBOL(do_blank_screen);
...@@ -2835,7 +2823,7 @@ EXPORT_SYMBOL(do_blank_screen); ...@@ -2835,7 +2823,7 @@ EXPORT_SYMBOL(do_blank_screen);
*/ */
void do_unblank_screen(int leaving_gfx) void do_unblank_screen(int leaving_gfx)
{ {
int currcons; struct vc_data *vc;
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
...@@ -2847,7 +2835,7 @@ void do_unblank_screen(int leaving_gfx) ...@@ -2847,7 +2835,7 @@ void do_unblank_screen(int leaving_gfx)
printk("unblank_screen: tty %d not allocated ??\n", fg_console+1); printk("unblank_screen: tty %d not allocated ??\n", fg_console+1);
return; return;
} }
currcons = fg_console; vc = vc_cons[fg_console].d;
if (vcmode != KD_TEXT) if (vcmode != KD_TEXT)
return; /* but leave console_blanked != 0 */ return; /* but leave console_blanked != 0 */
...@@ -2857,13 +2845,13 @@ void do_unblank_screen(int leaving_gfx) ...@@ -2857,13 +2845,13 @@ void do_unblank_screen(int leaving_gfx)
} }
console_blanked = 0; console_blanked = 0;
if (sw->con_blank(vc_cons[currcons].d, 0, leaving_gfx)) if (sw->con_blank(vc, 0, leaving_gfx))
/* Low-level driver cannot restore -> do it ourselves */ /* Low-level driver cannot restore -> do it ourselves */
update_screen(fg_console); update_screen(vc);
if (console_blank_hook) if (console_blank_hook)
console_blank_hook(0); console_blank_hook(0);
set_palette(currcons); set_palette(vc);
set_cursor(vc_cons[fg_console].d); set_cursor(vc);
} }
EXPORT_SYMBOL(do_unblank_screen); EXPORT_SYMBOL(do_unblank_screen);
...@@ -2913,12 +2901,12 @@ void poke_blanked_console(void) ...@@ -2913,12 +2901,12 @@ void poke_blanked_console(void)
* Palettes * Palettes
*/ */
void set_palette(int currcons) void set_palette(struct vc_data *vc)
{ {
WARN_CONSOLE_UNLOCKED(); WARN_CONSOLE_UNLOCKED();
if (vcmode != KD_GRAPHICS) if (vcmode != KD_GRAPHICS)
sw->con_set_palette(vc_cons[currcons].d, color_table); sw->con_set_palette(vc, color_table);
} }
static int set_get_cmap(unsigned char __user *arg, int set) static int set_get_cmap(unsigned char __user *arg, int set)
...@@ -2945,7 +2933,7 @@ static int set_get_cmap(unsigned char __user *arg, int set) ...@@ -2945,7 +2933,7 @@ static int set_get_cmap(unsigned char __user *arg, int set)
vc_cons[i].d->vc_palette[k++] = default_grn[j]; vc_cons[i].d->vc_palette[k++] = default_grn[j];
vc_cons[i].d->vc_palette[k++] = default_blu[j]; vc_cons[i].d->vc_palette[k++] = default_blu[j];
} }
set_palette(i); set_palette(vc_cons[i].d);
} }
} }
return 0; return 0;
...@@ -2978,7 +2966,7 @@ int con_get_cmap(unsigned char __user *arg) ...@@ -2978,7 +2966,7 @@ int con_get_cmap(unsigned char __user *arg)
return rc; return rc;
} }
void reset_palette(int currcons) void reset_palette(struct vc_data *vc)
{ {
int j, k; int j, k;
for (j=k=0; j<16; j++) { for (j=k=0; j<16; j++) {
...@@ -2986,7 +2974,7 @@ void reset_palette(int currcons) ...@@ -2986,7 +2974,7 @@ void reset_palette(int currcons)
palette[k++] = default_grn[j]; palette[k++] = default_grn[j];
palette[k++] = default_blu[j]; palette[k++] = default_blu[j];
} }
set_palette(currcons); set_palette(vc);
} }
/* /*
...@@ -3004,13 +2992,13 @@ void reset_palette(int currcons) ...@@ -3004,13 +2992,13 @@ void reset_palette(int currcons)
#define max_font_size 65536 #define max_font_size 65536
int con_font_get(int currcons, struct console_font_op *op) int con_font_get(struct vc_data *vc, struct console_font_op *op)
{ {
struct console_font font; struct console_font font;
int rc = -EINVAL; int rc = -EINVAL;
int c; int c;
if (vt_cons[currcons]->vc_mode != KD_TEXT) if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
return -EINVAL; return -EINVAL;
if (op->data) { if (op->data) {
...@@ -3022,7 +3010,7 @@ int con_font_get(int currcons, struct console_font_op *op) ...@@ -3022,7 +3010,7 @@ int con_font_get(int currcons, struct console_font_op *op)
acquire_console_sem(); acquire_console_sem();
if (sw->con_font_get) if (sw->con_font_get)
rc = sw->con_font_get(vc_cons[currcons].d, &font); rc = sw->con_font_get(vc, &font);
else else
rc = -ENOSYS; rc = -ENOSYS;
release_console_sem(); release_console_sem();
...@@ -3059,13 +3047,13 @@ int con_font_get(int currcons, struct console_font_op *op) ...@@ -3059,13 +3047,13 @@ int con_font_get(int currcons, struct console_font_op *op)
return rc; return rc;
} }
int con_font_set(int currcons, struct console_font_op *op) int con_font_set(struct vc_data *vc, struct console_font_op *op)
{ {
struct console_font font; struct console_font font;
int rc = -EINVAL; int rc = -EINVAL;
int size; int size;
if (vt_cons[currcons]->vc_mode != KD_TEXT) if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
return -EINVAL; return -EINVAL;
if (!op->data) if (!op->data)
return -EINVAL; return -EINVAL;
...@@ -3108,7 +3096,7 @@ int con_font_set(int currcons, struct console_font_op *op) ...@@ -3108,7 +3096,7 @@ int con_font_set(int currcons, struct console_font_op *op)
} }
acquire_console_sem(); acquire_console_sem();
if (sw->con_font_set) if (sw->con_font_set)
rc = sw->con_font_set(vc_cons[currcons].d, &font, op->flags); rc = sw->con_font_set(vc, &font, op->flags);
else else
rc = -ENOSYS; rc = -ENOSYS;
release_console_sem(); release_console_sem();
...@@ -3116,14 +3104,14 @@ int con_font_set(int currcons, struct console_font_op *op) ...@@ -3116,14 +3104,14 @@ int con_font_set(int currcons, struct console_font_op *op)
return rc; return rc;
} }
int con_font_default(int currcons, struct console_font_op *op) int con_font_default(struct vc_data *vc, struct console_font_op *op)
{ {
struct console_font font = {.width = op->width, .height = op->height}; struct console_font font = {.width = op->width, .height = op->height};
char name[MAX_FONT_NAME]; char name[MAX_FONT_NAME];
char *s = name; char *s = name;
int rc; int rc;
if (vt_cons[currcons]->vc_mode != KD_TEXT) if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
return -EINVAL; return -EINVAL;
if (!op->data) if (!op->data)
...@@ -3135,7 +3123,7 @@ int con_font_default(int currcons, struct console_font_op *op) ...@@ -3135,7 +3123,7 @@ int con_font_default(int currcons, struct console_font_op *op)
acquire_console_sem(); acquire_console_sem();
if (sw->con_font_default) if (sw->con_font_default)
rc = sw->con_font_default(vc_cons[currcons].d, &font, s); rc = sw->con_font_default(vc, &font, s);
else else
rc = -ENOSYS; rc = -ENOSYS;
release_console_sem(); release_console_sem();
...@@ -3146,17 +3134,15 @@ int con_font_default(int currcons, struct console_font_op *op) ...@@ -3146,17 +3134,15 @@ int con_font_default(int currcons, struct console_font_op *op)
return rc; return rc;
} }
int con_font_copy(int currcons, struct console_font_op *op) int con_font_copy(struct vc_data *vc, struct console_font_op *op)
{ {
int con = op->height; int con = op->height;
struct vc_data *vc;
int rc; int rc;
if (vt_cons[currcons]->vc_mode != KD_TEXT) if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
return -EINVAL; return -EINVAL;
acquire_console_sem(); acquire_console_sem();
vc = vc_cons[currcons].d;
if (!sw->con_font_copy) if (!sw->con_font_copy)
rc = -ENOSYS; rc = -ENOSYS;
else if (con < 0 || !vc_cons_allocated(con)) else if (con < 0 || !vc_cons_allocated(con))
...@@ -3169,17 +3155,17 @@ int con_font_copy(int currcons, struct console_font_op *op) ...@@ -3169,17 +3155,17 @@ int con_font_copy(int currcons, struct console_font_op *op)
return rc; return rc;
} }
int con_font_op(int currcons, struct console_font_op *op) int con_font_op(struct vc_data *vc, struct console_font_op *op)
{ {
switch (op->op) { switch (op->op) {
case KD_FONT_OP_SET: case KD_FONT_OP_SET:
return con_font_set(currcons, op); return con_font_set(vc, op);
case KD_FONT_OP_GET: case KD_FONT_OP_GET:
return con_font_get(currcons, op); return con_font_get(vc, op);
case KD_FONT_OP_SET_DEFAULT: case KD_FONT_OP_SET_DEFAULT:
return con_font_default(currcons, op); return con_font_default(vc, op);
case KD_FONT_OP_COPY: case KD_FONT_OP_COPY:
return con_font_copy(currcons, op); return con_font_copy(vc, op);
} }
return -ENOSYS; return -ENOSYS;
} }
......
...@@ -311,7 +311,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc ...@@ -311,7 +311,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc
op->height = cfdarg.charheight; op->height = cfdarg.charheight;
op->charcount = cfdarg.charcount; op->charcount = cfdarg.charcount;
op->data = cfdarg.chardata; op->data = cfdarg.chardata;
return con_font_op(fg_console, op); return con_font_op(vc_cons[fg_console].d, op);
case GIO_FONTX: { case GIO_FONTX: {
op->op = KD_FONT_OP_GET; op->op = KD_FONT_OP_GET;
op->flags = KD_FONT_FLAG_OLD; op->flags = KD_FONT_FLAG_OLD;
...@@ -319,7 +319,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc ...@@ -319,7 +319,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc
op->height = cfdarg.charheight; op->height = cfdarg.charheight;
op->charcount = cfdarg.charcount; op->charcount = cfdarg.charcount;
op->data = cfdarg.chardata; op->data = cfdarg.chardata;
i = con_font_op(fg_console, op); i = con_font_op(vc_cons[fg_console].d, op);
if (i) if (i)
return i; return i;
cfdarg.charheight = op->height; cfdarg.charheight = op->height;
...@@ -333,7 +333,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc ...@@ -333,7 +333,7 @@ do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struc
} }
static inline int static inline int
do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, unsigned int console) do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, struct vc_data *vc)
{ {
struct unimapdesc tmp; struct unimapdesc tmp;
int i = 0; int i = 0;
...@@ -349,11 +349,11 @@ do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, unsigned i ...@@ -349,11 +349,11 @@ do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, unsigned i
case PIO_UNIMAP: case PIO_UNIMAP:
if (!perm) if (!perm)
return -EPERM; return -EPERM;
return con_set_unimap(console, tmp.entry_ct, tmp.entries); return con_set_unimap(vc, tmp.entry_ct, tmp.entries);
case GIO_UNIMAP: case GIO_UNIMAP:
if (!perm && fg_console != console) if (!perm && fg_console != vc->vc_num)
return -EPERM; return -EPERM;
return con_get_unimap(console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
} }
return 0; return 0;
} }
...@@ -796,7 +796,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -796,7 +796,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* make sure we are atomic with respect to * make sure we are atomic with respect to
* other console switches.. * other console switches..
*/ */
complete_change_console(newvt); complete_change_console(vc_cons[newvt].d);
release_console_sem(); release_console_sem();
} }
} }
...@@ -852,7 +852,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -852,7 +852,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EFAULT; return -EFAULT;
for (i = 0; i < MAX_NR_CONSOLES; i++) { for (i = 0; i < MAX_NR_CONSOLES; i++) {
acquire_console_sem(); acquire_console_sem();
vc_resize(i, cc, ll); vc_resize(vc_cons[i].d, cc, ll);
release_console_sem(); release_console_sem();
} }
return 0; return 0;
...@@ -900,7 +900,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -900,7 +900,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
vc_cons[i].d->vc_scan_lines = vlin; vc_cons[i].d->vc_scan_lines = vlin;
if (clin) if (clin)
vc_cons[i].d->vc_font.height = clin; vc_cons[i].d->vc_font.height = clin;
vc_resize(i, cc, ll); vc_resize(vc_cons[i].d, cc, ll);
release_console_sem(); release_console_sem();
} }
return 0; return 0;
...@@ -915,7 +915,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -915,7 +915,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
op.height = 0; op.height = 0;
op.charcount = 256; op.charcount = 256;
op.data = up; op.data = up;
return con_font_op(fg_console, &op); return con_font_op(vc_cons[fg_console].d, &op);
} }
case GIO_FONT: { case GIO_FONT: {
...@@ -925,7 +925,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -925,7 +925,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
op.height = 32; op.height = 32;
op.charcount = 256; op.charcount = 256;
op.data = up; op.data = up;
return con_font_op(fg_console, &op); return con_font_op(vc_cons[fg_console].d, &op);
} }
case PIO_CMAP: case PIO_CMAP:
...@@ -953,9 +953,10 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -953,9 +953,10 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
{ {
op.op = KD_FONT_OP_SET_DEFAULT; op.op = KD_FONT_OP_SET_DEFAULT;
op.data = NULL; op.data = NULL;
i = con_font_op(fg_console, &op); i = con_font_op(vc_cons[fg_console].d, &op);
if (i) return i; if (i)
con_set_default_unimap(fg_console); return i;
con_set_default_unimap(vc_cons[fg_console].d);
return 0; return 0;
} }
#endif #endif
...@@ -966,7 +967,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -966,7 +967,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EFAULT; return -EFAULT;
if (!perm && op.op != KD_FONT_OP_GET) if (!perm && op.op != KD_FONT_OP_GET)
return -EPERM; return -EPERM;
i = con_font_op(console, &op); i = con_font_op(vc, &op);
if (i) return i; if (i) return i;
if (copy_to_user(up, &op, sizeof(op))) if (copy_to_user(up, &op, sizeof(op)))
return -EFAULT; return -EFAULT;
...@@ -995,13 +996,13 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, ...@@ -995,13 +996,13 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EPERM; return -EPERM;
i = copy_from_user(&ui, up, sizeof(struct unimapinit)); i = copy_from_user(&ui, up, sizeof(struct unimapinit));
if (i) return -EFAULT; if (i) return -EFAULT;
con_clear_unimap(console, &ui); con_clear_unimap(vc, &ui);
return 0; return 0;
} }
case PIO_UNIMAP: case PIO_UNIMAP:
case GIO_UNIMAP: case GIO_UNIMAP:
return do_unimap_ioctl(cmd, up, perm, console); return do_unimap_ioctl(cmd, up, perm, vc);
case VT_LOCKSWITCH: case VT_LOCKSWITCH:
if (!capable(CAP_SYS_TTY_CONFIG)) if (!capable(CAP_SYS_TTY_CONFIG))
...@@ -1054,26 +1055,29 @@ int vt_waitactive(int vt) ...@@ -1054,26 +1055,29 @@ int vt_waitactive(int vt)
#define vt_wake_waitactive() wake_up(&vt_activate_queue) #define vt_wake_waitactive() wake_up(&vt_activate_queue)
void reset_vc(unsigned int new_console) void reset_vc(struct vc_data *vc)
{ {
vt_cons[new_console]->vc_mode = KD_TEXT; struct vt_struct *vt = vt_cons[vc->vc_num];
kbd_table[new_console].kbdmode = VC_XLATE;
vt_cons[new_console]->vt_mode.mode = VT_AUTO; vt->vc_mode = KD_TEXT;
vt_cons[new_console]->vt_mode.waitv = 0; kbd_table[vc->vc_num].kbdmode = VC_XLATE;
vt_cons[new_console]->vt_mode.relsig = 0; vt->vt_mode.mode = VT_AUTO;
vt_cons[new_console]->vt_mode.acqsig = 0; vt->vt_mode.waitv = 0;
vt_cons[new_console]->vt_mode.frsig = 0; vt->vt_mode.relsig = 0;
vt_cons[new_console]->vt_pid = -1; vt->vt_mode.acqsig = 0;
vt_cons[new_console]->vt_newvt = -1; vt->vt_mode.frsig = 0;
vt->vt_pid = -1;
vt->vt_newvt = -1;
if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */ if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */
reset_palette(new_console) ; reset_palette(vc);
} }
/* /*
* Performs the back end of a vt switch * Performs the back end of a vt switch
*/ */
void complete_change_console(unsigned int new_console) void complete_change_console(struct vc_data *vc)
{ {
unsigned int new_console = vc->vc_num;
unsigned char old_vc_mode; unsigned char old_vc_mode;
last_console = fg_console; last_console = fg_console;
...@@ -1084,7 +1088,7 @@ void complete_change_console(unsigned int new_console) ...@@ -1084,7 +1088,7 @@ void complete_change_console(unsigned int new_console)
* unblank the screen later. * unblank the screen later.
*/ */
old_vc_mode = vt_cons[fg_console]->vc_mode; old_vc_mode = vt_cons[fg_console]->vc_mode;
switch_screen(new_console); switch_screen(vc);
/* /*
* This can't appear below a successful kill_proc(). If it did, * This can't appear below a successful kill_proc(). If it did,
...@@ -1129,7 +1133,7 @@ void complete_change_console(unsigned int new_console) ...@@ -1129,7 +1133,7 @@ void complete_change_console(unsigned int new_console)
* this outside of VT_PROCESS but there is no single process * this outside of VT_PROCESS but there is no single process
* to account for and tracking tty count may be undesirable. * to account for and tracking tty count may be undesirable.
*/ */
reset_vc(new_console); reset_vc(vc);
if (old_vc_mode != vt_cons[new_console]->vc_mode) if (old_vc_mode != vt_cons[new_console]->vc_mode)
{ {
...@@ -1151,11 +1155,9 @@ void complete_change_console(unsigned int new_console) ...@@ -1151,11 +1155,9 @@ void complete_change_console(unsigned int new_console)
/* /*
* Performs the front-end of a vt switch * Performs the front-end of a vt switch
*/ */
void change_console(unsigned int new_console) void change_console(struct vc_data *new_vc)
{ {
if ((new_console == fg_console) || (vt_dont_switch)) if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch)
return;
if (!vc_cons_allocated(new_console))
return; return;
/* /*
...@@ -1189,7 +1191,7 @@ void change_console(unsigned int new_console) ...@@ -1189,7 +1191,7 @@ void change_console(unsigned int new_console)
* return. The process needs to send us a * return. The process needs to send us a
* VT_RELDISP ioctl to complete the switch. * VT_RELDISP ioctl to complete the switch.
*/ */
vt_cons[fg_console]->vt_newvt = new_console; vt_cons[fg_console]->vt_newvt = new_vc->vc_num;
return; return;
} }
...@@ -1202,7 +1204,7 @@ void change_console(unsigned int new_console) ...@@ -1202,7 +1204,7 @@ void change_console(unsigned int new_console)
* this outside of VT_PROCESS but there is no single process * this outside of VT_PROCESS but there is no single process
* to account for and tracking tty count may be undesirable. * to account for and tracking tty count may be undesirable.
*/ */
reset_vc(fg_console); reset_vc(vc_cons[fg_console].d);
/* /*
* Fall through to normal (VT_AUTO) handling of the switch... * Fall through to normal (VT_AUTO) handling of the switch...
...@@ -1215,5 +1217,5 @@ void change_console(unsigned int new_console) ...@@ -1215,5 +1217,5 @@ void change_console(unsigned int new_console)
if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS) if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
return; return;
complete_change_console(new_console); complete_change_console(new_vc);
} }
...@@ -42,7 +42,7 @@ static void dummycon_init(struct vc_data *vc, int init) ...@@ -42,7 +42,7 @@ static void dummycon_init(struct vc_data *vc, int init)
vc->vc_cols = DUMMY_COLUMNS; vc->vc_cols = DUMMY_COLUMNS;
vc->vc_rows = DUMMY_ROWS; vc->vc_rows = DUMMY_ROWS;
} else } else
vc_resize(vc->vc_num, DUMMY_COLUMNS, DUMMY_ROWS); vc_resize(vc, DUMMY_COLUMNS, DUMMY_ROWS);
} }
static int dummycon_dummy(void) static int dummycon_dummy(void)
......
...@@ -458,7 +458,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info, ...@@ -458,7 +458,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
if (CON_IS_VISIBLE(vc) && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) { if (CON_IS_VISIBLE(vc) && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
fbcon_clear_margins(vc, 0); fbcon_clear_margins(vc, 0);
update_screen(vc->vc_num); update_screen(vc);
} }
if (save) { if (save) {
...@@ -609,7 +609,7 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info, ...@@ -609,7 +609,7 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info,
fg_vc->vc_rows); fg_vc->vc_rows);
} }
switch_screen(fg_console); update_screen(vc_cons[fg_console].d);
} }
/** /**
...@@ -802,7 +802,7 @@ static const char *fbcon_startup(void) ...@@ -802,7 +802,7 @@ static const char *fbcon_startup(void)
cols = info->var.xres / vc->vc_font.width; cols = info->var.xres / vc->vc_font.width;
rows = info->var.yres / vc->vc_font.height; rows = info->var.yres / vc->vc_font.height;
vc_resize(vc->vc_num, cols, rows); vc_resize(vc, cols, rows);
DPRINTK("mode: %s\n", info->fix.id); DPRINTK("mode: %s\n", info->fix.id);
DPRINTK("visual: %d\n", info->fix.visual); DPRINTK("visual: %d\n", info->fix.visual);
...@@ -890,13 +890,12 @@ static void fbcon_init(struct vc_data *vc, int init) ...@@ -890,13 +890,12 @@ static void fbcon_init(struct vc_data *vc, int init)
struct vc_data **default_mode = vc->vc_display_fg; struct vc_data **default_mode = vc->vc_display_fg;
struct vc_data *svc = *default_mode; struct vc_data *svc = *default_mode;
struct display *t, *p = &fb_display[vc->vc_num]; 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 logo = 1, new_rows, new_cols, rows, cols, charcnt = 256;
int cap = info->flags; int cap = info->flags;
if (info_idx == -1 || info == NULL) if (info_idx == -1 || info == NULL)
return; return;
if (vc->vc_num != display_fg || logo_shown == FBCON_LOGO_DONTSHOW || if (vc != svc || logo_shown == FBCON_LOGO_DONTSHOW ||
(info->fix.type == FB_TYPE_TEXT)) (info->fix.type == FB_TYPE_TEXT))
logo = 0; logo = 0;
...@@ -907,7 +906,7 @@ static void fbcon_init(struct vc_data *vc, int init) ...@@ -907,7 +906,7 @@ static void fbcon_init(struct vc_data *vc, int init)
/* If we are not the first console on this /* If we are not the first console on this
fb, copy the font from that console */ fb, copy the font from that console */
t = &fb_display[display_fg]; t = &fb_display[svc->vc_num];
if (!vc->vc_font.data) { if (!vc->vc_font.data) {
vc->vc_font.data = p->fontdata = t->fontdata; vc->vc_font.data = p->fontdata = t->fontdata;
vc->vc_font.width = (*default_mode)->vc_font.width; vc->vc_font.width = (*default_mode)->vc_font.width;
...@@ -929,15 +928,15 @@ static void fbcon_init(struct vc_data *vc, int init) ...@@ -929,15 +928,15 @@ static void fbcon_init(struct vc_data *vc, int init)
} }
if (!*svc->vc_uni_pagedir_loc) if (!*svc->vc_uni_pagedir_loc)
con_set_default_unimap(display_fg); con_set_default_unimap(svc);
if (!*vc->vc_uni_pagedir_loc) if (!*vc->vc_uni_pagedir_loc)
con_copy_unimap(vc->vc_num, display_fg); con_copy_unimap(vc, svc);
cols = vc->vc_cols; cols = vc->vc_cols;
rows = vc->vc_rows; rows = vc->vc_rows;
new_cols = info->var.xres / vc->vc_font.width; new_cols = info->var.xres / vc->vc_font.width;
new_rows = info->var.yres / vc->vc_font.height; new_rows = info->var.yres / vc->vc_font.height;
vc_resize(vc->vc_num, new_cols, new_rows); vc_resize(vc, new_cols, new_rows);
/* /*
* We must always set the mode. The mode of the previous console * We must always set the mode. The mode of the previous console
* driver could be in the same resolution but we are using different * driver could be in the same resolution but we are using different
...@@ -968,7 +967,7 @@ static void fbcon_init(struct vc_data *vc, int init) ...@@ -968,7 +967,7 @@ static void fbcon_init(struct vc_data *vc, int init)
if (logo) if (logo)
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows); fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
if (vc->vc_num == display_fg && softback_buf) { if (vc == svc && softback_buf) {
int l = fbcon_softback_size / vc->vc_size_row; int l = fbcon_softback_size / vc->vc_size_row;
if (l > 5) if (l > 5)
softback_end = softback_buf + l * vc->vc_size_row; softback_end = softback_buf + l * vc->vc_size_row;
...@@ -1144,13 +1143,12 @@ static void fbcon_set_disp(struct fb_info *info, struct vc_data *vc) ...@@ -1144,13 +1143,12 @@ static void fbcon_set_disp(struct fb_info *info, struct vc_data *vc)
struct display *p = &fb_display[vc->vc_num], *t; struct display *p = &fb_display[vc->vc_num], *t;
struct vc_data **default_mode = vc->vc_display_fg; struct vc_data **default_mode = vc->vc_display_fg;
struct vc_data *svc = *default_mode; struct vc_data *svc = *default_mode;
int display_fg = (*default_mode)->vc_num;
int rows, cols, charcnt = 256; int rows, cols, charcnt = 256;
info->var.xoffset = info->var.yoffset = p->yscroll = 0; info->var.xoffset = info->var.yoffset = p->yscroll = 0;
if (var_to_display(p, &info->var, info)) if (var_to_display(p, &info->var, info))
return; return;
t = &fb_display[display_fg]; t = &fb_display[svc->vc_num];
if (!vc->vc_font.data) { if (!vc->vc_font.data) {
vc->vc_font.data = p->fontdata = t->fontdata; vc->vc_font.data = p->fontdata = t->fontdata;
vc->vc_font.width = (*default_mode)->vc_font.width; vc->vc_font.width = (*default_mode)->vc_font.width;
...@@ -1173,15 +1171,15 @@ static void fbcon_set_disp(struct fb_info *info, struct vc_data *vc) ...@@ -1173,15 +1171,15 @@ static void fbcon_set_disp(struct fb_info *info, struct vc_data *vc)
} }
if (!*svc->vc_uni_pagedir_loc) if (!*svc->vc_uni_pagedir_loc)
con_set_default_unimap(display_fg); con_set_default_unimap(svc);
if (!*vc->vc_uni_pagedir_loc) if (!*vc->vc_uni_pagedir_loc)
con_copy_unimap(vc->vc_num, display_fg); con_copy_unimap(vc, svc);
cols = info->var.xres / vc->vc_font.width; cols = info->var.xres / vc->vc_font.width;
rows = info->var.yres / vc->vc_font.height; rows = info->var.yres / vc->vc_font.height;
vc_resize(vc->vc_num, cols, rows); vc_resize(vc, cols, rows);
if (CON_IS_VISIBLE(vc)) { if (CON_IS_VISIBLE(vc)) {
update_screen(vc->vc_num); update_screen(vc);
if (softback_buf) { if (softback_buf) {
int l = fbcon_softback_size / vc->vc_size_row; int l = fbcon_softback_size / vc->vc_size_row;
...@@ -1987,7 +1985,7 @@ static int fbcon_switch(struct vc_data *vc) ...@@ -1987,7 +1985,7 @@ static int fbcon_switch(struct vc_data *vc)
logo_shown = fg_console; logo_shown = fg_console;
/* This is protected above by initmem_freed */ /* This is protected above by initmem_freed */
fb_show_logo(info); fb_show_logo(info);
update_region(fg_console, update_region(vc,
vc->vc_origin + vc->vc_size_row * vc->vc_top, vc->vc_origin + vc->vc_size_row * vc->vc_top,
vc->vc_size_row * (vc->vc_bottom - vc->vc_size_row * (vc->vc_bottom -
vc->vc_top) / 2); vc->vc_top) / 2);
...@@ -2048,7 +2046,7 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) ...@@ -2048,7 +2046,7 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
} }
if (!blank) if (!blank)
update_screen(vc->vc_num); update_screen(vc);
} }
return 0; return 0;
...@@ -2198,7 +2196,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, ...@@ -2198,7 +2196,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
if (resize) { if (resize) {
/* reset wrap/pan */ /* reset wrap/pan */
info->var.xoffset = info->var.yoffset = p->yscroll = 0; info->var.xoffset = info->var.yoffset = p->yscroll = 0;
vc_resize(vc->vc_num, info->var.xres / w, info->var.yres / h); vc_resize(vc, info->var.xres / w, info->var.yres / h);
if (CON_IS_VISIBLE(vc) && softback_buf) { if (CON_IS_VISIBLE(vc) && softback_buf) {
int l = fbcon_softback_size / vc->vc_size_row; int l = fbcon_softback_size / vc->vc_size_row;
if (l > 5) if (l > 5)
...@@ -2213,7 +2211,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, ...@@ -2213,7 +2211,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
} else if (CON_IS_VISIBLE(vc) } else if (CON_IS_VISIBLE(vc)
&& vt_cons[vc->vc_num]->vc_mode == KD_TEXT) { && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
fbcon_clear_margins(vc, 0); fbcon_clear_margins(vc, 0);
update_screen(vc->vc_num); update_screen(vc);
} }
if (old_data && (--REFCOUNT(old_data) == 0)) if (old_data && (--REFCOUNT(old_data) == 0))
...@@ -2464,7 +2462,7 @@ static int fbcon_scrolldelta(struct vc_data *vc, int lines) ...@@ -2464,7 +2462,7 @@ static int fbcon_scrolldelta(struct vc_data *vc, int lines)
vc->vc_size_row); vc->vc_size_row);
} }
softback_in = p; softback_in = p;
update_region(vc->vc_num, vc->vc_origin, update_region(vc, vc->vc_origin,
logo_lines * vc->vc_cols); logo_lines * vc->vc_cols);
} }
logo_shown = FBCON_LOGO_CANSHOW; logo_shown = FBCON_LOGO_CANSHOW;
...@@ -2545,7 +2543,7 @@ static void fbcon_resumed(struct fb_info *info) ...@@ -2545,7 +2543,7 @@ static void fbcon_resumed(struct fb_info *info)
return; return;
vc = vc_cons[ops->currcon].d; vc = vc_cons[ops->currcon].d;
update_screen(vc->vc_num); update_screen(vc);
} }
static void fbcon_modechanged(struct fb_info *info) static void fbcon_modechanged(struct fb_info *info)
...@@ -2569,13 +2567,13 @@ static void fbcon_modechanged(struct fb_info *info) ...@@ -2569,13 +2567,13 @@ static void fbcon_modechanged(struct fb_info *info)
var_to_display(p, &info->var, info); var_to_display(p, &info->var, info);
cols = info->var.xres / vc->vc_font.width; cols = info->var.xres / vc->vc_font.width;
rows = info->var.yres / vc->vc_font.height; rows = info->var.yres / vc->vc_font.height;
vc_resize(vc->vc_num, cols, rows); vc_resize(vc, cols, rows);
updatescrollmode(p, info, vc); updatescrollmode(p, info, vc);
scrollback_max = 0; scrollback_max = 0;
scrollback_current = 0; scrollback_current = 0;
update_var(vc->vc_num, info); update_var(vc->vc_num, info);
fbcon_set_palette(vc, color_table); fbcon_set_palette(vc, color_table);
update_screen(vc->vc_num); update_screen(vc);
if (softback_buf) { if (softback_buf) {
int l = fbcon_softback_size / vc->vc_size_row; int l = fbcon_softback_size / vc->vc_size_row;
if (l > 5) if (l > 5)
......
...@@ -351,9 +351,8 @@ static void mdacon_init(struct vc_data *c, int init) ...@@ -351,9 +351,8 @@ static void mdacon_init(struct vc_data *c, int init)
if (init) { if (init) {
c->vc_cols = mda_num_columns; c->vc_cols = mda_num_columns;
c->vc_rows = mda_num_lines; c->vc_rows = mda_num_lines;
} else { } else
vc_resize(c->vc_num, mda_num_columns, mda_num_lines); vc_resize(c, mda_num_columns, mda_num_lines);
}
/* make the first MDA console visible */ /* make the first MDA console visible */
......
...@@ -155,9 +155,9 @@ promcon_init_unimap(struct vc_data *conp) ...@@ -155,9 +155,9 @@ promcon_init_unimap(struct vc_data *conp)
k++; k++;
} }
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
con_clear_unimap(conp->vc_num, NULL); con_clear_unimap(conp, NULL);
con_set_unimap(conp->vc_num, k, p); con_set_unimap(conp, k, p);
con_protect_unimap(conp->vc_num, 1); con_protect_unimap(conp, 1);
set_fs(old_fs); set_fs(old_fs);
kfree(p); kfree(p);
} }
...@@ -175,7 +175,7 @@ promcon_init(struct vc_data *conp, int init) ...@@ -175,7 +175,7 @@ promcon_init(struct vc_data *conp, int init)
p = *conp->vc_uni_pagedir_loc; p = *conp->vc_uni_pagedir_loc;
if (conp->vc_uni_pagedir_loc == &conp->vc_uni_pagedir || if (conp->vc_uni_pagedir_loc == &conp->vc_uni_pagedir ||
!--conp->vc_uni_pagedir_loc[1]) !--conp->vc_uni_pagedir_loc[1])
con_free_unimap(conp->vc_num); con_free_unimap(conp);
conp->vc_uni_pagedir_loc = promcon_uni_pagedir; conp->vc_uni_pagedir_loc = promcon_uni_pagedir;
promcon_uni_pagedir[1]++; promcon_uni_pagedir[1]++;
if (!promcon_uni_pagedir[0] && p) { if (!promcon_uni_pagedir[0] && p) {
...@@ -183,7 +183,7 @@ promcon_init(struct vc_data *conp, int init) ...@@ -183,7 +183,7 @@ promcon_init(struct vc_data *conp, int init)
} }
if (!init) { if (!init) {
if (conp->vc_cols != pw + 1 || conp->vc_rows != ph + 1) if (conp->vc_cols != pw + 1 || conp->vc_rows != ph + 1)
vc_resize(conp->vc_num, pw + 1, ph + 1); vc_resize(conp, pw + 1, ph + 1);
} }
} }
...@@ -192,9 +192,9 @@ promcon_deinit(struct vc_data *conp) ...@@ -192,9 +192,9 @@ promcon_deinit(struct vc_data *conp)
{ {
/* When closing the last console, reset video origin */ /* When closing the last console, reset video origin */
if (!--promcon_uni_pagedir[1]) if (!--promcon_uni_pagedir[1])
con_free_unimap(conp->vc_num); con_free_unimap(conp);
conp->vc_uni_pagedir_loc = &conp->vc_uni_pagedir; conp->vc_uni_pagedir_loc = &conp->vc_uni_pagedir;
con_set_default_unimap(conp->vc_num); con_set_default_unimap(conp);
} }
static int static int
......
...@@ -217,7 +217,7 @@ static void sticon_init(struct vc_data *c, int init) ...@@ -217,7 +217,7 @@ static void sticon_init(struct vc_data *c, int init)
} else { } else {
/* vc_rows = (c->vc_rows > vc_rows) ? vc_rows : c->vc_rows; */ /* 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_cols = (c->vc_cols > vc_cols) ? vc_cols : c->vc_cols; */
vc_resize(c->vc_num, vc_cols, vc_rows); vc_resize(c, vc_cols, vc_rows);
/* vc_resize_con(vc_rows, vc_cols, c->vc_num); */ /* vc_resize_con(vc_rows, vc_cols, c->vc_num); */
} }
} }
......
...@@ -340,11 +340,11 @@ static void vgacon_init(struct vc_data *c, int init) ...@@ -340,11 +340,11 @@ static void vgacon_init(struct vc_data *c, int init)
p = *c->vc_uni_pagedir_loc; p = *c->vc_uni_pagedir_loc;
if (c->vc_uni_pagedir_loc == &c->vc_uni_pagedir || if (c->vc_uni_pagedir_loc == &c->vc_uni_pagedir ||
!--c->vc_uni_pagedir_loc[1]) !--c->vc_uni_pagedir_loc[1])
con_free_unimap(c->vc_num); con_free_unimap(c);
c->vc_uni_pagedir_loc = vgacon_uni_pagedir; c->vc_uni_pagedir_loc = vgacon_uni_pagedir;
vgacon_uni_pagedir[1]++; vgacon_uni_pagedir[1]++;
if (!vgacon_uni_pagedir[0] && p) if (!vgacon_uni_pagedir[0] && p)
con_set_default_unimap(c->vc_num); con_set_default_unimap(c);
} }
static inline void vga_set_mem_top(struct vc_data *c) static inline void vga_set_mem_top(struct vc_data *c)
...@@ -358,10 +358,10 @@ static void vgacon_deinit(struct vc_data *c) ...@@ -358,10 +358,10 @@ static void vgacon_deinit(struct vc_data *c)
if (!--vgacon_uni_pagedir[1]) { if (!--vgacon_uni_pagedir[1]) {
c->vc_visible_origin = vga_vram_base; c->vc_visible_origin = vga_vram_base;
vga_set_mem_top(c); vga_set_mem_top(c);
con_free_unimap(c->vc_num); con_free_unimap(c);
} }
c->vc_uni_pagedir_loc = &c->vc_uni_pagedir; c->vc_uni_pagedir_loc = &c->vc_uni_pagedir;
con_set_default_unimap(c->vc_num); con_set_default_unimap(c);
} }
static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity, static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity,
...@@ -908,7 +908,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight) ...@@ -908,7 +908,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
c->vc_sw->con_cursor(c, CM_DRAW); c->vc_sw->con_cursor(c, CM_DRAW);
} }
c->vc_font.height = fontheight; c->vc_font.height = fontheight;
vc_resize(c->vc_num, 0, rows); /* Adjust console size */ vc_resize(c, 0, rows); /* Adjust console size */
} }
} }
return 0; return 0;
......
...@@ -1559,7 +1559,7 @@ static int do_fontx_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg, ...@@ -1559,7 +1559,7 @@ static int do_fontx_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
get_user(data, &user_cfd->chardata)) get_user(data, &user_cfd->chardata))
return -EFAULT; return -EFAULT;
op.data = compat_ptr(data); op.data = compat_ptr(data);
return con_font_op(fg_console, &op); return con_font_op(vc_cons[fg_console].d, &op);
case GIO_FONTX: case GIO_FONTX:
op.op = KD_FONT_OP_GET; op.op = KD_FONT_OP_GET;
op.flags = 0; op.flags = 0;
...@@ -1571,7 +1571,7 @@ static int do_fontx_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg, ...@@ -1571,7 +1571,7 @@ static int do_fontx_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
if (!data) if (!data)
return 0; return 0;
op.data = compat_ptr(data); op.data = compat_ptr(data);
i = con_font_op(fg_console, &op); i = con_font_op(vc_cons[fg_console].d, &op);
if (i) if (i)
return i; return i;
if (put_user(op.height, &user_cfd->charheight) || if (put_user(op.height, &user_cfd->charheight) ||
...@@ -1608,7 +1608,7 @@ static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, unsigned long ar ...@@ -1608,7 +1608,7 @@ static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, unsigned long ar
op.data = compat_ptr(((struct console_font_op32 *)&op)->data); op.data = compat_ptr(((struct console_font_op32 *)&op)->data);
op.flags |= KD_FONT_FLAG_OLD; op.flags |= KD_FONT_FLAG_OLD;
vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data; vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
i = con_font_op(vt->vc_num, &op); i = con_font_op(vc_cons[vt->vc_num].d, &op);
if (i) return i; if (i) return i;
((struct console_font_op32 *)&op)->data = (unsigned long)op.data; ((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
if (copy_to_user(fontop, &op, sizeof(struct console_font_op32))) if (copy_to_user(fontop, &op, sizeof(struct console_font_op32)))
...@@ -1633,9 +1633,9 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg, ...@@ -1633,9 +1633,9 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg,
switch (cmd) { switch (cmd) {
case PIO_UNIMAP: case PIO_UNIMAP:
if (!perm) return -EPERM; if (!perm) return -EPERM;
return con_set_unimap(fg_console, tmp.entry_ct, compat_ptr(tmp.entries)); return con_set_unimap(vc_cons[fg_console].d, tmp.entry_ct, compat_ptr(tmp.entries));
case GIO_UNIMAP: case GIO_UNIMAP:
return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), compat_ptr(tmp.entries)); return con_get_unimap(vc_cons[fg_console].d, tmp.entry_ct, &(user_ud->entry_ct), compat_ptr(tmp.entries));
} }
return 0; return 0;
} }
......
...@@ -11,5 +11,5 @@ ...@@ -11,5 +11,5 @@
struct vc_data; struct vc_data;
extern unsigned char inverse_translate(struct vc_data *conp, int glyph); extern unsigned char inverse_translate(struct vc_data *conp, int glyph);
extern unsigned short *set_translate(int m,int currcons); extern unsigned short *set_translate(int m, struct vc_data *vc);
extern int conv_uni_to_pc(struct vc_data *conp, long ucs); extern int conv_uni_to_pc(struct vc_data *conp, long ucs);
...@@ -41,25 +41,25 @@ extern int kbd_rate(struct kbd_repeat *rep); ...@@ -41,25 +41,25 @@ extern int kbd_rate(struct kbd_repeat *rep);
int vc_allocate(unsigned int console); int vc_allocate(unsigned int console);
int vc_cons_allocated(unsigned int console); int vc_cons_allocated(unsigned int console);
int vc_resize(int currcons, unsigned int cols, unsigned int lines); int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines);
void vc_disallocate(unsigned int console); void vc_disallocate(unsigned int console);
void reset_palette(int currcons); void reset_palette(struct vc_data *vc);
void set_palette(int currcons); void set_palette(struct vc_data *vc);
void do_blank_screen(int entering_gfx); void do_blank_screen(int entering_gfx);
void do_unblank_screen(int leaving_gfx); void do_unblank_screen(int leaving_gfx);
void unblank_screen(void); void unblank_screen(void);
void poke_blanked_console(void); void poke_blanked_console(void);
int con_font_op(int currcons, struct console_font_op *op); int con_font_op(struct vc_data *vc, struct console_font_op *op);
int con_font_set(int currcons, struct console_font_op *op); int con_font_set(struct vc_data *vc, struct console_font_op *op);
int con_font_get(int currcons, struct console_font_op *op); int con_font_get(struct vc_data *vc, struct console_font_op *op);
int con_font_default(int currcons, struct console_font_op *op); int con_font_default(struct vc_data *vc, struct console_font_op *op);
int con_font_copy(int currcons, struct console_font_op *op); int con_font_copy(struct vc_data *vc, struct console_font_op *op);
int con_set_cmap(unsigned char __user *cmap); int con_set_cmap(unsigned char __user *cmap);
int con_get_cmap(unsigned char __user *cmap); int con_get_cmap(unsigned char __user *cmap);
void scrollback(int); void scrollback(struct vc_data *vc, int lines);
void scrollfront(int); void scrollfront(struct vc_data *vc, int lines);
void update_region(int currcons, unsigned long start, int count); void update_region(struct vc_data *vc, unsigned long start, int count);
void redraw_screen(int new_console, int is_switch); void redraw_screen(struct vc_data *vc, int is_switch);
#define update_screen(x) redraw_screen(x, 0) #define update_screen(x) redraw_screen(x, 0)
#define switch_screen(x) redraw_screen(x, 1) #define switch_screen(x) redraw_screen(x, 1)
...@@ -75,19 +75,19 @@ int con_set_trans_old(unsigned char __user * table); ...@@ -75,19 +75,19 @@ int con_set_trans_old(unsigned char __user * table);
int con_get_trans_old(unsigned char __user * table); int con_get_trans_old(unsigned char __user * table);
int con_set_trans_new(unsigned short __user * table); int con_set_trans_new(unsigned short __user * table);
int con_get_trans_new(unsigned short __user * table); int con_get_trans_new(unsigned short __user * table);
int con_clear_unimap(int currcons, struct unimapinit *ui); int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui);
int con_set_unimap(int currcons, ushort ct, struct unipair __user *list); int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list);
int con_get_unimap(int currcons, ushort ct, ushort __user *uct, 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(int currcons); int con_set_default_unimap(struct vc_data *vc);
void con_free_unimap(int currcons); void con_free_unimap(struct vc_data *vc);
void con_protect_unimap(int currcons, int rdonly); void con_protect_unimap(struct vc_data *vc, int rdonly);
int con_copy_unimap(int dstcons, int srccons); int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc);
/* vt.c */ /* vt.c */
void complete_change_console(unsigned int new_console); void complete_change_console(struct vc_data *vc);
int vt_waitactive(int vt); int vt_waitactive(int vt);
void change_console(unsigned int); void change_console(struct vc_data *new_vc);
void reset_vc(unsigned int new_console); void reset_vc(struct vc_data *vc);
/* /*
* vc_screen.c shares this temporary buffer with the console write code so that * vc_screen.c shares this temporary buffer with the console write code so that
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment