introduce helper function pci_shift_{word, long}() which returns returns shifted word/long of given position and range. They will be used later.
Signed-off-by: Isaku Yamahata <yamah...@valinux.co.jp> --- hw/pci.h | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/hw/pci.h b/hw/pci.h index f4ea97a..630631b 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -327,6 +327,25 @@ pci_config_set_interrupt_pin(uint8_t *pci_config, uint8_t val) pci_set_byte(&pci_config[PCI_INTERRUPT_PIN], val); } +static inline uint32_t +pci_shift_long(uint32_t addr, uint32_t val, uint32_t pos) +{ + if (addr >= pos) { + assert(addr - pos <= 32 / 8); + val <<= (addr - pos) * 8; + } else { + assert(pos - addr <= 32 / 8); + val >>= (pos - addr) * 8; + } + return val; +} + +static inline uint16_t +pci_shift_word(uint32_t addr, uint32_t val, uint32_t pos) +{ + return pci_shift_long(addr, val, pos); +} + typedef int (*pci_qdev_initfn)(PCIDevice *dev); typedef struct { DeviceInfo qdev; -- 1.7.1.1