Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "vt: fix background color on line feed"

This reverts commit c9e587abfdec2c2aaa55fab83bcb4972e2f84f9b, and the
subsequent commits that fixed it up:

- afa9b649 "fbcon: prevent cursor disappearance after switching to 512
character font"

- d850a2fa "vt/fbcon: fix background color on line feed"

- 7fe3915a "vt/fbcon: update scrl_erase_char after 256/512-glyph font
switch"

by request of Alan Cox. Quoth Alan:
"Unfortunately it's wrong and its been causing breakages because
various apps like ncurses expect our previous (and correct)
behaviour."

Alexander sent out a similar patch.

Requested-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Tested-by: Jan Engelhardt <jengelh@medozas.de>
Cc: Alexander V. Lukyanov <lav@netis.ru>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+17 -38
+2 -3
drivers/char/vt.c
··· 301 301 d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); 302 302 s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr)); 303 303 scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row); 304 - scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char, 304 + scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char, 305 305 vc->vc_size_row * nr); 306 306 } 307 307 ··· 319 319 s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t); 320 320 step = vc->vc_cols * nr; 321 321 scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row); 322 - scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step); 322 + scr_memsetw(s, vc->vc_video_erase_char, 2 * step); 323 323 } 324 324 325 325 static void do_update_region(struct vc_data *vc, unsigned long start, int count) ··· 434 434 vc->vc_blink, vc->vc_underline, 435 435 vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic); 436 436 vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' '; 437 - vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' '; 438 437 } 439 438 440 439 /* Note: inverting the screen twice should revert to the original state */
+10 -29
drivers/video/console/fbcon.c
··· 1855 1855 struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; 1856 1856 struct display *p = &fb_display[vc->vc_num]; 1857 1857 int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; 1858 - unsigned short saved_ec; 1859 - int ret; 1860 1858 1861 1859 if (fbcon_is_inactive(vc, info)) 1862 1860 return -EINVAL; ··· 1866 1868 * ++Andrew: Only use ypan on hardware text mode when scrolling the 1867 1869 * whole screen (prevents flicker). 1868 1870 */ 1869 - 1870 - saved_ec = vc->vc_video_erase_char; 1871 - vc->vc_video_erase_char = vc->vc_scrl_erase_char; 1872 - 1873 - ret = 0; 1874 1871 1875 1872 switch (dir) { 1876 1873 case SM_UP: ··· 1883 1890 scr_memsetw((unsigned short *) (vc->vc_origin + 1884 1891 vc->vc_size_row * 1885 1892 (b - count)), 1886 - vc->vc_scrl_erase_char, 1893 + vc->vc_video_erase_char, 1887 1894 vc->vc_size_row * count); 1888 - ret = 1; 1895 + return 1; 1889 1896 break; 1890 1897 1891 1898 case SCROLL_WRAP_MOVE: ··· 1955 1962 scr_memsetw((unsigned short *) (vc->vc_origin + 1956 1963 vc->vc_size_row * 1957 1964 (b - count)), 1958 - vc->vc_scrl_erase_char, 1965 + vc->vc_video_erase_char, 1959 1966 vc->vc_size_row * count); 1960 - ret = 1; 1961 - break; 1967 + return 1; 1962 1968 } 1963 1969 break; 1964 1970 ··· 1974 1982 scr_memsetw((unsigned short *) (vc->vc_origin + 1975 1983 vc->vc_size_row * 1976 1984 t), 1977 - vc->vc_scrl_erase_char, 1985 + vc->vc_video_erase_char, 1978 1986 vc->vc_size_row * count); 1979 - ret = 1; 1987 + return 1; 1980 1988 break; 1981 1989 1982 1990 case SCROLL_WRAP_MOVE: ··· 2044 2052 scr_memsetw((unsigned short *) (vc->vc_origin + 2045 2053 vc->vc_size_row * 2046 2054 t), 2047 - vc->vc_scrl_erase_char, 2055 + vc->vc_video_erase_char, 2048 2056 vc->vc_size_row * count); 2049 - ret = 1; 2050 - break; 2057 + return 1; 2051 2058 } 2052 - break; 2053 2059 } 2054 - vc->vc_video_erase_char = saved_ec; 2055 - return ret; 2060 + return 0; 2056 2061 } 2057 2062 2058 2063 ··· 2511 2522 c = vc->vc_video_erase_char; 2512 2523 vc->vc_video_erase_char = 2513 2524 ((c & 0xfe00) >> 1) | (c & 0xff); 2514 - c = vc->vc_scrl_erase_char; 2515 - vc->vc_scrl_erase_char = 2516 - ((c & 0xFE00) >> 1) | (c & 0xFF); 2517 2525 vc->vc_attr >>= 1; 2518 2526 } 2519 2527 } else if (!vc->vc_hi_font_mask && cnt == 512) { ··· 2541 2555 if (vc->vc_can_do_color) { 2542 2556 vc->vc_video_erase_char = 2543 2557 ((c & 0xff00) << 1) | (c & 0xff); 2544 - c = vc->vc_scrl_erase_char; 2545 - vc->vc_scrl_erase_char = 2546 - ((c & 0xFF00) << 1) | (c & 0xFF); 2547 2558 vc->vc_attr <<= 1; 2548 - } else { 2559 + } else 2549 2560 vc->vc_video_erase_char = c & ~0x100; 2550 - vc->vc_scrl_erase_char = c & ~0x100; 2551 - } 2552 2561 } 2553 2562 2554 2563 }
+1 -1
drivers/video/console/mdacon.c
··· 533 533 534 534 static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines) 535 535 { 536 - u16 eattr = mda_convert_attr(c->vc_scrl_erase_char); 536 + u16 eattr = mda_convert_attr(c->vc_video_erase_char); 537 537 538 538 if (!lines) 539 539 return 0;
+2 -2
drivers/video/console/sticon.c
··· 170 170 switch (dir) { 171 171 case SM_UP: 172 172 sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols); 173 - sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char); 173 + sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char); 174 174 break; 175 175 176 176 case SM_DOWN: 177 177 sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols); 178 - sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char); 178 + sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char); 179 179 break; 180 180 } 181 181
+2 -2
drivers/video/console/vgacon.c
··· 1350 1350 } else 1351 1351 c->vc_origin += delta; 1352 1352 scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size - 1353 - delta), c->vc_scrl_erase_char, 1353 + delta), c->vc_video_erase_char, 1354 1354 delta); 1355 1355 } else { 1356 1356 if (oldo - delta < vga_vram_base) { ··· 1363 1363 } else 1364 1364 c->vc_origin -= delta; 1365 1365 c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size; 1366 - scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char, 1366 + scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char, 1367 1367 delta); 1368 1368 } 1369 1369 c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
-1
include/linux/console_struct.h
··· 53 53 unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */ 54 54 struct console_font vc_font; /* Current VC font set */ 55 55 unsigned short vc_video_erase_char; /* Background erase character */ 56 - unsigned short vc_scrl_erase_char; /* Erase character for scroll */ 57 56 /* VT terminal data */ 58 57 unsigned int vc_state; /* Escape sequence parser state */ 59 58 unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */