From: Anthony Liguori <anthony@codemonkey.ws>
To: Julian Pidancet <julian.pidancet@citrix.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Add QEMU DirectFB display driver
Date: Fri, 14 May 2010 12:07:03 -0500 [thread overview]
Message-ID: <4BED8337.2000605@codemonkey.ws> (raw)
In-Reply-To: <1273856330-15161-1-git-send-email-julian.pidancet@citrix.com>
On 05/14/2010 11:58 AM, Julian Pidancet wrote:
> This patch implements a DirectFB driver for QEMU. It allows Qemu to
> draw a VM graphic output directly in the framebuffer of the host,
> without having to rely on X11.
> DirectFB also provides with a generic interface take advantage of graphic
> hardware acceleration for a bunch of different supported cards.
>
> In this driver, the DirectFB library gives Qemu a pointer to mapped
> video memory, which allows Qemu to update the display without extra copy.
> In the case where the guest framebuffer is not compatible with the host
> framebuffer, DirectFB surface blitting functions are used and can be
> accellerated wherever it is possible with the hardware.
>
> DirectFB is a thin library heavily used in embedded or minimal systems
> which don't require X11 overhead. One use case would be to build a
> Xen-based client-class hypervisor, with a minimal dom0 running Qemu as
> device-model. The dom0 could render the domU graphical outputs on the
> physical screen using this patch without having X11 installed.
>
> The other solution would be to use the DirectFB driver for SDL which
> would allow to do slightly the same as this patch. But that would mean
> having to deal with an additional layer in the graphical stack, which is
> not exactly what one wants from a performance or a complexity point of
> view.
> As an example, the SDL library gives no garantee that the surface
> pointer returned by SDL_SetVideoMode(), if called with the
> SDL_HWSURFACE, will be located in video memory [1], especially if the
> SDL main surface is not fullscreen. For this reason, you can never
> assume that SDL will not perform extra copy operations on your behalf
> without notifying you.
>
But that's a feature. One would assume that SDL tries to allocate a
hardware surface whenever it can.
Can you provide some performance data to justify this since SDL provides
the same ability?
Regards,
Anthony Liguori
> [1] http://www.libsdl.org/cgi/docwiki.cgi/SDL_SetVideoMode
>
> Signed-off-by: Julian Pidancet<julian.pidancet@citrix.com>
> ---
> Makefile | 4 +
> Makefile.objs | 1 +
> configure | 21 +++
> console.h | 3 +
> directfb.c | 394 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> qemu-options.hx | 10 ++
> sysemu.h | 1 +
> vl.c | 12 ++
> 8 files changed, 446 insertions(+), 0 deletions(-)
> create mode 100644 directfb.c
>
> diff --git a/Makefile b/Makefile
> index eb9e02b..6932c81 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -106,6 +106,10 @@ sdl.o: sdl.c keymaps.h sdl_keysym.h sdl_zoom.h
>
> sdl.o audio/sdlaudio.o sdl_zoom.o baum.o: QEMU_CFLAGS += $(SDL_CFLAGS)
>
> +directfb.o: directfb.c
> +
> +directfb.o: QEMU_CFLAGS += $(DIRECTFB_CFLAGS)
> +
> acl.o: acl.h acl.c
>
> vnc.h: vnc-tls.h vnc-auth-vencrypt.h vnc-auth-sasl.h keymaps.h
> diff --git a/Makefile.objs b/Makefile.objs
> index ecdd53e..0904b07 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -102,6 +102,7 @@ common-obj-y += $(addprefix audio/, $(audio-obj-y))
> common-obj-y += keymaps.o
> common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
> common-obj-$(CONFIG_CURSES) += curses.o
> +common-obj-$(CONFIG_DIRECTFB) += directfb.o
> common-obj-y += vnc.o acl.o d3des.o
> common-obj-y += vnc-encoding-zlib.o vnc-encoding-hextile.o
> common-obj-y += iov.o
> diff --git a/configure b/configure
> index 36d028f..eb73415 100755
> --- a/configure
> +++ b/configure
> @@ -258,6 +258,7 @@ kvm=""
> kvm_para=""
> nptl=""
> sdl=""
> +directfb="no"
> sparse="no"
> uuid=""
> vde=""
> @@ -502,6 +503,10 @@ for opt do
> ;;
> --sysconfdir=*) sysconfdir="$optarg"
> ;;
> + --disable-directfb) directfb="no"
> + ;;
> + --enable-directfb) directfb="yes"
> + ;;
> --disable-sdl) sdl="no"
> ;;
> --enable-sdl) sdl="yes"
> @@ -763,6 +768,8 @@ echo " --disable-strip disable stripping binaries"
> echo " --disable-werror disable compilation abort on warning"
> echo " --disable-sdl disable SDL"
> echo " --enable-sdl enable SDL"
> +echo " --disable-directfb disable DirectFB"
> +echo " --enable-directfb enable DirectFB"
> echo " --enable-cocoa enable COCOA (Mac OS X only)"
> echo " --audio-drv-list=LIST set audio drivers list:"
> echo " Available drivers: $audio_possible_drivers"
> @@ -1062,6 +1069,15 @@ if test "$sparse" != "no" ; then
> fi
>
> ##########################################
> +# DirectFB probe
> +
> +if test "$directfb" = "yes" ; then
> + directfb_libs=`directfb-config --libs`
> + directfb_cflags=`directfb-config --cflags`
> + libs_softmmu="$directfb_libs $libs_softmmu"
> +fi
> +
> +##########################################
> # SDL probe
>
> if $pkgconfig sdl --modversion>/dev/null 2>&1; then
> @@ -1999,6 +2015,7 @@ if test "$darwin" = "yes" ; then
> echo "Cocoa support $cocoa"
> fi
> echo "SDL support $sdl"
> +echo "DirectFB support $directfb"
> echo "curses support $curses"
> echo "curl support $curl"
> echo "check support $check_utests"
> @@ -2169,6 +2186,10 @@ fi
> if test "$cocoa" = "yes" ; then
> echo "CONFIG_COCOA=y">> $config_host_mak
> fi
> +if test "$directfb" = "yes" ; then
> + echo "CONFIG_DIRECTFB=y">> $config_host_mak
> + echo "DIRECTFB_CFLAGS=$directfb_cflags">> $config_host_mak
> +fi
> if test "$curses" = "yes" ; then
> echo "CONFIG_CURSES=y">> $config_host_mak
> fi
> diff --git a/console.h b/console.h
> index 6def115..d1dd211 100644
> --- a/console.h
> +++ b/console.h
> @@ -335,6 +335,9 @@ void qemu_console_resize(DisplayState *ds, int width, int height);
> void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
> int dst_x, int dst_y, int w, int h);
>
> +/* directfb.c */
> +void directfb_display_init(DisplayState *ds);
> +
> /* sdl.c */
> void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
>
> diff --git a/directfb.c b/directfb.c
> new file mode 100644
> index 0000000..6dea99a
> --- /dev/null
> +++ b/directfb.c
> @@ -0,0 +1,394 @@
> +/*
> + * QEMU DirectFB display driver
> + *
> + * Copyright (c) 2010 Citrix Systems, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include<console.h>
> +#include<keymaps.h>
> +
> +#include<directfb.h>
> +
> +static IDirectFB *dfb = NULL;
> +static IDirectFBSurface *primary = NULL;
> +static IDirectFBEventBuffer *events = NULL;
> +static IDirectFBSurface *guest = NULL;
> +
> +static void *screen_data = NULL;
> +static int screen_pitch = 0;
> +static int screen_bpp = 0;
> +static int screen_width = 0;
> +static int screen_height = 0;
> +static int scaling = 0;
> +
> +#define DIRECTFB_IS_VIDEO_PTR(p) \
> + (p>= (uint8_t *) screen_data&& \
> + p< (uint8_t *) screen_data + screen_height * screen_pitch)
> +
> +static DFBSurfacePixelFormat directfb_bpp_to_pixelformat(int bpp)
> +{
> + switch (bpp) {
> + case 16:
> + return DSPF_RGB16;
> + case 24:
> + return DSPF_RGB24;
> + case 32:
> + return DSPF_RGB32;
> + default:
> + return DSPF_UNKNOWN;
> + }
> +}
> +
> +static void directfb_clearscreen(void)
> +{
> + if (screen_data != NULL) {
> + /* Surface is locked */
> + memset(screen_data, 0x0,
> + screen_pitch * screen_height);
> + } else {
> + primary->SetColor(primary, 0x0, 0x0, 0x0, 0x0);
> + primary->FillRectangle(primary, 0, 0, screen_width, screen_height);
> + }
> +}
> +
> +static void directfb_update(struct DisplayState *s, int x, int y, int w, int h)
> +{
> + DFBRegion region = {x, y, x + w, y + h};
> +
> + if (guest) {
> + if (scaling) {
> + primary->StretchBlit(primary, guest, NULL, NULL);
> + } else {
> + int xoff = (screen_width - ds_get_width(s)) / 2;
> + int yoff = (screen_height - ds_get_height(s)) / 2;
> +
> + primary->Blit(primary, guest, NULL, xoff, yoff);
> +
> + region.x1 += xoff;
> + region.y1 += yoff;
> + region.x2 += xoff;
> + region.x2 += yoff;
> + }
> + }
> +
> + primary->Flip(primary,®ion, DSFLIP_NONE);
> +}
> +
> +static void directfb_setdata(DisplayState *s)
> +{
> + DFBSurfaceDescription dsc;
> +
> + if (guest) {
> + guest->Release(guest);
> + guest = NULL;
> + }
> +
> + dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT |
> + DSDESC_PIXELFORMAT | DSDESC_PREALLOCATED;
> + dsc.width = ds_get_width(s);
> + dsc.height = ds_get_height(s);
> + dsc.pixelformat = directfb_bpp_to_pixelformat(ds_get_bits_per_pixel(s));
> + dsc.preallocated[0].data = ds_get_data(s);
> + dsc.preallocated[0].pitch = ds_get_linesize(s);
> +
> + dfb->CreateSurface(dfb,&dsc,&guest);
> +}
> +
> +static void directfb_resize(struct DisplayState *s)
> +{
> + directfb_clearscreen();
> +
> + if (scaling || ds_get_bits_per_pixel(s) != screen_bpp ||
> + ds_get_linesize(s) != screen_pitch ||
> + !DIRECTFB_IS_VIDEO_PTR(ds_get_data(s))) {
> +
> + directfb_setdata(s);
> + } else {
> + if (guest) {
> + guest->Release(guest);
> + guest = NULL;
> + }
> + }
> +}
> +
> +static int directfb_buttons_state(DFBInputEvent *ev)
> +{
> + int buttons = 0;
> +
> + if (ev->buttons& DIBM_LEFT) {
> + buttons |= MOUSE_EVENT_LBUTTON;
> + }
> + if (ev->buttons& DIBM_RIGHT) {
> + buttons |= MOUSE_EVENT_RBUTTON;
> + }
> + if (ev->buttons& DIBM_MIDDLE) {
> + buttons |= MOUSE_EVENT_MBUTTON;
> + }
> +
> + return buttons;
> +}
> +
> +static void directfb_put_keycode(char keycode, int up)
> +{
> + int scancode = keycode;
> +
> + /* Pause/Break */
> + if (keycode == 119) {
> + scancode = 0x45;
> + kbd_put_keycode(0xe1);
> + kbd_put_keycode(0x1d | up ? 0x80 : 0x0);
> + } else {
> + /* grey key */
> + if (keycode>= 0x60&& keycode< 0x70) {
> + const char esc[16] = {0x1c, 0x1d, 0x35, 0x37,
> + 0x38, 0x46, 0x47, 0x48,
> + 0x49, 0x4b, 0x4d, 0x4f,
> + 0x50, 0x51, 0x52, 0x53};
> + scancode = esc[keycode - 0x60];
> + kbd_put_keycode(0xe0);
> +
> + /* PrintScreen */
> + if (keycode == 99) {
> + scancode = 0x37;
> + kbd_put_keycode(0x2a | up ? 0x80 : 0x0);
> + kbd_put_keycode(0xe0);
> + }
> + }
> + }
> +
> + kbd_put_keycode(scancode | (up ? 0x80 : 0x0));
> +}
> +
> +static void directfb_toggle_fullscreen(struct DisplayState *ds)
> +{
> + scaling = !scaling;
> +
> + vga_hw_invalidate();
> + vga_hw_update();
> +}
> +
> +static void directfb_refresh(struct DisplayState *s)
> +{
> + DFBInputEvent ev;
> +
> + vga_hw_update();
> +
> + while (events->GetEvent(events, DFB_EVENT(&ev)) == DFB_OK) {
> + switch (ev.type) {
> + case DIET_KEYRELEASE:
> + directfb_put_keycode(ev.key_code, 1);
> + break;
> + case DIET_KEYPRESS:
> + /* Toggle centered/fullscreen */
> + if ((ev.modifiers& DIMM_CONTROL)&&
> + (ev.modifiers& DIMM_ALT)&&
> + (ev.key_id == DIKI_ENTER)) {
> + directfb_toggle_fullscreen(s);
> + break;
> + }
> + directfb_put_keycode(ev.key_code, 0);
> + break;
> + case DIET_BUTTONPRESS:
> + case DIET_BUTTONRELEASE:
> + case DIET_AXISMOTION:
> + {
> + int buttons = directfb_buttons_state(&ev);
> + int dx = 0;
> + int dy = 0;
> + int dz = 0;
> +
> + if (ev.type == DIET_AXISMOTION) {
> + if (ev.axis == DIAI_X) {
> + dx = ev.axisrel;
> + }
> + if (ev.axis == DIAI_Y) {
> + dy = ev.axisrel;
> + }
> + if (ev.axis == DIAI_Z) {
> + dz = ev.axisrel;
> + }
> + }
> +
> + kbd_mouse_event(dx, dy, dz, buttons);
> + break;
> + }
> + case DIET_UNKNOWN:
> + default:
> + break;
> +
> + }
> + }
> +}
> +
> +static DisplaySurface* directfb_create_displaysurface(int width, int height)
> +{
> + DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface));
> + DFBSurfacePixelFormat spf;
> + surface->width = width;
> + surface->height = height;
> +
> + primary->GetPixelFormat(primary,&spf);
> +
> + if (scaling) {
> + int bytes_per_pixel = DFB_BYTES_PER_PIXEL(spf);
> +
> + if (bytes_per_pixel != 2&& bytes_per_pixel != 4) {
> + bytes_per_pixel = 4;
> + }
> +
> + surface->pf = qemu_default_pixelformat(8 * bytes_per_pixel);
> + surface->linesize = width * bytes_per_pixel;
> +
> + surface->flags = QEMU_ALLOCATED_FLAG;
> + surface->data = qemu_mallocz(surface->linesize * surface->height);
> + } else {
> + primary->Lock(primary, DSLF_READ | DSLF_WRITE,&screen_data,&screen_pitch);
> + surface->pf = qemu_default_pixelformat(screen_bpp);
> + surface->flags = QEMU_REALPIXELS_FLAG;
> + surface->linesize = screen_pitch;
> + surface->data = screen_data +
> + ((screen_height - height) / 2) * screen_pitch +
> + ((screen_width - width) / 2) * (screen_bpp / 8);
> + }
> +
> + return surface;
> +}
> +
> +static void directfb_free_displaysurface(DisplaySurface *surface)
> +{
> + if (surface == NULL)
> + return;
> +
> + if (surface->flags& QEMU_ALLOCATED_FLAG) {
> + qemu_free(surface->data);
> + } else if (surface->flags& QEMU_REALPIXELS_FLAG) {
> + primary->Unlock(primary);
> + screen_data = NULL;
> + screen_pitch = 0;
> + }
> +
> + surface->data = NULL;
> +
> + qemu_free(surface);
> +}
> +
> +static DisplaySurface* directfb_resize_displaysurface(DisplaySurface *surface,
> + int width,
> + int height)
> +{
> + directfb_free_displaysurface(surface);
> + return directfb_create_displaysurface(width, height);
> +}
> +
> +static DFBEnumerationResult directfb_attach_inputdevice(DFBInputDeviceID device_id,
> + DFBInputDeviceDescription desc,
> + void *data)
> +{
> + if (!strcmp(desc.vendor, "Linux")) {
> + return DFENUM_OK;
> + }
> +
> + if (desc.type == DIDID_KEYBOARD || desc.type | DIDTF_MOUSE) {
> + IDirectFBInputDevice *device;
> +
> + dfb->GetInputDevice(dfb, device_id,&device);
> +
> + if (events == NULL) {
> + device->CreateEventBuffer(device,&events);
> + } else {
> + device->AttachEventBuffer(device, events);
> + }
> + }
> +
> + return DFENUM_OK;
> +}
> +
> +void directfb_display_init(DisplayState *ds)
> +{
> + DisplayChangeListener *dcl;
> + DisplayAllocator *da;
> + DFBResult status;
> + DFBSurfaceDescription dsc;
> + DFBSurfaceCapabilities caps;
> + DFBSurfacePixelFormat spf;
> +
> + /*
> + * Prevent DirectFB to read qemu command line argument in procfs and
> + * parse it.
> + */
> + char prog_name[] = "qemu";
> + char *prog_argv[] = {prog_name};
> + char **dfb_argv = prog_argv;
> + int dfb_argc = 1;
> +
> + status = DirectFBInit(&dfb_argc,&dfb_argv);
> + if (status != DFB_OK) {
> + fprintf(stderr, "Could not initialize DirectFB(%d) - exiting\n", status);
> + exit(1);
> + }
> +
> + DirectFBCreate(&dfb);
> + dfb->SetCooperativeLevel(dfb, DFSCL_FULLSCREEN);
> + dsc.flags = DSDESC_CAPS;
> + dsc.caps = DSCAPS_PRIMARY | DSCAPS_VIDEOONLY | DSCAPS_SHARED;
> + status = dfb->CreateSurface(dfb,&dsc,&primary);
> +
> + if (status != DFB_OK) {
> + fprintf(stderr, "Could not create DirectFB surface(%d) - exiting\n", status);
> + exit(1);
> + }
> +
> + /* Double check surface capabilities */
> + primary->GetCapabilities(primary,&caps);
> + if ((caps& dsc.caps) != dsc.caps ||
> + caps& DSCAPS_FLIPPING || caps& DSCAPS_INTERLACED ||
> + caps& DSCAPS_SYSTEMONLY) {
> + fprintf(stderr, "Wrong DirectFB surface capabilities - exiting\n");
> + exit(1);
> + }
> +
> + primary->GetSize(primary,&screen_width,&screen_height);
> + primary->GetPixelFormat(primary,&spf);
> + screen_bpp = DFB_BITS_PER_PIXEL(spf);
> +
> + dfb->EnumInputDevices(dfb, directfb_attach_inputdevice, NULL);
> +
> + fprintf(stderr, "Initialized QEMU DirectFB driver. (%dx%d)\n",
> + screen_width, screen_height);
> +
> + dcl = qemu_mallocz(sizeof(DisplayChangeListener));
> + dcl->dpy_update = directfb_update;
> + dcl->dpy_resize = directfb_resize;
> + dcl->dpy_refresh = directfb_refresh;
> + dcl->dpy_setdata = directfb_setdata;
> + register_displaychangelistener(ds, dcl);
> +
> + da = qemu_mallocz(sizeof(DisplayAllocator));
> + da->create_displaysurface = directfb_create_displaysurface;
> + da->resize_displaysurface = directfb_resize_displaysurface;
> + da->free_displaysurface = directfb_free_displaysurface;
> +
> + directfb_clearscreen();
> +
> + if (register_displayallocator(ds, da) == da) {
> + dpy_resize(ds);
> + }
> +}
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 12f6b51..a4bdfbe 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -608,6 +608,16 @@ QEMU can display the VGA output when in text mode using a
> curses/ncurses interface. Nothing is displayed in graphical mode.
> ETEXI
>
> +#ifdef CONFIG_DIRECTFB
> +DEF("directfb", 0, QEMU_OPTION_directfb,
> + "-directfb enable DirectFB\n")
> +#endif
> +STEXI
> +@item -directfb
> +@findex -directfb
> +Enable DirectFB.
> +ETEXI
> +
> #ifdef CONFIG_SDL
> DEF("no-frame", 0, QEMU_OPTION_no_frame,
> "-no-frame open SDL window without a frame and window decorations\n",
> diff --git a/sysemu.h b/sysemu.h
> index fa921df..a2cd5b0 100644
> --- a/sysemu.h
> +++ b/sysemu.h
> @@ -98,6 +98,7 @@ typedef enum DisplayType
> DT_CURSES,
> DT_SDL,
> DT_VNC,
> + DT_DIRECTFB,
> DT_NOGRAPHIC,
> } DisplayType;
>
> diff --git a/vl.c b/vl.c
> index 85bcc84..e6235fa 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3199,6 +3199,11 @@ int main(int argc, char **argv, char **envp)
> case QEMU_OPTION_full_screen:
> full_screen = 1;
> break;
> +#ifdef CONFIG_DIRECTFB
> + case QEMU_OPTION_directfb:
> + display_type = DT_DIRECTFB;
> + break;
> +#endif
> #ifdef CONFIG_SDL
> case QEMU_OPTION_no_frame:
> no_frame = 1;
> @@ -3765,6 +3770,8 @@ int main(int argc, char **argv, char **envp)
> if (display_type == DT_DEFAULT) {
> #if defined(CONFIG_SDL) || defined(CONFIG_COCOA)
> display_type = DT_SDL;
> +#elif defined(CONFIG_DIRECTFB)
> + display_type = DT_DIRECTFB;
> #else
> display_type = DT_VNC;
> vnc_display = "localhost:0,to=99";
> @@ -3781,6 +3788,11 @@ int main(int argc, char **argv, char **envp)
> curses_display_init(ds, full_screen);
> break;
> #endif
> +#if defined(CONFIG_DIRECTFB)
> + case DT_DIRECTFB:
> + directfb_display_init(ds);
> + break;
> +#endif
> #if defined(CONFIG_SDL)
> case DT_SDL:
> sdl_display_init(ds, full_screen, no_frame);
>
next prev parent reply other threads:[~2010-05-14 17:07 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-14 16:58 [Qemu-devel] [PATCH] Add QEMU DirectFB display driver Julian Pidancet
2010-05-14 17:07 ` Anthony Liguori [this message]
2010-05-17 10:58 ` Gerd Hoffmann
2010-05-17 10:53 ` Gerd Hoffmann
2010-05-17 12:04 ` Julian Pidancet
2010-05-17 19:25 ` Gerd Hoffmann
2010-05-17 11:44 ` Christoph Hellwig
2010-05-17 12:14 ` Julian Pidancet
2010-05-17 12:35 ` Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2010-05-14 16:20 Julian Pidancet
2010-05-13 15:53 Julian Pidancet
2010-05-16 1:10 ` Paul Brook
2010-05-16 1:14 ` Alexander Graf
2010-05-17 13:30 ` Anthony Liguori
2010-05-17 15:09 ` Julian Pidancet
2010-05-17 16:28 ` Anthony Liguori
2010-05-17 20:20 ` Gerd Hoffmann
2010-05-17 20:32 ` Anthony Liguori
2010-05-17 21:35 ` malc
2010-05-17 21:43 ` Anthony Liguori
2010-05-17 21:45 ` malc
2010-05-17 22:26 ` Alexander Graf
2010-05-17 22:42 ` malc
2010-05-17 22:47 ` Anthony Liguori
2010-05-17 22:55 ` Alexander Graf
2010-05-17 23:17 ` Anthony Liguori
2010-05-17 22:46 ` Anthony Liguori
2010-05-17 22:49 ` Alexander Graf
2010-05-17 22:54 ` Anthony Liguori
2010-05-17 22:59 ` Alexander Graf
2010-05-18 8:09 ` Kevin Wolf
2010-05-18 9:12 ` Stefano Stabellini
2010-05-18 9:23 ` Gerd Hoffmann
2010-05-18 9:29 ` Stefano Stabellini
2010-05-18 9:39 ` Gerd Hoffmann
2010-05-18 10:34 ` Stefano Stabellini
2010-05-18 11:20 ` Gerd Hoffmann
2010-05-18 13:02 ` Anthony Liguori
2010-05-18 22:00 ` Gerd Hoffmann
2010-05-19 12:06 ` Stefano Stabellini
2010-05-19 13:38 ` Gerd Hoffmann
2010-05-19 13:52 ` Stefano Stabellini
2010-05-19 15:22 ` Gerd Hoffmann
2010-05-19 15:30 ` Stefano Stabellini
2010-05-19 16:06 ` Julian Pidancet
2010-05-19 16:30 ` Jamie Lokier
2010-05-20 7:32 ` Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BED8337.2000605@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=julian.pidancet@citrix.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).