All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: xen-devel <xen-devel@lists.xensource.com>
Subject: [PATCH 1/4][RFC] Paravirtual Framebuffer/Keyboard
Date: Sun, 15 Jan 2006 17:40:31 -0600	[thread overview]
Message-ID: <43CADD6F.1050407@us.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1 bytes --]



[-- Attachment #2: vfb-8613.diff --]
[-- Type: text/plain, Size: 10645 bytes --]

# HG changeset patch
# User Anthony Liguori <anthony@codemonkey.ws>
# Node ID 431a5f12b57f2fbc2f462523f0ff71a667837a9d
# Parent  d783bdd14f2eff514e36b92ded0e3d22be7cf3d0
General plumbing for Xen Framebuffer and Keyboard.  This includes:

1) Some modifications to VT setup to remove our null console hacks
2) Additional resume plumbing for framebuffer/keyboard resume
3) Modifications to the build/resume to setup shared memory and event channels
   for framebuffer/keyboard devices
4) Modifications to Xend to support a new vnc directive for paravirtual domains

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>

diff -r d783bdd14f2e -r 431a5f12b57f linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c
--- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c	Sat Jan 14 23:40:09 2006 +0100
+++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c	Sun Jan 15 18:05:57 2006 -0500
@@ -1752,13 +1752,13 @@
 #endif
 #endif
 	} else {
-#ifdef CONFIG_XEN_PHYSDEV_ACCESS
-		extern const struct consw xennull_con;
-		extern int console_use_vt;
-#if defined(CONFIG_VGA_CONSOLE)
+#if defined(CONFIG_XEN_PHYSDEV_ACCESS) && defined(CONFIG_VGA_CONSOLE)
 		/* disable VGA driver */
 		ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB;
 #endif
+#if defined(CONFIG_DUMMY_CONSOLE)
+		conswitchp = &dummy_con;
+#else
 		conswitchp = &xennull_con;
 		console_use_vt = 0;
 #endif
diff -r d783bdd14f2e -r 431a5f12b57f linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
--- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c	Sat Jan 14 23:40:09 2006 +0100
+++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c	Sun Jan 15 18:05:57 2006 -0500
@@ -16,6 +16,8 @@
 #include <linux/cpu.h>
 #include <linux/kthread.h>
 #include <asm-xen/xencons.h>
+#include <linux/xenkbd.h>
+#include <linux/xenfb.h>
 
 #if defined(__i386__) || defined(__x86_64__)
 /*
@@ -148,6 +150,8 @@
 
 	xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
 	xen_start_info->console_mfn = mfn_to_pfn(xen_start_info->console_mfn);
+	xen_start_info->fbdev_mfn = mfn_to_pfn(xen_start_info->fbdev_mfn);
+	xen_start_info->kbd_mfn = mfn_to_pfn(xen_start_info->kbd_mfn);
 
 	/*
 	 * We'll stop somewhere inside this hypercall. When it returns,
@@ -188,6 +192,12 @@
 	__sti();
 
 	xencons_resume();
+#ifndef CONFIG_XEN_PRIVILEGED_GUEST
+#if 1
+	xenfb_resume();
+#endif
+	xenkbd_resume();
+#endif
 
 #ifdef CONFIG_SMP
 	for_each_cpu(i)
diff -r d783bdd14f2e -r 431a5f12b57f tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c	Sat Jan 14 23:40:09 2006 +0100
+++ b/tools/libxc/xc_linux_build.c	Sun Jan 15 18:05:57 2006 -0500
@@ -434,6 +434,8 @@
     shared_info_t *shared_info;
     xc_mmu_t *mmu = NULL;
     int rc;
+    unsigned long _fbdev_mfn = 0, *fbdev_mfn = &_fbdev_mfn;
+    unsigned long _kbd_mfn = 0, *kbd_mfn = &_kbd_mfn;
 
     unsigned long nr_pt_pages;
     unsigned long physmap_pfn;
@@ -451,11 +453,17 @@
     unsigned long vstoreinfo_end;
     unsigned long vconsole_start;
     unsigned long vconsole_end;
+    unsigned long vfbdev_start;
+    unsigned long vfbdev_end;
+    unsigned long vkbd_start;
+    unsigned long vkbd_end;
     unsigned long vstack_start;
     unsigned long vstack_end;
     unsigned long vpt_start;
     unsigned long vpt_end;
     unsigned long v_end;
+    int fbdev_evtchn;
+    int kbd_evtchn;
 
     rc = probeimageformat(image, image_size, &load_funcs);
     if ( rc != 0 )
@@ -490,7 +498,11 @@
     vstoreinfo_end   = vstoreinfo_start + PAGE_SIZE;
     vconsole_start   = vstoreinfo_end;
     vconsole_end     = vconsole_start + PAGE_SIZE;
-    vpt_start        = vconsole_end; 
+    vfbdev_start     = vconsole_end;
+    vfbdev_end       = vfbdev_start + PAGE_SIZE;
+    vkbd_start       = vfbdev_end;
+    vkbd_end         = vkbd_start + PAGE_SIZE;
+    vpt_start        = vkbd_end; 
 
     for ( nr_pt_pages = 2; ; nr_pt_pages++ )
     {
@@ -667,8 +679,54 @@
 
     *store_mfn = page_array[(vstoreinfo_start-dsi.v_start) >> PAGE_SHIFT];
     *console_mfn = page_array[(vconsole_start-dsi.v_start) >> PAGE_SHIFT];
+    *fbdev_mfn = page_array[(vfbdev_start-dsi.v_start) >> PAGE_SHIFT];
+    *kbd_mfn = page_array[(vkbd_start-dsi.v_start) >> PAGE_SHIFT];
+
+    fbdev_evtchn = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
+    if (fbdev_evtchn == -1)
+        goto error_out;
+
+    kbd_evtchn = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
+    if (kbd_evtchn == -1)
+        goto error_out;
+
+    {
+        char buffer[1024];
+        FILE *f;
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.mfn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%lu\n", *fbdev_mfn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.evtchn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%d\n", fbdev_evtchn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.mfn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%lu\n", *kbd_mfn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.evtchn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%d\n", kbd_evtchn);
+            fclose(f);
+        }
+    }
+
     if ( xc_clear_domain_page(xc_handle, dom, *store_mfn) ||
-         xc_clear_domain_page(xc_handle, dom, *console_mfn) )
+         xc_clear_domain_page(xc_handle, dom, *console_mfn) ||
+         xc_clear_domain_page(xc_handle, dom, *fbdev_mfn) ||
+         xc_clear_domain_page(xc_handle, dom, *kbd_mfn) )
         goto error_out;
 
     start_info = xc_map_foreign_range(
@@ -689,6 +747,11 @@
     start_info->store_evtchn = store_evtchn;
     start_info->console_mfn   = *console_mfn;
     start_info->console_evtchn = console_evtchn;
+    start_info->fbdev_mfn    = *fbdev_mfn;
+    start_info->fbdev_evtchn = fbdev_evtchn;
+    start_info->kbd_mfn      = *kbd_mfn;
+    start_info->kbd_evtchn   = kbd_evtchn;
+
     if ( initrd_len != 0 )
     {
         start_info->mod_start    = vinitrd_start;
diff -r d783bdd14f2e -r 431a5f12b57f tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c	Sat Jan 14 23:40:09 2006 +0100
+++ b/tools/libxc/xc_linux_restore.c	Sun Jan 15 18:05:57 2006 -0500
@@ -149,6 +149,9 @@
 
     struct mmuext_op pin[MAX_PIN_BATCH];
     unsigned int nr_pins; 
+
+    unsigned long xenkbd_mfn, xenfb_mfn;
+    int xenkbd_evtchn, xenfb_evtchn;
 
 
     max_pfn = nr_pfns; 
@@ -627,6 +630,48 @@
     start_info->store_evtchn                 = store_evtchn;
     *console_mfn = start_info->console_mfn   = p2m[start_info->console_mfn];
     start_info->console_evtchn               = console_evtchn;
+    xenfb_mfn = start_info->fbdev_mfn        = p2m[start_info->fbdev_mfn];
+    xenkbd_mfn = start_info->kbd_mfn         = p2m[start_info->kbd_mfn];
+
+    xenfb_evtchn = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
+    xenkbd_evtchn = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
+
+    start_info->fbdev_evtchn = xenfb_evtchn;
+    start_info->kbd_evtchn = xenkbd_evtchn;
+
+    {
+        char buffer[1024];
+        FILE *f;
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.mfn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%lu\n", xenfb_mfn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenfb/%d.evtchn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%d\n", xenfb_evtchn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.mfn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%lu\n", xenkbd_mfn);
+            fclose(f);
+        }
+
+        snprintf(buffer, sizeof(buffer), "/var/run/xenkbd/%d.evtchn", dom);
+        f = fopen(buffer, "w");
+        if (f) {
+            fprintf(f, "%d\n", xenkbd_evtchn);
+            fclose(f);
+        }
+    }
+
     munmap(start_info, PAGE_SIZE);
 
     /* Uncanonicalise each GDT frame number. */
diff -r d783bdd14f2e -r 431a5f12b57f tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py	Sat Jan 14 23:40:09 2006 +0100
+++ b/tools/python/xen/xend/image.py	Sun Jan 15 18:05:57 2006 -0500
@@ -163,6 +163,20 @@
 
     ostype = "linux"
 
+    def configure(self, imageConfig, deviceConfig):
+        ImageHandler.configure(self, imageConfig, deviceConfig)
+
+        vnc = sxp.child_value(imageConfig, 'vnc')
+
+        self.pid = 0
+        
+        if vnc:
+            log.info('spawning vncfb: %s %s', '/usr/lib/xen/bin/vncfb', ['vncfb', str(self.vm.getDomid())])
+            self.pid = os.spawnv(os.P_NOWAIT, '/usr/lib/xen/bin/vncfb', ['vncfb', str(self.vm.getDomid())])
+            log.info('vncfb pid: %d', self.pid)
+        else:
+            log.info('vnc is not set (disabling)')
+
     def buildDomain(self):
         store_evtchn = self.vm.getStorePort()
         console_evtchn = self.vm.getConsolePort()
@@ -181,6 +195,14 @@
                               console_evtchn = console_evtchn,
                               cmdline        = self.cmdline,
                               ramdisk        = self.ramdisk)
+
+    def destroy(self):
+        import signal
+        if not self.pid:
+            return
+        os.kill(self.pid, signal.SIGKILL)
+        os.waitpid(self.pid, 0)
+        self.pid = 0
 
 class VmxImageHandler(ImageHandler):
 
diff -r d783bdd14f2e -r 431a5f12b57f tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py	Sat Jan 14 23:40:09 2006 +0100
+++ b/tools/python/xen/xm/create.py	Sun Jan 15 18:05:57 2006 -0500
@@ -436,6 +436,8 @@
 
     if vals.builder == 'vmx':
         configure_vmx(config_image, vals)
+    elif vals.vnc:
+        config_image.append(['vnc', vals.vnc])
         
     return config_image
     
diff -r d783bdd14f2e -r 431a5f12b57f xen/include/public/xen.h
--- a/xen/include/public/xen.h	Sat Jan 14 23:40:09 2006 +0100
+++ b/xen/include/public/xen.h	Sun Jan 15 18:05:57 2006 -0500
@@ -408,6 +408,10 @@
     uint32_t store_evtchn;      /* Event channel for store communication. */
     unsigned long console_mfn;  /* MACHINE address of console page.       */
     uint32_t console_evtchn;    /* Event channel for console messages.    */
+    unsigned long fbdev_mfn;
+    uint32_t fbdev_evtchn;
+    unsigned long kbd_mfn;
+    uint32_t kbd_evtchn;
     /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME).     */
     unsigned long pt_base;      /* VIRTUAL address of page directory.     */
     unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames.       */

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

                 reply	other threads:[~2006-01-15 23:40 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=43CADD6F.1050407@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=xen-devel@lists.xensource.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.