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

[Minios-devel] [UNIKRAFT PATCH] plat/kvm, lib/ukdebug: Add VGA option for printing in kvm



From: Dafna Hirschfeld <dafna3@xxxxxxxxx>

Add support in the kvm platform for vga textmode console.
Add an option in the ukdebug configuration to use the vga
textmode for prints.
Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx>
---
 lib/ukdebug/Config.uk                     |  29 ++++++
 plat/kvm/Makefile.uk                      |   2 +
 plat/kvm/include/kvm-x86/serial_console.h |  30 ++++++
 plat/kvm/include/kvm-x86/vga_console.h    |  30 ++++++
 plat/kvm/x86/console.c                    |  88 ++++++----------
 plat/kvm/x86/serial_console.c             |  85 +++++++++++++++
 plat/kvm/x86/vga_console.c                | 120 ++++++++++++++++++++++
 7 files changed, 329 insertions(+), 55 deletions(-)
 create mode 100644 plat/kvm/include/kvm-x86/serial_console.h
 create mode 100644 plat/kvm/include/kvm-x86/vga_console.h
 create mode 100644 plat/kvm/x86/serial_console.c
 create mode 100644 plat/kvm/x86/vga_console.c

diff --git a/lib/ukdebug/Config.uk b/lib/ukdebug/Config.uk
index dcaeb3a..470f8b9 100644
--- a/lib/ukdebug/Config.uk
+++ b/lib/ukdebug/Config.uk
@@ -10,12 +10,41 @@ config LIBUKDEBUG_PRINTK
        help
          Build with debugging symbols enabled.
 
+config KERNEL_SERIAL_CONSOLE
+       bool "Serial console for the kernel prints"
+       default y
+       depends on (LIBUKDEBUG_PRINTK && PLAT_KVM && ARCH_X86_64)
+       help
+         Choose serial console for the kernel printing
+
+
+config KERNEL_VGA_CONSOLE
+       bool "Vga console for the kernel prints (kvm platform)"
+       default y
+       depends on (LIBUKDEBUG_PRINTK && PLAT_KVM && ARCH_X86_64)
+       help
+         Choose vga console for the kernel printing
+
 config LIBUKDEBUG_PRINTD
        bool "Enable debug messages (uk_printd)"
        default y
        help
          Build with debugging symbols enabled.
 
+config DEBUG_SERIAL_CONSOLE
+       bool "Serial console for the debug prints"
+       default y
+       depends on (LIBUKDEBUG_PRINTD && PLAT_KVM && ARCH_X86_64)
+       help
+         Choose serial console for the debug printing
+
+config DEBUG_VGA_CONSOLE
+       bool "Vga console for the debug prints (kvm platform)"
+       default y
+       depends on (LIBUKDEBUG_PRINTD && PLAT_KVM && ARCH_X86_64)
+       help
+         Choose vga console for the debug printing
+
 choice
        prompt "Debug message level"
        default LIBUKDEBUG_PRINTD_ERR
diff --git a/plat/kvm/Makefile.uk b/plat/kvm/Makefile.uk
index 2705fd1..759d338 100644
--- a/plat/kvm/Makefile.uk
+++ b/plat/kvm/Makefile.uk
@@ -32,6 +32,8 @@ LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += 
$(LIBKVMPLAT_BASE)/x86/traps.c
 LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += 
$(LIBKVMPLAT_BASE)/x86/cpu_vectors_x86_64.S
 LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBKVMPLAT_BASE)/x86/setup.c
 LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBKVMPLAT_BASE)/x86/console.c
+LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBKVMPLAT_BASE)/x86/vga_console.c
+LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += 
$(LIBKVMPLAT_BASE)/x86/serial_console.c
 LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBKVMPLAT_BASE)/x86/lcpu.c
 LIBKVMPLAT_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBKVMPLAT_BASE)/x86/intctrl.c
 LIBKVMPLAT_SRCS-y              += $(LIBKVMPLAT_BASE)/shutdown.c
diff --git a/plat/kvm/include/kvm-x86/serial_console.h 
b/plat/kvm/include/kvm-x86/serial_console.h
new file mode 100644
index 0000000..7fc43a6
--- /dev/null
+++ b/plat/kvm/include/kvm-x86/serial_console.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dan Williams
+ *          Martin Lucina
+ *          Felipe Huici <felipe.huici@xxxxxxxxx>
+ *          Florian Schmidt <florian.schmidt@xxxxxxxxx>
+ *          Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ *
+ * Copyright (c) 2015-2017 IBM
+ * Copyright (c) 2016-2017 Docker, Inc.
+ * Copyright (c) 2017 NEC Europe Ltd., NEC Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+void _libkvmplat_init_serial_console(void);
+
+void serial_putc(char a);
diff --git a/plat/kvm/include/kvm-x86/vga_console.h 
b/plat/kvm/include/kvm-x86/vga_console.h
new file mode 100644
index 0000000..df001d1
--- /dev/null
+++ b/plat/kvm/include/kvm-x86/vga_console.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dan Williams
+ *          Martin Lucina
+ *          Felipe Huici <felipe.huici@xxxxxxxxx>
+ *          Florian Schmidt <florian.schmidt@xxxxxxxxx>
+ *          Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ *
+ * Copyright (c) 2015-2017 IBM
+ * Copyright (c) 2016-2017 Docker, Inc.
+ * Copyright (c) 2017 NEC Europe Ltd., NEC Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+void _libkvmplat_init_vga_console(void);
+
+void vga_putc(char a);
diff --git a/plat/kvm/x86/console.c b/plat/kvm/x86/console.c
index 5ec03b0..a5dc615 100644
--- a/plat/kvm/x86/console.c
+++ b/plat/kvm/x86/console.c
@@ -25,76 +25,52 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <x86/cpu.h>
-#include <kvm/console.h>
 #include <uk/plat/console.h>
-#include <uk/essentials.h>
-#include <uk/print.h>
+#include <uk/config.h>
 
-#define COM1 0x3f8
+#if (CONFIG_DEBUG_VGA_CONSOLE || CONFIG_KERNEL_VGA_CONSOLE)
+#include <kvm-x86/vga_console.h>
+#endif
 
-#define COM1_DATA (COM1 + 0)
-#define COM1_INTR (COM1 + 1)
-#define COM1_CTRL (COM1 + 3)
-#define COM1_STATUS (COM1 + 5)
-
-/* only when DLAB is set */
-#define COM1_DIV_LO (COM1 + 0)
-#define COM1_DIV_HI (COM1 + 1)
-
-#define DLAB 0x80
-#define PROT 0x03 /* 8N1 (8 bits, no parity, one stop bit) */
+#if (CONFIG_DEBUG_SERIAL_CONSOLE || CONFIG_KERNEL_SERIAL_CONSOLE)
+#include <kvm-x86/serial_console.h>
+#endif
 
 void _libkvmplat_init_console(void)
 {
-       outb(COM1_INTR, 0x00);  /* Disable all interrupts */
-       outb(COM1_CTRL, DLAB);  /* Enable DLAB (set baudrate divisor) */
-       outb(COM1_DIV_LO, 0x01);/* Set div to 1 (lo byte) 115200 baud */
-       outb(COM1_DIV_HI, 0x00);/*              (hi byte) */
-       outb(COM1_CTRL, PROT);  /* Set 8N1, clear DLAB */
-}
-
-int ukplat_coutd(const char *str, unsigned int len)
-{
-       return ukplat_coutk(str, len);
-}
-
-static int serial_tx_empty(void)
-{
-       return inb(COM1_STATUS) & 0x20;
-}
-
-static void serial_write(char a)
-{
-       while (!serial_tx_empty())
-               ;
+#if (CONFIG_DEBUG_VGA_CONSOLE || CONFIG_KERNEL_VGA_CONSOLE)
+       _libkvmplat_init_vga_console();
+#endif
+#if (CONFIG_DEBUG_SERIAL_CONSOLE || CONFIG_KERNEL_SERIAL_CONSOLE)
+       _libkvmplat_init_serial_console();
+#endif
 
-       outb(COM1_DATA, a);
 }
 
-static void serial_putc(char a)
+int ukplat_coutd(const char *buf, unsigned int len)
 {
-       if (a == '\n')
-               serial_write('\r');
-       serial_write(a);
+       for (unsigned int i = 0; i < len; i++) {
+#if CONFIG_DEBUG_SERIAL_CONSOLE
+               serial_putc(buf[i]);
+#endif
+#if CONFIG_DEBUG_VGA_CONSOLE
+               vga_putc(buf[i]);
+#endif
+       }
+       return len;
 }
 
-static int serial_rx_ready(void)
-{
-       return inb(COM1_STATUS) & 0x01;
-}
-
-static int serial_getc(void)
-{
-       if (!serial_rx_ready())
-               return -1;
-       return (int) inb(COM1_DATA);
-}
 
 int ukplat_coutk(const char *buf, unsigned int len)
 {
-       for (unsigned int i = 0; i < len; i++)
+       for (unsigned int i = 0; i < len; i++) {
+#if CONFIG_KERNEL_SERIAL_CONSOLE
                serial_putc(buf[i]);
+#endif
+#if CONFIG_KERNEL_VGA_CONSOLE
+               vga_putc(buf[i]);
+#endif
+       }
        return len;
 }
 
@@ -103,11 +79,13 @@ int ukplat_cink(char *buf, unsigned int maxlen)
        int ret;
        unsigned int num = 0;
 
+#if CONFIG_KERNEL_SERIAL_CONSOLE
+
        while (num < maxlen
               && (ret = serial_getc()) >= 0) {
                *(buf++) = (char) ret;
                num++;
        }
-
+#endif
        return (int) num;
 }
diff --git a/plat/kvm/x86/serial_console.c b/plat/kvm/x86/serial_console.c
new file mode 100644
index 0000000..eccb126
--- /dev/null
+++ b/plat/kvm/x86/serial_console.c
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dan Williams
+ *          Martin Lucina
+ *          Felipe Huici <felipe.huici@xxxxxxxxx>
+ *          Florian Schmidt <florian.schmidt@xxxxxxxxx>
+ *          Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ *
+ * Copyright (c) 2015-2017 IBM
+ * Copyright (c) 2016-2017 Docker, Inc.
+ * Copyright (c) 2017 NEC Europe Ltd., NEC Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <kvm-x86/serial_console.h>
+
+#include <x86/cpu.h>
+
+#define COM1 0x3f8
+
+#define COM1_DATA (COM1 + 0)
+#define COM1_INTR (COM1 + 1)
+#define COM1_CTRL (COM1 + 3)
+#define COM1_STATUS (COM1 + 5)
+
+/* only when DLAB is set */
+#define COM1_DIV_LO (COM1 + 0)
+#define COM1_DIV_HI (COM1 + 1)
+
+#define DLAB 0x80
+#define PROT 0x03 /* 8N1 (8 bits, no parity, one stop bit) */
+
+void _libkvmplat_init_serial_console(void)
+{
+       outb(COM1_INTR, 0x00);  /* Disable all interrupts */
+       outb(COM1_CTRL, DLAB);  /* Enable DLAB (set baudrate divisor) */
+       outb(COM1_DIV_LO, 0x01);/* Set div to 1 (lo byte) 115200 baud */
+       outb(COM1_DIV_HI, 0x00);/*              (hi byte) */
+       outb(COM1_CTRL, PROT);  /* Set 8N1, clear DLAB */
+}
+
+static int serial_tx_empty(void)
+{
+       return inb(COM1_STATUS) & 0x20;
+}
+
+static void serial_write(char a)
+{
+       while (!serial_tx_empty())
+               ;
+
+       outb(COM1_DATA, a);
+}
+
+void serial_putc(char a)
+{
+       if (a == '\n')
+               serial_write('\r');
+       serial_write(a);
+}
+
+static int serial_rx_ready(void)
+{
+       return inb(COM1_STATUS) & 0x01;
+}
+
+int serial_getc(void)
+{
+       if (!serial_rx_ready())
+               return -1;
+       return (int) inb(COM1_DATA);
+}
diff --git a/plat/kvm/x86/vga_console.c b/plat/kvm/x86/vga_console.c
new file mode 100644
index 0000000..6d7342e
--- /dev/null
+++ b/plat/kvm/x86/vga_console.c
@@ -0,0 +1,120 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dan Williams
+ *          Martin Lucina
+ *          Felipe Huici <felipe.huici@xxxxxxxxx>
+ *          Florian Schmidt <florian.schmidt@xxxxxxxxx>
+ *          Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ *
+ * Copyright (c) 2015-2017 IBM
+ * Copyright (c) 2016-2017 Docker, Inc.
+ * Copyright (c) 2017 NEC Europe Ltd., NEC Corporation
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdint.h>
+#include <kvm-x86/vga_console.h>
+
+/* Hardware text mode color constants. */
+enum vga_color {
+       VGA_COLOR_BLACK = 0,
+       VGA_COLOR_BLUE = 1,
+       VGA_COLOR_GREEN = 2,
+       VGA_COLOR_CYAN = 3,
+       VGA_COLOR_RED = 4,
+       VGA_COLOR_MAGENTA = 5,
+       VGA_COLOR_BROWN = 6,
+       VGA_COLOR_LIGHT_GREY = 7,
+       VGA_COLOR_DARK_GREY = 8,
+       VGA_COLOR_LIGHT_BLUE = 9,
+       VGA_COLOR_LIGHT_GREEN = 10,
+       VGA_COLOR_LIGHT_CYAN = 11,
+       VGA_COLOR_LIGHT_RED = 12,
+       VGA_COLOR_LIGHT_MAGENTA = 13,
+       VGA_COLOR_LIGHT_BROWN = 14,
+       VGA_COLOR_WHITE = 15,
+};
+
+static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
+{
+       return fg | bg << 4;
+}
+
+static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
+{
+       return (uint16_t) uc | (uint16_t) color << 8;
+}
+
+
+static const size_t VGA_WIDTH = 80;
+static const size_t VGA_HEIGHT = 25;
+
+size_t terminal_row;
+size_t terminal_column;
+uint8_t terminal_color;
+uint16_t *terminal_buffer;
+
+static void clear_terminal(void)
+{
+       for (size_t y = 0; y < VGA_HEIGHT; y++) {
+               for (size_t x = 0; x < VGA_WIDTH; x++) {
+                       const size_t index = y * VGA_WIDTH + x;
+
+                       terminal_buffer[index] = vga_entry(' ', terminal_color);
+               }
+       }
+}
+
+void _libkvmplat_init_vga_console(void)
+{
+       terminal_row = 0;
+       terminal_column = 0;
+       terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
+       terminal_buffer = (uint16_t *) 0xB8000;
+       clear_terminal();
+}
+
+static void terminal_setcolor(uint8_t color)
+{
+       terminal_color = color;
+}
+
+static void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
+{
+       const size_t index = y * VGA_WIDTH + x;
+
+       terminal_buffer[index] = vga_entry(c, color);
+}
+
+void vga_putc(char c)
+{
+       if (terminal_column == 0 && terminal_row == 0)
+               clear_terminal();
+
+       if (c == 10 || c == 13) {
+               terminal_column = 0;
+               if (++terminal_row == VGA_HEIGHT)
+                       terminal_row = 0;
+       } else {
+               terminal_putentryat(c, terminal_color,
+                               terminal_column, terminal_row);
+               if (++terminal_column == VGA_WIDTH) {
+                       terminal_column = 0;
+                       if (++terminal_row == VGA_HEIGHT)
+                               terminal_row = 0;
+               }
+       }
+}
-- 
2.17.1


_______________________________________________
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®.