aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/bhyve/bhyvegc.c
diff options
context:
space:
mode:
authorPeter Grehan <grehan@FreeBSD.org>2016-07-04 03:19:06 +0000
committerPeter Grehan <grehan@FreeBSD.org>2016-07-04 03:19:06 +0000
commit2cf9911fc1ec16dceba0cbc7186577e7bc1a1eb9 (patch)
treea596492c7883b4731ea72bd40281cca52d5403f9 /usr.sbin/bhyve/bhyvegc.c
parent3c2db7e010a98cb66db10a4552e9bf038bba042f (diff)
parent205b961b15c4de4789f484ddd795b6a42d1b1eac (diff)
downloadsrc-2cf9911fc1ec16dceba0cbc7186577e7bc1a1eb9.tar.gz
src-2cf9911fc1ec16dceba0cbc7186577e7bc1a1eb9.zip
Import bhyve_graphics into CURRENT. Thanks to all who tested
this on the branch. Original commit message: Initial bhyve native graphics support. This adds emulations for a raw framebuffer device, PS2 keyboard/mouse, XHCI USB controller and a USB tablet. A simple VNC server is provided for keyboard/mouse input, and graphics output. A VGA emulation is included, but is currently disconnected until an additional bhyve change to block out VGA memory is committed. Credits: - raw framebuffer, VNC server, XHCI controller, USB bus/device emulation and UEFI f/w support by Leon Dang - VGA, console/g, initial VNC server by tychon@ - PS2 keyboard/mouse jointly done by tychon@ and Leon Dang - hypervisor framebuffer mem support by neel@ Tested by: Michael Dexter, in a number of revisions of this code. With the appropriate UEFI image, FreeBSD, Windows and Linux guests can installed and run in graphics mode using the UEFI/GOP framebuffer. Approved by: re (gjb)
Notes
Notes: svn path=/head/; revision=302332
Diffstat (limited to 'usr.sbin/bhyve/bhyvegc.c')
-rw-r--r--usr.sbin/bhyve/bhyvegc.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/usr.sbin/bhyve/bhyvegc.c b/usr.sbin/bhyve/bhyvegc.c
new file mode 100644
index 000000000000..377b05b0878f
--- /dev/null
+++ b/usr.sbin/bhyve/bhyvegc.c
@@ -0,0 +1,72 @@
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "bhyvegc.h"
+
+struct bhyvegc {
+ struct bhyvegc_image *gc_image;
+ int raw;
+};
+
+struct bhyvegc *
+bhyvegc_init(int width, int height, void *fbaddr)
+{
+ struct bhyvegc *gc;
+ struct bhyvegc_image *gc_image;
+
+ gc = calloc(1, sizeof (struct bhyvegc));
+
+ gc_image = calloc(1, sizeof(struct bhyvegc_image));
+ gc_image->width = width;
+ gc_image->height = height;
+ if (fbaddr) {
+ gc_image->data = fbaddr;
+ gc->raw = 1;
+ } else {
+ gc_image->data = calloc(width * height, sizeof (uint32_t));
+ gc->raw = 0;
+ }
+
+ gc->gc_image = gc_image;
+
+ return (gc);
+}
+
+void
+bhyvegc_set_fbaddr(struct bhyvegc *gc, void *fbaddr)
+{
+ gc->raw = 1;
+ if (gc->gc_image->data && gc->gc_image->data != fbaddr)
+ free(gc->gc_image->data);
+ gc->gc_image->data = fbaddr;
+}
+
+void
+bhyvegc_resize(struct bhyvegc *gc, int width, int height)
+{
+ struct bhyvegc_image *gc_image;
+
+ gc_image = gc->gc_image;
+
+ gc_image->width = width;
+ gc_image->height = height;
+ if (!gc->raw) {
+ gc_image->data = realloc(gc_image->data,
+ sizeof (uint32_t) * width * height);
+ memset(gc_image->data, 0, width * height * sizeof (uint32_t));
+ }
+}
+
+struct bhyvegc_image *
+bhyvegc_get_image(struct bhyvegc *gc)
+{
+ if (gc == NULL)
+ return (NULL);
+
+ return (gc->gc_image);
+}