113a7760fSPekka Enberg #ifndef KVM__IOPORT_H 213a7760fSPekka Enberg #define KVM__IOPORT_H 313a7760fSPekka Enberg 413a7760fSPekka Enberg #include <stdbool.h> 513a7760fSPekka Enberg #include <stdint.h> 613a7760fSPekka Enberg 7beb095ebSCyrill Gorcunov /* some ports we reserve for own use */ 8beb095ebSCyrill Gorcunov #define IOPORT_DBG 0xe0 9d1888318SCyrill Gorcunov #define IOPORT_VIRTIO_BLK 0xc200 /* Virtio block device */ 10*f05bbe8dSAsias He #define IOPORT_VIRTIO_BLK_SIZE 256 11*f05bbe8dSAsias He #define IOPORT_VIRTIO_CONSOLE 0xd200 /* Virtio console device */ 12*f05bbe8dSAsias He #define IOPORT_VIRTIO_CONSOLE_SIZE 256 13beb095ebSCyrill Gorcunov 1413a7760fSPekka Enberg struct kvm; 1513a7760fSPekka Enberg 1613a7760fSPekka Enberg struct ioport_operations { 1713a7760fSPekka Enberg bool (*io_in)(struct kvm *self, uint16_t port, void *data, int size, uint32_t count); 1813a7760fSPekka Enberg bool (*io_out)(struct kvm *self, uint16_t port, void *data, int size, uint32_t count); 1913a7760fSPekka Enberg }; 2013a7760fSPekka Enberg 213e553514SPekka Enberg void ioport__register(uint16_t port, struct ioport_operations *ops, int count); 2213a7760fSPekka Enberg 23fbc2fbf9SPekka Enberg static inline uint8_t ioport__read8(uint8_t *data) 24fbc2fbf9SPekka Enberg { 25fbc2fbf9SPekka Enberg return *data; 26fbc2fbf9SPekka Enberg } 27fbc2fbf9SPekka Enberg 288b1ff07eSPekka Enberg static inline uint16_t ioport__read16(uint16_t *data) 298b1ff07eSPekka Enberg { 308b1ff07eSPekka Enberg return *data; 318b1ff07eSPekka Enberg } 328b1ff07eSPekka Enberg 33fbc2fbf9SPekka Enberg static inline uint32_t ioport__read32(uint32_t *data) 34fbc2fbf9SPekka Enberg { 35fbc2fbf9SPekka Enberg return *data; 36fbc2fbf9SPekka Enberg } 37fbc2fbf9SPekka Enberg 38fbc2fbf9SPekka Enberg static inline void ioport__write8(uint8_t *data, uint8_t value) 39fbc2fbf9SPekka Enberg { 40fbc2fbf9SPekka Enberg *data = value; 41fbc2fbf9SPekka Enberg } 42fbc2fbf9SPekka Enberg 438b1ff07eSPekka Enberg static inline void ioport__write16(uint16_t *data, uint16_t value) 448b1ff07eSPekka Enberg { 458b1ff07eSPekka Enberg *data = value; 468b1ff07eSPekka Enberg } 478b1ff07eSPekka Enberg 48fbc2fbf9SPekka Enberg static inline void ioport__write32(uint32_t *data, uint32_t value) 49fbc2fbf9SPekka Enberg { 50fbc2fbf9SPekka Enberg *data = value; 51fbc2fbf9SPekka Enberg } 52fbc2fbf9SPekka Enberg 5313a7760fSPekka Enberg #endif /* KVM__IOPORT_H */ 54