* [PATCH] cleanup virtual console <-> selection.c interface
@ 2004-12-31 14:34 Christoph Hellwig
2005-01-15 3:36 ` Roman Zippel
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Christoph Hellwig @ 2004-12-31 14:34 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel
Pass around pointers instead of indices into a global array between
various files of the virtual console implementation and stop using
obsfucting macros that expect certain variables to be in scope.
This is a first step to get rid of the various global arrays in the VC
code.
--- 1.12/drivers/char/selection.c 2004-10-28 09:39:58 +02:00
+++ edited/drivers/char/selection.c 2004-12-31 14:30:35 +01:00
@@ -33,7 +33,7 @@ extern void poke_blanked_console(void);
/* Variables for selection control. */
/* Use a dynamic buffer, instead of static (Dec 1994) */
- int sel_cons; /* must not be disallocated */
+struct vc_data *sel_cons; /* must not be disallocated */
static volatile int sel_start = -1; /* cleared by clear_selection */
static int sel_end;
static int sel_buffer_lth;
@@ -44,20 +44,22 @@ static char *sel_buffer;
/* set reverse video on characters s-e of console with selection. */
inline static void
-highlight(const int s, const int e) {
+highlight(const int s, const int e)
+{
invert_screen(sel_cons, s, e-s+2, 1);
}
/* use complementary color to show the pointer */
inline static void
-highlight_pointer(const int where) {
+highlight_pointer(const int where)
+{
complement_pos(sel_cons, where);
}
static unsigned char
sel_pos(int n)
{
- return inverse_translate(vc_cons[sel_cons].d, screen_glyph(sel_cons, n));
+ return inverse_translate(sel_cons, screen_glyph(sel_cons, n));
}
/* remove the current selection highlight, if any,
@@ -111,10 +113,10 @@ static inline unsigned short limit(const
/* set the current selection. Invoked by ioctl() or by kernel code. */
int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty)
{
+ struct vc_data *vc = vc_cons[fg_console].d;
int sel_mode, new_sel_start, new_sel_end, spc;
char *bp, *obp;
int i, ps, pe;
- unsigned int currcons = fg_console;
poke_blanked_console();
@@ -128,12 +130,12 @@ int set_selection(const struct tiocl_sel
__get_user(ye, &sel->ye);
__get_user(sel_mode, &sel->sel_mode);
xs--; ys--; xe--; ye--;
- xs = limit(xs, video_num_columns - 1);
- ys = limit(ys, video_num_lines - 1);
- xe = limit(xe, video_num_columns - 1);
- ye = limit(ye, video_num_lines - 1);
- ps = ys * video_size_row + (xs << 1);
- pe = ye * video_size_row + (xe << 1);
+ xs = limit(xs, vc->vc_cols - 1);
+ ys = limit(ys, vc->vc_rows - 1);
+ xe = limit(xe, vc->vc_cols - 1);
+ ye = limit(ye, vc->vc_rows - 1);
+ ps = ys * vc->vc_size_row + (xs << 1);
+ pe = ye * vc->vc_size_row + (xe << 1);
if (sel_mode == TIOCL_SELCLEAR) {
/* useful for screendump without selection highlights */
@@ -154,9 +156,9 @@ int set_selection(const struct tiocl_sel
pe = tmp;
}
- if (sel_cons != fg_console) {
+ if (sel_cons != vc_cons[fg_console].d) {
clear_selection();
- sel_cons = fg_console;
+ sel_cons = vc_cons[fg_console].d;
}
switch (sel_mode)
@@ -173,7 +175,7 @@ int set_selection(const struct tiocl_sel
(!spc && !inword(sel_pos(ps))))
break;
new_sel_start = ps;
- if (!(ps % video_size_row))
+ if (!(ps % vc->vc_size_row))
break;
}
spc = isspace(sel_pos(pe));
@@ -183,14 +185,14 @@ int set_selection(const struct tiocl_sel
(!spc && !inword(sel_pos(pe))))
break;
new_sel_end = pe;
- if (!((pe + 2) % video_size_row))
+ if (!((pe + 2) % vc->vc_size_row))
break;
}
break;
case TIOCL_SELLINE: /* line-by-line selection */
- new_sel_start = ps - ps % video_size_row;
- new_sel_end = pe + video_size_row
- - pe % video_size_row - 2;
+ new_sel_start = ps - ps % vc->vc_size_row;
+ new_sel_end = pe + vc->vc_size_row
+ - pe % vc->vc_size_row - 2;
break;
case TIOCL_SELPOINTER:
highlight_pointer(pe);
@@ -204,11 +206,11 @@ int set_selection(const struct tiocl_sel
/* select to end of line if on trailing space */
if (new_sel_end > new_sel_start &&
- !atedge(new_sel_end, video_size_row) &&
+ !atedge(new_sel_end, vc->vc_size_row) &&
isspace(sel_pos(new_sel_end))) {
for (pe = new_sel_end + 2; ; pe += 2)
if (!isspace(sel_pos(pe)) ||
- atedge(pe, video_size_row))
+ atedge(pe, vc->vc_size_row))
break;
if (isspace(sel_pos(pe)))
new_sel_end = pe;
@@ -255,7 +257,7 @@ int set_selection(const struct tiocl_sel
*bp = sel_pos(i);
if (!isspace(*bp++))
obp = bp;
- if (! ((i + 2) % video_size_row)) {
+ if (! ((i + 2) % vc->vc_size_row)) {
/* strip trailing blanks from line and add newline,
unless non-space at end of line. */
if (obp != bp) {
===== drivers/char/vc_screen.c 1.14 vs edited =====
--- 1.14/drivers/char/vc_screen.c 2004-06-28 02:28:39 +02:00
+++ edited/drivers/char/vc_screen.c 2004-12-31 14:30:35 +01:00
@@ -59,7 +59,7 @@ vcs_size(struct inode *inode)
if (!vc_cons_allocated(currcons))
return -ENXIO;
- size = video_num_lines * video_num_columns;
+ size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_cols;
if (minor & 128)
size = 2*size + HEADER_SIZE;
@@ -99,6 +99,7 @@ vcs_read(struct file *file, char __user
{
struct inode *inode = file->f_dentry->d_inode;
unsigned int currcons = iminor(inode);
+ struct vc_data *vc;
long pos;
long viewed, attr, read;
int col, maxcol;
@@ -126,6 +127,7 @@ vcs_read(struct file *file, char __user
ret = -ENXIO;
if (!vc_cons_allocated(currcons))
goto unlock_out;
+ vc = vc_cons[currcons].d;
ret = -EINVAL;
if (pos < 0)
@@ -159,15 +161,15 @@ vcs_read(struct file *file, char __user
con_buf_start = con_buf0 = con_buf;
orig_count = this_round;
- maxcol = video_num_columns;
+ maxcol = vc->vc_cols;
if (!attr) {
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
col = p % maxcol;
p += maxcol - col;
while (this_round-- > 0) {
- *con_buf0++ = (vcs_scr_readw(currcons, org++) & 0xff);
+ *con_buf0++ = (vcs_scr_readw(vc, org++) & 0xff);
if (++col == maxcol) {
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
col = 0;
p += maxcol;
}
@@ -176,9 +178,9 @@ vcs_read(struct file *file, char __user
if (p < HEADER_SIZE) {
size_t tmp_count;
- con_buf0[0] = (char) video_num_lines;
- con_buf0[1] = (char) video_num_columns;
- getconsxy(currcons, con_buf0 + 2);
+ con_buf0[0] = (char)vc->vc_rows;
+ con_buf0[1] = (char)vc->vc_cols;
+ getconsxy(vc, con_buf0 + 2);
con_buf_start += p;
this_round += p;
@@ -214,7 +216,7 @@ vcs_read(struct file *file, char __user
p /= 2;
col = p % maxcol;
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
p += maxcol - col;
/* Buffer has even length, so we can always copy
@@ -224,10 +226,10 @@ vcs_read(struct file *file, char __user
this_round = (this_round + 1) >> 1;
while (this_round) {
- *tmp_buf++ = vcs_scr_readw(currcons, org++);
+ *tmp_buf++ = vcs_scr_readw(vc, org++);
this_round --;
if (++col == maxcol) {
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
col = 0;
p += maxcol;
}
@@ -270,6 +272,7 @@ vcs_write(struct file *file, const char
{
struct inode *inode = file->f_dentry->d_inode;
unsigned int currcons = iminor(inode);
+ struct vc_data *vc;
long pos;
long viewed, attr, size, written;
char *con_buf0;
@@ -299,6 +302,7 @@ vcs_write(struct file *file, const char
ret = -ENXIO;
if (!vc_cons_allocated(currcons))
goto unlock_out;
+ vc = vc_cons[currcons].d;
size = vcs_size(inode);
ret = -EINVAL;
@@ -351,10 +355,10 @@ vcs_write(struct file *file, const char
con_buf0 = con_buf;
orig_count = this_round;
- maxcol = video_num_columns;
+ maxcol = vc->vc_cols;
p = pos;
if (!attr) {
- org0 = org = screen_pos(currcons, p, viewed);
+ org0 = org = screen_pos(vc, p, viewed);
col = p % maxcol;
p += maxcol - col;
@@ -362,11 +366,11 @@ vcs_write(struct file *file, const char
unsigned char c = *con_buf0++;
this_round--;
- vcs_scr_writew(currcons,
- (vcs_scr_readw(currcons, org) & 0xff00) | c, org);
+ vcs_scr_writew(vc,
+ (vcs_scr_readw(vc, org) & 0xff00) | c, org);
org++;
if (++col == maxcol) {
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
col = 0;
p += maxcol;
}
@@ -375,34 +379,34 @@ vcs_write(struct file *file, const char
if (p < HEADER_SIZE) {
char header[HEADER_SIZE];
- getconsxy(currcons, header + 2);
+ getconsxy(vc, header + 2);
while (p < HEADER_SIZE && this_round > 0) {
this_round--;
header[p++] = *con_buf0++;
}
if (!viewed)
- putconsxy(currcons, header + 2);
+ putconsxy(vc, header + 2);
}
p -= HEADER_SIZE;
col = (p/2) % maxcol;
if (this_round > 0) {
- org0 = org = screen_pos(currcons, p/2, viewed);
+ org0 = org = screen_pos(vc, p/2, viewed);
if ((p & 1) && this_round > 0) {
char c;
this_round--;
c = *con_buf0++;
#ifdef __BIG_ENDIAN
- vcs_scr_writew(currcons, c |
- (vcs_scr_readw(currcons, org) & 0xff00), org);
+ vcs_scr_writew(vc, c |
+ (vcs_scr_readw(vc, org) & 0xff00), org);
#else
- vcs_scr_writew(currcons, (c << 8) |
- (vcs_scr_readw(currcons, org) & 0xff), org);
+ vcs_scr_writew(vc, (c << 8) |
+ (vcs_scr_readw(vc, org) & 0xff), org);
#endif
org++;
p++;
if (++col == maxcol) {
- org = screen_pos(currcons, p/2, viewed);
+ org = screen_pos(vc, p/2, viewed);
col = 0;
}
}
@@ -413,11 +417,11 @@ vcs_write(struct file *file, const char
unsigned short w;
w = get_unaligned(((const unsigned short *)con_buf0));
- vcs_scr_writew(currcons, w, org++);
+ vcs_scr_writew(vc, w, org++);
con_buf0 += 2;
this_round -= 2;
if (++col == maxcol) {
- org = screen_pos(currcons, p, viewed);
+ org = screen_pos(vc, p, viewed);
col = 0;
p += maxcol;
}
@@ -427,9 +431,9 @@ vcs_write(struct file *file, const char
c = *con_buf0++;
#ifdef __BIG_ENDIAN
- vcs_scr_writew(currcons, (vcs_scr_readw(currcons, org) & 0xff) | (c << 8), org);
+ vcs_scr_writew(vc, (vcs_scr_readw(vc, org) & 0xff) | (c << 8), org);
#else
- vcs_scr_writew(currcons, (vcs_scr_readw(currcons, org) & 0xff00) | c, org);
+ vcs_scr_writew(vc, (vcs_scr_readw(vc, org) & 0xff00) | c, org);
#endif
}
}
===== drivers/char/vt.c 1.85 vs edited =====
--- 1.85/drivers/char/vt.c 2004-12-10 18:52:35 +01:00
+++ edited/drivers/char/vt.c 2004-12-31 14:30:35 +01:00
@@ -40,15 +40,6 @@
* - Arno Griffioen <arno@usn.nl>
* - David Carter <carter@cs.bris.ac.uk>
*
- * Note that the abstract console driver allows all consoles to be of
- * potentially different sizes, so the following variables depend on the
- * current console (currcons):
- *
- * - video_num_columns
- * - video_num_lines
- * - video_size_row
- * - can_do_color
- *
* The abstract console driver provides a generic interface for a text
* console. It supports VGA text mode, frame buffer based graphical consoles
* and special graphics processors that are only accessible through some
@@ -146,13 +137,13 @@ static const struct consw *con_driver_ma
static int con_open(struct tty_struct *, struct file *);
static void vc_init(unsigned int console, unsigned int rows,
unsigned int cols, int do_clear);
-static void gotoxy(int currcons, 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 reset_terminal(int currcons, int do_clear);
static void con_flush_chars(struct tty_struct *tty);
static void set_vesa_blanking(char __user *p);
-static void set_cursor(int currcons);
-static void hide_cursor(int currcons);
+static void set_cursor(struct vc_data *vc);
+static void hide_cursor(struct vc_data *vc);
static void console_callback(void *ignored);
static void blank_screen_t(unsigned long dummy);
@@ -223,28 +214,32 @@ enum {
* Low-Level Functions
*/
-#define IS_FG (currcons == fg_console)
+#define IS_FG (currcons == fg_console)
+#define IS_FG_VC(vc) (vc == vc_cons[fg_console].d)
+
#define IS_VISIBLE CON_IS_VISIBLE(vc_cons[currcons].d)
#ifdef VT_BUF_VRAM_ONLY
-#define DO_UPDATE 0
+#define DO_UPDATE 0
+#define DO_UPDATE_VC(vc) 0
#else
-#define DO_UPDATE IS_VISIBLE
+#define DO_UPDATE IS_VISIBLE
+#define DO_UPDATE_VC(vc) CON_IS_VISIBLE(vc)
#endif
static int pm_con_request(struct pm_dev *dev, pm_request_t rqst, void *data);
static struct pm_dev *pm_con;
-static inline unsigned short *screenpos(int currcons, int offset, int viewed)
+static inline unsigned short *screenpos(struct vc_data *vc, int offset, int viewed)
{
unsigned short *p;
if (!viewed)
- p = (unsigned short *)(origin + offset);
- else if (!sw->con_screen_pos)
- p = (unsigned short *)(visible_origin + offset);
+ p = (unsigned short *)(vc->vc_origin + offset);
+ else if (!vc->vc_sw->con_screen_pos)
+ p = (unsigned short *)(vc->vc_visible_origin + offset);
else
- p = sw->con_screen_pos(vc_cons[currcons].d, offset);
+ p = vc->vc_sw->con_screen_pos(vc, offset);
return p;
}
@@ -265,14 +260,15 @@ static void scrup(int currcons, unsigned
if (t+nr >= b)
nr = b - t - 1;
- if (b > video_num_lines || t >= b || nr < 1)
+ if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1)
return;
if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_UP, nr))
return;
- d = (unsigned short *) (origin+video_size_row*t);
- s = (unsigned short *) (origin+video_size_row*(t+nr));
- scr_memmovew(d, s, (b-t-nr) * video_size_row);
- scr_memsetw(d + (b-t-nr) * video_num_columns, video_erase_char, video_size_row*nr);
+ d = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t);
+ s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*(t+nr));
+ scr_memmovew(d, s, (b-t-nr) * vc_cons[currcons].d->vc_size_row);
+ scr_memsetw(d + (b-t-nr) * vc_cons[currcons].d->vc_cols, video_erase_char,
+ vc_cons[currcons].d->vc_size_row * nr);
}
static void
@@ -283,40 +279,40 @@ scrdown(int currcons, unsigned int t, un
if (t+nr >= b)
nr = b - t - 1;
- if (b > video_num_lines || t >= b || nr < 1)
+ if (b > vc_cons[currcons].d->vc_rows || t >= b || nr < 1)
return;
if (IS_VISIBLE && sw->con_scroll(vc_cons[currcons].d, t, b, SM_DOWN, nr))
return;
- s = (unsigned short *) (origin+video_size_row*t);
- step = video_num_columns * nr;
- scr_memmovew(s + step, s, (b-t-nr)*video_size_row);
+ s = (unsigned short *) (origin+vc_cons[currcons].d->vc_size_row*t);
+ step = vc_cons[currcons].d->vc_cols * nr;
+ scr_memmovew(s + step, s, (b-t-nr)*vc_cons[currcons].d->vc_size_row);
scr_memsetw(s, video_erase_char, 2*step);
}
-static void do_update_region(int currcons, unsigned long start, int count)
+static void do_update_region(struct vc_data *vc, unsigned long start, int count)
{
#ifndef VT_BUF_VRAM_ONLY
unsigned int xx, yy, offset;
u16 *p;
p = (u16 *) start;
- if (!sw->con_getxy) {
- offset = (start - origin) / 2;
- xx = offset % video_num_columns;
- yy = offset / video_num_columns;
+ if (!vc->vc_sw->con_getxy) {
+ offset = (start - vc->vc_origin) / 2;
+ xx = offset % vc->vc_cols;
+ yy = offset / vc->vc_cols;
} else {
int nxx, nyy;
- start = sw->con_getxy(vc_cons[currcons].d, start, &nxx, &nyy);
+ start = vc->vc_sw->con_getxy(vc, start, &nxx, &nyy);
xx = nxx; yy = nyy;
}
for(;;) {
u16 attrib = scr_readw(p) & 0xff00;
int startx = xx;
u16 *q = p;
- while (xx < video_num_columns && count) {
+ while (xx < vc->vc_cols && count) {
if (attrib != (scr_readw(p) & 0xff00)) {
if (p > q)
- sw->con_putcs(vc_cons[currcons].d, q, p-q, yy, startx);
+ vc->vc_sw->con_putcs(vc, q, p-q, yy, startx);
startx = xx;
q = p;
attrib = scr_readw(p) & 0xff00;
@@ -326,14 +322,14 @@ static void do_update_region(int currcon
count--;
}
if (p > q)
- sw->con_putcs(vc_cons[currcons].d, q, p-q, yy, startx);
+ vc->vc_sw->con_putcs(vc, q, p-q, yy, startx);
if (!count)
break;
xx = 0;
yy++;
- if (sw->con_getxy) {
+ if (vc->vc_sw->con_getxy) {
p = (u16 *)start;
- start = sw->con_getxy(vc_cons[currcons].d, start, NULL, NULL);
+ start = vc->vc_sw->con_getxy(vc, start, NULL, NULL);
}
}
#endif
@@ -344,9 +340,9 @@ void update_region(int currcons, unsigne
WARN_CONSOLE_UNLOCKED();
if (DO_UPDATE) {
- hide_cursor(currcons);
- do_update_region(currcons, start, count);
- set_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
+ do_update_region(vc_cons[currcons].d, start, count);
+ set_cursor(vc_cons[currcons].d);
}
}
@@ -370,7 +366,7 @@ static u8 build_attr(int currcons, u8 _c
*/
{
u8 a = color;
- if (!can_do_color)
+ if (!vc_cons[currcons].d->vc_can_do_color)
return _intensity |
(_underline ? 4 : 0) |
(_reverse ? 8 : 0) |
@@ -401,31 +397,30 @@ static void update_attr(int currcons)
}
/* Note: inverting the screen twice should revert to the original state */
-
-void invert_screen(int currcons, int offset, int count, int viewed)
+void invert_screen(struct vc_data *vc, int offset, int count, int viewed)
{
unsigned short *p;
WARN_CONSOLE_UNLOCKED();
count /= 2;
- p = screenpos(currcons, offset, viewed);
- if (sw->con_invert_region)
- sw->con_invert_region(vc_cons[currcons].d, p, count);
+ p = screenpos(vc, offset, viewed);
+ if (vc->vc_sw->con_invert_region)
+ vc->vc_sw->con_invert_region(vc, p, count);
#ifndef VT_BUF_VRAM_ONLY
else {
u16 *q = p;
int cnt = count;
u16 a;
- if (!can_do_color) {
+ if (!vc->vc_can_do_color) {
while (cnt--) {
a = scr_readw(q);
a ^= 0x0800;
scr_writew(a, q);
q++;
}
- } else if (hi_font_mask == 0x100) {
+ } else if (vc->vc_hi_font_mask == 0x100) {
while (cnt--) {
a = scr_readw(q);
a = ((a) & 0x11ff) | (((a) & 0xe000) >> 4) | (((a) & 0x0e00) << 4);
@@ -442,12 +437,12 @@ void invert_screen(int currcons, int off
}
}
#endif
- if (DO_UPDATE)
- do_update_region(currcons, (unsigned long) p, count);
+ if (DO_UPDATE_VC(vc))
+ do_update_region(vc, (unsigned long) p, count);
}
/* used by selection: complement pointer position */
-void complement_pos(int currcons, int offset)
+void complement_pos(struct vc_data *vc, int offset)
{
static unsigned short *p;
static unsigned short old;
@@ -457,21 +452,21 @@ void complement_pos(int currcons, int of
if (p) {
scr_writew(old, p);
- if (DO_UPDATE)
- sw->con_putc(vc_cons[currcons].d, old, oldy, oldx);
+ if (DO_UPDATE_VC(vc))
+ vc->vc_sw->con_putc(vc, old, oldy, oldx);
}
if (offset == -1)
p = NULL;
else {
unsigned short new;
- p = screenpos(currcons, offset, 1);
+ p = screenpos(vc, offset, 1);
old = scr_readw(p);
- new = old ^ complement_mask;
+ new = old ^ vc->vc_complement_mask;
scr_writew(new, p);
- if (DO_UPDATE) {
- oldx = (offset >> 1) % video_num_columns;
- oldy = (offset >> 1) / video_num_columns;
- sw->con_putc(vc_cons[currcons].d, new, oldy, oldx);
+ if (DO_UPDATE_VC(vc)) {
+ oldx = (offset >> 1) % vc->vc_cols;
+ oldy = (offset >> 1) / vc->vc_cols;
+ vc->vc_sw->con_putc(vc, new, oldy, oldx);
}
}
}
@@ -480,7 +475,7 @@ static void insert_char(int currcons, un
{
unsigned short *p, *q = (unsigned short *) pos;
- p = q + video_num_columns - nr - x;
+ p = q + vc_cons[currcons].d->vc_cols - nr - x;
while (--p >= q)
scr_writew(scr_readw(p), p + nr);
scr_memsetw(q, video_erase_char, nr*2);
@@ -488,7 +483,7 @@ static void insert_char(int currcons, un
if (DO_UPDATE) {
unsigned short oldattr = attr;
sw->con_bmove(vc_cons[currcons].d,y,x,y,x+nr,1,
- video_num_columns-x-nr);
+ vc_cons[currcons].d->vc_cols-x-nr);
attr = video_erase_char >> 8;
while (nr--)
sw->con_putc(vc_cons[currcons].d,
@@ -502,7 +497,7 @@ static void delete_char(int currcons, un
unsigned int i = x;
unsigned short *p = (unsigned short *) pos;
- while (++i <= video_num_columns - nr) {
+ while (++i <= vc_cons[currcons].d->vc_cols - nr) {
scr_writew(scr_readw(p+nr), p);
p++;
}
@@ -511,22 +506,22 @@ static void delete_char(int currcons, un
if (DO_UPDATE) {
unsigned short oldattr = attr;
sw->con_bmove(vc_cons[currcons].d, y, x+nr, y, x, 1,
- video_num_columns-x-nr);
+ vc_cons[currcons].d->vc_cols-x-nr);
attr = video_erase_char >> 8;
while (nr--)
sw->con_putc(vc_cons[currcons].d,
video_erase_char, y,
- video_num_columns-1-nr);
+ vc_cons[currcons].d->vc_cols-1-nr);
attr = oldattr;
}
}
static int softcursor_original;
-static void add_softcursor(int currcons)
+static void add_softcursor(struct vc_data *vc)
{
- int i = scr_readw((u16 *) pos);
- u32 type = cursor_type;
+ int i = scr_readw((u16 *) vc->vc_pos);
+ u32 type = vc->vc_cursor_type;
if (! (type & 0x10)) return;
if (softcursor_original != -1) return;
@@ -535,41 +530,43 @@ static void add_softcursor(int currcons)
i ^= ((type) & 0xff00 );
if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000;
if ((type & 0x40) && ((i & 0x700) == ((i & 0x7000) >> 4))) i ^= 0x0700;
- scr_writew(i, (u16 *) pos);
- if (DO_UPDATE)
- sw->con_putc(vc_cons[currcons].d, i, y, x);
+ scr_writew(i, (u16 *) vc->vc_pos);
+ if (DO_UPDATE_VC(vc))
+ vc->vc_sw->con_putc(vc, i, vc->vc_y, vc->vc_x);
}
-static void hide_softcursor(int currcons)
+static void hide_softcursor(struct vc_data *vc)
{
if (softcursor_original != -1) {
- scr_writew(softcursor_original,(u16 *) pos);
- if (DO_UPDATE)
- sw->con_putc(vc_cons[currcons].d, softcursor_original, y, x);
+ scr_writew(softcursor_original, (u16 *)vc->vc_pos);
+ if (DO_UPDATE_VC(vc))
+ vc->vc_sw->con_putc(vc, softcursor_original,
+ vc->vc_y, vc->vc_x);
softcursor_original = -1;
}
}
-static void hide_cursor(int currcons)
+static void hide_cursor(struct vc_data *vc)
{
- if (currcons == sel_cons)
+ if (vc == sel_cons)
clear_selection();
- sw->con_cursor(vc_cons[currcons].d,CM_ERASE);
- hide_softcursor(currcons);
+ vc->vc_sw->con_cursor(vc, CM_ERASE);
+ hide_softcursor(vc);
}
-static void set_cursor(int currcons)
+static void set_cursor(struct vc_data *vc)
{
- if (!IS_FG || console_blanked || vcmode == KD_GRAPHICS)
- return;
- if (deccm) {
- if (currcons == sel_cons)
- clear_selection();
- add_softcursor(currcons);
- if ((cursor_type & 0x0f) != 1)
- sw->con_cursor(vc_cons[currcons].d,CM_DRAW);
- } else
- hide_cursor(currcons);
+ if (!IS_FG_VC(vc) || console_blanked ||
+ vc->vc_vt->vc_mode == KD_GRAPHICS)
+ return;
+ if (vc->vc_deccm) {
+ if (vc == sel_cons)
+ clear_selection();
+ add_softcursor(vc);
+ if ((vc->vc_cursor_type & 0x0f) != 1)
+ vc->vc_sw->con_cursor(vc, CM_DRAW);
+ } else
+ hide_cursor(vc);
}
static void set_origin(int currcons)
@@ -582,7 +579,7 @@ static void set_origin(int currcons)
origin = (unsigned long) screenbuf;
visible_origin = origin;
scr_end = origin + screenbuf_size;
- pos = origin + video_size_row*y + 2*x;
+ pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x;
}
static inline void save_screen(int currcons)
@@ -623,7 +620,7 @@ void redraw_screen(int new_console, int
if (is_switch) {
currcons = fg_console;
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
if (fg_console != new_console) {
struct vc_data **display = vc_cons[new_console].d->vc_display_fg;
old_console = (*display) ? (*display)->vc_num : fg_console;
@@ -640,7 +637,7 @@ void redraw_screen(int new_console, int
}
} else {
currcons = new_console;
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
}
if (redraw) {
@@ -661,9 +658,9 @@ void redraw_screen(int new_console, int
clear_buffer_attributes(currcons);
}
if (update && vcmode != KD_GRAPHICS)
- do_update_region(currcons, origin, screenbuf_size/2);
+ do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2);
}
- set_cursor(currcons);
+ set_cursor(vc_cons[currcons].d);
if (is_switch) {
set_leds();
compute_shiftstate();
@@ -696,13 +693,14 @@ static void visual_init(int currcons, in
vc_cons[currcons].d->vc_uni_pagedir = 0;
hi_font_mask = 0;
complement_mask = 0;
- can_do_color = 0;
+ vc_cons[currcons].d->vc_can_do_color = 0;
sw->con_init(vc_cons[currcons].d, init);
if (!complement_mask)
- complement_mask = can_do_color ? 0x7700 : 0x0800;
+ complement_mask =
+ vc_cons[currcons].d->vc_can_do_color ? 0x7700 : 0x0800;
s_complement_mask = complement_mask;
- video_size_row = video_num_columns<<1;
- screenbuf_size = video_num_lines*video_size_row;
+ vc_cons[currcons].d->vc_size_row = vc_cons[currcons].d->vc_cols<<1;
+ screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row;
}
int vc_allocate(unsigned int currcons) /* return 0 on success */
@@ -730,6 +728,7 @@ int vc_allocate(unsigned int currcons) /
memset((void *)p, 0, structsize);
vc_cons[currcons].d = (struct vc_data *)p;
vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
+ vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(currcons, 1);
if (!*vc_cons[currcons].d->vc_uni_pagedir_loc)
con_set_default_unimap(currcons);
@@ -742,7 +741,7 @@ int vc_allocate(unsigned int currcons) /
}
screenbuf = (unsigned short *) q;
kmalloced = 1;
- vc_init(currcons, video_num_lines, video_num_columns, 1);
+ vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols, 1);
if (!pm_con) {
pm_con = pm_register(PM_SYS_DEV,
@@ -785,21 +784,21 @@ int vc_resize(int currcons, unsigned int
if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW)
return -EINVAL;
- new_cols = (cols ? cols : video_num_columns);
- new_rows = (lines ? lines : video_num_lines);
+ new_cols = (cols ? cols : vc_cons[currcons].d->vc_cols);
+ new_rows = (lines ? lines : vc_cons[currcons].d->vc_rows);
new_row_size = new_cols << 1;
new_screen_size = new_row_size * new_rows;
- if (new_cols == video_num_columns && new_rows == video_num_lines)
+ if (new_cols == vc_cons[currcons].d->vc_cols && new_rows == vc_cons[currcons].d->vc_rows)
return 0;
newscreen = (unsigned short *) kmalloc(new_screen_size, GFP_USER);
if (!newscreen)
return -ENOMEM;
- old_rows = video_num_lines;
- old_cols = video_num_columns;
- old_row_size = video_size_row;
+ old_rows = vc_cons[currcons].d->vc_rows;
+ old_cols = vc_cons[currcons].d->vc_cols;
+ old_row_size = vc_cons[currcons].d->vc_size_row;
old_screen_size = screenbuf_size;
err = resize_screen(currcons, new_cols, new_rows);
@@ -808,9 +807,9 @@ int vc_resize(int currcons, unsigned int
return err;
}
- video_num_lines = new_rows;
- video_num_columns = new_cols;
- video_size_row = new_row_size;
+ vc_cons[currcons].d->vc_rows = new_rows;
+ vc_cons[currcons].d->vc_cols = new_cols;
+ vc_cons[currcons].d->vc_size_row = new_row_size;
screenbuf_size = new_screen_size;
rlth = min(old_row_size, new_row_size);
@@ -841,16 +840,16 @@ int vc_resize(int currcons, unsigned int
/* do part of a reset_terminal() */
top = 0;
- bottom = video_num_lines;
- gotoxy(currcons, x, y);
+ bottom = vc_cons[currcons].d->vc_rows;
+ gotoxy(vc_cons[currcons].d, x, y);
save_cur(currcons);
if (vc_cons[currcons].d->vc_tty) {
struct winsize ws, *cws = &vc_cons[currcons].d->vc_tty->winsize;
memset(&ws, 0, sizeof(ws));
- ws.ws_row = video_num_lines;
- ws.ws_col = video_num_columns;
+ ws.ws_row = vc_cons[currcons].d->vc_rows;
+ ws.ws_col = vc_cons[currcons].d->vc_cols;
ws.ws_ypixel = video_scan_lines;
if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
vc_cons[currcons].d->vc_tty->pgrp > 0)
@@ -913,38 +912,40 @@ int default_blu[] = {0x00,0x00,0x00,0x00
* might also be negative. If the given position is out of
* bounds, the cursor is placed at the nearest margin.
*/
-static void gotoxy(int currcons, int new_x, int new_y)
+static void gotoxy(struct vc_data *vc, int new_x, int new_y)
{
int min_y, max_y;
if (new_x < 0)
- x = 0;
- else
- if (new_x >= video_num_columns)
- x = video_num_columns - 1;
+ vc->vc_x = 0;
+ else {
+ if (new_x >= vc->vc_cols)
+ vc->vc_x = vc->vc_cols - 1;
else
- x = new_x;
- if (decom) {
- min_y = top;
- max_y = bottom;
+ vc->vc_x = new_x;
+ }
+
+ if (vc->vc_decom) {
+ min_y = vc->vc_top;
+ max_y = vc->vc_bottom;
} else {
min_y = 0;
- max_y = video_num_lines;
+ max_y = vc->vc_rows;
}
if (new_y < min_y)
- y = min_y;
+ vc->vc_y = min_y;
else if (new_y >= max_y)
- y = max_y - 1;
+ vc->vc_y = max_y - 1;
else
- y = new_y;
- pos = origin + y*video_size_row + (x<<1);
- need_wrap = 0;
+ vc->vc_y = new_y;
+ vc->vc_pos = vc->vc_origin + vc->vc_y * vc->vc_size_row + (vc->vc_x<<1);
+ vc->vc_need_wrap = 0;
}
/* for absolute user moves, when decom is set */
static void gotoxay(int currcons, int new_x, int new_y)
{
- gotoxy(currcons, new_x, decom ? (top+new_y) : new_y);
+ gotoxy(vc_cons[currcons].d, new_x, decom ? (top+new_y) : new_y);
}
void scrollback(int lines)
@@ -952,7 +953,7 @@ void scrollback(int lines)
int currcons = fg_console;
if (!lines)
- lines = video_num_lines/2;
+ lines = vc_cons[currcons].d->vc_rows/2;
scrolldelta(-lines);
}
@@ -961,7 +962,7 @@ void scrollfront(int lines)
int currcons = fg_console;
if (!lines)
- lines = video_num_lines/2;
+ lines = vc_cons[currcons].d->vc_rows/2;
scrolldelta(lines);
}
@@ -972,9 +973,9 @@ static void lf(int currcons)
*/
if (y+1 == bottom)
scrup(currcons,top,bottom,1);
- else if (y < video_num_lines-1) {
+ else if (y < vc_cons[currcons].d->vc_rows-1) {
y++;
- pos += video_size_row;
+ pos += vc_cons[currcons].d->vc_size_row;
}
need_wrap = 0;
}
@@ -988,7 +989,7 @@ static void ri(int currcons)
scrdown(currcons,top,bottom,1);
else if (y > 0) {
y--;
- pos -= video_size_row;
+ pos -= vc_cons[currcons].d->vc_size_row;
}
need_wrap = 0;
}
@@ -1025,10 +1026,10 @@ static void csi_J(int currcons, int vpar
if (DO_UPDATE) {
/* do in two stages */
sw->con_clear(vc_cons[currcons].d, y, x, 1,
- video_num_columns-x);
+ vc_cons[currcons].d->vc_cols-x);
sw->con_clear(vc_cons[currcons].d, y+1, 0,
- video_num_lines-y-1,
- video_num_columns);
+ vc_cons[currcons].d->vc_rows-y-1,
+ vc_cons[currcons].d->vc_cols);
}
break;
case 1: /* erase from start to cursor */
@@ -1037,18 +1038,18 @@ static void csi_J(int currcons, int vpar
if (DO_UPDATE) {
/* do in two stages */
sw->con_clear(vc_cons[currcons].d, 0, 0, y,
- video_num_columns);
+ vc_cons[currcons].d->vc_cols);
sw->con_clear(vc_cons[currcons].d, y, 0, 1,
x + 1);
}
break;
case 2: /* erase whole display */
- count = video_num_columns * video_num_lines;
+ count = vc_cons[currcons].d->vc_cols * vc_cons[currcons].d->vc_rows;
start = (unsigned short *) origin;
if (DO_UPDATE)
sw->con_clear(vc_cons[currcons].d, 0, 0,
- video_num_lines,
- video_num_columns);
+ vc_cons[currcons].d->vc_rows,
+ vc_cons[currcons].d->vc_cols);
break;
default:
return;
@@ -1064,11 +1065,11 @@ static void csi_K(int currcons, int vpar
switch (vpar) {
case 0: /* erase from cursor to end of line */
- count = video_num_columns-x;
+ count = vc_cons[currcons].d->vc_cols-x;
start = (unsigned short *) pos;
if (DO_UPDATE)
sw->con_clear(vc_cons[currcons].d, y, x, 1,
- video_num_columns-x);
+ vc_cons[currcons].d->vc_cols-x);
break;
case 1: /* erase from start of line to cursor */
start = (unsigned short *) (pos - (x<<1));
@@ -1079,10 +1080,10 @@ static void csi_K(int currcons, int vpar
break;
case 2: /* erase whole line */
start = (unsigned short *) (pos - (x<<1));
- count = video_num_columns;
+ count = vc_cons[currcons].d->vc_cols;
if (DO_UPDATE)
sw->con_clear(vc_cons[currcons].d, y, 0, 1,
- video_num_columns);
+ vc_cons[currcons].d->vc_cols);
break;
default:
return;
@@ -1097,7 +1098,7 @@ static void csi_X(int currcons, int vpar
if (!vpar)
vpar++;
- count = (vpar > video_num_columns-x) ? (video_num_columns-x) : vpar;
+ count = (vpar > vc_cons[currcons].d->vc_cols-x) ? (vc_cons[currcons].d->vc_cols-x) : vpar;
scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count);
if (DO_UPDATE)
@@ -1270,7 +1271,7 @@ static void set_mode(int currcons, int o
case 3: /* 80/132 mode switch unimplemented */
deccolm = on_off;
#if 0
- (void) vc_resize(deccolm ? 132 : 80, video_num_lines);
+ (void) vc_resize(deccolm ? 132 : 80, vc_cons[currcons].d->vc_rows);
/* this alone does not suffice; some user mode
utility has to change the hardware regs */
#endif
@@ -1278,7 +1279,7 @@ static void set_mode(int currcons, int o
case 5: /* Inverted screen on/off */
if (decscnm != on_off) {
decscnm = on_off;
- invert_screen(currcons, 0, screenbuf_size, 0);
+ invert_screen(vc_cons[currcons].d, 0, screenbuf_size, 0);
update_attr(currcons);
}
break;
@@ -1325,14 +1326,16 @@ static void setterm_command(int currcons
{
switch(par[0]) {
case 1: /* set color for underline mode */
- if (can_do_color && par[1] < 16) {
+ if (vc_cons[currcons].d->vc_can_do_color &&
+ par[1] < 16) {
ulcolor = color_table[par[1]];
if (underline)
update_attr(currcons);
}
break;
case 2: /* set color for half intensity mode */
- if (can_do_color && par[1] < 16) {
+ if (vc_cons[currcons].d->vc_can_do_color &&
+ par[1] < 16) {
halfcolor = color_table[par[1]];
if (intensity == 0)
update_attr(currcons);
@@ -1381,8 +1384,8 @@ static void setterm_command(int currcons
/* console_sem is held */
static void csi_at(int currcons, unsigned int nr)
{
- if (nr > video_num_columns - x)
- nr = video_num_columns - x;
+ if (nr > vc_cons[currcons].d->vc_cols - x)
+ nr = vc_cons[currcons].d->vc_cols - x;
else if (!nr)
nr = 1;
insert_char(currcons, nr);
@@ -1391,8 +1394,8 @@ static void csi_at(int currcons, unsigne
/* console_sem is held */
static void csi_L(int currcons, unsigned int nr)
{
- if (nr > video_num_lines - y)
- nr = video_num_lines - y;
+ if (nr > vc_cons[currcons].d->vc_rows - y)
+ nr = vc_cons[currcons].d->vc_rows - y;
else if (!nr)
nr = 1;
scrdown(currcons,y,bottom,nr);
@@ -1402,8 +1405,8 @@ static void csi_L(int currcons, unsigned
/* console_sem is held */
static void csi_P(int currcons, unsigned int nr)
{
- if (nr > video_num_columns - x)
- nr = video_num_columns - x;
+ if (nr > vc_cons[currcons].d->vc_cols - x)
+ nr = vc_cons[currcons].d->vc_cols - x;
else if (!nr)
nr = 1;
delete_char(currcons, nr);
@@ -1412,8 +1415,8 @@ static void csi_P(int currcons, unsigned
/* console_sem is held */
static void csi_M(int currcons, unsigned int nr)
{
- if (nr > video_num_lines - y)
- nr = video_num_lines - y;
+ if (nr > vc_cons[currcons].d->vc_rows - y)
+ nr = vc_cons[currcons].d->vc_rows - y;
else if (!nr)
nr=1;
scrup(currcons,y,bottom,nr);
@@ -1438,7 +1441,7 @@ static void save_cur(int currcons)
/* console_sem is held */
static void restore_cur(int currcons)
{
- gotoxy(currcons,saved_x,saved_y);
+ gotoxy(vc_cons[currcons].d,saved_x,saved_y);
intensity = s_intensity;
underline = s_underline;
blink = s_blink;
@@ -1460,7 +1463,7 @@ enum { ESnormal, ESesc, ESsquare, ESgetp
static void reset_terminal(int currcons, int do_clear)
{
top = 0;
- bottom = video_num_lines;
+ bottom = vc_cons[currcons].d->vc_rows;
vc_state = ESnormal;
ques = 0;
translate = set_translate(LAT1_MAP,currcons);
@@ -1507,7 +1510,7 @@ static void reset_terminal(int currcons,
bell_pitch = DEFAULT_BELL_PITCH;
bell_duration = DEFAULT_BELL_DURATION;
- gotoxy(currcons,0,0);
+ gotoxy(vc_cons[currcons].d, 0, 0);
save_cur(currcons);
if (do_clear)
csi_J(currcons,2);
@@ -1532,7 +1535,7 @@ static void do_con_trol(struct tty_struc
return;
case 9:
pos -= (x << 1);
- while (x < video_num_columns - 1) {
+ while (x < vc_cons[currcons].d->vc_cols - 1) {
x++;
if (tab_stop[x >> 5] & (1 << (x & 31)))
break;
@@ -1719,31 +1722,31 @@ static void do_con_trol(struct tty_struc
switch(c) {
case 'G': case '`':
if (par[0]) par[0]--;
- gotoxy(currcons,par[0],y);
+ gotoxy(vc_cons[currcons].d, par[0], y);
return;
case 'A':
if (!par[0]) par[0]++;
- gotoxy(currcons,x,y-par[0]);
+ gotoxy(vc_cons[currcons].d, x, y-par[0]);
return;
case 'B': case 'e':
if (!par[0]) par[0]++;
- gotoxy(currcons,x,y+par[0]);
+ gotoxy(vc_cons[currcons].d, x, y+par[0]);
return;
case 'C': case 'a':
if (!par[0]) par[0]++;
- gotoxy(currcons,x+par[0],y);
+ gotoxy(vc_cons[currcons].d, x+par[0], y);
return;
case 'D':
if (!par[0]) par[0]++;
- gotoxy(currcons,x-par[0],y);
+ gotoxy(vc_cons[currcons].d, x-par[0], y);
return;
case 'E':
if (!par[0]) par[0]++;
- gotoxy(currcons,0,y+par[0]);
+ gotoxy(vc_cons[currcons].d, 0, y+par[0]);
return;
case 'F':
if (!par[0]) par[0]++;
- gotoxy(currcons,0,y-par[0]);
+ gotoxy(vc_cons[currcons].d, 0, y-par[0]);
return;
case 'd':
if (par[0]) par[0]--;
@@ -1797,10 +1800,10 @@ static void do_con_trol(struct tty_struc
if (!par[0])
par[0]++;
if (!par[1])
- par[1] = video_num_lines;
+ par[1] = vc_cons[currcons].d->vc_rows;
/* Minimum allowed region is 2 lines */
if (par[0] < par[1] &&
- par[1] <= video_num_lines) {
+ par[1] <= vc_cons[currcons].d->vc_rows) {
top=par[0]-1;
bottom=par[1];
gotoxay(currcons,0,0);
@@ -1847,7 +1850,7 @@ static void do_con_trol(struct tty_struc
csi_J(currcons, 2);
video_erase_char =
(video_erase_char & 0xff00) | ' ';
- do_update_region(currcons, origin, screenbuf_size/2);
+ do_update_region(vc_cons[currcons].d, origin, screenbuf_size/2);
}
return;
case ESsetG0:
@@ -1963,7 +1966,7 @@ static int do_con_write(struct tty_struc
/* undraw cursor first */
if (IS_FG)
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
while (!tty->stopped && count) {
int orig = *buf;
@@ -2065,7 +2068,7 @@ static int do_con_write(struct tty_struc
draw_x = x;
draw_from = pos;
}
- if (x == video_num_columns - 1) {
+ if (x == vc_cons[currcons].d->vc_cols - 1) {
need_wrap = decawm;
draw_to = pos+2;
} else {
@@ -2102,7 +2105,7 @@ static void console_callback(void *ignor
if (want_console >= 0) {
if (want_console != fg_console &&
vc_cons_allocated(want_console)) {
- hide_cursor(fg_console);
+ hide_cursor(vc_cons[fg_console].d);
change_console(want_console);
/* we only changed when the console had already
been allocated - a new console is not created
@@ -2176,7 +2179,7 @@ void vt_console_print(struct console *co
/* undraw cursor first */
if (IS_FG)
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
start = (ushort *)pos;
@@ -2209,7 +2212,7 @@ void vt_console_print(struct console *co
}
scr_writew((attr << 8) + c, (unsigned short *) pos);
cnt++;
- if (myx == video_num_columns - 1) {
+ if (myx == vc_cons[currcons].d->vc_cols - 1) {
need_wrap = 1;
continue;
}
@@ -2220,12 +2223,12 @@ void vt_console_print(struct console *co
if (IS_VISIBLE)
sw->con_putcs(vc_cons[currcons].d, start, cnt, y, x);
x += cnt;
- if (x == video_num_columns) {
+ if (x == vc_cons[currcons].d->vc_cols) {
x--;
need_wrap = 1;
}
}
- set_cursor(currcons);
+ set_cursor(vc_cons[currcons].d);
if (!oops_in_progress)
poke_blanked_console();
@@ -2438,7 +2441,7 @@ static void con_flush_chars(struct tty_s
acquire_console_sem();
vt = tty->driver_data;
if (vt)
- set_cursor(vt->vc_num);
+ set_cursor(vc_cons[vt->vc_num].d);
release_console_sem();
}
@@ -2459,8 +2462,8 @@ static int con_open(struct tty_struct *t
vc_cons[currcons].d->vc_tty = tty;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
- tty->winsize.ws_row = video_num_lines;
- tty->winsize.ws_col = video_num_columns;
+ tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
+ tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
}
release_console_sem();
vcs_make_devfs(tty);
@@ -2507,10 +2510,10 @@ static void vc_init(unsigned int currcon
{
int j, k ;
- video_num_columns = cols;
- video_num_lines = rows;
- video_size_row = cols<<1;
- screenbuf_size = video_num_lines * video_size_row;
+ vc_cons[currcons].d->vc_cols = cols;
+ vc_cons[currcons].d->vc_rows = rows;
+ vc_cons[currcons].d->vc_size_row = cols<<1;
+ screenbuf_size = vc_cons[currcons].d->vc_rows * vc_cons[currcons].d->vc_size_row;
set_origin(currcons);
pos = origin;
@@ -2563,22 +2566,23 @@ static int __init con_init(void)
alloc_bootmem(sizeof(struct vc_data));
vt_cons[currcons] = (struct vt_struct *)
alloc_bootmem(sizeof(struct vt_struct));
+ vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(currcons, 1);
screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size);
kmalloced = 0;
- vc_init(currcons, video_num_lines, video_num_columns,
+ vc_init(currcons, vc_cons[currcons].d->vc_rows, vc_cons[currcons].d->vc_cols,
currcons || !sw->con_save_screen);
}
currcons = fg_console = 0;
master_display_fg = vc_cons[currcons].d;
set_origin(currcons);
save_screen(currcons);
- gotoxy(currcons,x,y);
+ gotoxy(vc_cons[currcons].d, x, y);
csi_J(currcons, 0);
update_screen(fg_console);
printk("Console: %s %s %dx%d",
- can_do_color ? "colour" : "mono",
- display_desc, video_num_columns, video_num_lines);
+ vc_cons[currcons].d->vc_can_do_color ? "colour" : "mono",
+ display_desc, vc_cons[currcons].d->vc_cols, vc_cons[currcons].d->vc_rows);
printable = 1;
printk("\n");
@@ -2690,7 +2694,7 @@ int take_over_console(const struct consw
origin = (unsigned long) screenbuf;
visible_origin = origin;
scr_end = origin + screenbuf_size;
- pos = origin + video_size_row*y + 2*x;
+ pos = origin + vc_cons[currcons].d->vc_size_row*y + 2*x;
visual_init(i, 0);
update_attr(i);
@@ -2788,7 +2792,7 @@ void do_blank_screen(int entering_gfx)
/* entering graphics mode? */
if (entering_gfx) {
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
save_screen(currcons);
sw->con_blank(vc_cons[currcons].d, -1, 1);
console_blanked = fg_console + 1;
@@ -2802,7 +2806,7 @@ void do_blank_screen(int entering_gfx)
return;
}
- hide_cursor(currcons);
+ hide_cursor(vc_cons[currcons].d);
del_timer_sync(&console_timer);
blank_timer_expired = 0;
@@ -2859,7 +2863,7 @@ void do_unblank_screen(int leaving_gfx)
if (console_blank_hook)
console_blank_hook(0);
set_palette(currcons);
- set_cursor(fg_console);
+ set_cursor(vc_cons[fg_console].d);
}
/*
@@ -3184,47 +3188,47 @@ int con_font_op(int currcons, struct con
*/
/* used by selection */
-u16 screen_glyph(int currcons, int offset)
+u16 screen_glyph(struct vc_data *vc, int offset)
{
- u16 w = scr_readw(screenpos(currcons, offset, 1));
+ u16 w = scr_readw(screenpos(vc, offset, 1));
u16 c = w & 0xff;
- if (w & hi_font_mask)
+ if (w & vc->vc_hi_font_mask)
c |= 0x100;
return c;
}
/* used by vcs - note the word offset */
-unsigned short *screen_pos(int currcons, int w_offset, int viewed)
+unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
{
- return screenpos(currcons, 2 * w_offset, viewed);
+ return screenpos(vc, 2 * w_offset, viewed);
}
-void getconsxy(int currcons, unsigned char *p)
+void getconsxy(struct vc_data *vc, unsigned char *p)
{
- p[0] = x;
- p[1] = y;
+ p[0] = vc->vc_x;
+ p[1] = vc->vc_y;
}
-void putconsxy(int currcons, unsigned char *p)
+void putconsxy(struct vc_data *vc, unsigned char *p)
{
- gotoxy(currcons, p[0], p[1]);
- set_cursor(currcons);
+ gotoxy(vc, p[0], p[1]);
+ set_cursor(vc);
}
-u16 vcs_scr_readw(int currcons, const u16 *org)
+u16 vcs_scr_readw(struct vc_data *vc, const u16 *org)
{
- if ((unsigned long)org == pos && softcursor_original != -1)
+ if ((unsigned long)org == vc->vc_pos && softcursor_original != -1)
return softcursor_original;
return scr_readw(org);
}
-void vcs_scr_writew(int currcons, u16 val, u16 *org)
+void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org)
{
scr_writew(val, org);
- if ((unsigned long)org == pos) {
+ if ((unsigned long)org == vc->vc_pos) {
softcursor_original = -1;
- add_softcursor(currcons);
+ add_softcursor(vc);
}
}
===== drivers/char/vt_ioctl.c 1.41 vs edited =====
--- 1.41/drivers/char/vt_ioctl.c 2004-09-29 16:40:49 +02:00
+++ edited/drivers/char/vt_ioctl.c 2004-12-31 14:30:35 +01:00
@@ -37,7 +37,7 @@ char vt_dont_switch;
extern struct tty_driver *console_driver;
#define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count)
-#define VT_BUSY(i) (VT_IS_IN_USE(i) || i == fg_console || i == sel_cons)
+#define VT_BUSY(i) (VT_IS_IN_USE(i) || i == fg_console || vc_cons[i].d == sel_cons)
/*
* Console (vt and kd) routines, as defined by USL SVR4 manual, and by
--- 1.7/include/linux/console_struct.h 2004-07-29 18:00:40 +02:00
+++ edited/include/linux/console_struct.h 2004-12-31 14:30:35 +01:00
@@ -9,6 +9,8 @@
* to achieve effects such as fast scrolling by changing the origin.
*/
+struct vt_struct;
+
#define NPAR 16
struct vc_data {
@@ -87,6 +89,7 @@ struct vc_data {
struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */
unsigned long vc_uni_pagedir;
unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */
+ struct vt_struct *vc_vt;
/* additional information is in vt_kern.h */
};
===== include/linux/selection.h 1.4 vs edited =====
--- 1.4/include/linux/selection.h 2004-05-30 22:37:36 +02:00
+++ edited/include/linux/selection.h 2004-12-31 14:38:29 +01:00
@@ -10,7 +10,7 @@
#include <linux/tiocl.h>
#include <linux/vt_buffer.h>
-extern int sel_cons;
+extern struct vc_data *sel_cons;
extern void clear_selection(void);
extern int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty);
@@ -19,11 +19,6 @@ extern int sel_loadlut(char __user *p);
extern int mouse_reporting(void);
extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry);
-#define video_num_columns (vc_cons[currcons].d->vc_cols)
-#define video_num_lines (vc_cons[currcons].d->vc_rows)
-#define video_size_row (vc_cons[currcons].d->vc_size_row)
-#define can_do_color (vc_cons[currcons].d->vc_can_do_color)
-
extern int console_blanked;
extern unsigned char color_table[];
@@ -31,15 +26,15 @@ extern int default_red[];
extern int default_grn[];
extern int default_blu[];
-extern unsigned short *screen_pos(int currcons, int w_offset, int viewed);
-extern u16 screen_glyph(int currcons, int offset);
-extern void complement_pos(int currcons, int offset);
-extern void invert_screen(int currcons, int offset, int count, int shift);
+extern unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed);
+extern u16 screen_glyph(struct vc_data *vc, int offset);
+extern void complement_pos(struct vc_data *vc, int offset);
+extern void invert_screen(struct vc_data *vc, int offset, int count, int shift);
-extern void getconsxy(int currcons, unsigned char *p);
-extern void putconsxy(int currcons, unsigned char *p);
+extern void getconsxy(struct vc_data *vc, unsigned char *p);
+extern void putconsxy(struct vc_data *vc, unsigned char *p);
-extern u16 vcs_scr_readw(int currcons, const u16 *org);
-extern void vcs_scr_writew(int currcons, u16 val, u16 *org);
+extern u16 vcs_scr_readw(struct vc_data *vc, const u16 *org);
+extern void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org);
#endif
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH] cleanup virtual console <-> selection.c interface
2004-12-31 14:34 [PATCH] cleanup virtual console <-> selection.c interface Christoph Hellwig
@ 2005-01-15 3:36 ` Roman Zippel
2005-01-15 19:21 ` Christoph Hellwig
2005-01-15 3:40 ` [PATCH 2/3] remove console_macros.h Roman Zippel
2005-01-15 3:41 ` [PATCH 3/3] merge vt_struct into vc_data Roman Zippel
2 siblings, 1 reply; 12+ messages in thread
From: Roman Zippel @ 2005-01-15 3:36 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: akpm, linux-kernel
Hi,
On Fri, 31 Dec 2004, Christoph Hellwig wrote:
> Pass around pointers instead of indices into a global array between
> various files of the virtual console implementation and stop using
> obsfucting macros that expect certain variables to be in scope.
I should really sent out my own patches faster. :)
I have three patches which take this a bit further and removes these
macros completely and does some other small cleanups. It saves a bit more
than 3KB.
bye, Roman
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] cleanup virtual console <-> selection.c interface
2005-01-15 3:36 ` Roman Zippel
@ 2005-01-15 19:21 ` Christoph Hellwig
0 siblings, 0 replies; 12+ messages in thread
From: Christoph Hellwig @ 2005-01-15 19:21 UTC (permalink / raw)
To: Roman Zippel; +Cc: Christoph Hellwig, akpm, linux-kernel
On Sat, Jan 15, 2005 at 04:36:55AM +0100, Roman Zippel wrote:
> I should really sent out my own patches faster. :)
> I have three patches which take this a bit further and removes these
> macros completely and does some other small cleanups. It saves a bit more
> than 3KB.
I was planning to do that aswell and have a few patches ontop already.
But obviously I don't care which set gets in as long as the mess gets
sorted out.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/3] remove console_macros.h
2004-12-31 14:34 [PATCH] cleanup virtual console <-> selection.c interface Christoph Hellwig
2005-01-15 3:36 ` Roman Zippel
@ 2005-01-15 3:40 ` Roman Zippel
2005-01-21 17:53 ` James Simmons
2005-01-15 3:41 ` [PATCH 3/3] merge vt_struct into vc_data Roman Zippel
2 siblings, 1 reply; 12+ messages in thread
From: Roman Zippel @ 2005-01-15 3:40 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrew Morton, linux-kernel
Hi,
Remove the macros in console_macros.h and so make the structure references
explicit.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
drivers/char/console_macros.h | 71 --
linux-2.6-vc/drivers/char/vt.c | 1035 ++++++++++++++++++++---------------------
2 files changed, 523 insertions(+), 583 deletions(-)
Index: linux-2.6-vc/drivers/char/console_macros.h
===================================================================
--- linux-2.6-vc.orig/drivers/char/console_macros.h 2005-01-14 22:15:55.896858073 +0100
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,71 +0,0 @@
-#define cons_num (vc->vc_num)
-#define video_scan_lines (vc->vc_scan_lines)
-#define sw (vc->vc_sw)
-#define screenbuf (vc->vc_screenbuf)
-#define screenbuf_size (vc->vc_screenbuf_size)
-#define origin (vc->vc_origin)
-#define scr_top (vc->vc_scr_top)
-#define visible_origin (vc->vc_visible_origin)
-#define scr_end (vc->vc_scr_end)
-#define pos (vc->vc_pos)
-#define top (vc->vc_top)
-#define bottom (vc->vc_bottom)
-#define x (vc->vc_x)
-#define y (vc->vc_y)
-#define vc_state (vc->vc_state)
-#define npar (vc->vc_npar)
-#define par (vc->vc_par)
-#define ques (vc->vc_ques)
-#define attr (vc->vc_attr)
-#define saved_x (vc->vc_saved_x)
-#define saved_y (vc->vc_saved_y)
-#define translate (vc->vc_translate)
-#define G0_charset (vc->vc_G0_charset)
-#define G1_charset (vc->vc_G1_charset)
-#define saved_G0 (vc->vc_saved_G0)
-#define saved_G1 (vc->vc_saved_G1)
-#define utf (vc->vc_utf)
-#define utf_count (vc->vc_utf_count)
-#define utf_char (vc->vc_utf_char)
-#define video_erase_char (vc->vc_video_erase_char)
-#define disp_ctrl (vc->vc_disp_ctrl)
-#define toggle_meta (vc->vc_toggle_meta)
-#define decscnm (vc->vc_decscnm)
-#define decom (vc->vc_decom)
-#define decawm (vc->vc_decawm)
-#define deccm (vc->vc_deccm)
-#define decim (vc->vc_decim)
-#define deccolm (vc->vc_deccolm)
-#define need_wrap (vc->vc_need_wrap)
-#define kmalloced (vc->vc_kmalloced)
-#define report_mouse (vc->vc_report_mouse)
-#define color (vc->vc_color)
-#define s_color (vc->vc_s_color)
-#define def_color (vc->vc_def_color)
-#define foreground (color & 0x0f)
-#define background (color & 0xf0)
-#define charset (vc->vc_charset)
-#define s_charset (vc->vc_s_charset)
-#define intensity (vc->vc_intensity)
-#define underline (vc->vc_underline)
-#define blink (vc->vc_blink)
-#define reverse (vc->vc_reverse)
-#define s_intensity (vc->vc_s_intensity)
-#define s_underline (vc->vc_s_underline)
-#define s_blink (vc->vc_s_blink)
-#define s_reverse (vc->vc_s_reverse)
-#define ulcolor (vc->vc_ulcolor)
-#define halfcolor (vc->vc_halfcolor)
-#define tab_stop (vc->vc_tab_stop)
-#define palette (vc->vc_palette)
-#define bell_pitch (vc->vc_bell_pitch)
-#define bell_duration (vc->vc_bell_duration)
-#define cursor_type (vc->vc_cursor_type)
-#define display_fg (vc->vc_display_fg)
-#define complement_mask (vc->vc_complement_mask)
-#define s_complement_mask (vc->vc_s_complement_mask)
-#define hi_font_mask (vc->vc_hi_font_mask)
-
-#define vcmode (vt_cons[vc->vc_num]->vc_mode)
-
-#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct))
Index: linux-2.6-vc/drivers/char/vt.c
===================================================================
--- linux-2.6-vc.orig/drivers/char/vt.c 2005-01-14 22:15:55.894858418 +0100
+++ linux-2.6-vc/drivers/char/vt.c 2005-01-14 22:16:13.448833821 +0100
@@ -98,8 +98,6 @@
#include <asm/system.h>
#include <asm/uaccess.h>
-#include "console_macros.h"
-
const struct consw *conswitchp;
@@ -255,12 +253,12 @@ static void scrup(struct vc_data *vc, un
nr = b - t - 1;
if (b > vc->vc_rows || t >= b || nr < 1)
return;
- if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_UP, nr))
+ if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_UP, nr))
return;
- d = (unsigned short *)(origin + vc->vc_size_row * t);
- s = (unsigned short *)(origin + vc->vc_size_row * (t + nr));
+ d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
+ s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
- scr_memsetw(d + (b - t - nr) * vc->vc_cols, video_erase_char,
+ scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
vc->vc_size_row * nr);
}
@@ -273,12 +271,12 @@ static void scrdown(struct vc_data *vc,
nr = b - t - 1;
if (b > vc->vc_rows || t >= b || nr < 1)
return;
- if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_DOWN, nr))
+ if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_DOWN, nr))
return;
- s = (unsigned short *)(origin + vc->vc_size_row * t);
+ s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
step = vc->vc_cols * nr;
scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
- scr_memsetw(s, video_erase_char, 2*step);
+ scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
}
static void do_update_region(struct vc_data *vc, unsigned long start, int count)
@@ -342,8 +340,8 @@ void update_region(struct vc_data *vc, u
static u8 build_attr(struct vc_data *vc, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse)
{
- if (sw->con_build_attr)
- return sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse);
+ if (vc->vc_sw->con_build_attr)
+ return vc->vc_sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse);
#ifndef VT_BUF_VRAM_ONLY
/*
@@ -357,23 +355,23 @@ static u8 build_attr(struct vc_data *vc,
* Bit 7 : blink
*/
{
- u8 a = color;
+ u8 a = vc->vc_color;
if (!vc->vc_can_do_color)
return _intensity |
(_underline ? 4 : 0) |
(_reverse ? 8 : 0) |
(_blink ? 0x80 : 0);
if (_underline)
- a = (a & 0xf0) | ulcolor;
+ a = (a & 0xf0) | vc->vc_ulcolor;
else if (_intensity == 0)
- a = (a & 0xf0) | halfcolor;
+ a = (a & 0xf0) | vc->vc_ulcolor;
if (_reverse)
a = ((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77);
if (_blink)
a ^= 0x80;
if (_intensity == 2)
a ^= 0x08;
- if (hi_font_mask == 0x100)
+ if (vc->vc_hi_font_mask == 0x100)
a <<= 1;
return a;
}
@@ -384,8 +382,8 @@ static u8 build_attr(struct vc_data *vc,
static void update_attr(struct vc_data *vc)
{
- attr = build_attr(vc, color, intensity, blink, underline, reverse ^ decscnm);
- video_erase_char = (build_attr(vc, color, 1, blink, 0, decscnm) << 8) | ' ';
+ vc->vc_attr = build_attr(vc, vc->vc_color, vc->vc_intensity, vc->vc_blink, vc->vc_underline, vc->vc_reverse ^ vc->vc_decscnm);
+ vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm) << 8) | ' ';
}
/* Note: inverting the screen twice should revert to the original state */
@@ -465,44 +463,44 @@ void complement_pos(struct vc_data *vc,
static void insert_char(struct vc_data *vc, unsigned int nr)
{
- unsigned short *p, *q = (unsigned short *) pos;
+ unsigned short *p, *q = (unsigned short *)vc->vc_pos;
- p = q + vc->vc_cols - nr - x;
+ p = q + vc->vc_cols - nr - vc->vc_x;
while (--p >= q)
scr_writew(scr_readw(p), p + nr);
- scr_memsetw(q, video_erase_char, nr*2);
- need_wrap = 0;
+ scr_memsetw(q, vc->vc_video_erase_char, nr * 2);
+ vc->vc_need_wrap = 0;
if (DO_UPDATE(vc)) {
- unsigned short oldattr = attr;
- sw->con_bmove(vc, y, x, y, x + nr, 1,
- vc->vc_cols - x - nr);
- attr = video_erase_char >> 8;
+ unsigned short oldattr = vc->vc_attr;
+ vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x, vc->vc_y, vc->vc_x + nr, 1,
+ vc->vc_cols - vc->vc_x - nr);
+ vc->vc_attr = vc->vc_video_erase_char >> 8;
while (nr--)
- sw->con_putc(vc, video_erase_char, y, x + nr);
- attr = oldattr;
+ vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, vc->vc_x + nr);
+ vc->vc_attr = oldattr;
}
}
static void delete_char(struct vc_data *vc, unsigned int nr)
{
- unsigned int i = x;
- unsigned short *p = (unsigned short *) pos;
+ unsigned int i = vc->vc_x;
+ unsigned short *p = (unsigned short *)vc->vc_pos;
while (++i <= vc->vc_cols - nr) {
scr_writew(scr_readw(p+nr), p);
p++;
}
- scr_memsetw(p, video_erase_char, nr*2);
- need_wrap = 0;
+ scr_memsetw(p, vc->vc_video_erase_char, nr * 2);
+ vc->vc_need_wrap = 0;
if (DO_UPDATE(vc)) {
- unsigned short oldattr = attr;
- sw->con_bmove(vc, y, x + nr, y, x, 1,
- vc->vc_cols - x - nr);
- attr = video_erase_char >> 8;
+ unsigned short oldattr = vc->vc_attr;
+ vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x + nr, vc->vc_y, vc->vc_x, 1,
+ vc->vc_cols - vc->vc_x - nr);
+ vc->vc_attr = vc->vc_video_erase_char >> 8;
while (nr--)
- sw->con_putc(vc, video_erase_char, y,
+ vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y,
vc->vc_cols - 1 - nr);
- attr = oldattr;
+ vc->vc_attr = oldattr;
}
}
@@ -564,20 +562,20 @@ static void set_origin(struct vc_data *v
WARN_CONSOLE_UNLOCKED();
if (!CON_IS_VISIBLE(vc) ||
- !sw->con_set_origin ||
- !sw->con_set_origin(vc))
- origin = (unsigned long) screenbuf;
- visible_origin = origin;
- scr_end = origin + screenbuf_size;
- pos = origin + vc->vc_size_row * y + 2 * x;
+ !vc->vc_sw->con_set_origin ||
+ !vc->vc_sw->con_set_origin(vc))
+ vc->vc_origin = (unsigned long)vc->vc_screenbuf;
+ vc->vc_visible_origin = vc->vc_origin;
+ vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size;
+ vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x;
}
static inline void save_screen(struct vc_data *vc)
{
WARN_CONSOLE_UNLOCKED();
- if (sw->con_save_screen)
- sw->con_save_screen(vc);
+ if (vc->vc_sw->con_save_screen)
+ vc->vc_sw->con_save_screen(vc);
}
/*
@@ -586,12 +584,12 @@ static inline void save_screen(struct vc
static void clear_buffer_attributes(struct vc_data *vc)
{
- unsigned short *p = (unsigned short *) origin;
- int count = screenbuf_size/2;
- int mask = hi_font_mask | 0xff;
+ unsigned short *p = (unsigned short *)vc->vc_origin;
+ int count = vc->vc_screenbuf_size / 2;
+ int mask = vc->vc_hi_font_mask | 0xff;
for (; count > 0; count--, p++) {
- scr_writew((scr_readw(p)&mask) | (video_erase_char&~mask), p);
+ scr_writew((scr_readw(p)&mask) | (vc->vc_video_erase_char & ~mask), p);
}
}
@@ -630,7 +628,7 @@ void redraw_screen(struct vc_data *vc, i
int old_was_color = vc->vc_can_do_color;
set_origin(vc);
- update = sw->con_switch(vc);
+ update = vc->vc_sw->con_switch(vc);
set_palette(vc);
/*
* If console changed from mono<->color, the best we can do
@@ -642,8 +640,8 @@ void redraw_screen(struct vc_data *vc, i
update_attr(vc);
clear_buffer_attributes(vc);
}
- if (update && vcmode != KD_GRAPHICS)
- do_update_region(vc, origin, screenbuf_size / 2);
+ if (update && vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
+ do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
}
set_cursor(vc);
if (is_switch) {
@@ -663,28 +661,28 @@ int vc_cons_allocated(unsigned int i)
static void visual_init(struct vc_data *vc, int num, int init)
{
- /* ++Geert: sw->con_init determines console size */
- if (sw)
- module_put(sw->owner);
- sw = conswitchp;
+ /* ++Geert: vc->vc_sw->con_init determines console size */
+ if (vc->vc_sw)
+ module_put(vc->vc_sw->owner);
+ vc->vc_sw = conswitchp;
#ifndef VT_SINGLE_DRIVER
if (con_driver_map[num])
- sw = con_driver_map[num];
+ vc->vc_sw = con_driver_map[num];
#endif
- __module_get(sw->owner);
+ __module_get(vc->vc_sw->owner);
vc->vc_num = num;
- display_fg = &master_display_fg;
+ vc->vc_display_fg = &master_display_fg;
vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir;
vc->vc_uni_pagedir = 0;
- hi_font_mask = 0;
- complement_mask = 0;
+ vc->vc_hi_font_mask = 0;
+ vc->vc_complement_mask = 0;
vc->vc_can_do_color = 0;
- sw->con_init(vc, init);
- if (!complement_mask)
- complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
- s_complement_mask = complement_mask;
+ vc->vc_sw->con_init(vc, init);
+ if (!vc->vc_complement_mask)
+ vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
+ vc->vc_s_complement_mask = vc->vc_complement_mask;
vc->vc_size_row = vc->vc_cols << 1;
- screenbuf_size = vc->vc_rows * vc->vc_size_row;
+ vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row;
}
int vc_allocate(unsigned int currcons) /* return 0 on success */
@@ -707,25 +705,25 @@ int vc_allocate(unsigned int currcons) /
/* although the numbers above are not valid since long ago, the
point is still up-to-date and the comment still has its value
even if only as a historical artifact. --mj, July 1998 */
- p = (long) kmalloc(structsize, GFP_KERNEL);
+ p = (long) kmalloc(sizeof(struct vc_data) + sizeof(struct vt_struct), GFP_KERNEL);
if (!p)
return -ENOMEM;
- memset((void *)p, 0, structsize);
+ memset((void *)p, 0, sizeof(struct vc_data) + sizeof(struct vt_struct));
vc_cons[currcons].d = vc = (struct vc_data *)p;
vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(vc, currcons, 1);
if (!*vc->vc_uni_pagedir_loc)
con_set_default_unimap(vc);
- q = (long)kmalloc(screenbuf_size, GFP_KERNEL);
+ q = (long)kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
if (!q) {
kfree((char *) p);
vc_cons[currcons].d = NULL;
vt_cons[currcons] = NULL;
return -ENOMEM;
}
- screenbuf = (unsigned short *) q;
- kmalloced = 1;
+ vc->vc_screenbuf = (unsigned short *)q;
+ vc->vc_kmalloced = 1;
vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
if (!pm_con) {
@@ -742,8 +740,8 @@ inline int resize_screen(struct vc_data
/* Resizes the resolution of the display adapater */
int err = 0;
- if (vcmode != KD_GRAPHICS && sw->con_resize)
- err = sw->con_resize(vc, width, height);
+ if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
+ err = vc->vc_sw->con_resize(vc, width, height);
return err;
}
@@ -784,7 +782,7 @@ int vc_resize(struct vc_data *vc, unsign
old_rows = vc->vc_rows;
old_cols = vc->vc_cols;
old_row_size = vc->vc_size_row;
- old_screen_size = screenbuf_size;
+ old_screen_size = vc->vc_screenbuf_size;
err = resize_screen(vc, new_cols, new_rows);
if (err) {
@@ -795,11 +793,11 @@ int vc_resize(struct vc_data *vc, unsign
vc->vc_rows = new_rows;
vc->vc_cols = new_cols;
vc->vc_size_row = new_row_size;
- screenbuf_size = new_screen_size;
+ vc->vc_screenbuf_size = new_screen_size;
rlth = min(old_row_size, new_row_size);
rrem = new_row_size - rlth;
- old_origin = origin;
+ old_origin = vc->vc_origin;
new_origin = (long) newscreen;
new_scr_end = new_origin + new_screen_size;
if (new_rows < old_rows)
@@ -807,26 +805,26 @@ int vc_resize(struct vc_data *vc, unsign
update_attr(vc);
- while (old_origin < scr_end) {
+ while (old_origin < vc->vc_scr_end) {
scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth);
if (rrem)
- scr_memsetw((void *)(new_origin + rlth), video_erase_char, rrem);
+ scr_memsetw((void *)(new_origin + rlth), vc->vc_video_erase_char, rrem);
old_origin += old_row_size;
new_origin += new_row_size;
}
if (new_scr_end > new_origin)
- scr_memsetw((void *) new_origin, video_erase_char, new_scr_end - new_origin);
- if (kmalloced)
- kfree(screenbuf);
- screenbuf = newscreen;
- kmalloced = 1;
- screenbuf_size = new_screen_size;
+ scr_memsetw((void *)new_origin, vc->vc_video_erase_char, new_scr_end - new_origin);
+ if (vc->vc_kmalloced)
+ kfree(vc->vc_screenbuf);
+ vc->vc_screenbuf = newscreen;
+ vc->vc_kmalloced = 1;
+ vc->vc_screenbuf_size = new_screen_size;
set_origin(vc);
/* do part of a reset_terminal() */
- top = 0;
- bottom = vc->vc_rows;
- gotoxy(vc, x, y);
+ vc->vc_top = 0;
+ vc->vc_bottom = vc->vc_rows;
+ gotoxy(vc, vc->vc_x, vc->vc_y);
save_cur(vc);
if (vc->vc_tty) {
@@ -835,7 +833,7 @@ int vc_resize(struct vc_data *vc, unsign
memset(&ws, 0, sizeof(ws));
ws.ws_row = vc->vc_rows;
ws.ws_col = vc->vc_cols;
- ws.ws_ypixel = video_scan_lines;
+ ws.ws_ypixel = vc->vc_scan_lines;
if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
vc->vc_tty->pgrp > 0)
kill_pg(vc->vc_tty->pgrp, SIGWINCH, 1);
@@ -854,9 +852,9 @@ void vc_disallocate(unsigned int currcon
if (vc_cons_allocated(currcons)) {
struct vc_data *vc = vc_cons[currcons].d;
- sw->con_deinit(vc);
- if (kmalloced)
- kfree(screenbuf);
+ vc->vc_sw->con_deinit(vc);
+ if (vc->vc_kmalloced)
+ kfree(vc->vc_screenbuf);
if (currcons >= MIN_NR_CONSOLES)
kfree(vc);
vc_cons[currcons].d = NULL;
@@ -931,7 +929,7 @@ static void gotoxy(struct vc_data *vc, i
/* for absolute user moves, when decom is set */
static void gotoxay(struct vc_data *vc, int new_x, int new_y)
{
- gotoxy(vc, new_x, decom ? (top+new_y) : new_y);
+ gotoxy(vc, new_x, vc->vc_decom ? (vc->vc_top + new_y) : new_y);
}
void scrollback(struct vc_data *vc, int lines)
@@ -953,13 +951,13 @@ static void lf(struct vc_data *vc)
/* don't scroll if above bottom of scrolling region, or
* if below scrolling region
*/
- if (y+1 == bottom)
- scrup(vc, top, bottom, 1);
- else if (y < vc->vc_rows - 1) {
- y++;
- pos += vc->vc_size_row;
+ if (vc->vc_y + 1 == vc->vc_bottom)
+ scrup(vc, vc->vc_top, vc->vc_bottom, 1);
+ else if (vc->vc_y < vc->vc_rows - 1) {
+ vc->vc_y++;
+ vc->vc_pos += vc->vc_size_row;
}
- need_wrap = 0;
+ vc->vc_need_wrap = 0;
}
static void ri(struct vc_data *vc)
@@ -967,27 +965,27 @@ static void ri(struct vc_data *vc)
/* don't scroll if below top of scrolling region, or
* if above scrolling region
*/
- if (y == top)
- scrdown(vc, top, bottom, 1);
- else if (y > 0) {
- y--;
- pos -= vc->vc_size_row;
+ if (vc->vc_y == vc->vc_top)
+ scrdown(vc, vc->vc_top, vc->vc_bottom, 1);
+ else if (vc->vc_y > 0) {
+ vc->vc_y--;
+ vc->vc_pos -= vc->vc_size_row;
}
- need_wrap = 0;
+ vc->vc_need_wrap = 0;
}
static inline void cr(struct vc_data *vc)
{
- pos -= x<<1;
- need_wrap = x = 0;
+ vc->vc_pos -= vc->vc_x << 1;
+ vc->vc_need_wrap = vc->vc_x = 0;
}
static inline void bs(struct vc_data *vc)
{
- if (x) {
- pos -= 2;
- x--;
- need_wrap = 0;
+ if (vc->vc_x) {
+ vc->vc_pos -= 2;
+ vc->vc_x--;
+ vc->vc_need_wrap = 0;
}
}
@@ -1003,41 +1001,41 @@ static void csi_J(struct vc_data *vc, in
switch (vpar) {
case 0: /* erase from cursor to end of display */
- count = (scr_end-pos)>>1;
- start = (unsigned short *) pos;
+ count = (vc->vc_scr_end - vc->vc_pos) >> 1;
+ start = (unsigned short *)vc->vc_pos;
if (DO_UPDATE(vc)) {
/* do in two stages */
- sw->con_clear(vc, y, x, 1,
- vc->vc_cols - x);
- sw->con_clear(vc, y + 1, 0,
- vc->vc_rows - y - 1,
+ vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
+ vc->vc_cols - vc->vc_x);
+ vc->vc_sw->con_clear(vc, vc->vc_y + 1, 0,
+ vc->vc_rows - vc->vc_y - 1,
vc->vc_cols);
}
break;
case 1: /* erase from start to cursor */
- count = ((pos-origin)>>1)+1;
- start = (unsigned short *) origin;
+ count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1;
+ start = (unsigned short *)vc->vc_origin;
if (DO_UPDATE(vc)) {
/* do in two stages */
- sw->con_clear(vc, 0, 0, y,
+ vc->vc_sw->con_clear(vc, 0, 0, vc->vc_y,
vc->vc_cols);
- sw->con_clear(vc, y, 0, 1,
- x + 1);
+ vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
+ vc->vc_x + 1);
}
break;
case 2: /* erase whole display */
count = vc->vc_cols * vc->vc_rows;
- start = (unsigned short *) origin;
+ start = (unsigned short *)vc->vc_origin;
if (DO_UPDATE(vc))
- sw->con_clear(vc, 0, 0,
+ vc->vc_sw->con_clear(vc, 0, 0,
vc->vc_rows,
vc->vc_cols);
break;
default:
return;
}
- scr_memsetw(start, video_erase_char, 2*count);
- need_wrap = 0;
+ scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
+ vc->vc_need_wrap = 0;
}
static void csi_K(struct vc_data *vc, int vpar)
@@ -1047,31 +1045,31 @@ static void csi_K(struct vc_data *vc, in
switch (vpar) {
case 0: /* erase from cursor to end of line */
- count = vc->vc_cols - x;
- start = (unsigned short *) pos;
+ count = vc->vc_cols - vc->vc_x;
+ start = (unsigned short *)vc->vc_pos;
if (DO_UPDATE(vc))
- sw->con_clear(vc, y, x, 1,
- vc->vc_cols - x);
+ vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
+ vc->vc_cols - vc->vc_x);
break;
case 1: /* erase from start of line to cursor */
- start = (unsigned short *) (pos - (x<<1));
- count = x+1;
+ start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
+ count = vc->vc_x + 1;
if (DO_UPDATE(vc))
- sw->con_clear(vc, y, 0, 1,
- x + 1);
+ vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
+ vc->vc_x + 1);
break;
case 2: /* erase whole line */
- start = (unsigned short *) (pos - (x<<1));
+ start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
count = vc->vc_cols;
if (DO_UPDATE(vc))
- sw->con_clear(vc, y, 0, 1,
+ vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
vc->vc_cols);
break;
default:
return;
}
- scr_memsetw(start, video_erase_char, 2 * count);
- need_wrap = 0;
+ scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
+ vc->vc_need_wrap = 0;
}
static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */
@@ -1080,21 +1078,21 @@ static void csi_X(struct vc_data *vc, in
if (!vpar)
vpar++;
- count = (vpar > vc->vc_cols - x) ? (vc->vc_cols - x) : vpar;
+ count = (vpar > vc->vc_cols - vc->vc_x) ? (vc->vc_cols - vc->vc_x) : vpar;
- scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count);
+ scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * count);
if (DO_UPDATE(vc))
- sw->con_clear(vc, y, x, 1, count);
- need_wrap = 0;
+ vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, count);
+ vc->vc_need_wrap = 0;
}
static void default_attr(struct vc_data *vc)
{
- intensity = 1;
- underline = 0;
- reverse = 0;
- blink = 0;
- color = def_color;
+ vc->vc_intensity = 1;
+ vc->vc_underline = 0;
+ vc->vc_reverse = 0;
+ vc->vc_blink = 0;
+ vc->vc_color = vc->vc_def_color;
}
/* console_sem is held */
@@ -1102,92 +1100,92 @@ static void csi_m(struct vc_data *vc)
{
int i;
- for (i=0;i<=npar;i++)
- switch (par[i]) {
+ for (i = 0; i <= vc->vc_npar; i++)
+ switch (vc->vc_par[i]) {
case 0: /* all attributes off */
default_attr(vc);
break;
case 1:
- intensity = 2;
+ vc->vc_intensity = 2;
break;
case 2:
- intensity = 0;
+ vc->vc_intensity = 0;
break;
case 4:
- underline = 1;
+ vc->vc_underline = 1;
break;
case 5:
- blink = 1;
+ vc->vc_blink = 1;
break;
case 7:
- reverse = 1;
+ vc->vc_reverse = 1;
break;
case 10: /* ANSI X3.64-1979 (SCO-ish?)
* Select primary font, don't display
* control chars if defined, don't set
* bit 8 on output.
*/
- translate = set_translate(charset == 0
- ? G0_charset
- : G1_charset, vc);
- disp_ctrl = 0;
- toggle_meta = 0;
+ vc->vc_translate = set_translate(vc->vc_charset == 0
+ ? vc->vc_G0_charset
+ : vc->vc_G1_charset, vc);
+ vc->vc_disp_ctrl = 0;
+ vc->vc_toggle_meta = 0;
break;
case 11: /* ANSI X3.64-1979 (SCO-ish?)
* Select first alternate font, lets
* chars < 32 be displayed as ROM chars.
*/
- translate = set_translate(IBMPC_MAP, vc);
- disp_ctrl = 1;
- toggle_meta = 0;
+ vc->vc_translate = set_translate(IBMPC_MAP, vc);
+ vc->vc_disp_ctrl = 1;
+ vc->vc_toggle_meta = 0;
break;
case 12: /* ANSI X3.64-1979 (SCO-ish?)
* Select second alternate font, toggle
* high bit before displaying as ROM char.
*/
- translate = set_translate(IBMPC_MAP, vc);
- disp_ctrl = 1;
- toggle_meta = 1;
+ vc->vc_translate = set_translate(IBMPC_MAP, vc);
+ vc->vc_disp_ctrl = 1;
+ vc->vc_toggle_meta = 1;
break;
case 21:
case 22:
- intensity = 1;
+ vc->vc_intensity = 1;
break;
case 24:
- underline = 0;
+ vc->vc_underline = 0;
break;
case 25:
- blink = 0;
+ vc->vc_blink = 0;
break;
case 27:
- reverse = 0;
+ vc->vc_reverse = 0;
break;
case 38: /* ANSI X3.64-1979 (SCO-ish?)
* Enables underscore, white foreground
* with white underscore (Linux - use
* default foreground).
*/
- color = (def_color & 0x0f) | background;
- underline = 1;
+ vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
+ vc->vc_underline = 1;
break;
case 39: /* ANSI X3.64-1979 (SCO-ish?)
* Disable underline option.
* Reset colour to default? It did this
* before...
*/
- color = (def_color & 0x0f) | background;
- underline = 0;
+ vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
+ vc->vc_underline = 0;
break;
case 49:
- color = (def_color & 0xf0) | foreground;
+ vc->vc_color = (vc->vc_def_color & 0xf0) | (vc->vc_color & 0x0f);
break;
default:
- if (par[i] >= 30 && par[i] <= 37)
- color = color_table[par[i]-30]
- | background;
- else if (par[i] >= 40 && par[i] <= 47)
- color = (color_table[par[i]-40]<<4)
- | foreground;
+ if (vc->vc_par[i] >= 30 && vc->vc_par[i] <= 37)
+ vc->vc_color = color_table[vc->vc_par[i] - 30]
+ | (vc->vc_color & 0xf0);
+ else if (vc->vc_par[i] >= 40 && vc->vc_par[i] <= 47)
+ vc->vc_color = (color_table[vc->vc_par[i] - 40] << 4)
+ | (vc->vc_color & 0x0f);
break;
}
update_attr(vc);
@@ -1206,7 +1204,7 @@ static void cursor_report(struct vc_data
{
char buf[40];
- sprintf(buf, "\033[%d;%dR", y + (decom ? top+1 : 1), x+1);
+ sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1);
respond_string(buf, tty);
}
@@ -1232,9 +1230,7 @@ void mouse_report(struct tty_struct *tty
/* invoked via ioctl(TIOCLINUX) and through set_selection */
int mouse_reporting(void)
{
- struct vc_data *vc = vc_cons[fg_console].d;
-
- return report_mouse;
+ return vc_cons[fg_console].d->vc_report_mouse;
}
/* console_sem is held */
@@ -1242,8 +1238,9 @@ static void set_mode(struct vc_data *vc,
{
int i;
- for (i=0; i<=npar; i++)
- if (ques) switch(par[i]) { /* DEC private modes set/reset */
+ for (i = 0; i <= vc->vc_npar; i++)
+ if (vc->vc_ques) {
+ switch(vc->vc_par[i]) { /* DEC private modes set/reset */
case 1: /* Cursor keys send ^[Ox/^[[x */
if (on_off)
set_kbd(vc, decckm);
@@ -1251,7 +1248,7 @@ static void set_mode(struct vc_data *vc,
clr_kbd(vc, decckm);
break;
case 3: /* 80/132 mode switch unimplemented */
- deccolm = on_off;
+ vc->vc_deccolm = on_off;
#if 0
vc_resize(deccolm ? 132 : 80, vc->vc_rows);
/* this alone does not suffice; some user mode
@@ -1259,18 +1256,18 @@ static void set_mode(struct vc_data *vc,
#endif
break;
case 5: /* Inverted screen on/off */
- if (decscnm != on_off) {
- decscnm = on_off;
- invert_screen(vc, 0, screenbuf_size, 0);
+ if (vc->vc_decscnm != on_off) {
+ vc->vc_decscnm = on_off;
+ invert_screen(vc, 0, vc->vc_screenbuf_size, 0);
update_attr(vc);
}
break;
case 6: /* Origin relative/absolute */
- decom = on_off;
+ vc->vc_decom = on_off;
gotoxay(vc, 0, 0);
break;
case 7: /* Autowrap on/off */
- decawm = on_off;
+ vc->vc_decawm = on_off;
break;
case 8: /* Autorepeat on/off */
if (on_off)
@@ -1279,20 +1276,22 @@ static void set_mode(struct vc_data *vc,
clr_kbd(vc, decarm);
break;
case 9:
- report_mouse = on_off ? 1 : 0;
+ vc->vc_report_mouse = on_off ? 1 : 0;
break;
case 25: /* Cursor on/off */
- deccm = on_off;
+ vc->vc_deccm = on_off;
break;
case 1000:
- report_mouse = on_off ? 2 : 0;
+ vc->vc_report_mouse = on_off ? 2 : 0;
break;
- } else switch(par[i]) { /* ANSI modes set/reset */
+ }
+ } else {
+ switch(vc->vc_par[i]) { /* ANSI modes set/reset */
case 3: /* Monitor (display ctrls) */
- disp_ctrl = on_off;
+ vc->vc_disp_ctrl = on_off;
break;
case 4: /* Insert Mode on/off */
- decim = on_off;
+ vc->vc_decim = on_off;
break;
case 20: /* Lf, Enter == CrLf/Lf */
if (on_off)
@@ -1300,62 +1299,63 @@ static void set_mode(struct vc_data *vc,
else
clr_kbd(vc, lnm);
break;
+ }
}
}
/* console_sem is held */
static void setterm_command(struct vc_data *vc)
{
- switch(par[0]) {
+ switch(vc->vc_par[0]) {
case 1: /* set color for underline mode */
if (vc->vc_can_do_color &&
- par[1] < 16) {
- ulcolor = color_table[par[1]];
- if (underline)
+ vc->vc_par[1] < 16) {
+ vc->vc_ulcolor = color_table[vc->vc_par[1]];
+ if (vc->vc_underline)
update_attr(vc);
}
break;
case 2: /* set color for half intensity mode */
if (vc->vc_can_do_color &&
- par[1] < 16) {
- halfcolor = color_table[par[1]];
- if (intensity == 0)
+ vc->vc_par[1] < 16) {
+ vc->vc_halfcolor = color_table[vc->vc_par[1]];
+ if (vc->vc_intensity == 0)
update_attr(vc);
}
break;
case 8: /* store colors as defaults */
- def_color = attr;
- if (hi_font_mask == 0x100)
- def_color >>= 1;
+ vc->vc_def_color = vc->vc_attr;
+ if (vc->vc_hi_font_mask == 0x100)
+ vc->vc_def_color >>= 1;
default_attr(vc);
update_attr(vc);
break;
case 9: /* set blanking interval */
- blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
+ blankinterval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ;
poke_blanked_console();
break;
case 10: /* set bell frequency in Hz */
- if (npar >= 1)
- bell_pitch = par[1];
+ if (vc->vc_npar >= 1)
+ vc->vc_bell_pitch = vc->vc_par[1];
else
- bell_pitch = DEFAULT_BELL_PITCH;
+ vc->vc_bell_pitch = DEFAULT_BELL_PITCH;
break;
case 11: /* set bell duration in msec */
- if (npar >= 1)
- bell_duration = (par[1] < 2000) ?
- par[1]*HZ/1000 : 0;
+ if (vc->vc_npar >= 1)
+ vc->vc_bell_duration = (vc->vc_par[1] < 2000) ?
+ vc->vc_par[1] * HZ / 1000 : 0;
else
- bell_duration = DEFAULT_BELL_DURATION;
+ vc->vc_bell_duration = DEFAULT_BELL_DURATION;
break;
case 12: /* bring specified console to the front */
- if (par[1] >= 1 && vc_cons_allocated(par[1]-1))
- set_console(par[1] - 1);
+ if (vc->vc_par[1] >= 1 && vc_cons_allocated(vc->vc_par[1] - 1))
+ set_console(vc->vc_par[1] - 1);
break;
case 13: /* unblank the screen */
poke_blanked_console();
break;
case 14: /* set vesa powerdown interval */
- vesa_off_interval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
+ vesa_off_interval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ;
break;
case 15: /* activate the previous console */
set_console(last_console);
@@ -1366,8 +1366,8 @@ static void setterm_command(struct vc_da
/* console_sem is held */
static void csi_at(struct vc_data *vc, unsigned int nr)
{
- if (nr > vc->vc_cols - x)
- nr = vc->vc_cols - x;
+ if (nr > vc->vc_cols - vc->vc_x)
+ nr = vc->vc_cols - vc->vc_x;
else if (!nr)
nr = 1;
insert_char(vc, nr);
@@ -1376,19 +1376,19 @@ static void csi_at(struct vc_data *vc, u
/* console_sem is held */
static void csi_L(struct vc_data *vc, unsigned int nr)
{
- if (nr > vc->vc_rows - y)
- nr = vc->vc_rows - y;
+ if (nr > vc->vc_rows - vc->vc_y)
+ nr = vc->vc_rows - vc->vc_y;
else if (!nr)
nr = 1;
- scrdown(vc, y, bottom, nr);
- need_wrap = 0;
+ scrdown(vc, vc->vc_y, vc->vc_bottom, nr);
+ vc->vc_need_wrap = 0;
}
/* console_sem is held */
static void csi_P(struct vc_data *vc, unsigned int nr)
{
- if (nr > vc->vc_cols - x)
- nr = vc->vc_cols - x;
+ if (nr > vc->vc_cols - vc->vc_x)
+ nr = vc->vc_cols - vc->vc_x;
else if (!nr)
nr = 1;
delete_char(vc, nr);
@@ -1397,44 +1397,44 @@ static void csi_P(struct vc_data *vc, un
/* console_sem is held */
static void csi_M(struct vc_data *vc, unsigned int nr)
{
- if (nr > vc->vc_rows - y)
- nr = vc->vc_rows - y;
+ if (nr > vc->vc_rows - vc->vc_y)
+ nr = vc->vc_rows - vc->vc_y;
else if (!nr)
nr=1;
- scrup(vc, y, bottom, nr);
- need_wrap = 0;
+ scrup(vc, vc->vc_y, vc->vc_bottom, nr);
+ vc->vc_need_wrap = 0;
}
/* console_sem is held (except via vc_init->reset_terminal */
static void save_cur(struct vc_data *vc)
{
- saved_x = x;
- saved_y = y;
- s_intensity = intensity;
- s_underline = underline;
- s_blink = blink;
- s_reverse = reverse;
- s_charset = charset;
- s_color = color;
- saved_G0 = G0_charset;
- saved_G1 = G1_charset;
+ vc->vc_saved_x = vc->vc_x;
+ vc->vc_saved_y = vc->vc_y;
+ vc->vc_s_intensity = vc->vc_intensity;
+ vc->vc_s_underline = vc->vc_underline;
+ vc->vc_s_blink = vc->vc_blink;
+ vc->vc_s_reverse = vc->vc_reverse;
+ vc->vc_s_charset = vc->vc_charset;
+ vc->vc_s_color = vc->vc_color;
+ vc->vc_saved_G0 = vc->vc_G0_charset;
+ vc->vc_saved_G1 = vc->vc_G1_charset;
}
/* console_sem is held */
static void restore_cur(struct vc_data *vc)
{
- gotoxy(vc, saved_x, saved_y);
- intensity = s_intensity;
- underline = s_underline;
- blink = s_blink;
- reverse = s_reverse;
- charset = s_charset;
- color = s_color;
- G0_charset = saved_G0;
- G1_charset = saved_G1;
- translate = set_translate(charset ? G1_charset : G0_charset, vc);
+ gotoxy(vc, vc->vc_saved_x, vc->vc_saved_y);
+ vc->vc_intensity = vc->vc_s_intensity;
+ vc->vc_underline = vc->vc_s_underline;
+ vc->vc_blink = vc->vc_s_blink;
+ vc->vc_reverse = vc->vc_s_reverse;
+ vc->vc_charset = vc->vc_s_charset;
+ vc->vc_color = vc->vc_s_color;
+ vc->vc_G0_charset = vc->vc_saved_G0;
+ vc->vc_G1_charset = vc->vc_saved_G1;
+ vc->vc_translate = set_translate(vc->vc_charset ? vc->vc_G1_charset : vc->vc_G0_charset, vc);
update_attr(vc);
- need_wrap = 0;
+ vc->vc_need_wrap = 0;
}
enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
@@ -1444,27 +1444,27 @@ enum { ESnormal, ESesc, ESsquare, ESgetp
/* console_sem is held (except via vc_init()) */
static void reset_terminal(struct vc_data *vc, int do_clear)
{
- top = 0;
- bottom = vc->vc_rows;
- vc_state = ESnormal;
- ques = 0;
- translate = set_translate(LAT1_MAP, vc);
- G0_charset = LAT1_MAP;
- G1_charset = GRAF_MAP;
- charset = 0;
- need_wrap = 0;
- report_mouse = 0;
- utf = 0;
- utf_count = 0;
-
- disp_ctrl = 0;
- toggle_meta = 0;
-
- decscnm = 0;
- decom = 0;
- decawm = 1;
- deccm = 1;
- decim = 0;
+ vc->vc_top = 0;
+ vc->vc_bottom = vc->vc_rows;
+ vc->vc_state = ESnormal;
+ vc->vc_ques = 0;
+ vc->vc_translate = set_translate(LAT1_MAP, vc);
+ vc->vc_G0_charset = LAT1_MAP;
+ vc->vc_G1_charset = GRAF_MAP;
+ vc->vc_charset = 0;
+ vc->vc_need_wrap = 0;
+ vc->vc_report_mouse = 0;
+ vc->vc_utf = 0;
+ vc->vc_utf_count = 0;
+
+ vc->vc_disp_ctrl = 0;
+ vc->vc_toggle_meta = 0;
+
+ vc->vc_decscnm = 0;
+ vc->vc_decom = 0;
+ vc->vc_decawm = 1;
+ vc->vc_deccm = 1;
+ vc->vc_decim = 0;
set_kbd(vc, decarm);
clr_kbd(vc, decckm);
@@ -1477,20 +1477,20 @@ static void reset_terminal(struct vc_dat
/* do not do set_leds here because this causes an endless tasklet loop
when the keyboard hasn't been initialized yet */
- cursor_type = CUR_DEFAULT;
- complement_mask = s_complement_mask;
+ vc->vc_cursor_type = CUR_DEFAULT;
+ vc->vc_complement_mask = vc->vc_s_complement_mask;
default_attr(vc);
update_attr(vc);
- tab_stop[0] = 0x01010100;
- tab_stop[1] =
- tab_stop[2] =
- tab_stop[3] =
- tab_stop[4] = 0x01010101;
+ vc->vc_tab_stop[0] = 0x01010100;
+ vc->vc_tab_stop[1] =
+ vc->vc_tab_stop[2] =
+ vc->vc_tab_stop[3] =
+ vc->vc_tab_stop[4] = 0x01010101;
- bell_pitch = DEFAULT_BELL_PITCH;
- bell_duration = DEFAULT_BELL_DURATION;
+ vc->vc_bell_pitch = DEFAULT_BELL_PITCH;
+ vc->vc_bell_duration = DEFAULT_BELL_DURATION;
gotoxy(vc, 0, 0);
save_cur(vc);
@@ -1509,20 +1509,20 @@ static void do_con_trol(struct tty_struc
case 0:
return;
case 7:
- if (bell_duration)
- kd_mksound(bell_pitch, bell_duration);
+ if (vc->vc_bell_duration)
+ kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration);
return;
case 8:
bs(vc);
return;
case 9:
- pos -= (x << 1);
- while (x < vc->vc_cols - 1) {
- x++;
- if (tab_stop[x >> 5] & (1 << (x & 31)))
+ vc->vc_pos -= (vc->vc_x << 1);
+ while (vc->vc_x < vc->vc_cols - 1) {
+ vc->vc_x++;
+ if (vc->vc_tab_stop[vc->vc_x >> 5] & (1 << (vc->vc_x & 31)))
break;
}
- pos += (x << 1);
+ vc->vc_pos += (vc->vc_x << 1);
return;
case 10: case 11: case 12:
lf(vc);
@@ -1532,40 +1532,40 @@ static void do_con_trol(struct tty_struc
cr(vc);
return;
case 14:
- charset = 1;
- translate = set_translate(G1_charset, vc);
- disp_ctrl = 1;
+ vc->vc_charset = 1;
+ vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
+ vc->vc_disp_ctrl = 1;
return;
case 15:
- charset = 0;
- translate = set_translate(G0_charset, vc);
- disp_ctrl = 0;
+ vc->vc_charset = 0;
+ vc->vc_translate = set_translate(vc->vc_G0_charset, vc);
+ vc->vc_disp_ctrl = 0;
return;
case 24: case 26:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
return;
case 27:
- vc_state = ESesc;
+ vc->vc_state = ESesc;
return;
case 127:
del(vc);
return;
case 128+27:
- vc_state = ESsquare;
+ vc->vc_state = ESsquare;
return;
}
- switch(vc_state) {
+ switch(vc->vc_state) {
case ESesc:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
switch (c) {
case '[':
- vc_state = ESsquare;
+ vc->vc_state = ESsquare;
return;
case ']':
- vc_state = ESnonstd;
+ vc->vc_state = ESnonstd;
return;
case '%':
- vc_state = ESpercent;
+ vc->vc_state = ESpercent;
return;
case 'E':
cr(vc);
@@ -1578,7 +1578,7 @@ static void do_con_trol(struct tty_struc
lf(vc);
return;
case 'H':
- tab_stop[x >> 5] |= (1 << (x & 31));
+ vc->vc_tab_stop[vc->vc_x >> 5] |= (1 << (vc->vc_x & 31));
return;
case 'Z':
respond_ID(tty);
@@ -1590,13 +1590,13 @@ static void do_con_trol(struct tty_struc
restore_cur(vc);
return;
case '(':
- vc_state = ESsetG0;
+ vc->vc_state = ESsetG0;
return;
case ')':
- vc_state = ESsetG1;
+ vc->vc_state = ESsetG1;
return;
case '#':
- vc_state = EShash;
+ vc->vc_state = EShash;
return;
case 'c':
reset_terminal(vc, 1);
@@ -1611,57 +1611,58 @@ static void do_con_trol(struct tty_struc
return;
case ESnonstd:
if (c=='P') { /* palette escape sequence */
- for (npar=0; npar<NPAR; npar++)
- par[npar] = 0 ;
- npar = 0 ;
- vc_state = ESpalette;
+ for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++)
+ vc->vc_par[vc->vc_npar] = 0;
+ vc->vc_npar = 0;
+ vc->vc_state = ESpalette;
return;
} else if (c=='R') { /* reset palette */
reset_palette(vc);
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
} else
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
return;
case ESpalette:
if ( (c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f') ) {
- par[npar++] = (c>'9' ? (c&0xDF)-'A'+10 : c-'0') ;
- if (npar==7) {
- int i = par[0]*3, j = 1;
- palette[i] = 16*par[j++];
- palette[i++] += par[j++];
- palette[i] = 16*par[j++];
- palette[i++] += par[j++];
- palette[i] = 16*par[j++];
- palette[i] += par[j];
+ vc->vc_par[vc->vc_npar++] = (c > '9' ? (c & 0xDF) - 'A' + 10 : c - '0');
+ if (vc->vc_npar == 7) {
+ int i = vc->vc_par[0] * 3, j = 1;
+ vc->vc_palette[i] = 16 * vc->vc_par[j++];
+ vc->vc_palette[i++] += vc->vc_par[j++];
+ vc->vc_palette[i] = 16 * vc->vc_par[j++];
+ vc->vc_palette[i++] += vc->vc_par[j++];
+ vc->vc_palette[i] = 16 * vc->vc_par[j++];
+ vc->vc_palette[i] += vc->vc_par[j];
set_palette(vc);
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
}
} else
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
return;
case ESsquare:
- for(npar = 0 ; npar < NPAR ; npar++)
- par[npar] = 0;
- npar = 0;
- vc_state = ESgetpars;
+ for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++)
+ vc->vc_par[vc->vc_npar] = 0;
+ vc->vc_npar = 0;
+ vc->vc_state = ESgetpars;
if (c == '[') { /* Function key */
- vc_state=ESfunckey;
+ vc->vc_state=ESfunckey;
return;
}
- ques = (c=='?');
- if (ques)
+ vc->vc_ques = (c == '?');
+ if (vc->vc_ques)
return;
case ESgetpars:
- if (c==';' && npar<NPAR-1) {
- npar++;
+ if (c == ';' && vc->vc_npar < NPAR - 1) {
+ vc->vc_npar++;
return;
} else if (c>='0' && c<='9') {
- par[npar] *= 10;
- par[npar] += c-'0';
+ vc->vc_par[vc->vc_npar] *= 10;
+ vc->vc_par[vc->vc_npar] += c - '0';
return;
- } else vc_state=ESgotpars;
+ } else
+ vc->vc_state = ESgotpars;
case ESgotpars:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
switch(c) {
case 'h':
set_mode(vc, 1);
@@ -1670,103 +1671,113 @@ static void do_con_trol(struct tty_struc
set_mode(vc, 0);
return;
case 'c':
- if (ques) {
- if (par[0])
- cursor_type = par[0] | (par[1]<<8) | (par[2]<<16);
+ if (vc->vc_ques) {
+ if (vc->vc_par[0])
+ vc->vc_cursor_type = vc->vc_par[0] | (vc->vc_par[1] << 8) | (vc->vc_par[2] << 16);
else
- cursor_type = CUR_DEFAULT;
+ vc->vc_cursor_type = CUR_DEFAULT;
return;
}
break;
case 'm':
- if (ques) {
+ if (vc->vc_ques) {
clear_selection();
- if (par[0])
- complement_mask = par[0]<<8 | par[1];
+ if (vc->vc_par[0])
+ vc->vc_complement_mask = vc->vc_par[0] << 8 | vc->vc_par[1];
else
- complement_mask = s_complement_mask;
+ vc->vc_complement_mask = vc->vc_s_complement_mask;
return;
}
break;
case 'n':
- if (!ques) {
- if (par[0] == 5)
+ if (!vc->vc_ques) {
+ if (vc->vc_par[0] == 5)
status_report(tty);
- else if (par[0] == 6)
+ else if (vc->vc_par[0] == 6)
cursor_report(vc, tty);
}
return;
}
- if (ques) {
- ques = 0;
+ if (vc->vc_ques) {
+ vc->vc_ques = 0;
return;
}
switch(c) {
case 'G': case '`':
- if (par[0]) par[0]--;
- gotoxy(vc, par[0], y);
+ if (vc->vc_par[0])
+ vc->vc_par[0]--;
+ gotoxy(vc, vc->vc_par[0], vc->vc_y);
return;
case 'A':
- if (!par[0]) par[0]++;
- gotoxy(vc, x, y - par[0]);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, vc->vc_x, vc->vc_y - vc->vc_par[0]);
return;
case 'B': case 'e':
- if (!par[0]) par[0]++;
- gotoxy(vc, x, y + par[0]);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, vc->vc_x, vc->vc_y + vc->vc_par[0]);
return;
case 'C': case 'a':
- if (!par[0]) par[0]++;
- gotoxy(vc, x + par[0], y);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, vc->vc_x + vc->vc_par[0], vc->vc_y);
return;
case 'D':
- if (!par[0]) par[0]++;
- gotoxy(vc, x - par[0], y);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, vc->vc_x - vc->vc_par[0], vc->vc_y);
return;
case 'E':
- if (!par[0]) par[0]++;
- gotoxy(vc, 0, y + par[0]);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, 0, vc->vc_y + vc->vc_par[0]);
return;
case 'F':
- if (!par[0]) par[0]++;
- gotoxy(vc, 0, y - par[0]);
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ gotoxy(vc, 0, vc->vc_y - vc->vc_par[0]);
return;
case 'd':
- if (par[0]) par[0]--;
- gotoxay(vc, x, par[0]);
+ if (vc->vc_par[0])
+ vc->vc_par[0]--;
+ gotoxay(vc, vc->vc_x ,vc->vc_par[0]);
return;
case 'H': case 'f':
- if (par[0]) par[0]--;
- if (par[1]) par[1]--;
- gotoxay(vc, par[1], par[0]);
+ if (vc->vc_par[0])
+ vc->vc_par[0]--;
+ if (vc->vc_par[1])
+ vc->vc_par[1]--;
+ gotoxay(vc, vc->vc_par[1], vc->vc_par[0]);
return;
case 'J':
- csi_J(vc, par[0]);
+ csi_J(vc, vc->vc_par[0]);
return;
case 'K':
- csi_K(vc, par[0]);
+ csi_K(vc, vc->vc_par[0]);
return;
case 'L':
- csi_L(vc, par[0]);
+ csi_L(vc, vc->vc_par[0]);
return;
case 'M':
- csi_M(vc, par[0]);
+ csi_M(vc, vc->vc_par[0]);
return;
case 'P':
- csi_P(vc, par[0]);
+ csi_P(vc, vc->vc_par[0]);
return;
case 'c':
- if (!par[0])
+ if (!vc->vc_par[0])
respond_ID(tty);
return;
case 'g':
- if (!par[0])
- tab_stop[x >> 5] &= ~(1 << (x & 31));
- else if (par[0] == 3) {
- tab_stop[0] =
- tab_stop[1] =
- tab_stop[2] =
- tab_stop[3] =
- tab_stop[4] = 0;
+ if (!vc->vc_par[0])
+ vc->vc_tab_stop[vc->vc_x >> 5] &= ~(1 << (vc->vc_x & 31));
+ else if (vc->vc_par[0] == 3) {
+ vc->vc_tab_stop[0] =
+ vc->vc_tab_stop[1] =
+ vc->vc_tab_stop[2] =
+ vc->vc_tab_stop[3] =
+ vc->vc_tab_stop[4] = 0;
}
return;
case 'm':
@@ -1774,20 +1785,20 @@ static void do_con_trol(struct tty_struc
return;
case 'q': /* DECLL - but only 3 leds */
/* map 0,1,2,3 to 0,1,2,4 */
- if (par[0] < 4)
+ if (vc->vc_par[0] < 4)
setledstate(kbd_table + vc->vc_num,
- (par[0] < 3) ? par[0] : 4);
+ (vc->vc_par[0] < 3) ? vc->vc_par[0] : 4);
return;
case 'r':
- if (!par[0])
- par[0]++;
- if (!par[1])
- par[1] = vc->vc_rows;
+ if (!vc->vc_par[0])
+ vc->vc_par[0]++;
+ if (!vc->vc_par[1])
+ vc->vc_par[1] = vc->vc_rows;
/* Minimum allowed region is 2 lines */
- if (par[0] < par[1] &&
- par[1] <= vc->vc_rows) {
- top=par[0]-1;
- bottom=par[1];
+ if (vc->vc_par[0] < vc->vc_par[1] &&
+ vc->vc_par[1] <= vc->vc_rows) {
+ vc->vc_top = vc->vc_par[0] - 1;
+ vc->vc_bottom = vc->vc_par[1];
gotoxay(vc, 0, 0);
}
return;
@@ -1798,10 +1809,10 @@ static void do_con_trol(struct tty_struc
restore_cur(vc);
return;
case 'X':
- csi_X(vc, par[0]);
+ csi_X(vc, vc->vc_par[0]);
return;
case '@':
- csi_at(vc, par[0]);
+ csi_at(vc, vc->vc_par[0]);
return;
case ']': /* setterm functions */
setterm_command(vc);
@@ -1809,60 +1820,60 @@ static void do_con_trol(struct tty_struc
}
return;
case ESpercent:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
switch (c) {
case '@': /* defined in ISO 2022 */
- utf = 0;
+ vc->vc_utf = 0;
return;
case 'G': /* prelim official escape code */
case '8': /* retained for compatibility */
- utf = 1;
+ vc->vc_utf = 1;
return;
}
return;
case ESfunckey:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
return;
case EShash:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
if (c == '8') {
/* DEC screen alignment test. kludge :-) */
- video_erase_char =
- (video_erase_char & 0xff00) | 'E';
+ vc->vc_video_erase_char =
+ (vc->vc_video_erase_char & 0xff00) | 'E';
csi_J(vc, 2);
- video_erase_char =
- (video_erase_char & 0xff00) | ' ';
- do_update_region(vc, origin, screenbuf_size / 2);
+ vc->vc_video_erase_char =
+ (vc->vc_video_erase_char & 0xff00) | ' ';
+ do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
}
return;
case ESsetG0:
if (c == '0')
- G0_charset = GRAF_MAP;
+ vc->vc_G0_charset = GRAF_MAP;
else if (c == 'B')
- G0_charset = LAT1_MAP;
+ vc->vc_G0_charset = LAT1_MAP;
else if (c == 'U')
- G0_charset = IBMPC_MAP;
+ vc->vc_G0_charset = IBMPC_MAP;
else if (c == 'K')
- G0_charset = USER_MAP;
- if (charset == 0)
- translate = set_translate(G0_charset, vc);
- vc_state = ESnormal;
+ vc->vc_G0_charset = USER_MAP;
+ if (vc->vc_charset == 0)
+ vc->vc_translate = set_translate(vc->vc_G0_charset, vc);
+ vc->vc_state = ESnormal;
return;
case ESsetG1:
if (c == '0')
- G1_charset = GRAF_MAP;
+ vc->vc_G1_charset = GRAF_MAP;
else if (c == 'B')
- G1_charset = LAT1_MAP;
+ vc->vc_G1_charset = LAT1_MAP;
else if (c == 'U')
- G1_charset = IBMPC_MAP;
+ vc->vc_G1_charset = IBMPC_MAP;
else if (c == 'K')
- G1_charset = USER_MAP;
- if (charset == 1)
- translate = set_translate(G1_charset, vc);
- vc_state = ESnormal;
+ vc->vc_G1_charset = USER_MAP;
+ if (vc->vc_charset == 1)
+ vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
+ vc->vc_state = ESnormal;
return;
default:
- vc_state = ESnormal;
+ vc->vc_state = ESnormal;
}
}
@@ -1885,7 +1896,7 @@ static int do_con_write(struct tty_struc
#define FLUSH do { } while(0);
#else
#define FLUSH if (draw_x >= 0) { \
- sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x); \
+ vc->vc_sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to - (u16 *)draw_from, vc->vc_y, draw_x); \
draw_x = -1; \
}
#endif
@@ -1945,7 +1956,7 @@ static int do_con_write(struct tty_struc
goto out;
}
- himask = hi_font_mask;
+ himask = vc->vc_hi_font_mask;
charmask = himask ? 0x1ff : 0xff;
/* undraw cursor first */
@@ -1960,44 +1971,44 @@ static int do_con_write(struct tty_struc
count--;
/* Do no translation at all in control states */
- if (vc_state != ESnormal) {
+ if (vc->vc_state != ESnormal) {
tc = c;
- } else if (utf) {
+ } else if (vc->vc_utf) {
/* Combine UTF-8 into Unicode */
/* Incomplete characters silently ignored */
if(c > 0x7f) {
- if (utf_count > 0 && (c & 0xc0) == 0x80) {
- utf_char = (utf_char << 6) | (c & 0x3f);
- utf_count--;
- if (utf_count == 0)
- tc = c = utf_char;
+ if (vc->vc_utf_count > 0 && (c & 0xc0) == 0x80) {
+ vc->vc_utf_char = (vc->vc_utf_char << 6) | (c & 0x3f);
+ vc->vc_utf_count--;
+ if (vc->vc_utf_count == 0)
+ tc = c = vc->vc_utf_char;
else continue;
} else {
if ((c & 0xe0) == 0xc0) {
- utf_count = 1;
- utf_char = (c & 0x1f);
+ vc->vc_utf_count = 1;
+ vc->vc_utf_char = (c & 0x1f);
} else if ((c & 0xf0) == 0xe0) {
- utf_count = 2;
- utf_char = (c & 0x0f);
+ vc->vc_utf_count = 2;
+ vc->vc_utf_char = (c & 0x0f);
} else if ((c & 0xf8) == 0xf0) {
- utf_count = 3;
- utf_char = (c & 0x07);
+ vc->vc_utf_count = 3;
+ vc->vc_utf_char = (c & 0x07);
} else if ((c & 0xfc) == 0xf8) {
- utf_count = 4;
- utf_char = (c & 0x03);
+ vc->vc_utf_count = 4;
+ vc->vc_utf_char = (c & 0x03);
} else if ((c & 0xfe) == 0xfc) {
- utf_count = 5;
- utf_char = (c & 0x01);
+ vc->vc_utf_count = 5;
+ vc->vc_utf_char = (c & 0x01);
} else
- utf_count = 0;
+ vc->vc_utf_count = 0;
continue;
}
} else {
tc = c;
- utf_count = 0;
+ vc->vc_utf_count = 0;
}
} else { /* no utf */
- tc = translate[toggle_meta ? (c|0x80) : c];
+ tc = vc->vc_translate[vc->vc_toggle_meta ? (c | 0x80) : c];
}
/* If the original code was a control character we
@@ -2011,12 +2022,12 @@ static int do_con_write(struct tty_struc
* direct-to-font zone in UTF-8 mode.
*/
ok = tc && (c >= 32 ||
- (!utf && !(((disp_ctrl ? CTRL_ALWAYS
- : CTRL_ACTION) >> c) & 1)))
- && (c != 127 || disp_ctrl)
+ (!vc->vc_utf && !(((vc->vc_disp_ctrl ? CTRL_ALWAYS
+ : CTRL_ACTION) >> c) & 1)))
+ && (c != 127 || vc->vc_disp_ctrl)
&& (c != 128+27);
- if (vc_state == ESnormal && ok) {
+ if (vc->vc_state == ESnormal && ok) {
/* Now try to find out how to display it */
tc = conv_uni_to_pc(vc, tc);
if ( tc == -4 ) {
@@ -2036,28 +2047,28 @@ static int do_con_write(struct tty_struc
if (tc & ~charmask)
continue; /* Conversion failed */
- if (need_wrap || decim)
+ if (vc->vc_need_wrap || vc->vc_decim)
FLUSH
- if (need_wrap) {
+ if (vc->vc_need_wrap) {
cr(vc);
lf(vc);
}
- if (decim)
+ if (vc->vc_decim)
insert_char(vc, 1);
scr_writew(himask ?
- ((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
- (attr << 8) + tc,
- (u16 *) pos);
+ ((vc->vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
+ (vc->vc_attr << 8) + tc,
+ (u16 *) vc->vc_pos);
if (DO_UPDATE(vc) && draw_x < 0) {
- draw_x = x;
- draw_from = pos;
+ draw_x = vc->vc_x;
+ draw_from = vc->vc_pos;
}
- if (x == vc->vc_cols - 1) {
- need_wrap = decawm;
- draw_to = pos+2;
+ if (vc->vc_x == vc->vc_cols - 1) {
+ vc->vc_need_wrap = vc->vc_decawm;
+ draw_to = vc->vc_pos + 2;
} else {
- x++;
- draw_to = (pos+=2);
+ vc->vc_x++;
+ draw_to = (vc->vc_pos += 2);
}
continue;
}
@@ -2104,8 +2115,8 @@ static void console_callback(void *ignor
if (scrollback_delta) {
struct vc_data *vc = vc_cons[fg_console].d;
clear_selection();
- if (vcmode == KD_TEXT)
- sw->con_scrolldelta(vc, scrollback_delta);
+ if (vt_cons[vc->vc_num]->vc_mode == KD_TEXT)
+ vc->vc_sw->con_scrolldelta(vc, scrollback_delta);
scrollback_delta = 0;
}
if (blank_timer_expired) {
@@ -2150,7 +2161,7 @@ void vt_console_print(struct console *co
/* read `x' only after setting currcons properly (otherwise
the `x' macro will read the x of the foreground console). */
- myx = x;
+ myx = vc->vc_x;
if (!vc_cons_allocated(fg_console)) {
/* impossible */
@@ -2158,58 +2169,58 @@ void vt_console_print(struct console *co
goto quit;
}
- if (vcmode != KD_TEXT)
+ if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
goto quit;
/* undraw cursor first */
if (vc->vc_num == fg_console)
hide_cursor(vc);
- start = (ushort *)pos;
+ start = (ushort *)vc->vc_pos;
/* Contrived structure to try to emulate original need_wrap behaviour
* Problems caused when we have need_wrap set on '\n' character */
while (count--) {
c = *b++;
- if (c == 10 || c == 13 || c == 8 || need_wrap) {
+ if (c == 10 || c == 13 || c == 8 || vc->vc_need_wrap) {
if (cnt > 0) {
if (CON_IS_VISIBLE(vc))
- sw->con_putcs(vc, start, cnt, y, x);
- x += cnt;
- if (need_wrap)
- x--;
+ vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x);
+ vc->vc_x += cnt;
+ if (vc->vc_need_wrap)
+ vc->vc_x--;
cnt = 0;
}
if (c == 8) { /* backspace */
bs(vc);
- start = (ushort *)pos;
- myx = x;
+ start = (ushort *)vc->vc_pos;
+ myx = vc->vc_x;
continue;
}
if (c != 13)
lf(vc);
cr(vc);
- start = (ushort *)pos;
- myx = x;
+ start = (ushort *)vc->vc_pos;
+ myx = vc->vc_x;
if (c == 10 || c == 13)
continue;
}
- scr_writew((attr << 8) + c, (unsigned short *) pos);
+ scr_writew((vc->vc_attr << 8) + c, (unsigned short *)vc->vc_pos);
cnt++;
if (myx == vc->vc_cols - 1) {
- need_wrap = 1;
+ vc->vc_need_wrap = 1;
continue;
}
- pos+=2;
+ vc->vc_pos += 2;
myx++;
}
if (cnt > 0) {
if (CON_IS_VISIBLE(vc))
- sw->con_putcs(vc, start, cnt, y, x);
- x += cnt;
- if (x == vc->vc_cols) {
- x--;
- need_wrap = 1;
+ vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x);
+ vc->vc_x += cnt;
+ if (vc->vc_x == vc->vc_cols) {
+ vc->vc_x--;
+ vc->vc_need_wrap = 1;
}
}
set_cursor(vc);
@@ -2498,19 +2509,19 @@ static void vc_init(struct vc_data *vc,
vc->vc_cols = cols;
vc->vc_rows = rows;
vc->vc_size_row = cols << 1;
- screenbuf_size = vc->vc_rows * vc->vc_size_row;
+ vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row;
set_origin(vc);
- pos = origin;
+ vc->vc_pos = vc->vc_origin;
reset_vc(vc);
for (j=k=0; j<16; j++) {
vc->vc_palette[k++] = default_red[j] ;
vc->vc_palette[k++] = default_grn[j] ;
vc->vc_palette[k++] = default_blu[j] ;
}
- def_color = 0x07; /* white */
- ulcolor = 0x0f; /* bold white */
- halfcolor = 0x08; /* grey */
+ vc->vc_def_color = 0x07; /* white */
+ vc->vc_ulcolor = 0x0f; /* bold white */
+ vc->vc_halfcolor = 0x08; /* grey */
init_waitqueue_head(&vt_cons[vc->vc_num]->paste_wait);
reset_terminal(vc, do_clear);
}
@@ -2554,16 +2565,16 @@ static int __init con_init(void)
alloc_bootmem(sizeof(struct vt_struct));
vc_cons[currcons].d->vc_vt = vt_cons[currcons];
visual_init(vc, currcons, 1);
- screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size);
- kmalloced = 0;
+ vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
+ vc->vc_kmalloced = 0;
vc_init(vc, vc->vc_rows, vc->vc_cols,
- currcons || !sw->con_save_screen);
+ currcons || !vc->vc_sw->con_save_screen);
}
currcons = fg_console = 0;
master_display_fg = vc = vc_cons[currcons].d;
set_origin(vc);
save_screen(vc);
- gotoxy(vc, x, y);
+ gotoxy(vc, vc->vc_x, vc->vc_y);
csi_J(vc, 0);
update_screen(vc);
printk("Console: %s %s %dx%d",
@@ -2677,10 +2688,10 @@ int take_over_console(const struct consw
save_screen(vc);
old_was_color = vc->vc_can_do_color;
vc->vc_sw->con_deinit(vc);
- origin = (unsigned long) screenbuf;
- visible_origin = origin;
- scr_end = origin + screenbuf_size;
- pos = origin + vc->vc_size_row * y + 2 * x;
+ vc->vc_origin = (unsigned long)vc->vc_screenbuf;
+ vc->vc_visible_origin = vc->vc_origin;
+ vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size;
+ vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x;
visual_init(vc, i, 0);
update_attr(vc);
@@ -2780,14 +2791,14 @@ void do_blank_screen(int entering_gfx)
if (entering_gfx) {
hide_cursor(vc);
save_screen(vc);
- sw->con_blank(vc, -1, 1);
+ vc->vc_sw->con_blank(vc, -1, 1);
console_blanked = fg_console + 1;
set_origin(vc);
return;
}
/* don't blank graphics */
- if (vcmode != KD_TEXT) {
+ if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT) {
console_blanked = fg_console + 1;
return;
}
@@ -2798,7 +2809,7 @@ void do_blank_screen(int entering_gfx)
save_screen(vc);
/* In case we need to reset origin, blanking hook returns 1 */
- i = sw->con_blank(vc, 1, 0);
+ i = vc->vc_sw->con_blank(vc, 1, 0);
console_blanked = fg_console + 1;
if (i)
set_origin(vc);
@@ -2812,7 +2823,7 @@ void do_blank_screen(int entering_gfx)
}
if (vesa_blank_mode)
- sw->con_blank(vc, vesa_blank_mode + 1, 0);
+ vc->vc_sw->con_blank(vc, vesa_blank_mode + 1, 0);
}
EXPORT_SYMBOL(do_blank_screen);
@@ -2834,7 +2845,7 @@ void do_unblank_screen(int leaving_gfx)
return;
}
vc = vc_cons[fg_console].d;
- if (vcmode != KD_TEXT)
+ if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
return; /* but leave console_blanked != 0 */
if (blankinterval) {
@@ -2843,7 +2854,7 @@ void do_unblank_screen(int leaving_gfx)
}
console_blanked = 0;
- if (sw->con_blank(vc, 0, leaving_gfx))
+ if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
/* Low-level driver cannot restore -> do it ourselves */
update_screen(vc);
if (console_blank_hook)
@@ -2903,8 +2914,8 @@ void set_palette(struct vc_data *vc)
{
WARN_CONSOLE_UNLOCKED();
- if (vcmode != KD_GRAPHICS)
- sw->con_set_palette(vc, color_table);
+ if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
+ vc->vc_sw->con_set_palette(vc, color_table);
}
static int set_get_cmap(unsigned char __user *arg, int set)
@@ -2968,9 +2979,9 @@ void reset_palette(struct vc_data *vc)
{
int j, k;
for (j=k=0; j<16; j++) {
- palette[k++] = default_red[j];
- palette[k++] = default_grn[j];
- palette[k++] = default_blu[j];
+ vc->vc_palette[k++] = default_red[j];
+ vc->vc_palette[k++] = default_grn[j];
+ vc->vc_palette[k++] = default_blu[j];
}
set_palette(vc);
}
@@ -3007,8 +3018,8 @@ int con_font_get(struct vc_data *vc, str
font.data = NULL;
acquire_console_sem();
- if (sw->con_font_get)
- rc = sw->con_font_get(vc, &font);
+ if (vc->vc_sw->con_font_get)
+ rc = vc->vc_sw->con_font_get(vc, &font);
else
rc = -ENOSYS;
release_console_sem();
@@ -3093,8 +3104,8 @@ int con_font_set(struct vc_data *vc, str
return -EFAULT;
}
acquire_console_sem();
- if (sw->con_font_set)
- rc = sw->con_font_set(vc, &font, op->flags);
+ if (vc->vc_sw->con_font_set)
+ rc = vc->vc_sw->con_font_set(vc, &font, op->flags);
else
rc = -ENOSYS;
release_console_sem();
@@ -3120,8 +3131,8 @@ int con_font_default(struct vc_data *vc,
name[MAX_FONT_NAME - 1] = 0;
acquire_console_sem();
- if (sw->con_font_default)
- rc = sw->con_font_default(vc, &font, s);
+ if (vc->vc_sw->con_font_default)
+ rc = vc->vc_sw->con_font_default(vc, &font, s);
else
rc = -ENOSYS;
release_console_sem();
@@ -3141,14 +3152,14 @@ int con_font_copy(struct vc_data *vc, st
return -EINVAL;
acquire_console_sem();
- if (!sw->con_font_copy)
+ if (!vc->vc_sw->con_font_copy)
rc = -ENOSYS;
else if (con < 0 || !vc_cons_allocated(con))
rc = -ENOTTY;
else if (con == vc->vc_num) /* nothing to do */
rc = 0;
else
- rc = sw->con_font_copy(vc, con);
+ rc = vc->vc_sw->con_font_copy(vc, con);
release_console_sem();
return rc;
}
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 2/3] remove console_macros.h
2005-01-15 3:40 ` [PATCH 2/3] remove console_macros.h Roman Zippel
@ 2005-01-21 17:53 ` James Simmons
2005-01-21 17:45 ` Randy.Dunlap
2005-01-21 17:59 ` Christoph Hellwig
0 siblings, 2 replies; 12+ messages in thread
From: James Simmons @ 2005-01-21 17:53 UTC (permalink / raw)
To: Roman Zippel; +Cc: Christoph Hellwig, Andrew Morton, linux-kernel
Now its starting to look like the linuxconsole project :-)
On Sat, 15 Jan 2005, Roman Zippel wrote:
> Hi,
>
> Remove the macros in console_macros.h and so make the structure references
> explicit.
>
> Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
>
> drivers/char/console_macros.h | 71 --
> linux-2.6-vc/drivers/char/vt.c | 1035 ++++++++++++++++++++---------------------
> 2 files changed, 523 insertions(+), 583 deletions(-)
>
> Index: linux-2.6-vc/drivers/char/console_macros.h
> ===================================================================
> --- linux-2.6-vc.orig/drivers/char/console_macros.h 2005-01-14 22:15:55.896858073 +0100
> +++ /dev/null 1970-01-01 00:00:00.000000000 +0000
> @@ -1,71 +0,0 @@
> -#define cons_num (vc->vc_num)
> -#define video_scan_lines (vc->vc_scan_lines)
> -#define sw (vc->vc_sw)
> -#define screenbuf (vc->vc_screenbuf)
> -#define screenbuf_size (vc->vc_screenbuf_size)
> -#define origin (vc->vc_origin)
> -#define scr_top (vc->vc_scr_top)
> -#define visible_origin (vc->vc_visible_origin)
> -#define scr_end (vc->vc_scr_end)
> -#define pos (vc->vc_pos)
> -#define top (vc->vc_top)
> -#define bottom (vc->vc_bottom)
> -#define x (vc->vc_x)
> -#define y (vc->vc_y)
> -#define vc_state (vc->vc_state)
> -#define npar (vc->vc_npar)
> -#define par (vc->vc_par)
> -#define ques (vc->vc_ques)
> -#define attr (vc->vc_attr)
> -#define saved_x (vc->vc_saved_x)
> -#define saved_y (vc->vc_saved_y)
> -#define translate (vc->vc_translate)
> -#define G0_charset (vc->vc_G0_charset)
> -#define G1_charset (vc->vc_G1_charset)
> -#define saved_G0 (vc->vc_saved_G0)
> -#define saved_G1 (vc->vc_saved_G1)
> -#define utf (vc->vc_utf)
> -#define utf_count (vc->vc_utf_count)
> -#define utf_char (vc->vc_utf_char)
> -#define video_erase_char (vc->vc_video_erase_char)
> -#define disp_ctrl (vc->vc_disp_ctrl)
> -#define toggle_meta (vc->vc_toggle_meta)
> -#define decscnm (vc->vc_decscnm)
> -#define decom (vc->vc_decom)
> -#define decawm (vc->vc_decawm)
> -#define deccm (vc->vc_deccm)
> -#define decim (vc->vc_decim)
> -#define deccolm (vc->vc_deccolm)
> -#define need_wrap (vc->vc_need_wrap)
> -#define kmalloced (vc->vc_kmalloced)
> -#define report_mouse (vc->vc_report_mouse)
> -#define color (vc->vc_color)
> -#define s_color (vc->vc_s_color)
> -#define def_color (vc->vc_def_color)
> -#define foreground (color & 0x0f)
> -#define background (color & 0xf0)
> -#define charset (vc->vc_charset)
> -#define s_charset (vc->vc_s_charset)
> -#define intensity (vc->vc_intensity)
> -#define underline (vc->vc_underline)
> -#define blink (vc->vc_blink)
> -#define reverse (vc->vc_reverse)
> -#define s_intensity (vc->vc_s_intensity)
> -#define s_underline (vc->vc_s_underline)
> -#define s_blink (vc->vc_s_blink)
> -#define s_reverse (vc->vc_s_reverse)
> -#define ulcolor (vc->vc_ulcolor)
> -#define halfcolor (vc->vc_halfcolor)
> -#define tab_stop (vc->vc_tab_stop)
> -#define palette (vc->vc_palette)
> -#define bell_pitch (vc->vc_bell_pitch)
> -#define bell_duration (vc->vc_bell_duration)
> -#define cursor_type (vc->vc_cursor_type)
> -#define display_fg (vc->vc_display_fg)
> -#define complement_mask (vc->vc_complement_mask)
> -#define s_complement_mask (vc->vc_s_complement_mask)
> -#define hi_font_mask (vc->vc_hi_font_mask)
> -
> -#define vcmode (vt_cons[vc->vc_num]->vc_mode)
> -
> -#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct))
> Index: linux-2.6-vc/drivers/char/vt.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/char/vt.c 2005-01-14 22:15:55.894858418 +0100
> +++ linux-2.6-vc/drivers/char/vt.c 2005-01-14 22:16:13.448833821 +0100
> @@ -98,8 +98,6 @@
> #include <asm/system.h>
> #include <asm/uaccess.h>
>
> -#include "console_macros.h"
> -
>
> const struct consw *conswitchp;
>
> @@ -255,12 +253,12 @@ static void scrup(struct vc_data *vc, un
> nr = b - t - 1;
> if (b > vc->vc_rows || t >= b || nr < 1)
> return;
> - if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_UP, nr))
> + if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_UP, nr))
> return;
> - d = (unsigned short *)(origin + vc->vc_size_row * t);
> - s = (unsigned short *)(origin + vc->vc_size_row * (t + nr));
> + d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
> + s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
> scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
> - scr_memsetw(d + (b - t - nr) * vc->vc_cols, video_erase_char,
> + scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
> vc->vc_size_row * nr);
> }
>
> @@ -273,12 +271,12 @@ static void scrdown(struct vc_data *vc,
> nr = b - t - 1;
> if (b > vc->vc_rows || t >= b || nr < 1)
> return;
> - if (CON_IS_VISIBLE(vc) && sw->con_scroll(vc, t, b, SM_DOWN, nr))
> + if (CON_IS_VISIBLE(vc) && vc->vc_sw->con_scroll(vc, t, b, SM_DOWN, nr))
> return;
> - s = (unsigned short *)(origin + vc->vc_size_row * t);
> + s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
> step = vc->vc_cols * nr;
> scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
> - scr_memsetw(s, video_erase_char, 2*step);
> + scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
> }
>
> static void do_update_region(struct vc_data *vc, unsigned long start, int count)
> @@ -342,8 +340,8 @@ void update_region(struct vc_data *vc, u
>
> static u8 build_attr(struct vc_data *vc, u8 _color, u8 _intensity, u8 _blink, u8 _underline, u8 _reverse)
> {
> - if (sw->con_build_attr)
> - return sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse);
> + if (vc->vc_sw->con_build_attr)
> + return vc->vc_sw->con_build_attr(vc, _color, _intensity, _blink, _underline, _reverse);
>
> #ifndef VT_BUF_VRAM_ONLY
> /*
> @@ -357,23 +355,23 @@ static u8 build_attr(struct vc_data *vc,
> * Bit 7 : blink
> */
> {
> - u8 a = color;
> + u8 a = vc->vc_color;
> if (!vc->vc_can_do_color)
> return _intensity |
> (_underline ? 4 : 0) |
> (_reverse ? 8 : 0) |
> (_blink ? 0x80 : 0);
> if (_underline)
> - a = (a & 0xf0) | ulcolor;
> + a = (a & 0xf0) | vc->vc_ulcolor;
> else if (_intensity == 0)
> - a = (a & 0xf0) | halfcolor;
> + a = (a & 0xf0) | vc->vc_ulcolor;
> if (_reverse)
> a = ((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77);
> if (_blink)
> a ^= 0x80;
> if (_intensity == 2)
> a ^= 0x08;
> - if (hi_font_mask == 0x100)
> + if (vc->vc_hi_font_mask == 0x100)
> a <<= 1;
> return a;
> }
> @@ -384,8 +382,8 @@ static u8 build_attr(struct vc_data *vc,
>
> static void update_attr(struct vc_data *vc)
> {
> - attr = build_attr(vc, color, intensity, blink, underline, reverse ^ decscnm);
> - video_erase_char = (build_attr(vc, color, 1, blink, 0, decscnm) << 8) | ' ';
> + vc->vc_attr = build_attr(vc, vc->vc_color, vc->vc_intensity, vc->vc_blink, vc->vc_underline, vc->vc_reverse ^ vc->vc_decscnm);
> + vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm) << 8) | ' ';
> }
>
> /* Note: inverting the screen twice should revert to the original state */
> @@ -465,44 +463,44 @@ void complement_pos(struct vc_data *vc,
>
> static void insert_char(struct vc_data *vc, unsigned int nr)
> {
> - unsigned short *p, *q = (unsigned short *) pos;
> + unsigned short *p, *q = (unsigned short *)vc->vc_pos;
>
> - p = q + vc->vc_cols - nr - x;
> + p = q + vc->vc_cols - nr - vc->vc_x;
> while (--p >= q)
> scr_writew(scr_readw(p), p + nr);
> - scr_memsetw(q, video_erase_char, nr*2);
> - need_wrap = 0;
> + scr_memsetw(q, vc->vc_video_erase_char, nr * 2);
> + vc->vc_need_wrap = 0;
> if (DO_UPDATE(vc)) {
> - unsigned short oldattr = attr;
> - sw->con_bmove(vc, y, x, y, x + nr, 1,
> - vc->vc_cols - x - nr);
> - attr = video_erase_char >> 8;
> + unsigned short oldattr = vc->vc_attr;
> + vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x, vc->vc_y, vc->vc_x + nr, 1,
> + vc->vc_cols - vc->vc_x - nr);
> + vc->vc_attr = vc->vc_video_erase_char >> 8;
> while (nr--)
> - sw->con_putc(vc, video_erase_char, y, x + nr);
> - attr = oldattr;
> + vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, vc->vc_x + nr);
> + vc->vc_attr = oldattr;
> }
> }
>
> static void delete_char(struct vc_data *vc, unsigned int nr)
> {
> - unsigned int i = x;
> - unsigned short *p = (unsigned short *) pos;
> + unsigned int i = vc->vc_x;
> + unsigned short *p = (unsigned short *)vc->vc_pos;
>
> while (++i <= vc->vc_cols - nr) {
> scr_writew(scr_readw(p+nr), p);
> p++;
> }
> - scr_memsetw(p, video_erase_char, nr*2);
> - need_wrap = 0;
> + scr_memsetw(p, vc->vc_video_erase_char, nr * 2);
> + vc->vc_need_wrap = 0;
> if (DO_UPDATE(vc)) {
> - unsigned short oldattr = attr;
> - sw->con_bmove(vc, y, x + nr, y, x, 1,
> - vc->vc_cols - x - nr);
> - attr = video_erase_char >> 8;
> + unsigned short oldattr = vc->vc_attr;
> + vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x + nr, vc->vc_y, vc->vc_x, 1,
> + vc->vc_cols - vc->vc_x - nr);
> + vc->vc_attr = vc->vc_video_erase_char >> 8;
> while (nr--)
> - sw->con_putc(vc, video_erase_char, y,
> + vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y,
> vc->vc_cols - 1 - nr);
> - attr = oldattr;
> + vc->vc_attr = oldattr;
> }
> }
>
> @@ -564,20 +562,20 @@ static void set_origin(struct vc_data *v
> WARN_CONSOLE_UNLOCKED();
>
> if (!CON_IS_VISIBLE(vc) ||
> - !sw->con_set_origin ||
> - !sw->con_set_origin(vc))
> - origin = (unsigned long) screenbuf;
> - visible_origin = origin;
> - scr_end = origin + screenbuf_size;
> - pos = origin + vc->vc_size_row * y + 2 * x;
> + !vc->vc_sw->con_set_origin ||
> + !vc->vc_sw->con_set_origin(vc))
> + vc->vc_origin = (unsigned long)vc->vc_screenbuf;
> + vc->vc_visible_origin = vc->vc_origin;
> + vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size;
> + vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x;
> }
>
> static inline void save_screen(struct vc_data *vc)
> {
> WARN_CONSOLE_UNLOCKED();
>
> - if (sw->con_save_screen)
> - sw->con_save_screen(vc);
> + if (vc->vc_sw->con_save_screen)
> + vc->vc_sw->con_save_screen(vc);
> }
>
> /*
> @@ -586,12 +584,12 @@ static inline void save_screen(struct vc
>
> static void clear_buffer_attributes(struct vc_data *vc)
> {
> - unsigned short *p = (unsigned short *) origin;
> - int count = screenbuf_size/2;
> - int mask = hi_font_mask | 0xff;
> + unsigned short *p = (unsigned short *)vc->vc_origin;
> + int count = vc->vc_screenbuf_size / 2;
> + int mask = vc->vc_hi_font_mask | 0xff;
>
> for (; count > 0; count--, p++) {
> - scr_writew((scr_readw(p)&mask) | (video_erase_char&~mask), p);
> + scr_writew((scr_readw(p)&mask) | (vc->vc_video_erase_char & ~mask), p);
> }
> }
>
> @@ -630,7 +628,7 @@ void redraw_screen(struct vc_data *vc, i
> int old_was_color = vc->vc_can_do_color;
>
> set_origin(vc);
> - update = sw->con_switch(vc);
> + update = vc->vc_sw->con_switch(vc);
> set_palette(vc);
> /*
> * If console changed from mono<->color, the best we can do
> @@ -642,8 +640,8 @@ void redraw_screen(struct vc_data *vc, i
> update_attr(vc);
> clear_buffer_attributes(vc);
> }
> - if (update && vcmode != KD_GRAPHICS)
> - do_update_region(vc, origin, screenbuf_size / 2);
> + if (update && vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
> + do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
> }
> set_cursor(vc);
> if (is_switch) {
> @@ -663,28 +661,28 @@ int vc_cons_allocated(unsigned int i)
>
> static void visual_init(struct vc_data *vc, int num, int init)
> {
> - /* ++Geert: sw->con_init determines console size */
> - if (sw)
> - module_put(sw->owner);
> - sw = conswitchp;
> + /* ++Geert: vc->vc_sw->con_init determines console size */
> + if (vc->vc_sw)
> + module_put(vc->vc_sw->owner);
> + vc->vc_sw = conswitchp;
> #ifndef VT_SINGLE_DRIVER
> if (con_driver_map[num])
> - sw = con_driver_map[num];
> + vc->vc_sw = con_driver_map[num];
> #endif
> - __module_get(sw->owner);
> + __module_get(vc->vc_sw->owner);
> vc->vc_num = num;
> - display_fg = &master_display_fg;
> + vc->vc_display_fg = &master_display_fg;
> vc->vc_uni_pagedir_loc = &vc->vc_uni_pagedir;
> vc->vc_uni_pagedir = 0;
> - hi_font_mask = 0;
> - complement_mask = 0;
> + vc->vc_hi_font_mask = 0;
> + vc->vc_complement_mask = 0;
> vc->vc_can_do_color = 0;
> - sw->con_init(vc, init);
> - if (!complement_mask)
> - complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
> - s_complement_mask = complement_mask;
> + vc->vc_sw->con_init(vc, init);
> + if (!vc->vc_complement_mask)
> + vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800;
> + vc->vc_s_complement_mask = vc->vc_complement_mask;
> vc->vc_size_row = vc->vc_cols << 1;
> - screenbuf_size = vc->vc_rows * vc->vc_size_row;
> + vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row;
> }
>
> int vc_allocate(unsigned int currcons) /* return 0 on success */
> @@ -707,25 +705,25 @@ int vc_allocate(unsigned int currcons) /
> /* although the numbers above are not valid since long ago, the
> point is still up-to-date and the comment still has its value
> even if only as a historical artifact. --mj, July 1998 */
> - p = (long) kmalloc(structsize, GFP_KERNEL);
> + p = (long) kmalloc(sizeof(struct vc_data) + sizeof(struct vt_struct), GFP_KERNEL);
> if (!p)
> return -ENOMEM;
> - memset((void *)p, 0, structsize);
> + memset((void *)p, 0, sizeof(struct vc_data) + sizeof(struct vt_struct));
> vc_cons[currcons].d = vc = (struct vc_data *)p;
> vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
> vc_cons[currcons].d->vc_vt = vt_cons[currcons];
> visual_init(vc, currcons, 1);
> if (!*vc->vc_uni_pagedir_loc)
> con_set_default_unimap(vc);
> - q = (long)kmalloc(screenbuf_size, GFP_KERNEL);
> + q = (long)kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
> if (!q) {
> kfree((char *) p);
> vc_cons[currcons].d = NULL;
> vt_cons[currcons] = NULL;
> return -ENOMEM;
> }
> - screenbuf = (unsigned short *) q;
> - kmalloced = 1;
> + vc->vc_screenbuf = (unsigned short *)q;
> + vc->vc_kmalloced = 1;
> vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
>
> if (!pm_con) {
> @@ -742,8 +740,8 @@ inline int resize_screen(struct vc_data
> /* Resizes the resolution of the display adapater */
> int err = 0;
>
> - if (vcmode != KD_GRAPHICS && sw->con_resize)
> - err = sw->con_resize(vc, width, height);
> + if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
> + err = vc->vc_sw->con_resize(vc, width, height);
> return err;
> }
>
> @@ -784,7 +782,7 @@ int vc_resize(struct vc_data *vc, unsign
> old_rows = vc->vc_rows;
> old_cols = vc->vc_cols;
> old_row_size = vc->vc_size_row;
> - old_screen_size = screenbuf_size;
> + old_screen_size = vc->vc_screenbuf_size;
>
> err = resize_screen(vc, new_cols, new_rows);
> if (err) {
> @@ -795,11 +793,11 @@ int vc_resize(struct vc_data *vc, unsign
> vc->vc_rows = new_rows;
> vc->vc_cols = new_cols;
> vc->vc_size_row = new_row_size;
> - screenbuf_size = new_screen_size;
> + vc->vc_screenbuf_size = new_screen_size;
>
> rlth = min(old_row_size, new_row_size);
> rrem = new_row_size - rlth;
> - old_origin = origin;
> + old_origin = vc->vc_origin;
> new_origin = (long) newscreen;
> new_scr_end = new_origin + new_screen_size;
> if (new_rows < old_rows)
> @@ -807,26 +805,26 @@ int vc_resize(struct vc_data *vc, unsign
>
> update_attr(vc);
>
> - while (old_origin < scr_end) {
> + while (old_origin < vc->vc_scr_end) {
> scr_memcpyw((unsigned short *) new_origin, (unsigned short *) old_origin, rlth);
> if (rrem)
> - scr_memsetw((void *)(new_origin + rlth), video_erase_char, rrem);
> + scr_memsetw((void *)(new_origin + rlth), vc->vc_video_erase_char, rrem);
> old_origin += old_row_size;
> new_origin += new_row_size;
> }
> if (new_scr_end > new_origin)
> - scr_memsetw((void *) new_origin, video_erase_char, new_scr_end - new_origin);
> - if (kmalloced)
> - kfree(screenbuf);
> - screenbuf = newscreen;
> - kmalloced = 1;
> - screenbuf_size = new_screen_size;
> + scr_memsetw((void *)new_origin, vc->vc_video_erase_char, new_scr_end - new_origin);
> + if (vc->vc_kmalloced)
> + kfree(vc->vc_screenbuf);
> + vc->vc_screenbuf = newscreen;
> + vc->vc_kmalloced = 1;
> + vc->vc_screenbuf_size = new_screen_size;
> set_origin(vc);
>
> /* do part of a reset_terminal() */
> - top = 0;
> - bottom = vc->vc_rows;
> - gotoxy(vc, x, y);
> + vc->vc_top = 0;
> + vc->vc_bottom = vc->vc_rows;
> + gotoxy(vc, vc->vc_x, vc->vc_y);
> save_cur(vc);
>
> if (vc->vc_tty) {
> @@ -835,7 +833,7 @@ int vc_resize(struct vc_data *vc, unsign
> memset(&ws, 0, sizeof(ws));
> ws.ws_row = vc->vc_rows;
> ws.ws_col = vc->vc_cols;
> - ws.ws_ypixel = video_scan_lines;
> + ws.ws_ypixel = vc->vc_scan_lines;
> if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
> vc->vc_tty->pgrp > 0)
> kill_pg(vc->vc_tty->pgrp, SIGWINCH, 1);
> @@ -854,9 +852,9 @@ void vc_disallocate(unsigned int currcon
>
> if (vc_cons_allocated(currcons)) {
> struct vc_data *vc = vc_cons[currcons].d;
> - sw->con_deinit(vc);
> - if (kmalloced)
> - kfree(screenbuf);
> + vc->vc_sw->con_deinit(vc);
> + if (vc->vc_kmalloced)
> + kfree(vc->vc_screenbuf);
> if (currcons >= MIN_NR_CONSOLES)
> kfree(vc);
> vc_cons[currcons].d = NULL;
> @@ -931,7 +929,7 @@ static void gotoxy(struct vc_data *vc, i
> /* for absolute user moves, when decom is set */
> static void gotoxay(struct vc_data *vc, int new_x, int new_y)
> {
> - gotoxy(vc, new_x, decom ? (top+new_y) : new_y);
> + gotoxy(vc, new_x, vc->vc_decom ? (vc->vc_top + new_y) : new_y);
> }
>
> void scrollback(struct vc_data *vc, int lines)
> @@ -953,13 +951,13 @@ static void lf(struct vc_data *vc)
> /* don't scroll if above bottom of scrolling region, or
> * if below scrolling region
> */
> - if (y+1 == bottom)
> - scrup(vc, top, bottom, 1);
> - else if (y < vc->vc_rows - 1) {
> - y++;
> - pos += vc->vc_size_row;
> + if (vc->vc_y + 1 == vc->vc_bottom)
> + scrup(vc, vc->vc_top, vc->vc_bottom, 1);
> + else if (vc->vc_y < vc->vc_rows - 1) {
> + vc->vc_y++;
> + vc->vc_pos += vc->vc_size_row;
> }
> - need_wrap = 0;
> + vc->vc_need_wrap = 0;
> }
>
> static void ri(struct vc_data *vc)
> @@ -967,27 +965,27 @@ static void ri(struct vc_data *vc)
> /* don't scroll if below top of scrolling region, or
> * if above scrolling region
> */
> - if (y == top)
> - scrdown(vc, top, bottom, 1);
> - else if (y > 0) {
> - y--;
> - pos -= vc->vc_size_row;
> + if (vc->vc_y == vc->vc_top)
> + scrdown(vc, vc->vc_top, vc->vc_bottom, 1);
> + else if (vc->vc_y > 0) {
> + vc->vc_y--;
> + vc->vc_pos -= vc->vc_size_row;
> }
> - need_wrap = 0;
> + vc->vc_need_wrap = 0;
> }
>
> static inline void cr(struct vc_data *vc)
> {
> - pos -= x<<1;
> - need_wrap = x = 0;
> + vc->vc_pos -= vc->vc_x << 1;
> + vc->vc_need_wrap = vc->vc_x = 0;
> }
>
> static inline void bs(struct vc_data *vc)
> {
> - if (x) {
> - pos -= 2;
> - x--;
> - need_wrap = 0;
> + if (vc->vc_x) {
> + vc->vc_pos -= 2;
> + vc->vc_x--;
> + vc->vc_need_wrap = 0;
> }
> }
>
> @@ -1003,41 +1001,41 @@ static void csi_J(struct vc_data *vc, in
>
> switch (vpar) {
> case 0: /* erase from cursor to end of display */
> - count = (scr_end-pos)>>1;
> - start = (unsigned short *) pos;
> + count = (vc->vc_scr_end - vc->vc_pos) >> 1;
> + start = (unsigned short *)vc->vc_pos;
> if (DO_UPDATE(vc)) {
> /* do in two stages */
> - sw->con_clear(vc, y, x, 1,
> - vc->vc_cols - x);
> - sw->con_clear(vc, y + 1, 0,
> - vc->vc_rows - y - 1,
> + vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
> + vc->vc_cols - vc->vc_x);
> + vc->vc_sw->con_clear(vc, vc->vc_y + 1, 0,
> + vc->vc_rows - vc->vc_y - 1,
> vc->vc_cols);
> }
> break;
> case 1: /* erase from start to cursor */
> - count = ((pos-origin)>>1)+1;
> - start = (unsigned short *) origin;
> + count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1;
> + start = (unsigned short *)vc->vc_origin;
> if (DO_UPDATE(vc)) {
> /* do in two stages */
> - sw->con_clear(vc, 0, 0, y,
> + vc->vc_sw->con_clear(vc, 0, 0, vc->vc_y,
> vc->vc_cols);
> - sw->con_clear(vc, y, 0, 1,
> - x + 1);
> + vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
> + vc->vc_x + 1);
> }
> break;
> case 2: /* erase whole display */
> count = vc->vc_cols * vc->vc_rows;
> - start = (unsigned short *) origin;
> + start = (unsigned short *)vc->vc_origin;
> if (DO_UPDATE(vc))
> - sw->con_clear(vc, 0, 0,
> + vc->vc_sw->con_clear(vc, 0, 0,
> vc->vc_rows,
> vc->vc_cols);
> break;
> default:
> return;
> }
> - scr_memsetw(start, video_erase_char, 2*count);
> - need_wrap = 0;
> + scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
> + vc->vc_need_wrap = 0;
> }
>
> static void csi_K(struct vc_data *vc, int vpar)
> @@ -1047,31 +1045,31 @@ static void csi_K(struct vc_data *vc, in
>
> switch (vpar) {
> case 0: /* erase from cursor to end of line */
> - count = vc->vc_cols - x;
> - start = (unsigned short *) pos;
> + count = vc->vc_cols - vc->vc_x;
> + start = (unsigned short *)vc->vc_pos;
> if (DO_UPDATE(vc))
> - sw->con_clear(vc, y, x, 1,
> - vc->vc_cols - x);
> + vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
> + vc->vc_cols - vc->vc_x);
> break;
> case 1: /* erase from start of line to cursor */
> - start = (unsigned short *) (pos - (x<<1));
> - count = x+1;
> + start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
> + count = vc->vc_x + 1;
> if (DO_UPDATE(vc))
> - sw->con_clear(vc, y, 0, 1,
> - x + 1);
> + vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
> + vc->vc_x + 1);
> break;
> case 2: /* erase whole line */
> - start = (unsigned short *) (pos - (x<<1));
> + start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
> count = vc->vc_cols;
> if (DO_UPDATE(vc))
> - sw->con_clear(vc, y, 0, 1,
> + vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
> vc->vc_cols);
> break;
> default:
> return;
> }
> - scr_memsetw(start, video_erase_char, 2 * count);
> - need_wrap = 0;
> + scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
> + vc->vc_need_wrap = 0;
> }
>
> static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */
> @@ -1080,21 +1078,21 @@ static void csi_X(struct vc_data *vc, in
>
> if (!vpar)
> vpar++;
> - count = (vpar > vc->vc_cols - x) ? (vc->vc_cols - x) : vpar;
> + count = (vpar > vc->vc_cols - vc->vc_x) ? (vc->vc_cols - vc->vc_x) : vpar;
>
> - scr_memsetw((unsigned short *) pos, video_erase_char, 2 * count);
> + scr_memsetw((unsigned short *)vc->vc_pos, vc->vc_video_erase_char, 2 * count);
> if (DO_UPDATE(vc))
> - sw->con_clear(vc, y, x, 1, count);
> - need_wrap = 0;
> + vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1, count);
> + vc->vc_need_wrap = 0;
> }
>
> static void default_attr(struct vc_data *vc)
> {
> - intensity = 1;
> - underline = 0;
> - reverse = 0;
> - blink = 0;
> - color = def_color;
> + vc->vc_intensity = 1;
> + vc->vc_underline = 0;
> + vc->vc_reverse = 0;
> + vc->vc_blink = 0;
> + vc->vc_color = vc->vc_def_color;
> }
>
> /* console_sem is held */
> @@ -1102,92 +1100,92 @@ static void csi_m(struct vc_data *vc)
> {
> int i;
>
> - for (i=0;i<=npar;i++)
> - switch (par[i]) {
> + for (i = 0; i <= vc->vc_npar; i++)
> + switch (vc->vc_par[i]) {
> case 0: /* all attributes off */
> default_attr(vc);
> break;
> case 1:
> - intensity = 2;
> + vc->vc_intensity = 2;
> break;
> case 2:
> - intensity = 0;
> + vc->vc_intensity = 0;
> break;
> case 4:
> - underline = 1;
> + vc->vc_underline = 1;
> break;
> case 5:
> - blink = 1;
> + vc->vc_blink = 1;
> break;
> case 7:
> - reverse = 1;
> + vc->vc_reverse = 1;
> break;
> case 10: /* ANSI X3.64-1979 (SCO-ish?)
> * Select primary font, don't display
> * control chars if defined, don't set
> * bit 8 on output.
> */
> - translate = set_translate(charset == 0
> - ? G0_charset
> - : G1_charset, vc);
> - disp_ctrl = 0;
> - toggle_meta = 0;
> + vc->vc_translate = set_translate(vc->vc_charset == 0
> + ? vc->vc_G0_charset
> + : vc->vc_G1_charset, vc);
> + vc->vc_disp_ctrl = 0;
> + vc->vc_toggle_meta = 0;
> break;
> case 11: /* ANSI X3.64-1979 (SCO-ish?)
> * Select first alternate font, lets
> * chars < 32 be displayed as ROM chars.
> */
> - translate = set_translate(IBMPC_MAP, vc);
> - disp_ctrl = 1;
> - toggle_meta = 0;
> + vc->vc_translate = set_translate(IBMPC_MAP, vc);
> + vc->vc_disp_ctrl = 1;
> + vc->vc_toggle_meta = 0;
> break;
> case 12: /* ANSI X3.64-1979 (SCO-ish?)
> * Select second alternate font, toggle
> * high bit before displaying as ROM char.
> */
> - translate = set_translate(IBMPC_MAP, vc);
> - disp_ctrl = 1;
> - toggle_meta = 1;
> + vc->vc_translate = set_translate(IBMPC_MAP, vc);
> + vc->vc_disp_ctrl = 1;
> + vc->vc_toggle_meta = 1;
> break;
> case 21:
> case 22:
> - intensity = 1;
> + vc->vc_intensity = 1;
> break;
> case 24:
> - underline = 0;
> + vc->vc_underline = 0;
> break;
> case 25:
> - blink = 0;
> + vc->vc_blink = 0;
> break;
> case 27:
> - reverse = 0;
> + vc->vc_reverse = 0;
> break;
> case 38: /* ANSI X3.64-1979 (SCO-ish?)
> * Enables underscore, white foreground
> * with white underscore (Linux - use
> * default foreground).
> */
> - color = (def_color & 0x0f) | background;
> - underline = 1;
> + vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
> + vc->vc_underline = 1;
> break;
> case 39: /* ANSI X3.64-1979 (SCO-ish?)
> * Disable underline option.
> * Reset colour to default? It did this
> * before...
> */
> - color = (def_color & 0x0f) | background;
> - underline = 0;
> + vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
> + vc->vc_underline = 0;
> break;
> case 49:
> - color = (def_color & 0xf0) | foreground;
> + vc->vc_color = (vc->vc_def_color & 0xf0) | (vc->vc_color & 0x0f);
> break;
> default:
> - if (par[i] >= 30 && par[i] <= 37)
> - color = color_table[par[i]-30]
> - | background;
> - else if (par[i] >= 40 && par[i] <= 47)
> - color = (color_table[par[i]-40]<<4)
> - | foreground;
> + if (vc->vc_par[i] >= 30 && vc->vc_par[i] <= 37)
> + vc->vc_color = color_table[vc->vc_par[i] - 30]
> + | (vc->vc_color & 0xf0);
> + else if (vc->vc_par[i] >= 40 && vc->vc_par[i] <= 47)
> + vc->vc_color = (color_table[vc->vc_par[i] - 40] << 4)
> + | (vc->vc_color & 0x0f);
> break;
> }
> update_attr(vc);
> @@ -1206,7 +1204,7 @@ static void cursor_report(struct vc_data
> {
> char buf[40];
>
> - sprintf(buf, "\033[%d;%dR", y + (decom ? top+1 : 1), x+1);
> + sprintf(buf, "\033[%d;%dR", vc->vc_y + (vc->vc_decom ? vc->vc_top + 1 : 1), vc->vc_x + 1);
> respond_string(buf, tty);
> }
>
> @@ -1232,9 +1230,7 @@ void mouse_report(struct tty_struct *tty
> /* invoked via ioctl(TIOCLINUX) and through set_selection */
> int mouse_reporting(void)
> {
> - struct vc_data *vc = vc_cons[fg_console].d;
> -
> - return report_mouse;
> + return vc_cons[fg_console].d->vc_report_mouse;
> }
>
> /* console_sem is held */
> @@ -1242,8 +1238,9 @@ static void set_mode(struct vc_data *vc,
> {
> int i;
>
> - for (i=0; i<=npar; i++)
> - if (ques) switch(par[i]) { /* DEC private modes set/reset */
> + for (i = 0; i <= vc->vc_npar; i++)
> + if (vc->vc_ques) {
> + switch(vc->vc_par[i]) { /* DEC private modes set/reset */
> case 1: /* Cursor keys send ^[Ox/^[[x */
> if (on_off)
> set_kbd(vc, decckm);
> @@ -1251,7 +1248,7 @@ static void set_mode(struct vc_data *vc,
> clr_kbd(vc, decckm);
> break;
> case 3: /* 80/132 mode switch unimplemented */
> - deccolm = on_off;
> + vc->vc_deccolm = on_off;
> #if 0
> vc_resize(deccolm ? 132 : 80, vc->vc_rows);
> /* this alone does not suffice; some user mode
> @@ -1259,18 +1256,18 @@ static void set_mode(struct vc_data *vc,
> #endif
> break;
> case 5: /* Inverted screen on/off */
> - if (decscnm != on_off) {
> - decscnm = on_off;
> - invert_screen(vc, 0, screenbuf_size, 0);
> + if (vc->vc_decscnm != on_off) {
> + vc->vc_decscnm = on_off;
> + invert_screen(vc, 0, vc->vc_screenbuf_size, 0);
> update_attr(vc);
> }
> break;
> case 6: /* Origin relative/absolute */
> - decom = on_off;
> + vc->vc_decom = on_off;
> gotoxay(vc, 0, 0);
> break;
> case 7: /* Autowrap on/off */
> - decawm = on_off;
> + vc->vc_decawm = on_off;
> break;
> case 8: /* Autorepeat on/off */
> if (on_off)
> @@ -1279,20 +1276,22 @@ static void set_mode(struct vc_data *vc,
> clr_kbd(vc, decarm);
> break;
> case 9:
> - report_mouse = on_off ? 1 : 0;
> + vc->vc_report_mouse = on_off ? 1 : 0;
> break;
> case 25: /* Cursor on/off */
> - deccm = on_off;
> + vc->vc_deccm = on_off;
> break;
> case 1000:
> - report_mouse = on_off ? 2 : 0;
> + vc->vc_report_mouse = on_off ? 2 : 0;
> break;
> - } else switch(par[i]) { /* ANSI modes set/reset */
> + }
> + } else {
> + switch(vc->vc_par[i]) { /* ANSI modes set/reset */
> case 3: /* Monitor (display ctrls) */
> - disp_ctrl = on_off;
> + vc->vc_disp_ctrl = on_off;
> break;
> case 4: /* Insert Mode on/off */
> - decim = on_off;
> + vc->vc_decim = on_off;
> break;
> case 20: /* Lf, Enter == CrLf/Lf */
> if (on_off)
> @@ -1300,62 +1299,63 @@ static void set_mode(struct vc_data *vc,
> else
> clr_kbd(vc, lnm);
> break;
> + }
> }
> }
>
> /* console_sem is held */
> static void setterm_command(struct vc_data *vc)
> {
> - switch(par[0]) {
> + switch(vc->vc_par[0]) {
> case 1: /* set color for underline mode */
> if (vc->vc_can_do_color &&
> - par[1] < 16) {
> - ulcolor = color_table[par[1]];
> - if (underline)
> + vc->vc_par[1] < 16) {
> + vc->vc_ulcolor = color_table[vc->vc_par[1]];
> + if (vc->vc_underline)
> update_attr(vc);
> }
> break;
> case 2: /* set color for half intensity mode */
> if (vc->vc_can_do_color &&
> - par[1] < 16) {
> - halfcolor = color_table[par[1]];
> - if (intensity == 0)
> + vc->vc_par[1] < 16) {
> + vc->vc_halfcolor = color_table[vc->vc_par[1]];
> + if (vc->vc_intensity == 0)
> update_attr(vc);
> }
> break;
> case 8: /* store colors as defaults */
> - def_color = attr;
> - if (hi_font_mask == 0x100)
> - def_color >>= 1;
> + vc->vc_def_color = vc->vc_attr;
> + if (vc->vc_hi_font_mask == 0x100)
> + vc->vc_def_color >>= 1;
> default_attr(vc);
> update_attr(vc);
> break;
> case 9: /* set blanking interval */
> - blankinterval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
> + blankinterval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ;
> poke_blanked_console();
> break;
> case 10: /* set bell frequency in Hz */
> - if (npar >= 1)
> - bell_pitch = par[1];
> + if (vc->vc_npar >= 1)
> + vc->vc_bell_pitch = vc->vc_par[1];
> else
> - bell_pitch = DEFAULT_BELL_PITCH;
> + vc->vc_bell_pitch = DEFAULT_BELL_PITCH;
> break;
> case 11: /* set bell duration in msec */
> - if (npar >= 1)
> - bell_duration = (par[1] < 2000) ?
> - par[1]*HZ/1000 : 0;
> + if (vc->vc_npar >= 1)
> + vc->vc_bell_duration = (vc->vc_par[1] < 2000) ?
> + vc->vc_par[1] * HZ / 1000 : 0;
> else
> - bell_duration = DEFAULT_BELL_DURATION;
> + vc->vc_bell_duration = DEFAULT_BELL_DURATION;
> break;
> case 12: /* bring specified console to the front */
> - if (par[1] >= 1 && vc_cons_allocated(par[1]-1))
> - set_console(par[1] - 1);
> + if (vc->vc_par[1] >= 1 && vc_cons_allocated(vc->vc_par[1] - 1))
> + set_console(vc->vc_par[1] - 1);
> break;
> case 13: /* unblank the screen */
> poke_blanked_console();
> break;
> case 14: /* set vesa powerdown interval */
> - vesa_off_interval = ((par[1] < 60) ? par[1] : 60) * 60 * HZ;
> + vesa_off_interval = ((vc->vc_par[1] < 60) ? vc->vc_par[1] : 60) * 60 * HZ;
> break;
> case 15: /* activate the previous console */
> set_console(last_console);
> @@ -1366,8 +1366,8 @@ static void setterm_command(struct vc_da
> /* console_sem is held */
> static void csi_at(struct vc_data *vc, unsigned int nr)
> {
> - if (nr > vc->vc_cols - x)
> - nr = vc->vc_cols - x;
> + if (nr > vc->vc_cols - vc->vc_x)
> + nr = vc->vc_cols - vc->vc_x;
> else if (!nr)
> nr = 1;
> insert_char(vc, nr);
> @@ -1376,19 +1376,19 @@ static void csi_at(struct vc_data *vc, u
> /* console_sem is held */
> static void csi_L(struct vc_data *vc, unsigned int nr)
> {
> - if (nr > vc->vc_rows - y)
> - nr = vc->vc_rows - y;
> + if (nr > vc->vc_rows - vc->vc_y)
> + nr = vc->vc_rows - vc->vc_y;
> else if (!nr)
> nr = 1;
> - scrdown(vc, y, bottom, nr);
> - need_wrap = 0;
> + scrdown(vc, vc->vc_y, vc->vc_bottom, nr);
> + vc->vc_need_wrap = 0;
> }
>
> /* console_sem is held */
> static void csi_P(struct vc_data *vc, unsigned int nr)
> {
> - if (nr > vc->vc_cols - x)
> - nr = vc->vc_cols - x;
> + if (nr > vc->vc_cols - vc->vc_x)
> + nr = vc->vc_cols - vc->vc_x;
> else if (!nr)
> nr = 1;
> delete_char(vc, nr);
> @@ -1397,44 +1397,44 @@ static void csi_P(struct vc_data *vc, un
> /* console_sem is held */
> static void csi_M(struct vc_data *vc, unsigned int nr)
> {
> - if (nr > vc->vc_rows - y)
> - nr = vc->vc_rows - y;
> + if (nr > vc->vc_rows - vc->vc_y)
> + nr = vc->vc_rows - vc->vc_y;
> else if (!nr)
> nr=1;
> - scrup(vc, y, bottom, nr);
> - need_wrap = 0;
> + scrup(vc, vc->vc_y, vc->vc_bottom, nr);
> + vc->vc_need_wrap = 0;
> }
>
> /* console_sem is held (except via vc_init->reset_terminal */
> static void save_cur(struct vc_data *vc)
> {
> - saved_x = x;
> - saved_y = y;
> - s_intensity = intensity;
> - s_underline = underline;
> - s_blink = blink;
> - s_reverse = reverse;
> - s_charset = charset;
> - s_color = color;
> - saved_G0 = G0_charset;
> - saved_G1 = G1_charset;
> + vc->vc_saved_x = vc->vc_x;
> + vc->vc_saved_y = vc->vc_y;
> + vc->vc_s_intensity = vc->vc_intensity;
> + vc->vc_s_underline = vc->vc_underline;
> + vc->vc_s_blink = vc->vc_blink;
> + vc->vc_s_reverse = vc->vc_reverse;
> + vc->vc_s_charset = vc->vc_charset;
> + vc->vc_s_color = vc->vc_color;
> + vc->vc_saved_G0 = vc->vc_G0_charset;
> + vc->vc_saved_G1 = vc->vc_G1_charset;
> }
>
> /* console_sem is held */
> static void restore_cur(struct vc_data *vc)
> {
> - gotoxy(vc, saved_x, saved_y);
> - intensity = s_intensity;
> - underline = s_underline;
> - blink = s_blink;
> - reverse = s_reverse;
> - charset = s_charset;
> - color = s_color;
> - G0_charset = saved_G0;
> - G1_charset = saved_G1;
> - translate = set_translate(charset ? G1_charset : G0_charset, vc);
> + gotoxy(vc, vc->vc_saved_x, vc->vc_saved_y);
> + vc->vc_intensity = vc->vc_s_intensity;
> + vc->vc_underline = vc->vc_s_underline;
> + vc->vc_blink = vc->vc_s_blink;
> + vc->vc_reverse = vc->vc_s_reverse;
> + vc->vc_charset = vc->vc_s_charset;
> + vc->vc_color = vc->vc_s_color;
> + vc->vc_G0_charset = vc->vc_saved_G0;
> + vc->vc_G1_charset = vc->vc_saved_G1;
> + vc->vc_translate = set_translate(vc->vc_charset ? vc->vc_G1_charset : vc->vc_G0_charset, vc);
> update_attr(vc);
> - need_wrap = 0;
> + vc->vc_need_wrap = 0;
> }
>
> enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
> @@ -1444,27 +1444,27 @@ enum { ESnormal, ESesc, ESsquare, ESgetp
> /* console_sem is held (except via vc_init()) */
> static void reset_terminal(struct vc_data *vc, int do_clear)
> {
> - top = 0;
> - bottom = vc->vc_rows;
> - vc_state = ESnormal;
> - ques = 0;
> - translate = set_translate(LAT1_MAP, vc);
> - G0_charset = LAT1_MAP;
> - G1_charset = GRAF_MAP;
> - charset = 0;
> - need_wrap = 0;
> - report_mouse = 0;
> - utf = 0;
> - utf_count = 0;
> -
> - disp_ctrl = 0;
> - toggle_meta = 0;
> -
> - decscnm = 0;
> - decom = 0;
> - decawm = 1;
> - deccm = 1;
> - decim = 0;
> + vc->vc_top = 0;
> + vc->vc_bottom = vc->vc_rows;
> + vc->vc_state = ESnormal;
> + vc->vc_ques = 0;
> + vc->vc_translate = set_translate(LAT1_MAP, vc);
> + vc->vc_G0_charset = LAT1_MAP;
> + vc->vc_G1_charset = GRAF_MAP;
> + vc->vc_charset = 0;
> + vc->vc_need_wrap = 0;
> + vc->vc_report_mouse = 0;
> + vc->vc_utf = 0;
> + vc->vc_utf_count = 0;
> +
> + vc->vc_disp_ctrl = 0;
> + vc->vc_toggle_meta = 0;
> +
> + vc->vc_decscnm = 0;
> + vc->vc_decom = 0;
> + vc->vc_decawm = 1;
> + vc->vc_deccm = 1;
> + vc->vc_decim = 0;
>
> set_kbd(vc, decarm);
> clr_kbd(vc, decckm);
> @@ -1477,20 +1477,20 @@ static void reset_terminal(struct vc_dat
> /* do not do set_leds here because this causes an endless tasklet loop
> when the keyboard hasn't been initialized yet */
>
> - cursor_type = CUR_DEFAULT;
> - complement_mask = s_complement_mask;
> + vc->vc_cursor_type = CUR_DEFAULT;
> + vc->vc_complement_mask = vc->vc_s_complement_mask;
>
> default_attr(vc);
> update_attr(vc);
>
> - tab_stop[0] = 0x01010100;
> - tab_stop[1] =
> - tab_stop[2] =
> - tab_stop[3] =
> - tab_stop[4] = 0x01010101;
> + vc->vc_tab_stop[0] = 0x01010100;
> + vc->vc_tab_stop[1] =
> + vc->vc_tab_stop[2] =
> + vc->vc_tab_stop[3] =
> + vc->vc_tab_stop[4] = 0x01010101;
>
> - bell_pitch = DEFAULT_BELL_PITCH;
> - bell_duration = DEFAULT_BELL_DURATION;
> + vc->vc_bell_pitch = DEFAULT_BELL_PITCH;
> + vc->vc_bell_duration = DEFAULT_BELL_DURATION;
>
> gotoxy(vc, 0, 0);
> save_cur(vc);
> @@ -1509,20 +1509,20 @@ static void do_con_trol(struct tty_struc
> case 0:
> return;
> case 7:
> - if (bell_duration)
> - kd_mksound(bell_pitch, bell_duration);
> + if (vc->vc_bell_duration)
> + kd_mksound(vc->vc_bell_pitch, vc->vc_bell_duration);
> return;
> case 8:
> bs(vc);
> return;
> case 9:
> - pos -= (x << 1);
> - while (x < vc->vc_cols - 1) {
> - x++;
> - if (tab_stop[x >> 5] & (1 << (x & 31)))
> + vc->vc_pos -= (vc->vc_x << 1);
> + while (vc->vc_x < vc->vc_cols - 1) {
> + vc->vc_x++;
> + if (vc->vc_tab_stop[vc->vc_x >> 5] & (1 << (vc->vc_x & 31)))
> break;
> }
> - pos += (x << 1);
> + vc->vc_pos += (vc->vc_x << 1);
> return;
> case 10: case 11: case 12:
> lf(vc);
> @@ -1532,40 +1532,40 @@ static void do_con_trol(struct tty_struc
> cr(vc);
> return;
> case 14:
> - charset = 1;
> - translate = set_translate(G1_charset, vc);
> - disp_ctrl = 1;
> + vc->vc_charset = 1;
> + vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
> + vc->vc_disp_ctrl = 1;
> return;
> case 15:
> - charset = 0;
> - translate = set_translate(G0_charset, vc);
> - disp_ctrl = 0;
> + vc->vc_charset = 0;
> + vc->vc_translate = set_translate(vc->vc_G0_charset, vc);
> + vc->vc_disp_ctrl = 0;
> return;
> case 24: case 26:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> return;
> case 27:
> - vc_state = ESesc;
> + vc->vc_state = ESesc;
> return;
> case 127:
> del(vc);
> return;
> case 128+27:
> - vc_state = ESsquare;
> + vc->vc_state = ESsquare;
> return;
> }
> - switch(vc_state) {
> + switch(vc->vc_state) {
> case ESesc:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> switch (c) {
> case '[':
> - vc_state = ESsquare;
> + vc->vc_state = ESsquare;
> return;
> case ']':
> - vc_state = ESnonstd;
> + vc->vc_state = ESnonstd;
> return;
> case '%':
> - vc_state = ESpercent;
> + vc->vc_state = ESpercent;
> return;
> case 'E':
> cr(vc);
> @@ -1578,7 +1578,7 @@ static void do_con_trol(struct tty_struc
> lf(vc);
> return;
> case 'H':
> - tab_stop[x >> 5] |= (1 << (x & 31));
> + vc->vc_tab_stop[vc->vc_x >> 5] |= (1 << (vc->vc_x & 31));
> return;
> case 'Z':
> respond_ID(tty);
> @@ -1590,13 +1590,13 @@ static void do_con_trol(struct tty_struc
> restore_cur(vc);
> return;
> case '(':
> - vc_state = ESsetG0;
> + vc->vc_state = ESsetG0;
> return;
> case ')':
> - vc_state = ESsetG1;
> + vc->vc_state = ESsetG1;
> return;
> case '#':
> - vc_state = EShash;
> + vc->vc_state = EShash;
> return;
> case 'c':
> reset_terminal(vc, 1);
> @@ -1611,57 +1611,58 @@ static void do_con_trol(struct tty_struc
> return;
> case ESnonstd:
> if (c=='P') { /* palette escape sequence */
> - for (npar=0; npar<NPAR; npar++)
> - par[npar] = 0 ;
> - npar = 0 ;
> - vc_state = ESpalette;
> + for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++)
> + vc->vc_par[vc->vc_npar] = 0;
> + vc->vc_npar = 0;
> + vc->vc_state = ESpalette;
> return;
> } else if (c=='R') { /* reset palette */
> reset_palette(vc);
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> } else
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> return;
> case ESpalette:
> if ( (c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f') ) {
> - par[npar++] = (c>'9' ? (c&0xDF)-'A'+10 : c-'0') ;
> - if (npar==7) {
> - int i = par[0]*3, j = 1;
> - palette[i] = 16*par[j++];
> - palette[i++] += par[j++];
> - palette[i] = 16*par[j++];
> - palette[i++] += par[j++];
> - palette[i] = 16*par[j++];
> - palette[i] += par[j];
> + vc->vc_par[vc->vc_npar++] = (c > '9' ? (c & 0xDF) - 'A' + 10 : c - '0');
> + if (vc->vc_npar == 7) {
> + int i = vc->vc_par[0] * 3, j = 1;
> + vc->vc_palette[i] = 16 * vc->vc_par[j++];
> + vc->vc_palette[i++] += vc->vc_par[j++];
> + vc->vc_palette[i] = 16 * vc->vc_par[j++];
> + vc->vc_palette[i++] += vc->vc_par[j++];
> + vc->vc_palette[i] = 16 * vc->vc_par[j++];
> + vc->vc_palette[i] += vc->vc_par[j];
> set_palette(vc);
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> }
> } else
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> return;
> case ESsquare:
> - for(npar = 0 ; npar < NPAR ; npar++)
> - par[npar] = 0;
> - npar = 0;
> - vc_state = ESgetpars;
> + for (vc->vc_npar = 0; vc->vc_npar < NPAR; vc->vc_npar++)
> + vc->vc_par[vc->vc_npar] = 0;
> + vc->vc_npar = 0;
> + vc->vc_state = ESgetpars;
> if (c == '[') { /* Function key */
> - vc_state=ESfunckey;
> + vc->vc_state=ESfunckey;
> return;
> }
> - ques = (c=='?');
> - if (ques)
> + vc->vc_ques = (c == '?');
> + if (vc->vc_ques)
> return;
> case ESgetpars:
> - if (c==';' && npar<NPAR-1) {
> - npar++;
> + if (c == ';' && vc->vc_npar < NPAR - 1) {
> + vc->vc_npar++;
> return;
> } else if (c>='0' && c<='9') {
> - par[npar] *= 10;
> - par[npar] += c-'0';
> + vc->vc_par[vc->vc_npar] *= 10;
> + vc->vc_par[vc->vc_npar] += c - '0';
> return;
> - } else vc_state=ESgotpars;
> + } else
> + vc->vc_state = ESgotpars;
> case ESgotpars:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> switch(c) {
> case 'h':
> set_mode(vc, 1);
> @@ -1670,103 +1671,113 @@ static void do_con_trol(struct tty_struc
> set_mode(vc, 0);
> return;
> case 'c':
> - if (ques) {
> - if (par[0])
> - cursor_type = par[0] | (par[1]<<8) | (par[2]<<16);
> + if (vc->vc_ques) {
> + if (vc->vc_par[0])
> + vc->vc_cursor_type = vc->vc_par[0] | (vc->vc_par[1] << 8) | (vc->vc_par[2] << 16);
> else
> - cursor_type = CUR_DEFAULT;
> + vc->vc_cursor_type = CUR_DEFAULT;
> return;
> }
> break;
> case 'm':
> - if (ques) {
> + if (vc->vc_ques) {
> clear_selection();
> - if (par[0])
> - complement_mask = par[0]<<8 | par[1];
> + if (vc->vc_par[0])
> + vc->vc_complement_mask = vc->vc_par[0] << 8 | vc->vc_par[1];
> else
> - complement_mask = s_complement_mask;
> + vc->vc_complement_mask = vc->vc_s_complement_mask;
> return;
> }
> break;
> case 'n':
> - if (!ques) {
> - if (par[0] == 5)
> + if (!vc->vc_ques) {
> + if (vc->vc_par[0] == 5)
> status_report(tty);
> - else if (par[0] == 6)
> + else if (vc->vc_par[0] == 6)
> cursor_report(vc, tty);
> }
> return;
> }
> - if (ques) {
> - ques = 0;
> + if (vc->vc_ques) {
> + vc->vc_ques = 0;
> return;
> }
> switch(c) {
> case 'G': case '`':
> - if (par[0]) par[0]--;
> - gotoxy(vc, par[0], y);
> + if (vc->vc_par[0])
> + vc->vc_par[0]--;
> + gotoxy(vc, vc->vc_par[0], vc->vc_y);
> return;
> case 'A':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, x, y - par[0]);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, vc->vc_x, vc->vc_y - vc->vc_par[0]);
> return;
> case 'B': case 'e':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, x, y + par[0]);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, vc->vc_x, vc->vc_y + vc->vc_par[0]);
> return;
> case 'C': case 'a':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, x + par[0], y);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, vc->vc_x + vc->vc_par[0], vc->vc_y);
> return;
> case 'D':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, x - par[0], y);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, vc->vc_x - vc->vc_par[0], vc->vc_y);
> return;
> case 'E':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, 0, y + par[0]);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, 0, vc->vc_y + vc->vc_par[0]);
> return;
> case 'F':
> - if (!par[0]) par[0]++;
> - gotoxy(vc, 0, y - par[0]);
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + gotoxy(vc, 0, vc->vc_y - vc->vc_par[0]);
> return;
> case 'd':
> - if (par[0]) par[0]--;
> - gotoxay(vc, x, par[0]);
> + if (vc->vc_par[0])
> + vc->vc_par[0]--;
> + gotoxay(vc, vc->vc_x ,vc->vc_par[0]);
> return;
> case 'H': case 'f':
> - if (par[0]) par[0]--;
> - if (par[1]) par[1]--;
> - gotoxay(vc, par[1], par[0]);
> + if (vc->vc_par[0])
> + vc->vc_par[0]--;
> + if (vc->vc_par[1])
> + vc->vc_par[1]--;
> + gotoxay(vc, vc->vc_par[1], vc->vc_par[0]);
> return;
> case 'J':
> - csi_J(vc, par[0]);
> + csi_J(vc, vc->vc_par[0]);
> return;
> case 'K':
> - csi_K(vc, par[0]);
> + csi_K(vc, vc->vc_par[0]);
> return;
> case 'L':
> - csi_L(vc, par[0]);
> + csi_L(vc, vc->vc_par[0]);
> return;
> case 'M':
> - csi_M(vc, par[0]);
> + csi_M(vc, vc->vc_par[0]);
> return;
> case 'P':
> - csi_P(vc, par[0]);
> + csi_P(vc, vc->vc_par[0]);
> return;
> case 'c':
> - if (!par[0])
> + if (!vc->vc_par[0])
> respond_ID(tty);
> return;
> case 'g':
> - if (!par[0])
> - tab_stop[x >> 5] &= ~(1 << (x & 31));
> - else if (par[0] == 3) {
> - tab_stop[0] =
> - tab_stop[1] =
> - tab_stop[2] =
> - tab_stop[3] =
> - tab_stop[4] = 0;
> + if (!vc->vc_par[0])
> + vc->vc_tab_stop[vc->vc_x >> 5] &= ~(1 << (vc->vc_x & 31));
> + else if (vc->vc_par[0] == 3) {
> + vc->vc_tab_stop[0] =
> + vc->vc_tab_stop[1] =
> + vc->vc_tab_stop[2] =
> + vc->vc_tab_stop[3] =
> + vc->vc_tab_stop[4] = 0;
> }
> return;
> case 'm':
> @@ -1774,20 +1785,20 @@ static void do_con_trol(struct tty_struc
> return;
> case 'q': /* DECLL - but only 3 leds */
> /* map 0,1,2,3 to 0,1,2,4 */
> - if (par[0] < 4)
> + if (vc->vc_par[0] < 4)
> setledstate(kbd_table + vc->vc_num,
> - (par[0] < 3) ? par[0] : 4);
> + (vc->vc_par[0] < 3) ? vc->vc_par[0] : 4);
> return;
> case 'r':
> - if (!par[0])
> - par[0]++;
> - if (!par[1])
> - par[1] = vc->vc_rows;
> + if (!vc->vc_par[0])
> + vc->vc_par[0]++;
> + if (!vc->vc_par[1])
> + vc->vc_par[1] = vc->vc_rows;
> /* Minimum allowed region is 2 lines */
> - if (par[0] < par[1] &&
> - par[1] <= vc->vc_rows) {
> - top=par[0]-1;
> - bottom=par[1];
> + if (vc->vc_par[0] < vc->vc_par[1] &&
> + vc->vc_par[1] <= vc->vc_rows) {
> + vc->vc_top = vc->vc_par[0] - 1;
> + vc->vc_bottom = vc->vc_par[1];
> gotoxay(vc, 0, 0);
> }
> return;
> @@ -1798,10 +1809,10 @@ static void do_con_trol(struct tty_struc
> restore_cur(vc);
> return;
> case 'X':
> - csi_X(vc, par[0]);
> + csi_X(vc, vc->vc_par[0]);
> return;
> case '@':
> - csi_at(vc, par[0]);
> + csi_at(vc, vc->vc_par[0]);
> return;
> case ']': /* setterm functions */
> setterm_command(vc);
> @@ -1809,60 +1820,60 @@ static void do_con_trol(struct tty_struc
> }
> return;
> case ESpercent:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> switch (c) {
> case '@': /* defined in ISO 2022 */
> - utf = 0;
> + vc->vc_utf = 0;
> return;
> case 'G': /* prelim official escape code */
> case '8': /* retained for compatibility */
> - utf = 1;
> + vc->vc_utf = 1;
> return;
> }
> return;
> case ESfunckey:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> return;
> case EShash:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> if (c == '8') {
> /* DEC screen alignment test. kludge :-) */
> - video_erase_char =
> - (video_erase_char & 0xff00) | 'E';
> + vc->vc_video_erase_char =
> + (vc->vc_video_erase_char & 0xff00) | 'E';
> csi_J(vc, 2);
> - video_erase_char =
> - (video_erase_char & 0xff00) | ' ';
> - do_update_region(vc, origin, screenbuf_size / 2);
> + vc->vc_video_erase_char =
> + (vc->vc_video_erase_char & 0xff00) | ' ';
> + do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
> }
> return;
> case ESsetG0:
> if (c == '0')
> - G0_charset = GRAF_MAP;
> + vc->vc_G0_charset = GRAF_MAP;
> else if (c == 'B')
> - G0_charset = LAT1_MAP;
> + vc->vc_G0_charset = LAT1_MAP;
> else if (c == 'U')
> - G0_charset = IBMPC_MAP;
> + vc->vc_G0_charset = IBMPC_MAP;
> else if (c == 'K')
> - G0_charset = USER_MAP;
> - if (charset == 0)
> - translate = set_translate(G0_charset, vc);
> - vc_state = ESnormal;
> + vc->vc_G0_charset = USER_MAP;
> + if (vc->vc_charset == 0)
> + vc->vc_translate = set_translate(vc->vc_G0_charset, vc);
> + vc->vc_state = ESnormal;
> return;
> case ESsetG1:
> if (c == '0')
> - G1_charset = GRAF_MAP;
> + vc->vc_G1_charset = GRAF_MAP;
> else if (c == 'B')
> - G1_charset = LAT1_MAP;
> + vc->vc_G1_charset = LAT1_MAP;
> else if (c == 'U')
> - G1_charset = IBMPC_MAP;
> + vc->vc_G1_charset = IBMPC_MAP;
> else if (c == 'K')
> - G1_charset = USER_MAP;
> - if (charset == 1)
> - translate = set_translate(G1_charset, vc);
> - vc_state = ESnormal;
> + vc->vc_G1_charset = USER_MAP;
> + if (vc->vc_charset == 1)
> + vc->vc_translate = set_translate(vc->vc_G1_charset, vc);
> + vc->vc_state = ESnormal;
> return;
> default:
> - vc_state = ESnormal;
> + vc->vc_state = ESnormal;
> }
> }
>
> @@ -1885,7 +1896,7 @@ static int do_con_write(struct tty_struc
> #define FLUSH do { } while(0);
> #else
> #define FLUSH if (draw_x >= 0) { \
> - sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to-(u16 *)draw_from, y, draw_x); \
> + vc->vc_sw->con_putcs(vc, (u16 *)draw_from, (u16 *)draw_to - (u16 *)draw_from, vc->vc_y, draw_x); \
> draw_x = -1; \
> }
> #endif
> @@ -1945,7 +1956,7 @@ static int do_con_write(struct tty_struc
> goto out;
> }
>
> - himask = hi_font_mask;
> + himask = vc->vc_hi_font_mask;
> charmask = himask ? 0x1ff : 0xff;
>
> /* undraw cursor first */
> @@ -1960,44 +1971,44 @@ static int do_con_write(struct tty_struc
> count--;
>
> /* Do no translation at all in control states */
> - if (vc_state != ESnormal) {
> + if (vc->vc_state != ESnormal) {
> tc = c;
> - } else if (utf) {
> + } else if (vc->vc_utf) {
> /* Combine UTF-8 into Unicode */
> /* Incomplete characters silently ignored */
> if(c > 0x7f) {
> - if (utf_count > 0 && (c & 0xc0) == 0x80) {
> - utf_char = (utf_char << 6) | (c & 0x3f);
> - utf_count--;
> - if (utf_count == 0)
> - tc = c = utf_char;
> + if (vc->vc_utf_count > 0 && (c & 0xc0) == 0x80) {
> + vc->vc_utf_char = (vc->vc_utf_char << 6) | (c & 0x3f);
> + vc->vc_utf_count--;
> + if (vc->vc_utf_count == 0)
> + tc = c = vc->vc_utf_char;
> else continue;
> } else {
> if ((c & 0xe0) == 0xc0) {
> - utf_count = 1;
> - utf_char = (c & 0x1f);
> + vc->vc_utf_count = 1;
> + vc->vc_utf_char = (c & 0x1f);
> } else if ((c & 0xf0) == 0xe0) {
> - utf_count = 2;
> - utf_char = (c & 0x0f);
> + vc->vc_utf_count = 2;
> + vc->vc_utf_char = (c & 0x0f);
> } else if ((c & 0xf8) == 0xf0) {
> - utf_count = 3;
> - utf_char = (c & 0x07);
> + vc->vc_utf_count = 3;
> + vc->vc_utf_char = (c & 0x07);
> } else if ((c & 0xfc) == 0xf8) {
> - utf_count = 4;
> - utf_char = (c & 0x03);
> + vc->vc_utf_count = 4;
> + vc->vc_utf_char = (c & 0x03);
> } else if ((c & 0xfe) == 0xfc) {
> - utf_count = 5;
> - utf_char = (c & 0x01);
> + vc->vc_utf_count = 5;
> + vc->vc_utf_char = (c & 0x01);
> } else
> - utf_count = 0;
> + vc->vc_utf_count = 0;
> continue;
> }
> } else {
> tc = c;
> - utf_count = 0;
> + vc->vc_utf_count = 0;
> }
> } else { /* no utf */
> - tc = translate[toggle_meta ? (c|0x80) : c];
> + tc = vc->vc_translate[vc->vc_toggle_meta ? (c | 0x80) : c];
> }
>
> /* If the original code was a control character we
> @@ -2011,12 +2022,12 @@ static int do_con_write(struct tty_struc
> * direct-to-font zone in UTF-8 mode.
> */
> ok = tc && (c >= 32 ||
> - (!utf && !(((disp_ctrl ? CTRL_ALWAYS
> - : CTRL_ACTION) >> c) & 1)))
> - && (c != 127 || disp_ctrl)
> + (!vc->vc_utf && !(((vc->vc_disp_ctrl ? CTRL_ALWAYS
> + : CTRL_ACTION) >> c) & 1)))
> + && (c != 127 || vc->vc_disp_ctrl)
> && (c != 128+27);
>
> - if (vc_state == ESnormal && ok) {
> + if (vc->vc_state == ESnormal && ok) {
> /* Now try to find out how to display it */
> tc = conv_uni_to_pc(vc, tc);
> if ( tc == -4 ) {
> @@ -2036,28 +2047,28 @@ static int do_con_write(struct tty_struc
> if (tc & ~charmask)
> continue; /* Conversion failed */
>
> - if (need_wrap || decim)
> + if (vc->vc_need_wrap || vc->vc_decim)
> FLUSH
> - if (need_wrap) {
> + if (vc->vc_need_wrap) {
> cr(vc);
> lf(vc);
> }
> - if (decim)
> + if (vc->vc_decim)
> insert_char(vc, 1);
> scr_writew(himask ?
> - ((attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
> - (attr << 8) + tc,
> - (u16 *) pos);
> + ((vc->vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
> + (vc->vc_attr << 8) + tc,
> + (u16 *) vc->vc_pos);
> if (DO_UPDATE(vc) && draw_x < 0) {
> - draw_x = x;
> - draw_from = pos;
> + draw_x = vc->vc_x;
> + draw_from = vc->vc_pos;
> }
> - if (x == vc->vc_cols - 1) {
> - need_wrap = decawm;
> - draw_to = pos+2;
> + if (vc->vc_x == vc->vc_cols - 1) {
> + vc->vc_need_wrap = vc->vc_decawm;
> + draw_to = vc->vc_pos + 2;
> } else {
> - x++;
> - draw_to = (pos+=2);
> + vc->vc_x++;
> + draw_to = (vc->vc_pos += 2);
> }
> continue;
> }
> @@ -2104,8 +2115,8 @@ static void console_callback(void *ignor
> if (scrollback_delta) {
> struct vc_data *vc = vc_cons[fg_console].d;
> clear_selection();
> - if (vcmode == KD_TEXT)
> - sw->con_scrolldelta(vc, scrollback_delta);
> + if (vt_cons[vc->vc_num]->vc_mode == KD_TEXT)
> + vc->vc_sw->con_scrolldelta(vc, scrollback_delta);
> scrollback_delta = 0;
> }
> if (blank_timer_expired) {
> @@ -2150,7 +2161,7 @@ void vt_console_print(struct console *co
>
> /* read `x' only after setting currcons properly (otherwise
> the `x' macro will read the x of the foreground console). */
> - myx = x;
> + myx = vc->vc_x;
>
> if (!vc_cons_allocated(fg_console)) {
> /* impossible */
> @@ -2158,58 +2169,58 @@ void vt_console_print(struct console *co
> goto quit;
> }
>
> - if (vcmode != KD_TEXT)
> + if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> goto quit;
>
> /* undraw cursor first */
> if (vc->vc_num == fg_console)
> hide_cursor(vc);
>
> - start = (ushort *)pos;
> + start = (ushort *)vc->vc_pos;
>
> /* Contrived structure to try to emulate original need_wrap behaviour
> * Problems caused when we have need_wrap set on '\n' character */
> while (count--) {
> c = *b++;
> - if (c == 10 || c == 13 || c == 8 || need_wrap) {
> + if (c == 10 || c == 13 || c == 8 || vc->vc_need_wrap) {
> if (cnt > 0) {
> if (CON_IS_VISIBLE(vc))
> - sw->con_putcs(vc, start, cnt, y, x);
> - x += cnt;
> - if (need_wrap)
> - x--;
> + vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x);
> + vc->vc_x += cnt;
> + if (vc->vc_need_wrap)
> + vc->vc_x--;
> cnt = 0;
> }
> if (c == 8) { /* backspace */
> bs(vc);
> - start = (ushort *)pos;
> - myx = x;
> + start = (ushort *)vc->vc_pos;
> + myx = vc->vc_x;
> continue;
> }
> if (c != 13)
> lf(vc);
> cr(vc);
> - start = (ushort *)pos;
> - myx = x;
> + start = (ushort *)vc->vc_pos;
> + myx = vc->vc_x;
> if (c == 10 || c == 13)
> continue;
> }
> - scr_writew((attr << 8) + c, (unsigned short *) pos);
> + scr_writew((vc->vc_attr << 8) + c, (unsigned short *)vc->vc_pos);
> cnt++;
> if (myx == vc->vc_cols - 1) {
> - need_wrap = 1;
> + vc->vc_need_wrap = 1;
> continue;
> }
> - pos+=2;
> + vc->vc_pos += 2;
> myx++;
> }
> if (cnt > 0) {
> if (CON_IS_VISIBLE(vc))
> - sw->con_putcs(vc, start, cnt, y, x);
> - x += cnt;
> - if (x == vc->vc_cols) {
> - x--;
> - need_wrap = 1;
> + vc->vc_sw->con_putcs(vc, start, cnt, vc->vc_y, vc->vc_x);
> + vc->vc_x += cnt;
> + if (vc->vc_x == vc->vc_cols) {
> + vc->vc_x--;
> + vc->vc_need_wrap = 1;
> }
> }
> set_cursor(vc);
> @@ -2498,19 +2509,19 @@ static void vc_init(struct vc_data *vc,
> vc->vc_cols = cols;
> vc->vc_rows = rows;
> vc->vc_size_row = cols << 1;
> - screenbuf_size = vc->vc_rows * vc->vc_size_row;
> + vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row;
>
> set_origin(vc);
> - pos = origin;
> + vc->vc_pos = vc->vc_origin;
> reset_vc(vc);
> for (j=k=0; j<16; j++) {
> vc->vc_palette[k++] = default_red[j] ;
> vc->vc_palette[k++] = default_grn[j] ;
> vc->vc_palette[k++] = default_blu[j] ;
> }
> - def_color = 0x07; /* white */
> - ulcolor = 0x0f; /* bold white */
> - halfcolor = 0x08; /* grey */
> + vc->vc_def_color = 0x07; /* white */
> + vc->vc_ulcolor = 0x0f; /* bold white */
> + vc->vc_halfcolor = 0x08; /* grey */
> init_waitqueue_head(&vt_cons[vc->vc_num]->paste_wait);
> reset_terminal(vc, do_clear);
> }
> @@ -2554,16 +2565,16 @@ static int __init con_init(void)
> alloc_bootmem(sizeof(struct vt_struct));
> vc_cons[currcons].d->vc_vt = vt_cons[currcons];
> visual_init(vc, currcons, 1);
> - screenbuf = (unsigned short *) alloc_bootmem(screenbuf_size);
> - kmalloced = 0;
> + vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
> + vc->vc_kmalloced = 0;
> vc_init(vc, vc->vc_rows, vc->vc_cols,
> - currcons || !sw->con_save_screen);
> + currcons || !vc->vc_sw->con_save_screen);
> }
> currcons = fg_console = 0;
> master_display_fg = vc = vc_cons[currcons].d;
> set_origin(vc);
> save_screen(vc);
> - gotoxy(vc, x, y);
> + gotoxy(vc, vc->vc_x, vc->vc_y);
> csi_J(vc, 0);
> update_screen(vc);
> printk("Console: %s %s %dx%d",
> @@ -2677,10 +2688,10 @@ int take_over_console(const struct consw
> save_screen(vc);
> old_was_color = vc->vc_can_do_color;
> vc->vc_sw->con_deinit(vc);
> - origin = (unsigned long) screenbuf;
> - visible_origin = origin;
> - scr_end = origin + screenbuf_size;
> - pos = origin + vc->vc_size_row * y + 2 * x;
> + vc->vc_origin = (unsigned long)vc->vc_screenbuf;
> + vc->vc_visible_origin = vc->vc_origin;
> + vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size;
> + vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x;
> visual_init(vc, i, 0);
> update_attr(vc);
>
> @@ -2780,14 +2791,14 @@ void do_blank_screen(int entering_gfx)
> if (entering_gfx) {
> hide_cursor(vc);
> save_screen(vc);
> - sw->con_blank(vc, -1, 1);
> + vc->vc_sw->con_blank(vc, -1, 1);
> console_blanked = fg_console + 1;
> set_origin(vc);
> return;
> }
>
> /* don't blank graphics */
> - if (vcmode != KD_TEXT) {
> + if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT) {
> console_blanked = fg_console + 1;
> return;
> }
> @@ -2798,7 +2809,7 @@ void do_blank_screen(int entering_gfx)
>
> save_screen(vc);
> /* In case we need to reset origin, blanking hook returns 1 */
> - i = sw->con_blank(vc, 1, 0);
> + i = vc->vc_sw->con_blank(vc, 1, 0);
> console_blanked = fg_console + 1;
> if (i)
> set_origin(vc);
> @@ -2812,7 +2823,7 @@ void do_blank_screen(int entering_gfx)
> }
>
> if (vesa_blank_mode)
> - sw->con_blank(vc, vesa_blank_mode + 1, 0);
> + vc->vc_sw->con_blank(vc, vesa_blank_mode + 1, 0);
> }
> EXPORT_SYMBOL(do_blank_screen);
>
> @@ -2834,7 +2845,7 @@ void do_unblank_screen(int leaving_gfx)
> return;
> }
> vc = vc_cons[fg_console].d;
> - if (vcmode != KD_TEXT)
> + if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> return; /* but leave console_blanked != 0 */
>
> if (blankinterval) {
> @@ -2843,7 +2854,7 @@ void do_unblank_screen(int leaving_gfx)
> }
>
> console_blanked = 0;
> - if (sw->con_blank(vc, 0, leaving_gfx))
> + if (vc->vc_sw->con_blank(vc, 0, leaving_gfx))
> /* Low-level driver cannot restore -> do it ourselves */
> update_screen(vc);
> if (console_blank_hook)
> @@ -2903,8 +2914,8 @@ void set_palette(struct vc_data *vc)
> {
> WARN_CONSOLE_UNLOCKED();
>
> - if (vcmode != KD_GRAPHICS)
> - sw->con_set_palette(vc, color_table);
> + if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
> + vc->vc_sw->con_set_palette(vc, color_table);
> }
>
> static int set_get_cmap(unsigned char __user *arg, int set)
> @@ -2968,9 +2979,9 @@ void reset_palette(struct vc_data *vc)
> {
> int j, k;
> for (j=k=0; j<16; j++) {
> - palette[k++] = default_red[j];
> - palette[k++] = default_grn[j];
> - palette[k++] = default_blu[j];
> + vc->vc_palette[k++] = default_red[j];
> + vc->vc_palette[k++] = default_grn[j];
> + vc->vc_palette[k++] = default_blu[j];
> }
> set_palette(vc);
> }
> @@ -3007,8 +3018,8 @@ int con_font_get(struct vc_data *vc, str
> font.data = NULL;
>
> acquire_console_sem();
> - if (sw->con_font_get)
> - rc = sw->con_font_get(vc, &font);
> + if (vc->vc_sw->con_font_get)
> + rc = vc->vc_sw->con_font_get(vc, &font);
> else
> rc = -ENOSYS;
> release_console_sem();
> @@ -3093,8 +3104,8 @@ int con_font_set(struct vc_data *vc, str
> return -EFAULT;
> }
> acquire_console_sem();
> - if (sw->con_font_set)
> - rc = sw->con_font_set(vc, &font, op->flags);
> + if (vc->vc_sw->con_font_set)
> + rc = vc->vc_sw->con_font_set(vc, &font, op->flags);
> else
> rc = -ENOSYS;
> release_console_sem();
> @@ -3120,8 +3131,8 @@ int con_font_default(struct vc_data *vc,
> name[MAX_FONT_NAME - 1] = 0;
>
> acquire_console_sem();
> - if (sw->con_font_default)
> - rc = sw->con_font_default(vc, &font, s);
> + if (vc->vc_sw->con_font_default)
> + rc = vc->vc_sw->con_font_default(vc, &font, s);
> else
> rc = -ENOSYS;
> release_console_sem();
> @@ -3141,14 +3152,14 @@ int con_font_copy(struct vc_data *vc, st
> return -EINVAL;
>
> acquire_console_sem();
> - if (!sw->con_font_copy)
> + if (!vc->vc_sw->con_font_copy)
> rc = -ENOSYS;
> else if (con < 0 || !vc_cons_allocated(con))
> rc = -ENOTTY;
> else if (con == vc->vc_num) /* nothing to do */
> rc = 0;
> else
> - rc = sw->con_font_copy(vc, con);
> + rc = vc->vc_sw->con_font_copy(vc, con);
> release_console_sem();
> return rc;
> }
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 2/3] remove console_macros.h
2005-01-21 17:53 ` James Simmons
@ 2005-01-21 17:45 ` Randy.Dunlap
2005-01-21 17:59 ` Christoph Hellwig
1 sibling, 0 replies; 12+ messages in thread
From: Randy.Dunlap @ 2005-01-21 17:45 UTC (permalink / raw)
To: James Simmons
Cc: Roman Zippel, Christoph Hellwig, Andrew Morton, linux-kernel
James Simmons wrote:
> Now its starting to look like the linuxconsole project :-)
>
> On Sat, 15 Jan 2005, Roman Zippel wrote:
>
>
>>Hi,
>>
>>Remove the macros in console_macros.h and so make the structure references
>>explicit.
>>
>>Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
James,
It is possible to delete large parts of large emails when replying.....
--
~Randy
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] remove console_macros.h
2005-01-21 17:53 ` James Simmons
2005-01-21 17:45 ` Randy.Dunlap
@ 2005-01-21 17:59 ` Christoph Hellwig
2005-01-21 18:01 ` James Simmons
1 sibling, 1 reply; 12+ messages in thread
From: Christoph Hellwig @ 2005-01-21 17:59 UTC (permalink / raw)
To: James Simmons
Cc: Roman Zippel, Christoph Hellwig, Andrew Morton, linux-kernel
On Fri, Jan 21, 2005 at 05:53:35PM +0000, James Simmons wrote:
>
> Now its starting to look like the linuxconsole project :-)
Again, what's the linuxconsole project?
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 2/3] remove console_macros.h
2005-01-21 17:59 ` Christoph Hellwig
@ 2005-01-21 18:01 ` James Simmons
0 siblings, 0 replies; 12+ messages in thread
From: James Simmons @ 2005-01-21 18:01 UTC (permalink / raw)
To: Christoph Hellwig
Cc: James Simmons, Roman Zippel, Andrew Morton, linux-kernel
On Fri, 21 Jan 2005, Christoph Hellwig wrote:
> On Fri, Jan 21, 2005 at 05:53:35PM +0000, James Simmons wrote:
> >
> > Now its starting to look like the linuxconsole project :-)
>
> Again, what's the linuxconsole project?
Aka ruby. The multi-desktop project for linux. You can run more than one
workstation out of one PC.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/3] merge vt_struct into vc_data
2004-12-31 14:34 [PATCH] cleanup virtual console <-> selection.c interface Christoph Hellwig
2005-01-15 3:36 ` Roman Zippel
2005-01-15 3:40 ` [PATCH 2/3] remove console_macros.h Roman Zippel
@ 2005-01-15 3:41 ` Roman Zippel
2005-01-21 17:59 ` James Simmons
2 siblings, 1 reply; 12+ messages in thread
From: Roman Zippel @ 2005-01-15 3:41 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Andrew Morton, linux-kernel
Hi,
The vt_struct and vc_data are always allocated together, so there is no
need for a separate vt_struct structure.
Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
drivers/char/selection.c | 6 +-
drivers/char/vt.c | 86 ++++++++++++++-----------------------
drivers/char/vt_ioctl.c | 93 +++++++++++++++++------------------------
drivers/video/console/fbcon.c | 44 ++++++++-----------
drivers/video/console/sticon.c | 10 +---
drivers/video/sun3fb.c | 2
fs/compat_ioctl.c | 9 ++-
include/linux/console_struct.h | 7 ++-
include/linux/vt_kern.h | 9 ---
9 files changed, 111 insertions(+), 155 deletions(-)
Index: linux-2.6-vc/drivers/char/selection.c
===================================================================
--- linux-2.6-vc.orig/drivers/char/selection.c 2005-01-14 22:15:55.897857901 +0100
+++ linux-2.6-vc/drivers/char/selection.c 2005-01-14 22:18:36.155245213 +0100
@@ -275,7 +275,7 @@ int set_selection(const struct tiocl_sel
*/
int paste_selection(struct tty_struct *tty)
{
- struct vt_struct *vt = (struct vt_struct *) tty->driver_data;
+ struct vc_data *vc = (struct vc_data *)tty->driver_data;
int pasted = 0, count;
struct tty_ldisc *ld;
DECLARE_WAITQUEUE(wait, current);
@@ -286,7 +286,7 @@ int paste_selection(struct tty_struct *t
ld = tty_ldisc_ref_wait(tty);
- add_wait_queue(&vt->paste_wait, &wait);
+ add_wait_queue(&vc->paste_wait, &wait);
while (sel_buffer && sel_buffer_lth > pasted) {
set_current_state(TASK_INTERRUPTIBLE);
if (test_bit(TTY_THROTTLED, &tty->flags)) {
@@ -298,7 +298,7 @@ int paste_selection(struct tty_struct *t
tty->ldisc.receive_buf(tty, sel_buffer + pasted, NULL, count);
pasted += count;
}
- remove_wait_queue(&vt->paste_wait, &wait);
+ remove_wait_queue(&vc->paste_wait, &wait);
current->state = TASK_RUNNING;
tty_ldisc_deref(ld);
Index: linux-2.6-vc/drivers/char/vt.c
===================================================================
--- linux-2.6-vc.orig/drivers/char/vt.c 2005-01-14 22:16:13.448833821 +0100
+++ linux-2.6-vc/drivers/char/vt.c 2005-01-14 22:18:36.157244868 +0100
@@ -545,7 +545,7 @@ static void hide_cursor(struct vc_data *
static void set_cursor(struct vc_data *vc)
{
if (!vc->vc_num != fg_console || console_blanked ||
- vc->vc_vt->vc_mode == KD_GRAPHICS)
+ vc->vc_mode == KD_GRAPHICS)
return;
if (vc->vc_deccm) {
if (vc == sel_cons)
@@ -640,7 +640,7 @@ void redraw_screen(struct vc_data *vc, i
update_attr(vc);
clear_buffer_attributes(vc);
}
- if (update && vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
+ if (update && vc->vc_mode != KD_GRAPHICS)
do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
}
set_cursor(vc);
@@ -693,7 +693,6 @@ int vc_allocate(unsigned int currcons) /
return -ENXIO;
if (!vc_cons[currcons].d) {
struct vc_data *vc;
- long p, q;
/* prevent users from taking too much memory */
if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE))
@@ -705,24 +704,20 @@ int vc_allocate(unsigned int currcons) /
/* although the numbers above are not valid since long ago, the
point is still up-to-date and the comment still has its value
even if only as a historical artifact. --mj, July 1998 */
- p = (long) kmalloc(sizeof(struct vc_data) + sizeof(struct vt_struct), GFP_KERNEL);
- if (!p)
+ vc = kmalloc(sizeof(struct vc_data), GFP_KERNEL);
+ if (!vc)
return -ENOMEM;
- memset((void *)p, 0, sizeof(struct vc_data) + sizeof(struct vt_struct));
- vc_cons[currcons].d = vc = (struct vc_data *)p;
- vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
- vc_cons[currcons].d->vc_vt = vt_cons[currcons];
+ memset(vc, 0, sizeof(*vc));
+ vc_cons[currcons].d = vc;
visual_init(vc, currcons, 1);
if (!*vc->vc_uni_pagedir_loc)
con_set_default_unimap(vc);
- q = (long)kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
- if (!q) {
- kfree((char *) p);
+ vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
+ if (!vc->vc_screenbuf) {
+ kfree(vc);
vc_cons[currcons].d = NULL;
- vt_cons[currcons] = NULL;
return -ENOMEM;
}
- vc->vc_screenbuf = (unsigned short *)q;
vc->vc_kmalloced = 1;
vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
@@ -740,7 +735,7 @@ inline int resize_screen(struct vc_data
/* Resizes the resolution of the display adapater */
int err = 0;
- if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
+ if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
err = vc->vc_sw->con_resize(vc, width, height);
return err;
}
@@ -1904,7 +1899,6 @@ static int do_con_write(struct tty_struc
int c, tc, ok, n = 0, draw_x = -1;
unsigned int currcons;
unsigned long draw_from = 0, draw_to = 0;
- struct vt_struct *vt;
struct vc_data *vc;
u16 himask, charmask;
const unsigned char *orig_buf = NULL;
@@ -1916,14 +1910,14 @@ static int do_con_write(struct tty_struc
might_sleep();
acquire_console_sem();
- vt = tty->driver_data;
- if (vt == NULL) {
+ vc = tty->driver_data;
+ if (vc == NULL) {
printk(KERN_ERR "vt: argh, driver_data is NULL !\n");
release_console_sem();
return 0;
}
- currcons = vt->vc_num;
+ currcons = vc->vc_num;
if (!vc_cons_allocated(currcons)) {
/* could this happen? */
static int error = 0;
@@ -1934,7 +1928,6 @@ static int do_con_write(struct tty_struc
release_console_sem();
return 0;
}
- vc = vc_cons[currcons].d;
release_console_sem();
orig_buf = buf;
@@ -1949,8 +1942,8 @@ static int do_con_write(struct tty_struc
acquire_console_sem();
- vt = tty->driver_data;
- if (vt == NULL) {
+ vc = tty->driver_data;
+ if (vc == NULL) {
printk(KERN_ERR "vt: argh, driver_data _became_ NULL !\n");
release_console_sem();
goto out;
@@ -2115,7 +2108,7 @@ static void console_callback(void *ignor
if (scrollback_delta) {
struct vc_data *vc = vc_cons[fg_console].d;
clear_selection();
- if (vt_cons[vc->vc_num]->vc_mode == KD_TEXT)
+ if (vc->vc_mode == KD_TEXT)
vc->vc_sw->con_scrolldelta(vc, scrollback_delta);
scrollback_delta = 0;
}
@@ -2169,7 +2162,7 @@ void vt_console_print(struct console *co
goto quit;
}
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
goto quit;
/* undraw cursor first */
@@ -2390,9 +2383,9 @@ static void con_throttle(struct tty_stru
static void con_unthrottle(struct tty_struct *tty)
{
- struct vt_struct *vt = tty->driver_data;
+ struct vc_data *vc = tty->driver_data;
- wake_up_interruptible(&vt->paste_wait);
+ wake_up_interruptible(&vc->paste_wait);
}
/*
@@ -2427,16 +2420,16 @@ static void con_start(struct tty_struct
static void con_flush_chars(struct tty_struct *tty)
{
- struct vt_struct *vt;
+ struct vc_data *vc;
if (in_interrupt()) /* from flush_to_ldisc */
return;
/* if we race with con_close(), vt may be null */
acquire_console_sem();
- vt = tty->driver_data;
- if (vt)
- set_cursor(vc_cons[vt->vc_num].d);
+ vc = tty->driver_data;
+ if (vc)
+ set_cursor(vc);
release_console_sem();
}
@@ -2453,8 +2446,7 @@ static int con_open(struct tty_struct *t
ret = vc_allocate(currcons);
if (ret == 0) {
struct vc_data *vc = vc_cons[currcons].d;
- vt_cons[currcons]->vc_num = currcons;
- tty->driver_data = vt_cons[currcons];
+ tty->driver_data = vc;
vc->vc_tty = tty;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
@@ -2482,11 +2474,6 @@ static void con_close(struct tty_struct
down(&tty_sem);
acquire_console_sem();
if (tty && tty->count == 1) {
- struct vt_struct *vt;
-
- vt = tty->driver_data;
- if (vt)
- vc_cons[vt->vc_num].d->vc_tty = NULL;
tty->driver_data = NULL;
release_console_sem();
vcs_remove_devfs(tty);
@@ -2522,7 +2509,7 @@ static void vc_init(struct vc_data *vc,
vc->vc_def_color = 0x07; /* white */
vc->vc_ulcolor = 0x0f; /* bold white */
vc->vc_halfcolor = 0x08; /* grey */
- init_waitqueue_head(&vt_cons[vc->vc_num]->paste_wait);
+ init_waitqueue_head(&vc->paste_wait);
reset_terminal(vc, do_clear);
}
@@ -2559,11 +2546,7 @@ static int __init con_init(void)
* kmalloc is not running yet - we use the bootmem allocator.
*/
for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
- vc_cons[currcons].d = vc = (struct vc_data *)
- alloc_bootmem(sizeof(struct vc_data));
- vt_cons[currcons] = (struct vt_struct *)
- alloc_bootmem(sizeof(struct vt_struct));
- vc_cons[currcons].d->vc_vt = vt_cons[currcons];
+ vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));
visual_init(vc, currcons, 1);
vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
vc->vc_kmalloced = 0;
@@ -2798,7 +2781,7 @@ void do_blank_screen(int entering_gfx)
}
/* don't blank graphics */
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT) {
+ if (vc->vc_mode != KD_TEXT) {
console_blanked = fg_console + 1;
return;
}
@@ -2845,7 +2828,7 @@ void do_unblank_screen(int leaving_gfx)
return;
}
vc = vc_cons[fg_console].d;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
return; /* but leave console_blanked != 0 */
if (blankinterval) {
@@ -2896,7 +2879,7 @@ void poke_blanked_console(void)
del_timer(&console_timer);
blank_timer_expired = 0;
- if (ignore_poke || !vt_cons[fg_console] || vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
+ if (ignore_poke || !vc_cons[fg_console].d || vc_cons[fg_console].d->vc_mode == KD_GRAPHICS)
return;
if (console_blanked)
unblank_screen();
@@ -2914,7 +2897,7 @@ void set_palette(struct vc_data *vc)
{
WARN_CONSOLE_UNLOCKED();
- if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
+ if (vc->vc_mode != KD_GRAPHICS)
vc->vc_sw->con_set_palette(vc, color_table);
}
@@ -3007,7 +2990,7 @@ int con_font_get(struct vc_data *vc, str
int rc = -EINVAL;
int c;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
return -EINVAL;
if (op->data) {
@@ -3062,7 +3045,7 @@ int con_font_set(struct vc_data *vc, str
int rc = -EINVAL;
int size;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
return -EINVAL;
if (!op->data)
return -EINVAL;
@@ -3120,7 +3103,7 @@ int con_font_default(struct vc_data *vc,
char *s = name;
int rc;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
return -EINVAL;
if (!op->data)
@@ -3148,7 +3131,7 @@ int con_font_copy(struct vc_data *vc, st
int con = op->height;
int rc;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
+ if (vc->vc_mode != KD_TEXT)
return -EINVAL;
acquire_console_sem();
@@ -3260,7 +3243,6 @@ EXPORT_SYMBOL(vc_resize);
EXPORT_SYMBOL(fg_console);
EXPORT_SYMBOL(console_blank_hook);
EXPORT_SYMBOL(console_blanked);
-EXPORT_SYMBOL(vt_cons);
EXPORT_SYMBOL(vc_cons);
#ifndef VT_SINGLE_DRIVER
EXPORT_SYMBOL(take_over_console);
Index: linux-2.6-vc/drivers/char/vt_ioctl.c
===================================================================
--- linux-2.6-vc.orig/drivers/char/vt_ioctl.c 2005-01-14 22:15:55.896858073 +0100
+++ linux-2.6-vc/drivers/char/vt_ioctl.c 2005-01-14 22:18:36.158244696 +0100
@@ -52,8 +52,6 @@ extern struct tty_driver *console_driver
* to the current console is done by the main ioctl code.
*/
-struct vt_struct *vt_cons[MAX_NR_CONSOLES];
-
/* Keyboard type: Default is KB_101, but can be set by machine
* specific code.
*/
@@ -365,8 +363,7 @@ do_unimap_ioctl(int cmd, struct unimapde
int vt_ioctl(struct tty_struct *tty, struct file * file,
unsigned int cmd, unsigned long arg)
{
- struct vt_struct *vt = (struct vt_struct *)tty->driver_data;
- struct vc_data *vc = vc_cons[vt->vc_num].d;
+ struct vc_data *vc = (struct vc_data *)tty->driver_data;
struct console_font_op op; /* used in multiple places here */
struct kbd_struct * kbd;
unsigned int console;
@@ -374,7 +371,7 @@ int vt_ioctl(struct tty_struct *tty, str
void __user *up = (void __user *)arg;
int i, perm;
- console = vt->vc_num;
+ console = vc->vc_num;
if (!vc_cons_allocated(console)) /* impossible? */
return -ENOIOCTLCMD;
@@ -487,9 +484,9 @@ int vt_ioctl(struct tty_struct *tty, str
default:
return -EINVAL;
}
- if (vt_cons[console]->vc_mode == (unsigned char) arg)
+ if (vc->vc_mode == (unsigned char) arg)
return 0;
- vt_cons[console]->vc_mode = (unsigned char) arg;
+ vc->vc_mode = (unsigned char) arg;
if (console != fg_console)
return 0;
/*
@@ -504,7 +501,7 @@ int vt_ioctl(struct tty_struct *tty, str
return 0;
case KDGETMODE:
- ucval = vt_cons[console]->vc_mode;
+ ucval = vc->vc_mode;
goto setint;
case KDMAPDISP:
@@ -667,12 +664,12 @@ int vt_ioctl(struct tty_struct *tty, str
if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS)
return -EINVAL;
acquire_console_sem();
- vt_cons[console]->vt_mode = tmp;
+ vc->vt_mode = tmp;
/* the frsig is ignored, so we set it to 0 */
- vt_cons[console]->vt_mode.frsig = 0;
- vt_cons[console]->vt_pid = current->pid;
+ vc->vt_mode.frsig = 0;
+ vc->vt_pid = current->pid;
/* no switch is required -- saw@shade.msu.ru */
- vt_cons[console]->vt_newvt = -1;
+ vc->vt_newvt = -1;
release_console_sem();
return 0;
}
@@ -683,7 +680,7 @@ int vt_ioctl(struct tty_struct *tty, str
int rc;
acquire_console_sem();
- memcpy(&tmp, &vt_cons[console]->vt_mode, sizeof(struct vt_mode));
+ memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode));
release_console_sem();
rc = copy_to_user(up, &tmp, sizeof(struct vt_mode));
@@ -761,31 +758,29 @@ int vt_ioctl(struct tty_struct *tty, str
case VT_RELDISP:
if (!perm)
return -EPERM;
- if (vt_cons[console]->vt_mode.mode != VT_PROCESS)
+ if (vc->vt_mode.mode != VT_PROCESS)
return -EINVAL;
/*
* Switching-from response
*/
- if (vt_cons[console]->vt_newvt >= 0)
- {
+ if (vc->vt_newvt >= 0) {
if (arg == 0)
/*
* Switch disallowed, so forget we were trying
* to do it.
*/
- vt_cons[console]->vt_newvt = -1;
+ vc->vt_newvt = -1;
- else
- {
+ else {
/*
* The current vt has been released, so
* complete the switch.
*/
int newvt;
acquire_console_sem();
- newvt = vt_cons[console]->vt_newvt;
- vt_cons[console]->vt_newvt = -1;
+ newvt = vc->vt_newvt;
+ vc->vt_newvt = -1;
i = vc_allocate(newvt);
if (i) {
release_console_sem();
@@ -1057,17 +1052,15 @@ int vt_waitactive(int vt)
void reset_vc(struct vc_data *vc)
{
- struct vt_struct *vt = vt_cons[vc->vc_num];
-
- vt->vc_mode = KD_TEXT;
+ vc->vc_mode = KD_TEXT;
kbd_table[vc->vc_num].kbdmode = VC_XLATE;
- vt->vt_mode.mode = VT_AUTO;
- vt->vt_mode.waitv = 0;
- vt->vt_mode.relsig = 0;
- vt->vt_mode.acqsig = 0;
- vt->vt_mode.frsig = 0;
- vt->vt_pid = -1;
- vt->vt_newvt = -1;
+ vc->vt_mode.mode = VT_AUTO;
+ vc->vt_mode.waitv = 0;
+ vc->vt_mode.relsig = 0;
+ vc->vt_mode.acqsig = 0;
+ vc->vt_mode.frsig = 0;
+ vc->vt_pid = -1;
+ vc->vt_newvt = -1;
if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */
reset_palette(vc);
}
@@ -1077,7 +1070,6 @@ void reset_vc(struct vc_data *vc)
*/
void complete_change_console(struct vc_data *vc)
{
- unsigned int new_console = vc->vc_num;
unsigned char old_vc_mode;
last_console = fg_console;
@@ -1087,7 +1079,7 @@ void complete_change_console(struct vc_d
* KD_TEXT mode or vice versa, which means we need to blank or
* unblank the screen later.
*/
- old_vc_mode = vt_cons[fg_console]->vc_mode;
+ old_vc_mode = vc_cons[fg_console].d->vc_mode;
switch_screen(vc);
/*
@@ -1100,9 +1092,8 @@ void complete_change_console(struct vc_d
* To account for this we duplicate this code below only if the
* controlling process is gone and we've called reset_vc.
*/
- if (old_vc_mode != vt_cons[new_console]->vc_mode)
- {
- if (vt_cons[new_console]->vc_mode == KD_TEXT)
+ if (old_vc_mode != vc->vc_mode) {
+ if (vc->vc_mode == KD_TEXT)
do_unblank_screen(1);
else
do_blank_screen(1);
@@ -1113,17 +1104,13 @@ void complete_change_console(struct vc_d
* telling it that it has acquired. Also check if it has died and
* clean up (similar to logic employed in change_console())
*/
- if (vt_cons[new_console]->vt_mode.mode == VT_PROCESS)
- {
+ if (vc->vt_mode.mode == VT_PROCESS) {
/*
* Send the signal as privileged - kill_proc() will
* tell us if the process has gone or something else
* is awry
*/
- if (kill_proc(vt_cons[new_console]->vt_pid,
- vt_cons[new_console]->vt_mode.acqsig,
- 1) != 0)
- {
+ if (kill_proc(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) {
/*
* The controlling process has died, so we revert back to
* normal operation. In this case, we'll also change back
@@ -1135,9 +1122,8 @@ void complete_change_console(struct vc_d
*/
reset_vc(vc);
- if (old_vc_mode != vt_cons[new_console]->vc_mode)
- {
- if (vt_cons[new_console]->vc_mode == KD_TEXT)
+ if (old_vc_mode != vc->vc_mode) {
+ if (vc->vc_mode == KD_TEXT)
do_unblank_screen(1);
else
do_blank_screen(1);
@@ -1157,6 +1143,8 @@ void complete_change_console(struct vc_d
*/
void change_console(struct vc_data *new_vc)
{
+ struct vc_data *vc;
+
if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch)
return;
@@ -1175,23 +1163,20 @@ void change_console(struct vc_data *new_
* the user waits just the right amount of time :-) and revert the
* vt to auto control.
*/
- if (vt_cons[fg_console]->vt_mode.mode == VT_PROCESS)
- {
+ vc = vc_cons[fg_console].d;
+ if (vc->vt_mode.mode == VT_PROCESS) {
/*
* Send the signal as privileged - kill_proc() will
* tell us if the process has gone or something else
* is awry
*/
- if (kill_proc(vt_cons[fg_console]->vt_pid,
- vt_cons[fg_console]->vt_mode.relsig,
- 1) == 0)
- {
+ if (kill_proc(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) {
/*
* It worked. Mark the vt to switch to and
* return. The process needs to send us a
* VT_RELDISP ioctl to complete the switch.
*/
- vt_cons[fg_console]->vt_newvt = new_vc->vc_num;
+ vc->vt_newvt = new_vc->vc_num;
return;
}
@@ -1204,7 +1189,7 @@ void change_console(struct vc_data *new_
* this outside of VT_PROCESS but there is no single process
* to account for and tracking tty count may be undesirable.
*/
- reset_vc(vc_cons[fg_console].d);
+ reset_vc(vc);
/*
* Fall through to normal (VT_AUTO) handling of the switch...
@@ -1214,7 +1199,7 @@ void change_console(struct vc_data *new_
/*
* Ignore all switches in KD_GRAPHICS+VT_AUTO mode
*/
- if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
+ if (vc->vc_mode == KD_GRAPHICS)
return;
complete_change_console(new_vc);
Index: linux-2.6-vc/drivers/video/console/fbcon.c
===================================================================
--- linux-2.6-vc.orig/drivers/video/console/fbcon.c 2005-01-14 22:15:55.899857556 +0100
+++ linux-2.6-vc/drivers/video/console/fbcon.c 2005-01-14 22:18:36.159244523 +0100
@@ -203,7 +203,7 @@ static irqreturn_t fb_vbl_detect(int irq
static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
{
return (info->state != FBINFO_STATE_RUNNING ||
- vt_cons[vc->vc_num]->vc_mode != KD_TEXT);
+ vc->vc_mode != KD_TEXT);
}
static inline int get_color(struct vc_data *vc, struct fb_info *info,
@@ -456,7 +456,7 @@ static void fbcon_prepare_logo(struct vc
erase,
vc->vc_size_row * logo_lines);
- if (CON_IS_VISIBLE(vc) && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
+ if (CON_IS_VISIBLE(vc) && vc->vc_mode == KD_TEXT) {
fbcon_clear_margins(vc, 0);
update_screen(vc);
}
@@ -2209,7 +2209,7 @@ static int fbcon_do_set_font(struct vc_d
}
}
} else if (CON_IS_VISIBLE(vc)
- && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
+ && vc->vc_mode == KD_TEXT) {
fbcon_clear_margins(vc, 0);
update_screen(vc);
}
@@ -2436,7 +2436,7 @@ static int fbcon_scrolldelta(struct vc_d
if (softback_top) {
if (vc->vc_num != fg_console)
return 0;
- if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT || !lines)
+ if (vc->vc_mode != KD_TEXT || !lines)
return 0;
if (logo_shown >= 0) {
struct vc_data *conp2 = vc_cons[logo_shown].d;
@@ -2553,11 +2553,11 @@ static void fbcon_modechanged(struct fb_
struct display *p;
int rows, cols;
- if (!ops || ops->currcon < 0 || vt_cons[ops->currcon]->vc_mode !=
- KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info)
+ if (!ops || ops->currcon < 0)
return;
-
vc = vc_cons[ops->currcon].d;
+ if (vc->vc_mode != KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info)
+ return;
p = &fb_display[vc->vc_num];
@@ -2639,26 +2639,20 @@ static int fbcon_fb_registered(int idx)
static void fbcon_fb_blanked(struct fb_info *info, int blank)
{
struct fbcon_ops *ops = info->fbcon_par;
- int valid = 1;
-
- if (!ops || ops->currcon < 0 ||
- vt_cons[ops->currcon]->vc_mode != KD_TEXT ||
- registered_fb[con2fb_map[ops->currcon]] != info)
- valid = 0;
-
- if (valid) {
- struct vc_data *vc;
-
- vc = vc_cons[ops->currcon].d;
+ struct vc_data *vc;
- if (CON_IS_VISIBLE(vc)) {
- ops->blank_state = blank;
+ if (!ops || ops->currcon < 0)
+ return;
+ vc = vc_cons[ops->currcon].d;
+ if (vc->vc_mode == KD_TEXT &&
+ registered_fb[con2fb_map[ops->currcon]] == info &&
+ CON_IS_VISIBLE(vc)) {
+ ops->blank_state = blank;
- if (blank)
- do_blank_screen(0);
- else
- do_unblank_screen(0);
- }
+ if (blank)
+ do_blank_screen(0);
+ else
+ do_unblank_screen(0);
}
}
Index: linux-2.6-vc/drivers/video/console/sticon.c
===================================================================
--- linux-2.6-vc.orig/drivers/video/console/sticon.c 2005-01-14 22:15:55.901857212 +0100
+++ linux-2.6-vc/drivers/video/console/sticon.c 2005-01-14 22:18:36.159244523 +0100
@@ -87,13 +87,12 @@ static int sticon_set_palette(struct vc_
static void sticon_putc(struct vc_data *conp, int c, int ypos, int xpos)
{
- int unit = conp->vc_num;
int redraw_cursor = 0;
if (vga_is_gfx || console_blanked)
return;
-
- if (vt_cons[unit]->vc_mode != KD_TEXT)
+
+ if (conp->vc_mode != KD_TEXT)
return;
#if 0
if ((p->cursor_x == xpos) && (p->cursor_y == ypos)) {
@@ -111,15 +110,14 @@ static void sticon_putc(struct vc_data *
static void sticon_putcs(struct vc_data *conp, const unsigned short *s,
int count, int ypos, int xpos)
{
- int unit = conp->vc_num;
int redraw_cursor = 0;
if (vga_is_gfx || console_blanked)
return;
- if (vt_cons[unit]->vc_mode != KD_TEXT)
+ if (conp->vc_mode != KD_TEXT)
return;
-
+
#if 0
if ((p->cursor_y == ypos) && (xpos <= p->cursor_x) &&
(p->cursor_x < (xpos + count))) {
Index: linux-2.6-vc/drivers/video/sun3fb.c
===================================================================
--- linux-2.6-vc.orig/drivers/video/sun3fb.c 2005-01-14 22:12:13.401194838 +0100
+++ linux-2.6-vc/drivers/video/sun3fb.c 2005-01-14 22:18:36.160244351 +0100
@@ -505,7 +505,7 @@ void sun3fb_palette(int enter)
if (fb->restore_palette) {
if (enter)
fb->restore_palette(fb);
- else if (vt_cons[i]->vc_mode != KD_GRAPHICS)
+ else if (vc_cons[i].d->vc_mode != KD_GRAPHICS)
vc_cons[i].d->vc_sw->con_set_palette(vc_cons[i].d, color_table);
}
}
Index: linux-2.6-vc/fs/compat_ioctl.c
===================================================================
--- linux-2.6-vc.orig/fs/compat_ioctl.c 2005-01-14 22:15:55.903856867 +0100
+++ linux-2.6-vc/fs/compat_ioctl.c 2005-01-14 22:18:36.161244179 +0100
@@ -1650,7 +1650,7 @@ static int do_kdfontop_ioctl(unsigned in
struct console_font_op op;
struct console_font_op32 __user *fontop = compat_ptr(arg);
int perm = vt_check(file), i;
- struct vt_struct *vt;
+ struct vc_data *vc;
if (perm < 0) return perm;
@@ -1660,9 +1660,10 @@ static int do_kdfontop_ioctl(unsigned in
return -EPERM;
op.data = compat_ptr(((struct console_font_op32 *)&op)->data);
op.flags |= KD_FONT_FLAG_OLD;
- vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
- i = con_font_op(vc_cons[vt->vc_num].d, &op);
- if (i) return i;
+ vc = ((struct tty_struct *)file->private_data)->driver_data;
+ i = con_font_op(vc, &op);
+ if (i)
+ return i;
((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
if (copy_to_user(fontop, &op, sizeof(struct console_font_op32)))
return -EFAULT;
Index: linux-2.6-vc/include/linux/console_struct.h
===================================================================
--- linux-2.6-vc.orig/include/linux/console_struct.h 2005-01-14 22:12:13.401194838 +0100
+++ linux-2.6-vc/include/linux/console_struct.h 2005-01-14 22:18:36.161244179 +0100
@@ -26,6 +26,7 @@ struct vc_data {
const struct consw *vc_sw;
unsigned short *vc_screenbuf; /* In-memory character/attribute buffer */
unsigned int vc_screenbuf_size;
+ unsigned char vc_mode; /* KD_TEXT, ... */
/* attributes for all characters on screen */
unsigned char vc_attr; /* Current attributes */
unsigned char vc_def_color; /* Default colors */
@@ -48,6 +49,11 @@ struct vc_data {
unsigned int vc_state; /* Escape sequence parser state */
unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
struct tty_struct *vc_tty; /* TTY we are attached to */
+ /* data for manual vt switching */
+ struct vt_mode vt_mode;
+ int vt_pid;
+ int vt_newvt;
+ wait_queue_head_t paste_wait;
/* mode flags */
unsigned int vc_charset : 1; /* Character set G0 / G1 */
unsigned int vc_s_charset : 1; /* Saved character set */
@@ -89,7 +95,6 @@ struct vc_data {
struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */
unsigned long vc_uni_pagedir;
unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */
- struct vt_struct *vc_vt;
/* additional information is in vt_kern.h */
};
Index: linux-2.6-vc/include/linux/vt_kern.h
===================================================================
--- linux-2.6-vc.orig/include/linux/vt_kern.h 2005-01-14 22:15:55.895858245 +0100
+++ linux-2.6-vc/include/linux/vt_kern.h 2005-01-14 22:18:36.162244007 +0100
@@ -25,15 +25,6 @@
#define BROKEN_GRAPHICS_PROGRAMS 1
#endif
-extern struct vt_struct {
- int vc_num; /* The console number */
- unsigned char vc_mode; /* KD_TEXT, ... */
- struct vt_mode vt_mode;
- int vt_pid;
- int vt_newvt;
- wait_queue_head_t paste_wait;
-} *vt_cons[MAX_NR_CONSOLES];
-
extern void kd_mksound(unsigned int hz, unsigned int ticks);
extern int kbd_rate(struct kbd_repeat *rep);
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 3/3] merge vt_struct into vc_data
2005-01-15 3:41 ` [PATCH 3/3] merge vt_struct into vc_data Roman Zippel
@ 2005-01-21 17:59 ` James Simmons
2005-01-21 19:57 ` Roman Zippel
0 siblings, 1 reply; 12+ messages in thread
From: James Simmons @ 2005-01-21 17:59 UTC (permalink / raw)
To: Roman Zippel; +Cc: Christoph Hellwig, Andrew Morton, linux-kernel
Please don't remove strutc vt_struct. What should be done is that struct
vt_struct is used to hold the data that is shared amoung all the VCs. For
example struct consw. See we end up with something like this.
struct vt_struct {
const struct consw *vt_sw;
struct vc_data *vc_cons[MAX_NR_USER_CONSOLES];
}
This is key to future multi-desktop support which when I'm done with fbdev
work I will continue to work on and then introduce into the kernel. Mind
you alot more cleanup of the console code has to be done than this.
On Sat, 15 Jan 2005, Roman Zippel wrote:
> Hi,
>
> The vt_struct and vc_data are always allocated together, so there is no
> need for a separate vt_struct structure.
>
> Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
>
> drivers/char/selection.c | 6 +-
> drivers/char/vt.c | 86 ++++++++++++++-----------------------
> drivers/char/vt_ioctl.c | 93 +++++++++++++++++------------------------
> drivers/video/console/fbcon.c | 44 ++++++++-----------
> drivers/video/console/sticon.c | 10 +---
> drivers/video/sun3fb.c | 2
> fs/compat_ioctl.c | 9 ++-
> include/linux/console_struct.h | 7 ++-
> include/linux/vt_kern.h | 9 ---
> 9 files changed, 111 insertions(+), 155 deletions(-)
>
> Index: linux-2.6-vc/drivers/char/selection.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/char/selection.c 2005-01-14 22:15:55.897857901 +0100
> +++ linux-2.6-vc/drivers/char/selection.c 2005-01-14 22:18:36.155245213 +0100
> @@ -275,7 +275,7 @@ int set_selection(const struct tiocl_sel
> */
> int paste_selection(struct tty_struct *tty)
> {
> - struct vt_struct *vt = (struct vt_struct *) tty->driver_data;
> + struct vc_data *vc = (struct vc_data *)tty->driver_data;
> int pasted = 0, count;
> struct tty_ldisc *ld;
> DECLARE_WAITQUEUE(wait, current);
> @@ -286,7 +286,7 @@ int paste_selection(struct tty_struct *t
>
> ld = tty_ldisc_ref_wait(tty);
>
> - add_wait_queue(&vt->paste_wait, &wait);
> + add_wait_queue(&vc->paste_wait, &wait);
> while (sel_buffer && sel_buffer_lth > pasted) {
> set_current_state(TASK_INTERRUPTIBLE);
> if (test_bit(TTY_THROTTLED, &tty->flags)) {
> @@ -298,7 +298,7 @@ int paste_selection(struct tty_struct *t
> tty->ldisc.receive_buf(tty, sel_buffer + pasted, NULL, count);
> pasted += count;
> }
> - remove_wait_queue(&vt->paste_wait, &wait);
> + remove_wait_queue(&vc->paste_wait, &wait);
> current->state = TASK_RUNNING;
>
> tty_ldisc_deref(ld);
> Index: linux-2.6-vc/drivers/char/vt.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/char/vt.c 2005-01-14 22:16:13.448833821 +0100
> +++ linux-2.6-vc/drivers/char/vt.c 2005-01-14 22:18:36.157244868 +0100
> @@ -545,7 +545,7 @@ static void hide_cursor(struct vc_data *
> static void set_cursor(struct vc_data *vc)
> {
> if (!vc->vc_num != fg_console || console_blanked ||
> - vc->vc_vt->vc_mode == KD_GRAPHICS)
> + vc->vc_mode == KD_GRAPHICS)
> return;
> if (vc->vc_deccm) {
> if (vc == sel_cons)
> @@ -640,7 +640,7 @@ void redraw_screen(struct vc_data *vc, i
> update_attr(vc);
> clear_buffer_attributes(vc);
> }
> - if (update && vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
> + if (update && vc->vc_mode != KD_GRAPHICS)
> do_update_region(vc, vc->vc_origin, vc->vc_screenbuf_size / 2);
> }
> set_cursor(vc);
> @@ -693,7 +693,6 @@ int vc_allocate(unsigned int currcons) /
> return -ENXIO;
> if (!vc_cons[currcons].d) {
> struct vc_data *vc;
> - long p, q;
>
> /* prevent users from taking too much memory */
> if (currcons >= MAX_NR_USER_CONSOLES && !capable(CAP_SYS_RESOURCE))
> @@ -705,24 +704,20 @@ int vc_allocate(unsigned int currcons) /
> /* although the numbers above are not valid since long ago, the
> point is still up-to-date and the comment still has its value
> even if only as a historical artifact. --mj, July 1998 */
> - p = (long) kmalloc(sizeof(struct vc_data) + sizeof(struct vt_struct), GFP_KERNEL);
> - if (!p)
> + vc = kmalloc(sizeof(struct vc_data), GFP_KERNEL);
> + if (!vc)
> return -ENOMEM;
> - memset((void *)p, 0, sizeof(struct vc_data) + sizeof(struct vt_struct));
> - vc_cons[currcons].d = vc = (struct vc_data *)p;
> - vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data));
> - vc_cons[currcons].d->vc_vt = vt_cons[currcons];
> + memset(vc, 0, sizeof(*vc));
> + vc_cons[currcons].d = vc;
> visual_init(vc, currcons, 1);
> if (!*vc->vc_uni_pagedir_loc)
> con_set_default_unimap(vc);
> - q = (long)kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
> - if (!q) {
> - kfree((char *) p);
> + vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
> + if (!vc->vc_screenbuf) {
> + kfree(vc);
> vc_cons[currcons].d = NULL;
> - vt_cons[currcons] = NULL;
> return -ENOMEM;
> }
> - vc->vc_screenbuf = (unsigned short *)q;
> vc->vc_kmalloced = 1;
> vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
>
> @@ -740,7 +735,7 @@ inline int resize_screen(struct vc_data
> /* Resizes the resolution of the display adapater */
> int err = 0;
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
> + if (vc->vc_mode != KD_GRAPHICS && vc->vc_sw->con_resize)
> err = vc->vc_sw->con_resize(vc, width, height);
> return err;
> }
> @@ -1904,7 +1899,6 @@ static int do_con_write(struct tty_struc
> int c, tc, ok, n = 0, draw_x = -1;
> unsigned int currcons;
> unsigned long draw_from = 0, draw_to = 0;
> - struct vt_struct *vt;
> struct vc_data *vc;
> u16 himask, charmask;
> const unsigned char *orig_buf = NULL;
> @@ -1916,14 +1910,14 @@ static int do_con_write(struct tty_struc
> might_sleep();
>
> acquire_console_sem();
> - vt = tty->driver_data;
> - if (vt == NULL) {
> + vc = tty->driver_data;
> + if (vc == NULL) {
> printk(KERN_ERR "vt: argh, driver_data is NULL !\n");
> release_console_sem();
> return 0;
> }
>
> - currcons = vt->vc_num;
> + currcons = vc->vc_num;
> if (!vc_cons_allocated(currcons)) {
> /* could this happen? */
> static int error = 0;
> @@ -1934,7 +1928,6 @@ static int do_con_write(struct tty_struc
> release_console_sem();
> return 0;
> }
> - vc = vc_cons[currcons].d;
> release_console_sem();
>
> orig_buf = buf;
> @@ -1949,8 +1942,8 @@ static int do_con_write(struct tty_struc
>
> acquire_console_sem();
>
> - vt = tty->driver_data;
> - if (vt == NULL) {
> + vc = tty->driver_data;
> + if (vc == NULL) {
> printk(KERN_ERR "vt: argh, driver_data _became_ NULL !\n");
> release_console_sem();
> goto out;
> @@ -2115,7 +2108,7 @@ static void console_callback(void *ignor
> if (scrollback_delta) {
> struct vc_data *vc = vc_cons[fg_console].d;
> clear_selection();
> - if (vt_cons[vc->vc_num]->vc_mode == KD_TEXT)
> + if (vc->vc_mode == KD_TEXT)
> vc->vc_sw->con_scrolldelta(vc, scrollback_delta);
> scrollback_delta = 0;
> }
> @@ -2169,7 +2162,7 @@ void vt_console_print(struct console *co
> goto quit;
> }
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> goto quit;
>
> /* undraw cursor first */
> @@ -2390,9 +2383,9 @@ static void con_throttle(struct tty_stru
>
> static void con_unthrottle(struct tty_struct *tty)
> {
> - struct vt_struct *vt = tty->driver_data;
> + struct vc_data *vc = tty->driver_data;
>
> - wake_up_interruptible(&vt->paste_wait);
> + wake_up_interruptible(&vc->paste_wait);
> }
>
> /*
> @@ -2427,16 +2420,16 @@ static void con_start(struct tty_struct
>
> static void con_flush_chars(struct tty_struct *tty)
> {
> - struct vt_struct *vt;
> + struct vc_data *vc;
>
> if (in_interrupt()) /* from flush_to_ldisc */
> return;
>
> /* if we race with con_close(), vt may be null */
> acquire_console_sem();
> - vt = tty->driver_data;
> - if (vt)
> - set_cursor(vc_cons[vt->vc_num].d);
> + vc = tty->driver_data;
> + if (vc)
> + set_cursor(vc);
> release_console_sem();
> }
>
> @@ -2453,8 +2446,7 @@ static int con_open(struct tty_struct *t
> ret = vc_allocate(currcons);
> if (ret == 0) {
> struct vc_data *vc = vc_cons[currcons].d;
> - vt_cons[currcons]->vc_num = currcons;
> - tty->driver_data = vt_cons[currcons];
> + tty->driver_data = vc;
> vc->vc_tty = tty;
>
> if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
> @@ -2482,11 +2474,6 @@ static void con_close(struct tty_struct
> down(&tty_sem);
> acquire_console_sem();
> if (tty && tty->count == 1) {
> - struct vt_struct *vt;
> -
> - vt = tty->driver_data;
> - if (vt)
> - vc_cons[vt->vc_num].d->vc_tty = NULL;
> tty->driver_data = NULL;
> release_console_sem();
> vcs_remove_devfs(tty);
> @@ -2522,7 +2509,7 @@ static void vc_init(struct vc_data *vc,
> vc->vc_def_color = 0x07; /* white */
> vc->vc_ulcolor = 0x0f; /* bold white */
> vc->vc_halfcolor = 0x08; /* grey */
> - init_waitqueue_head(&vt_cons[vc->vc_num]->paste_wait);
> + init_waitqueue_head(&vc->paste_wait);
> reset_terminal(vc, do_clear);
> }
>
> @@ -2559,11 +2546,7 @@ static int __init con_init(void)
> * kmalloc is not running yet - we use the bootmem allocator.
> */
> for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
> - vc_cons[currcons].d = vc = (struct vc_data *)
> - alloc_bootmem(sizeof(struct vc_data));
> - vt_cons[currcons] = (struct vt_struct *)
> - alloc_bootmem(sizeof(struct vt_struct));
> - vc_cons[currcons].d->vc_vt = vt_cons[currcons];
> + vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));
> visual_init(vc, currcons, 1);
> vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
> vc->vc_kmalloced = 0;
> @@ -2798,7 +2781,7 @@ void do_blank_screen(int entering_gfx)
> }
>
> /* don't blank graphics */
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT) {
> + if (vc->vc_mode != KD_TEXT) {
> console_blanked = fg_console + 1;
> return;
> }
> @@ -2845,7 +2828,7 @@ void do_unblank_screen(int leaving_gfx)
> return;
> }
> vc = vc_cons[fg_console].d;
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> return; /* but leave console_blanked != 0 */
>
> if (blankinterval) {
> @@ -2896,7 +2879,7 @@ void poke_blanked_console(void)
> del_timer(&console_timer);
> blank_timer_expired = 0;
>
> - if (ignore_poke || !vt_cons[fg_console] || vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
> + if (ignore_poke || !vc_cons[fg_console].d || vc_cons[fg_console].d->vc_mode == KD_GRAPHICS)
> return;
> if (console_blanked)
> unblank_screen();
> @@ -2914,7 +2897,7 @@ void set_palette(struct vc_data *vc)
> {
> WARN_CONSOLE_UNLOCKED();
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_GRAPHICS)
> + if (vc->vc_mode != KD_GRAPHICS)
> vc->vc_sw->con_set_palette(vc, color_table);
> }
>
> @@ -3007,7 +2990,7 @@ int con_font_get(struct vc_data *vc, str
> int rc = -EINVAL;
> int c;
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> return -EINVAL;
>
> if (op->data) {
> @@ -3062,7 +3045,7 @@ int con_font_set(struct vc_data *vc, str
> int rc = -EINVAL;
> int size;
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> return -EINVAL;
> if (!op->data)
> return -EINVAL;
> @@ -3120,7 +3103,7 @@ int con_font_default(struct vc_data *vc,
> char *s = name;
> int rc;
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> return -EINVAL;
>
> if (!op->data)
> @@ -3148,7 +3131,7 @@ int con_font_copy(struct vc_data *vc, st
> int con = op->height;
> int rc;
>
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT)
> + if (vc->vc_mode != KD_TEXT)
> return -EINVAL;
>
> acquire_console_sem();
> @@ -3260,7 +3243,6 @@ EXPORT_SYMBOL(vc_resize);
> EXPORT_SYMBOL(fg_console);
> EXPORT_SYMBOL(console_blank_hook);
> EXPORT_SYMBOL(console_blanked);
> -EXPORT_SYMBOL(vt_cons);
> EXPORT_SYMBOL(vc_cons);
> #ifndef VT_SINGLE_DRIVER
> EXPORT_SYMBOL(take_over_console);
> Index: linux-2.6-vc/drivers/char/vt_ioctl.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/char/vt_ioctl.c 2005-01-14 22:15:55.896858073 +0100
> +++ linux-2.6-vc/drivers/char/vt_ioctl.c 2005-01-14 22:18:36.158244696 +0100
> @@ -52,8 +52,6 @@ extern struct tty_driver *console_driver
> * to the current console is done by the main ioctl code.
> */
>
> -struct vt_struct *vt_cons[MAX_NR_CONSOLES];
> -
> /* Keyboard type: Default is KB_101, but can be set by machine
> * specific code.
> */
> @@ -365,8 +363,7 @@ do_unimap_ioctl(int cmd, struct unimapde
> int vt_ioctl(struct tty_struct *tty, struct file * file,
> unsigned int cmd, unsigned long arg)
> {
> - struct vt_struct *vt = (struct vt_struct *)tty->driver_data;
> - struct vc_data *vc = vc_cons[vt->vc_num].d;
> + struct vc_data *vc = (struct vc_data *)tty->driver_data;
> struct console_font_op op; /* used in multiple places here */
> struct kbd_struct * kbd;
> unsigned int console;
> @@ -374,7 +371,7 @@ int vt_ioctl(struct tty_struct *tty, str
> void __user *up = (void __user *)arg;
> int i, perm;
>
> - console = vt->vc_num;
> + console = vc->vc_num;
>
> if (!vc_cons_allocated(console)) /* impossible? */
> return -ENOIOCTLCMD;
> @@ -487,9 +484,9 @@ int vt_ioctl(struct tty_struct *tty, str
> default:
> return -EINVAL;
> }
> - if (vt_cons[console]->vc_mode == (unsigned char) arg)
> + if (vc->vc_mode == (unsigned char) arg)
> return 0;
> - vt_cons[console]->vc_mode = (unsigned char) arg;
> + vc->vc_mode = (unsigned char) arg;
> if (console != fg_console)
> return 0;
> /*
> @@ -504,7 +501,7 @@ int vt_ioctl(struct tty_struct *tty, str
> return 0;
>
> case KDGETMODE:
> - ucval = vt_cons[console]->vc_mode;
> + ucval = vc->vc_mode;
> goto setint;
>
> case KDMAPDISP:
> @@ -667,12 +664,12 @@ int vt_ioctl(struct tty_struct *tty, str
> if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS)
> return -EINVAL;
> acquire_console_sem();
> - vt_cons[console]->vt_mode = tmp;
> + vc->vt_mode = tmp;
> /* the frsig is ignored, so we set it to 0 */
> - vt_cons[console]->vt_mode.frsig = 0;
> - vt_cons[console]->vt_pid = current->pid;
> + vc->vt_mode.frsig = 0;
> + vc->vt_pid = current->pid;
> /* no switch is required -- saw@shade.msu.ru */
> - vt_cons[console]->vt_newvt = -1;
> + vc->vt_newvt = -1;
> release_console_sem();
> return 0;
> }
> @@ -683,7 +680,7 @@ int vt_ioctl(struct tty_struct *tty, str
> int rc;
>
> acquire_console_sem();
> - memcpy(&tmp, &vt_cons[console]->vt_mode, sizeof(struct vt_mode));
> + memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode));
> release_console_sem();
>
> rc = copy_to_user(up, &tmp, sizeof(struct vt_mode));
> @@ -761,31 +758,29 @@ int vt_ioctl(struct tty_struct *tty, str
> case VT_RELDISP:
> if (!perm)
> return -EPERM;
> - if (vt_cons[console]->vt_mode.mode != VT_PROCESS)
> + if (vc->vt_mode.mode != VT_PROCESS)
> return -EINVAL;
>
> /*
> * Switching-from response
> */
> - if (vt_cons[console]->vt_newvt >= 0)
> - {
> + if (vc->vt_newvt >= 0) {
> if (arg == 0)
> /*
> * Switch disallowed, so forget we were trying
> * to do it.
> */
> - vt_cons[console]->vt_newvt = -1;
> + vc->vt_newvt = -1;
>
> - else
> - {
> + else {
> /*
> * The current vt has been released, so
> * complete the switch.
> */
> int newvt;
> acquire_console_sem();
> - newvt = vt_cons[console]->vt_newvt;
> - vt_cons[console]->vt_newvt = -1;
> + newvt = vc->vt_newvt;
> + vc->vt_newvt = -1;
> i = vc_allocate(newvt);
> if (i) {
> release_console_sem();
> @@ -1057,17 +1052,15 @@ int vt_waitactive(int vt)
>
> void reset_vc(struct vc_data *vc)
> {
> - struct vt_struct *vt = vt_cons[vc->vc_num];
> -
> - vt->vc_mode = KD_TEXT;
> + vc->vc_mode = KD_TEXT;
> kbd_table[vc->vc_num].kbdmode = VC_XLATE;
> - vt->vt_mode.mode = VT_AUTO;
> - vt->vt_mode.waitv = 0;
> - vt->vt_mode.relsig = 0;
> - vt->vt_mode.acqsig = 0;
> - vt->vt_mode.frsig = 0;
> - vt->vt_pid = -1;
> - vt->vt_newvt = -1;
> + vc->vt_mode.mode = VT_AUTO;
> + vc->vt_mode.waitv = 0;
> + vc->vt_mode.relsig = 0;
> + vc->vt_mode.acqsig = 0;
> + vc->vt_mode.frsig = 0;
> + vc->vt_pid = -1;
> + vc->vt_newvt = -1;
> if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */
> reset_palette(vc);
> }
> @@ -1077,7 +1070,6 @@ void reset_vc(struct vc_data *vc)
> */
> void complete_change_console(struct vc_data *vc)
> {
> - unsigned int new_console = vc->vc_num;
> unsigned char old_vc_mode;
>
> last_console = fg_console;
> @@ -1087,7 +1079,7 @@ void complete_change_console(struct vc_d
> * KD_TEXT mode or vice versa, which means we need to blank or
> * unblank the screen later.
> */
> - old_vc_mode = vt_cons[fg_console]->vc_mode;
> + old_vc_mode = vc_cons[fg_console].d->vc_mode;
> switch_screen(vc);
>
> /*
> @@ -1100,9 +1092,8 @@ void complete_change_console(struct vc_d
> * To account for this we duplicate this code below only if the
> * controlling process is gone and we've called reset_vc.
> */
> - if (old_vc_mode != vt_cons[new_console]->vc_mode)
> - {
> - if (vt_cons[new_console]->vc_mode == KD_TEXT)
> + if (old_vc_mode != vc->vc_mode) {
> + if (vc->vc_mode == KD_TEXT)
> do_unblank_screen(1);
> else
> do_blank_screen(1);
> @@ -1113,17 +1104,13 @@ void complete_change_console(struct vc_d
> * telling it that it has acquired. Also check if it has died and
> * clean up (similar to logic employed in change_console())
> */
> - if (vt_cons[new_console]->vt_mode.mode == VT_PROCESS)
> - {
> + if (vc->vt_mode.mode == VT_PROCESS) {
> /*
> * Send the signal as privileged - kill_proc() will
> * tell us if the process has gone or something else
> * is awry
> */
> - if (kill_proc(vt_cons[new_console]->vt_pid,
> - vt_cons[new_console]->vt_mode.acqsig,
> - 1) != 0)
> - {
> + if (kill_proc(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) {
> /*
> * The controlling process has died, so we revert back to
> * normal operation. In this case, we'll also change back
> @@ -1135,9 +1122,8 @@ void complete_change_console(struct vc_d
> */
> reset_vc(vc);
>
> - if (old_vc_mode != vt_cons[new_console]->vc_mode)
> - {
> - if (vt_cons[new_console]->vc_mode == KD_TEXT)
> + if (old_vc_mode != vc->vc_mode) {
> + if (vc->vc_mode == KD_TEXT)
> do_unblank_screen(1);
> else
> do_blank_screen(1);
> @@ -1157,6 +1143,8 @@ void complete_change_console(struct vc_d
> */
> void change_console(struct vc_data *new_vc)
> {
> + struct vc_data *vc;
> +
> if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch)
> return;
>
> @@ -1175,23 +1163,20 @@ void change_console(struct vc_data *new_
> * the user waits just the right amount of time :-) and revert the
> * vt to auto control.
> */
> - if (vt_cons[fg_console]->vt_mode.mode == VT_PROCESS)
> - {
> + vc = vc_cons[fg_console].d;
> + if (vc->vt_mode.mode == VT_PROCESS) {
> /*
> * Send the signal as privileged - kill_proc() will
> * tell us if the process has gone or something else
> * is awry
> */
> - if (kill_proc(vt_cons[fg_console]->vt_pid,
> - vt_cons[fg_console]->vt_mode.relsig,
> - 1) == 0)
> - {
> + if (kill_proc(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) {
> /*
> * It worked. Mark the vt to switch to and
> * return. The process needs to send us a
> * VT_RELDISP ioctl to complete the switch.
> */
> - vt_cons[fg_console]->vt_newvt = new_vc->vc_num;
> + vc->vt_newvt = new_vc->vc_num;
> return;
> }
>
> @@ -1204,7 +1189,7 @@ void change_console(struct vc_data *new_
> * this outside of VT_PROCESS but there is no single process
> * to account for and tracking tty count may be undesirable.
> */
> - reset_vc(vc_cons[fg_console].d);
> + reset_vc(vc);
>
> /*
> * Fall through to normal (VT_AUTO) handling of the switch...
> @@ -1214,7 +1199,7 @@ void change_console(struct vc_data *new_
> /*
> * Ignore all switches in KD_GRAPHICS+VT_AUTO mode
> */
> - if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
> + if (vc->vc_mode == KD_GRAPHICS)
> return;
>
> complete_change_console(new_vc);
> Index: linux-2.6-vc/drivers/video/console/fbcon.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/video/console/fbcon.c 2005-01-14 22:15:55.899857556 +0100
> +++ linux-2.6-vc/drivers/video/console/fbcon.c 2005-01-14 22:18:36.159244523 +0100
> @@ -203,7 +203,7 @@ static irqreturn_t fb_vbl_detect(int irq
> static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
> {
> return (info->state != FBINFO_STATE_RUNNING ||
> - vt_cons[vc->vc_num]->vc_mode != KD_TEXT);
> + vc->vc_mode != KD_TEXT);
> }
>
> static inline int get_color(struct vc_data *vc, struct fb_info *info,
> @@ -456,7 +456,7 @@ static void fbcon_prepare_logo(struct vc
> erase,
> vc->vc_size_row * logo_lines);
>
> - if (CON_IS_VISIBLE(vc) && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
> + if (CON_IS_VISIBLE(vc) && vc->vc_mode == KD_TEXT) {
> fbcon_clear_margins(vc, 0);
> update_screen(vc);
> }
> @@ -2209,7 +2209,7 @@ static int fbcon_do_set_font(struct vc_d
> }
> }
> } else if (CON_IS_VISIBLE(vc)
> - && vt_cons[vc->vc_num]->vc_mode == KD_TEXT) {
> + && vc->vc_mode == KD_TEXT) {
> fbcon_clear_margins(vc, 0);
> update_screen(vc);
> }
> @@ -2436,7 +2436,7 @@ static int fbcon_scrolldelta(struct vc_d
> if (softback_top) {
> if (vc->vc_num != fg_console)
> return 0;
> - if (vt_cons[vc->vc_num]->vc_mode != KD_TEXT || !lines)
> + if (vc->vc_mode != KD_TEXT || !lines)
> return 0;
> if (logo_shown >= 0) {
> struct vc_data *conp2 = vc_cons[logo_shown].d;
> @@ -2553,11 +2553,11 @@ static void fbcon_modechanged(struct fb_
> struct display *p;
> int rows, cols;
>
> - if (!ops || ops->currcon < 0 || vt_cons[ops->currcon]->vc_mode !=
> - KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info)
> + if (!ops || ops->currcon < 0)
> return;
> -
> vc = vc_cons[ops->currcon].d;
> + if (vc->vc_mode != KD_TEXT || registered_fb[con2fb_map[ops->currcon]] != info)
> + return;
>
> p = &fb_display[vc->vc_num];
>
> @@ -2639,26 +2639,20 @@ static int fbcon_fb_registered(int idx)
> static void fbcon_fb_blanked(struct fb_info *info, int blank)
> {
> struct fbcon_ops *ops = info->fbcon_par;
> - int valid = 1;
> -
> - if (!ops || ops->currcon < 0 ||
> - vt_cons[ops->currcon]->vc_mode != KD_TEXT ||
> - registered_fb[con2fb_map[ops->currcon]] != info)
> - valid = 0;
> -
> - if (valid) {
> - struct vc_data *vc;
> -
> - vc = vc_cons[ops->currcon].d;
> + struct vc_data *vc;
>
> - if (CON_IS_VISIBLE(vc)) {
> - ops->blank_state = blank;
> + if (!ops || ops->currcon < 0)
> + return;
> + vc = vc_cons[ops->currcon].d;
> + if (vc->vc_mode == KD_TEXT &&
> + registered_fb[con2fb_map[ops->currcon]] == info &&
> + CON_IS_VISIBLE(vc)) {
> + ops->blank_state = blank;
>
> - if (blank)
> - do_blank_screen(0);
> - else
> - do_unblank_screen(0);
> - }
> + if (blank)
> + do_blank_screen(0);
> + else
> + do_unblank_screen(0);
> }
> }
>
> Index: linux-2.6-vc/drivers/video/console/sticon.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/video/console/sticon.c 2005-01-14 22:15:55.901857212 +0100
> +++ linux-2.6-vc/drivers/video/console/sticon.c 2005-01-14 22:18:36.159244523 +0100
> @@ -87,13 +87,12 @@ static int sticon_set_palette(struct vc_
>
> static void sticon_putc(struct vc_data *conp, int c, int ypos, int xpos)
> {
> - int unit = conp->vc_num;
> int redraw_cursor = 0;
>
> if (vga_is_gfx || console_blanked)
> return;
> -
> - if (vt_cons[unit]->vc_mode != KD_TEXT)
> +
> + if (conp->vc_mode != KD_TEXT)
> return;
> #if 0
> if ((p->cursor_x == xpos) && (p->cursor_y == ypos)) {
> @@ -111,15 +110,14 @@ static void sticon_putc(struct vc_data *
> static void sticon_putcs(struct vc_data *conp, const unsigned short *s,
> int count, int ypos, int xpos)
> {
> - int unit = conp->vc_num;
> int redraw_cursor = 0;
>
> if (vga_is_gfx || console_blanked)
> return;
>
> - if (vt_cons[unit]->vc_mode != KD_TEXT)
> + if (conp->vc_mode != KD_TEXT)
> return;
> -
> +
> #if 0
> if ((p->cursor_y == ypos) && (xpos <= p->cursor_x) &&
> (p->cursor_x < (xpos + count))) {
> Index: linux-2.6-vc/drivers/video/sun3fb.c
> ===================================================================
> --- linux-2.6-vc.orig/drivers/video/sun3fb.c 2005-01-14 22:12:13.401194838 +0100
> +++ linux-2.6-vc/drivers/video/sun3fb.c 2005-01-14 22:18:36.160244351 +0100
> @@ -505,7 +505,7 @@ void sun3fb_palette(int enter)
> if (fb->restore_palette) {
> if (enter)
> fb->restore_palette(fb);
> - else if (vt_cons[i]->vc_mode != KD_GRAPHICS)
> + else if (vc_cons[i].d->vc_mode != KD_GRAPHICS)
> vc_cons[i].d->vc_sw->con_set_palette(vc_cons[i].d, color_table);
> }
> }
> Index: linux-2.6-vc/fs/compat_ioctl.c
> ===================================================================
> --- linux-2.6-vc.orig/fs/compat_ioctl.c 2005-01-14 22:15:55.903856867 +0100
> +++ linux-2.6-vc/fs/compat_ioctl.c 2005-01-14 22:18:36.161244179 +0100
> @@ -1650,7 +1650,7 @@ static int do_kdfontop_ioctl(unsigned in
> struct console_font_op op;
> struct console_font_op32 __user *fontop = compat_ptr(arg);
> int perm = vt_check(file), i;
> - struct vt_struct *vt;
> + struct vc_data *vc;
>
> if (perm < 0) return perm;
>
> @@ -1660,9 +1660,10 @@ static int do_kdfontop_ioctl(unsigned in
> return -EPERM;
> op.data = compat_ptr(((struct console_font_op32 *)&op)->data);
> op.flags |= KD_FONT_FLAG_OLD;
> - vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data;
> - i = con_font_op(vc_cons[vt->vc_num].d, &op);
> - if (i) return i;
> + vc = ((struct tty_struct *)file->private_data)->driver_data;
> + i = con_font_op(vc, &op);
> + if (i)
> + return i;
> ((struct console_font_op32 *)&op)->data = (unsigned long)op.data;
> if (copy_to_user(fontop, &op, sizeof(struct console_font_op32)))
> return -EFAULT;
> Index: linux-2.6-vc/include/linux/console_struct.h
> ===================================================================
> --- linux-2.6-vc.orig/include/linux/console_struct.h 2005-01-14 22:12:13.401194838 +0100
> +++ linux-2.6-vc/include/linux/console_struct.h 2005-01-14 22:18:36.161244179 +0100
> @@ -26,6 +26,7 @@ struct vc_data {
> const struct consw *vc_sw;
> unsigned short *vc_screenbuf; /* In-memory character/attribute buffer */
> unsigned int vc_screenbuf_size;
> + unsigned char vc_mode; /* KD_TEXT, ... */
> /* attributes for all characters on screen */
> unsigned char vc_attr; /* Current attributes */
> unsigned char vc_def_color; /* Default colors */
> @@ -48,6 +49,11 @@ struct vc_data {
> unsigned int vc_state; /* Escape sequence parser state */
> unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
> struct tty_struct *vc_tty; /* TTY we are attached to */
> + /* data for manual vt switching */
> + struct vt_mode vt_mode;
> + int vt_pid;
> + int vt_newvt;
> + wait_queue_head_t paste_wait;
> /* mode flags */
> unsigned int vc_charset : 1; /* Character set G0 / G1 */
> unsigned int vc_s_charset : 1; /* Saved character set */
> @@ -89,7 +95,6 @@ struct vc_data {
> struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */
> unsigned long vc_uni_pagedir;
> unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */
> - struct vt_struct *vc_vt;
> /* additional information is in vt_kern.h */
> };
>
> Index: linux-2.6-vc/include/linux/vt_kern.h
> ===================================================================
> --- linux-2.6-vc.orig/include/linux/vt_kern.h 2005-01-14 22:15:55.895858245 +0100
> +++ linux-2.6-vc/include/linux/vt_kern.h 2005-01-14 22:18:36.162244007 +0100
> @@ -25,15 +25,6 @@
> #define BROKEN_GRAPHICS_PROGRAMS 1
> #endif
>
> -extern struct vt_struct {
> - int vc_num; /* The console number */
> - unsigned char vc_mode; /* KD_TEXT, ... */
> - struct vt_mode vt_mode;
> - int vt_pid;
> - int vt_newvt;
> - wait_queue_head_t paste_wait;
> -} *vt_cons[MAX_NR_CONSOLES];
> -
> extern void kd_mksound(unsigned int hz, unsigned int ticks);
> extern int kbd_rate(struct kbd_repeat *rep);
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 3/3] merge vt_struct into vc_data
2005-01-21 17:59 ` James Simmons
@ 2005-01-21 19:57 ` Roman Zippel
2005-01-21 21:20 ` James Simmons
0 siblings, 1 reply; 12+ messages in thread
From: Roman Zippel @ 2005-01-21 19:57 UTC (permalink / raw)
To: James Simmons; +Cc: Christoph Hellwig, Andrew Morton, linux-kernel
Hi,
On Fri, 21 Jan 2005, James Simmons wrote:
> Please don't remove strutc vt_struct. What should be done is that struct
> vt_struct is used to hold the data that is shared amoung all the VCs. For
> example struct consw. See we end up with something like this.
>
> struct vt_struct {
> const struct consw *vt_sw;
> struct vc_data *vc_cons[MAX_NR_USER_CONSOLES];
> }
This is basically a completely different structure, which you can still
reintroduce once needed (hopefully with a better name).
bye, Roman
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2005-01-21 21:21 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-12-31 14:34 [PATCH] cleanup virtual console <-> selection.c interface Christoph Hellwig
2005-01-15 3:36 ` Roman Zippel
2005-01-15 19:21 ` Christoph Hellwig
2005-01-15 3:40 ` [PATCH 2/3] remove console_macros.h Roman Zippel
2005-01-21 17:53 ` James Simmons
2005-01-21 17:45 ` Randy.Dunlap
2005-01-21 17:59 ` Christoph Hellwig
2005-01-21 18:01 ` James Simmons
2005-01-15 3:41 ` [PATCH 3/3] merge vt_struct into vc_data Roman Zippel
2005-01-21 17:59 ` James Simmons
2005-01-21 19:57 ` Roman Zippel
2005-01-21 21:20 ` James Simmons
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox