Bug 212515 - vncfb does not run on IA64
Summary: vncfb does not run on IA64
Keywords:
Status: CLOSED CURRENTRELEASE
Alias: None
Product: Fedora
Classification: Fedora
Component: xen
Version: 6
Hardware: ia64
OS: Linux
medium
medium
Target Milestone: ---
Assignee: Markus Armbruster
QA Contact: Brian Brock
URL:
Whiteboard:
Depends On:
Blocks: 216169
TreeView+ depends on / blocked
 
Reported: 2006-10-27 05:16 UTC by Atsushi SAKAI
Modified: 2007-11-30 22:11 UTC (History)
3 users (show)

Fixed In Version: xen-3.0.3-9.fc6
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2007-06-01 13:45:01 UTC
Type: ---
Embargoed:


Attachments (Terms of Use)

Description Atsushi SAKAI 2006-10-27 05:16:27 UTC
Description of problem:
vncfb does not run on IA64

Version-Release number of selected component (if applicable):


How reproducible:
Just create domU with vnc=1

Steps to Reproduce:
1.
2.
3.
  
Actual results:
we can see the vnc view(for example from virt-manager)

Expected results:


Additional info:

Comment 1 Daniel Berrangé 2006-10-27 17:11:30 UTC
I have reproduced this issue successfully. The xen-vncfb daemon which exposes
the console via VNC is going defunct, and in xend-debug.log  is dumping 'Could
not connect to domain (Invalid argument)'. 

This message is comming from:

$ grep --before 1 'Could not connect' tools/xenfb/*.c
vncfb.c-        if (!xenfb_attach_dom(xenfb, domid)) {
vncfb.c:                fprintf(stderr, "Could not connect to domain (%s)\n",

So, need to investigate which the xenfb_attach_dom() function is failing on ia64.


Comment 2 Daniel Berrangé 2006-10-27 18:35:46 UTC
It appears to be failing to map the virtual framebuffer into process:

#0  xc_map_foreign_range (xc_handle=8, dom=3, size=<value optimized out>,
prot=3, mfn=669) at xc_linux.c:105
#1  0x40000000000060f0 in xenfb_attach_dom (xenfb_pub=0x600000000005c050,
domid=3) at xenfb.c:237
#2  0x40000000000042e0 in main (argc=8, argv=0x60000ffffe77b928) at vncfb.c:208
#3  0x200000000016f040 in __libc_start_main () from /lib/libc.so.6.1
#4  0x4000000000003bc0 in _start ()


Is where it dies, doing an ioctl:

102         if ( ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx) < 0 )

(gdb) print ioctlx
$19 = {num = 1, dom = 3, entry = 0x60000ffffe77a858}
(gdb) print entry
$10 = {va = 2305843009229422592, mfn = 669, npages = 1}

The error is set to -EINVAL.

Comment 3 Isaku Yamahata 2006-10-30 01:38:17 UTC
On xenLinux/IA64, pfn_to_mfn() == __pa() so that the front end sends invalid
value as vnc/page-ref, vkbd/page-ref.
Thus ioctlx.mfn is invalid and ioctl() call failed.
To get real mfn, pfn_to_mfn_for_dma() (or its variants) must be used.
Here is the patch for it.
Atsushi verified this patch so that the ioctl() call successes.

diff -X /home/yamahata/dontdiff -urp xen-3.0.3-rc3/linux-2.6-xen-sparse/drivers/
xen/xenfb/xenfb.c xen-3.0.3-rc3-new/linux-2.6-xen-sparse/drivers/xen/xenfb/
xenfb.c
--- xen-3.0.3-rc3/linux-2.6-xen-sparse/drivers/xen/xenfb/xenfb.c        2006-10-
30 10:20:34.000000000 +0900
+++ xen-3.0.3-rc3-new/linux-2.6-xen-sparse/drivers/xen/xenfb/xenfb.c    2006-10-
25 18:03:56.000000000 +0900
@@ -510,7 +510,7 @@ static int __init xenfb_probe(void)
        if (ret)
                goto error_unreg;
        ret = xenbus_printf(xbt, "vfb", "page-ref", "%lu",
-                           virt_to_mfn(info->page));
+                           virt_to_bus(info->page) >> PAGE_SHIFT);
        // FIXME grant tables?
        if (ret)
                goto error_xenbus;
diff -X /home/yamahata/dontdiff -urp xen-3.0.3-rc3/linux-2.6-xen-sparse/drivers/
xen/xenkbd/xenkbd.c xen-3.0.3-rc3-new/linux-2.6-xen-sparse/drivers/xen/xenkbd/
xenkbd.c
--- xen-3.0.3-rc3/linux-2.6-xen-sparse/drivers/xen/xenkbd/xenkbd.c      2006-10-
30 10:20:34.000000000 +0900
+++ xen-3.0.3-rc3-new/linux-2.6-xen-sparse/drivers/xen/xenkbd/xenkbd.c  2006-10-
25 18:05:02.000000000 +0900
@@ -130,7 +130,7 @@ int __init xenkbd_init(void)
        if (ret)
                goto error_unreg;
        ret = xenbus_printf(xbt, "vkbd", "page-ref", "%lu",
-                           virt_to_mfn(dev->info));
+                           virt_to_bus(dev->info) >> PAGE_SHIFT);
        if (ret)
                goto error_xenbus;
        ret = xenbus_printf(xbt, "vkbd", "event-channel", "%u",




Note You need to log in before you can comment on or make changes to this bug.