[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Pass-through a graphic card
On Fri, May 09, 2008 at 02:56:47PM +0100, Jean Guyader wrote: > > Here, a new patch with the modifications that Samuel suggested. > +static void dom0_read(void *opaque) > +{ > + struct input_event event[5]; > + int i = 0; > + int read_sz = 0; > + int fd = *(int *)opaque; > + > + read_sz = read(fd, event, sizeof (struct input_event) * 5); Could simply do 'sizeof(event)' here I believe. > +static void dom0_driver_event_init() > +{ > + char dev_name[strlen(EVENT_PATH) + 3]; > + int fd = -1; > + int i = 0; > + > + do > + { > + snprintf(dev_name, sizeof (dev_name), "%s%d", EVENT_PATH, i++); > + if ((fd = open(dev_name, O_RDONLY)) == -1) > + return; > + printf("Using %s\n", dev_name); > + > + driver.event_fds = realloc(driver.event_fds, > + driver.event_nb + 1); Error checking on reallocs... > + ioctl(fd, EVIOCGRAB, 1); ioctls can fail. > + driver.event_fds[driver.event_nb] = fd; > + qemu_set_fd_handler(fd, dom0_read, NULL, > + &driver.event_fds[driver.event_nb]); > + driver.event_nb++; > + } > + while (1); > +} > diff -r 810d8c3ac992 tools/ioemu/hw/pc.c > --- a/tools/ioemu/hw/pc.c Thu May 08 16:58:33 2008 +0100 > +++ b/tools/ioemu/hw/pc.c Fri May 09 14:53:11 2008 +0100 > @@ -814,6 +814,13 @@ static void pc_init1(uint64_t ram_size, > CPUState *env; > NICInfo *nd; > int rc; > +#ifdef CONFIG_DM > + unsigned long vga_pt_enabled = 0; > +#endif /* CONFIG_DM */ > + > +#ifdef CONFIG_DM > + xc_get_hvm_param(xc_handle, domid, HVM_PARAM_VGA_PT_ENABLED, > &vga_pt_enabled); > +#endif /* CONFIG_DM */ This API can return a failure code. > @@ -152,9 +152,122 @@ static int loadelfimage( > return rc; > } > > +static int linux_get_vgabios(int xc_handle, > + unsigned char *buf, > + int len) > +{ > + char buff[1024]; > + FILE *fd; > + int mem; > + char *end_ptr; > + uint32_t start, end, size; > + > + if (!(fd = fopen("/proc/iomem", "r"))) > + return 0; > + > + while (fgets(buff, 1024, fd)) > + if (strstr(buff, "Video ROM")) > + break; > + > + if (feof(fd)) Should be also checking ferror(fd) > + { > + fclose(fd); > + return 0; > + } > + > + fclose(fd); > + start = strtol(buff, &end_ptr, 16); > + end = strtol(end_ptr + 1, NULL, 16); > + size = end - start + 1; > + > + if ((mem = open("/dev/mem", O_RDONLY)) < 0) > + return 0; > + > + lseek(mem, start, SEEK_SET); > + read(mem, buf, size); Check for failure / partial reads. > +static int linux_map_vga_ioport(int xc_handler, > + uint32_t dom) > +{ > + FILE *fd = NULL; > + char buff[256]; > + uint32_t start, end; > + char *buff_end = NULL; > + > + if (!(fd = fopen("/proc/ioports", "r"))) > + return -1; > + > + while (fgets(buff, 256, fd)) > + if (strstr(buff, "vga")) > + break; > + > + if (feof(fd)) Also check ferror(fd) > + { > + fclose(fd); > + return -1; > + } > + > + fclose(fd); > + > + start = strtol(buff, &buff_end, 16); > + end = strtol(buff_end + 1, NULL, 16); > + > + return xc_domain_ioport_mapping(xc_handler, dom, > + start, start, end - start + 1, 1); > +} > + > +static int setup_vga_pt(int xc_handle, > + uint32_t dom, > + uint32_t paddr, > + struct hvm_info_table *hvm_info) > +{ > + int rc = 0; > + unsigned char *bios = NULL; > + int bios_size = 0; > + char *va_bios = NULL; > + uint32_t pfn = 0; > + > + /* Allocated 128K for the vga bios */ > + if (!(bios = malloc(128 * 1024))) > + return -1; > + > + /* Align paddr on the first next page */ > + pfn = (paddr >> XC_PAGE_SHIFT) + 1; > + > + bios_size = linux_get_vgabios(xc_handle, bios, 128 * 1024); > + > + if (bios_size <= 0) > + { > + free(bios); > + return -1; > + } > + > + va_bios = xc_map_foreign_range(xc_handle, dom, > + bios_size + bios_size % XC_PAGE_SIZE, > + PROT_READ | PROT_WRITE, pfn); This call can fail. > @@ -348,9 +471,10 @@ int xc_hvm_build(int xc_handle, > int xc_hvm_build(int xc_handle, > uint32_t domid, > int memsize, > - const char *image_name) > + const char *image_name, > + struct hvm_info_table *hvm_info) > { > - char *image; > + char *image; Needless whitespace error. Regards, Daniel -- |: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |