starxzj 发表于 2015-10-10 09:53:26

kvm创建虚拟pci设备的几个函数(老版本)

  1:
  

1003 int pci_enable_capability_support(PCIDevice *pci_dev,
1004                                 uint32_t config_start,
1005                                 PCICapConfigReadFunc *config_read,
1006                                 PCICapConfigWriteFunc *config_write,
1007                                 PCICapConfigInitFunc *config_init)
1008 {
1009   if (!pci_dev)
1010         return -ENODEV;
1011
1012   pci_dev->config |= 0x10; // status = capabilities
1013
1014   if (config_start == 0)
1015         pci_dev->cap.start = PCI_CAPABILITY_CONFIG_DEFAULT_START_ADDR;
1016   else if (config_start >= 0x40 && config_start < 0xff)
1017         pci_dev->cap.start = config_start;
1018   else
1019         return -EINVAL;
1020
1021   if (config_read)
1022         pci_dev->cap.config_read = config_read;
1023   else
1024         pci_dev->cap.config_read = pci_default_cap_read_config;
1025   if (config_write)
1026         pci_dev->cap.config_write = config_write;
1027   else
1028         pci_dev->cap.config_write = pci_default_cap_write_config;
1029   pci_dev->cap.supported = 1;
1030   pci_dev->config = pci_dev->cap.start;
1031   return config_init(pci_dev);
1032 }  
  


  


  关于irqfd
  

&#43;#ifdef KVM_CAP_IRQFD
&#43;static int _kvm_irqfd(kvm_context_t kvm, int fd, int gsi, int flags)
&#43;{
&#43;int r;
&#43;struct kvm_irqfd data = {
&#43;.fd    = fd,
&#43;.gsi   = gsi,
&#43;.flags = flags,
&#43;};
&#43;
&#43;r = ioctl(kvm->vm_fd, KVM_IRQFD, &data);
&#43;if (r == -1)
&#43;r = -errno;
&#43;return r;
&#43;}
&#43;
&#43;int kvm_create_irqfd(kvm_context_t kvm, int gsi, int flags)
&#43;{
&#43;int r;
&#43;int fd;
&#43;
&#43;if (!kvm_check_extension(kvm, KVM_CAP_IRQFD))
&#43;return -ENOENT;
&#43;
&#43;fd = eventfd(0, 0);
&#43;if (fd < 0)
&#43;return -errno;
&#43;
&#43;r = _kvm_irqfd(kvm, fd, gsi, 0);
&#43;if (r < 0) {
&#43;close(fd);
&#43;return -errno;
&#43;}
&#43;
&#43;return fd;
&#43;}
&#43;
&#43;int kvm_destroy_irqfd(kvm_context_t kvm, int fd, int gsi, int flags)
&#43;{
&#43;return _kvm_irqfd(kvm, fd, gsi, KVM_IRQFD_FLAG_DEASSIGN);
&#43;}
&#43;
&#43;#else /* KVM_CAP_IRQFD */
&#43;
&#43;int kvm_create_irqfd(kvm_context_t kvm, int gsi, int flags)
&#43;{
&#43;return -ENOENT;
&#43;}
&#43;
&#43;int kvm_destroy_irqfd(kvm_context_t kvm, int fd, int gsi, int flags)
&#43;{
&#43;return -ENOENT;
&#43;}
&#43;
&#43;#endif /* KVM_CAP_IRQFD */
  
  


  

&#43;int kvm_assign_iofd(kvm_context_t kvm, unsigned long addr, size_t len,
&#43;    int fd, int type, int flags)
&#43;{
&#43;int r;
&#43;struct kvm_iofd data = {
&#43;.addr= addr,
&#43;.len   = len,
&#43;.fd    = fd,
&#43;.flags = type ? KVM_IOFD_FLAG_PIO : 0,
&#43;};
&#43;
&#43;if (!kvm_check_extension(kvm, KVM_CAP_EVENTFD))
&#43;return -ENOENT;
&#43;
&#43;r = ioctl(kvm->vm_fd, KVM_IOFD, &data);
&#43;if (r == -1)
&#43;r = -errno;
&#43;return r;
&#43;}
&#43;
&#43;int kvm_deassign_iofd(kvm_context_t kvm, unsigned long addr, size_t len,
&#43;      int type, int flags)
&#43;{
&#43;int r;
&#43;struct kvm_iofd data = {
&#43;.addr= addr,
&#43;.len   = len,
&#43;.flags = KVM_IOFD_FLAG_DEASSIGN | (type ? KVM_IOFD_FLAG_PIO : 0),
&#43;};
&#43;
&#43;if (!kvm_check_extension(kvm, KVM_CAP_EVENTFD))
&#43;return -ENOENT;
&#43;
&#43;r = ioctl(kvm->vm_fd, KVM_IOFD, &data);
&#43;if (r == -1)
&#43;r = -errno;
&#43;return r;
&#43;}
&#43;
#else /* KVM_CAP_EVENTFD */

  

版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: kvm创建虚拟pci设备的几个函数(老版本)