diff -r 92fddc5af648 tools/xenfb/xenfb.c --- a/tools/xenfb/xenfb.c Wed Nov 22 20:34:45 2006 +0900 +++ b/tools/xenfb/xenfb.c Wed Nov 22 20:36:35 2006 +0900 @@ -344,6 +344,9 @@ bool xenfb_attach_dom(struct xenfb *xenf int serrno; int fbdev_evtchn, kbd_evtchn; unsigned long fbdev_mfn, kbd_mfn; +#ifdef __ia64__ + xen_pfn_t *page_array; +#endif if (xenfb->domid != -1) { xenfb_detach_dom(xenfb); @@ -432,16 +435,24 @@ bool xenfb_attach_dom(struct xenfb *xenf if (xenfb->kbd_port == -1) goto error; +#ifdef __ia64__ ret = xc_domain_translate_gpfn_list(xenfb->xc, domid, 1, &fbdev_mfn, &fbdev_mfn); if (ret < 0 && errno != EINVAL) goto error; +#endif xenfb->fb_info = xc_map_foreign_range(xenfb->xc, domid, XC_PAGE_SIZE, PROT_READ | PROT_WRITE, fbdev_mfn); if (xenfb->fb_info == NULL) goto error; +#ifdef __ia64__ + ret = xc_domain_translate_gpfn_list(xenfb->xc, domid, 1, + &kbd_mfn, &kbd_mfn); + if (ret < 0 && errno != EINVAL) + goto error; +#endif xenfb->kbd_info = xc_map_foreign_range(xenfb->xc, domid, XC_PAGE_SIZE, PROT_READ | PROT_WRITE, kbd_mfn); @@ -466,10 +477,36 @@ bool xenfb_attach_dom(struct xenfb *xenf * happens, we happily continue here, and later crash on * access. */ - fbmfns = xc_map_foreign_batch(xenfb->xc, domid, PROT_READ, xenfb->fb_info->pd, n_fbdirs); + +#ifdef __ia64__ + page_array = (xen_pfn_t *)malloc(n_fbdirs * sizeof(xen_pfn_t)); + ret = xc_domain_translate_gpfn_list(xenfb->xc, domid, + n_fbdirs, xenfb->fb_info->pd, page_array); + if (ret == 0) { + memcpy(xenfb->fb_info->pd, page_array, + n_fbdirs * sizeof(xen_pfn_t)); + } else { + if (ret < 0 && errno != EINVAL) + goto error; + } + free(page_array); +#endif + fbmfns = xc_map_foreign_batch(xenfb->xc, domid, PROT_READ | PROT_WRITE, xenfb->fb_info->pd, n_fbdirs); if (fbmfns == NULL) goto error; +#ifdef __ia64__ + page_array = (xen_pfn_t *)malloc(n_fbmfns * sizeof(xen_pfn_t)); + ret = xc_domain_translate_gpfn_list(xenfb->xc, domid, + n_fbmfns, fbmfns, page_array); + if (ret == 0) { + memcpy(fbmfns, page_array, n_fbmfns * sizeof(xen_pfn_t)); + } else { + if (ret < 0 && errno != EINVAL) + goto error; + } + free(page_array); +#endif xenfb->fb = xc_map_foreign_batch(xenfb->xc, domid, PROT_READ | PROT_WRITE, fbmfns, n_fbmfns); if (xenfb->fb == NULL) goto error;