[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4][RFC] Paravirtual Framebuffer/Keyboard
# HG changeset patch # User Anthony Liguori <anthony@xxxxxxxxxxxxx> # 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@xxxxxxxxxx> 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. */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |