[PATCH 0 of 2] Add SDL frame buffer support in libvirt-cim, V4

these patches would add support of SDL frame buffer configuration.

# HG changeset patch # User Wayne Xia <xiawenc@linux.vnet.ibm.com> # Date 1311593948 -28800 # Node ID 640ea61807cff06e1d15fd1885a8daaf6f2ffa3a # Parent 0f42cab9c45c53cc13407b16418399ed8ed4a026 (#4) made the graphic structure as union These change were made to allow SDL device properties added more clearly #4 remove tailing space, and added different free functions for graphic device Signed-off-by: Wayne Xia (Wayne) <xiawenc@linux.vnet.ibm.com> diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/device_parsing.c --- a/libxkutil/device_parsing.c Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/device_parsing.c Mon Jul 25 19:39:08 2011 +0800 @@ -88,13 +88,31 @@ free(dev->path); } +static void cleanup_vnc_device(struct graphics_device *dev) +{ + free(dev->type); + free(dev->dev.vnc.port); + free(dev->dev.vnc.host); + free(dev->dev.vnc.keymap); + free(dev->dev.vnc.passwd); +} + +static void cleanup_sdl_device(struct graphics_device *dev) +{ + free(dev->type); + free(dev->dev.sdl.display); + free(dev->dev.sdl.xauth); + free(dev->dev.sdl.fullscreen); +} + static void cleanup_graphics_device(struct graphics_device *dev) { - free(dev->type); - free(dev->port); - free(dev->host); - free(dev->keymap); - free(dev->passwd); + if (STREQC(dev->type, "sdl")) { + cleanup_sdl_device(dev); + } + else { + cleanup_vnc_device(dev); + } } static void cleanup_input_device(struct input_device *dev) @@ -530,12 +548,12 @@ CU_DEBUG("graphics device type = %s", gdev->type); if (STREQC(gdev->type, "vnc")) { - gdev->port = get_attr_value(node, "port"); - gdev->host = get_attr_value(node, "listen"); - gdev->keymap = get_attr_value(node, "keymap"); - gdev->passwd = get_attr_value(node, "passwd"); + gdev->dev.vnc.port = get_attr_value(node, "port"); + gdev->dev.vnc.host = get_attr_value(node, "listen"); + gdev->dev.vnc.keymap = get_attr_value(node, "keymap"); + gdev->dev.vnc.passwd = get_attr_value(node, "passwd"); - if (gdev->port == NULL || gdev->host == NULL) + if (gdev->dev.vnc.port == NULL || gdev->dev.vnc.host == NULL) goto err; } else if (STREQC(gdev->type, "pty")) { @@ -550,9 +568,9 @@ for (child = node->children; child != NULL; child = child->next) { if (XSTREQ(child->name, "source")) - gdev->host = get_attr_value(child, "path"); + gdev->dev.vnc.host = get_attr_value(child, "path"); else if (XSTREQ(child->name, "target")) - gdev->port = get_attr_value(child, "port"); + gdev->dev.vnc.port = get_attr_value(child, "port"); } } else { @@ -565,7 +583,7 @@ if (STREQC(gdev->type, "vnc")) ret = asprintf(&vdev->id, "%s", gdev->type); else - ret = asprintf(&vdev->id, "%s:%s", gdev->type, gdev->port); + ret = asprintf(&vdev->id, "%s:%s", gdev->type, gdev->dev.vnc.port); if (ret == -1) { CU_DEBUG("Failed to create graphics is string"); @@ -806,10 +824,10 @@ DUP_FIELD(dev, _dev, dev.emu.path); } else if (dev->type == CIM_RES_TYPE_GRAPHICS) { DUP_FIELD(dev, _dev, dev.graphics.type); - DUP_FIELD(dev, _dev, dev.graphics.port); - DUP_FIELD(dev, _dev, dev.graphics.host); - DUP_FIELD(dev, _dev, dev.graphics.keymap); - DUP_FIELD(dev, _dev, dev.graphics.passwd); + DUP_FIELD(dev, _dev, dev.graphics.dev.vnc.host); + DUP_FIELD(dev, _dev, dev.graphics.dev.vnc.port); + DUP_FIELD(dev, _dev, dev.graphics.dev.vnc.keymap); + DUP_FIELD(dev, _dev, dev.graphics.dev.vnc.passwd); } else if (dev->type == CIM_RES_TYPE_INPUT) { DUP_FIELD(dev, _dev, dev.input.type); DUP_FIELD(dev, _dev, dev.input.bus); diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/device_parsing.h --- a/libxkutil/device_parsing.h Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/device_parsing.h Mon Jul 25 19:39:08 2011 +0800 @@ -84,14 +84,28 @@ char *path; }; -struct graphics_device { - char *type; +//vnc_device must be larger or equal than sdl_device +struct vnc_device { char *port; char *host; char *keymap; char *passwd; }; +struct sdl_device { + char *display; + char *xauth; + char *fullscreen; +}; + +struct graphics_device { + char *type; + union { + struct vnc_device vnc; + struct sdl_device sdl; + } dev; +}; + struct input_device { char *type; char *bus; diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/xml_parse_test.c --- a/libxkutil/xml_parse_test.c Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/xml_parse_test.c Mon Jul 25 19:39:08 2011 +0800 @@ -116,7 +116,7 @@ FILE *d) { print_value(d, "Graphics Type", dev->dev.graphics.type); - print_value(d, "Graphics Port", dev->dev.graphics.port); + print_value(d, "Graphics Port", dev->dev.graphics.dev.vnc.port); } static void print_devices(struct domain *dominfo, diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/xmlgen.c --- a/libxkutil/xmlgen.c Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/xmlgen.c Mon Jul 25 19:39:08 2011 +0800 @@ -424,22 +424,22 @@ if (STREQC(dev->type, "sdl")) return NULL; - if (dev->port) { - xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->port); - if (STREQC(dev->port, "-1")) + if (dev->dev.vnc.port) { + xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->dev.vnc.port); + if (STREQC(dev->dev.vnc.port, "-1")) xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "yes"); else xmlNewProp(tmp, BAD_CAST "autoport", BAD_CAST "no"); } - if (dev->host) - xmlNewProp(tmp, BAD_CAST "listen", BAD_CAST dev->host); + if (dev->dev.vnc.host) + xmlNewProp(tmp, BAD_CAST "listen", BAD_CAST dev->dev.vnc.host); - if (dev->passwd) - xmlNewProp(tmp, BAD_CAST "passwd", BAD_CAST dev->passwd); + if (dev->dev.vnc.passwd) + xmlNewProp(tmp, BAD_CAST "passwd", BAD_CAST dev->dev.vnc.passwd); - if (dev->keymap) - xmlNewProp(tmp, BAD_CAST "keymap", BAD_CAST dev->keymap); + if (dev->dev.vnc.keymap) + xmlNewProp(tmp, BAD_CAST "keymap", BAD_CAST dev->dev.vnc.keymap); return NULL; } @@ -459,16 +459,16 @@ tmp = xmlNewChild(pty, NULL, BAD_CAST "source", NULL); if (tmp == NULL) return XML_ERROR; - - if(dev->host) - xmlNewProp(tmp, BAD_CAST "path", BAD_CAST dev->host); + + if(dev->dev.vnc.host) + xmlNewProp(tmp, BAD_CAST "path", BAD_CAST dev->dev.vnc.host); tmp = xmlNewChild(pty, NULL, BAD_CAST "target", NULL); if (tmp == NULL) return XML_ERROR; - - if(dev->port) - xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->port); + + if(dev->dev.vnc.port) + xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->dev.vnc.port); return NULL; } diff -r 0f42cab9c45c -r 640ea61807cf src/Virt_ComputerSystem.c --- a/src/Virt_ComputerSystem.c Mon Jul 25 13:14:22 2011 -0700 +++ b/src/Virt_ComputerSystem.c Mon Jul 25 19:39:08 2011 +0800 @@ -104,7 +104,7 @@ "Virtual System (Console on %s://%s:%s)", domain->dev_graphics[0].dev.graphics.type, host, - domain->dev_graphics[0].dev.graphics.port); + domain->dev_graphics[0].dev.graphics.dev.vnc.port); else ret = asprintf(&cap, "Virtual System (No console)"); diff -r 0f42cab9c45c -r 640ea61807cf src/Virt_Device.c --- a/src/Virt_Device.c Mon Jul 25 13:14:22 2011 -0700 +++ b/src/Virt_Device.c Mon Jul 25 19:39:08 2011 +0800 @@ -194,8 +194,8 @@ else rc = asprintf(&vp_str, "%s/%s:%s", dev->type, - dev->host, - dev->port); + dev->dev.vnc.host, + dev->dev.vnc.port); if (rc == -1) return 0; diff -r 0f42cab9c45c -r 640ea61807cf src/Virt_KVMRedirectionSAP.c --- a/src/Virt_KVMRedirectionSAP.c Mon Jul 25 13:14:22 2011 -0700 +++ b/src/Virt_KVMRedirectionSAP.c Mon Jul 25 19:39:08 2011 +0800 @@ -366,7 +366,7 @@ continue; } - ret = sscanf(dominfo->dev_graphics->dev.graphics.port, + ret = sscanf(dominfo->dev_graphics->dev.graphics.dev.vnc.port, "%d", &lport); if (ret != 1) { diff -r 0f42cab9c45c -r 640ea61807cf src/Virt_RASD.c --- a/src/Virt_RASD.c Mon Jul 25 13:14:22 2011 -0700 +++ b/src/Virt_RASD.c Mon Jul 25 19:39:08 2011 +0800 @@ -481,9 +481,9 @@ rc = asprintf(&addr_str, "%s", dev->dev.graphics.type); else { rc = asprintf(&addr_str, - "%s:%s", - dev->dev.graphics.host, - dev->dev.graphics.port); + "%s:%s", + dev->dev.graphics.dev.vnc.host, + dev->dev.graphics.dev.vnc.port); } CU_DEBUG("graphics Address = %s", addr_str); @@ -496,7 +496,7 @@ if (STREQC(dev->dev.graphics.type, "vnc")) { CMSetProperty(inst, "KeyMap", - (CMPIValue *)dev->dev.graphics.keymap, CMPI_chars); + (CMPIValue *)dev->dev.graphics.dev.vnc.keymap, CMPI_chars); conn = connect_by_classname(_BROKER, classname, &s); if (conn == NULL) @@ -511,7 +511,8 @@ goto out; } - if (dev->dev.graphics.passwd && strlen(dev->dev.graphics.passwd)) { + if (dev->dev.graphics.dev.vnc.passwd && + strlen(dev->dev.graphics.dev.vnc.passwd)) { CU_DEBUG("has password"); CMSetProperty(inst, "Password", (CMPIValue *)"********", CMPI_chars); diff -r 0f42cab9c45c -r 640ea61807cf src/Virt_VirtualSystemManagementService.c --- a/src/Virt_VirtualSystemManagementService.c Mon Jul 25 13:14:22 2011 -0700 +++ b/src/Virt_VirtualSystemManagementService.c Mon Jul 25 19:39:08 2011 +0800 @@ -370,10 +370,10 @@ } domain->dev_graphics->dev.graphics.type = strdup("vnc"); - domain->dev_graphics->dev.graphics.port = strdup("-1"); - domain->dev_graphics->dev.graphics.host = strdup("127.0.0.1"); - domain->dev_graphics->dev.graphics.keymap = strdup("en-us"); - domain->dev_graphics->dev.graphics.passwd = NULL; + domain->dev_graphics->dev.graphics.dev.vnc.port = strdup("-1"); + domain->dev_graphics->dev.graphics.dev.vnc.host = strdup("127.0.0.1"); + domain->dev_graphics->dev.graphics.dev.vnc.keymap = strdup("en-us"); + domain->dev_graphics->dev.graphics.dev.vnc.passwd = NULL; domain->dev_graphics_ct = 1; return true; @@ -1129,24 +1129,24 @@ } ret = parse_vnc_address(val, - &dev->dev.graphics.host, - &dev->dev.graphics.port); + &dev->dev.graphics.dev.vnc.host, + &dev->dev.graphics.dev.vnc.port); if (ret != 1) { msg = "GraphicsRASD field Address not valid"; goto out; } if (cu_get_str_prop(inst, "KeyMap", &val) != CMPI_RC_OK) - dev->dev.graphics.keymap = strdup("en-us"); + dev->dev.graphics.dev.vnc.keymap = strdup("en-us"); else - dev->dev.graphics.keymap = strdup(val); + dev->dev.graphics.dev.vnc.keymap = strdup(val); if (cu_get_str_prop(inst, "Password", &val) != CMPI_RC_OK) { CU_DEBUG("vnc password is not set"); - dev->dev.graphics.passwd = NULL; + dev->dev.graphics.dev.vnc.passwd = NULL; } else { CU_DEBUG("vnc password is set"); - dev->dev.graphics.passwd = strdup(val); + dev->dev.graphics.dev.vnc.passwd = strdup(val); } } else if (STREQC(dev->dev.graphics.type, "console") || @@ -1157,8 +1157,8 @@ } ret = parse_console_address(val, - &dev->dev.graphics.host, - &dev->dev.graphics.port); + &dev->dev.graphics.dev.vnc.host, + &dev->dev.graphics.dev.vnc.port); if (ret != 1) { msg = "GraphicsRASD field Address not valid"; goto out; @@ -1175,7 +1175,7 @@ ret = asprintf(&dev->id, "%s", dev->dev.graphics.type); else ret = asprintf(&dev->id, "%s:%s", - dev->dev.graphics.type, dev->dev.graphics.port); + dev->dev.graphics.type, dev->dev.graphics.dev.vnc.port); if (ret == -1) { msg = "Failed to create graphics is string";

On 07/29/2011 04:05 AM, Wayne Xia wrote: [snip]
diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/device_parsing.c --- a/libxkutil/device_parsing.c Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/device_parsing.c Mon Jul 25 19:39:08 2011 +0800 @@ -88,13 +88,31 @@ free(dev->path); }
+static void cleanup_vnc_device(struct graphics_device *dev) +{ + free(dev->type); + free(dev->dev.vnc.port); + free(dev->dev.vnc.host); + free(dev->dev.vnc.keymap); + free(dev->dev.vnc.passwd); +} + +static void cleanup_sdl_device(struct graphics_device *dev) +{ + free(dev->type); + free(dev->dev.sdl.display); + free(dev->dev.sdl.xauth); + free(dev->dev.sdl.fullscreen); +} + static void cleanup_graphics_device(struct graphics_device *dev) { - free(dev->type); - free(dev->port); - free(dev->host); - free(dev->keymap); - free(dev->passwd); + if (STREQC(dev->type, "sdl")) { + cleanup_sdl_device(dev); + } + else { + cleanup_vnc_device(dev); + } }
As dev->type is a common field, it should be on the cleanup_graphics function, while the cleanup_sdl and cleanup_vnc would handle the specifics thus avoiding code duplicity.
diff -r 0f42cab9c45c -r 640ea61807cf libxkutil/device_parsing.h --- a/libxkutil/device_parsing.h Mon Jul 25 13:14:22 2011 -0700 +++ b/libxkutil/device_parsing.h Mon Jul 25 19:39:08 2011 +0800 @@ -84,14 +84,28 @@ char *path; };
-struct graphics_device { - char *type; +//vnc_device must be larger or equal than sdl_device
With the specific cleanup functions this comment is not necessary. ACK, I think those small bits can be fixed before pushing. -- Eduardo de Barros Lima Software Engineer, Open Virtualization Linux Technology Center - IBM/Brazil eblima@br.ibm.com

# HG changeset patch # User Wayne Xia <xiawenc@linux.vnet.ibm.com> # Date 1311670971 -28800 # Node ID f170cdc0acb579c417327e8179c2f23d09b34281 # Parent 640ea61807cff06e1d15fd1885a8daaf6f2ffa3a (#4) add sdl frame buffer support. Now libvirt still supports sdl frame buffer, and it may take three parameters: display,xauth,fullscreen. This patch enable the libvirt-cim to accept these configuration and pass them in XML define to let libvirt know about it. Exposed interface could be found in the file ResourceAllocationSettingData.mof. #4 removed the link in the comments. Signed-off-by: Wayne Xia (Wayne) <xiawenc@linux.vnet.ibm.com> diff -r 640ea61807cf -r f170cdc0acb5 libxkutil/device_parsing.c --- a/libxkutil/device_parsing.c Mon Jul 25 19:39:08 2011 +0800 +++ b/libxkutil/device_parsing.c Tue Jul 26 17:02:51 2011 +0800 @@ -556,6 +556,11 @@ if (gdev->dev.vnc.port == NULL || gdev->dev.vnc.host == NULL) goto err; } + else if (STREQC(gdev->type, "sdl")) { + gdev->dev.sdl.display = get_attr_value(node, "display"); + gdev->dev.sdl.xauth = get_attr_value(node, "xauth"); + gdev->dev.sdl.fullscreen = get_attr_value(node, "fullscreen"); + } else if (STREQC(gdev->type, "pty")) { if (node->name == NULL) goto err; diff -r 640ea61807cf -r f170cdc0acb5 libxkutil/xmlgen.c --- a/libxkutil/xmlgen.c Mon Jul 25 19:39:08 2011 +0800 +++ b/libxkutil/xmlgen.c Tue Jul 26 17:02:51 2011 +0800 @@ -421,8 +421,21 @@ xmlNewProp(tmp, BAD_CAST "type", BAD_CAST dev->type); - if (STREQC(dev->type, "sdl")) - return NULL; + if (STREQC(dev->type, "sdl")) { + if (dev->dev.sdl.display) { + xmlNewProp(tmp, BAD_CAST "display", + BAD_CAST dev->dev.sdl.display); + } + if (dev->dev.sdl.xauth) { + xmlNewProp(tmp, BAD_CAST "xauth", + BAD_CAST dev->dev.sdl.xauth); + } + if (dev->dev.sdl.fullscreen) { + xmlNewProp(tmp, BAD_CAST "fullscreen", + BAD_CAST dev->dev.sdl.fullscreen); + } + return NULL; + } if (dev->dev.vnc.port) { xmlNewProp(tmp, BAD_CAST "port", BAD_CAST dev->dev.vnc.port); diff -r 640ea61807cf -r f170cdc0acb5 schema/ResourceAllocationSettingData.mof --- a/schema/ResourceAllocationSettingData.mof Mon Jul 25 19:39:08 2011 +0800 +++ b/schema/ResourceAllocationSettingData.mof Tue Jul 26 17:02:51 2011 +0800 @@ -219,7 +219,9 @@ [Description ("If ResourceSubType is 'vnc', this is a VNC Address. " "IPv4 in a.b.c.d:port or IPv6 in [ip]:port format. If ResourceSubType " "is 'console', this is a character device path in " - "path:port format (e.g., '/dev/pts/3:0'\)")] + "path:port format (e.g., '/dev/pts/3:0'\) " + "if ResourceSubType is 'sdl', this is a combination of its params as " + "xauth:display (e.g., '/root/.Xauthority::0'\)")] string Address; [Description ("Keyboard keymapping")] @@ -228,7 +230,8 @@ [Description ("VNC password")] string Password; - [Description ("Is IPv6 only addressing is to be used")] + [Description ("Is IPv6 only addressing is to be used." + "if ResourceSubType is 'sdl', this means whether sdl is fullscreen")] boolean IsIPv6Only; }; diff -r 640ea61807cf -r f170cdc0acb5 src/Virt_VirtualSystemManagementService.c --- a/src/Virt_VirtualSystemManagementService.c Mon Jul 25 19:39:08 2011 +0800 +++ b/src/Virt_VirtualSystemManagementService.c Tue Jul 26 17:02:51 2011 +0800 @@ -1060,6 +1060,52 @@ return ret; } +static int parse_sdl_address(const char *id, + char **display, + char **xauth) +{ + int ret; + char *tmp_display = NULL; + char *tmp_xauth = NULL; + + CU_DEBUG("Entering parse_sdl_address, address is %s", id); + + ret = sscanf(id, "%a[^:]:%as", &tmp_xauth, &tmp_display); + + if (ret <= 0) { + ret = sscanf(id, ":%as", &tmp_display); + if (ret <= 0) { + if (STREQC(id, ":")) { + /* do nothing, it is empty */ + } + else { + ret = 0; + goto out; + } + } + } + + if (display) { + if (tmp_display == NULL) + *display = NULL; + else + *display = strdup(tmp_display); + } + if (xauth) { + if (tmp_xauth == NULL) + *xauth = NULL; + else + *xauth = strdup(tmp_xauth); + } + ret = 1; + + out: + CU_DEBUG("Exiting parse_sdl_address, display is %s, xauth is %s", + *display, *xauth); + + return ret; +} + static int parse_vnc_address(const char *id, char **ip, char **port) @@ -1163,6 +1209,30 @@ msg = "GraphicsRASD field Address not valid"; goto out; } + } + else if (STREQC(dev->dev.graphics.type, "sdl")) { + if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) { + CU_DEBUG("sdl graphics Address empty, using default"); + dev->dev.graphics.dev.sdl.display = NULL; + dev->dev.graphics.dev.sdl.xauth = NULL; + } + else { + ret = parse_sdl_address(val, + &dev->dev.graphics.dev.sdl.display, + &dev->dev.graphics.dev.sdl.xauth); + if (ret != 1) { + msg = "GraphicsRASD sdl Address not valid"; + goto out; + } + } + dev->dev.graphics.dev.sdl.fullscreen = NULL; + if (cu_get_bool_prop(inst, "IsIPV6Only", &ipv6) == + CMPI_RC_OK) { + if (ipv6) + dev->dev.graphics.dev.sdl.fullscreen = strdup("yes"); + else + dev->dev.graphics.dev.sdl.fullscreen = strdup("no"); + } } else { CU_DEBUG("Unsupported graphics type %s", dev->dev.graphics.type); @@ -1171,7 +1241,8 @@ } free(dev->id); - if (STREQC(dev->dev.graphics.type, "vnc")) + if ((STREQC(dev->dev.graphics.type, "vnc"))|| + (STREQC(dev->dev.graphics.type, "sdl"))) ret = asprintf(&dev->id, "%s", dev->dev.graphics.type); else ret = asprintf(&dev->id, "%s:%s",

On 07/29/2011 04:05 AM, Wayne Xia wrote:
diff -r 640ea61807cf -r f170cdc0acb5 src/Virt_VirtualSystemManagementService.c --- a/src/Virt_VirtualSystemManagementService.c Mon Jul 25 19:39:08 2011 +0800 +++ b/src/Virt_VirtualSystemManagementService.c Tue Jul 26 17:02:51 2011 +0800 @@ -1060,6 +1060,52 @@ return ret; }
+static int parse_sdl_address(const char *id, + char **display, + char **xauth) +{ + int ret; + char *tmp_display = NULL; + char *tmp_xauth = NULL; + + CU_DEBUG("Entering parse_sdl_address, address is %s", id); + + ret = sscanf(id, "%a[^:]:%as",&tmp_xauth,&tmp_display); + + if (ret<= 0) { + ret = sscanf(id, ":%as",&tmp_display); + if (ret<= 0) { + if (STREQC(id, ":")) { + /* do nothing, it is empty */ + } + else { + ret = 0; + goto out; + } + } + } + + if (display) { + if (tmp_display == NULL) + *display = NULL; + else + *display = strdup(tmp_display); + } + if (xauth) { + if (tmp_xauth == NULL) + *xauth = NULL; + else + *xauth = strdup(tmp_xauth); + } + ret = 1; + + out:
This would leak tmp_display and tmp_xauth variables. According to sscanf(3), the 'a' character implies the resulting buffer should be freed. free(tmp_display); free(tmp_xauth);
+ CU_DEBUG("Exiting parse_sdl_address, display is %s, xauth is %s", + *display, *xauth); + + return ret; +}
ACK. Again, this could be fixed before push. -- Eduardo de Barros Lima Software Engineer, Open Virtualization Linux Technology Center - IBM/Brazil eblima@br.ibm.com

On 07/29/2011 04:05 AM, Wayne Xia wrote:
these patches would add support of SDL frame buffer configuration.
Oh, I somehow missed these patches in my inbox. So sorry! Review following! -- Eduardo de Barros Lima Software Engineer, Open Virtualization Linux Technology Center - IBM/Brazil eblima@br.ibm.com
participants (2)
-
Eduardo Lima (Etrunko)
-
Wayne Xia