提交 66da39eb 编写于 作者: M Manuel Schölling 提交者: Greg Kroah-Hartman

console: Move scrollback data into its own struct

This refactoring is in preparation for persistent scrollback
support for VGA console.
Signed-off-by: NManuel Schölling <manuel.schoelling@gmx.de>
Reviewed-by: NAndrey Utkin <andrey_utkin@fastmail.com>
Tested-by: NAndrey Utkin <andrey_utkin@fastmail.com>
Tested-by: NAdam Borowski <kilobyte@angband.pl>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 4e0f5cc6
...@@ -162,31 +162,34 @@ static inline void vga_set_mem_top(struct vc_data *c) ...@@ -162,31 +162,34 @@ static inline void vga_set_mem_top(struct vc_data *c)
#ifdef CONFIG_VGACON_SOFT_SCROLLBACK #ifdef CONFIG_VGACON_SOFT_SCROLLBACK
/* software scrollback */ /* software scrollback */
static void *vgacon_scrollback; static struct vgacon_scrollback_info {
static int vgacon_scrollback_tail; void *data;
static int vgacon_scrollback_size; int tail;
static int vgacon_scrollback_rows; int size;
static int vgacon_scrollback_cnt; int rows;
static int vgacon_scrollback_cur; int cnt;
static int vgacon_scrollback_save; int cur;
static int vgacon_scrollback_restore; int save;
int restore;
} vgacon_scrollback;
static void vgacon_scrollback_init(int pitch) static void vgacon_scrollback_init(int pitch)
{ {
int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch; int rows = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024/pitch;
if (vgacon_scrollback) { if (vgacon_scrollback.data) {
vgacon_scrollback_cnt = 0; vgacon_scrollback.cnt = 0;
vgacon_scrollback_tail = 0; vgacon_scrollback.tail = 0;
vgacon_scrollback_cur = 0; vgacon_scrollback.cur = 0;
vgacon_scrollback_rows = rows - 1; vgacon_scrollback.rows = rows - 1;
vgacon_scrollback_size = rows * pitch; vgacon_scrollback.size = rows * pitch;
} }
} }
static void vgacon_scrollback_startup(void) static void vgacon_scrollback_startup(void)
{ {
vgacon_scrollback = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024, GFP_NOWAIT); vgacon_scrollback.data = kcalloc(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE,
1024, GFP_NOWAIT);
vgacon_scrollback_init(vga_video_num_columns * 2); vgacon_scrollback_init(vga_video_num_columns * 2);
} }
...@@ -194,38 +197,38 @@ static void vgacon_scrollback_update(struct vc_data *c, int t, int count) ...@@ -194,38 +197,38 @@ static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
{ {
void *p; void *p;
if (!vgacon_scrollback_size || c->vc_num != fg_console) if (!vgacon_scrollback.size || c->vc_num != fg_console)
return; return;
p = (void *) (c->vc_origin + t * c->vc_size_row); p = (void *) (c->vc_origin + t * c->vc_size_row);
while (count--) { while (count--) {
scr_memcpyw(vgacon_scrollback + vgacon_scrollback_tail, scr_memcpyw(vgacon_scrollback.data + vgacon_scrollback.tail,
p, c->vc_size_row); p, c->vc_size_row);
vgacon_scrollback_cnt++; vgacon_scrollback.cnt++;
p += c->vc_size_row; p += c->vc_size_row;
vgacon_scrollback_tail += c->vc_size_row; vgacon_scrollback.tail += c->vc_size_row;
if (vgacon_scrollback_tail >= vgacon_scrollback_size) if (vgacon_scrollback.tail >= vgacon_scrollback.size)
vgacon_scrollback_tail = 0; vgacon_scrollback.tail = 0;
if (vgacon_scrollback_cnt > vgacon_scrollback_rows) if (vgacon_scrollback.cnt > vgacon_scrollback.rows)
vgacon_scrollback_cnt = vgacon_scrollback_rows; vgacon_scrollback.cnt = vgacon_scrollback.rows;
vgacon_scrollback_cur = vgacon_scrollback_cnt; vgacon_scrollback.cur = vgacon_scrollback.cnt;
} }
} }
static void vgacon_restore_screen(struct vc_data *c) static void vgacon_restore_screen(struct vc_data *c)
{ {
vgacon_scrollback_save = 0; vgacon_scrollback.save = 0;
if (!vga_is_gfx && !vgacon_scrollback_restore) { if (!vga_is_gfx && !vgacon_scrollback.restore) {
scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf, scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
c->vc_screenbuf_size > vga_vram_size ? c->vc_screenbuf_size > vga_vram_size ?
vga_vram_size : c->vc_screenbuf_size); vga_vram_size : c->vc_screenbuf_size);
vgacon_scrollback_restore = 1; vgacon_scrollback.restore = 1;
vgacon_scrollback_cur = vgacon_scrollback_cnt; vgacon_scrollback.cur = vgacon_scrollback.cnt;
} }
} }
...@@ -239,41 +242,41 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines) ...@@ -239,41 +242,41 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines)
return; return;
} }
if (!vgacon_scrollback) if (!vgacon_scrollback.data)
return; return;
if (!vgacon_scrollback_save) { if (!vgacon_scrollback.save) {
vgacon_cursor(c, CM_ERASE); vgacon_cursor(c, CM_ERASE);
vgacon_save_screen(c); vgacon_save_screen(c);
vgacon_scrollback_save = 1; vgacon_scrollback.save = 1;
} }
vgacon_scrollback_restore = 0; vgacon_scrollback.restore = 0;
start = vgacon_scrollback_cur + lines; start = vgacon_scrollback.cur + lines;
end = start + abs(lines); end = start + abs(lines);
if (start < 0) if (start < 0)
start = 0; start = 0;
if (start > vgacon_scrollback_cnt) if (start > vgacon_scrollback.cnt)
start = vgacon_scrollback_cnt; start = vgacon_scrollback.cnt;
if (end < 0) if (end < 0)
end = 0; end = 0;
if (end > vgacon_scrollback_cnt) if (end > vgacon_scrollback.cnt)
end = vgacon_scrollback_cnt; end = vgacon_scrollback.cnt;
vgacon_scrollback_cur = start; vgacon_scrollback.cur = start;
count = end - start; count = end - start;
soff = vgacon_scrollback_tail - ((vgacon_scrollback_cnt - end) * soff = vgacon_scrollback.tail - ((vgacon_scrollback.cnt - end) *
c->vc_size_row); c->vc_size_row);
soff -= count * c->vc_size_row; soff -= count * c->vc_size_row;
if (soff < 0) if (soff < 0)
soff += vgacon_scrollback_size; soff += vgacon_scrollback.size;
count = vgacon_scrollback_cnt - start; count = vgacon_scrollback.cnt - start;
if (count > c->vc_rows) if (count > c->vc_rows)
count = c->vc_rows; count = c->vc_rows;
...@@ -287,13 +290,13 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines) ...@@ -287,13 +290,13 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines)
count *= c->vc_size_row; count *= c->vc_size_row;
/* how much memory to end of buffer left? */ /* how much memory to end of buffer left? */
copysize = min(count, vgacon_scrollback_size - soff); copysize = min(count, vgacon_scrollback.size - soff);
scr_memcpyw(d, vgacon_scrollback + soff, copysize); scr_memcpyw(d, vgacon_scrollback.data + soff, copysize);
d += copysize; d += copysize;
count -= copysize; count -= copysize;
if (count) { if (count) {
scr_memcpyw(d, vgacon_scrollback, count); scr_memcpyw(d, vgacon_scrollback.data, count);
d += count; d += count;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册