cleanup virtual console <-> selection.c interface
Subsystems (6)
PATCH 1/1 cleanup virtual console <-> selection.c interface
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.
drivers/char/selection.c +23 -21
@@ -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 =====
drivers/char/vc_screen.c +32 -28
179 lines not on this page · raw message
===== drivers/char/vt.c 1.85 vs edited =====
drivers/char/vt.c +216 -212
1,035 lines not on this page · raw message
===== drivers/char/vt_ioctl.c 1.41 vs edited =====
drivers/char/vt_ioctl.c +1 -1
@@ -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
include/linux/console_struct.h +3 -0
@@ -9,6 +9,8 @@* to achieve effects such as fast scrolling by changing the origin. */ +struct vt_struct ; +#define NPAR 16struct 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 =====
include/linux/selection.h +9 -14
@@ -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
Hi,
Quoted 3 lines · Christoph Hellwig
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
Quoted 4 lines · Roman Zippel
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.
PATCH 2/3 remove console_macros.h
In reply to Christoph HellwigHi,
Remove the macros in console_macros.h and so make the structure references explicit.
drivers/char/console_macros.h | 71 -- linux-2.6-vc/drivers/char/vt.c | 1035 ++++++++++++++++++++--------------------- 2 files changed, 523 insertions(+), 583 deletions(-)
drivers/char/console_macros.h deleted +0 -71
@@ -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))
drivers/char/vt.c +523 -512
1,930 lines not on this page · raw message
Re: [PATCH 2/3] remove console_macros.h
Now its starting to look like the linuxconsole project :-)
Quoted 2,096 lines · Roman Zippel
Hi,
Remove the macros in
console_macros.hand so make the structure references explicit.Signed-off-by Roman Zippel <[email protected]>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
===================================================================drivers/char/console_macros.h deleted +0
-71@@ -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
===================================================================drivers/char/vt.c +523
-513@@ -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, ustatic 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 *vWARN_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 vcstatic 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, iint 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, iupdate_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, unsignupdate_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, unsignmemset (&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 currconif (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, inswitch (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, inswitch (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, inif (!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_struccase 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_struccr (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_struclf (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_strucrestore_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_strucreturn ;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_strucset_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_strucreturn ;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_strucrestore_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_strucif (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 *ignorif (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 conswsave_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, strreturn -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, streturn -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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/3] remove console_macros.h
Quoted 2 lines · James Simmons
Now its starting to look like the linuxconsole project :-)
Again, what's the linuxconsole project?
Re: [PATCH 2/3] remove console_macros.h
Quoted 5 lines · Christoph Hellwig
Quoted 2 lines · James Simmons
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.
Re: [PATCH 2/3] remove console_macros.h
In reply to James SimmonsQuoted 10 lines · James Simmons
Now its starting to look like the linuxconsole project :-)
Quoted 5 lines · Roman Zippel
Hi,
Remove the macros in
console_macros.hand so make the structure references explicit.Signed-off-by Roman Zippel <[email protected]>
James,
It is possible to delete large parts of large emails when replying.....
Signature · 1 line
~Randy
PATCH 3/3 merge vt_struct into vc_data
In reply to Christoph HellwigHi,
The vt_struct and vc_data are always allocated together, so there is no need for a separate vt_struct structure.
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(-)
drivers/char/selection.c +3 -3
@@ -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);
drivers/char/vt.c +34 -52
261 lines not on this page · raw message
drivers/char/vt_ioctl.c +39 -54
237 lines not on this page · raw message
drivers/video/console/fbcon.c +19 -25
84 lines not on this page · raw message
drivers/video/console/sticon.c +4 -6
@@ -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))) {
drivers/video/sun3fb.c +1 -1
@@ -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); } }
fs/compat_ioctl.c +5 -4
@@ -1650,7 +1650,7 @@ static int do_kdfontop_ioctl(unsigned instruct 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 inreturn -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 ;
include/linux/console_struct.h +6 -1
@@ -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 */ };
include/linux/vt_kern.h +0 -9
@@ -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);
Re: [PATCH 3/3] merge vt_struct into vc_data
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.
Quoted 829 lines · Roman Zippel
Hi,
The
vt_structandvc_dataare always allocated together, so there is no need for a separatevt_structstructure.Signed-off-by Roman Zippel <[email protected]>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
===================================================================drivers/char/selection.c +3
-3@@ -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
===================================================================drivers/char/vt.c +34
-52@@ -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, iupdate_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_strucint 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_strucmight_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_strucrelease_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_strucacquire_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 *ignorif (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_strustatic 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_structstatic 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_structdown (&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, strint 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, strint 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, stint 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
===================================================================drivers/char/vt_ioctl.c +39
-54@@ -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 unimapdeint 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, strvoid __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, strdefault :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, strreturn 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, strif (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 -- [email protected] */ - 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, strint 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, strcase 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
===================================================================drivers/video/console/fbcon.c +19
-25@@ -203,7 +203,7 @@ static irqreturn_t fb_vbl_detect(int irqstatic 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_dif (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
===================================================================drivers/video/console/sticon.c +4
-6@@ -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
===================================================================drivers/video/sun3fb.c +1
-1@@ -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
===================================================================fs/compat_ioctl.c +5
-4@@ -1650,7 +1650,7 @@ static int do_kdfontop_ioctl(unsigned instruct 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 inreturn -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
===================================================================include/linux/console_struct.h +6
-1@@ -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
===================================================================include/linux/vt_kern.h +0
-10@@ -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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 3/3] merge vt_struct into vc_data
Hi,
Quoted 8 lines · James Simmons
Please don't remove strutc
vt_struct. What should be done is that structvt_structis 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
Re: [PATCH 3/3] merge vt_struct into vc_data
Quoted 3 lines
This is basically a completely different structure, which you can still reintroduce once needed (hopefully with a better name).
True. I will sort the sync then when your changes go in.