summaryrefslogtreecommitdiff
path: root/usr/src/cmd/bhyve/bhyvegc.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/bhyve/bhyvegc.c')
-rw-r--r--usr/src/cmd/bhyve/bhyvegc.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/usr/src/cmd/bhyve/bhyvegc.c b/usr/src/cmd/bhyve/bhyvegc.c
index 7a13c4c83f..4bd49ded79 100644
--- a/usr/src/cmd/bhyve/bhyvegc.c
+++ b/usr/src/cmd/bhyve/bhyvegc.c
@@ -1,4 +1,6 @@
/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
* Copyright (c) 2015 Tycho Nightingale <tycho.nightingale@pluribusnetworks.com>
* All rights reserved.
*
@@ -37,10 +39,11 @@ __FBSDID("$FreeBSD$");
struct bhyvegc {
struct bhyvegc_image *gc_image;
+ int raw;
};
struct bhyvegc *
-bhyvegc_init(int width, int height)
+bhyvegc_init(int width, int height, void *fbaddr)
{
struct bhyvegc *gc;
struct bhyvegc_image *gc_image;
@@ -50,7 +53,13 @@ bhyvegc_init(int width, int height)
gc_image = calloc(1, sizeof(struct bhyvegc_image));
gc_image->width = width;
gc_image->height = height;
- gc_image->data = calloc(width * height, sizeof (uint32_t));
+ 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;
@@ -58,6 +67,15 @@ bhyvegc_init(int width, int height)
}
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;
@@ -66,13 +84,20 @@ bhyvegc_resize(struct bhyvegc *gc, int width, int height)
gc_image->width = width;
gc_image->height = height;
- gc_image->data = realloc(gc_image->data,
- sizeof (uint32_t) * width * height);
- memset(gc_image->data, 0, width * height * sizeof (uint32_t));
+ if (!gc->raw) {
+ gc_image->data = reallocarray(gc_image->data, width * height,
+ sizeof (uint32_t));
+ if (gc_image->data != NULL)
+ 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);
}