linux/drivers/video/console
Oleg Nesterov 232fb69a53 fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles
echo 3 >> /sys/class/graphics/fbcon/rotate_all, then switch to another
console. Result:

	BUG: unable to handle kernel paging request at ffffc20005d00000
	IP: [bitfill_aligned+149/265] bitfill_aligned+0x95/0x109
	PGD 7e228067 PUD 7e229067 PMD 7bc1f067 PTE 0
	Oops: 0002 [1] SMP
	CPU 1
	Modules linked in: [...a lot...]
	Pid: 10, comm: events/1 Not tainted 2.6.26.5-45.fc9.x86_64 #1
	RIP: 0010:[bitfill_aligned+149/265]  [bitfill_aligned+149/265] bitfill_aligned+0x95/0x109
	RSP: 0018:ffff81007d811bc8  EFLAGS: 00010216
	RAX: ffffc20005d00000 RBX: 0000000000000000 RCX: 0000000000000400
	RDX: 0000000000000000 RSI: ffffc20005d00000 RDI: ffffffffffffffff
	RBP: ffff81007d811be0 R08: 0000000000000400 R09: 0000000000000040
	R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000010000
	R13: ffffffff811632f0 R14: 0000000000000006 R15: ffff81007cb85400
	FS:  0000000000000000(0000) GS:ffff81007e004780(0000) knlGS:0000000000000000
	CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
	CR2: ffffc20005d00000 CR3: 0000000000201000 CR4: 00000000000006e0
	DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
	DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
	Process events/1 (pid: 10, threadinfo ffff81007d810000, task ffff81007d808000)
	Stack:  ffff81007c9d75a0 0000000000000000 0000000000000000 ffff81007d811c80
	 ffffffff81163a61 ffff810000000000 ffffffff8115f9c8 0000001000000000
	 0000000100aaaaaa 000000007cd0d4a0 fffffd8a00000800 0001000000000000
	Call Trace:
	 [cfb_fillrect+523/798] cfb_fillrect+0x20b/0x31e
	 [soft_cursor+416/436] ? soft_cursor+0x1a0/0x1b4
	 [ccw_clear_margins+205/263] ccw_clear_margins+0xcd/0x107
	 [fbcon_clear_margins+59/61] fbcon_clear_margins+0x3b/0x3d
	 [fbcon_switch+1291/1466] fbcon_switch+0x50b/0x5ba
	 [redraw_screen+261/481] redraw_screen+0x105/0x1e1
	 [ccw_cursor+0/1869] ? ccw_cursor+0x0/0x74d
	 [complete_change_console+48/190] complete_change_console+0x30/0xbe
	 [change_console+115/120] change_console+0x73/0x78
	 [console_callback+0/292] ? console_callback+0x0/0x124
	 [console_callback+97/292] console_callback+0x61/0x124
	 [schedule_delayed_work+25/30] ? schedule_delayed_work+0x19/0x1e
	 [run_workqueue+139/282] run_workqueue+0x8b/0x11a
	 [worker_thread+221/238] worker_thread+0xdd/0xee
	 [autoremove_wake_function+0/56] ? autoremove_wake_function+0x0/0x38
	 [worker_thread+0/238] ? worker_thread+0x0/0xee
	 [kthread+73/118] kthread+0x49/0x76
	 [child_rip+10/18] child_rip+0xa/0x12
	 [kthread+0/118] ? kthread+0x0/0x76
	 [child_rip+0/18] ? child_rip+0x0/0x12

Because fbcon_set_all_vcs()->FBCON_SWAP() uses display->rotate == 0 instead
of fbcon_ops->rotate, and vc_resize() has no effect because it is called with
new_cols/rows == ->vc_cols/rows.

Tested on 2.6.26.5-45.fc9.x86_64, but
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git seems to
have the same problem.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Cc: <stable@kernel.org>	[2.6.27.x, 2.6.26.x, maybe 2.6.25.x]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-10-16 11:21:45 -07:00
..
.gitignore sparc: Ignore drivers/video/console/promcon_tbl.c conmakehash generated file 2008-07-30 16:49:52 -07:00
bitblit.c fbcon: fix color generation for monochrome framebuffer 2008-02-06 10:41:18 -08:00
dummycon.c Remove magic macros for screen_info structure members 2007-10-16 22:57:17 -07:00
fbcon_ccw.c fbcon: fix color generation for monochrome framebuffer 2008-02-06 10:41:18 -08:00
fbcon_cw.c fbcon: fix color generation for monochrome framebuffer 2008-02-06 10:41:18 -08:00
fbcon_rotate.c
fbcon_rotate.h
fbcon_ud.c fbcon: fix color generation for monochrome framebuffer 2008-02-06 10:41:18 -08:00
fbcon.c fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles 2008-10-16 11:21:45 -07:00
fbcon.h fbcon: fix monochrome color value calculation 2008-10-02 15:53:13 -07:00
font_6x11.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_7x14.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_8x8.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_8x16.c export font_vga_8x16 2007-10-16 09:43:19 -07:00
font_10x18.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_acorn_8x8.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_mini_4x6.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_pearl_8x8.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_sun8x16.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
font_sun12x22.c fbcon: Convert struct font_desc to use ISO C initializers 2007-10-16 09:43:17 -07:00
fonts.c cleanup after APUS removal 2008-02-06 10:41:01 -08:00
Kconfig x86 setup: remove remnants of CONFIG_VIDEO_SELECT (read: vga=) 2008-09-03 14:12:39 -07:00
Makefile [VIDEO]: Fix section mismatch warning in promcon. 2007-06-04 23:52:45 -07:00
mdacon.c Revert "vt: fix background color on line feed" 2008-10-14 12:12:02 -07:00
newport_con.c netport_con.c: fix build errors and warnings 2007-10-18 14:37:17 -07:00
prom.uni
promcon.c vt: add color support to the "underline" and "italic" attributes 2007-05-08 11:15:27 -07:00
softcursor.c fbdev: change asm/uaccess.h to linux/uaccess.h 2007-10-16 09:43:17 -07:00
sticon.c Revert "vt: fix background color on line feed" 2008-10-14 12:12:02 -07:00
sticore.c sticore: don't activate unsupported GSC STI cards on HPPA 2008-07-30 09:41:43 -07:00
tileblit.c fbcon: fix color generation for monochrome framebuffer 2008-02-06 10:41:18 -08:00
vgacon.c vgacon: vgacon_scrolldelta simplification 2008-10-16 11:21:45 -07:00