| 
						
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -1,19 +1,18 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				From 225de05d0b479987a2580bf97b8481ad5746dc82 Mon Sep 17 00:00:00 2001
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				From 12069f22af1b2672bb9231c55aa434afd9834088 Mon Sep 17 00:00:00 2001
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				From: mars <1403122061@qq.com>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Date: Mon, 30 Mar 2020 15:57:42 +0800
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Date: Thu, 14 May 2020 20:43:46 +0800
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Subject: [PATCH] add cjk tty support
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				---
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/tty/vt/selection.c           |      2 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/tty/vt/vt.c                  |    107 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/tty/vt/vt.c                  |     92 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/console/Kconfig        |      1 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/console/Makefile       |      1 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/bitblit.c   |     57 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon.c     |     72 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/bitblit.c   |     54 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon.c     |     76 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon.h     |      9 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_ccw.c |     31 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_cw.c  |     27 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_ud.c  |     41 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_ccw.c |     26 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_cw.c  |     26 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 drivers/video/fbdev/core/fbcon_ud.c  |     39 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 include/linux/font.h                 |      5 +-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 lib/fonts/Kconfig                    |     12 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 lib/fonts/Makefile                   |      1 +
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -30,15 +29,15 @@ Subject: [PATCH] add cjk tty support
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 lib/fonts/font_sun12x22.c            |      1 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 lib/fonts/font_sun8x16.c             |      1 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 lib/fonts/fonts.c                    |      3 +
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 26 files changed, 140124 insertions(+), 61 deletions(-)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 25 files changed, 140114 insertions(+), 48 deletions(-)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 create mode 100644 lib/fonts/font_16x16_cjk.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 create mode 100644 lib/fonts/font_cjk.h
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index d7d2e4b..5dcf740 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 7556139..8b07c79 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/tty/vt/selection.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/tty/vt/selection.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -334,6 +334,8 @@ static int __set_selection_kernel(struct tiocl_selection *v, struct tty_struct *
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -339,6 +339,8 @@ static int __set_selection_kernel(struct tiocl_selection *v, struct tty_struct *
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			obp = bp;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -48,17 +47,17 @@ index d7d2e4b..5dcf740 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	sel_buffer_lth = bp - sel_buffer;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 699d8b5..c9b6f77 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/tty/vt/vt.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/tty/vt/vt.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -303,6 +303,19 @@ static inline unsigned short *screenpos(struct vc_data *vc, int offset, int view
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -304,6 +304,19 @@ static inline unsigned short *screenpos(struct vc_data *vc, int offset, int view
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	return p;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+static inline unsigned short *screenpos_utf8(struct vc_data *vc, int offset, int viewed)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	unsigned short *p;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (!viewed)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		p = (unsigned short *)(vc->vc_origin + offset + vc->vc_screenbuf_size);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	else if (!vc->vc_sw->con_screen_pos)
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -71,7 +70,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 /* Called  from the keyboard irq path.. */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static inline void scrolldelta(int lines)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -640,6 +653,11 @@ static void con_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -646,6 +659,11 @@ static void con_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	scr_memsetw(clear, vc->vc_video_erase_char, vc->vc_size_row * nr);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -83,7 +82,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static void do_update_region(struct vc_data *vc, unsigned long start, int count)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -801,6 +819,8 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -807,6 +825,8 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	static int old_offset = -1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	static unsigned short old;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	static unsigned short oldx, oldy;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -92,7 +91,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	WARN_CONSOLE_UNLOCKED();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -808,7 +828,7 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -814,7 +834,7 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	    old_offset < vc->vc_screenbuf_size) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		scr_writew(old, screenpos(vc, old_offset, 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (con_should_update(vc))
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -101,7 +100,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		notify_update(vc);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -819,13 +839,15 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -825,13 +845,15 @@ void complement_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		unsigned short new;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		unsigned short *p;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		p = screenpos(vc, offset, 1);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -118,7 +117,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		notify_update(vc);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1106,7 +1128,7 @@ int vc_allocate(unsigned int currcons)	/* return 0 on success */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1125,7 +1147,7 @@ int vc_allocate(unsigned int currcons)	/* return 0 on success */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!*vc->vc_uni_pagedir_loc)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		con_set_default_unimap(vc);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -127,16 +126,15 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!vc->vc_screenbuf)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		goto err_free;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1168,7 +1190,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1188,6 +1210,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned long end;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	unsigned int old_rows, old_row_size, first_copied_row;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	unsigned int old_rows, old_row_size, first_copied_row, old_screen_size;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned int old_rows, old_row_size, first_copied_row;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	unsigned int old_screen_size;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned int new_cols, new_rows, new_row_size, new_screen_size;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned int user;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned short *newscreen;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1189,13 +1211,16 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1208,13 +1231,14 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	new_rows = (lines ? lines : vc->vc_rows);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	new_row_size = new_cols << 1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	new_screen_size = new_row_size * new_rows;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -145,23 +143,21 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (new_screen_size > (4 << 20))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (new_screen_size > KMALLOC_MAX_SIZE)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return -EINVAL;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	newscreen = kzalloc(new_screen_size, GFP_USER);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	newscreen = kzalloc(new_screen_size * 2, GFP_USER);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!newscreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return -ENOMEM;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1260,15 +1285,23 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1279,15 +1303,23 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (old_origin < end) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		scr_memcpyw((unsigned short *) new_origin,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			    (unsigned short *) old_origin, rlth);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		if (rrem)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		scr_memcpyw((unsigned short *) new_origin + (new_screen_size >> 1),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			    (unsigned short *) old_origin + (old_screen_size >> 1), rlth);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (rrem){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (rrem) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			scr_memsetw((void *)(new_origin + rlth),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				    vc->vc_video_erase_char, rrem);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			scr_memsetw((void *)(new_origin + rlth + (new_screen_size)),
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -171,7 +167,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		new_origin += new_row_size;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	if (new_scr_end > new_origin)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (new_scr_end > new_origin){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (new_scr_end > new_origin) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		scr_memsetw((void *)new_origin, vc->vc_video_erase_char,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			    new_scr_end - new_origin);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		scr_memsetw((void *)new_origin + (new_screen_size), vc->vc_video_erase_char,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -180,7 +176,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	kfree(vc->vc_screenbuf);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	vc->vc_screenbuf = newscreen;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	vc->vc_screenbuf_size = new_screen_size;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2612,6 +2645,8 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2631,6 +2663,8 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		rescan = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		inverse = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		width = 1;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -189,70 +185,53 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		/* Do no translation at all in control states */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (vc->vc_state != ESnormal) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2679,7 +2714,7 @@ rescan_last_byte:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				continue;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-			/* Nothing to do if an ASCII byte was received */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		    /* End of UTF-8 decoding. */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		    /* c is the received character, or U+FFFD for invalid sequences. */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2767,11 +2802,30 @@ rescan_last_byte:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2787,10 +2821,28 @@ rescan_last_byte:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				if (vc->vc_decim)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					insert_char(vc, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-				vc_uniscr_putc(vc, next_c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				vc_uniscr_putc(vc, next_c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-				scr_writew(himask ?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					     ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					     (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					   (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				if(is_double_width(c) && width==2)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				if (is_double_width(c) && width==2)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					tc = 0xFF;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(himask ?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						   (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						  (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(c, (u16 *) vc->vc_pos + (vc->vc_screenbuf_size >> 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				}else if(is_double_width(c) && width==1){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				} else if (is_double_width(c) && width==1) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					tc = 0xFE;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(himask ?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						   (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						  (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(c, (u16 *) vc->vc_pos + (vc->vc_screenbuf_size >> 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(himask ?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+							 (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						   (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    ((vc_attr << 8) & ~himask) + ((tc & 0x100) ? himask : 0) + (tc & 0xff) :
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						    (vc_attr << 8) + tc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						  (u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					scr_writew(c, (u16 *) vc->vc_pos + (vc->vc_screenbuf_size >> 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				if (con_should_update(vc) && draw_x < 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					draw_x = vc->vc_x;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					draw_from = vc->vc_pos;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2788,14 +2842,12 @@ rescan_last_byte:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2808,11 +2860,11 @@ rescan_last_byte:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				tc = conv_uni_to_pc(vc, ' '); /* A space is printed in the second column */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				if (tc < 0) tc = ' ';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-				next_c = ' ';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-			notify_write(vc, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				next_c = ' ';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			notify_write(vc, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-			if (inverse)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-				con_flush(vc, draw_from, draw_to, &draw_x);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			notify_write(vc, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			if (inverse)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				con_flush(vc, draw_from, draw_to, &draw_x);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-			if (rescan) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+      if (rescan) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			if (rescan) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				rescan = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				inverse = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				width = 1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -3370,7 +3422,7 @@ static int __init con_init(void)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -3397,7 +3449,7 @@ static int __init con_init(void)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		tty_port_init(&vc->port);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		visual_init(vc, currcons, 1);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -261,7 +240,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		vc_init(vc, vc->vc_rows, vc->vc_cols,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			currcons || !vc->vc_sw->con_save_screen);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -4607,6 +4659,11 @@ static int con_font_copy(struct vc_data *vc, struct console_font_op *op)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -4635,6 +4687,11 @@ static int con_font_copy(struct vc_data *vc, struct console_font_op *op)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 int con_font_op(struct vc_data *vc, struct console_font_op *op)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -273,7 +252,7 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	switch (op->op) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	case KD_FONT_OP_SET:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return con_font_set(vc, op);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -4630,9 +4687,15 @@ u16 screen_glyph(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -4658,9 +4715,14 @@ u16 screen_glyph(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u16 w = scr_readw(screenpos(vc, offset, 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u16 c = w & 0xff;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -281,10 +260,9 @@ index 15d2769..21e0fdc 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		c |= 0x100;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	return c;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	u16 c_utf8 = scr_readw(screenpos_utf8(vc, offset, 1));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if ( (c == 0xff || c == 0xfe) && c_utf8 != 0){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if ((c == 0xff || c == 0xfe) && c_utf8 != 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		return c_utf8;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (w & vc->vc_hi_font_mask)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			c |= 0x100;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		return c;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -304,20 +282,8 @@ index 70c10ea..e103d97 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        help
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          Enable display rotation for the framebuffer console.  This is done
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          in software and may be significantly slower than a normally oriented
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index db07b78..150d019 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/console/Makefile
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/console/Makefile
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -3,6 +3,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 # 5 Aug 1999, James Simmons, <mailto:jsimmons@users.sf.net>
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 # Rewritten to use lists instead of if-statements.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+# Font handling
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 obj-$(CONFIG_DUMMY_CONSOLE)       += dummycon.o
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 obj-$(CONFIG_STI_CONSOLE)         += sticon.o sticore.o
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index ca935c0..840d374 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index ca935c0..b24e177 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/fbdev/core/bitblit.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/fbdev/core/bitblit.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -10,6 +10,7 @@
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -358,12 +324,12 @@ index ca935c0..840d374 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					u16 charmask)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	u32	utf8_c;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	u8 *src = vc->vc_font.data + (scr_readw(s)&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				  charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	utf8_c = utf8_pos(vc, s);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if( utf8_c <= vc->vc_font.charcount)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		/*
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -385,39 +351,27 @@ index ca935c0..840d374 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static inline void bit_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				     const u16 *s, u32 attr, u32 cnt,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				     u32 d_pitch, u32 s_pitch, u32 cellsize,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -84,14 +128,12 @@ static inline void bit_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -84,8 +128,7 @@ static inline void bit_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u8 *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = vc->vc_font.data + (scr_readw(s++)&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					  charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc,s++,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc, s++, cellsize, charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			update_attr(buf, src, attr, vc);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			src = buf;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (likely(idx == 1))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			__fb_pad_aligned_buffer(dst, d_pitch, src, idx,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 						image->height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -119,14 +161,11 @@ static inline void bit_putcs_unaligned(struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -119,8 +162,7 @@ static inline void bit_putcs_unaligned(struct vc_data *vc,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u8 *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = vc->vc_font.data + (scr_readw(s++)&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					  charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc,s++,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc, s++, cellsize, charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			update_attr(buf, src, attr, vc);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			src = buf;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		fb_pad_unaligned_buffer(dst, d_pitch, src, idx,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					image->height, shift_high,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					shift_low, mod);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -245,6 +284,8 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -245,6 +287,8 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	int err = 1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	char *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -426,17 +380,17 @@ index ca935c0..840d374 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	cursor.set = 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (softback_lines) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -258,7 +299,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -258,7 +302,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	attribute = get_attribute(info, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	src = font_bits(vc,(u16*)vc->vc_pos,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	src = font_bits(vc, (u16*)vc->vc_pos, cellsize, charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (ops->cursor_state.image.data != src ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	    ops->cursor_reset) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 5eb3fc9..c1918cb 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/fbdev/core/fbcon.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/fbdev/core/fbcon.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -123,7 +123,8 @@ static int logo_lines;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -444,7 +398,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static int logo_shown = FBCON_LOGO_CANSHOW;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 /* Software scrollback */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-static int fbcon_softback_size = 32768;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+/*I need to use it out side fbcon.c */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+/* I need to use it out side fbcon.c */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+int fbcon_softback_size = 32768;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static unsigned long softback_buf, softback_curr;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static unsigned long softback_in;
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -502,7 +456,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1364,10 +1375,7 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1367,10 +1378,7 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -514,7 +468,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1441,6 +1449,7 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1444,6 +1452,7 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		vc->vc_font.data = (void *)(p->fontdata = t->fontdata);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		vc->vc_font.width = (*default_mode)->vc_font.width;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		vc->vc_font.height = (*default_mode)->vc_font.height;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -522,7 +476,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		p->userfont = t->userfont;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (p->userfont)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			REFCOUNT(p->fontdata)++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1619,6 +1628,7 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1622,6 +1631,7 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				  long delta)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -530,16 +484,18 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	int count = vc->vc_rows;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned short *d, *s;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned long n;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1681,6 +1691,8 @@ static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1684,6 +1694,10 @@ static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					start = s;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			if( ((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe) && scr_readw(s + (vc->vc_screenbuf_size >> 1)) != 0){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			if (((scr_readw(s) & charmask) == 0xff ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				(scr_readw(s) & charmask) == 0xfe) &&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				scr_readw(s + (vc->vc_screenbuf_size >> 1)) != 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			if (c == scr_readw(d)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				if (s > start) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					fbcon_putcs(vc, start, s - start,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1692,6 +1704,7 @@ static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1695,6 +1709,7 @@ static void fbcon_redraw_softback(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					start++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -547,7 +503,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			s++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			d++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		} while (s < le);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1774,6 +1787,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1777,6 +1792,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			scr_writew(c, d);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -555,7 +511,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			console_conditional_schedule();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			s++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			d++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1796,6 +1810,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1799,6 +1815,7 @@ static void fbcon_redraw_blit(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			 int line, int count, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -563,7 +519,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned short *d = (unsigned short *)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	    (vc->vc_origin + vc->vc_size_row * line);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned short *s = d + offset;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1818,18 +1833,22 @@ static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1821,18 +1838,24 @@ static void fbcon_redraw(struct vc_data *vc, struct fbcon_display *p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					start = s;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -576,8 +532,10 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-				} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					x++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-					start++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			if( ((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe) && scr_readw(s + (vc->vc_screenbuf_size >> 1)) != 0){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			if (((scr_readw(s) & charmask) == 0xff ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				(scr_readw(s) & charmask) == 0xfe) &&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				scr_readw(s + (vc->vc_screenbuf_size >> 1)) != 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				if (c == scr_readw(d)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+					if (s > start) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+						fbcon_putcs(vc, start, s - start,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -595,7 +553,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			console_conditional_schedule();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			s++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			d++;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1859,6 +1878,7 @@ static inline void fbcon_softback_note(struct vc_data *vc, int t,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -1862,6 +1885,7 @@ static inline void fbcon_softback_note(struct vc_data *vc, int t,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (count) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		scr_memcpyw((u16 *) softback_in, p, vc->vc_size_row);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -603,7 +561,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		count--;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		p = advance_row(p, 1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		softback_in += vc->vc_size_row;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2462,7 +2482,6 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2465,7 +2489,6 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	font->width = vc->vc_font.width;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	font->height = vc->vc_font.height;
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -611,7 +569,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!font->data)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return 0;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2767,6 +2786,19 @@ static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2770,6 +2793,19 @@ static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	unsigned long p;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	int line;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -631,7 +589,7 @@ index bb6ae99..d35a874 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (vc->vc_num != fg_console || !softback_lines)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return (u16 *) (vc->vc_origin + offset);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	line = offset / vc->vc_size_row;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2874,6 +2906,8 @@ static void fbcon_scrolldelta(struct vc_data *vc, int lines)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -2877,6 +2913,8 @@ static void fbcon_scrolldelta(struct vc_data *vc, int lines)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					q -= vc->vc_size_row;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 					scr_memcpyw((u16 *) q, (u16 *) p,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 						    vc->vc_size_row);
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -659,7 +617,7 @@ index 20dea85..b34c419 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 #endif /* _VIDEO_FBCON_H */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/fbdev/core/fbcon_ccw.c b/drivers/video/fbdev/core/fbcon_ccw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index dfa9a8a..beb33f5 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index dfa9a8a..d093193 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/fbdev/core/fbcon_ccw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/fbdev/core/fbcon_ccw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -18,6 +18,8 @@
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -671,22 +629,20 @@ index dfa9a8a..beb33f5 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 /*
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  * Rotation 270 degrees
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -105,13 +107,23 @@ static inline void ccw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u32 idx = (vc->vc_font.height + 7) >> 3;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -106,12 +108,22 @@ static inline void ccw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u8 *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if(((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe )){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = font_bits(vc,s,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			rotate_ccw(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = ops->fontbuffer + (scr_readw(s) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -705,30 +661,26 @@ index dfa9a8a..beb33f5 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!ops->fontbuffer)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -245,9 +258,19 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			y += softback_lines;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -247,7 +260,16 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				- 	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	attribute = get_attribute(info, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if(((c&charmask) == 0xff || (c & charmask) == 0xfe)){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (((c&charmask) == 0xff || (c & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc,(const u16*)&c,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		rotate_ccw(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (ops->cursor_state.image.data != src ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	    ops->cursor_reset) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index ce08251..ad965d9 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index ce08251..d62b8ef 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/fbdev/core/fbcon_cw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/fbdev/core/fbcon_cw.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -18,6 +18,8 @@
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -740,22 +692,20 @@ index ce08251..ad965d9 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 /*
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  * Rotation 90 degrees
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -89,14 +91,23 @@ static inline void cw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u32 idx = (vc->vc_font.height + 7) >> 3;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -91,12 +93,22 @@ static inline void cw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u8 *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = ops->fontbuffer + (scr_readw(s++) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if(((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe )){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = font_bits(vc,s,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			rotate_cw(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = ops->fontbuffer + (scr_readw(s) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -766,7 +716,7 @@ index ce08251..ad965d9 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (likely(idx == 1))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 			__fb_pad_aligned_buffer(dst, d_pitch, src, idx,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -213,6 +224,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -213,6 +225,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	int err = 1, dx, dy;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	char *src;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	u32 vxres = GETVXRES(ops->p->scrollmode, info);
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -774,26 +724,26 @@ index ce08251..ad965d9 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!ops->fontbuffer)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -230,7 +242,16 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -230,7 +243,16 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	attribute = get_attribute(info, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if(((c&charmask) == 0xff || (c & charmask) == 0xfe)){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (((c&charmask) == 0xff || (c & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc,(const u16*)&c,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		rotate_cw(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (ops->cursor_state.image.data != src ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	    ops->cursor_reset) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				diff --git a/drivers/video/fbdev/core/fbcon_ud.c b/drivers/video/fbdev/core/fbcon_ud.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 1936afc..aa0c15b 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				index 1936afc..d2e4d3d 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				--- a/drivers/video/fbdev/core/fbcon_ud.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+++ b/drivers/video/fbdev/core/fbcon_ud.c
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -18,6 +18,8 @@
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -811,14 +761,14 @@ index 1936afc..aa0c15b 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if(((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe ) ){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = font_bits(vc,s,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			rotate_ud(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = ops->fontbuffer + (scr_readw(s) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -835,14 +785,14 @@ index 1936afc..aa0c15b 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	while (cnt--) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-		src = ops->fontbuffer + (scr_readw(s--) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if(((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe )){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		if (((scr_readw(s) & charmask) == 0xff || (scr_readw(s) & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = font_bits(vc,s,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			rotate_ud(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+				  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			src = ops->fontbuffer + (scr_readw(s) & charmask)*cellsize;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		if (attr) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -861,21 +811,19 @@ index 1936afc..aa0c15b 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	if (!ops->fontbuffer)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 		return;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -278,7 +300,18 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				@@ -278,7 +300,16 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				  	c = scr_readw((u16 *) vc->vc_pos);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 	attribute = get_attribute(info, c);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-	src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if(((c&charmask) == 0xff || (c & charmask) == 0xfe) ){
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	if (((c&charmask) == 0xff || (c & charmask) == 0xfe)) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		char dst[16];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = font_bits(vc,(u16*)&c,cellsize,charmask);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		memset(dst, 0, 16);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		rotate_ud(src, dst, vc->vc_font.width,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+			  vc->vc_font.height);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = dst;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}else{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+		src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				+	}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -140890,5 +140838,5 @@ index e7258d8..cf2cfcb 100644
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 #define num_fonts ARRAY_SIZE(fonts)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				-- 
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				2.26.0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				2.26.2
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |