> +static ssize_t iavf_emu_bar0_rw(struct rte_vfio_user_reg_info *reg, char
> *buf,
> +     size_t count, loff_t pos, bool iswrite) {
> +     struct iavf_emudev *dev = (struct iavf_emudev *)reg->priv;
> +     char *reg_pos;
> +
> +     if (!reg->base) {
> +             EMU_IAVF_LOG(ERR, "BAR 0 does not exist\n");
> +             return -EFAULT;
> +     }
> +
> +     if (pos + count > reg->info->size) {
> +             EMU_IAVF_LOG(ERR, "Access exceeds BAR 0 size\n");
> +             return -EINVAL;
> +     }
> +
> +     reg_pos = (char *)reg->base + pos;
> +
> +     if (!iswrite) {
> +             rte_memcpy(buf, reg_pos, count);
> +     } else {
> +             int tmp;
> +             uint32_t val;
> +             int idx = -1;
> +
> +             if (count != 4)
> +                     return -EINVAL;
> +
> +             val = *(uint32_t *)buf;
> +             /* Only handle interrupt enable/disable for now */
> +             if (pos == IAVF_VFINT_DYN_CTL01) {
> +                     tmp = val & IAVF_VFINT_DYN_CTL01_INTENA_MASK;
> +                     idx = 0;
> +             } else if ((pos >= IAVF_VFINT_DYN_CTLN1(0)) && pos <=
> +
>       IAVF_VFINT_DYN_CTLN1(RTE_IAVF_EMU_MAX_INTR - 1)) {
> +                     tmp = val & IAVF_VFINT_DYN_CTLN1_INTENA_MASK;
> +                     idx = pos - IAVF_VFINT_DYN_CTLN1(0);
> +                     if (idx % 4)
> +                             return -EINVAL;
> +                     idx = idx / 4;
Should be idx = idx / 4 + 1; ?

> +             }
> +
> +             if (idx != -1 &&
> +                     tmp != dev->intr->info[idx].enable && dev->ready) {
> +                     dev->ops->update_status(dev->edev);
> +                     dev->intr->info[idx].enable = tmp;
dev->intr->info[idx].enable need to be set before update_status callback is 
called.

> +             }
> +
> +             rte_memcpy(reg_pos, buf, count);
> +     }
> +
> +     return count;
> +}

Reply via email to