static int xen_pt_bar_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,

                               uint32_t *value, uint32_t valid_mask)

{

    XenPTRegInfo *reg = cfg_entry->reg;

    uint32_t valid_emu_mask = 0;

    uint32_t bar_emu_mask = 0;

    int index;



    /* get BAR index */

    index = xen_pt_bar_offset_to_index(reg->offset);

    if (index < 0 || index >= PCI_NUM_REGIONS - 1) {

        XEN_PT_ERR(&s->dev, "Internal error: Invalid BAR index [%d].\n", index);

        return -1;

    }



    /* use fixed-up value from kernel sysfs */

    *value = base_address_with_flags(&s->real_device.io_regions[index]);



    /* set emulate mask depend on BAR flag */

    switch (s->bases[index].bar_flag) {

    case XEN_PT_BAR_FLAG_MEM:

        bar_emu_mask = XEN_PT_BAR_MEM_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_IO:

        bar_emu_mask = XEN_PT_BAR_IO_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_UPPER:

        bar_emu_mask = XEN_PT_BAR_ALLF;

        break;

    default:

        break;

    }



    /* emulate BAR */

    valid_emu_mask = bar_emu_mask & valid_mask;

    *value = XEN_PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);



    return 0;

}

static int xen_pt_bar_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,

                               uint32_t *value, uint32_t valid_mask)

{

    XenPTRegInfo *reg = cfg_entry->reg;

    uint32_t valid_emu_mask = 0;

    uint32_t bar_emu_mask = 0;

    int index;



    

    index = xen_pt_bar_offset_to_index(reg->offset);

    if (index < 0 || index >= PCI_NUM_REGIONS - 1) {

        XEN_PT_ERR(&s->dev, "Internal error: Invalid BAR index [%d].\n", index);

        return -1;

    }



    

    *value = base_address_with_flags(&s->real_device.io_regions[index]);



    

    switch (s->bases[index].bar_flag) {

    case XEN_PT_BAR_FLAG_MEM:

        bar_emu_mask = XEN_PT_BAR_MEM_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_IO:

        bar_emu_mask = XEN_PT_BAR_IO_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_UPPER:

        bar_emu_mask = XEN_PT_BAR_ALLF;

        break;

    default:

        break;

    }



    

    valid_emu_mask = bar_emu_mask & valid_mask;

    *value = XEN_PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);



    return 0;

}

static int FUNC_0(XenPCIPassthroughState *VAR_0, XenPTReg *VAR_1,

                               uint32_t *VAR_2, uint32_t VAR_3)

{

    XenPTRegInfo *reg = VAR_1->reg;

    uint32_t valid_emu_mask = 0;

    uint32_t bar_emu_mask = 0;

    int VAR_4;



    

    VAR_4 = xen_pt_bar_offset_to_index(reg->offset);

    if (VAR_4 < 0 || VAR_4 >= PCI_NUM_REGIONS - 1) {

        XEN_PT_ERR(&VAR_0->dev, "Internal error: Invalid BAR VAR_4 [%d].\n", VAR_4);

        return -1;

    }



    

    *VAR_2 = base_address_with_flags(&VAR_0->real_device.io_regions[VAR_4]);



    

    switch (VAR_0->bases[VAR_4].bar_flag) {

    case XEN_PT_BAR_FLAG_MEM:

        bar_emu_mask = XEN_PT_BAR_MEM_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_IO:

        bar_emu_mask = XEN_PT_BAR_IO_EMU_MASK;

        break;

    case XEN_PT_BAR_FLAG_UPPER:

        bar_emu_mask = XEN_PT_BAR_ALLF;

        break;

    default:

        break;

    }



    

    valid_emu_mask = bar_emu_mask & VAR_3;

    *VAR_2 = XEN_PT_MERGE_VALUE(*VAR_2, VAR_1->data, ~valid_emu_mask);



    return 0;

}

static int FUNC_0(XenPCIPassthroughState *VAR_0, XenPTReg *VAR_1,
uint32_t *VAR_2, uint32_t VAR_3)
{ XenPTRegInfo *reg = VAR_1->reg; uint32_t valid_emu_mask = 0; uint32_t bar_emu_mask = 0; int VAR_4; VAR_4 = xen_pt_bar_offset_to_index(reg->offset); if (VAR_4 < 0 || VAR_4 >= PCI_NUM_REGIONS - 1) { XEN_PT_ERR(&VAR_0->dev, "Internal error: Invalid BAR VAR_4 [%d].\n", VAR_4); return -1; } *VAR_2 = base_address_with_flags(&VAR_0->real_device.io_regions[VAR_4]); switch (VAR_0->bases[VAR_4].bar_flag) { case XEN_PT_BAR_FLAG_MEM:
bar_emu_mask = XEN_PT_BAR_MEM_EMU_MASK; break; case XEN_PT_BAR_FLAG_IO:
bar_emu_mask = XEN_PT_BAR_IO_EMU_MASK; break; case XEN_PT_BAR_FLAG_UPPER:
bar_emu_mask = XEN_PT_BAR_ALLF; break; default:
break; } valid_emu_mask = bar_emu_mask & VAR_3; *VAR_2 = XEN_PT_MERGE_VALUE(*VAR_2, VAR_1->data, ~valid_emu_mask); return 0; }