[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling--- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling--- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling--- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling--- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling--- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. This breaks tools like clear_console that rely on flushing the scrollback history by switching back and forth between consoles which is why this feature is disabled by default. Use the escape sequence \e[3J instead for flushing the buffer. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig | 23 +- drivers/video/console/vgacon.c | 172 +++-- 2 files changed, 134 insertions(+), 61 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index 38da6e2..67e52f0 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -43,9 +43,26 @@ config VGACON_SOFT_SCROLLBACK_SIZE range 1 1024 default "64" help - Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer + Enter the amount of System RAM to allocate for scrollback + buffers of VGA consoles. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. + +config VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE + bool "Persistent Scrollback History for each console" + depends on VGACON_SOFT_SCROLLBACK + default n + help + Say Y here if for each VGA console a scrollback buffer should + be allocated. The scrollback history will persist when switching + between consoles. If you say N here, scrollback is only supported + for the active VGA console and scrollback history will be flushed + when switching between consoles. + + This breaks legacy versions of tools like clear_console which + might cause security issues. + Use the escape sequence \e[3J instead if this feature is activated. + + If you use a RAM-constrained system, say N here. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 517f565..6c0b9ba 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -1,5 +1,5 @@ /* - * linux/drivers/video/vgacon.c -- Low level VGA based console driver + * linux/drivers/video/console/vgacon.c -- Low level VGA based console driver * * Created 28 Sep 1997 by Geert Uytterhoeven * @@ -106,12 +106,12 @@ static unsigned char vga_hardscroll_enabled __read_mostly; static unsigned char vga_hardscroll_user_enable __read_mostly = 1; static unsigned char vga_font_is_default = 1; static int vga_vesa_blanked; -static int vga_palette_blanked; -static int vga_is_gfx; -static int vga_512_chars; -static int vga_video_font_height; -static int vga_scan_lines __read_mostly; -static unsigned intvga_rolled_over; +static int vga_palette_blanked; +static int vga_is_gfx; +static int vga_512_chars; +static int vga_video_font_height; +static int vga_scan_lines __read_mostly; +static unsigned intvga_rolled_over; static int vgacon_text_mode_force; @@ -182,70 +182,125 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +}; +static struct vgacon_scrollback_info *vgacon_scrollback_cur; +#ifdef CONFIG_VGACON_SOFT_SCROLLBACK_FOR_EACH_CONSOLE +static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES]; +#else +static struct vgacon_scrollback_info vgacon_scrollbacks[1]; +#endif + +static void vgacon_scrollback_reset(size_t reset_size) { - int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; - - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + if (vgacon_scrollback_cur->data && reset_size > 0) + memset(vgacon_scrollback_cur->data, 0, reset_size); + + vgacon_scrollback_cur->cnt = 0; + vgacon_scrollback_cur->tail = 0; +
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
On Sa, 2014-05-31 at 00:26 +0200, Jakub Wilk wrote: > * Manuel Schölling , 2014-05-30, 15:27: > >Add a scrollback buffers for each VGA console. The benefit is that the > >scrollback history is not flushed when switching between consoles but > >is persistent. > > Some people rely on this scrollback flushing as a security feature. Is > there even another way to clear the scrollback, than to switch to > another vt and then back again? Thanks for raising this security issue! Maybe we should add something like VT_FLUSH_SCROLLBACK to vt_ioctl()? [1] I'm open for better ways to flush the scrollback history. [1] http://lxr.free-electrons.com/source/drivers/tty/vt/vt_ioctl.c#L334 > Debian ships this: > http://manpages.debian.org/cgi-bin/man.cgi?query=clear_console > https://sources.debian.net/src/bash/4.2%2Bdfsg-0.1/debian/clear_console.c > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
On Sa, 2014-05-31 at 00:26 +0200, Jakub Wilk wrote: * Manuel Schölling manuel.schoell...@gmx.de, 2014-05-30, 15:27: Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. Some people rely on this scrollback flushing as a security feature. Is there even another way to clear the scrollback, than to switch to another vt and then back again? Thanks for raising this security issue! Maybe we should add something like VT_FLUSH_SCROLLBACK to vt_ioctl()? [1] I'm open for better ways to flush the scrollback history. [1] http://lxr.free-electrons.com/source/drivers/tty/vt/vt_ioctl.c#L334 Debian ships this: http://manpages.debian.org/cgi-bin/man.cgi?query=clear_console https://sources.debian.net/src/bash/4.2%2Bdfsg-0.1/debian/clear_console.c -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
* Manuel Schölling , 2014-05-30, 15:27: Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. Some people rely on this scrollback flushing as a security feature. Is there even another way to clear the scrollback, than to switch to another vt and then back again? Debian ships this: http://manpages.debian.org/cgi-bin/man.cgi?query=clear_console https://sources.debian.net/src/bash/4.2%2Bdfsg-0.1/debian/clear_console.c -- Jakub Wilk -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
On 05/30/2014 06:27 AM, Manuel Schölling wrote: > --- > drivers/video/console/Kconfig |6 +- > drivers/video/console/vgacon.c | 124 > > 2 files changed, 79 insertions(+), 51 deletions(-) > > diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig > index fe1cd01..d7ec96c 100644 > --- a/drivers/video/console/Kconfig > +++ b/drivers/video/console/Kconfig > @@ -38,14 +38,14 @@ config VGACON_SOFT_SCROLLBACK >RAM to allocate for this buffer. If unsure, say 'N'. > > config VGACON_SOFT_SCROLLBACK_SIZE > - int "Scrollback Buffer Size (in KB)" > + int "Scrollback Buffer Size per console (in KB)" > depends on VGACON_SOFT_SCROLLBACK > range 1 1024 > default "64" > help > Enter the amount of System RAM to allocate for the scrollback > - buffer. Each 64KB will give you approximately 16 80x25 > - screenfuls of scrollback buffer > + buffer for each VGA console. Each 64KB will give you approximately > + 16 80x25 screenfuls of scrollback buffer. Nitpick: CodingStyle says to indent help text 1 tab + 2 spaces. > > config MDA_CONSOLE > depends on !M68K && !PARISC && ISA -- ~Randy -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
Hi Geert, On Fr, 2014-05-30 at 16:28 +0200, Geert Uytterhoeven wrote: Hi Manuel, > > On Fri, May 30, 2014 at 3:27 PM, Manuel Schölling > wrote: > > Add a scrollback buffers for each VGA console. The benefit is that > > the scrollback history is not flushed when switching between consoles > > but is persistent. > > The buffers are allocated on demand when a new console is opened. > > Thanks for your patch! > > I see two issues with this feature: > 1. Before, the single (default 64 KiB) buffer was allocated at startup. > Now you will allocate a buffer each time a new console is opened. > Depending on memory fragmentation, this may fail. Indeed, if allocation fails, scrollbuffer[vc_num]->data will stay NULL and scrolling will be disabled for that console. Is that ok or would you prefer another behavior of the kernel? > 2. People with RAM-constrained systems may not like this. > Can it be a config option? Sure, I will add an option for that. > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
Hi Manuel, On Fri, May 30, 2014 at 3:27 PM, Manuel Schölling wrote: > Add a scrollback buffers for each VGA console. The benefit is that > the scrollback history is not flushed when switching between consoles > but is persistent. > The buffers are allocated on demand when a new console is opened. Thanks for your patch! I see two issues with this feature: 1. Before, the single (default 64 KiB) buffer was allocated at startup. Now you will allocate a buffer each time a new console is opened. Depending on memory fragmentation, this may fail. 2. People with RAM-constrained systems may not like this. Can it be a config option? Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. Signed-off-by: Manuel Schölling --- drivers/video/console/Kconfig |6 +- drivers/video/console/vgacon.c | 124 2 files changed, 79 insertions(+), 51 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index fe1cd01..d7ec96c 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -38,14 +38,14 @@ config VGACON_SOFT_SCROLLBACK RAM to allocate for this buffer. If unsure, say 'N'. config VGACON_SOFT_SCROLLBACK_SIZE - int "Scrollback Buffer Size (in KB)" + int "Scrollback Buffer Size per console (in KB)" depends on VGACON_SOFT_SCROLLBACK range 1 1024 default "64" help Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer +buffer for each VGA console. Each 64KB will give you approximately +16 80x25 screenfuls of scrollback buffer. config MDA_CONSOLE depends on !M68K && !PARISC && ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 9d8feac..215eafb 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -181,75 +181,101 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +} vgacon_scrollbacks[MAX_NR_CONSOLES]; + +static void vgacon_scrollback_init(int vc_num) { + int pitch = vga_video_num_columns * 2; int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; + void *data; - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + data = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT); + if (!data) { + pr_warn("VGAcon: failed to allocate memory for scrollback.\n"); + vgacon_scrollbacks[vc_num].data = NULL; + return; } + + vgacon_scrollbacks[vc_num].data = data; + vgacon_scrollbacks[vc_num].cnt = 0; + vgacon_scrollbacks[vc_num].tail = 0; + vgacon_scrollbacks[vc_num].cur = 0; + vgacon_scrollbacks[vc_num].rows = rows - 1; + vgacon_scrollbacks[vc_num].size = rows * pitch; +} + +static void vgacon_switch_scrollback(int vc_num) +{ + if (!vgacon_scrollbacks[vc_num].data) + vgacon_scrollback_init(vc_num); } static void vgacon_scrollback_startup(void) { - vgacon_scrollback = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT); - vgacon_scrollback_init(vga_video_num_columns * 2); + int i; + + for (i = 0; i < MAX_NR_CONSOLES; ++i) + vgacon_scrollbacks[i].data = NULL; + + vgacon_scrollback_init(0); } static void vgacon_scrollback_update(struct vc_data *c, int t, int count) { + struct vgacon_scrollback_info *scrollback; void *p; - if (!vgacon_scrollback_size || c->vc_num != fg_console) + scrollback = _scrollbacks[c->vc_num]; + if (!scrollback->data || !scrollback->size) return; p = (void *) (c->vc_origin + t * c->vc_size_row); while (count--) { - scr_memcpyw(vgacon_scrollback + vgacon_scrollback_tail, + scr_memcpyw(scrollback->data + scrollback->tail, p, c->vc_size_row); - vgacon_scrollback_cnt++; + scrollback->cnt++; p += c->vc_size_row; - vgacon_scrollback_tail += c->vc_size_row; + scrollback->tail += c->vc_size_row; - if (vgacon_scrollback_tail >= vgacon_scrollback_size) - vgacon_scrollback_tail = 0; + if (scrollback->tail >= scrollback->size) + scrollback->tail = 0; - if (vgacon_scrollback_cnt > vgacon_scrollback_rows) - vgacon_scrollback_cnt = vgacon_scrollback_rows; + if (scrollback->cnt >
[PATCH] console: Add persistent scrollback buffers for all VGA consoles
Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. Signed-off-by: Manuel Schölling manuel.schoell...@gmx.de --- drivers/video/console/Kconfig |6 +- drivers/video/console/vgacon.c | 124 2 files changed, 79 insertions(+), 51 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index fe1cd01..d7ec96c 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -38,14 +38,14 @@ config VGACON_SOFT_SCROLLBACK RAM to allocate for this buffer. If unsure, say 'N'. config VGACON_SOFT_SCROLLBACK_SIZE - int Scrollback Buffer Size (in KB) + int Scrollback Buffer Size per console (in KB) depends on VGACON_SOFT_SCROLLBACK range 1 1024 default 64 help Enter the amount of System RAM to allocate for the scrollback -buffer. Each 64KB will give you approximately 16 80x25 -screenfuls of scrollback buffer +buffer for each VGA console. Each 64KB will give you approximately +16 80x25 screenfuls of scrollback buffer. config MDA_CONSOLE depends on !M68K !PARISC ISA diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 9d8feac..215eafb 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c @@ -181,75 +181,101 @@ static inline void vga_set_mem_top(struct vc_data *c) #ifdef CONFIG_VGACON_SOFT_SCROLLBACK /* software scrollback */ -static void *vgacon_scrollback; -static int vgacon_scrollback_tail; -static int vgacon_scrollback_size; -static int vgacon_scrollback_rows; -static int vgacon_scrollback_cnt; -static int vgacon_scrollback_cur; -static int vgacon_scrollback_save; -static int vgacon_scrollback_restore; - -static void vgacon_scrollback_init(int pitch) +struct vgacon_scrollback_info { + void *data; + int tail; + int size; + int rows; + int cnt; + int cur; + int save; + int restore; +} vgacon_scrollbacks[MAX_NR_CONSOLES]; + +static void vgacon_scrollback_init(int vc_num) { + int pitch = vga_video_num_columns * 2; int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; + void *data; - if (vgacon_scrollback) { - vgacon_scrollback_cnt = 0; - vgacon_scrollback_tail = 0; - vgacon_scrollback_cur = 0; - vgacon_scrollback_rows = rows - 1; - vgacon_scrollback_size = rows * pitch; + data = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT); + if (!data) { + pr_warn(VGAcon: failed to allocate memory for scrollback.\n); + vgacon_scrollbacks[vc_num].data = NULL; + return; } + + vgacon_scrollbacks[vc_num].data = data; + vgacon_scrollbacks[vc_num].cnt = 0; + vgacon_scrollbacks[vc_num].tail = 0; + vgacon_scrollbacks[vc_num].cur = 0; + vgacon_scrollbacks[vc_num].rows = rows - 1; + vgacon_scrollbacks[vc_num].size = rows * pitch; +} + +static void vgacon_switch_scrollback(int vc_num) +{ + if (!vgacon_scrollbacks[vc_num].data) + vgacon_scrollback_init(vc_num); } static void vgacon_scrollback_startup(void) { - vgacon_scrollback = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT); - vgacon_scrollback_init(vga_video_num_columns * 2); + int i; + + for (i = 0; i MAX_NR_CONSOLES; ++i) + vgacon_scrollbacks[i].data = NULL; + + vgacon_scrollback_init(0); } static void vgacon_scrollback_update(struct vc_data *c, int t, int count) { + struct vgacon_scrollback_info *scrollback; void *p; - if (!vgacon_scrollback_size || c-vc_num != fg_console) + scrollback = vgacon_scrollbacks[c-vc_num]; + if (!scrollback-data || !scrollback-size) return; p = (void *) (c-vc_origin + t * c-vc_size_row); while (count--) { - scr_memcpyw(vgacon_scrollback + vgacon_scrollback_tail, + scr_memcpyw(scrollback-data + scrollback-tail, p, c-vc_size_row); - vgacon_scrollback_cnt++; + scrollback-cnt++; p += c-vc_size_row; - vgacon_scrollback_tail += c-vc_size_row; + scrollback-tail += c-vc_size_row; - if (vgacon_scrollback_tail = vgacon_scrollback_size) - vgacon_scrollback_tail = 0; + if (scrollback-tail = scrollback-size) + scrollback-tail = 0; - if (vgacon_scrollback_cnt vgacon_scrollback_rows) - vgacon_scrollback_cnt = vgacon_scrollback_rows; + if (scrollback-cnt scrollback-rows) +
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
Hi Manuel, On Fri, May 30, 2014 at 3:27 PM, Manuel Schölling manuel.schoell...@gmx.de wrote: Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. Thanks for your patch! I see two issues with this feature: 1. Before, the single (default 64 KiB) buffer was allocated at startup. Now you will allocate a buffer each time a new console is opened. Depending on memory fragmentation, this may fail. 2. People with RAM-constrained systems may not like this. Can it be a config option? Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
Hi Geert, On Fr, 2014-05-30 at 16:28 +0200, Geert Uytterhoeven wrote: Hi Manuel, On Fri, May 30, 2014 at 3:27 PM, Manuel Schölling manuel.schoell...@gmx.de wrote: Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. The buffers are allocated on demand when a new console is opened. Thanks for your patch! I see two issues with this feature: 1. Before, the single (default 64 KiB) buffer was allocated at startup. Now you will allocate a buffer each time a new console is opened. Depending on memory fragmentation, this may fail. Indeed, if allocation fails, scrollbuffer[vc_num]-data will stay NULL and scrolling will be disabled for that console. Is that ok or would you prefer another behavior of the kernel? 2. People with RAM-constrained systems may not like this. Can it be a config option? Sure, I will add an option for that. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say programmer or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
On 05/30/2014 06:27 AM, Manuel Schölling wrote: --- drivers/video/console/Kconfig |6 +- drivers/video/console/vgacon.c | 124 2 files changed, 79 insertions(+), 51 deletions(-) diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig index fe1cd01..d7ec96c 100644 --- a/drivers/video/console/Kconfig +++ b/drivers/video/console/Kconfig @@ -38,14 +38,14 @@ config VGACON_SOFT_SCROLLBACK RAM to allocate for this buffer. If unsure, say 'N'. config VGACON_SOFT_SCROLLBACK_SIZE - int Scrollback Buffer Size (in KB) + int Scrollback Buffer Size per console (in KB) depends on VGACON_SOFT_SCROLLBACK range 1 1024 default 64 help Enter the amount of System RAM to allocate for the scrollback - buffer. Each 64KB will give you approximately 16 80x25 - screenfuls of scrollback buffer + buffer for each VGA console. Each 64KB will give you approximately + 16 80x25 screenfuls of scrollback buffer. Nitpick: CodingStyle says to indent help text 1 tab + 2 spaces. config MDA_CONSOLE depends on !M68K !PARISC ISA -- ~Randy -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] console: Add persistent scrollback buffers for all VGA consoles
* Manuel Schölling manuel.schoell...@gmx.de, 2014-05-30, 15:27: Add a scrollback buffers for each VGA console. The benefit is that the scrollback history is not flushed when switching between consoles but is persistent. Some people rely on this scrollback flushing as a security feature. Is there even another way to clear the scrollback, than to switch to another vt and then back again? Debian ships this: http://manpages.debian.org/cgi-bin/man.cgi?query=clear_console https://sources.debian.net/src/bash/4.2%2Bdfsg-0.1/debian/clear_console.c -- Jakub Wilk -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/