mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
![Eric W. Biederman](/assets/img/avatar_default.png)
I took a good hard look at the locking and it appears the locking on vt_pid is the console semaphore. Every modified path is called under the console semaphore except reset_vc when it is called from fn_SAK or do_SAK both of which appear to be in interrupt context. In addition I need to be careful because in the presence of an oops the console_sem may be arbitrarily dropped. Which leads me to conclude the current locking is inadequate for my needs. Given the weird cases we could hit because of oops printing instead of introducing an extra spin lock to protect the data and keep the pid to signal and the signal to send in sync, I have opted to use xchg on just the struct pid * pointer instead. Due to console_sem we will stay in sync between vt_pid and vt_mode except for a small window during a SAK, or oops handling. SAK handling should kill any user space process that care, and oops handling we are broken anyway. Besides the worst that can happen is that I try to send the wrong signal. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
126 lines
4.6 KiB
C
126 lines
4.6 KiB
C
/*
|
|
* console_struct.h
|
|
*
|
|
* Data structure describing single virtual console except for data
|
|
* used by vt.c.
|
|
*
|
|
* Fields marked with [#] must be set by the low-level driver.
|
|
* Fields marked with [!] can be changed by the low-level driver
|
|
* to achieve effects such as fast scrolling by changing the origin.
|
|
*/
|
|
|
|
#include <linux/wait.h>
|
|
#include <linux/vt.h>
|
|
|
|
struct vt_struct;
|
|
|
|
#define NPAR 16
|
|
|
|
struct vc_data {
|
|
unsigned short vc_num; /* Console number */
|
|
unsigned int vc_cols; /* [#] Console size */
|
|
unsigned int vc_rows;
|
|
unsigned int vc_size_row; /* Bytes per row */
|
|
unsigned int vc_scan_lines; /* # of scan lines */
|
|
unsigned long vc_origin; /* [!] Start of real screen */
|
|
unsigned long vc_scr_end; /* [!] End of real screen */
|
|
unsigned long vc_visible_origin; /* [!] Top of visible window */
|
|
unsigned int vc_top, vc_bottom; /* Scrolling region */
|
|
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 */
|
|
unsigned char vc_color; /* Foreground & background */
|
|
unsigned char vc_s_color; /* Saved foreground & background */
|
|
unsigned char vc_ulcolor; /* Color for underline mode */
|
|
unsigned char vc_halfcolor; /* Color for half intensity mode */
|
|
/* cursor */
|
|
unsigned int vc_cursor_type;
|
|
unsigned short vc_complement_mask; /* [#] Xor mask for mouse pointer */
|
|
unsigned short vc_s_complement_mask; /* Saved mouse pointer mask */
|
|
unsigned int vc_x, vc_y; /* Cursor position */
|
|
unsigned int vc_saved_x, vc_saved_y;
|
|
unsigned long vc_pos; /* Cursor address */
|
|
/* fonts */
|
|
unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
|
|
struct console_font vc_font; /* Current VC font set */
|
|
unsigned short vc_video_erase_char; /* Background erase character */
|
|
/* VT terminal 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;
|
|
struct pid *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 */
|
|
unsigned int vc_disp_ctrl : 1; /* Display chars < 32? */
|
|
unsigned int vc_toggle_meta : 1; /* Toggle high bit? */
|
|
unsigned int vc_decscnm : 1; /* Screen Mode */
|
|
unsigned int vc_decom : 1; /* Origin Mode */
|
|
unsigned int vc_decawm : 1; /* Autowrap Mode */
|
|
unsigned int vc_deccm : 1; /* Cursor Visible */
|
|
unsigned int vc_decim : 1; /* Insert Mode */
|
|
unsigned int vc_deccolm : 1; /* 80/132 Column Mode */
|
|
/* attribute flags */
|
|
unsigned int vc_intensity : 2; /* 0=half-bright, 1=normal, 2=bold */
|
|
unsigned int vc_underline : 1;
|
|
unsigned int vc_blink : 1;
|
|
unsigned int vc_reverse : 1;
|
|
unsigned int vc_s_intensity : 2; /* saved rendition */
|
|
unsigned int vc_s_underline : 1;
|
|
unsigned int vc_s_blink : 1;
|
|
unsigned int vc_s_reverse : 1;
|
|
/* misc */
|
|
unsigned int vc_ques : 1;
|
|
unsigned int vc_need_wrap : 1;
|
|
unsigned int vc_can_do_color : 1;
|
|
unsigned int vc_report_mouse : 2;
|
|
unsigned int vc_kmalloced : 1;
|
|
unsigned char vc_utf : 1; /* Unicode UTF-8 encoding */
|
|
unsigned char vc_utf_count;
|
|
int vc_utf_char;
|
|
unsigned int vc_tab_stop[8]; /* Tab stops. 256 columns. */
|
|
unsigned char vc_palette[16*3]; /* Colour palette for VGA+ */
|
|
unsigned short * vc_translate;
|
|
unsigned char vc_G0_charset;
|
|
unsigned char vc_G1_charset;
|
|
unsigned char vc_saved_G0;
|
|
unsigned char vc_saved_G1;
|
|
unsigned int vc_bell_pitch; /* Console bell pitch */
|
|
unsigned int vc_bell_duration; /* Console bell duration */
|
|
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 */
|
|
/* additional information is in vt_kern.h */
|
|
};
|
|
|
|
struct vc {
|
|
struct vc_data *d;
|
|
|
|
/* might add scrmem, vt_struct, kbd at some time,
|
|
to have everything in one place - the disadvantage
|
|
would be that vc_cons etc can no longer be static */
|
|
};
|
|
|
|
extern struct vc vc_cons [MAX_NR_CONSOLES];
|
|
|
|
#define CUR_DEF 0
|
|
#define CUR_NONE 1
|
|
#define CUR_UNDERLINE 2
|
|
#define CUR_LOWER_THIRD 3
|
|
#define CUR_LOWER_HALF 4
|
|
#define CUR_TWO_THIRDS 5
|
|
#define CUR_BLOCK 6
|
|
#define CUR_HWMASK 0x0f
|
|
#define CUR_SWMASK 0xfff0
|
|
|
|
#define CUR_DEFAULT CUR_UNDERLINE
|
|
|
|
#define CON_IS_VISIBLE(conp) (*conp->vc_display_fg == conp)
|