From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiageng Yu Subject: Re: Linux Stubdom Problem Date: Tue, 23 Aug 2011 17:39:44 +0800 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=90e6ba6135b2c11b7504ab28f920 Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Stefano Stabellini Cc: "Xen-devel@lists.xensource.com" , Keir Fraser , tim@xen.org, Ian Campbell , Anthony PERARD , Samuel Thibault List-Id: xen-devel@lists.xenproject.org --90e6ba6135b2c11b7504ab28f920 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable 2011/8/23 Stefano Stabellini : > On Mon, 22 Aug 2011, Jiageng Yu wrote: >> Hi Stefano, >> >> =C2=A0 =C2=A0 =C2=A0I am trying to fix the vram mapping issue. That is m= y new patch. >> It is still needed to debug. Please check it for me and make sure I am >> running on the right way. >> >> =C2=A0 =C2=A0 I define a new enmu type Stubdom_Vga_State which is used t= o notify >> xen_remap_bucket whether to map the vram memory. In >> fbdev_pv_display_prepare function, I map the xen_fbfront memory to >> qemu (fb_mem) and directly incoke ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, >> &ioctlx) to map the vram of hvm guest. >> > > The current implementation of IOCTL_PRIVCMD_MMAPBATCH is only capable of > mapping foreign mfns into the address space of the caller, while we need > to remap a set of pages already mapped in the address space of the > caller to some gmfns of a foreign domain. In other words we need the > same functionality but in the other direction. > > First of all we need an hypercall to remap a given mfn to a guest gmfn > and currently there are no hypercalls that do that, so we need to add a > new one or extend an existing hypercall. > I suggest extending xc_domain_add_to_physmap with a new XENMAPSPACE, > called XENMAPSPACE_mfn that takes an mfn and maps it into a particular > gmfn. > > > From the Xen point of view we need to add a new XENMAPSPACE_mfn case to > xen/arch/x86/mm.c:arch_memory_op, the basic implementation should be > something like the following (uncompiled, untested): > > diff -r a79c1d5b946e xen/arch/x86/mm.c > --- a/xen/arch/x86/mm.c Fri Aug 19 10:00:25 2011 +0100 > +++ b/xen/arch/x86/mm.c Mon Aug 22 17:51:41 2011 +0000 > @@ -4618,6 +4618,16 @@ long arch_memory_op(int op, XEN_GUEST_HA > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 page =3D mfn_to_page(mfn); > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > + =C2=A0 =C2=A0 =C2=A0 =C2=A0case XENMAPSPACE_mfn: > + =C2=A0 =C2=A0 =C2=A0 =C2=A0{ > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ( !IS_PRIV_FOR(current->dom= ain, d) ) > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return -EINVAL; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0mfn =3D xatp.idx; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0page =3D mfn_to_page(mfn); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > =C2=A0 =C2=A0 =C2=A0 =C2=A0 default: > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > @@ -4648,10 +4658,12 @@ long arch_memory_op(int op, XEN_GUEST_HA > =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Unmap from old location, if any. */ > - =C2=A0 =C2=A0 =C2=A0 =C2=A0gpfn =3D get_gpfn_from_mfn(mfn); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0ASSERT( gpfn !=3D SHARED_M2P_ENTRY ); > - =C2=A0 =C2=A0 =C2=A0 =C2=A0if ( gpfn !=3D INVALID_M2P_ENTRY ) > - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0guest_physmap_remove_page(d, g= pfn, mfn, 0); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if ( xatp.space !=3D XENMAPSPACE_mfn && d != =3D current->domain ) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0gpfn =3D get_gpfn_from_mfn(mfn= ); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ASSERT( gpfn !=3D SHARED_M2P_E= NTRY ); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if ( gpfn !=3D INVALID_M2P_ENT= RY ) > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0guest_physmap_re= move_page(d, gpfn, mfn, 0); > + =C2=A0 =C2=A0 =C2=A0 =C2=A0} > > =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Map at new location. */ > =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D guest_physmap_add_page(d, xatp.gpfn, m= fn, 0); > > > Unfortunately qemu doesn't know how to find the mfns corresponding to > the mmap'ed framebuffer and I would rather avoid writing a pagetable > walker in qemu. > Thus we need to use the linux kernel to do the virtual address to mfn > translation and issue the hypercall. > We can add a new privcmd ioctl IOCTL_PRIVCMD_FOREIGN_MAP: qemu calls this > ioctl with the mmap'ed framebuffer address, the size of the framebuffer > and the destination gmfns. > The implementation of the ioctl in the kernel would: > > - find the list of mfns corresponding to the arguments, using > arbitrary_virt_to_machine; > > - for each mfn, call the hypercall we extended with the appropriate > arguments, it would end up being > HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp); > > - there would be no "if (!xen_initial_domain())" check, because this > ioctl can be called by stubdoms. > > > So the call trace would be: > > qemu: ioctl(fd, IOCTL_PRIVCMD_FOREIGN_MAP, &ioctlx); > > | > v > > linux: HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp); > > | > v > > xen: guest_physmap_add_page Yes. I am already working on it. > > > Has anybody any better ideas? > > >> diff --git a/fbdev.c b/fbdev.c >> index a601b48..f7ff682 100644 >> --- a/fbdev.c >> +++ b/fbdev.c >> @@ -30,6 +30,12 @@ >> =C2=A0#include "sysemu.h" >> =C2=A0#include "pflib.h" >> >> +#include "hw/xen_backend.h" >> +#include >> +#include >> +#include "xenctrlosdep.h" >> +#include >> + >> =C2=A0/* ---------------------------------------------------------------= ----- */ >> >> =C2=A0/* file handles */ >> @@ -541,29 +547,23 @@ static void fbdev_cleanup(void) >> =C2=A0 =C2=A0 =C2=A0} >> =C2=A0} >> >> -static int fbdev_init(const char *device) >> +static int fbdev_init(int prot, unsigned long size) >> =C2=A0{ >> =C2=A0 =C2=A0 =C2=A0struct vt_stat vts; >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned long page_mask; >> =C2=A0 =C2=A0 =C2=A0char ttyname[32]; >> >> =C2=A0 =C2=A0 =C2=A0/* open framebuffer */ >> - =C2=A0 =C2=A0if (device =3D=3D NULL) { >> - =C2=A0 =C2=A0 =C2=A0 device =3D getenv("FRAMEBUFFER"); >> - =C2=A0 =C2=A0} >> - =C2=A0 =C2=A0if (device =3D=3D NULL) { >> - =C2=A0 =C2=A0 =C2=A0 device =3D "/dev/fb0"; >> - =C2=A0 =C2=A0} >> - =C2=A0 =C2=A0fb =3D open(device, O_RDWR); >> + =C2=A0 =C2=A0fb =3D open("/dev/fb0", O_RDWR); >> =C2=A0 =C2=A0 =C2=A0if (fb =3D=3D -1) { >> - =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "open %s: %s\n", device, strerror= (errno)); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "open /dev/fb0: %s\n", stre= rror(errno)); >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1; >> =C2=A0 =C2=A0 =C2=A0} >> >> =C2=A0 =C2=A0 =C2=A0/* open virtual console */ >> =C2=A0 =C2=A0 =C2=A0tty =3D 0; >> =C2=A0 =C2=A0 =C2=A0if (ioctl(tty, VT_GETSTATE, &vts) < 0) { >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Not sta= rted from virtual terminal, trying to >> open one.\n"); >> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0snprintf(ttyname, sizeof(ttyname), "/d= ev/tty0"); >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tty =3D open(ttyname, O_RDWR); >> @@ -632,14 +632,14 @@ static int fbdev_init(const char *device) >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto err; >> =C2=A0 =C2=A0 =C2=A0} >> >> =C2=A0 =C2=A0 =C2=A0page_mask =3D getpagesize()-1; >> =C2=A0 =C2=A0 =C2=A0fb_mem_offset =3D (unsigned long)(fb_fix.smem_start)= & page_mask; >> - =C2=A0 =C2=A0fb_mem =3D mmap(NULL,fb_fix.smem_len+fb_mem_offset, >> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 PROT_READ|PROT= _WRITE,MAP_SHARED,fb,0); >> + =C2=A0 =C2=A0fb_mem =3D mmap(NULL, size << XC_PAGE_SHIFT, prot, MAP_SH= ARED, fb, 0); >> =C2=A0 =C2=A0 =C2=A0if (fb_mem =3D=3D MAP_FAILED) { >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 perror("mmap"); >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto err; >> =C2=A0 =C2=A0 =C2=A0} >> + >> =C2=A0 =C2=A0 =C2=A0/* move viewport to upper left corner */ >> =C2=A0 =C2=A0 =C2=A0if (fb_var.xoffset !=3D 0 || fb_var.yoffset !=3D 0) = { >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 fb_var.xoffset =3D 0; >> @@ -930,3 +928,71 @@ void fbdev_display_uninit(void) >> =C2=A0 =C2=A0 =C2=A0qemu_remove_exit_notifier(&exit_notifier); >> =C2=A0 =C2=A0 =C2=A0uninit_mouse(); >> =C2=A0} > > I would rather avoid modifing fbdev_init and add a new function to > xen-all.c that independently mmaps the xen_fbfront buffer with the right > size and maps it into the guest. > > >> +int fbdev_pv_display_prepare(unsigned long domid, int prot, const >> unsigned long *arr, >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 i= nt *err, unsigned int num) >> +{ >> + =C2=A0 =C2=A0 =C2=A0 xen_pfn_t *pfn; >> + =C2=A0 =C2=A0 =C2=A0 privcmd_mmapbatch_t ioctlx; >> + =C2=A0 =C2=A0 =C2=A0 int fd,i,rc; >> + >> + =C2=A0 =C2=A0if (fbdev_init(prot,num) !=3D 0) { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(1); >> + =C2=A0 =C2=A0} >> + >> + =C2=A0 =C2=A0 =C2=A0 pfn =3D malloc(num * sizeof(*pfn)); >> + =C2=A0 =C2=A0 =C2=A0 if(!pfn){ >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 errno =3D -ENOMEM; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D -1; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return rc; >> + =C2=A0 =C2=A0 =C2=A0 } >> + =C2=A0 =C2=A0 =C2=A0 memcpy(pfn, arr, num*sizeof(*arr)); >> + >> + =C2=A0 =C2=A0 =C2=A0 fd =3D open("/proc/xen/privcmd", O_RDWR); >> + =C2=A0 =C2=A0 =C2=A0 if(fd =3D=3D -1){ >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr,"Could= not obtain handle on privcmd device\n"); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); >> + =C2=A0 =C2=A0 =C2=A0 } >> + >> + =C2=A0 =C2=A0 =C2=A0 ioctlx.num =3D num; >> + =C2=A0 =C2=A0 =C2=A0 ioctlx.dom =3D domid; >> + =C2=A0 =C2=A0 =C2=A0 ioctlx.addr =3D (unsigned long)fb_mem; >> + =C2=A0 =C2=A0 =C2=A0 ioctlx.arr =3D pfn; >> + >> + =C2=A0 =C2=A0 =C2=A0 rc =3D ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx= ); >> + >> + =C2=A0 =C2=A0 =C2=A0 for(i=3D0; i> + =C2=A0 =C2=A0 =C2=A0 { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch(pfn[i] ^ arr[i= ]) >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 case 0: >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 err[i] =3D rc !=3D -ENOENT ? rc:0; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 default: >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 err[i] =3D -EINVAL; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; >> + =C2=A0 =C2=A0 =C2=A0 } >> + >> + =C2=A0 =C2=A0 =C2=A0 free(pfn); >> + >> + =C2=A0 =C2=A0 =C2=A0 if (rc =3D=3D -ENOENT && i =3D=3D num) >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc=3D0; >> + =C2=A0 =C2=A0 =C2=A0 else if(rc) >> + =C2=A0 =C2=A0 =C2=A0 { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 errno =3D -rc; >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D -1; >> + =C2=A0 =C2=A0 =C2=A0 } >> + >> + =C2=A0 =C2=A0 =C2=A0 if(rc < 0) >> + =C2=A0 =C2=A0 =C2=A0 { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr,"privc= md ioctl failed\n"); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 munmap(fb_mem, num <<= XC_PAGE_SHIFT); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return NULL; >> + =C2=A0 =C2=A0 =C2=A0 } >> + >> + =C2=A0 =C2=A0 =C2=A0 close(fd); >> + >> + =C2=A0 =C2=A0 =C2=A0 return fb_mem; >> +} > > We shouldn't use IOCTL_PRIVCMD_MMAPBATCH, we need a new ioctl, see above. > > >> diff --git a/hw/vga.c b/hw/vga.c >> index 0f54734..de7dd85 100644 >> --- a/hw/vga.c >> +++ b/hw/vga.c >> @@ -28,6 +28,7 @@ >> =C2=A0#include "vga_int.h" >> =C2=A0#include "pixel_ops.h" >> =C2=A0#include "qemu-timer.h" >> +#include "xen_backend.h" >> >> =C2=A0//#define DEBUG_VGA >> =C2=A0//#define DEBUG_VGA_MEM >> @@ -2237,7 +2238,12 @@ void vga_common_init(VGACommonState *s, int vga_r= am_size) >> =C2=A0 =C2=A0 =C2=A0s->is_vbe_vmstate =3D 0; >> =C2=A0#endif >> =C2=A0 =C2=A0 =C2=A0s->vram_offset =3D qemu_ram_alloc(NULL, "vga.vram", = vga_ram_size); >> +#ifdef CONFIG_STUBDOM >> + =C2=A0 =C2=A0 =C2=A0 stubdom_vga_state =3D VGA_INIT_READY; >> +#endif >> =C2=A0 =C2=A0 =C2=A0s->vram_ptr =3D qemu_get_ram_ptr(s->vram_offset); >> =C2=A0 =C2=A0 =C2=A0s->vram_size =3D vga_ram_size; >> =C2=A0 =C2=A0 =C2=A0s->get_bpp =3D vga_get_bpp; >> =C2=A0 =C2=A0 =C2=A0s->get_offsets =3D vga_get_offsets; >> diff --git a/hw/xen_backend.c b/hw/xen_backend.c >> index c506dfe..f4ecce4 100644 >> --- a/hw/xen_backend.c >> +++ b/hw/xen_backend.c >> @@ -48,6 +48,10 @@ XenGnttab xen_xcg =3D XC_HANDLER_INITIAL_VALUE; >> =C2=A0struct xs_handle *xenstore =3D NULL; >> =C2=A0const char *xen_protocol; >> >> +#ifdef CONFIG_STUBDOM >> +enum Stubdom_Vga_State stubdom_vga_state=3D0; >> +#endif >> + >> =C2=A0/* private */ >> =C2=A0static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs =3D >> QTAILQ_HEAD_INITIALIZER(xendevs); >> =C2=A0static int debug =3D 0; >> diff --git a/hw/xen_backend.h b/hw/xen_backend.h >> index 3305630..36167d1 100644 >> --- a/hw/xen_backend.h >> +++ b/hw/xen_backend.h >> @@ -60,6 +60,16 @@ extern XenXC xen_xc; >> =C2=A0extern struct xs_handle *xenstore; >> =C2=A0extern const char *xen_protocol; >> >> +#ifdef CONFIG_STUBDOM >> +/* linux stubdom vga initialization*/ >> +enum Stubdom_Vga_State{ >> + =C2=A0 =C2=A0 =C2=A0 VGA_INIT_WAIT =3D 0, >> + =C2=A0 =C2=A0 =C2=A0 VGA_INIT_READY, >> + =C2=A0 =C2=A0 =C2=A0 VGA_INIT_COMPLETE >> +}; >> +extern enum Stubdom_Vga_State stubdom_vga_state; >> +#endif >> + >> =C2=A0/* xenstore helper functions */ >> =C2=A0int xenstore_write_str(const char *base, const char *node, const c= har *val); >> =C2=A0int xenstore_write_int(const char *base, const char *node, int iva= l); >> diff --git a/xen-mapcache.c b/xen-mapcache.c >> index 007136a..e615f98 100644 >> --- a/xen-mapcache.c >> +++ b/xen-mapcache.c >> @@ -20,6 +20,7 @@ >> =C2=A0#include "xen-mapcache.h" >> =C2=A0#include "trace.h" >> >> +#include "hw/xen.h" >> >> =C2=A0//#define MAPCACHE_DEBUG >> >> @@ -144,8 +145,19 @@ static void xen_remap_bucket(MapCacheEntry *entry, >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pfns[i] =3D (address_index << (MCACHE_= BUCKET_SHIFT-XC_PAGE_SHIFT)) + i; >> =C2=A0 =C2=A0 =C2=A0} >> >> +#ifdef CONFIG_STUBDOM >> + =C2=A0 =C2=A0 =C2=A0 if(stubdom_vga_state =3D=3D VGA_INIT_READY){ >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr,"xen_r= emap_bucket: start linux stubdom vga\n"); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 vaddr_base =3D fbdev_= pv_display_prepare(xen_domid, PROT_READ|PROT_WRITE, >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pfns, err, nb_pfn); >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 stubdom_vga_state =3D= VGA_INIT_COMPLETE; >> + =C2=A0 =C2=A0 =C2=A0 }else >> + =C2=A0 =C2=A0 =C2=A0 vaddr_base =3D xc_map_foreign_bulk(xen_xc, xen_do= mid, PROT_READ|PROT_WRITE, >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pfns, err, n= b_pfn); >> +#else >> =C2=A0 =C2=A0 =C2=A0vaddr_base =3D xc_map_foreign_bulk(xen_xc, xen_domid= , PROT_READ|PROT_WRITE, >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pfns, err, n= b_pfn); >> +#endif >> =C2=A0 =C2=A0 =C2=A0if (vaddr_base =3D=3D NULL) { >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0perror("xc_map_foreign_bulk"); >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0exit(-1); >> >> > > I don't like the stubdom_vga_init approach: in general it is a good idea > to avoid state machines unless necessary. > I would implement a new function called xen_vga_ram_map in xen-all.c > that mmaps the xen_fbfront buffer and uses the new ioctl to > map the buffer into the guest. > xen_vga_ram_map should be called instead of xen_ram_alloc by > qemu_ram_alloc_from_ptr if name =3D=3D "vga.vram". > I have question here. I think xen_vga_ram_map() is used to instead of xc_map_foreign_bulk() which maps hvm guest's vram. vga_common_init -->qemu_get_ram_ptr -->xen_map_cache -->xen_remap_bucket -->xc_map_foreign_bulk The xen_ram_alloc() calls xc_domain_populate_physmap_exact() to increase the physical memory of hvm guest. And the increased physical memory becomes hvm guest's vram. For the xen_remap_bucket(), there is no "vga.vram" input parameter. So we need the notification mechanism to invoke xen_vga_ram_map(). > > Another suggestion: before starting to write any new lines of code, I > would make sure that mmaping the /dev/fb device actually works correctly. > For debugging purposes you can try to modify fbdev_init and write > something to the framebuffer right after the mmap, to see if the new > pattern is displayed correctly on the screen. > I have tested the xen_fbfront driver in linux stubdom. As shown in attached file, I could print a small colored region. --90e6ba6135b2c11b7504ab28f920 Content-Type: image/png; name="Screenshot-QEMU (fedora14-dm)-4.png" Content-Disposition: attachment; filename="Screenshot-QEMU (fedora14-dm)-4.png" Content-Transfer-Encoding: base64 X-Attachment-Id: f_grool7pz0 iVBORw0KGgoAAAANSUhEUgAAAyYAAAJwCAYAAAB8l3VsAAAABHNCSVQICAgIfAhkiAAAABl0RVh0 U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AACAASURBVHic7d15lOVlfefxz62q3he6q7vp lWZrNrGRTSBsoqgBccmJYZSRGAeX4NE5ahRUktHRMZiYmFFDXCaaEU/OqETjuDMBbYOAKEqaVfZF uqHX6r2qu6pu1fxRvRW9ULTdfBvr9TqH03W35z63OOdX913P77nVyE5MveQT/Tu7HgAA4Le14p8u bzz1urbtL2wJkhWnvPHZmhMAAPxOO+7g6Xt9zHt/eVOOPvmM59S43dPmbb08NRnoju0CZWuYTL3k E/0rT7ooSdJo9uz1yQAAwHDU1UxG9nXv1TEbvd3PuXG3b4wt3TE16d8SJ23JQJR0nHBhGn29e3UC AAAw3HU1k9a9/Iv/RrPnOTfuzlqj44QLM/WSgThp2/7OAADA3rWxmYzt3dtv9Lufc+M+XW+0Tb3k E/2rj31lGs2hrZbM+dG392gyi859zR49DuB31VuOm5TPvXRm3vXjJfnswlVbr3/pwePy9y+ZkcMm jUxLIzn+Kw/n7hWb9ug5jp06KgvfeFiSZMTf/XqvzHt/89u+xnMOGpvrLjw4n124Ku/68ZK9PT2A dDWT5l5/o99TMu6hE1rT0kgeXtvMlk/LaiSZM741rY3k0XXNXY67q95YfewrM/WS9LclSaPvmb2g P7zwvGd0/3/9l2uf8XMAPFMHTRyRD58+Iy87dHymjWnL8q7e/OjR9fnIzUvz2Jpt58p2v++4nT5+ 5N/eMej2/iTz/+m+3N8xEAVHtY/KHZcclcYu7n/Cl+/P3Ss27vK67Y0d0ZKPnj4tazY18+U7VqTR 17f1tn84dyBKFvxmfe5asTEdGzbu8am2jb7W7b5+9o7DX3/1wTl11tjMGj8iya6/Dy2N5NoLD8s5 c8fv9n6789u+xn9/bE3uWL4xf/qCSfmHXy3LA6v2LAIBdmVjM2n27N1jcEtzYC/IUMY9eEJbzj94 dG56clPuXLn7++9u3MMPaMur545IX3+ycEV/frJ4UxpJXjxndOZPGZHWRvKvD/fm0bU7/sxqaXY/ 7TF6IEyGuFqyvRtuvntI9zv79GOzp88BMFRzJ47MzRcfkWlj2/KrJZ35zv2r88KZ43LxsZNz3mET cvrV9w6KkyT5P3d3pKNr27HpqcepRpJ3Ht+ed133eJLkHSfMzPafbbjD/fuaQ7ouSd4wf2qmjW3L P9/VkY2bugeNe+ikkUmSy65/PHcu79o6lz3R6Nv2m6vf5jg8oqWRnr6hf5L8abPG5tYnN+TVR0za Oo+dPf9lp83ImXPGDZrvM53n3niN3/h1R447e1beeUJ73r35/zfAXtPbnb59sLIx1HFfNHN0enqb OWlqa25f2rnH43Zu6k9vc2QeXN2T+ZNHpK/ZlkaS501qyQMdGzNv0oh0buxOX++Oqya7WzHZom3r BIbo0nP68v43HZ97zxyRRpJGo5H+/v40Go2k0UgjjbRs9/VhhxyRA5f/IB/ey5UIsL0Pnzk308a2 5QcPrs5rr7kv/Rn4bfw3Lzwq58+blA+fMSNv/u5Dgx7zyZsX5e7Nb/yTHd/8d3T15uLnt+dDCx5L I8nFx7ano6s37WMGtuc99dg5cNB9+uuS5FXzJiZJbnxs9aDbN15x6tavf3nJMUmS0Vf+fOt1l540 PW8/eXoOmzw6q7t6841fd+TPF/wmnT0DKy6j21ryuVccmj84uj2L1nbnH27ddmrSludpJHnXqTPz thMPzEEHjMqKzp5cc/fKfPjfF2Vjb9+geVx+/WN564nTc/jk0Rn78YF5vPywSfnLlxyUQyeNypgR Leno7M11j6zJZdc/lpWdAz90Dv3MbYPG2dn34eSZ4/Khs2bmf9ywKB8556Ddfr+2N5TXuOV5/9uC x/P2k6dnZGsj77vusUwY1Zr/fvbAc733ukfztbtXJkl++ujq5OxZueDwiXnPtX5eAXtZs2efnHI1 1HHb0pc1G/sycWTL095/d+M+vronty1p5Phpo/NAx8Yc1z7wi7QHOzZm3qSR+eWTnVm8duer3kM5 vu/RqVxJ0tJoSRpJI42k0Z9GGmk0tkXJ1vtsmYxTuYB96GWHDrzR/8Kti5O+njQycCrWF25dnPPn Tcq5h07c4Tj0vtNmZOV2KyaX/dvDg27/8sIl+bPfm5M/md+eJBk/sjWfvHlR3nv6nCQ7Htcafb1D ui5JTpwxsErw4Mr1g26/6hdP5J2nzEqSfPXOZVnZte3x//XU2fnEyw7Jk+u685WFSzN/+ri8/eTp mTa2NX/8r/cmST501iG56PlTs3xDT254dHU+eMas7eYyMM57fm9Orjx3blZ19ebqhUvz0sMm5V2n zsyUMa1563fuHzTPj55zUL55z4rcvmTbPGePb8my9d255fG1SZIzD56Y//z8qRnX1sjrv7HzPR5P /T6MH9mar/zBvNz8m7X525se2xYmu/h+bW8or3GLt554YG5fuj7nz2vP5y84LEvXd+fni9fmFUe0 5+/PPzTfumdpupv9uW/5wGuZe8CoTB2drOz0MwvYexr7Ikw2f/zursadP210Tps1Nq2NpH1UI6u7 mmkf1Zq3Pn9Cmv3JLU905s7lO0bE0437o0fWpK/ZzPEHjs79HQO/3Js3aWR+tWRDFvxm/e7nu69O 5WppGVgRydYf/42BLxstaWkMrKRs//tHp3IB+9KUsQN7GZas6Rp0vFmyduCgOXXsiB2OQxfNP3DQ 5ct/OPhN+TfuXJqLjzswl548M0mydH13vnnX0m1h8tTj2s5OQ9rFqUmTN6+6rO/qHnT75T+8f2uY fPLGx3LPsg1bj6TveOHAPBY+uS4be3pz+5PrcsrsCXnt86bm3d9rpKOrJ69//rQkyWXXPpBr7lqW nz7/wHz5tc8bNN9LT56RJHnvDx/I1+5cmhfMGJ+f/enJuWj+tLzvB/dn7aZt8/nQjx7OVbcsGnj8 5uu+8qvFeWJNV06ZPTETR7flriXrc8zUsXnJYZN2fax/yvfhU78/L5NGt+bl//ue9Pf27vR+f3Pe vEFDXHbtg0kypNe4xQf/7cFc92BHln3wrIxua8kV1z2UH96/Mh1/fnYmjGzNIRNG5IGVnVnfue20 gykjG+lY52cWsBc1e/bNqVy7Gfec2ZOzrrs3a3v7sqqzOxt6+vLAyoFj25i2lpwze0xuf3LdMx63 kSR9venv60t/c+DY2dfXlzR709/bk12d9LtPTuXaOvjmU7UGTuXafHnzCsnA108NE799AvadlZ09 mT5+ZKaPbcld2x1vZowdOC6t6tpxCfmFV/0s9yzb9tudp57K1dPdnS/+YlGuePHAJz795YKH0tO9 bZ/KlvGaff1pbWmkrb+ZRrMnbS3bRurt2fnS9arOnhw4fmQmtu36+Nho9g66bfbEUUmS84+cMvh+ SWaPa8mq9T2ZPm5gWf2BZevSaPbkweXrthtvYKxZEwbGuW/p2jSaPblv6ZokSWujkRljGlm33WrB zY+s3GF+V73mefkvJ83eYb4TRrYO+bW84QUz8uiqrlz1yiMG3e9T58/Ll365KNfcsSTvOHXOoNsu //7AasxQXuMWDy1flw1dGwdd3rRp2+b2kRn4f3bAqBFbr1u1vtPPLGCvajR79snm992Nu+CR1Tl9 zviMGdWSyaNb89CqTTn8gBFZtbGZZl9/FjyyeqeP3d24jSQvO+yAzJ8yKvct35Ajp4xOf39y//IN mT91dPqazfzokTU7jZOWoXxccJI9+rSXRqNlW4Bs3mOyfaxsPc1ry/398UZgH7r+geV5wwmz8+aT ZuXH9y9NMnBW6VtfOPDm9kcPrNjhONTob+722NTob+ZLP3807zv7kCTJl37+WKZuflOcbDuuLVqz MQdPHpMTZ47LXU+sygmzDkiS9PX358nV6wdtzt7itsVrct5R03LklNG5+ZGdz+Gp81u8+Xne+o07 8tWFi7def9CkMXl8dVcaSZau35RZE0fnyCmjcvvi3hzRPmqH+T6xdmPmThqTo6eOzu2LO3LMlIlb 57t0beeg5+zu2fEPYl30goGVm7d98458/fYncs5hU/LtN71w0HM83WtJkkMmj8khk8cMuu7MQybn hodXptHXm/F/8cPBY2z+dyivcYu+Zu+g6556ecu8jp4yIUny2KqudKzv2uMPGwDYqd2cGnXstLE5 dc6EtDZ2PPL09vfnlkXr8uvlO25Yb32aPSa/XLQ6v1y0OknyzlNmpq/ZzLL1m3LVL57c7VR3N+6R U8bkuGmjc9+KDTmifXRuXbw2jSTHzxiX+1dsyPEHjslDK9fnwY4dTxFr3cUfWNzeHq+YtLS0bI6Q pNn/9J/U4rdPwL505b/dk98/clpec+yMLHjbaVn4xJqcNGdSTpwzKWs29uTj1/96h+PQn515SDo6 t62AvP97dw26vdHsybI16/Pyz9+YJFm+Zn2mjZ4w6PYk+fp/PJ7LX3Jk/uerjs0fnzA7x84YuM93 7n4ynV0bd/om9/t3P5HzjpqWMw+elKt//vBO7rHjRsF//NnD+dgrjs2nX3NsXjqvPZ3dzRw3c2Km TxydY/7quiTJv9y+OO866/B84hXH5OxDJueVz5uxw3y/eMsj+eh5z8vfXnBMzph7QM49cuCUtq8v XJz1nYPflO9ss+KStRtzSPvYvO2Ug3LG3APy+0dP3+E5Pn/hCYMe8+Fz52X1xp5c+i//kSSZ8MHv DLp93cdfnSQ59VMLcs/SdbsNg6G8xl3Nf1eXzzp44NPDfvDrJ/28Ava+3Zwa9aK549Pb15eunr4d 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 MkE8AAAAAElFTkSuQmCC --90e6ba6135b2c11b7504ab28f920 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --90e6ba6135b2c11b7504ab28f920--