console: add qemu_create_displaysurface_guestmem

This patch adds a qemu_create_displaysurface_guestmem helper function.
Works simliar to qemu_create_displaysurface_from, but accepts a
guest address instead of a host pointer and it handles
cpu_physical_memory_{map,unmap} for you.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2014-06-19 08:46:08 +02:00
parent 30f1e661b6
commit a77549b3ff
2 changed files with 41 additions and 0 deletions

View File

@ -189,6 +189,10 @@ DisplayState *init_displaystate(void);
DisplaySurface *qemu_create_displaysurface_from(int width, int height,
pixman_format_code_t format,
int linesize, uint8_t *data);
DisplaySurface *qemu_create_displaysurface_guestmem(int width, int height,
pixman_format_code_t format,
int linesize,
uint64_t addr);
PixelFormat qemu_different_endianness_pixelformat(int bpp);
PixelFormat qemu_default_pixelformat(int bpp);

View File

@ -28,6 +28,7 @@
#include "qmp-commands.h"
#include "sysemu/char.h"
#include "trace.h"
#include "exec/memory.h"
#define DEFAULT_BACKSCROLL 512
#define CONSOLE_CURSOR_PERIOD 500
@ -1270,6 +1271,42 @@ DisplaySurface *qemu_create_displaysurface_from(int width, int height,
return surface;
}
static void qemu_unmap_displaysurface_guestmem(pixman_image_t *image,
void *unused)
{
void *data = pixman_image_get_data(image);
uint32_t size = pixman_image_get_stride(image) *
pixman_image_get_height(image);
cpu_physical_memory_unmap(data, size, 0, 0);
}
DisplaySurface *qemu_create_displaysurface_guestmem(int width, int height,
pixman_format_code_t format,
int linesize, uint64_t addr)
{
DisplaySurface *surface;
hwaddr size;
void *data;
if (linesize == 0) {
linesize = width * PIXMAN_FORMAT_BPP(format) / 8;
}
size = linesize * height;
data = cpu_physical_memory_map(addr, &size, 0);
if (size != linesize * height) {
cpu_physical_memory_unmap(data, size, 0, 0);
return NULL;
}
surface = qemu_create_displaysurface_from
(width, height, format, linesize, data);
pixman_image_set_destroy_function
(surface->image, qemu_unmap_displaysurface_guestmem, NULL);
return surface;
}
static DisplaySurface *qemu_create_message_surface(int w, int h,
const char *msg)
{