Skip to contentSkip to conversation

Paravirt framebuffer xend integration [3/6]

PATCH New Jeremy Katz 1 participant 1 message Aug 18, 2006

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Paravirt framebuffer xend integration [3/6]

Add support in xend and xm to know about the vnc and sdl options for PV domains. Launch xen-sdlfb or xen-vncfb if we're setting up a graphics console. Also, if we're going to use a graphical console in the guest, set /<dompath>/console/use_graphics to 1.

Right now, this is sitting on the back of the HVM device model code which seemed like a logical extension as the graphics console really is just a device model.

Jeremy

tools/python/xen/xend/image.py +60 -1
diff -r 103a9f38f17f -r 5c452351be21 tools/python/xen/xend/image.py
@@ -20,6 +20,7 @@ import os, string
 import os, string
 import re
 import math
+import signal
 
 import xen.lowlevel.xc
 from xen.xend import sxp
@@ -190,6 +191,65 @@ class LinuxImageHandler(ImageHandler):
                               cmdline        = self.cmdline,
                               ramdisk        = self.ramdisk,
                               features       = self.vm.getFeatures())
+
+    def configure(self, imageConfig, deviceConfig):
+        ImageHandler.configure(self, imageConfig, deviceConfig)
+
+        self.pid = 0
+        log.info("configuring linux guest")
+
+        # set up the graphics bits.
+        # FIXME: this is much like what we do for HVM, should it be 
+        # for all image types now?
+        self.display = sxp.child_value(imageConfig, 'display')
+        self.xauthority = sxp.child_value(imageConfig, 'xauthority')
+        self.vncconsole = sxp.child_value(imageConfig, 'vncconsole')
+        self.vnc = sxp.child_value(imageConfig, 'vnc')
+        self.sdl = sxp.child_value(imageConfig, 'sdl')
+        if self.vnc:
+            self.vncdisplay = sxp.child_value(imageConfig, 'vncdisplay',
+                                              int(self.vm.getDomid()))
+            self.vncunused = sxp.child_value(imageConfig, 'vncunused')
+        if self.vnc or self.sdl:
+            log.info("setting use_graphics")
+            self.vm.writeDom("console/use_graphics", "1")
+        else:
+            self.vm.writeDom("console/use_graphics", "0")
+
+    def createDeviceModel(self):
+        if self.pid:
+            return
+        # Execute device model (for us, it's just the fb frontend)
+        if not self.vnc and not self.sdl:
+            return
+
+        if self.vnc:
+            args = ["/usr/lib/xen/bin/xen-vncfb"]
+            if self.vncdisplay:
+                p = 5900 + self.vncdisplay
+            else:
+                p = 5900 + self.vm.getDomid()
+            args = args + [ "--vncport", "%d" % (p,) ]
+            self.vm.writeDom("console/vnc-port", "p")
+        elif self.sdl:
+            args = ["/usr/lib/xen/bin/xen-sdlfb"]
+        args = args + [ "--domid", "%d" % self.vm.getDomid(),
+                        "--title", self.vm.info['name'] ]
+        env = dict(os.environ)
+        if self.display:
+            env['DISPLAY'] = self.display
+        if self.xauthority:
+            env['XAUTHORITY'] = self.xauthority
+        log.info("spawning video: %s", args)
+        self.pid = os.spawnve(os.P_NOWAIT, args[0], args, env)
+        log.info("device model pid: %d", self.pid)
+
+    def destroy(self):
+        if not self.pid:
+            return
+        os.kill(self.pid, signal.SIGKILL)
+        os.waitpid(self.pid, 0)
+        self.pid = 0
 
 class HVMImageHandler(ImageHandler):
 
@@ -342,7 +402,6 @@ class HVMImageHandler(ImageHandler):
 
     def destroy(self):
         self.unregister_shutdown_watch();
-        import signal
         if not self.pid:
             return
         os.kill(self.pid, signal.SIGKILL)
tools/python/xen/xm/create.py +11 -2
diff -r 103a9f38f17f -r 5c452351be21 tools/python/xen/xm/create.py
@@ -479,6 +479,8 @@ def configure_image(vals):
 
     if vals.builder == 'hvm':
         configure_hvm(config_image, vals)
+
+    configure_graphics(config_image, vals)        
         
     return config_image
     
@@ -626,14 +628,21 @@ def configure_vifs(config_devs, vals):
         map(f, d.keys())
         config_devs.append(['device', config_vif])
 
+def configure_graphics(config_image, vals):
+    """Create the config for graphic consoles.
+    """
+    args = [ 'vnc', 'vncdisplay', 'vncconsole', 'vncunused',
+             'sdl', 'display', 'xauthority' ]
+    for a in args:
+        if (vals.__dict__[a]):
+            config_image.append([a, vals.__dict__[a]])
 
 def configure_hvm(config_image, vals):
     """Create the config for HVM devices.
     """
     args = [ 'device_model', 'pae', 'vcpus', 'boot', 'fda', 'fdb',
              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'soundhw',
-             'vnc', 'vncdisplay', 'vncunused', 'vncconsole', 'sdl', 'display',
-             'acpi', 'apic', 'xauthority', 'usb', 'usbdevice' ]
+             'acpi', 'apic', 'usb', 'usbdevice' ]
     for a in args:
         if (vals.__dict__[a]):
             config_image.append([a, vals.__dict__[a]])

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel