[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH 1/2] plat/kvm: Implement scrolling for VGA text mode



So far, when the text output overflowed the bottom of the console, it
was completely cleared, and output started from the top again. This
implement a scrolling functionality when we hit the bottom of the
console.

Signed-off-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>
---
 plat/kvm/x86/vga_console.c | 30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/plat/kvm/x86/vga_console.c b/plat/kvm/x86/vga_console.c
index 4746dd7..a1b5cf7 100644
--- a/plat/kvm/x86/vga_console.c
+++ b/plat/kvm/x86/vga_console.c
@@ -28,6 +28,7 @@
 
 #include <sys/types.h>
 #include <stdint.h>
+#include <string.h>
 #include <kvm-x86/vga_console.h>
 
 /* Hardware text mode color constants. */
@@ -95,6 +96,26 @@ static void terminal_putentryat(char c, uint8_t color, 
size_t x, size_t y)
 
        terminal_buffer[index] = vga_entry(c, color);
 }
+static void vga_scroll(void)
+{
+       size_t i;
+
+       for (i = 1; i < VGA_HEIGHT; i++) {
+               memcpy(terminal_buffer + ((i - 1) * VGA_WIDTH),
+                       terminal_buffer + (i * VGA_WIDTH), VGA_WIDTH * 2);
+       }
+       for (i = 0; i < VGA_WIDTH; i++)
+               terminal_buffer[((VGA_HEIGHT - 1) * VGA_WIDTH) + i]
+                       = vga_entry(' ', terminal_color);
+}
+
+static void vga_newline(void)
+{
+       if (terminal_row == VGA_HEIGHT - 1)
+               vga_scroll();
+       else
+               terminal_row++;
+}
 
 void _libkvmplat_vga_putc(char c)
 {
@@ -114,8 +135,7 @@ void _libkvmplat_vga_putc(char c)
                break;
        case '\n':
                _libkvmplat_vga_putc('\r');
-               if (++terminal_row == VGA_HEIGHT)
-                       terminal_row = 0;
+               vga_newline();
                break;
        case '\r':
                terminal_column = 0;
@@ -128,8 +148,7 @@ void _libkvmplat_vga_putc(char c)
 
                if (terminal_column == VGA_WIDTH) {
                        terminal_column = 0;
-                       if (++terminal_row == VGA_HEIGHT)
-                               terminal_row = 0;
+                       vga_newline();
                }
                break;
        default:
@@ -137,8 +156,7 @@ void _libkvmplat_vga_putc(char c)
                                terminal_column, terminal_row);
                if (++terminal_column == VGA_WIDTH) {
                        terminal_column = 0;
-                       if (++terminal_row == VGA_HEIGHT)
-                               terminal_row = 0;
+                       vga_newline();
                }
                break;
        }
-- 
2.18.0


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.